v2.6.22.24-op1
[linux-2.6.22.y-op.git] / drivers / media / video / pvrusb2 / pvrusb2-v4l2.c
blob4563b3df8a0d3bbbab866bf2c71a5317f061acc1
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));
209 ret = 0;
210 break;
213 case VIDIOC_G_PRIORITY:
215 enum v4l2_priority *p = arg;
217 *p = v4l2_prio_max(&vp->prio);
218 ret = 0;
219 break;
222 case VIDIOC_S_PRIORITY:
224 enum v4l2_priority *prio = arg;
226 ret = v4l2_prio_change(&vp->prio, &fh->prio, *prio);
227 break;
230 case VIDIOC_ENUMSTD:
232 struct v4l2_standard *vs = (struct v4l2_standard *)arg;
233 int idx = vs->index;
234 ret = pvr2_hdw_get_stdenum_value(hdw,vs,idx+1);
235 break;
238 case VIDIOC_G_STD:
240 int val = 0;
241 ret = pvr2_ctrl_get_value(
242 pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_STDCUR),&val);
243 *(v4l2_std_id *)arg = val;
244 break;
247 case VIDIOC_S_STD:
249 ret = pvr2_ctrl_set_value(
250 pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_STDCUR),
251 *(v4l2_std_id *)arg);
252 break;
255 case VIDIOC_ENUMINPUT:
257 struct pvr2_ctrl *cptr;
258 struct v4l2_input *vi = (struct v4l2_input *)arg;
259 struct v4l2_input tmp;
260 unsigned int cnt;
262 cptr = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_INPUT);
264 memset(&tmp,0,sizeof(tmp));
265 tmp.index = vi->index;
266 ret = 0;
267 switch (vi->index) {
268 case PVR2_CVAL_INPUT_TV:
269 case PVR2_CVAL_INPUT_RADIO:
270 tmp.type = V4L2_INPUT_TYPE_TUNER;
271 break;
272 case PVR2_CVAL_INPUT_SVIDEO:
273 case PVR2_CVAL_INPUT_COMPOSITE:
274 tmp.type = V4L2_INPUT_TYPE_CAMERA;
275 break;
276 default:
277 ret = -EINVAL;
278 break;
280 if (ret < 0) break;
282 cnt = 0;
283 pvr2_ctrl_get_valname(cptr,vi->index,
284 tmp.name,sizeof(tmp.name)-1,&cnt);
285 tmp.name[cnt] = 0;
287 /* Don't bother with audioset, since this driver currently
288 always switches the audio whenever the video is
289 switched. */
291 /* Handling std is a tougher problem. It doesn't make
292 sense in cases where a device might be multi-standard.
293 We could just copy out the current value for the
294 standard, but it can change over time. For now just
295 leave it zero. */
297 memcpy(vi, &tmp, sizeof(tmp));
299 ret = 0;
300 break;
303 case VIDIOC_G_INPUT:
305 struct pvr2_ctrl *cptr;
306 struct v4l2_input *vi = (struct v4l2_input *)arg;
307 int val;
308 cptr = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_INPUT);
309 val = 0;
310 ret = pvr2_ctrl_get_value(cptr,&val);
311 vi->index = val;
312 break;
315 case VIDIOC_S_INPUT:
317 struct v4l2_input *vi = (struct v4l2_input *)arg;
318 ret = pvr2_ctrl_set_value(
319 pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_INPUT),
320 vi->index);
321 break;
324 case VIDIOC_ENUMAUDIO:
326 /* pkt: FIXME: We are returning one "fake" input here
327 which could very well be called "whatever_we_like".
328 This is for apps that want to see an audio input
329 just to feel comfortable, as well as to test if
330 it can do stereo or sth. There is actually no guarantee
331 that the actual audio input cannot change behind the app's
332 back, but most applications should not mind that either.
334 Hopefully, mplayer people will work with us on this (this
335 whole mess is to support mplayer pvr://), or Hans will come
336 up with a more standard way to say "we have inputs but we
337 don 't want you to change them independent of video" which
338 will sort this mess.
340 struct v4l2_audio *vin = arg;
341 ret = -EINVAL;
342 if (vin->index > 0) break;
343 strncpy(vin->name, "PVRUSB2 Audio",14);
344 vin->capability = V4L2_AUDCAP_STEREO;
345 ret = 0;
346 break;
347 break;
350 case VIDIOC_G_AUDIO:
352 /* pkt: FIXME: see above comment (VIDIOC_ENUMAUDIO) */
353 struct v4l2_audio *vin = arg;
354 memset(vin,0,sizeof(*vin));
355 vin->index = 0;
356 strncpy(vin->name, "PVRUSB2 Audio",14);
357 vin->capability = V4L2_AUDCAP_STEREO;
358 ret = 0;
359 break;
362 case VIDIOC_S_AUDIO:
364 ret = -EINVAL;
365 break;
367 case VIDIOC_G_TUNER:
369 struct v4l2_tuner *vt = (struct v4l2_tuner *)arg;
371 if (vt->index != 0) break; /* Only answer for the 1st tuner */
373 pvr2_hdw_execute_tuner_poll(hdw);
374 ret = pvr2_hdw_get_tuner_status(hdw,vt);
375 break;
378 case VIDIOC_S_TUNER:
380 struct v4l2_tuner *vt=(struct v4l2_tuner *)arg;
382 if (vt->index != 0)
383 break;
385 ret = pvr2_ctrl_set_value(
386 pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_AUDIOMODE),
387 vt->audmode);
388 break;
391 case VIDIOC_S_FREQUENCY:
393 const struct v4l2_frequency *vf = (struct v4l2_frequency *)arg;
394 unsigned long fv;
395 struct v4l2_tuner vt;
396 int cur_input;
397 struct pvr2_ctrl *ctrlp;
398 ret = pvr2_hdw_get_tuner_status(hdw,&vt);
399 if (ret != 0) break;
400 ctrlp = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_INPUT);
401 ret = pvr2_ctrl_get_value(ctrlp,&cur_input);
402 if (ret != 0) break;
403 if (vf->type == V4L2_TUNER_RADIO) {
404 if (cur_input != PVR2_CVAL_INPUT_RADIO) {
405 pvr2_ctrl_set_value(ctrlp,
406 PVR2_CVAL_INPUT_RADIO);
408 } else {
409 if (cur_input == PVR2_CVAL_INPUT_RADIO) {
410 pvr2_ctrl_set_value(ctrlp,
411 PVR2_CVAL_INPUT_TV);
414 fv = vf->frequency;
415 if (vt.capability & V4L2_TUNER_CAP_LOW) {
416 fv = (fv * 125) / 2;
417 } else {
418 fv = fv * 62500;
420 ret = pvr2_ctrl_set_value(
421 pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_FREQUENCY),fv);
422 break;
425 case VIDIOC_G_FREQUENCY:
427 struct v4l2_frequency *vf = (struct v4l2_frequency *)arg;
428 int val = 0;
429 int cur_input;
430 struct v4l2_tuner vt;
431 ret = pvr2_hdw_get_tuner_status(hdw,&vt);
432 if (ret != 0) break;
433 ret = pvr2_ctrl_get_value(
434 pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_FREQUENCY),
435 &val);
436 if (ret != 0) break;
437 pvr2_ctrl_get_value(
438 pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_INPUT),
439 &cur_input);
440 if (cur_input == PVR2_CVAL_INPUT_RADIO) {
441 vf->type = V4L2_TUNER_RADIO;
442 } else {
443 vf->type = V4L2_TUNER_ANALOG_TV;
445 if (vt.capability & V4L2_TUNER_CAP_LOW) {
446 val = (val * 2) / 125;
447 } else {
448 val /= 62500;
450 vf->frequency = val;
451 break;
454 case VIDIOC_ENUM_FMT:
456 struct v4l2_fmtdesc *fd = (struct v4l2_fmtdesc *)arg;
458 /* Only one format is supported : mpeg.*/
459 if (fd->index != 0)
460 break;
462 memcpy(fd, pvr_fmtdesc, sizeof(struct v4l2_fmtdesc));
463 ret = 0;
464 break;
467 case VIDIOC_G_FMT:
469 struct v4l2_format *vf = (struct v4l2_format *)arg;
470 int val;
471 switch(vf->type) {
472 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
473 memcpy(vf, &pvr_format[PVR_FORMAT_PIX],
474 sizeof(struct v4l2_format));
475 val = 0;
476 pvr2_ctrl_get_value(
477 pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_HRES),
478 &val);
479 vf->fmt.pix.width = val;
480 val = 0;
481 pvr2_ctrl_get_value(
482 pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_VRES),
483 &val);
484 vf->fmt.pix.height = val;
485 ret = 0;
486 break;
487 case V4L2_BUF_TYPE_VBI_CAPTURE:
488 // ????? Still need to figure out to do VBI correctly
489 ret = -EINVAL;
490 break;
491 default:
492 ret = -EINVAL;
493 break;
495 break;
498 case VIDIOC_TRY_FMT:
499 case VIDIOC_S_FMT:
501 struct v4l2_format *vf = (struct v4l2_format *)arg;
503 ret = 0;
504 switch(vf->type) {
505 case V4L2_BUF_TYPE_VIDEO_CAPTURE: {
506 int lmin,lmax,ldef;
507 struct pvr2_ctrl *hcp,*vcp;
508 int h = vf->fmt.pix.height;
509 int w = vf->fmt.pix.width;
510 hcp = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_HRES);
511 vcp = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_VRES);
513 lmin = pvr2_ctrl_get_min(hcp);
514 lmax = pvr2_ctrl_get_max(hcp);
515 ldef = pvr2_ctrl_get_def(hcp);
516 if (w == -1) {
517 w = ldef;
518 } else if (w < lmin) {
519 w = lmin;
520 } else if (w > lmax) {
521 w = lmax;
523 lmin = pvr2_ctrl_get_min(vcp);
524 lmax = pvr2_ctrl_get_max(vcp);
525 ldef = pvr2_ctrl_get_def(vcp);
526 if (h == -1) {
527 h = ldef;
528 } else if (h < lmin) {
529 h = lmin;
530 } else if (h > lmax) {
531 h = lmax;
534 memcpy(vf, &pvr_format[PVR_FORMAT_PIX],
535 sizeof(struct v4l2_format));
536 vf->fmt.pix.width = w;
537 vf->fmt.pix.height = h;
539 if (cmd == VIDIOC_S_FMT) {
540 pvr2_ctrl_set_value(hcp,vf->fmt.pix.width);
541 pvr2_ctrl_set_value(vcp,vf->fmt.pix.height);
543 } break;
544 case V4L2_BUF_TYPE_VBI_CAPTURE:
545 // ????? Still need to figure out to do VBI correctly
546 ret = -EINVAL;
547 break;
548 default:
549 ret = -EINVAL;
550 break;
552 break;
555 case VIDIOC_STREAMON:
557 if (!fh->dev_info->stream) {
558 /* No stream defined for this node. This means
559 that we're not currently allowed to stream from
560 this node. */
561 ret = -EPERM;
562 break;
564 ret = pvr2_hdw_set_stream_type(hdw,dev_info->config);
565 if (ret < 0) return ret;
566 ret = pvr2_hdw_set_streaming(hdw,!0);
567 break;
570 case VIDIOC_STREAMOFF:
572 if (!fh->dev_info->stream) {
573 /* No stream defined for this node. This means
574 that we're not currently allowed to stream from
575 this node. */
576 ret = -EPERM;
577 break;
579 ret = pvr2_hdw_set_streaming(hdw,0);
580 break;
583 case VIDIOC_QUERYCTRL:
585 struct pvr2_ctrl *cptr;
586 struct v4l2_queryctrl *vc = (struct v4l2_queryctrl *)arg;
587 ret = 0;
588 if (vc->id & V4L2_CTRL_FLAG_NEXT_CTRL) {
589 cptr = pvr2_hdw_get_ctrl_nextv4l(
590 hdw,(vc->id & ~V4L2_CTRL_FLAG_NEXT_CTRL));
591 if (cptr) vc->id = pvr2_ctrl_get_v4lid(cptr);
592 } else {
593 cptr = pvr2_hdw_get_ctrl_v4l(hdw,vc->id);
595 if (!cptr) {
596 pvr2_trace(PVR2_TRACE_V4LIOCTL,
597 "QUERYCTRL id=0x%x not implemented here",
598 vc->id);
599 ret = -EINVAL;
600 break;
603 pvr2_trace(PVR2_TRACE_V4LIOCTL,
604 "QUERYCTRL id=0x%x mapping name=%s (%s)",
605 vc->id,pvr2_ctrl_get_name(cptr),
606 pvr2_ctrl_get_desc(cptr));
607 strlcpy(vc->name,pvr2_ctrl_get_desc(cptr),sizeof(vc->name));
608 vc->flags = pvr2_ctrl_get_v4lflags(cptr);
609 vc->default_value = pvr2_ctrl_get_def(cptr);
610 switch (pvr2_ctrl_get_type(cptr)) {
611 case pvr2_ctl_enum:
612 vc->type = V4L2_CTRL_TYPE_MENU;
613 vc->minimum = 0;
614 vc->maximum = pvr2_ctrl_get_cnt(cptr) - 1;
615 vc->step = 1;
616 break;
617 case pvr2_ctl_bool:
618 vc->type = V4L2_CTRL_TYPE_BOOLEAN;
619 vc->minimum = 0;
620 vc->maximum = 1;
621 vc->step = 1;
622 break;
623 case pvr2_ctl_int:
624 vc->type = V4L2_CTRL_TYPE_INTEGER;
625 vc->minimum = pvr2_ctrl_get_min(cptr);
626 vc->maximum = pvr2_ctrl_get_max(cptr);
627 vc->step = 1;
628 break;
629 default:
630 pvr2_trace(PVR2_TRACE_V4LIOCTL,
631 "QUERYCTRL id=0x%x name=%s not mappable",
632 vc->id,pvr2_ctrl_get_name(cptr));
633 ret = -EINVAL;
634 break;
636 break;
639 case VIDIOC_QUERYMENU:
641 struct v4l2_querymenu *vm = (struct v4l2_querymenu *)arg;
642 unsigned int cnt = 0;
643 ret = pvr2_ctrl_get_valname(pvr2_hdw_get_ctrl_v4l(hdw,vm->id),
644 vm->index,
645 vm->name,sizeof(vm->name)-1,
646 &cnt);
647 vm->name[cnt] = 0;
648 break;
651 case VIDIOC_G_CTRL:
653 struct v4l2_control *vc = (struct v4l2_control *)arg;
654 int val = 0;
655 ret = pvr2_ctrl_get_value(pvr2_hdw_get_ctrl_v4l(hdw,vc->id),
656 &val);
657 vc->value = val;
658 break;
661 case VIDIOC_S_CTRL:
663 struct v4l2_control *vc = (struct v4l2_control *)arg;
664 ret = pvr2_ctrl_set_value(pvr2_hdw_get_ctrl_v4l(hdw,vc->id),
665 vc->value);
666 break;
669 case VIDIOC_G_EXT_CTRLS:
671 struct v4l2_ext_controls *ctls =
672 (struct v4l2_ext_controls *)arg;
673 struct v4l2_ext_control *ctrl;
674 unsigned int idx;
675 int val;
676 ret = 0;
677 for (idx = 0; idx < ctls->count; idx++) {
678 ctrl = ctls->controls + idx;
679 ret = pvr2_ctrl_get_value(
680 pvr2_hdw_get_ctrl_v4l(hdw,ctrl->id),&val);
681 if (ret) {
682 ctls->error_idx = idx;
683 break;
685 /* Ensure that if read as a 64 bit value, the user
686 will still get a hopefully sane value */
687 ctrl->value64 = 0;
688 ctrl->value = val;
690 break;
693 case VIDIOC_S_EXT_CTRLS:
695 struct v4l2_ext_controls *ctls =
696 (struct v4l2_ext_controls *)arg;
697 struct v4l2_ext_control *ctrl;
698 unsigned int idx;
699 ret = 0;
700 for (idx = 0; idx < ctls->count; idx++) {
701 ctrl = ctls->controls + idx;
702 ret = pvr2_ctrl_set_value(
703 pvr2_hdw_get_ctrl_v4l(hdw,ctrl->id),
704 ctrl->value);
705 if (ret) {
706 ctls->error_idx = idx;
707 break;
710 break;
713 case VIDIOC_TRY_EXT_CTRLS:
715 struct v4l2_ext_controls *ctls =
716 (struct v4l2_ext_controls *)arg;
717 struct v4l2_ext_control *ctrl;
718 struct pvr2_ctrl *pctl;
719 unsigned int idx;
720 /* For the moment just validate that the requested control
721 actually exists. */
722 ret = 0;
723 for (idx = 0; idx < ctls->count; idx++) {
724 ctrl = ctls->controls + idx;
725 pctl = pvr2_hdw_get_ctrl_v4l(hdw,ctrl->id);
726 if (!pctl) {
727 ret = -EINVAL;
728 ctls->error_idx = idx;
729 break;
732 break;
735 case VIDIOC_LOG_STATUS:
737 pvr2_hdw_trigger_module_log(hdw);
738 ret = 0;
739 break;
741 #ifdef CONFIG_VIDEO_ADV_DEBUG
742 case VIDIOC_DBG_S_REGISTER:
743 case VIDIOC_DBG_G_REGISTER:
745 u64 val;
746 struct v4l2_register *req = (struct v4l2_register *)arg;
747 if (cmd == VIDIOC_DBG_S_REGISTER) val = req->val;
748 ret = pvr2_hdw_register_access(
749 hdw,req->match_type,req->match_chip,req->reg,
750 cmd == VIDIOC_DBG_S_REGISTER,&val);
751 if (cmd == VIDIOC_DBG_G_REGISTER) req->val = val;
752 break;
754 #endif
756 default :
757 ret = v4l_compat_translate_ioctl(inode,file,cmd,
758 arg,pvr2_v4l2_do_ioctl);
761 pvr2_hdw_commit_ctl(hdw);
763 if (ret < 0) {
764 if (pvrusb2_debug & PVR2_TRACE_V4LIOCTL) {
765 pvr2_trace(PVR2_TRACE_V4LIOCTL,
766 "pvr2_v4l2_do_ioctl failure, ret=%d",ret);
767 } else {
768 if (pvrusb2_debug & PVR2_TRACE_V4LIOCTL) {
769 pvr2_trace(PVR2_TRACE_V4LIOCTL,
770 "pvr2_v4l2_do_ioctl failure, ret=%d"
771 " command was:",ret);
772 v4l_print_ioctl(pvr2_hdw_get_driver_name(hdw),
773 cmd);
776 } else {
777 pvr2_trace(PVR2_TRACE_V4LIOCTL,
778 "pvr2_v4l2_do_ioctl complete, ret=%d (0x%x)",
779 ret,ret);
781 return ret;
785 static void pvr2_v4l2_dev_destroy(struct pvr2_v4l2_dev *dip)
787 int minor_id = dip->devbase.minor;
788 struct pvr2_hdw *hdw = dip->v4lp->channel.mc_head->hdw;
789 enum pvr2_config cfg = dip->config;
790 int v4l_type = dip->v4l_type;
792 pvr2_hdw_v4l_store_minor_number(hdw,dip->minor_type,-1);
794 /* Paranoia */
795 dip->v4lp = NULL;
796 dip->stream = NULL;
798 /* Actual deallocation happens later when all internal references
799 are gone. */
800 video_unregister_device(&dip->devbase);
802 printk(KERN_INFO "pvrusb2: unregistered device %s%u [%s]\n",
803 get_v4l_name(v4l_type),minor_id & 0x1f,
804 pvr2_config_get_name(cfg));
809 static void pvr2_v4l2_destroy_no_lock(struct pvr2_v4l2 *vp)
811 if (vp->dev_video) {
812 pvr2_v4l2_dev_destroy(vp->dev_video);
813 vp->dev_video = NULL;
815 if (vp->dev_radio) {
816 pvr2_v4l2_dev_destroy(vp->dev_radio);
817 vp->dev_radio = NULL;
820 pvr2_trace(PVR2_TRACE_STRUCT,"Destroying pvr2_v4l2 id=%p",vp);
821 pvr2_channel_done(&vp->channel);
822 kfree(vp);
826 static void pvr2_video_device_release(struct video_device *vdev)
828 struct pvr2_v4l2_dev *dev;
829 dev = container_of(vdev,struct pvr2_v4l2_dev,devbase);
830 kfree(dev);
834 static void pvr2_v4l2_internal_check(struct pvr2_channel *chp)
836 struct pvr2_v4l2 *vp;
837 vp = container_of(chp,struct pvr2_v4l2,channel);
838 if (!vp->channel.mc_head->disconnect_flag) return;
839 if (vp->vfirst) return;
840 pvr2_v4l2_destroy_no_lock(vp);
844 static int pvr2_v4l2_ioctl(struct inode *inode, struct file *file,
845 unsigned int cmd, unsigned long arg)
848 /* Temporary hack : use ivtv api until a v4l2 one is available. */
849 #define IVTV_IOC_G_CODEC 0xFFEE7703
850 #define IVTV_IOC_S_CODEC 0xFFEE7704
851 if (cmd == IVTV_IOC_G_CODEC || cmd == IVTV_IOC_S_CODEC) return 0;
852 return video_usercopy(inode, file, cmd, arg, pvr2_v4l2_do_ioctl);
856 static int pvr2_v4l2_release(struct inode *inode, struct file *file)
858 struct pvr2_v4l2_fh *fhp = file->private_data;
859 struct pvr2_v4l2 *vp = fhp->vhead;
860 struct pvr2_context *mp = fhp->vhead->channel.mc_head;
861 struct pvr2_hdw *hdw = fhp->channel.mc_head->hdw;
863 pvr2_trace(PVR2_TRACE_OPEN_CLOSE,"pvr2_v4l2_release");
865 if (fhp->rhp) {
866 struct pvr2_stream *sp;
867 pvr2_hdw_set_streaming(hdw,0);
868 sp = pvr2_ioread_get_stream(fhp->rhp);
869 if (sp) pvr2_stream_set_callback(sp,NULL,NULL);
870 pvr2_ioread_destroy(fhp->rhp);
871 fhp->rhp = NULL;
874 v4l2_prio_close(&vp->prio, &fhp->prio);
875 file->private_data = NULL;
877 pvr2_context_enter(mp); do {
878 /* Restore the previous input selection, if it makes sense
879 to do so. */
880 if (fhp->dev_info->v4l_type == VFL_TYPE_RADIO) {
881 struct pvr2_ctrl *cp;
882 int pval;
883 cp = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_INPUT);
884 pvr2_ctrl_get_value(cp,&pval);
885 /* Only restore if we're still selecting the radio */
886 if (pval == PVR2_CVAL_INPUT_RADIO) {
887 pvr2_ctrl_set_value(cp,fhp->prev_input_val);
888 pvr2_hdw_commit_ctl(hdw);
892 if (fhp->vnext) {
893 fhp->vnext->vprev = fhp->vprev;
894 } else {
895 vp->vlast = fhp->vprev;
897 if (fhp->vprev) {
898 fhp->vprev->vnext = fhp->vnext;
899 } else {
900 vp->vfirst = fhp->vnext;
902 fhp->vnext = NULL;
903 fhp->vprev = NULL;
904 fhp->vhead = NULL;
905 pvr2_channel_done(&fhp->channel);
906 pvr2_trace(PVR2_TRACE_STRUCT,
907 "Destroying pvr_v4l2_fh id=%p",fhp);
908 kfree(fhp);
909 if (vp->channel.mc_head->disconnect_flag && !vp->vfirst) {
910 pvr2_v4l2_destroy_no_lock(vp);
912 } while (0); pvr2_context_exit(mp);
913 return 0;
917 static int pvr2_v4l2_open(struct inode *inode, struct file *file)
919 struct pvr2_v4l2_dev *dip; /* Our own context pointer */
920 struct pvr2_v4l2_fh *fhp;
921 struct pvr2_v4l2 *vp;
922 struct pvr2_hdw *hdw;
924 dip = container_of(video_devdata(file),struct pvr2_v4l2_dev,devbase);
926 vp = dip->v4lp;
927 hdw = vp->channel.hdw;
929 pvr2_trace(PVR2_TRACE_OPEN_CLOSE,"pvr2_v4l2_open");
931 if (!pvr2_hdw_dev_ok(hdw)) {
932 pvr2_trace(PVR2_TRACE_OPEN_CLOSE,
933 "pvr2_v4l2_open: hardware not ready");
934 return -EIO;
937 fhp = kzalloc(sizeof(*fhp),GFP_KERNEL);
938 if (!fhp) {
939 return -ENOMEM;
942 init_waitqueue_head(&fhp->wait_data);
943 fhp->dev_info = dip;
945 pvr2_context_enter(vp->channel.mc_head); do {
946 pvr2_trace(PVR2_TRACE_STRUCT,"Creating pvr_v4l2_fh id=%p",fhp);
947 pvr2_channel_init(&fhp->channel,vp->channel.mc_head);
949 fhp->vnext = NULL;
950 fhp->vprev = vp->vlast;
951 if (vp->vlast) {
952 vp->vlast->vnext = fhp;
953 } else {
954 vp->vfirst = fhp;
956 vp->vlast = fhp;
957 fhp->vhead = vp;
959 /* Opening the /dev/radioX device implies a mode switch.
960 So execute that here. Note that you can get the
961 IDENTICAL effect merely by opening the normal video
962 device and setting the input appropriately. */
963 if (dip->v4l_type == VFL_TYPE_RADIO) {
964 struct pvr2_ctrl *cp;
965 cp = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_INPUT);
966 pvr2_ctrl_get_value(cp,&fhp->prev_input_val);
967 pvr2_ctrl_set_value(cp,PVR2_CVAL_INPUT_RADIO);
968 pvr2_hdw_commit_ctl(hdw);
970 } while (0); pvr2_context_exit(vp->channel.mc_head);
972 fhp->file = file;
973 file->private_data = fhp;
974 v4l2_prio_open(&vp->prio,&fhp->prio);
976 fhp->fw_mode_flag = pvr2_hdw_cpufw_get_enabled(hdw);
978 return 0;
982 static void pvr2_v4l2_notify(struct pvr2_v4l2_fh *fhp)
984 wake_up(&fhp->wait_data);
987 static int pvr2_v4l2_iosetup(struct pvr2_v4l2_fh *fh)
989 int ret;
990 struct pvr2_stream *sp;
991 struct pvr2_hdw *hdw;
992 if (fh->rhp) return 0;
994 if (!fh->dev_info->stream) {
995 /* No stream defined for this node. This means that we're
996 not currently allowed to stream from this node. */
997 return -EPERM;
1000 /* First read() attempt. Try to claim the stream and start
1001 it... */
1002 if ((ret = pvr2_channel_claim_stream(&fh->channel,
1003 fh->dev_info->stream)) != 0) {
1004 /* Someone else must already have it */
1005 return ret;
1008 fh->rhp = pvr2_channel_create_mpeg_stream(fh->dev_info->stream);
1009 if (!fh->rhp) {
1010 pvr2_channel_claim_stream(&fh->channel,NULL);
1011 return -ENOMEM;
1014 hdw = fh->channel.mc_head->hdw;
1015 sp = fh->dev_info->stream->stream;
1016 pvr2_stream_set_callback(sp,(pvr2_stream_callback)pvr2_v4l2_notify,fh);
1017 pvr2_hdw_set_stream_type(hdw,fh->dev_info->config);
1018 pvr2_hdw_set_streaming(hdw,!0);
1019 ret = pvr2_ioread_set_enabled(fh->rhp,!0);
1021 return ret;
1025 static ssize_t pvr2_v4l2_read(struct file *file,
1026 char __user *buff, size_t count, loff_t *ppos)
1028 struct pvr2_v4l2_fh *fh = file->private_data;
1029 int ret;
1031 if (fh->fw_mode_flag) {
1032 struct pvr2_hdw *hdw = fh->channel.mc_head->hdw;
1033 char *tbuf;
1034 int c1,c2;
1035 int tcnt = 0;
1036 unsigned int offs = *ppos;
1038 tbuf = kmalloc(PAGE_SIZE,GFP_KERNEL);
1039 if (!tbuf) return -ENOMEM;
1041 while (count) {
1042 c1 = count;
1043 if (c1 > PAGE_SIZE) c1 = PAGE_SIZE;
1044 c2 = pvr2_hdw_cpufw_get(hdw,offs,tbuf,c1);
1045 if (c2 < 0) {
1046 tcnt = c2;
1047 break;
1049 if (!c2) break;
1050 if (copy_to_user(buff,tbuf,c2)) {
1051 tcnt = -EFAULT;
1052 break;
1054 offs += c2;
1055 tcnt += c2;
1056 buff += c2;
1057 count -= c2;
1058 *ppos += c2;
1060 kfree(tbuf);
1061 return tcnt;
1064 if (!fh->rhp) {
1065 ret = pvr2_v4l2_iosetup(fh);
1066 if (ret) {
1067 return ret;
1071 for (;;) {
1072 ret = pvr2_ioread_read(fh->rhp,buff,count);
1073 if (ret >= 0) break;
1074 if (ret != -EAGAIN) break;
1075 if (file->f_flags & O_NONBLOCK) break;
1076 /* Doing blocking I/O. Wait here. */
1077 ret = wait_event_interruptible(
1078 fh->wait_data,
1079 pvr2_ioread_avail(fh->rhp) >= 0);
1080 if (ret < 0) break;
1083 return ret;
1087 static unsigned int pvr2_v4l2_poll(struct file *file, poll_table *wait)
1089 unsigned int mask = 0;
1090 struct pvr2_v4l2_fh *fh = file->private_data;
1091 int ret;
1093 if (fh->fw_mode_flag) {
1094 mask |= POLLIN | POLLRDNORM;
1095 return mask;
1098 if (!fh->rhp) {
1099 ret = pvr2_v4l2_iosetup(fh);
1100 if (ret) return POLLERR;
1103 poll_wait(file,&fh->wait_data,wait);
1105 if (pvr2_ioread_avail(fh->rhp) >= 0) {
1106 mask |= POLLIN | POLLRDNORM;
1109 return mask;
1113 static const struct file_operations vdev_fops = {
1114 .owner = THIS_MODULE,
1115 .open = pvr2_v4l2_open,
1116 .release = pvr2_v4l2_release,
1117 .read = pvr2_v4l2_read,
1118 .ioctl = pvr2_v4l2_ioctl,
1119 .llseek = no_llseek,
1120 .poll = pvr2_v4l2_poll,
1124 #define VID_HARDWARE_PVRUSB2 38 /* FIXME : need a good value */
1126 static struct video_device vdev_template = {
1127 .owner = THIS_MODULE,
1128 .type = VID_TYPE_CAPTURE | VID_TYPE_TUNER,
1129 .type2 = (V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VBI_CAPTURE
1130 | V4L2_CAP_TUNER | V4L2_CAP_AUDIO
1131 | V4L2_CAP_READWRITE),
1132 .hardware = VID_HARDWARE_PVRUSB2,
1133 .fops = &vdev_fops,
1137 static void pvr2_v4l2_dev_init(struct pvr2_v4l2_dev *dip,
1138 struct pvr2_v4l2 *vp,
1139 int v4l_type)
1141 int mindevnum;
1142 int unit_number;
1143 int *nr_ptr = NULL;
1144 dip->v4lp = vp;
1147 dip->v4l_type = v4l_type;
1148 switch (v4l_type) {
1149 case VFL_TYPE_GRABBER:
1150 dip->stream = &vp->channel.mc_head->video_stream;
1151 dip->config = pvr2_config_mpeg;
1152 dip->minor_type = pvr2_v4l_type_video;
1153 nr_ptr = video_nr;
1154 if (!dip->stream) {
1155 err("Failed to set up pvrusb2 v4l video dev"
1156 " due to missing stream instance");
1157 return;
1159 break;
1160 case VFL_TYPE_VBI:
1161 dip->config = pvr2_config_vbi;
1162 dip->minor_type = pvr2_v4l_type_vbi;
1163 nr_ptr = vbi_nr;
1164 break;
1165 case VFL_TYPE_RADIO:
1166 dip->stream = &vp->channel.mc_head->video_stream;
1167 dip->config = pvr2_config_mpeg;
1168 dip->minor_type = pvr2_v4l_type_radio;
1169 nr_ptr = radio_nr;
1170 break;
1171 default:
1172 /* Bail out (this should be impossible) */
1173 err("Failed to set up pvrusb2 v4l dev"
1174 " due to unrecognized config");
1175 return;
1178 memcpy(&dip->devbase,&vdev_template,sizeof(vdev_template));
1179 dip->devbase.release = pvr2_video_device_release;
1181 mindevnum = -1;
1182 unit_number = pvr2_hdw_get_unit_number(vp->channel.mc_head->hdw);
1183 if (nr_ptr && (unit_number >= 0) && (unit_number < PVR_NUM)) {
1184 mindevnum = nr_ptr[unit_number];
1186 if ((video_register_device(&dip->devbase,
1187 dip->v4l_type, mindevnum) < 0) &&
1188 (video_register_device(&dip->devbase,
1189 dip->v4l_type, -1) < 0)) {
1190 err("Failed to register pvrusb2 v4l device");
1193 printk(KERN_INFO "pvrusb2: registered device %s%u [%s]\n",
1194 get_v4l_name(dip->v4l_type),dip->devbase.minor & 0x1f,
1195 pvr2_config_get_name(dip->config));
1197 pvr2_hdw_v4l_store_minor_number(vp->channel.mc_head->hdw,
1198 dip->minor_type,dip->devbase.minor);
1202 struct pvr2_v4l2 *pvr2_v4l2_create(struct pvr2_context *mnp)
1204 struct pvr2_v4l2 *vp;
1206 vp = kzalloc(sizeof(*vp),GFP_KERNEL);
1207 if (!vp) return vp;
1208 vp->dev_video = kzalloc(sizeof(*vp->dev_video),GFP_KERNEL);
1209 vp->dev_radio = kzalloc(sizeof(*vp->dev_radio),GFP_KERNEL);
1210 if (!(vp->dev_video && vp->dev_radio)) {
1211 kfree(vp->dev_video);
1212 kfree(vp->dev_radio);
1213 kfree(vp);
1214 return NULL;
1216 pvr2_channel_init(&vp->channel,mnp);
1217 pvr2_trace(PVR2_TRACE_STRUCT,"Creating pvr2_v4l2 id=%p",vp);
1219 vp->channel.check_func = pvr2_v4l2_internal_check;
1221 /* register streams */
1222 pvr2_v4l2_dev_init(vp->dev_video,vp,VFL_TYPE_GRABBER);
1223 pvr2_v4l2_dev_init(vp->dev_radio,vp,VFL_TYPE_RADIO);
1225 return vp;
1229 Stuff for Emacs to see, in order to encourage consistent editing style:
1230 *** Local Variables: ***
1231 *** mode: c ***
1232 *** fill-column: 75 ***
1233 *** tab-width: 8 ***
1234 *** c-basic-offset: 8 ***
1235 *** End: ***