Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / drivers / media / usb / pvrusb2 / pvrusb2-v4l2.c
1 /*
2  *
3  *
4  *  Copyright (C) 2005 Mike Isely <isely@pobox.com>
5  *  Copyright (C) 2004 Aurelien Alleaume <slts@free.fr>
6  *
7  *  This program is free software; you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License as published by
9  *  the Free Software Foundation; either version 2 of the License
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program; if not, write to the Free Software
18  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  */
21
22 #include <linux/kernel.h>
23 #include <linux/slab.h>
24 #include "pvrusb2-context.h"
25 #include "pvrusb2-hdw.h"
26 #include "pvrusb2.h"
27 #include "pvrusb2-debug.h"
28 #include "pvrusb2-v4l2.h"
29 #include "pvrusb2-ioread.h"
30 #include <linux/videodev2.h>
31 #include <linux/module.h>
32 #include <media/v4l2-dev.h>
33 #include <media/v4l2-device.h>
34 #include <media/v4l2-fh.h>
35 #include <media/v4l2-common.h>
36 #include <media/v4l2-ioctl.h>
37
38 struct pvr2_v4l2_dev;
39 struct pvr2_v4l2_fh;
40 struct pvr2_v4l2;
41
42 struct pvr2_v4l2_dev {
43         struct video_device devbase; /* MUST be first! */
44         struct pvr2_v4l2 *v4lp;
45         struct pvr2_context_stream *stream;
46         /* Information about this device: */
47         enum pvr2_config config; /* Expected stream format */
48         int v4l_type; /* V4L defined type for this device node */
49         enum pvr2_v4l_type minor_type; /* pvr2-understood minor device type */
50 };
51
52 struct pvr2_v4l2_fh {
53         struct v4l2_fh fh;
54         struct pvr2_channel channel;
55         struct pvr2_v4l2_dev *pdi;
56         struct pvr2_ioread *rhp;
57         struct file *file;
58         wait_queue_head_t wait_data;
59         int fw_mode_flag;
60         /* Map contiguous ordinal value to input id */
61         unsigned char *input_map;
62         unsigned int input_cnt;
63 };
64
65 struct pvr2_v4l2 {
66         struct pvr2_channel channel;
67
68         /* streams - Note that these must be separately, individually,
69          * allocated pointers.  This is because the v4l core is going to
70          * manage their deletion - separately, individually...  */
71         struct pvr2_v4l2_dev *dev_video;
72         struct pvr2_v4l2_dev *dev_radio;
73 };
74
75 static int video_nr[PVR_NUM] = {[0 ... PVR_NUM-1] = -1};
76 module_param_array(video_nr, int, NULL, 0444);
77 MODULE_PARM_DESC(video_nr, "Offset for device's video dev minor");
78 static int radio_nr[PVR_NUM] = {[0 ... PVR_NUM-1] = -1};
79 module_param_array(radio_nr, int, NULL, 0444);
80 MODULE_PARM_DESC(radio_nr, "Offset for device's radio dev minor");
81 static int vbi_nr[PVR_NUM] = {[0 ... PVR_NUM-1] = -1};
82 module_param_array(vbi_nr, int, NULL, 0444);
83 MODULE_PARM_DESC(vbi_nr, "Offset for device's vbi dev minor");
84
85 static struct v4l2_fmtdesc pvr_fmtdesc [] = {
86         {
87                 .index          = 0,
88                 .type           = V4L2_BUF_TYPE_VIDEO_CAPTURE,
89                 .flags          = V4L2_FMT_FLAG_COMPRESSED,
90                 .description    = "MPEG1/2",
91                 // This should really be V4L2_PIX_FMT_MPEG, but xawtv
92                 // breaks when I do that.
93                 .pixelformat    = 0, // V4L2_PIX_FMT_MPEG,
94         }
95 };
96
97 #define PVR_FORMAT_PIX  0
98 #define PVR_FORMAT_VBI  1
99
100 static struct v4l2_format pvr_format [] = {
101         [PVR_FORMAT_PIX] = {
102                 .type   = V4L2_BUF_TYPE_VIDEO_CAPTURE,
103                 .fmt    = {
104                         .pix        = {
105                                 .width          = 720,
106                                 .height             = 576,
107                                 // This should really be V4L2_PIX_FMT_MPEG,
108                                 // but xawtv breaks when I do that.
109                                 .pixelformat    = 0, // V4L2_PIX_FMT_MPEG,
110                                 .field          = V4L2_FIELD_INTERLACED,
111                                 .bytesperline   = 0,  // doesn't make sense
112                                                       // here
113                                 //FIXME : Don't know what to put here...
114                                 .sizeimage          = (32*1024),
115                                 .colorspace     = 0, // doesn't make sense here
116                                 .priv           = 0
117                         }
118                 }
119         },
120         [PVR_FORMAT_VBI] = {
121                 .type   = V4L2_BUF_TYPE_VBI_CAPTURE,
122                 .fmt    = {
123                         .vbi        = {
124                                 .sampling_rate = 27000000,
125                                 .offset = 248,
126                                 .samples_per_line = 1443,
127                                 .sample_format = V4L2_PIX_FMT_GREY,
128                                 .start = { 0, 0 },
129                                 .count = { 0, 0 },
130                                 .flags = 0,
131                         }
132                 }
133         }
134 };
135
136
137
138 /*
139  * This is part of Video 4 Linux API. These procedures handle ioctl() calls.
140  */
141 static int pvr2_querycap(struct file *file, void *priv, struct v4l2_capability *cap)
142 {
143         struct pvr2_v4l2_fh *fh = file->private_data;
144         struct pvr2_hdw *hdw = fh->channel.mc_head->hdw;
145
146         strlcpy(cap->driver, "pvrusb2", sizeof(cap->driver));
147         strlcpy(cap->bus_info, pvr2_hdw_get_bus_info(hdw),
148                         sizeof(cap->bus_info));
149         strlcpy(cap->card, pvr2_hdw_get_desc(hdw), sizeof(cap->card));
150         cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_TUNER |
151                             V4L2_CAP_AUDIO | V4L2_CAP_RADIO |
152                             V4L2_CAP_READWRITE | V4L2_CAP_DEVICE_CAPS;
153         switch (fh->pdi->devbase.vfl_type) {
154         case VFL_TYPE_GRABBER:
155                 cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_AUDIO;
156                 break;
157         case VFL_TYPE_RADIO:
158                 cap->device_caps = V4L2_CAP_RADIO;
159                 break;
160         }
161         cap->device_caps |= V4L2_CAP_TUNER | V4L2_CAP_READWRITE;
162         return 0;
163 }
164
165 static int pvr2_g_std(struct file *file, void *priv, v4l2_std_id *std)
166 {
167         struct pvr2_v4l2_fh *fh = file->private_data;
168         struct pvr2_hdw *hdw = fh->channel.mc_head->hdw;
169         int val = 0;
170         int ret;
171
172         ret = pvr2_ctrl_get_value(
173                         pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_STDCUR), &val);
174         *std = val;
175         return ret;
176 }
177
178 static int pvr2_s_std(struct file *file, void *priv, v4l2_std_id std)
179 {
180         struct pvr2_v4l2_fh *fh = file->private_data;
181         struct pvr2_hdw *hdw = fh->channel.mc_head->hdw;
182
183         return pvr2_ctrl_set_value(
184                 pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_STDCUR), std);
185 }
186
187 static int pvr2_querystd(struct file *file, void *priv, v4l2_std_id *std)
188 {
189         struct pvr2_v4l2_fh *fh = file->private_data;
190         struct pvr2_hdw *hdw = fh->channel.mc_head->hdw;
191         int val = 0;
192         int ret;
193
194         ret = pvr2_ctrl_get_value(
195                 pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_STDDETECT), &val);
196         *std = val;
197         return ret;
198 }
199
200 static int pvr2_enum_input(struct file *file, void *priv, struct v4l2_input *vi)
201 {
202         struct pvr2_v4l2_fh *fh = file->private_data;
203         struct pvr2_hdw *hdw = fh->channel.mc_head->hdw;
204         struct pvr2_ctrl *cptr;
205         struct v4l2_input tmp;
206         unsigned int cnt;
207         int val;
208
209         cptr = pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_INPUT);
210
211         memset(&tmp, 0, sizeof(tmp));
212         tmp.index = vi->index;
213         if (vi->index >= fh->input_cnt)
214                 return -EINVAL;
215         val = fh->input_map[vi->index];
216         switch (val) {
217         case PVR2_CVAL_INPUT_TV:
218         case PVR2_CVAL_INPUT_DTV:
219         case PVR2_CVAL_INPUT_RADIO:
220                 tmp.type = V4L2_INPUT_TYPE_TUNER;
221                 break;
222         case PVR2_CVAL_INPUT_SVIDEO:
223         case PVR2_CVAL_INPUT_COMPOSITE:
224                 tmp.type = V4L2_INPUT_TYPE_CAMERA;
225                 break;
226         default:
227                 return -EINVAL;
228         }
229
230         cnt = 0;
231         pvr2_ctrl_get_valname(cptr, val,
232                         tmp.name, sizeof(tmp.name) - 1, &cnt);
233         tmp.name[cnt] = 0;
234
235         /* Don't bother with audioset, since this driver currently
236            always switches the audio whenever the video is
237            switched. */
238
239         /* Handling std is a tougher problem.  It doesn't make
240            sense in cases where a device might be multi-standard.
241            We could just copy out the current value for the
242            standard, but it can change over time.  For now just
243            leave it zero. */
244         *vi = tmp;
245         return 0;
246 }
247
248 static int pvr2_g_input(struct file *file, void *priv, unsigned int *i)
249 {
250         struct pvr2_v4l2_fh *fh = file->private_data;
251         struct pvr2_hdw *hdw = fh->channel.mc_head->hdw;
252         unsigned int idx;
253         struct pvr2_ctrl *cptr;
254         int val;
255         int ret;
256
257         cptr = pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_INPUT);
258         val = 0;
259         ret = pvr2_ctrl_get_value(cptr, &val);
260         *i = 0;
261         for (idx = 0; idx < fh->input_cnt; idx++) {
262                 if (fh->input_map[idx] == val) {
263                         *i = idx;
264                         break;
265                 }
266         }
267         return ret;
268 }
269
270 static int pvr2_s_input(struct file *file, void *priv, unsigned int inp)
271 {
272         struct pvr2_v4l2_fh *fh = file->private_data;
273         struct pvr2_hdw *hdw = fh->channel.mc_head->hdw;
274
275         if (inp >= fh->input_cnt)
276                 return -EINVAL;
277         return pvr2_ctrl_set_value(
278                         pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_INPUT),
279                         fh->input_map[inp]);
280 }
281
282 static int pvr2_enumaudio(struct file *file, void *priv, struct v4l2_audio *vin)
283 {
284         /* pkt: FIXME: We are returning one "fake" input here
285            which could very well be called "whatever_we_like".
286            This is for apps that want to see an audio input
287            just to feel comfortable, as well as to test if
288            it can do stereo or sth. There is actually no guarantee
289            that the actual audio input cannot change behind the app's
290            back, but most applications should not mind that either.
291
292            Hopefully, mplayer people will work with us on this (this
293            whole mess is to support mplayer pvr://), or Hans will come
294            up with a more standard way to say "we have inputs but we
295            don 't want you to change them independent of video" which
296            will sort this mess.
297          */
298
299         if (vin->index > 0)
300                 return -EINVAL;
301         strncpy(vin->name, "PVRUSB2 Audio", 14);
302         vin->capability = V4L2_AUDCAP_STEREO;
303         return 0;
304 }
305
306 static int pvr2_g_audio(struct file *file, void *priv, struct v4l2_audio *vin)
307 {
308         /* pkt: FIXME: see above comment (VIDIOC_ENUMAUDIO) */
309         vin->index = 0;
310         strncpy(vin->name, "PVRUSB2 Audio", 14);
311         vin->capability = V4L2_AUDCAP_STEREO;
312         return 0;
313 }
314
315 static int pvr2_s_audio(struct file *file, void *priv, const struct v4l2_audio *vout)
316 {
317         if (vout->index)
318                 return -EINVAL;
319         return 0;
320 }
321
322 static int pvr2_g_tuner(struct file *file, void *priv, struct v4l2_tuner *vt)
323 {
324         struct pvr2_v4l2_fh *fh = file->private_data;
325         struct pvr2_hdw *hdw = fh->channel.mc_head->hdw;
326
327         if (vt->index != 0)
328                 return -EINVAL; /* Only answer for the 1st tuner */
329
330         pvr2_hdw_execute_tuner_poll(hdw);
331         return pvr2_hdw_get_tuner_status(hdw, vt);
332 }
333
334 static int pvr2_s_tuner(struct file *file, void *priv, const struct v4l2_tuner *vt)
335 {
336         struct pvr2_v4l2_fh *fh = file->private_data;
337         struct pvr2_hdw *hdw = fh->channel.mc_head->hdw;
338
339         if (vt->index != 0)
340                 return -EINVAL;
341
342         return pvr2_ctrl_set_value(
343                         pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_AUDIOMODE),
344                         vt->audmode);
345 }
346
347 static int pvr2_s_frequency(struct file *file, void *priv, const struct v4l2_frequency *vf)
348 {
349         struct pvr2_v4l2_fh *fh = file->private_data;
350         struct pvr2_hdw *hdw = fh->channel.mc_head->hdw;
351         unsigned long fv;
352         struct v4l2_tuner vt;
353         int cur_input;
354         struct pvr2_ctrl *ctrlp;
355         int ret;
356
357         ret = pvr2_hdw_get_tuner_status(hdw, &vt);
358         if (ret != 0)
359                 return ret;
360         ctrlp = pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_INPUT);
361         ret = pvr2_ctrl_get_value(ctrlp, &cur_input);
362         if (ret != 0)
363                 return ret;
364         if (vf->type == V4L2_TUNER_RADIO) {
365                 if (cur_input != PVR2_CVAL_INPUT_RADIO)
366                         pvr2_ctrl_set_value(ctrlp, PVR2_CVAL_INPUT_RADIO);
367         } else {
368                 if (cur_input == PVR2_CVAL_INPUT_RADIO)
369                         pvr2_ctrl_set_value(ctrlp, PVR2_CVAL_INPUT_TV);
370         }
371         fv = vf->frequency;
372         if (vt.capability & V4L2_TUNER_CAP_LOW)
373                 fv = (fv * 125) / 2;
374         else
375                 fv = fv * 62500;
376         return pvr2_ctrl_set_value(
377                         pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_FREQUENCY),fv);
378 }
379
380 static int pvr2_g_frequency(struct file *file, void *priv, struct v4l2_frequency *vf)
381 {
382         struct pvr2_v4l2_fh *fh = file->private_data;
383         struct pvr2_hdw *hdw = fh->channel.mc_head->hdw;
384         int val = 0;
385         int cur_input;
386         struct v4l2_tuner vt;
387         int ret;
388
389         ret = pvr2_hdw_get_tuner_status(hdw, &vt);
390         if (ret != 0)
391                 return ret;
392         ret = pvr2_ctrl_get_value(
393                         pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_FREQUENCY),
394                         &val);
395         if (ret != 0)
396                 return ret;
397         pvr2_ctrl_get_value(
398                         pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_INPUT),
399                         &cur_input);
400         if (cur_input == PVR2_CVAL_INPUT_RADIO)
401                 vf->type = V4L2_TUNER_RADIO;
402         else
403                 vf->type = V4L2_TUNER_ANALOG_TV;
404         if (vt.capability & V4L2_TUNER_CAP_LOW)
405                 val = (val * 2) / 125;
406         else
407                 val /= 62500;
408         vf->frequency = val;
409         return 0;
410 }
411
412 static int pvr2_enum_fmt_vid_cap(struct file *file, void *priv, struct v4l2_fmtdesc *fd)
413 {
414         /* Only one format is supported : mpeg.*/
415         if (fd->index != 0)
416                 return -EINVAL;
417
418         memcpy(fd, pvr_fmtdesc, sizeof(struct v4l2_fmtdesc));
419         return 0;
420 }
421
422 static int pvr2_g_fmt_vid_cap(struct file *file, void *priv, struct v4l2_format *vf)
423 {
424         struct pvr2_v4l2_fh *fh = file->private_data;
425         struct pvr2_hdw *hdw = fh->channel.mc_head->hdw;
426         int val;
427
428         memcpy(vf, &pvr_format[PVR_FORMAT_PIX], sizeof(struct v4l2_format));
429         val = 0;
430         pvr2_ctrl_get_value(
431                         pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_HRES),
432                         &val);
433         vf->fmt.pix.width = val;
434         val = 0;
435         pvr2_ctrl_get_value(
436                         pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_VRES),
437                         &val);
438         vf->fmt.pix.height = val;
439         return 0;
440 }
441
442 static int pvr2_try_fmt_vid_cap(struct file *file, void *priv, struct v4l2_format *vf)
443 {
444         struct pvr2_v4l2_fh *fh = file->private_data;
445         struct pvr2_hdw *hdw = fh->channel.mc_head->hdw;
446         int lmin, lmax, ldef;
447         struct pvr2_ctrl *hcp, *vcp;
448         int h = vf->fmt.pix.height;
449         int w = vf->fmt.pix.width;
450
451         hcp = pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_HRES);
452         vcp = pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_VRES);
453
454         lmin = pvr2_ctrl_get_min(hcp);
455         lmax = pvr2_ctrl_get_max(hcp);
456         pvr2_ctrl_get_def(hcp, &ldef);
457         if (w == -1)
458                 w = ldef;
459         else if (w < lmin)
460                 w = lmin;
461         else if (w > lmax)
462                 w = lmax;
463         lmin = pvr2_ctrl_get_min(vcp);
464         lmax = pvr2_ctrl_get_max(vcp);
465         pvr2_ctrl_get_def(vcp, &ldef);
466         if (h == -1)
467                 h = ldef;
468         else if (h < lmin)
469                 h = lmin;
470         else if (h > lmax)
471                 h = lmax;
472
473         memcpy(vf, &pvr_format[PVR_FORMAT_PIX],
474                         sizeof(struct v4l2_format));
475         vf->fmt.pix.width = w;
476         vf->fmt.pix.height = h;
477         return 0;
478 }
479
480 static int pvr2_s_fmt_vid_cap(struct file *file, void *priv, struct v4l2_format *vf)
481 {
482         struct pvr2_v4l2_fh *fh = file->private_data;
483         struct pvr2_hdw *hdw = fh->channel.mc_head->hdw;
484         struct pvr2_ctrl *hcp, *vcp;
485         int ret = pvr2_try_fmt_vid_cap(file, fh, vf);
486
487         if (ret)
488                 return ret;
489         hcp = pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_HRES);
490         vcp = pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_VRES);
491         pvr2_ctrl_set_value(hcp, vf->fmt.pix.width);
492         pvr2_ctrl_set_value(vcp, vf->fmt.pix.height);
493         return 0;
494 }
495
496 static int pvr2_streamon(struct file *file, void *priv, enum v4l2_buf_type i)
497 {
498         struct pvr2_v4l2_fh *fh = file->private_data;
499         struct pvr2_hdw *hdw = fh->channel.mc_head->hdw;
500         struct pvr2_v4l2_dev *pdi = fh->pdi;
501         int ret;
502
503         if (!fh->pdi->stream) {
504                 /* No stream defined for this node.  This means
505                    that we're not currently allowed to stream from
506                    this node. */
507                 return -EPERM;
508         }
509         ret = pvr2_hdw_set_stream_type(hdw, pdi->config);
510         if (ret < 0)
511                 return ret;
512         return pvr2_hdw_set_streaming(hdw, !0);
513 }
514
515 static int pvr2_streamoff(struct file *file, void *priv, enum v4l2_buf_type i)
516 {
517         struct pvr2_v4l2_fh *fh = file->private_data;
518         struct pvr2_hdw *hdw = fh->channel.mc_head->hdw;
519
520         if (!fh->pdi->stream) {
521                 /* No stream defined for this node.  This means
522                    that we're not currently allowed to stream from
523                    this node. */
524                 return -EPERM;
525         }
526         return pvr2_hdw_set_streaming(hdw, 0);
527 }
528
529 static int pvr2_queryctrl(struct file *file, void *priv,
530                 struct v4l2_queryctrl *vc)
531 {
532         struct pvr2_v4l2_fh *fh = file->private_data;
533         struct pvr2_hdw *hdw = fh->channel.mc_head->hdw;
534         struct pvr2_ctrl *cptr;
535         int val;
536
537         if (vc->id & V4L2_CTRL_FLAG_NEXT_CTRL) {
538                 cptr = pvr2_hdw_get_ctrl_nextv4l(
539                                 hdw, (vc->id & ~V4L2_CTRL_FLAG_NEXT_CTRL));
540                 if (cptr)
541                         vc->id = pvr2_ctrl_get_v4lid(cptr);
542         } else {
543                 cptr = pvr2_hdw_get_ctrl_v4l(hdw, vc->id);
544         }
545         if (!cptr) {
546                 pvr2_trace(PVR2_TRACE_V4LIOCTL,
547                                 "QUERYCTRL id=0x%x not implemented here",
548                                 vc->id);
549                 return -EINVAL;
550         }
551
552         pvr2_trace(PVR2_TRACE_V4LIOCTL,
553                         "QUERYCTRL id=0x%x mapping name=%s (%s)",
554                         vc->id, pvr2_ctrl_get_name(cptr),
555                         pvr2_ctrl_get_desc(cptr));
556         strlcpy(vc->name, pvr2_ctrl_get_desc(cptr), sizeof(vc->name));
557         vc->flags = pvr2_ctrl_get_v4lflags(cptr);
558         pvr2_ctrl_get_def(cptr, &val);
559         vc->default_value = val;
560         switch (pvr2_ctrl_get_type(cptr)) {
561         case pvr2_ctl_enum:
562                 vc->type = V4L2_CTRL_TYPE_MENU;
563                 vc->minimum = 0;
564                 vc->maximum = pvr2_ctrl_get_cnt(cptr) - 1;
565                 vc->step = 1;
566                 break;
567         case pvr2_ctl_bool:
568                 vc->type = V4L2_CTRL_TYPE_BOOLEAN;
569                 vc->minimum = 0;
570                 vc->maximum = 1;
571                 vc->step = 1;
572                 break;
573         case pvr2_ctl_int:
574                 vc->type = V4L2_CTRL_TYPE_INTEGER;
575                 vc->minimum = pvr2_ctrl_get_min(cptr);
576                 vc->maximum = pvr2_ctrl_get_max(cptr);
577                 vc->step = 1;
578                 break;
579         default:
580                 pvr2_trace(PVR2_TRACE_V4LIOCTL,
581                                 "QUERYCTRL id=0x%x name=%s not mappable",
582                                 vc->id, pvr2_ctrl_get_name(cptr));
583                 return -EINVAL;
584         }
585         return 0;
586 }
587
588 static int pvr2_querymenu(struct file *file, void *priv, struct v4l2_querymenu *vm)
589 {
590         struct pvr2_v4l2_fh *fh = file->private_data;
591         struct pvr2_hdw *hdw = fh->channel.mc_head->hdw;
592         unsigned int cnt = 0;
593         int ret;
594
595         ret = pvr2_ctrl_get_valname(pvr2_hdw_get_ctrl_v4l(hdw, vm->id),
596                         vm->index,
597                         vm->name, sizeof(vm->name) - 1,
598                         &cnt);
599         vm->name[cnt] = 0;
600         return ret;
601 }
602
603 static int pvr2_g_ctrl(struct file *file, void *priv, struct v4l2_control *vc)
604 {
605         struct pvr2_v4l2_fh *fh = file->private_data;
606         struct pvr2_hdw *hdw = fh->channel.mc_head->hdw;
607         int val = 0;
608         int ret;
609
610         ret = pvr2_ctrl_get_value(pvr2_hdw_get_ctrl_v4l(hdw, vc->id),
611                         &val);
612         vc->value = val;
613         return ret;
614 }
615
616 static int pvr2_s_ctrl(struct file *file, void *priv, struct v4l2_control *vc)
617 {
618         struct pvr2_v4l2_fh *fh = file->private_data;
619         struct pvr2_hdw *hdw = fh->channel.mc_head->hdw;
620
621         return pvr2_ctrl_set_value(pvr2_hdw_get_ctrl_v4l(hdw, vc->id),
622                         vc->value);
623 }
624
625 static int pvr2_g_ext_ctrls(struct file *file, void *priv,
626                                         struct v4l2_ext_controls *ctls)
627 {
628         struct pvr2_v4l2_fh *fh = file->private_data;
629         struct pvr2_hdw *hdw = fh->channel.mc_head->hdw;
630         struct v4l2_ext_control *ctrl;
631         unsigned int idx;
632         int val;
633         int ret;
634
635         ret = 0;
636         for (idx = 0; idx < ctls->count; idx++) {
637                 ctrl = ctls->controls + idx;
638                 ret = pvr2_ctrl_get_value(
639                                 pvr2_hdw_get_ctrl_v4l(hdw, ctrl->id), &val);
640                 if (ret) {
641                         ctls->error_idx = idx;
642                         return ret;
643                 }
644                 /* Ensure that if read as a 64 bit value, the user
645                    will still get a hopefully sane value */
646                 ctrl->value64 = 0;
647                 ctrl->value = val;
648         }
649         return 0;
650 }
651
652 static int pvr2_s_ext_ctrls(struct file *file, void *priv,
653                 struct v4l2_ext_controls *ctls)
654 {
655         struct pvr2_v4l2_fh *fh = file->private_data;
656         struct pvr2_hdw *hdw = fh->channel.mc_head->hdw;
657         struct v4l2_ext_control *ctrl;
658         unsigned int idx;
659         int ret;
660
661         ret = 0;
662         for (idx = 0; idx < ctls->count; idx++) {
663                 ctrl = ctls->controls + idx;
664                 ret = pvr2_ctrl_set_value(
665                                 pvr2_hdw_get_ctrl_v4l(hdw, ctrl->id),
666                                 ctrl->value);
667                 if (ret) {
668                         ctls->error_idx = idx;
669                         return ret;
670                 }
671         }
672         return 0;
673 }
674
675 static int pvr2_try_ext_ctrls(struct file *file, void *priv,
676                 struct v4l2_ext_controls *ctls)
677 {
678         struct pvr2_v4l2_fh *fh = file->private_data;
679         struct pvr2_hdw *hdw = fh->channel.mc_head->hdw;
680         struct v4l2_ext_control *ctrl;
681         struct pvr2_ctrl *pctl;
682         unsigned int idx;
683
684         /* For the moment just validate that the requested control
685            actually exists. */
686         for (idx = 0; idx < ctls->count; idx++) {
687                 ctrl = ctls->controls + idx;
688                 pctl = pvr2_hdw_get_ctrl_v4l(hdw, ctrl->id);
689                 if (!pctl) {
690                         ctls->error_idx = idx;
691                         return -EINVAL;
692                 }
693         }
694         return 0;
695 }
696
697 static int pvr2_cropcap(struct file *file, void *priv, struct v4l2_cropcap *cap)
698 {
699         struct pvr2_v4l2_fh *fh = file->private_data;
700         struct pvr2_hdw *hdw = fh->channel.mc_head->hdw;
701         int ret;
702
703         if (cap->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
704                 return -EINVAL;
705         ret = pvr2_hdw_get_cropcap(hdw, cap);
706         cap->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; /* paranoia */
707         return ret;
708 }
709
710 static int pvr2_g_crop(struct file *file, void *priv, struct v4l2_crop *crop)
711 {
712         struct pvr2_v4l2_fh *fh = file->private_data;
713         struct pvr2_hdw *hdw = fh->channel.mc_head->hdw;
714         int val = 0;
715         int ret;
716
717         if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
718                 return -EINVAL;
719         ret = pvr2_ctrl_get_value(
720                         pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_CROPL), &val);
721         if (ret != 0)
722                 return -EINVAL;
723         crop->c.left = val;
724         ret = pvr2_ctrl_get_value(
725                         pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_CROPT), &val);
726         if (ret != 0)
727                 return -EINVAL;
728         crop->c.top = val;
729         ret = pvr2_ctrl_get_value(
730                         pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_CROPW), &val);
731         if (ret != 0)
732                 return -EINVAL;
733         crop->c.width = val;
734         ret = pvr2_ctrl_get_value(
735                         pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_CROPH), &val);
736         if (ret != 0)
737                 return -EINVAL;
738         crop->c.height = val;
739         return 0;
740 }
741
742 static int pvr2_s_crop(struct file *file, void *priv, const struct v4l2_crop *crop)
743 {
744         struct pvr2_v4l2_fh *fh = file->private_data;
745         struct pvr2_hdw *hdw = fh->channel.mc_head->hdw;
746         int ret;
747
748         if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
749                 return -EINVAL;
750         ret = pvr2_ctrl_set_value(
751                         pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_CROPL),
752                         crop->c.left);
753         if (ret != 0)
754                 return -EINVAL;
755         ret = pvr2_ctrl_set_value(
756                         pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_CROPT),
757                         crop->c.top);
758         if (ret != 0)
759                 return -EINVAL;
760         ret = pvr2_ctrl_set_value(
761                         pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_CROPW),
762                         crop->c.width);
763         if (ret != 0)
764                 return -EINVAL;
765         ret = pvr2_ctrl_set_value(
766                         pvr2_hdw_get_ctrl_by_id(hdw, PVR2_CID_CROPH),
767                         crop->c.height);
768         if (ret != 0)
769                 return -EINVAL;
770         return 0;
771 }
772
773 static int pvr2_log_status(struct file *file, void *priv)
774 {
775         struct pvr2_v4l2_fh *fh = file->private_data;
776         struct pvr2_hdw *hdw = fh->channel.mc_head->hdw;
777
778         pvr2_hdw_trigger_module_log(hdw);
779         return 0;
780 }
781
782 static const struct v4l2_ioctl_ops pvr2_ioctl_ops = {
783         .vidioc_querycap                    = pvr2_querycap,
784         .vidioc_s_audio                     = pvr2_s_audio,
785         .vidioc_g_audio                     = pvr2_g_audio,
786         .vidioc_enumaudio                   = pvr2_enumaudio,
787         .vidioc_enum_input                  = pvr2_enum_input,
788         .vidioc_cropcap                     = pvr2_cropcap,
789         .vidioc_s_crop                      = pvr2_s_crop,
790         .vidioc_g_crop                      = pvr2_g_crop,
791         .vidioc_g_input                     = pvr2_g_input,
792         .vidioc_s_input                     = pvr2_s_input,
793         .vidioc_g_frequency                 = pvr2_g_frequency,
794         .vidioc_s_frequency                 = pvr2_s_frequency,
795         .vidioc_s_tuner                     = pvr2_s_tuner,
796         .vidioc_g_tuner                     = pvr2_g_tuner,
797         .vidioc_g_std                       = pvr2_g_std,
798         .vidioc_s_std                       = pvr2_s_std,
799         .vidioc_querystd                    = pvr2_querystd,
800         .vidioc_log_status                  = pvr2_log_status,
801         .vidioc_enum_fmt_vid_cap            = pvr2_enum_fmt_vid_cap,
802         .vidioc_g_fmt_vid_cap               = pvr2_g_fmt_vid_cap,
803         .vidioc_s_fmt_vid_cap               = pvr2_s_fmt_vid_cap,
804         .vidioc_try_fmt_vid_cap             = pvr2_try_fmt_vid_cap,
805         .vidioc_streamon                    = pvr2_streamon,
806         .vidioc_streamoff                   = pvr2_streamoff,
807         .vidioc_queryctrl                   = pvr2_queryctrl,
808         .vidioc_querymenu                   = pvr2_querymenu,
809         .vidioc_g_ctrl                      = pvr2_g_ctrl,
810         .vidioc_s_ctrl                      = pvr2_s_ctrl,
811         .vidioc_g_ext_ctrls                 = pvr2_g_ext_ctrls,
812         .vidioc_s_ext_ctrls                 = pvr2_s_ext_ctrls,
813         .vidioc_try_ext_ctrls               = pvr2_try_ext_ctrls,
814 };
815
816 static void pvr2_v4l2_dev_destroy(struct pvr2_v4l2_dev *dip)
817 {
818         struct pvr2_hdw *hdw = dip->v4lp->channel.mc_head->hdw;
819         enum pvr2_config cfg = dip->config;
820         char msg[80];
821         unsigned int mcnt;
822
823         /* Construct the unregistration message *before* we actually
824            perform the unregistration step.  By doing it this way we don't
825            have to worry about potentially touching deleted resources. */
826         mcnt = scnprintf(msg, sizeof(msg) - 1,
827                          "pvrusb2: unregistered device %s [%s]",
828                          video_device_node_name(&dip->devbase),
829                          pvr2_config_get_name(cfg));
830         msg[mcnt] = 0;
831
832         pvr2_hdw_v4l_store_minor_number(hdw,dip->minor_type,-1);
833
834         /* Paranoia */
835         dip->v4lp = NULL;
836         dip->stream = NULL;
837
838         /* Actual deallocation happens later when all internal references
839            are gone. */
840         video_unregister_device(&dip->devbase);
841
842         printk(KERN_INFO "%s\n", msg);
843
844 }
845
846
847 static void pvr2_v4l2_dev_disassociate_parent(struct pvr2_v4l2_dev *dip)
848 {
849         if (!dip) return;
850         if (!dip->devbase.v4l2_dev->dev) return;
851         dip->devbase.v4l2_dev->dev = NULL;
852         device_move(&dip->devbase.dev, NULL, DPM_ORDER_NONE);
853 }
854
855
856 static void pvr2_v4l2_destroy_no_lock(struct pvr2_v4l2 *vp)
857 {
858         if (vp->dev_video) {
859                 pvr2_v4l2_dev_destroy(vp->dev_video);
860                 vp->dev_video = NULL;
861         }
862         if (vp->dev_radio) {
863                 pvr2_v4l2_dev_destroy(vp->dev_radio);
864                 vp->dev_radio = NULL;
865         }
866
867         pvr2_trace(PVR2_TRACE_STRUCT,"Destroying pvr2_v4l2 id=%p",vp);
868         pvr2_channel_done(&vp->channel);
869         kfree(vp);
870 }
871
872
873 static void pvr2_video_device_release(struct video_device *vdev)
874 {
875         struct pvr2_v4l2_dev *dev;
876         dev = container_of(vdev,struct pvr2_v4l2_dev,devbase);
877         kfree(dev);
878 }
879
880
881 static void pvr2_v4l2_internal_check(struct pvr2_channel *chp)
882 {
883         struct pvr2_v4l2 *vp;
884         vp = container_of(chp,struct pvr2_v4l2,channel);
885         if (!vp->channel.mc_head->disconnect_flag) return;
886         pvr2_v4l2_dev_disassociate_parent(vp->dev_video);
887         pvr2_v4l2_dev_disassociate_parent(vp->dev_radio);
888         if (!list_empty(&vp->dev_video->devbase.fh_list) ||
889             !list_empty(&vp->dev_radio->devbase.fh_list))
890                 return;
891         pvr2_v4l2_destroy_no_lock(vp);
892 }
893
894
895 static long pvr2_v4l2_ioctl(struct file *file,
896                            unsigned int cmd, unsigned long arg)
897 {
898
899         struct pvr2_v4l2_fh *fh = file->private_data;
900         struct pvr2_hdw *hdw = fh->channel.mc_head->hdw;
901         long ret = -EINVAL;
902
903         if (pvrusb2_debug & PVR2_TRACE_V4LIOCTL)
904                 v4l_printk_ioctl(pvr2_hdw_get_driver_name(hdw), cmd);
905
906         if (!pvr2_hdw_dev_ok(hdw)) {
907                 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
908                            "ioctl failed - bad or no context");
909                 return -EFAULT;
910         }
911
912         ret = video_ioctl2(file, cmd, arg);
913
914         pvr2_hdw_commit_ctl(hdw);
915
916         if (ret < 0) {
917                 if (pvrusb2_debug & PVR2_TRACE_V4LIOCTL) {
918                         pvr2_trace(PVR2_TRACE_V4LIOCTL,
919                                    "pvr2_v4l2_do_ioctl failure, ret=%ld"
920                                    " command was:", ret);
921                         v4l_printk_ioctl(pvr2_hdw_get_driver_name(hdw), cmd);
922                 }
923         } else {
924                 pvr2_trace(PVR2_TRACE_V4LIOCTL,
925                            "pvr2_v4l2_do_ioctl complete, ret=%ld (0x%lx)",
926                            ret, ret);
927         }
928         return ret;
929
930 }
931
932
933 static int pvr2_v4l2_release(struct file *file)
934 {
935         struct pvr2_v4l2_fh *fhp = file->private_data;
936         struct pvr2_v4l2 *vp = fhp->pdi->v4lp;
937         struct pvr2_hdw *hdw = fhp->channel.mc_head->hdw;
938
939         pvr2_trace(PVR2_TRACE_OPEN_CLOSE,"pvr2_v4l2_release");
940
941         if (fhp->rhp) {
942                 struct pvr2_stream *sp;
943                 pvr2_hdw_set_streaming(hdw,0);
944                 sp = pvr2_ioread_get_stream(fhp->rhp);
945                 if (sp) pvr2_stream_set_callback(sp,NULL,NULL);
946                 pvr2_ioread_destroy(fhp->rhp);
947                 fhp->rhp = NULL;
948         }
949
950         v4l2_fh_del(&fhp->fh);
951         v4l2_fh_exit(&fhp->fh);
952         file->private_data = NULL;
953
954         pvr2_channel_done(&fhp->channel);
955         pvr2_trace(PVR2_TRACE_STRUCT,
956                    "Destroying pvr_v4l2_fh id=%p",fhp);
957         if (fhp->input_map) {
958                 kfree(fhp->input_map);
959                 fhp->input_map = NULL;
960         }
961         kfree(fhp);
962         if (vp->channel.mc_head->disconnect_flag &&
963             list_empty(&vp->dev_video->devbase.fh_list) &&
964             list_empty(&vp->dev_radio->devbase.fh_list)) {
965                 pvr2_v4l2_destroy_no_lock(vp);
966         }
967         return 0;
968 }
969
970
971 static int pvr2_v4l2_open(struct file *file)
972 {
973         struct pvr2_v4l2_dev *dip; /* Our own context pointer */
974         struct pvr2_v4l2_fh *fhp;
975         struct pvr2_v4l2 *vp;
976         struct pvr2_hdw *hdw;
977         unsigned int input_mask = 0;
978         unsigned int input_cnt,idx;
979         int ret = 0;
980
981         dip = container_of(video_devdata(file),struct pvr2_v4l2_dev,devbase);
982
983         vp = dip->v4lp;
984         hdw = vp->channel.hdw;
985
986         pvr2_trace(PVR2_TRACE_OPEN_CLOSE,"pvr2_v4l2_open");
987
988         if (!pvr2_hdw_dev_ok(hdw)) {
989                 pvr2_trace(PVR2_TRACE_OPEN_CLOSE,
990                            "pvr2_v4l2_open: hardware not ready");
991                 return -EIO;
992         }
993
994         fhp = kzalloc(sizeof(*fhp),GFP_KERNEL);
995         if (!fhp) {
996                 return -ENOMEM;
997         }
998
999         v4l2_fh_init(&fhp->fh, &dip->devbase);
1000         init_waitqueue_head(&fhp->wait_data);
1001         fhp->pdi = dip;
1002
1003         pvr2_trace(PVR2_TRACE_STRUCT,"Creating pvr_v4l2_fh id=%p",fhp);
1004         pvr2_channel_init(&fhp->channel,vp->channel.mc_head);
1005
1006         if (dip->v4l_type == VFL_TYPE_RADIO) {
1007                 /* Opening device as a radio, legal input selection subset
1008                    is just the radio. */
1009                 input_mask = (1 << PVR2_CVAL_INPUT_RADIO);
1010         } else {
1011                 /* Opening the main V4L device, legal input selection
1012                    subset includes all analog inputs. */
1013                 input_mask = ((1 << PVR2_CVAL_INPUT_RADIO) |
1014                               (1 << PVR2_CVAL_INPUT_TV) |
1015                               (1 << PVR2_CVAL_INPUT_COMPOSITE) |
1016                               (1 << PVR2_CVAL_INPUT_SVIDEO));
1017         }
1018         ret = pvr2_channel_limit_inputs(&fhp->channel,input_mask);
1019         if (ret) {
1020                 pvr2_channel_done(&fhp->channel);
1021                 pvr2_trace(PVR2_TRACE_STRUCT,
1022                            "Destroying pvr_v4l2_fh id=%p (input mask error)",
1023                            fhp);
1024
1025                 kfree(fhp);
1026                 return ret;
1027         }
1028
1029         input_mask &= pvr2_hdw_get_input_available(hdw);
1030         input_cnt = 0;
1031         for (idx = 0; idx < (sizeof(input_mask) << 3); idx++) {
1032                 if (input_mask & (1 << idx)) input_cnt++;
1033         }
1034         fhp->input_cnt = input_cnt;
1035         fhp->input_map = kzalloc(input_cnt,GFP_KERNEL);
1036         if (!fhp->input_map) {
1037                 pvr2_channel_done(&fhp->channel);
1038                 pvr2_trace(PVR2_TRACE_STRUCT,
1039                            "Destroying pvr_v4l2_fh id=%p (input map failure)",
1040                            fhp);
1041                 kfree(fhp);
1042                 return -ENOMEM;
1043         }
1044         input_cnt = 0;
1045         for (idx = 0; idx < (sizeof(input_mask) << 3); idx++) {
1046                 if (!(input_mask & (1 << idx))) continue;
1047                 fhp->input_map[input_cnt++] = idx;
1048         }
1049
1050         fhp->file = file;
1051         file->private_data = fhp;
1052
1053         fhp->fw_mode_flag = pvr2_hdw_cpufw_get_enabled(hdw);
1054         v4l2_fh_add(&fhp->fh);
1055
1056         return 0;
1057 }
1058
1059
1060 static void pvr2_v4l2_notify(struct pvr2_v4l2_fh *fhp)
1061 {
1062         wake_up(&fhp->wait_data);
1063 }
1064
1065 static int pvr2_v4l2_iosetup(struct pvr2_v4l2_fh *fh)
1066 {
1067         int ret;
1068         struct pvr2_stream *sp;
1069         struct pvr2_hdw *hdw;
1070         if (fh->rhp) return 0;
1071
1072         if (!fh->pdi->stream) {
1073                 /* No stream defined for this node.  This means that we're
1074                    not currently allowed to stream from this node. */
1075                 return -EPERM;
1076         }
1077
1078         /* First read() attempt.  Try to claim the stream and start
1079            it... */
1080         if ((ret = pvr2_channel_claim_stream(&fh->channel,
1081                                              fh->pdi->stream)) != 0) {
1082                 /* Someone else must already have it */
1083                 return ret;
1084         }
1085
1086         fh->rhp = pvr2_channel_create_mpeg_stream(fh->pdi->stream);
1087         if (!fh->rhp) {
1088                 pvr2_channel_claim_stream(&fh->channel,NULL);
1089                 return -ENOMEM;
1090         }
1091
1092         hdw = fh->channel.mc_head->hdw;
1093         sp = fh->pdi->stream->stream;
1094         pvr2_stream_set_callback(sp,(pvr2_stream_callback)pvr2_v4l2_notify,fh);
1095         pvr2_hdw_set_stream_type(hdw,fh->pdi->config);
1096         if ((ret = pvr2_hdw_set_streaming(hdw,!0)) < 0) return ret;
1097         return pvr2_ioread_set_enabled(fh->rhp,!0);
1098 }
1099
1100
1101 static ssize_t pvr2_v4l2_read(struct file *file,
1102                               char __user *buff, size_t count, loff_t *ppos)
1103 {
1104         struct pvr2_v4l2_fh *fh = file->private_data;
1105         int ret;
1106
1107         if (fh->fw_mode_flag) {
1108                 struct pvr2_hdw *hdw = fh->channel.mc_head->hdw;
1109                 char *tbuf;
1110                 int c1,c2;
1111                 int tcnt = 0;
1112                 unsigned int offs = *ppos;
1113
1114                 tbuf = kmalloc(PAGE_SIZE,GFP_KERNEL);
1115                 if (!tbuf) return -ENOMEM;
1116
1117                 while (count) {
1118                         c1 = count;
1119                         if (c1 > PAGE_SIZE) c1 = PAGE_SIZE;
1120                         c2 = pvr2_hdw_cpufw_get(hdw,offs,tbuf,c1);
1121                         if (c2 < 0) {
1122                                 tcnt = c2;
1123                                 break;
1124                         }
1125                         if (!c2) break;
1126                         if (copy_to_user(buff,tbuf,c2)) {
1127                                 tcnt = -EFAULT;
1128                                 break;
1129                         }
1130                         offs += c2;
1131                         tcnt += c2;
1132                         buff += c2;
1133                         count -= c2;
1134                         *ppos += c2;
1135                 }
1136                 kfree(tbuf);
1137                 return tcnt;
1138         }
1139
1140         if (!fh->rhp) {
1141                 ret = pvr2_v4l2_iosetup(fh);
1142                 if (ret) {
1143                         return ret;
1144                 }
1145         }
1146
1147         for (;;) {
1148                 ret = pvr2_ioread_read(fh->rhp,buff,count);
1149                 if (ret >= 0) break;
1150                 if (ret != -EAGAIN) break;
1151                 if (file->f_flags & O_NONBLOCK) break;
1152                 /* Doing blocking I/O.  Wait here. */
1153                 ret = wait_event_interruptible(
1154                         fh->wait_data,
1155                         pvr2_ioread_avail(fh->rhp) >= 0);
1156                 if (ret < 0) break;
1157         }
1158
1159         return ret;
1160 }
1161
1162
1163 static unsigned int pvr2_v4l2_poll(struct file *file, poll_table *wait)
1164 {
1165         unsigned int mask = 0;
1166         struct pvr2_v4l2_fh *fh = file->private_data;
1167         int ret;
1168
1169         if (fh->fw_mode_flag) {
1170                 mask |= POLLIN | POLLRDNORM;
1171                 return mask;
1172         }
1173
1174         if (!fh->rhp) {
1175                 ret = pvr2_v4l2_iosetup(fh);
1176                 if (ret) return POLLERR;
1177         }
1178
1179         poll_wait(file,&fh->wait_data,wait);
1180
1181         if (pvr2_ioread_avail(fh->rhp) >= 0) {
1182                 mask |= POLLIN | POLLRDNORM;
1183         }
1184
1185         return mask;
1186 }
1187
1188
1189 static const struct v4l2_file_operations vdev_fops = {
1190         .owner      = THIS_MODULE,
1191         .open       = pvr2_v4l2_open,
1192         .release    = pvr2_v4l2_release,
1193         .read       = pvr2_v4l2_read,
1194         .unlocked_ioctl = pvr2_v4l2_ioctl,
1195         .poll       = pvr2_v4l2_poll,
1196 };
1197
1198
1199 static struct video_device vdev_template = {
1200         .fops       = &vdev_fops,
1201 };
1202
1203
1204 static void pvr2_v4l2_dev_init(struct pvr2_v4l2_dev *dip,
1205                                struct pvr2_v4l2 *vp,
1206                                int v4l_type)
1207 {
1208         int mindevnum;
1209         int unit_number;
1210         struct pvr2_hdw *hdw;
1211         int *nr_ptr = NULL;
1212         dip->v4lp = vp;
1213
1214         hdw = vp->channel.mc_head->hdw;
1215         dip->v4l_type = v4l_type;
1216         switch (v4l_type) {
1217         case VFL_TYPE_GRABBER:
1218                 dip->stream = &vp->channel.mc_head->video_stream;
1219                 dip->config = pvr2_config_mpeg;
1220                 dip->minor_type = pvr2_v4l_type_video;
1221                 nr_ptr = video_nr;
1222                 if (!dip->stream) {
1223                         pr_err(KBUILD_MODNAME
1224                                 ": Failed to set up pvrusb2 v4l video dev"
1225                                 " due to missing stream instance\n");
1226                         return;
1227                 }
1228                 break;
1229         case VFL_TYPE_VBI:
1230                 dip->config = pvr2_config_vbi;
1231                 dip->minor_type = pvr2_v4l_type_vbi;
1232                 nr_ptr = vbi_nr;
1233                 break;
1234         case VFL_TYPE_RADIO:
1235                 dip->stream = &vp->channel.mc_head->video_stream;
1236                 dip->config = pvr2_config_mpeg;
1237                 dip->minor_type = pvr2_v4l_type_radio;
1238                 nr_ptr = radio_nr;
1239                 break;
1240         default:
1241                 /* Bail out (this should be impossible) */
1242                 pr_err(KBUILD_MODNAME ": Failed to set up pvrusb2 v4l dev"
1243                     " due to unrecognized config\n");
1244                 return;
1245         }
1246
1247         dip->devbase = vdev_template;
1248         dip->devbase.release = pvr2_video_device_release;
1249         dip->devbase.ioctl_ops = &pvr2_ioctl_ops;
1250         {
1251                 int val;
1252                 pvr2_ctrl_get_value(
1253                         pvr2_hdw_get_ctrl_by_id(hdw,
1254                                                 PVR2_CID_STDAVAIL), &val);
1255                 dip->devbase.tvnorms = (v4l2_std_id)val;
1256         }
1257
1258         mindevnum = -1;
1259         unit_number = pvr2_hdw_get_unit_number(hdw);
1260         if (nr_ptr && (unit_number >= 0) && (unit_number < PVR_NUM)) {
1261                 mindevnum = nr_ptr[unit_number];
1262         }
1263         pvr2_hdw_set_v4l2_dev(hdw, &dip->devbase);
1264         if ((video_register_device(&dip->devbase,
1265                                    dip->v4l_type, mindevnum) < 0) &&
1266             (video_register_device(&dip->devbase,
1267                                    dip->v4l_type, -1) < 0)) {
1268                 pr_err(KBUILD_MODNAME
1269                         ": Failed to register pvrusb2 v4l device\n");
1270         }
1271
1272         printk(KERN_INFO "pvrusb2: registered device %s [%s]\n",
1273                video_device_node_name(&dip->devbase),
1274                pvr2_config_get_name(dip->config));
1275
1276         pvr2_hdw_v4l_store_minor_number(hdw,
1277                                         dip->minor_type,dip->devbase.minor);
1278 }
1279
1280
1281 struct pvr2_v4l2 *pvr2_v4l2_create(struct pvr2_context *mnp)
1282 {
1283         struct pvr2_v4l2 *vp;
1284
1285         vp = kzalloc(sizeof(*vp),GFP_KERNEL);
1286         if (!vp) return vp;
1287         pvr2_channel_init(&vp->channel,mnp);
1288         pvr2_trace(PVR2_TRACE_STRUCT,"Creating pvr2_v4l2 id=%p",vp);
1289
1290         vp->channel.check_func = pvr2_v4l2_internal_check;
1291
1292         /* register streams */
1293         vp->dev_video = kzalloc(sizeof(*vp->dev_video),GFP_KERNEL);
1294         if (!vp->dev_video) goto fail;
1295         pvr2_v4l2_dev_init(vp->dev_video,vp,VFL_TYPE_GRABBER);
1296         if (pvr2_hdw_get_input_available(vp->channel.mc_head->hdw) &
1297             (1 << PVR2_CVAL_INPUT_RADIO)) {
1298                 vp->dev_radio = kzalloc(sizeof(*vp->dev_radio),GFP_KERNEL);
1299                 if (!vp->dev_radio) goto fail;
1300                 pvr2_v4l2_dev_init(vp->dev_radio,vp,VFL_TYPE_RADIO);
1301         }
1302
1303         return vp;
1304  fail:
1305         pvr2_trace(PVR2_TRACE_STRUCT,"Failure creating pvr2_v4l2 id=%p",vp);
1306         pvr2_v4l2_destroy_no_lock(vp);
1307         return NULL;
1308 }