Merge branch 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc
[wrt350n-kernel.git] / drivers / media / video / pvrusb2 / pvrusb2-v4l2.c
blob8f0587ebd4bd8609b4e97f785f3641f176b01344
1 /*
3 * $Id$
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"
27 #include "pvrusb2.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>
35 struct pvr2_v4l2_dev;
36 struct pvr2_v4l2_fh;
37 struct pvr2_v4l2;
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 */
49 struct pvr2_v4l2_fh {
50 struct pvr2_channel channel;
51 struct pvr2_v4l2_dev *dev_info;
52 enum v4l2_priority prio;
53 struct pvr2_ioread *rhp;
54 struct file *file;
55 struct pvr2_v4l2 *vhead;
56 struct pvr2_v4l2_fh *vnext;
57 struct pvr2_v4l2_fh *vprev;
58 wait_queue_head_t wait_data;
59 int fw_mode_flag;
60 int prev_input_val;
63 struct pvr2_v4l2 {
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 ={
88 .driver = "pvrusb2",
89 .card = "Hauppauge WinTV pvr-usb2",
90 .bus_info = "usb",
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 |
94 V4L2_CAP_READWRITE),
95 .reserved = {0,0,0,0}
98 static struct v4l2_fmtdesc pvr_fmtdesc [] = {
100 .index = 0,
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 [] = {
115 [PVR_FORMAT_PIX] = {
116 .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
117 .fmt = {
118 .pix = {
119 .width = 720,
120 .height = 576,
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
126 // here
127 //FIXME : Don't know what to put here...
128 .sizeimage = (32*1024),
129 .colorspace = 0, // doesn't make sense here
130 .priv = 0
134 [PVR_FORMAT_VBI] = {
135 .type = V4L2_BUF_TYPE_VBI_CAPTURE,
136 .fmt = {
137 .vbi = {
138 .sampling_rate = 27000000,
139 .offset = 248,
140 .samples_per_line = 1443,
141 .sample_format = V4L2_PIX_FMT_GREY,
142 .start = { 0, 0 },
143 .count = { 0, 0 },
144 .flags = 0,
145 .reserved = { 0, 0 }
152 static const char *get_v4l_name(int v4l_type)
154 switch (v4l_type) {
155 case VFL_TYPE_GRABBER: return "video";
156 case VFL_TYPE_RADIO: return "radio";
157 case VFL_TYPE_VBI: return "vbi";
158 default: return "?";
164 * pvr_ioctl()
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;
176 int ret = -EINVAL;
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");
185 return -EFAULT;
188 /* check priority */
189 switch (cmd) {
190 case VIDIOC_S_CTRL:
191 case VIDIOC_S_STD:
192 case VIDIOC_S_INPUT:
193 case VIDIOC_S_TUNER:
194 case VIDIOC_S_FREQUENCY:
195 ret = v4l2_prio_check(&vp->prio, &fh->prio);
196 if (ret)
197 return ret;
200 switch (cmd) {
201 case VIDIOC_QUERYCAP:
203 struct v4l2_capability *cap = arg;
205 memcpy(cap, &pvr_capability, sizeof(struct v4l2_capability));
206 strlcpy(cap->bus_info,pvr2_hdw_get_bus_info(hdw),
207 sizeof(cap->bus_info));
208 strlcpy(cap->card,pvr2_hdw_get_desc(hdw),sizeof(cap->card));
210 ret = 0;
211 break;
214 case VIDIOC_G_PRIORITY:
216 enum v4l2_priority *p = arg;
218 *p = v4l2_prio_max(&vp->prio);
219 ret = 0;
220 break;
223 case VIDIOC_S_PRIORITY:
225 enum v4l2_priority *prio = arg;
227 ret = v4l2_prio_change(&vp->prio, &fh->prio, *prio);
228 break;
231 case VIDIOC_ENUMSTD:
233 struct v4l2_standard *vs = (struct v4l2_standard *)arg;
234 int idx = vs->index;
235 ret = pvr2_hdw_get_stdenum_value(hdw,vs,idx+1);
236 break;
239 case VIDIOC_G_STD:
241 int val = 0;
242 ret = pvr2_ctrl_get_value(
243 pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_STDCUR),&val);
244 *(v4l2_std_id *)arg = val;
245 break;
248 case VIDIOC_S_STD:
250 ret = pvr2_ctrl_set_value(
251 pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_STDCUR),
252 *(v4l2_std_id *)arg);
253 break;
256 case VIDIOC_ENUMINPUT:
258 struct pvr2_ctrl *cptr;
259 struct v4l2_input *vi = (struct v4l2_input *)arg;
260 struct v4l2_input tmp;
261 unsigned int cnt;
263 cptr = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_INPUT);
265 memset(&tmp,0,sizeof(tmp));
266 tmp.index = vi->index;
267 ret = 0;
268 switch (vi->index) {
269 case PVR2_CVAL_INPUT_TV:
270 case PVR2_CVAL_INPUT_RADIO:
271 tmp.type = V4L2_INPUT_TYPE_TUNER;
272 break;
273 case PVR2_CVAL_INPUT_SVIDEO:
274 case PVR2_CVAL_INPUT_COMPOSITE:
275 tmp.type = V4L2_INPUT_TYPE_CAMERA;
276 break;
277 default:
278 ret = -EINVAL;
279 break;
281 if (ret < 0) break;
283 cnt = 0;
284 pvr2_ctrl_get_valname(cptr,vi->index,
285 tmp.name,sizeof(tmp.name)-1,&cnt);
286 tmp.name[cnt] = 0;
288 /* Don't bother with audioset, since this driver currently
289 always switches the audio whenever the video is
290 switched. */
292 /* Handling std is a tougher problem. It doesn't make
293 sense in cases where a device might be multi-standard.
294 We could just copy out the current value for the
295 standard, but it can change over time. For now just
296 leave it zero. */
298 memcpy(vi, &tmp, sizeof(tmp));
300 ret = 0;
301 break;
304 case VIDIOC_G_INPUT:
306 struct pvr2_ctrl *cptr;
307 struct v4l2_input *vi = (struct v4l2_input *)arg;
308 int val;
309 cptr = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_INPUT);
310 val = 0;
311 ret = pvr2_ctrl_get_value(cptr,&val);
312 vi->index = val;
313 break;
316 case VIDIOC_S_INPUT:
318 struct v4l2_input *vi = (struct v4l2_input *)arg;
319 ret = pvr2_ctrl_set_value(
320 pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_INPUT),
321 vi->index);
322 break;
325 case VIDIOC_ENUMAUDIO:
327 /* pkt: FIXME: We are returning one "fake" input here
328 which could very well be called "whatever_we_like".
329 This is for apps that want to see an audio input
330 just to feel comfortable, as well as to test if
331 it can do stereo or sth. There is actually no guarantee
332 that the actual audio input cannot change behind the app's
333 back, but most applications should not mind that either.
335 Hopefully, mplayer people will work with us on this (this
336 whole mess is to support mplayer pvr://), or Hans will come
337 up with a more standard way to say "we have inputs but we
338 don 't want you to change them independent of video" which
339 will sort this mess.
341 struct v4l2_audio *vin = arg;
342 ret = -EINVAL;
343 if (vin->index > 0) break;
344 strncpy(vin->name, "PVRUSB2 Audio",14);
345 vin->capability = V4L2_AUDCAP_STEREO;
346 ret = 0;
347 break;
348 break;
351 case VIDIOC_G_AUDIO:
353 /* pkt: FIXME: see above comment (VIDIOC_ENUMAUDIO) */
354 struct v4l2_audio *vin = arg;
355 memset(vin,0,sizeof(*vin));
356 vin->index = 0;
357 strncpy(vin->name, "PVRUSB2 Audio",14);
358 vin->capability = V4L2_AUDCAP_STEREO;
359 ret = 0;
360 break;
363 case VIDIOC_S_AUDIO:
365 ret = -EINVAL;
366 break;
368 case VIDIOC_G_TUNER:
370 struct v4l2_tuner *vt = (struct v4l2_tuner *)arg;
372 if (vt->index != 0) break; /* Only answer for the 1st tuner */
374 pvr2_hdw_execute_tuner_poll(hdw);
375 ret = pvr2_hdw_get_tuner_status(hdw,vt);
376 break;
379 case VIDIOC_S_TUNER:
381 struct v4l2_tuner *vt=(struct v4l2_tuner *)arg;
383 if (vt->index != 0)
384 break;
386 ret = pvr2_ctrl_set_value(
387 pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_AUDIOMODE),
388 vt->audmode);
389 break;
392 case VIDIOC_S_FREQUENCY:
394 const struct v4l2_frequency *vf = (struct v4l2_frequency *)arg;
395 unsigned long fv;
396 struct v4l2_tuner vt;
397 int cur_input;
398 struct pvr2_ctrl *ctrlp;
399 ret = pvr2_hdw_get_tuner_status(hdw,&vt);
400 if (ret != 0) break;
401 ctrlp = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_INPUT);
402 ret = pvr2_ctrl_get_value(ctrlp,&cur_input);
403 if (ret != 0) break;
404 if (vf->type == V4L2_TUNER_RADIO) {
405 if (cur_input != PVR2_CVAL_INPUT_RADIO) {
406 pvr2_ctrl_set_value(ctrlp,
407 PVR2_CVAL_INPUT_RADIO);
409 } else {
410 if (cur_input == PVR2_CVAL_INPUT_RADIO) {
411 pvr2_ctrl_set_value(ctrlp,
412 PVR2_CVAL_INPUT_TV);
415 fv = vf->frequency;
416 if (vt.capability & V4L2_TUNER_CAP_LOW) {
417 fv = (fv * 125) / 2;
418 } else {
419 fv = fv * 62500;
421 ret = pvr2_ctrl_set_value(
422 pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_FREQUENCY),fv);
423 break;
426 case VIDIOC_G_FREQUENCY:
428 struct v4l2_frequency *vf = (struct v4l2_frequency *)arg;
429 int val = 0;
430 int cur_input;
431 struct v4l2_tuner vt;
432 ret = pvr2_hdw_get_tuner_status(hdw,&vt);
433 if (ret != 0) break;
434 ret = pvr2_ctrl_get_value(
435 pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_FREQUENCY),
436 &val);
437 if (ret != 0) break;
438 pvr2_ctrl_get_value(
439 pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_INPUT),
440 &cur_input);
441 if (cur_input == PVR2_CVAL_INPUT_RADIO) {
442 vf->type = V4L2_TUNER_RADIO;
443 } else {
444 vf->type = V4L2_TUNER_ANALOG_TV;
446 if (vt.capability & V4L2_TUNER_CAP_LOW) {
447 val = (val * 2) / 125;
448 } else {
449 val /= 62500;
451 vf->frequency = val;
452 break;
455 case VIDIOC_ENUM_FMT:
457 struct v4l2_fmtdesc *fd = (struct v4l2_fmtdesc *)arg;
459 /* Only one format is supported : mpeg.*/
460 if (fd->index != 0)
461 break;
463 memcpy(fd, pvr_fmtdesc, sizeof(struct v4l2_fmtdesc));
464 ret = 0;
465 break;
468 case VIDIOC_G_FMT:
470 struct v4l2_format *vf = (struct v4l2_format *)arg;
471 int val;
472 switch(vf->type) {
473 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
474 memcpy(vf, &pvr_format[PVR_FORMAT_PIX],
475 sizeof(struct v4l2_format));
476 val = 0;
477 pvr2_ctrl_get_value(
478 pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_HRES),
479 &val);
480 vf->fmt.pix.width = val;
481 val = 0;
482 pvr2_ctrl_get_value(
483 pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_VRES),
484 &val);
485 vf->fmt.pix.height = val;
486 ret = 0;
487 break;
488 case V4L2_BUF_TYPE_VBI_CAPTURE:
489 // ????? Still need to figure out to do VBI correctly
490 ret = -EINVAL;
491 break;
492 default:
493 ret = -EINVAL;
494 break;
496 break;
499 case VIDIOC_TRY_FMT:
500 case VIDIOC_S_FMT:
502 struct v4l2_format *vf = (struct v4l2_format *)arg;
504 ret = 0;
505 switch(vf->type) {
506 case V4L2_BUF_TYPE_VIDEO_CAPTURE: {
507 int lmin,lmax,ldef;
508 struct pvr2_ctrl *hcp,*vcp;
509 int h = vf->fmt.pix.height;
510 int w = vf->fmt.pix.width;
511 hcp = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_HRES);
512 vcp = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_VRES);
514 lmin = pvr2_ctrl_get_min(hcp);
515 lmax = pvr2_ctrl_get_max(hcp);
516 ldef = pvr2_ctrl_get_def(hcp);
517 if (w == -1) {
518 w = ldef;
519 } else if (w < lmin) {
520 w = lmin;
521 } else if (w > lmax) {
522 w = lmax;
524 lmin = pvr2_ctrl_get_min(vcp);
525 lmax = pvr2_ctrl_get_max(vcp);
526 ldef = pvr2_ctrl_get_def(vcp);
527 if (h == -1) {
528 h = ldef;
529 } else if (h < lmin) {
530 h = lmin;
531 } else if (h > lmax) {
532 h = lmax;
535 memcpy(vf, &pvr_format[PVR_FORMAT_PIX],
536 sizeof(struct v4l2_format));
537 vf->fmt.pix.width = w;
538 vf->fmt.pix.height = h;
540 if (cmd == VIDIOC_S_FMT) {
541 pvr2_ctrl_set_value(hcp,vf->fmt.pix.width);
542 pvr2_ctrl_set_value(vcp,vf->fmt.pix.height);
544 } break;
545 case V4L2_BUF_TYPE_VBI_CAPTURE:
546 // ????? Still need to figure out to do VBI correctly
547 ret = -EINVAL;
548 break;
549 default:
550 ret = -EINVAL;
551 break;
553 break;
556 case VIDIOC_STREAMON:
558 if (!fh->dev_info->stream) {
559 /* No stream defined for this node. This means
560 that we're not currently allowed to stream from
561 this node. */
562 ret = -EPERM;
563 break;
565 ret = pvr2_hdw_set_stream_type(hdw,dev_info->config);
566 if (ret < 0) return ret;
567 ret = pvr2_hdw_set_streaming(hdw,!0);
568 break;
571 case VIDIOC_STREAMOFF:
573 if (!fh->dev_info->stream) {
574 /* No stream defined for this node. This means
575 that we're not currently allowed to stream from
576 this node. */
577 ret = -EPERM;
578 break;
580 ret = pvr2_hdw_set_streaming(hdw,0);
581 break;
584 case VIDIOC_QUERYCTRL:
586 struct pvr2_ctrl *cptr;
587 struct v4l2_queryctrl *vc = (struct v4l2_queryctrl *)arg;
588 ret = 0;
589 if (vc->id & V4L2_CTRL_FLAG_NEXT_CTRL) {
590 cptr = pvr2_hdw_get_ctrl_nextv4l(
591 hdw,(vc->id & ~V4L2_CTRL_FLAG_NEXT_CTRL));
592 if (cptr) vc->id = pvr2_ctrl_get_v4lid(cptr);
593 } else {
594 cptr = pvr2_hdw_get_ctrl_v4l(hdw,vc->id);
596 if (!cptr) {
597 pvr2_trace(PVR2_TRACE_V4LIOCTL,
598 "QUERYCTRL id=0x%x not implemented here",
599 vc->id);
600 ret = -EINVAL;
601 break;
604 pvr2_trace(PVR2_TRACE_V4LIOCTL,
605 "QUERYCTRL id=0x%x mapping name=%s (%s)",
606 vc->id,pvr2_ctrl_get_name(cptr),
607 pvr2_ctrl_get_desc(cptr));
608 strlcpy(vc->name,pvr2_ctrl_get_desc(cptr),sizeof(vc->name));
609 vc->flags = pvr2_ctrl_get_v4lflags(cptr);
610 vc->default_value = pvr2_ctrl_get_def(cptr);
611 switch (pvr2_ctrl_get_type(cptr)) {
612 case pvr2_ctl_enum:
613 vc->type = V4L2_CTRL_TYPE_MENU;
614 vc->minimum = 0;
615 vc->maximum = pvr2_ctrl_get_cnt(cptr) - 1;
616 vc->step = 1;
617 break;
618 case pvr2_ctl_bool:
619 vc->type = V4L2_CTRL_TYPE_BOOLEAN;
620 vc->minimum = 0;
621 vc->maximum = 1;
622 vc->step = 1;
623 break;
624 case pvr2_ctl_int:
625 vc->type = V4L2_CTRL_TYPE_INTEGER;
626 vc->minimum = pvr2_ctrl_get_min(cptr);
627 vc->maximum = pvr2_ctrl_get_max(cptr);
628 vc->step = 1;
629 break;
630 default:
631 pvr2_trace(PVR2_TRACE_V4LIOCTL,
632 "QUERYCTRL id=0x%x name=%s not mappable",
633 vc->id,pvr2_ctrl_get_name(cptr));
634 ret = -EINVAL;
635 break;
637 break;
640 case VIDIOC_QUERYMENU:
642 struct v4l2_querymenu *vm = (struct v4l2_querymenu *)arg;
643 unsigned int cnt = 0;
644 ret = pvr2_ctrl_get_valname(pvr2_hdw_get_ctrl_v4l(hdw,vm->id),
645 vm->index,
646 vm->name,sizeof(vm->name)-1,
647 &cnt);
648 vm->name[cnt] = 0;
649 break;
652 case VIDIOC_G_CTRL:
654 struct v4l2_control *vc = (struct v4l2_control *)arg;
655 int val = 0;
656 ret = pvr2_ctrl_get_value(pvr2_hdw_get_ctrl_v4l(hdw,vc->id),
657 &val);
658 vc->value = val;
659 break;
662 case VIDIOC_S_CTRL:
664 struct v4l2_control *vc = (struct v4l2_control *)arg;
665 ret = pvr2_ctrl_set_value(pvr2_hdw_get_ctrl_v4l(hdw,vc->id),
666 vc->value);
667 break;
670 case VIDIOC_G_EXT_CTRLS:
672 struct v4l2_ext_controls *ctls =
673 (struct v4l2_ext_controls *)arg;
674 struct v4l2_ext_control *ctrl;
675 unsigned int idx;
676 int val;
677 ret = 0;
678 for (idx = 0; idx < ctls->count; idx++) {
679 ctrl = ctls->controls + idx;
680 ret = pvr2_ctrl_get_value(
681 pvr2_hdw_get_ctrl_v4l(hdw,ctrl->id),&val);
682 if (ret) {
683 ctls->error_idx = idx;
684 break;
686 /* Ensure that if read as a 64 bit value, the user
687 will still get a hopefully sane value */
688 ctrl->value64 = 0;
689 ctrl->value = val;
691 break;
694 case VIDIOC_S_EXT_CTRLS:
696 struct v4l2_ext_controls *ctls =
697 (struct v4l2_ext_controls *)arg;
698 struct v4l2_ext_control *ctrl;
699 unsigned int idx;
700 ret = 0;
701 for (idx = 0; idx < ctls->count; idx++) {
702 ctrl = ctls->controls + idx;
703 ret = pvr2_ctrl_set_value(
704 pvr2_hdw_get_ctrl_v4l(hdw,ctrl->id),
705 ctrl->value);
706 if (ret) {
707 ctls->error_idx = idx;
708 break;
711 break;
714 case VIDIOC_TRY_EXT_CTRLS:
716 struct v4l2_ext_controls *ctls =
717 (struct v4l2_ext_controls *)arg;
718 struct v4l2_ext_control *ctrl;
719 struct pvr2_ctrl *pctl;
720 unsigned int idx;
721 /* For the moment just validate that the requested control
722 actually exists. */
723 ret = 0;
724 for (idx = 0; idx < ctls->count; idx++) {
725 ctrl = ctls->controls + idx;
726 pctl = pvr2_hdw_get_ctrl_v4l(hdw,ctrl->id);
727 if (!pctl) {
728 ret = -EINVAL;
729 ctls->error_idx = idx;
730 break;
733 break;
736 case VIDIOC_LOG_STATUS:
738 pvr2_hdw_trigger_module_log(hdw);
739 ret = 0;
740 break;
742 #ifdef CONFIG_VIDEO_ADV_DEBUG
743 case VIDIOC_DBG_S_REGISTER:
744 case VIDIOC_DBG_G_REGISTER:
746 u64 val;
747 struct v4l2_register *req = (struct v4l2_register *)arg;
748 if (cmd == VIDIOC_DBG_S_REGISTER) val = req->val;
749 ret = pvr2_hdw_register_access(
750 hdw,req->match_type,req->match_chip,req->reg,
751 cmd == VIDIOC_DBG_S_REGISTER,&val);
752 if (cmd == VIDIOC_DBG_G_REGISTER) req->val = val;
753 break;
755 #endif
757 default :
758 ret = v4l_compat_translate_ioctl(inode,file,cmd,
759 arg,pvr2_v4l2_do_ioctl);
762 pvr2_hdw_commit_ctl(hdw);
764 if (ret < 0) {
765 if (pvrusb2_debug & PVR2_TRACE_V4LIOCTL) {
766 pvr2_trace(PVR2_TRACE_V4LIOCTL,
767 "pvr2_v4l2_do_ioctl failure, ret=%d",ret);
768 } else {
769 if (pvrusb2_debug & PVR2_TRACE_V4LIOCTL) {
770 pvr2_trace(PVR2_TRACE_V4LIOCTL,
771 "pvr2_v4l2_do_ioctl failure, ret=%d"
772 " command was:",ret);
773 v4l_print_ioctl(pvr2_hdw_get_driver_name(hdw),
774 cmd);
777 } else {
778 pvr2_trace(PVR2_TRACE_V4LIOCTL,
779 "pvr2_v4l2_do_ioctl complete, ret=%d (0x%x)",
780 ret,ret);
782 return ret;
786 static void pvr2_v4l2_dev_destroy(struct pvr2_v4l2_dev *dip)
788 int minor_id = dip->devbase.minor;
789 struct pvr2_hdw *hdw = dip->v4lp->channel.mc_head->hdw;
790 enum pvr2_config cfg = dip->config;
791 int v4l_type = dip->v4l_type;
793 pvr2_hdw_v4l_store_minor_number(hdw,dip->minor_type,-1);
795 /* Paranoia */
796 dip->v4lp = NULL;
797 dip->stream = NULL;
799 /* Actual deallocation happens later when all internal references
800 are gone. */
801 video_unregister_device(&dip->devbase);
803 printk(KERN_INFO "pvrusb2: unregistered device %s%u [%s]\n",
804 get_v4l_name(v4l_type),minor_id & 0x1f,
805 pvr2_config_get_name(cfg));
810 static void pvr2_v4l2_destroy_no_lock(struct pvr2_v4l2 *vp)
812 if (vp->dev_video) {
813 pvr2_v4l2_dev_destroy(vp->dev_video);
814 vp->dev_video = NULL;
816 if (vp->dev_radio) {
817 pvr2_v4l2_dev_destroy(vp->dev_radio);
818 vp->dev_radio = NULL;
821 pvr2_trace(PVR2_TRACE_STRUCT,"Destroying pvr2_v4l2 id=%p",vp);
822 pvr2_channel_done(&vp->channel);
823 kfree(vp);
827 static void pvr2_video_device_release(struct video_device *vdev)
829 struct pvr2_v4l2_dev *dev;
830 dev = container_of(vdev,struct pvr2_v4l2_dev,devbase);
831 kfree(dev);
835 static void pvr2_v4l2_internal_check(struct pvr2_channel *chp)
837 struct pvr2_v4l2 *vp;
838 vp = container_of(chp,struct pvr2_v4l2,channel);
839 if (!vp->channel.mc_head->disconnect_flag) return;
840 if (vp->vfirst) return;
841 pvr2_v4l2_destroy_no_lock(vp);
845 static int pvr2_v4l2_ioctl(struct inode *inode, struct file *file,
846 unsigned int cmd, unsigned long arg)
849 /* Temporary hack : use ivtv api until a v4l2 one is available. */
850 #define IVTV_IOC_G_CODEC 0xFFEE7703
851 #define IVTV_IOC_S_CODEC 0xFFEE7704
852 if (cmd == IVTV_IOC_G_CODEC || cmd == IVTV_IOC_S_CODEC) return 0;
853 return video_usercopy(inode, file, cmd, arg, pvr2_v4l2_do_ioctl);
857 static int pvr2_v4l2_release(struct inode *inode, struct file *file)
859 struct pvr2_v4l2_fh *fhp = file->private_data;
860 struct pvr2_v4l2 *vp = fhp->vhead;
861 struct pvr2_context *mp = fhp->vhead->channel.mc_head;
862 struct pvr2_hdw *hdw = fhp->channel.mc_head->hdw;
864 pvr2_trace(PVR2_TRACE_OPEN_CLOSE,"pvr2_v4l2_release");
866 if (fhp->rhp) {
867 struct pvr2_stream *sp;
868 pvr2_hdw_set_streaming(hdw,0);
869 sp = pvr2_ioread_get_stream(fhp->rhp);
870 if (sp) pvr2_stream_set_callback(sp,NULL,NULL);
871 pvr2_ioread_destroy(fhp->rhp);
872 fhp->rhp = NULL;
875 v4l2_prio_close(&vp->prio, &fhp->prio);
876 file->private_data = NULL;
878 pvr2_context_enter(mp); do {
879 /* Restore the previous input selection, if it makes sense
880 to do so. */
881 if (fhp->dev_info->v4l_type == VFL_TYPE_RADIO) {
882 struct pvr2_ctrl *cp;
883 int pval;
884 cp = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_INPUT);
885 pvr2_ctrl_get_value(cp,&pval);
886 /* Only restore if we're still selecting the radio */
887 if (pval == PVR2_CVAL_INPUT_RADIO) {
888 pvr2_ctrl_set_value(cp,fhp->prev_input_val);
889 pvr2_hdw_commit_ctl(hdw);
893 if (fhp->vnext) {
894 fhp->vnext->vprev = fhp->vprev;
895 } else {
896 vp->vlast = fhp->vprev;
898 if (fhp->vprev) {
899 fhp->vprev->vnext = fhp->vnext;
900 } else {
901 vp->vfirst = fhp->vnext;
903 fhp->vnext = NULL;
904 fhp->vprev = NULL;
905 fhp->vhead = NULL;
906 pvr2_channel_done(&fhp->channel);
907 pvr2_trace(PVR2_TRACE_STRUCT,
908 "Destroying pvr_v4l2_fh id=%p",fhp);
909 kfree(fhp);
910 if (vp->channel.mc_head->disconnect_flag && !vp->vfirst) {
911 pvr2_v4l2_destroy_no_lock(vp);
913 } while (0); pvr2_context_exit(mp);
914 return 0;
918 static int pvr2_v4l2_open(struct inode *inode, struct file *file)
920 struct pvr2_v4l2_dev *dip; /* Our own context pointer */
921 struct pvr2_v4l2_fh *fhp;
922 struct pvr2_v4l2 *vp;
923 struct pvr2_hdw *hdw;
925 dip = container_of(video_devdata(file),struct pvr2_v4l2_dev,devbase);
927 vp = dip->v4lp;
928 hdw = vp->channel.hdw;
930 pvr2_trace(PVR2_TRACE_OPEN_CLOSE,"pvr2_v4l2_open");
932 if (!pvr2_hdw_dev_ok(hdw)) {
933 pvr2_trace(PVR2_TRACE_OPEN_CLOSE,
934 "pvr2_v4l2_open: hardware not ready");
935 return -EIO;
938 fhp = kzalloc(sizeof(*fhp),GFP_KERNEL);
939 if (!fhp) {
940 return -ENOMEM;
943 init_waitqueue_head(&fhp->wait_data);
944 fhp->dev_info = dip;
946 pvr2_context_enter(vp->channel.mc_head); do {
947 pvr2_trace(PVR2_TRACE_STRUCT,"Creating pvr_v4l2_fh id=%p",fhp);
948 pvr2_channel_init(&fhp->channel,vp->channel.mc_head);
950 fhp->vnext = NULL;
951 fhp->vprev = vp->vlast;
952 if (vp->vlast) {
953 vp->vlast->vnext = fhp;
954 } else {
955 vp->vfirst = fhp;
957 vp->vlast = fhp;
958 fhp->vhead = vp;
960 /* Opening the /dev/radioX device implies a mode switch.
961 So execute that here. Note that you can get the
962 IDENTICAL effect merely by opening the normal video
963 device and setting the input appropriately. */
964 if (dip->v4l_type == VFL_TYPE_RADIO) {
965 struct pvr2_ctrl *cp;
966 cp = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_INPUT);
967 pvr2_ctrl_get_value(cp,&fhp->prev_input_val);
968 pvr2_ctrl_set_value(cp,PVR2_CVAL_INPUT_RADIO);
969 pvr2_hdw_commit_ctl(hdw);
971 } while (0); pvr2_context_exit(vp->channel.mc_head);
973 fhp->file = file;
974 file->private_data = fhp;
975 v4l2_prio_open(&vp->prio,&fhp->prio);
977 fhp->fw_mode_flag = pvr2_hdw_cpufw_get_enabled(hdw);
979 return 0;
983 static void pvr2_v4l2_notify(struct pvr2_v4l2_fh *fhp)
985 wake_up(&fhp->wait_data);
988 static int pvr2_v4l2_iosetup(struct pvr2_v4l2_fh *fh)
990 int ret;
991 struct pvr2_stream *sp;
992 struct pvr2_hdw *hdw;
993 if (fh->rhp) return 0;
995 if (!fh->dev_info->stream) {
996 /* No stream defined for this node. This means that we're
997 not currently allowed to stream from this node. */
998 return -EPERM;
1001 /* First read() attempt. Try to claim the stream and start
1002 it... */
1003 if ((ret = pvr2_channel_claim_stream(&fh->channel,
1004 fh->dev_info->stream)) != 0) {
1005 /* Someone else must already have it */
1006 return ret;
1009 fh->rhp = pvr2_channel_create_mpeg_stream(fh->dev_info->stream);
1010 if (!fh->rhp) {
1011 pvr2_channel_claim_stream(&fh->channel,NULL);
1012 return -ENOMEM;
1015 hdw = fh->channel.mc_head->hdw;
1016 sp = fh->dev_info->stream->stream;
1017 pvr2_stream_set_callback(sp,(pvr2_stream_callback)pvr2_v4l2_notify,fh);
1018 pvr2_hdw_set_stream_type(hdw,fh->dev_info->config);
1019 if ((ret = pvr2_hdw_set_streaming(hdw,!0)) < 0) return ret;
1020 return pvr2_ioread_set_enabled(fh->rhp,!0);
1024 static ssize_t pvr2_v4l2_read(struct file *file,
1025 char __user *buff, size_t count, loff_t *ppos)
1027 struct pvr2_v4l2_fh *fh = file->private_data;
1028 int ret;
1030 if (fh->fw_mode_flag) {
1031 struct pvr2_hdw *hdw = fh->channel.mc_head->hdw;
1032 char *tbuf;
1033 int c1,c2;
1034 int tcnt = 0;
1035 unsigned int offs = *ppos;
1037 tbuf = kmalloc(PAGE_SIZE,GFP_KERNEL);
1038 if (!tbuf) return -ENOMEM;
1040 while (count) {
1041 c1 = count;
1042 if (c1 > PAGE_SIZE) c1 = PAGE_SIZE;
1043 c2 = pvr2_hdw_cpufw_get(hdw,offs,tbuf,c1);
1044 if (c2 < 0) {
1045 tcnt = c2;
1046 break;
1048 if (!c2) break;
1049 if (copy_to_user(buff,tbuf,c2)) {
1050 tcnt = -EFAULT;
1051 break;
1053 offs += c2;
1054 tcnt += c2;
1055 buff += c2;
1056 count -= c2;
1057 *ppos += c2;
1059 kfree(tbuf);
1060 return tcnt;
1063 if (!fh->rhp) {
1064 ret = pvr2_v4l2_iosetup(fh);
1065 if (ret) {
1066 return ret;
1070 for (;;) {
1071 ret = pvr2_ioread_read(fh->rhp,buff,count);
1072 if (ret >= 0) break;
1073 if (ret != -EAGAIN) break;
1074 if (file->f_flags & O_NONBLOCK) break;
1075 /* Doing blocking I/O. Wait here. */
1076 ret = wait_event_interruptible(
1077 fh->wait_data,
1078 pvr2_ioread_avail(fh->rhp) >= 0);
1079 if (ret < 0) break;
1082 return ret;
1086 static unsigned int pvr2_v4l2_poll(struct file *file, poll_table *wait)
1088 unsigned int mask = 0;
1089 struct pvr2_v4l2_fh *fh = file->private_data;
1090 int ret;
1092 if (fh->fw_mode_flag) {
1093 mask |= POLLIN | POLLRDNORM;
1094 return mask;
1097 if (!fh->rhp) {
1098 ret = pvr2_v4l2_iosetup(fh);
1099 if (ret) return POLLERR;
1102 poll_wait(file,&fh->wait_data,wait);
1104 if (pvr2_ioread_avail(fh->rhp) >= 0) {
1105 mask |= POLLIN | POLLRDNORM;
1108 return mask;
1112 static const struct file_operations vdev_fops = {
1113 .owner = THIS_MODULE,
1114 .open = pvr2_v4l2_open,
1115 .release = pvr2_v4l2_release,
1116 .read = pvr2_v4l2_read,
1117 .ioctl = pvr2_v4l2_ioctl,
1118 .llseek = no_llseek,
1119 .poll = pvr2_v4l2_poll,
1123 static struct video_device vdev_template = {
1124 .owner = THIS_MODULE,
1125 .type = VID_TYPE_CAPTURE | VID_TYPE_TUNER,
1126 .type2 = (V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VBI_CAPTURE
1127 | V4L2_CAP_TUNER | V4L2_CAP_AUDIO
1128 | V4L2_CAP_READWRITE),
1129 .fops = &vdev_fops,
1133 static void pvr2_v4l2_dev_init(struct pvr2_v4l2_dev *dip,
1134 struct pvr2_v4l2 *vp,
1135 int v4l_type)
1137 int mindevnum;
1138 int unit_number;
1139 int *nr_ptr = NULL;
1140 dip->v4lp = vp;
1143 dip->v4l_type = v4l_type;
1144 switch (v4l_type) {
1145 case VFL_TYPE_GRABBER:
1146 dip->stream = &vp->channel.mc_head->video_stream;
1147 dip->config = pvr2_config_mpeg;
1148 dip->minor_type = pvr2_v4l_type_video;
1149 nr_ptr = video_nr;
1150 if (!dip->stream) {
1151 err("Failed to set up pvrusb2 v4l video dev"
1152 " due to missing stream instance");
1153 return;
1155 break;
1156 case VFL_TYPE_VBI:
1157 dip->config = pvr2_config_vbi;
1158 dip->minor_type = pvr2_v4l_type_vbi;
1159 nr_ptr = vbi_nr;
1160 break;
1161 case VFL_TYPE_RADIO:
1162 dip->stream = &vp->channel.mc_head->video_stream;
1163 dip->config = pvr2_config_mpeg;
1164 dip->minor_type = pvr2_v4l_type_radio;
1165 nr_ptr = radio_nr;
1166 break;
1167 default:
1168 /* Bail out (this should be impossible) */
1169 err("Failed to set up pvrusb2 v4l dev"
1170 " due to unrecognized config");
1171 return;
1174 memcpy(&dip->devbase,&vdev_template,sizeof(vdev_template));
1175 dip->devbase.release = pvr2_video_device_release;
1177 mindevnum = -1;
1178 unit_number = pvr2_hdw_get_unit_number(vp->channel.mc_head->hdw);
1179 if (nr_ptr && (unit_number >= 0) && (unit_number < PVR_NUM)) {
1180 mindevnum = nr_ptr[unit_number];
1182 if ((video_register_device(&dip->devbase,
1183 dip->v4l_type, mindevnum) < 0) &&
1184 (video_register_device(&dip->devbase,
1185 dip->v4l_type, -1) < 0)) {
1186 err("Failed to register pvrusb2 v4l device");
1189 printk(KERN_INFO "pvrusb2: registered device %s%u [%s]\n",
1190 get_v4l_name(dip->v4l_type),dip->devbase.minor & 0x1f,
1191 pvr2_config_get_name(dip->config));
1193 pvr2_hdw_v4l_store_minor_number(vp->channel.mc_head->hdw,
1194 dip->minor_type,dip->devbase.minor);
1198 struct pvr2_v4l2 *pvr2_v4l2_create(struct pvr2_context *mnp)
1200 struct pvr2_v4l2 *vp;
1202 vp = kzalloc(sizeof(*vp),GFP_KERNEL);
1203 if (!vp) return vp;
1204 vp->dev_video = kzalloc(sizeof(*vp->dev_video),GFP_KERNEL);
1205 vp->dev_radio = kzalloc(sizeof(*vp->dev_radio),GFP_KERNEL);
1206 if (!(vp->dev_video && vp->dev_radio)) {
1207 kfree(vp->dev_video);
1208 kfree(vp->dev_radio);
1209 kfree(vp);
1210 return NULL;
1212 pvr2_channel_init(&vp->channel,mnp);
1213 pvr2_trace(PVR2_TRACE_STRUCT,"Creating pvr2_v4l2 id=%p",vp);
1215 vp->channel.check_func = pvr2_v4l2_internal_check;
1217 /* register streams */
1218 pvr2_v4l2_dev_init(vp->dev_video,vp,VFL_TYPE_GRABBER);
1219 pvr2_v4l2_dev_init(vp->dev_radio,vp,VFL_TYPE_RADIO);
1221 return vp;
1225 Stuff for Emacs to see, in order to encourage consistent editing style:
1226 *** Local Variables: ***
1227 *** mode: c ***
1228 *** fill-column: 75 ***
1229 *** tab-width: 8 ***
1230 *** c-basic-offset: 8 ***
1231 *** End: ***