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