5 * Copyright (C) 2005 Mike Isely <isely@pobox.com>
6 * Copyright (C) 2004 Aurelien Alleaume <slts@free.fr>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #include <linux/kernel.h>
24 #include <linux/version.h>
25 #include "pvrusb2-context.h"
26 #include "pvrusb2-hdw.h"
28 #include "pvrusb2-debug.h"
29 #include "pvrusb2-v4l2.h"
30 #include "pvrusb2-ioread.h"
31 #include <linux/videodev2.h>
32 #include <media/v4l2-dev.h>
33 #include <media/v4l2-common.h>
39 struct pvr2_v4l2_dev {
40 struct video_device devbase; /* MUST be first! */
41 struct pvr2_v4l2 *v4lp;
42 struct pvr2_context_stream *stream;
43 /* Information about this device: */
44 enum pvr2_config config; /* Expected stream format */
45 int v4l_type; /* V4L defined type for this device node */
46 enum pvr2_v4l_type minor_type; /* pvr2-understood minor device type */
50 struct pvr2_channel channel;
51 struct pvr2_v4l2_dev *dev_info;
52 enum v4l2_priority prio;
53 struct pvr2_ioread *rhp;
55 struct pvr2_v4l2 *vhead;
56 struct pvr2_v4l2_fh *vnext;
57 struct pvr2_v4l2_fh *vprev;
58 wait_queue_head_t wait_data;
64 struct pvr2_channel channel;
65 struct pvr2_v4l2_fh *vfirst;
66 struct pvr2_v4l2_fh *vlast;
68 struct v4l2_prio_state prio;
70 /* streams - Note that these must be separately, individually,
71 * allocated pointers. This is because the v4l core is going to
72 * manage their deletion - separately, individually... */
73 struct pvr2_v4l2_dev *dev_video;
74 struct pvr2_v4l2_dev *dev_radio;
77 static int video_nr[PVR_NUM] = {[0 ... PVR_NUM-1] = -1};
78 module_param_array(video_nr, int, NULL, 0444);
79 MODULE_PARM_DESC(video_nr, "Offset for device's video dev minor");
80 static int radio_nr[PVR_NUM] = {[0 ... PVR_NUM-1] = -1};
81 module_param_array(radio_nr, int, NULL, 0444);
82 MODULE_PARM_DESC(radio_nr, "Offset for device's radio dev minor");
83 static int vbi_nr[PVR_NUM] = {[0 ... PVR_NUM-1] = -1};
84 module_param_array(vbi_nr, int, NULL, 0444);
85 MODULE_PARM_DESC(vbi_nr, "Offset for device's vbi dev minor");
87 static struct v4l2_capability pvr_capability ={
89 .card = "Hauppauge WinTV pvr-usb2",
91 .version = KERNEL_VERSION(0,8,0),
92 .capabilities = (V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VBI_CAPTURE |
93 V4L2_CAP_TUNER | V4L2_CAP_AUDIO | V4L2_CAP_RADIO |
98 static struct v4l2_fmtdesc pvr_fmtdesc [] = {
101 .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
102 .flags = V4L2_FMT_FLAG_COMPRESSED,
103 .description = "MPEG1/2",
104 // This should really be V4L2_PIX_FMT_MPEG, but xawtv
105 // breaks when I do that.
106 .pixelformat = 0, // V4L2_PIX_FMT_MPEG,
107 .reserved = { 0, 0, 0, 0 }
111 #define PVR_FORMAT_PIX 0
112 #define PVR_FORMAT_VBI 1
114 static struct v4l2_format pvr_format [] = {
116 .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
121 // This should really be V4L2_PIX_FMT_MPEG,
122 // but xawtv breaks when I do that.
123 .pixelformat = 0, // V4L2_PIX_FMT_MPEG,
124 .field = V4L2_FIELD_INTERLACED,
125 .bytesperline = 0, // doesn't make sense
127 //FIXME : Don't know what to put here...
128 .sizeimage = (32*1024),
129 .colorspace = 0, // doesn't make sense here
135 .type = V4L2_BUF_TYPE_VBI_CAPTURE,
138 .sampling_rate = 27000000,
140 .samples_per_line = 1443,
141 .sample_format = V4L2_PIX_FMT_GREY,
152 static const char *get_v4l_name(int v4l_type)
155 case VFL_TYPE_GRABBER: return "video";
156 case VFL_TYPE_RADIO: return "radio";
157 case VFL_TYPE_VBI: return "vbi";
166 * This is part of Video 4 Linux API. The procedure handles ioctl() calls.
169 static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file,
170 unsigned int cmd, void *arg)
172 struct pvr2_v4l2_fh *fh = file->private_data;
173 struct pvr2_v4l2 *vp = fh->vhead;
174 struct pvr2_v4l2_dev *dev_info = fh->dev_info;
175 struct pvr2_hdw *hdw = fh->channel.mc_head->hdw;
178 if (pvrusb2_debug & PVR2_TRACE_V4LIOCTL) {
179 v4l_print_ioctl(pvr2_hdw_get_driver_name(hdw),cmd);
182 if (!pvr2_hdw_dev_ok(hdw)) {
183 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
184 "ioctl failed - bad or no context");
194 case VIDIOC_S_FREQUENCY:
195 ret = v4l2_prio_check(&vp->prio, &fh->prio);
201 case VIDIOC_QUERYCAP:
203 struct v4l2_capability *cap = arg;
205 memcpy(cap, &pvr_capability, sizeof(struct v4l2_capability));
211 case VIDIOC_G_PRIORITY:
213 enum v4l2_priority *p = arg;
215 *p = v4l2_prio_max(&vp->prio);
220 case VIDIOC_S_PRIORITY:
222 enum v4l2_priority *prio = arg;
224 ret = v4l2_prio_change(&vp->prio, &fh->prio, *prio);
230 struct v4l2_standard *vs = (struct v4l2_standard *)arg;
232 ret = pvr2_hdw_get_stdenum_value(hdw,vs,idx+1);
239 ret = pvr2_ctrl_get_value(
240 pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_STDCUR),&val);
241 *(v4l2_std_id *)arg = val;
247 ret = pvr2_ctrl_set_value(
248 pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_STDCUR),
249 *(v4l2_std_id *)arg);
253 case VIDIOC_ENUMINPUT:
255 struct pvr2_ctrl *cptr;
256 struct v4l2_input *vi = (struct v4l2_input *)arg;
257 struct v4l2_input tmp;
260 cptr = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_INPUT);
262 memset(&tmp,0,sizeof(tmp));
263 tmp.index = vi->index;
266 case PVR2_CVAL_INPUT_TV:
267 case PVR2_CVAL_INPUT_RADIO:
268 tmp.type = V4L2_INPUT_TYPE_TUNER;
270 case PVR2_CVAL_INPUT_SVIDEO:
271 case PVR2_CVAL_INPUT_COMPOSITE:
272 tmp.type = V4L2_INPUT_TYPE_CAMERA;
281 pvr2_ctrl_get_valname(cptr,vi->index,
282 tmp.name,sizeof(tmp.name)-1,&cnt);
285 /* Don't bother with audioset, since this driver currently
286 always switches the audio whenever the video is
289 /* Handling std is a tougher problem. It doesn't make
290 sense in cases where a device might be multi-standard.
291 We could just copy out the current value for the
292 standard, but it can change over time. For now just
295 memcpy(vi, &tmp, sizeof(tmp));
303 struct pvr2_ctrl *cptr;
304 struct v4l2_input *vi = (struct v4l2_input *)arg;
306 cptr = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_INPUT);
308 ret = pvr2_ctrl_get_value(cptr,&val);
315 struct v4l2_input *vi = (struct v4l2_input *)arg;
316 ret = pvr2_ctrl_set_value(
317 pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_INPUT),
322 case VIDIOC_ENUMAUDIO:
324 /* pkt: FIXME: We are returning one "fake" input here
325 which could very well be called "whatever_we_like".
326 This is for apps that want to see an audio input
327 just to feel comfortable, as well as to test if
328 it can do stereo or sth. There is actually no guarantee
329 that the actual audio input cannot change behind the app's
330 back, but most applications should not mind that either.
332 Hopefully, mplayer people will work with us on this (this
333 whole mess is to support mplayer pvr://), or Hans will come
334 up with a more standard way to say "we have inputs but we
335 don 't want you to change them independent of video" which
338 struct v4l2_audio *vin = arg;
340 if (vin->index > 0) break;
341 strncpy(vin->name, "PVRUSB2 Audio",14);
342 vin->capability = V4L2_AUDCAP_STEREO;
350 /* pkt: FIXME: see above comment (VIDIOC_ENUMAUDIO) */
351 struct v4l2_audio *vin = arg;
352 memset(vin,0,sizeof(*vin));
354 strncpy(vin->name, "PVRUSB2 Audio",14);
355 vin->capability = V4L2_AUDCAP_STEREO;
367 struct v4l2_tuner *vt = (struct v4l2_tuner *)arg;
369 if (vt->index != 0) break; /* Only answer for the 1st tuner */
371 pvr2_hdw_execute_tuner_poll(hdw);
372 ret = pvr2_hdw_get_tuner_status(hdw,vt);
378 struct v4l2_tuner *vt=(struct v4l2_tuner *)arg;
383 ret = pvr2_ctrl_set_value(
384 pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_AUDIOMODE),
389 case VIDIOC_S_FREQUENCY:
391 const struct v4l2_frequency *vf = (struct v4l2_frequency *)arg;
393 struct v4l2_tuner vt;
395 struct pvr2_ctrl *ctrlp;
396 ret = pvr2_hdw_get_tuner_status(hdw,&vt);
398 ctrlp = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_INPUT);
399 ret = pvr2_ctrl_get_value(ctrlp,&cur_input);
401 if (vf->type == V4L2_TUNER_RADIO) {
402 if (cur_input != PVR2_CVAL_INPUT_RADIO) {
403 pvr2_ctrl_set_value(ctrlp,
404 PVR2_CVAL_INPUT_RADIO);
407 if (cur_input == PVR2_CVAL_INPUT_RADIO) {
408 pvr2_ctrl_set_value(ctrlp,
413 if (vt.capability & V4L2_TUNER_CAP_LOW) {
418 ret = pvr2_ctrl_set_value(
419 pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_FREQUENCY),fv);
423 case VIDIOC_G_FREQUENCY:
425 struct v4l2_frequency *vf = (struct v4l2_frequency *)arg;
428 struct v4l2_tuner vt;
429 ret = pvr2_hdw_get_tuner_status(hdw,&vt);
431 ret = pvr2_ctrl_get_value(
432 pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_FREQUENCY),
436 pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_INPUT),
438 if (cur_input == PVR2_CVAL_INPUT_RADIO) {
439 vf->type = V4L2_TUNER_RADIO;
441 vf->type = V4L2_TUNER_ANALOG_TV;
443 if (vt.capability & V4L2_TUNER_CAP_LOW) {
444 val = (val * 2) / 125;
452 case VIDIOC_ENUM_FMT:
454 struct v4l2_fmtdesc *fd = (struct v4l2_fmtdesc *)arg;
456 /* Only one format is supported : mpeg.*/
460 memcpy(fd, pvr_fmtdesc, sizeof(struct v4l2_fmtdesc));
467 struct v4l2_format *vf = (struct v4l2_format *)arg;
470 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
471 memcpy(vf, &pvr_format[PVR_FORMAT_PIX],
472 sizeof(struct v4l2_format));
475 pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_HRES),
477 vf->fmt.pix.width = val;
480 pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_VRES),
482 vf->fmt.pix.height = val;
485 case V4L2_BUF_TYPE_VBI_CAPTURE:
486 // ????? Still need to figure out to do VBI correctly
499 struct v4l2_format *vf = (struct v4l2_format *)arg;
503 case V4L2_BUF_TYPE_VIDEO_CAPTURE: {
505 struct pvr2_ctrl *hcp,*vcp;
506 int h = vf->fmt.pix.height;
507 int w = vf->fmt.pix.width;
508 hcp = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_HRES);
509 vcp = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_VRES);
511 lmin = pvr2_ctrl_get_min(hcp);
512 lmax = pvr2_ctrl_get_max(hcp);
513 ldef = pvr2_ctrl_get_def(hcp);
516 } else if (w < lmin) {
518 } else if (w > lmax) {
521 lmin = pvr2_ctrl_get_min(vcp);
522 lmax = pvr2_ctrl_get_max(vcp);
523 ldef = pvr2_ctrl_get_def(vcp);
526 } else if (h < lmin) {
528 } else if (h > lmax) {
532 memcpy(vf, &pvr_format[PVR_FORMAT_PIX],
533 sizeof(struct v4l2_format));
534 vf->fmt.pix.width = w;
535 vf->fmt.pix.height = h;
537 if (cmd == VIDIOC_S_FMT) {
538 pvr2_ctrl_set_value(hcp,vf->fmt.pix.width);
539 pvr2_ctrl_set_value(vcp,vf->fmt.pix.height);
542 case V4L2_BUF_TYPE_VBI_CAPTURE:
543 // ????? Still need to figure out to do VBI correctly
553 case VIDIOC_STREAMON:
555 if (!fh->dev_info->stream) {
556 /* No stream defined for this node. This means
557 that we're not currently allowed to stream from
562 ret = pvr2_hdw_set_stream_type(hdw,dev_info->config);
563 if (ret < 0) return ret;
564 ret = pvr2_hdw_set_streaming(hdw,!0);
568 case VIDIOC_STREAMOFF:
570 if (!fh->dev_info->stream) {
571 /* No stream defined for this node. This means
572 that we're not currently allowed to stream from
577 ret = pvr2_hdw_set_streaming(hdw,0);
581 case VIDIOC_QUERYCTRL:
583 struct pvr2_ctrl *cptr;
584 struct v4l2_queryctrl *vc = (struct v4l2_queryctrl *)arg;
586 if (vc->id & V4L2_CTRL_FLAG_NEXT_CTRL) {
587 cptr = pvr2_hdw_get_ctrl_nextv4l(
588 hdw,(vc->id & ~V4L2_CTRL_FLAG_NEXT_CTRL));
589 if (cptr) vc->id = pvr2_ctrl_get_v4lid(cptr);
591 cptr = pvr2_hdw_get_ctrl_v4l(hdw,vc->id);
594 pvr2_trace(PVR2_TRACE_V4LIOCTL,
595 "QUERYCTRL id=0x%x not implemented here",
601 pvr2_trace(PVR2_TRACE_V4LIOCTL,
602 "QUERYCTRL id=0x%x mapping name=%s (%s)",
603 vc->id,pvr2_ctrl_get_name(cptr),
604 pvr2_ctrl_get_desc(cptr));
605 strlcpy(vc->name,pvr2_ctrl_get_desc(cptr),sizeof(vc->name));
606 vc->flags = pvr2_ctrl_get_v4lflags(cptr);
607 vc->default_value = pvr2_ctrl_get_def(cptr);
608 switch (pvr2_ctrl_get_type(cptr)) {
610 vc->type = V4L2_CTRL_TYPE_MENU;
612 vc->maximum = pvr2_ctrl_get_cnt(cptr) - 1;
616 vc->type = V4L2_CTRL_TYPE_BOOLEAN;
622 vc->type = V4L2_CTRL_TYPE_INTEGER;
623 vc->minimum = pvr2_ctrl_get_min(cptr);
624 vc->maximum = pvr2_ctrl_get_max(cptr);
628 pvr2_trace(PVR2_TRACE_V4LIOCTL,
629 "QUERYCTRL id=0x%x name=%s not mappable",
630 vc->id,pvr2_ctrl_get_name(cptr));
637 case VIDIOC_QUERYMENU:
639 struct v4l2_querymenu *vm = (struct v4l2_querymenu *)arg;
640 unsigned int cnt = 0;
641 ret = pvr2_ctrl_get_valname(pvr2_hdw_get_ctrl_v4l(hdw,vm->id),
643 vm->name,sizeof(vm->name)-1,
651 struct v4l2_control *vc = (struct v4l2_control *)arg;
653 ret = pvr2_ctrl_get_value(pvr2_hdw_get_ctrl_v4l(hdw,vc->id),
661 struct v4l2_control *vc = (struct v4l2_control *)arg;
662 ret = pvr2_ctrl_set_value(pvr2_hdw_get_ctrl_v4l(hdw,vc->id),
667 case VIDIOC_G_EXT_CTRLS:
669 struct v4l2_ext_controls *ctls =
670 (struct v4l2_ext_controls *)arg;
671 struct v4l2_ext_control *ctrl;
675 for (idx = 0; idx < ctls->count; idx++) {
676 ctrl = ctls->controls + idx;
677 ret = pvr2_ctrl_get_value(
678 pvr2_hdw_get_ctrl_v4l(hdw,ctrl->id),&val);
680 ctls->error_idx = idx;
683 /* Ensure that if read as a 64 bit value, the user
684 will still get a hopefully sane value */
691 case VIDIOC_S_EXT_CTRLS:
693 struct v4l2_ext_controls *ctls =
694 (struct v4l2_ext_controls *)arg;
695 struct v4l2_ext_control *ctrl;
698 for (idx = 0; idx < ctls->count; idx++) {
699 ctrl = ctls->controls + idx;
700 ret = pvr2_ctrl_set_value(
701 pvr2_hdw_get_ctrl_v4l(hdw,ctrl->id),
704 ctls->error_idx = idx;
711 case VIDIOC_TRY_EXT_CTRLS:
713 struct v4l2_ext_controls *ctls =
714 (struct v4l2_ext_controls *)arg;
715 struct v4l2_ext_control *ctrl;
716 struct pvr2_ctrl *pctl;
718 /* For the moment just validate that the requested control
721 for (idx = 0; idx < ctls->count; idx++) {
722 ctrl = ctls->controls + idx;
723 pctl = pvr2_hdw_get_ctrl_v4l(hdw,ctrl->id);
726 ctls->error_idx = idx;
733 case VIDIOC_LOG_STATUS:
735 pvr2_hdw_trigger_module_log(hdw);
739 #ifdef CONFIG_VIDEO_ADV_DEBUG
740 case VIDIOC_DBG_S_REGISTER:
741 case VIDIOC_DBG_G_REGISTER:
744 struct v4l2_register *req = (struct v4l2_register *)arg;
745 if (cmd == VIDIOC_DBG_S_REGISTER) val = req->val;
746 ret = pvr2_hdw_register_access(
747 hdw,req->match_type,req->match_chip,req->reg,
748 cmd == VIDIOC_DBG_S_REGISTER,&val);
749 if (cmd == VIDIOC_DBG_G_REGISTER) req->val = val;
755 ret = v4l_compat_translate_ioctl(inode,file,cmd,
756 arg,pvr2_v4l2_do_ioctl);
759 pvr2_hdw_commit_ctl(hdw);
762 if (pvrusb2_debug & PVR2_TRACE_V4LIOCTL) {
763 pvr2_trace(PVR2_TRACE_V4LIOCTL,
764 "pvr2_v4l2_do_ioctl failure, ret=%d",ret);
766 if (pvrusb2_debug & PVR2_TRACE_V4LIOCTL) {
767 pvr2_trace(PVR2_TRACE_V4LIOCTL,
768 "pvr2_v4l2_do_ioctl failure, ret=%d"
769 " command was:",ret);
770 v4l_print_ioctl(pvr2_hdw_get_driver_name(hdw),
775 pvr2_trace(PVR2_TRACE_V4LIOCTL,
776 "pvr2_v4l2_do_ioctl complete, ret=%d (0x%x)",
783 static void pvr2_v4l2_dev_destroy(struct pvr2_v4l2_dev *dip)
785 int minor_id = dip->devbase.minor;
786 struct pvr2_hdw *hdw = dip->v4lp->channel.mc_head->hdw;
787 enum pvr2_config cfg = dip->config;
788 int v4l_type = dip->v4l_type;
790 pvr2_hdw_v4l_store_minor_number(hdw,dip->minor_type,-1);
796 /* Actual deallocation happens later when all internal references
798 video_unregister_device(&dip->devbase);
800 printk(KERN_INFO "pvrusb2: unregistered device %s%u [%s]\n",
801 get_v4l_name(v4l_type),minor_id & 0x1f,
802 pvr2_config_get_name(cfg));
807 static void pvr2_v4l2_destroy_no_lock(struct pvr2_v4l2 *vp)
810 pvr2_v4l2_dev_destroy(vp->dev_video);
814 pvr2_v4l2_dev_destroy(vp->dev_radio);
818 pvr2_trace(PVR2_TRACE_STRUCT,"Destroying pvr2_v4l2 id=%p",vp);
819 pvr2_channel_done(&vp->channel);
824 static void pvr2_video_device_release(struct video_device *vdev)
826 struct pvr2_v4l2_dev *dev;
827 dev = container_of(vdev,struct pvr2_v4l2_dev,devbase);
832 static void pvr2_v4l2_internal_check(struct pvr2_channel *chp)
834 struct pvr2_v4l2 *vp;
835 vp = container_of(chp,struct pvr2_v4l2,channel);
836 if (!vp->channel.mc_head->disconnect_flag) return;
837 if (vp->vfirst) return;
838 pvr2_v4l2_destroy_no_lock(vp);
842 static int pvr2_v4l2_ioctl(struct inode *inode, struct file *file,
843 unsigned int cmd, unsigned long arg)
846 /* Temporary hack : use ivtv api until a v4l2 one is available. */
847 #define IVTV_IOC_G_CODEC 0xFFEE7703
848 #define IVTV_IOC_S_CODEC 0xFFEE7704
849 if (cmd == IVTV_IOC_G_CODEC || cmd == IVTV_IOC_S_CODEC) return 0;
850 return video_usercopy(inode, file, cmd, arg, pvr2_v4l2_do_ioctl);
854 static int pvr2_v4l2_release(struct inode *inode, struct file *file)
856 struct pvr2_v4l2_fh *fhp = file->private_data;
857 struct pvr2_v4l2 *vp = fhp->vhead;
858 struct pvr2_context *mp = fhp->vhead->channel.mc_head;
859 struct pvr2_hdw *hdw = fhp->channel.mc_head->hdw;
861 pvr2_trace(PVR2_TRACE_OPEN_CLOSE,"pvr2_v4l2_release");
864 struct pvr2_stream *sp;
865 pvr2_hdw_set_streaming(hdw,0);
866 sp = pvr2_ioread_get_stream(fhp->rhp);
867 if (sp) pvr2_stream_set_callback(sp,NULL,NULL);
868 pvr2_ioread_destroy(fhp->rhp);
872 v4l2_prio_close(&vp->prio, &fhp->prio);
873 file->private_data = NULL;
875 pvr2_context_enter(mp); do {
876 /* Restore the previous input selection, if it makes sense
878 if (fhp->dev_info->v4l_type == VFL_TYPE_RADIO) {
879 struct pvr2_ctrl *cp;
881 cp = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_INPUT);
882 pvr2_ctrl_get_value(cp,&pval);
883 /* Only restore if we're still selecting the radio */
884 if (pval == PVR2_CVAL_INPUT_RADIO) {
885 pvr2_ctrl_set_value(cp,fhp->prev_input_val);
886 pvr2_hdw_commit_ctl(hdw);
891 fhp->vnext->vprev = fhp->vprev;
893 vp->vlast = fhp->vprev;
896 fhp->vprev->vnext = fhp->vnext;
898 vp->vfirst = fhp->vnext;
903 pvr2_channel_done(&fhp->channel);
904 pvr2_trace(PVR2_TRACE_STRUCT,
905 "Destroying pvr_v4l2_fh id=%p",fhp);
907 if (vp->channel.mc_head->disconnect_flag && !vp->vfirst) {
908 pvr2_v4l2_destroy_no_lock(vp);
910 } while (0); pvr2_context_exit(mp);
915 static int pvr2_v4l2_open(struct inode *inode, struct file *file)
917 struct pvr2_v4l2_dev *dip; /* Our own context pointer */
918 struct pvr2_v4l2_fh *fhp;
919 struct pvr2_v4l2 *vp;
920 struct pvr2_hdw *hdw;
922 dip = container_of(video_devdata(file),struct pvr2_v4l2_dev,devbase);
925 hdw = vp->channel.hdw;
927 pvr2_trace(PVR2_TRACE_OPEN_CLOSE,"pvr2_v4l2_open");
929 if (!pvr2_hdw_dev_ok(hdw)) {
930 pvr2_trace(PVR2_TRACE_OPEN_CLOSE,
931 "pvr2_v4l2_open: hardware not ready");
935 fhp = kzalloc(sizeof(*fhp),GFP_KERNEL);
940 init_waitqueue_head(&fhp->wait_data);
943 pvr2_context_enter(vp->channel.mc_head); do {
944 pvr2_trace(PVR2_TRACE_STRUCT,"Creating pvr_v4l2_fh id=%p",fhp);
945 pvr2_channel_init(&fhp->channel,vp->channel.mc_head);
948 fhp->vprev = vp->vlast;
950 vp->vlast->vnext = fhp;
957 /* Opening the /dev/radioX device implies a mode switch.
958 So execute that here. Note that you can get the
959 IDENTICAL effect merely by opening the normal video
960 device and setting the input appropriately. */
961 if (dip->v4l_type == VFL_TYPE_RADIO) {
962 struct pvr2_ctrl *cp;
963 cp = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_INPUT);
964 pvr2_ctrl_get_value(cp,&fhp->prev_input_val);
965 pvr2_ctrl_set_value(cp,PVR2_CVAL_INPUT_RADIO);
966 pvr2_hdw_commit_ctl(hdw);
968 } while (0); pvr2_context_exit(vp->channel.mc_head);
971 file->private_data = fhp;
972 v4l2_prio_open(&vp->prio,&fhp->prio);
974 fhp->fw_mode_flag = pvr2_hdw_cpufw_get_enabled(hdw);
980 static void pvr2_v4l2_notify(struct pvr2_v4l2_fh *fhp)
982 wake_up(&fhp->wait_data);
985 static int pvr2_v4l2_iosetup(struct pvr2_v4l2_fh *fh)
988 struct pvr2_stream *sp;
989 struct pvr2_hdw *hdw;
990 if (fh->rhp) return 0;
992 if (!fh->dev_info->stream) {
993 /* No stream defined for this node. This means that we're
994 not currently allowed to stream from this node. */
998 /* First read() attempt. Try to claim the stream and start
1000 if ((ret = pvr2_channel_claim_stream(&fh->channel,
1001 fh->dev_info->stream)) != 0) {
1002 /* Someone else must already have it */
1006 fh->rhp = pvr2_channel_create_mpeg_stream(fh->dev_info->stream);
1008 pvr2_channel_claim_stream(&fh->channel,NULL);
1012 hdw = fh->channel.mc_head->hdw;
1013 sp = fh->dev_info->stream->stream;
1014 pvr2_stream_set_callback(sp,(pvr2_stream_callback)pvr2_v4l2_notify,fh);
1015 pvr2_hdw_set_stream_type(hdw,fh->dev_info->config);
1016 pvr2_hdw_set_streaming(hdw,!0);
1017 ret = pvr2_ioread_set_enabled(fh->rhp,!0);
1023 static ssize_t pvr2_v4l2_read(struct file *file,
1024 char __user *buff, size_t count, loff_t *ppos)
1026 struct pvr2_v4l2_fh *fh = file->private_data;
1029 if (fh->fw_mode_flag) {
1030 struct pvr2_hdw *hdw = fh->channel.mc_head->hdw;
1034 unsigned int offs = *ppos;
1036 tbuf = kmalloc(PAGE_SIZE,GFP_KERNEL);
1037 if (!tbuf) return -ENOMEM;
1041 if (c1 > PAGE_SIZE) c1 = PAGE_SIZE;
1042 c2 = pvr2_hdw_cpufw_get(hdw,offs,tbuf,c1);
1048 if (copy_to_user(buff,tbuf,c2)) {
1063 ret = pvr2_v4l2_iosetup(fh);
1070 ret = pvr2_ioread_read(fh->rhp,buff,count);
1071 if (ret >= 0) break;
1072 if (ret != -EAGAIN) break;
1073 if (file->f_flags & O_NONBLOCK) break;
1074 /* Doing blocking I/O. Wait here. */
1075 ret = wait_event_interruptible(
1077 pvr2_ioread_avail(fh->rhp) >= 0);
1085 static unsigned int pvr2_v4l2_poll(struct file *file, poll_table *wait)
1087 unsigned int mask = 0;
1088 struct pvr2_v4l2_fh *fh = file->private_data;
1091 if (fh->fw_mode_flag) {
1092 mask |= POLLIN | POLLRDNORM;
1097 ret = pvr2_v4l2_iosetup(fh);
1098 if (ret) return POLLERR;
1101 poll_wait(file,&fh->wait_data,wait);
1103 if (pvr2_ioread_avail(fh->rhp) >= 0) {
1104 mask |= POLLIN | POLLRDNORM;
1111 static const struct file_operations vdev_fops = {
1112 .owner = THIS_MODULE,
1113 .open = pvr2_v4l2_open,
1114 .release = pvr2_v4l2_release,
1115 .read = pvr2_v4l2_read,
1116 .ioctl = pvr2_v4l2_ioctl,
1117 .llseek = no_llseek,
1118 .poll = pvr2_v4l2_poll,
1122 #define VID_HARDWARE_PVRUSB2 38 /* FIXME : need a good value */
1124 static struct video_device vdev_template = {
1125 .owner = THIS_MODULE,
1126 .type = VID_TYPE_CAPTURE | VID_TYPE_TUNER,
1127 .type2 = (V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VBI_CAPTURE
1128 | V4L2_CAP_TUNER | V4L2_CAP_AUDIO
1129 | V4L2_CAP_READWRITE),
1130 .hardware = VID_HARDWARE_PVRUSB2,
1135 static void pvr2_v4l2_dev_init(struct pvr2_v4l2_dev *dip,
1136 struct pvr2_v4l2 *vp,
1145 dip->v4l_type = v4l_type;
1147 case VFL_TYPE_GRABBER:
1148 dip->stream = &vp->channel.mc_head->video_stream;
1149 dip->config = pvr2_config_mpeg;
1150 dip->minor_type = pvr2_v4l_type_video;
1153 err("Failed to set up pvrusb2 v4l video dev"
1154 " due to missing stream instance");
1159 dip->config = pvr2_config_vbi;
1160 dip->minor_type = pvr2_v4l_type_vbi;
1163 case VFL_TYPE_RADIO:
1164 dip->stream = &vp->channel.mc_head->video_stream;
1165 dip->config = pvr2_config_mpeg;
1166 dip->minor_type = pvr2_v4l_type_radio;
1170 /* Bail out (this should be impossible) */
1171 err("Failed to set up pvrusb2 v4l dev"
1172 " due to unrecognized config");
1176 memcpy(&dip->devbase,&vdev_template,sizeof(vdev_template));
1177 dip->devbase.release = pvr2_video_device_release;
1180 unit_number = pvr2_hdw_get_unit_number(vp->channel.mc_head->hdw);
1181 if (nr_ptr && (unit_number >= 0) && (unit_number < PVR_NUM)) {
1182 mindevnum = nr_ptr[unit_number];
1184 if ((video_register_device(&dip->devbase,
1185 dip->v4l_type, mindevnum) < 0) &&
1186 (video_register_device(&dip->devbase,
1187 dip->v4l_type, -1) < 0)) {
1188 err("Failed to register pvrusb2 v4l device");
1191 printk(KERN_INFO "pvrusb2: registered device %s%u [%s]\n",
1192 get_v4l_name(dip->v4l_type),dip->devbase.minor & 0x1f,
1193 pvr2_config_get_name(dip->config));
1195 pvr2_hdw_v4l_store_minor_number(vp->channel.mc_head->hdw,
1196 dip->minor_type,dip->devbase.minor);
1200 struct pvr2_v4l2 *pvr2_v4l2_create(struct pvr2_context *mnp)
1202 struct pvr2_v4l2 *vp;
1204 vp = kzalloc(sizeof(*vp),GFP_KERNEL);
1206 vp->dev_video = kzalloc(sizeof(*vp->dev_video),GFP_KERNEL);
1207 vp->dev_radio = kzalloc(sizeof(*vp->dev_radio),GFP_KERNEL);
1208 if (!(vp->dev_video && vp->dev_radio)) {
1209 kfree(vp->dev_video);
1210 kfree(vp->dev_radio);
1214 pvr2_channel_init(&vp->channel,mnp);
1215 pvr2_trace(PVR2_TRACE_STRUCT,"Creating pvr2_v4l2 id=%p",vp);
1217 vp->channel.check_func = pvr2_v4l2_internal_check;
1219 /* register streams */
1220 pvr2_v4l2_dev_init(vp->dev_video,vp,VFL_TYPE_GRABBER);
1221 pvr2_v4l2_dev_init(vp->dev_radio,vp,VFL_TYPE_RADIO);
1227 Stuff for Emacs to see, in order to encourage consistent editing style:
1228 *** Local Variables: ***
1230 *** fill-column: 75 ***
1231 *** tab-width: 8 ***
1232 *** c-basic-offset: 8 ***