1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29#include <linux/init.h>
30#include <linux/list.h>
31#include <linux/module.h>
32#include <linux/kernel.h>
33#include <linux/bitmap.h>
34#include <linux/usb.h>
35#include <linux/i2c.h>
36#include <linux/mm.h>
37#include <linux/mutex.h>
38#include <linux/slab.h>
39
40#include "em28xx.h"
41#include "em28xx-v4l.h"
42#include <media/v4l2-common.h>
43#include <media/v4l2-ioctl.h>
44#include <media/v4l2-event.h>
45#include <media/v4l2-clk.h>
46#include <media/msp3400.h>
47#include <media/tuner.h>
48
49#define DRIVER_AUTHOR "Ludovico Cavedon <cavedon@sssup.it>, " \
50 "Markus Rechberger <mrechberger@gmail.com>, " \
51 "Mauro Carvalho Chehab <mchehab@infradead.org>, " \
52 "Sascha Sommer <saschasommer@freenet.de>"
53
54static unsigned int isoc_debug;
55module_param(isoc_debug, int, 0644);
56MODULE_PARM_DESC(isoc_debug, "enable debug messages [isoc transfers]");
57
58static unsigned int disable_vbi;
59module_param(disable_vbi, int, 0644);
60MODULE_PARM_DESC(disable_vbi, "disable vbi support");
61
62static int alt;
63module_param(alt, int, 0644);
64MODULE_PARM_DESC(alt, "alternate setting to use for video endpoint");
65
66#define em28xx_videodbg(fmt, arg...) do {\
67 if (video_debug) \
68 printk(KERN_INFO "%s %s :"fmt, \
69 dev->name, __func__ , ##arg); } while (0)
70
71#define em28xx_isocdbg(fmt, arg...) \
72do {\
73 if (isoc_debug) { \
74 printk(KERN_INFO "%s %s :"fmt, \
75 dev->name, __func__ , ##arg); \
76 } \
77 } while (0)
78
79MODULE_AUTHOR(DRIVER_AUTHOR);
80MODULE_DESCRIPTION(DRIVER_DESC " - v4l2 interface");
81MODULE_LICENSE("GPL");
82MODULE_VERSION(EM28XX_VERSION);
83
84#define EM25XX_FRMDATAHDR_BYTE1 0x02
85#define EM25XX_FRMDATAHDR_BYTE2_STILL_IMAGE 0x20
86#define EM25XX_FRMDATAHDR_BYTE2_FRAME_END 0x02
87#define EM25XX_FRMDATAHDR_BYTE2_FRAME_ID 0x01
88#define EM25XX_FRMDATAHDR_BYTE2_MASK (EM25XX_FRMDATAHDR_BYTE2_STILL_IMAGE | \
89 EM25XX_FRMDATAHDR_BYTE2_FRAME_END | \
90 EM25XX_FRMDATAHDR_BYTE2_FRAME_ID)
91
92static unsigned int video_nr[] = {[0 ... (EM28XX_MAXBOARDS - 1)] = -1U };
93static unsigned int vbi_nr[] = {[0 ... (EM28XX_MAXBOARDS - 1)] = -1U };
94static unsigned int radio_nr[] = {[0 ... (EM28XX_MAXBOARDS - 1)] = -1U };
95
96module_param_array(video_nr, int, NULL, 0444);
97module_param_array(vbi_nr, int, NULL, 0444);
98module_param_array(radio_nr, int, NULL, 0444);
99MODULE_PARM_DESC(video_nr, "video device numbers");
100MODULE_PARM_DESC(vbi_nr, "vbi device numbers");
101MODULE_PARM_DESC(radio_nr, "radio device numbers");
102
103static unsigned int video_debug;
104module_param(video_debug, int, 0644);
105MODULE_PARM_DESC(video_debug, "enable debug messages [video]");
106
107
108static struct em28xx_fmt format[] = {
109 {
110 .name = "16 bpp YUY2, 4:2:2, packed",
111 .fourcc = V4L2_PIX_FMT_YUYV,
112 .depth = 16,
113 .reg = EM28XX_OUTFMT_YUV422_Y0UY1V,
114 }, {
115 .name = "16 bpp RGB 565, LE",
116 .fourcc = V4L2_PIX_FMT_RGB565,
117 .depth = 16,
118 .reg = EM28XX_OUTFMT_RGB_16_656,
119 }, {
120 .name = "8 bpp Bayer BGBG..GRGR",
121 .fourcc = V4L2_PIX_FMT_SBGGR8,
122 .depth = 8,
123 .reg = EM28XX_OUTFMT_RGB_8_BGBG,
124 }, {
125 .name = "8 bpp Bayer GRGR..BGBG",
126 .fourcc = V4L2_PIX_FMT_SGRBG8,
127 .depth = 8,
128 .reg = EM28XX_OUTFMT_RGB_8_GRGR,
129 }, {
130 .name = "8 bpp Bayer GBGB..RGRG",
131 .fourcc = V4L2_PIX_FMT_SGBRG8,
132 .depth = 8,
133 .reg = EM28XX_OUTFMT_RGB_8_GBGB,
134 }, {
135 .name = "12 bpp YUV411",
136 .fourcc = V4L2_PIX_FMT_YUV411P,
137 .depth = 12,
138 .reg = EM28XX_OUTFMT_YUV411,
139 },
140};
141
142
143static inline unsigned int norm_maxw(struct em28xx *dev)
144{
145 struct em28xx_v4l2 *v4l2 = dev->v4l2;
146
147 if (dev->board.is_webcam)
148 return v4l2->sensor_xres;
149
150 if (dev->board.max_range_640_480)
151 return 640;
152
153 return 720;
154}
155
156static inline unsigned int norm_maxh(struct em28xx *dev)
157{
158 struct em28xx_v4l2 *v4l2 = dev->v4l2;
159
160 if (dev->board.is_webcam)
161 return v4l2->sensor_yres;
162
163 if (dev->board.max_range_640_480)
164 return 480;
165
166 return (v4l2->norm & V4L2_STD_625_50) ? 576 : 480;
167}
168
169static int em28xx_vbi_supported(struct em28xx *dev)
170{
171
172 if (disable_vbi == 1)
173 return 0;
174
175 if (dev->board.is_webcam)
176 return 0;
177
178
179
180 if (dev->chip_id == CHIP_ID_EM2860 ||
181 dev->chip_id == CHIP_ID_EM2883)
182 return 1;
183
184
185 return 0;
186}
187
188
189
190
191
192static void em28xx_wake_i2c(struct em28xx *dev)
193{
194 struct v4l2_device *v4l2_dev = &dev->v4l2->v4l2_dev;
195
196 v4l2_device_call_all(v4l2_dev, 0, core, reset, 0);
197 v4l2_device_call_all(v4l2_dev, 0, video, s_routing,
198 INPUT(dev->ctl_input)->vmux, 0, 0);
199 v4l2_device_call_all(v4l2_dev, 0, video, s_stream, 0);
200}
201
202static int em28xx_colorlevels_set_default(struct em28xx *dev)
203{
204 em28xx_write_reg(dev, EM28XX_R20_YGAIN, CONTRAST_DEFAULT);
205 em28xx_write_reg(dev, EM28XX_R21_YOFFSET, BRIGHTNESS_DEFAULT);
206 em28xx_write_reg(dev, EM28XX_R22_UVGAIN, SATURATION_DEFAULT);
207 em28xx_write_reg(dev, EM28XX_R23_UOFFSET, BLUE_BALANCE_DEFAULT);
208 em28xx_write_reg(dev, EM28XX_R24_VOFFSET, RED_BALANCE_DEFAULT);
209 em28xx_write_reg(dev, EM28XX_R25_SHARPNESS, SHARPNESS_DEFAULT);
210
211 em28xx_write_reg(dev, EM28XX_R14_GAMMA, 0x20);
212 em28xx_write_reg(dev, EM28XX_R15_RGAIN, 0x20);
213 em28xx_write_reg(dev, EM28XX_R16_GGAIN, 0x20);
214 em28xx_write_reg(dev, EM28XX_R17_BGAIN, 0x20);
215 em28xx_write_reg(dev, EM28XX_R18_ROFFSET, 0x00);
216 em28xx_write_reg(dev, EM28XX_R19_GOFFSET, 0x00);
217 return em28xx_write_reg(dev, EM28XX_R1A_BOFFSET, 0x00);
218}
219
220static int em28xx_set_outfmt(struct em28xx *dev)
221{
222 int ret;
223 u8 fmt, vinctrl;
224 struct em28xx_v4l2 *v4l2 = dev->v4l2;
225
226 fmt = v4l2->format->reg;
227 if (!dev->is_em25xx)
228 fmt |= 0x20;
229
230
231
232
233
234
235
236
237
238 ret = em28xx_write_reg(dev, EM28XX_R27_OUTFMT, fmt);
239 if (ret < 0)
240 return ret;
241
242 ret = em28xx_write_reg(dev, EM28XX_R10_VINMODE, v4l2->vinmode);
243 if (ret < 0)
244 return ret;
245
246 vinctrl = v4l2->vinctl;
247 if (em28xx_vbi_supported(dev) == 1) {
248 vinctrl |= EM28XX_VINCTRL_VBI_RAW;
249 em28xx_write_reg(dev, EM28XX_R34_VBI_START_H, 0x00);
250 em28xx_write_reg(dev, EM28XX_R36_VBI_WIDTH, v4l2->vbi_width/4);
251 em28xx_write_reg(dev, EM28XX_R37_VBI_HEIGHT, v4l2->vbi_height);
252 if (v4l2->norm & V4L2_STD_525_60) {
253
254 em28xx_write_reg(dev, EM28XX_R35_VBI_START_V, 0x09);
255 } else if (v4l2->norm & V4L2_STD_625_50) {
256
257 em28xx_write_reg(dev, EM28XX_R35_VBI_START_V, 0x07);
258 }
259 }
260
261 return em28xx_write_reg(dev, EM28XX_R11_VINCTRL, vinctrl);
262}
263
264static int em28xx_accumulator_set(struct em28xx *dev, u8 xmin, u8 xmax,
265 u8 ymin, u8 ymax)
266{
267 em28xx_videodbg("em28xx Scale: (%d,%d)-(%d,%d)\n",
268 xmin, ymin, xmax, ymax);
269
270 em28xx_write_regs(dev, EM28XX_R28_XMIN, &xmin, 1);
271 em28xx_write_regs(dev, EM28XX_R29_XMAX, &xmax, 1);
272 em28xx_write_regs(dev, EM28XX_R2A_YMIN, &ymin, 1);
273 return em28xx_write_regs(dev, EM28XX_R2B_YMAX, &ymax, 1);
274}
275
276static void em28xx_capture_area_set(struct em28xx *dev, u8 hstart, u8 vstart,
277 u16 width, u16 height)
278{
279 u8 cwidth = width >> 2;
280 u8 cheight = height >> 2;
281 u8 overflow = (height >> 9 & 0x02) | (width >> 10 & 0x01);
282
283
284 em28xx_videodbg("capture area set to (%d,%d): %dx%d\n",
285 hstart, vstart,
286 ((overflow & 2) << 9 | cwidth << 2),
287 ((overflow & 1) << 10 | cheight << 2));
288
289 em28xx_write_regs(dev, EM28XX_R1C_HSTART, &hstart, 1);
290 em28xx_write_regs(dev, EM28XX_R1D_VSTART, &vstart, 1);
291 em28xx_write_regs(dev, EM28XX_R1E_CWIDTH, &cwidth, 1);
292 em28xx_write_regs(dev, EM28XX_R1F_CHEIGHT, &cheight, 1);
293 em28xx_write_regs(dev, EM28XX_R1B_OFLOW, &overflow, 1);
294
295
296
297 if (dev->is_em25xx) {
298 em28xx_write_reg(dev, 0x34, width >> 4);
299 em28xx_write_reg(dev, 0x35, height >> 4);
300 }
301}
302
303static int em28xx_scaler_set(struct em28xx *dev, u16 h, u16 v)
304{
305 u8 mode = 0x00;
306
307
308 if (dev->board.is_em2800) {
309 mode = (v ? 0x20 : 0x00) | (h ? 0x10 : 0x00);
310 } else {
311 u8 buf[2];
312
313 buf[0] = h;
314 buf[1] = h >> 8;
315 em28xx_write_regs(dev, EM28XX_R30_HSCALELOW, (char *)buf, 2);
316
317 buf[0] = v;
318 buf[1] = v >> 8;
319 em28xx_write_regs(dev, EM28XX_R32_VSCALELOW, (char *)buf, 2);
320
321
322 mode = (h || v) ? 0x30 : 0x00;
323 }
324 return em28xx_write_reg(dev, EM28XX_R26_COMPR, mode);
325}
326
327
328static int em28xx_resolution_set(struct em28xx *dev)
329{
330 struct em28xx_v4l2 *v4l2 = dev->v4l2;
331 int width = norm_maxw(dev);
332 int height = norm_maxh(dev);
333
334
335 v4l2->vbi_width = 720;
336 if (v4l2->norm & V4L2_STD_525_60)
337 v4l2->vbi_height = 12;
338 else
339 v4l2->vbi_height = 18;
340
341 em28xx_set_outfmt(dev);
342
343 em28xx_accumulator_set(dev, 1, (width - 4) >> 2, 1, (height - 4) >> 2);
344
345
346
347
348
349
350
351
352 if (em28xx_vbi_supported(dev) == 1)
353 em28xx_capture_area_set(dev, 0, 2, width, height);
354 else
355 em28xx_capture_area_set(dev, 0, 0, width, height);
356
357 return em28xx_scaler_set(dev, v4l2->hscale, v4l2->vscale);
358}
359
360
361static int em28xx_set_alternate(struct em28xx *dev)
362{
363 struct em28xx_v4l2 *v4l2 = dev->v4l2;
364 int errCode;
365 int i;
366 unsigned int min_pkt_size = v4l2->width * 2 + 4;
367
368
369
370 dev->alt = 0;
371 if ((alt > 0) && (alt < dev->num_alt)) {
372 em28xx_videodbg("alternate forced to %d\n", dev->alt);
373 dev->alt = alt;
374 goto set_alt;
375 }
376 if (dev->analog_xfer_bulk)
377 goto set_alt;
378
379
380
381
382
383 if (v4l2->width * 2 * v4l2->height > 720 * 240 * 2)
384 min_pkt_size *= 2;
385
386 for (i = 0; i < dev->num_alt; i++) {
387
388 if (dev->alt_max_pkt_size_isoc[i] >= min_pkt_size) {
389 dev->alt = i;
390 break;
391
392
393
394 } else if (dev->alt_max_pkt_size_isoc[i] >
395 dev->alt_max_pkt_size_isoc[dev->alt])
396 dev->alt = i;
397 }
398
399set_alt:
400
401
402
403 if (dev->analog_xfer_bulk) {
404 dev->max_pkt_size = 512;
405 dev->packet_multiplier = EM28XX_BULK_PACKET_MULTIPLIER;
406 } else {
407 em28xx_videodbg("minimum isoc packet size: %u (alt=%d)\n",
408 min_pkt_size, dev->alt);
409 dev->max_pkt_size =
410 dev->alt_max_pkt_size_isoc[dev->alt];
411 dev->packet_multiplier = EM28XX_NUM_ISOC_PACKETS;
412 }
413 em28xx_videodbg("setting alternate %d with wMaxPacketSize=%u\n",
414 dev->alt, dev->max_pkt_size);
415 errCode = usb_set_interface(dev->udev, dev->ifnum, dev->alt);
416 if (errCode < 0) {
417 em28xx_errdev("cannot change alternate number to %d (error=%i)\n",
418 dev->alt, errCode);
419 return errCode;
420 }
421 return 0;
422}
423
424
425
426
427
428
429
430
431static inline void finish_buffer(struct em28xx *dev,
432 struct em28xx_buffer *buf)
433{
434 em28xx_isocdbg("[%p/%d] wakeup\n", buf, buf->top_field);
435
436 buf->vb.v4l2_buf.sequence = dev->v4l2->field_count++;
437 if (dev->v4l2->progressive)
438 buf->vb.v4l2_buf.field = V4L2_FIELD_NONE;
439 else
440 buf->vb.v4l2_buf.field = V4L2_FIELD_INTERLACED;
441 v4l2_get_timestamp(&buf->vb.v4l2_buf.timestamp);
442
443 vb2_buffer_done(&buf->vb, VB2_BUF_STATE_DONE);
444}
445
446
447
448
449static void em28xx_copy_video(struct em28xx *dev,
450 struct em28xx_buffer *buf,
451 unsigned char *usb_buf,
452 unsigned long len)
453{
454 struct em28xx_v4l2 *v4l2 = dev->v4l2;
455 void *fieldstart, *startwrite, *startread;
456 int linesdone, currlinedone, offset, lencopy, remain;
457 int bytesperline = v4l2->width << 1;
458
459 if (buf->pos + len > buf->length)
460 len = buf->length - buf->pos;
461
462 startread = usb_buf;
463 remain = len;
464
465 if (v4l2->progressive || buf->top_field)
466 fieldstart = buf->vb_buf;
467 else
468 fieldstart = buf->vb_buf + bytesperline;
469
470 linesdone = buf->pos / bytesperline;
471 currlinedone = buf->pos % bytesperline;
472
473 if (v4l2->progressive)
474 offset = linesdone * bytesperline + currlinedone;
475 else
476 offset = linesdone * bytesperline * 2 + currlinedone;
477
478 startwrite = fieldstart + offset;
479 lencopy = bytesperline - currlinedone;
480 lencopy = lencopy > remain ? remain : lencopy;
481
482 if ((char *)startwrite + lencopy > (char *)buf->vb_buf + buf->length) {
483 em28xx_isocdbg("Overflow of %zu bytes past buffer end (1)\n",
484 ((char *)startwrite + lencopy) -
485 ((char *)buf->vb_buf + buf->length));
486 remain = (char *)buf->vb_buf + buf->length -
487 (char *)startwrite;
488 lencopy = remain;
489 }
490 if (lencopy <= 0)
491 return;
492 memcpy(startwrite, startread, lencopy);
493
494 remain -= lencopy;
495
496 while (remain > 0) {
497 if (v4l2->progressive)
498 startwrite += lencopy;
499 else
500 startwrite += lencopy + bytesperline;
501 startread += lencopy;
502 if (bytesperline > remain)
503 lencopy = remain;
504 else
505 lencopy = bytesperline;
506
507 if ((char *)startwrite + lencopy > (char *)buf->vb_buf +
508 buf->length) {
509 em28xx_isocdbg("Overflow of %zu bytes past buffer end"
510 "(2)\n",
511 ((char *)startwrite + lencopy) -
512 ((char *)buf->vb_buf + buf->length));
513 lencopy = remain = (char *)buf->vb_buf + buf->length -
514 (char *)startwrite;
515 }
516 if (lencopy <= 0)
517 break;
518
519 memcpy(startwrite, startread, lencopy);
520
521 remain -= lencopy;
522 }
523
524 buf->pos += len;
525}
526
527
528
529
530static void em28xx_copy_vbi(struct em28xx *dev,
531 struct em28xx_buffer *buf,
532 unsigned char *usb_buf,
533 unsigned long len)
534{
535 unsigned int offset;
536
537 if (buf->pos + len > buf->length)
538 len = buf->length - buf->pos;
539
540 offset = buf->pos;
541
542 if (buf->top_field == 0)
543 offset += dev->v4l2->vbi_width * dev->v4l2->vbi_height;
544
545 memcpy(buf->vb_buf + offset, usb_buf, len);
546 buf->pos += len;
547}
548
549static inline void print_err_status(struct em28xx *dev,
550 int packet, int status)
551{
552 char *errmsg = "Unknown";
553
554 switch (status) {
555 case -ENOENT:
556 errmsg = "unlinked synchronuously";
557 break;
558 case -ECONNRESET:
559 errmsg = "unlinked asynchronuously";
560 break;
561 case -ENOSR:
562 errmsg = "Buffer error (overrun)";
563 break;
564 case -EPIPE:
565 errmsg = "Stalled (device not responding)";
566 break;
567 case -EOVERFLOW:
568 errmsg = "Babble (bad cable?)";
569 break;
570 case -EPROTO:
571 errmsg = "Bit-stuff error (bad cable?)";
572 break;
573 case -EILSEQ:
574 errmsg = "CRC/Timeout (could be anything)";
575 break;
576 case -ETIME:
577 errmsg = "Device does not respond";
578 break;
579 }
580 if (packet < 0) {
581 em28xx_isocdbg("URB status %d [%s].\n", status, errmsg);
582 } else {
583 em28xx_isocdbg("URB packet %d, status %d [%s].\n",
584 packet, status, errmsg);
585 }
586}
587
588
589
590
591static inline struct em28xx_buffer *get_next_buf(struct em28xx *dev,
592 struct em28xx_dmaqueue *dma_q)
593{
594 struct em28xx_buffer *buf;
595
596 if (list_empty(&dma_q->active)) {
597 em28xx_isocdbg("No active queue to serve\n");
598 return NULL;
599 }
600
601
602 buf = list_entry(dma_q->active.next, struct em28xx_buffer, list);
603
604 list_del(&buf->list);
605 buf->pos = 0;
606 buf->vb_buf = buf->mem;
607
608 return buf;
609}
610
611
612
613
614static struct em28xx_buffer *
615finish_field_prepare_next(struct em28xx *dev,
616 struct em28xx_buffer *buf,
617 struct em28xx_dmaqueue *dma_q)
618{
619 struct em28xx_v4l2 *v4l2 = dev->v4l2;
620
621 if (v4l2->progressive || v4l2->top_field) {
622 if (buf != NULL)
623 finish_buffer(dev, buf);
624 buf = get_next_buf(dev, dma_q);
625 }
626 if (buf != NULL) {
627 buf->top_field = v4l2->top_field;
628 buf->pos = 0;
629 }
630
631 return buf;
632}
633
634
635
636
637static inline void process_frame_data_em28xx(struct em28xx *dev,
638 unsigned char *data_pkt,
639 unsigned int data_len)
640{
641 struct em28xx_v4l2 *v4l2 = dev->v4l2;
642 struct em28xx_buffer *buf = dev->usb_ctl.vid_buf;
643 struct em28xx_buffer *vbi_buf = dev->usb_ctl.vbi_buf;
644 struct em28xx_dmaqueue *dma_q = &dev->vidq;
645 struct em28xx_dmaqueue *vbi_dma_q = &dev->vbiq;
646
647
648
649
650
651 if (data_len >= 4) {
652
653
654 if (data_pkt[0] == 0x88 && data_pkt[1] == 0x88 &&
655 data_pkt[2] == 0x88 && data_pkt[3] == 0x88) {
656
657 data_pkt += 4;
658 data_len -= 4;
659 } else if (data_pkt[0] == 0x33 && data_pkt[1] == 0x95) {
660
661 v4l2->capture_type = 0;
662 v4l2->vbi_read = 0;
663 em28xx_isocdbg("VBI START HEADER !!!\n");
664 v4l2->top_field = !(data_pkt[2] & 1);
665 data_pkt += 4;
666 data_len -= 4;
667 } else if (data_pkt[0] == 0x22 && data_pkt[1] == 0x5a) {
668
669 v4l2->capture_type = 2;
670 em28xx_isocdbg("VIDEO START HEADER !!!\n");
671 v4l2->top_field = !(data_pkt[2] & 1);
672 data_pkt += 4;
673 data_len -= 4;
674 }
675 }
676
677
678
679 if (v4l2->capture_type == 0) {
680 vbi_buf = finish_field_prepare_next(dev, vbi_buf, vbi_dma_q);
681 dev->usb_ctl.vbi_buf = vbi_buf;
682 v4l2->capture_type = 1;
683 }
684
685 if (v4l2->capture_type == 1) {
686 int vbi_size = v4l2->vbi_width * v4l2->vbi_height;
687 int vbi_data_len = ((v4l2->vbi_read + data_len) > vbi_size) ?
688 (vbi_size - v4l2->vbi_read) : data_len;
689
690
691 if (vbi_buf != NULL)
692 em28xx_copy_vbi(dev, vbi_buf, data_pkt, vbi_data_len);
693 v4l2->vbi_read += vbi_data_len;
694
695 if (vbi_data_len < data_len) {
696
697 v4l2->capture_type = 2;
698 data_pkt += vbi_data_len;
699 data_len -= vbi_data_len;
700 }
701 }
702
703 if (v4l2->capture_type == 2) {
704 buf = finish_field_prepare_next(dev, buf, dma_q);
705 dev->usb_ctl.vid_buf = buf;
706 v4l2->capture_type = 3;
707 }
708
709 if (v4l2->capture_type == 3 && buf != NULL && data_len > 0)
710 em28xx_copy_video(dev, buf, data_pkt, data_len);
711}
712
713
714
715
716static inline void process_frame_data_em25xx(struct em28xx *dev,
717 unsigned char *data_pkt,
718 unsigned int data_len)
719{
720 struct em28xx_buffer *buf = dev->usb_ctl.vid_buf;
721 struct em28xx_dmaqueue *dmaq = &dev->vidq;
722 struct em28xx_v4l2 *v4l2 = dev->v4l2;
723 bool frame_end = false;
724
725
726
727
728 if (data_len >= 2) {
729 if ((data_pkt[0] == EM25XX_FRMDATAHDR_BYTE1) &&
730 ((data_pkt[1] & ~EM25XX_FRMDATAHDR_BYTE2_MASK) == 0x00)) {
731 v4l2->top_field = !(data_pkt[1] &
732 EM25XX_FRMDATAHDR_BYTE2_FRAME_ID);
733 frame_end = data_pkt[1] &
734 EM25XX_FRMDATAHDR_BYTE2_FRAME_END;
735 data_pkt += 2;
736 data_len -= 2;
737 }
738
739
740 if (dev->analog_xfer_bulk && frame_end) {
741 buf = finish_field_prepare_next(dev, buf, dmaq);
742 dev->usb_ctl.vid_buf = buf;
743 }
744
745
746
747
748 }
749
750
751 if (buf != NULL && data_len > 0)
752 em28xx_copy_video(dev, buf, data_pkt, data_len);
753
754
755 if (!dev->analog_xfer_bulk && frame_end) {
756 buf = finish_field_prepare_next(dev, buf, dmaq);
757 dev->usb_ctl.vid_buf = buf;
758 }
759
760
761
762
763
764
765
766
767
768}
769
770
771static inline int em28xx_urb_data_copy(struct em28xx *dev, struct urb *urb)
772{
773 int xfer_bulk, num_packets, i;
774 unsigned char *usb_data_pkt;
775 unsigned int usb_data_len;
776
777 if (!dev)
778 return 0;
779
780 if (dev->disconnected)
781 return 0;
782
783 if (urb->status < 0)
784 print_err_status(dev, -1, urb->status);
785
786 xfer_bulk = usb_pipebulk(urb->pipe);
787
788 if (xfer_bulk)
789 num_packets = 1;
790 else
791 num_packets = urb->number_of_packets;
792
793 for (i = 0; i < num_packets; i++) {
794 if (xfer_bulk) {
795 usb_data_len = urb->actual_length;
796
797 usb_data_pkt = urb->transfer_buffer;
798 } else {
799 if (urb->iso_frame_desc[i].status < 0) {
800 print_err_status(dev, i,
801 urb->iso_frame_desc[i].status);
802 if (urb->iso_frame_desc[i].status != -EPROTO)
803 continue;
804 }
805
806 usb_data_len = urb->iso_frame_desc[i].actual_length;
807 if (usb_data_len > dev->max_pkt_size) {
808 em28xx_isocdbg("packet bigger than packet size");
809 continue;
810 }
811
812 usb_data_pkt = urb->transfer_buffer +
813 urb->iso_frame_desc[i].offset;
814 }
815
816 if (usb_data_len == 0) {
817
818
819 continue;
820 }
821
822 if (dev->is_em25xx)
823 process_frame_data_em25xx(dev,
824 usb_data_pkt, usb_data_len);
825 else
826 process_frame_data_em28xx(dev,
827 usb_data_pkt, usb_data_len);
828
829 }
830 return 1;
831}
832
833static int get_ressource(enum v4l2_buf_type f_type)
834{
835 switch (f_type) {
836 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
837 return EM28XX_RESOURCE_VIDEO;
838 case V4L2_BUF_TYPE_VBI_CAPTURE:
839 return EM28XX_RESOURCE_VBI;
840 default:
841 BUG();
842 return 0;
843 }
844}
845
846
847static int res_get(struct em28xx *dev, enum v4l2_buf_type f_type)
848{
849 int res_type = get_ressource(f_type);
850
851
852 if (dev->resources & res_type) {
853
854 return -EBUSY;
855 }
856
857
858 dev->resources |= res_type;
859 em28xx_videodbg("res: get %d\n", res_type);
860 return 0;
861}
862
863static void res_free(struct em28xx *dev, enum v4l2_buf_type f_type)
864{
865 int res_type = get_ressource(f_type);
866
867 dev->resources &= ~res_type;
868 em28xx_videodbg("res: put %d\n", res_type);
869}
870
871
872
873
874
875static int queue_setup(struct vb2_queue *vq, const struct v4l2_format *fmt,
876 unsigned int *nbuffers, unsigned int *nplanes,
877 unsigned int sizes[], void *alloc_ctxs[])
878{
879 struct em28xx *dev = vb2_get_drv_priv(vq);
880 struct em28xx_v4l2 *v4l2 = dev->v4l2;
881 unsigned long size;
882
883 if (fmt)
884 size = fmt->fmt.pix.sizeimage;
885 else
886 size =
887 (v4l2->width * v4l2->height * v4l2->format->depth + 7) >> 3;
888
889 if (size == 0)
890 return -EINVAL;
891
892 if (0 == *nbuffers)
893 *nbuffers = 32;
894
895 *nplanes = 1;
896 sizes[0] = size;
897
898 return 0;
899}
900
901static int
902buffer_prepare(struct vb2_buffer *vb)
903{
904 struct em28xx *dev = vb2_get_drv_priv(vb->vb2_queue);
905 struct em28xx_v4l2 *v4l2 = dev->v4l2;
906 struct em28xx_buffer *buf = container_of(vb, struct em28xx_buffer, vb);
907 unsigned long size;
908
909 em28xx_videodbg("%s, field=%d\n", __func__, vb->v4l2_buf.field);
910
911 size = (v4l2->width * v4l2->height * v4l2->format->depth + 7) >> 3;
912
913 if (vb2_plane_size(vb, 0) < size) {
914 em28xx_videodbg("%s data will not fit into plane (%lu < %lu)\n",
915 __func__, vb2_plane_size(vb, 0), size);
916 return -EINVAL;
917 }
918 vb2_set_plane_payload(&buf->vb, 0, size);
919
920 return 0;
921}
922
923int em28xx_start_analog_streaming(struct vb2_queue *vq, unsigned int count)
924{
925 struct em28xx *dev = vb2_get_drv_priv(vq);
926 struct em28xx_v4l2 *v4l2 = dev->v4l2;
927 struct v4l2_frequency f;
928 int rc = 0;
929
930 em28xx_videodbg("%s\n", __func__);
931
932
933
934 rc = res_get(dev, vq->type);
935 if (rc)
936 return rc;
937
938 if (v4l2->streaming_users == 0) {
939
940
941
942 em28xx_set_alternate(dev);
943
944
945
946
947 em28xx_wake_i2c(dev);
948
949 v4l2->capture_type = -1;
950 rc = em28xx_init_usb_xfer(dev, EM28XX_ANALOG_MODE,
951 dev->analog_xfer_bulk,
952 EM28XX_NUM_BUFS,
953 dev->max_pkt_size,
954 dev->packet_multiplier,
955 em28xx_urb_data_copy);
956 if (rc < 0)
957 return rc;
958
959
960
961
962
963
964
965
966 memset(&f, 0, sizeof(f));
967 f.frequency = v4l2->frequency;
968 if (vq->owner && vq->owner->vdev->vfl_type == VFL_TYPE_RADIO)
969 f.type = V4L2_TUNER_RADIO;
970 else
971 f.type = V4L2_TUNER_ANALOG_TV;
972 v4l2_device_call_all(&v4l2->v4l2_dev,
973 0, tuner, s_frequency, &f);
974 }
975
976 v4l2->streaming_users++;
977
978 return rc;
979}
980
981static void em28xx_stop_streaming(struct vb2_queue *vq)
982{
983 struct em28xx *dev = vb2_get_drv_priv(vq);
984 struct em28xx_v4l2 *v4l2 = dev->v4l2;
985 struct em28xx_dmaqueue *vidq = &dev->vidq;
986 unsigned long flags = 0;
987
988 em28xx_videodbg("%s\n", __func__);
989
990 res_free(dev, vq->type);
991
992 if (v4l2->streaming_users-- == 1) {
993
994 em28xx_uninit_usb_xfer(dev, EM28XX_ANALOG_MODE);
995 }
996
997 spin_lock_irqsave(&dev->slock, flags);
998 if (dev->usb_ctl.vid_buf != NULL) {
999 vb2_buffer_done(&dev->usb_ctl.vid_buf->vb, VB2_BUF_STATE_ERROR);
1000 dev->usb_ctl.vid_buf = NULL;
1001 }
1002 while (!list_empty(&vidq->active)) {
1003 struct em28xx_buffer *buf;
1004
1005 buf = list_entry(vidq->active.next, struct em28xx_buffer, list);
1006 list_del(&buf->list);
1007 vb2_buffer_done(&buf->vb, VB2_BUF_STATE_ERROR);
1008 }
1009 spin_unlock_irqrestore(&dev->slock, flags);
1010}
1011
1012void em28xx_stop_vbi_streaming(struct vb2_queue *vq)
1013{
1014 struct em28xx *dev = vb2_get_drv_priv(vq);
1015 struct em28xx_v4l2 *v4l2 = dev->v4l2;
1016 struct em28xx_dmaqueue *vbiq = &dev->vbiq;
1017 unsigned long flags = 0;
1018
1019 em28xx_videodbg("%s\n", __func__);
1020
1021 res_free(dev, vq->type);
1022
1023 if (v4l2->streaming_users-- == 1) {
1024
1025 em28xx_uninit_usb_xfer(dev, EM28XX_ANALOG_MODE);
1026 }
1027
1028 spin_lock_irqsave(&dev->slock, flags);
1029 if (dev->usb_ctl.vbi_buf != NULL) {
1030 vb2_buffer_done(&dev->usb_ctl.vbi_buf->vb, VB2_BUF_STATE_ERROR);
1031 dev->usb_ctl.vbi_buf = NULL;
1032 }
1033 while (!list_empty(&vbiq->active)) {
1034 struct em28xx_buffer *buf;
1035
1036 buf = list_entry(vbiq->active.next, struct em28xx_buffer, list);
1037 list_del(&buf->list);
1038 vb2_buffer_done(&buf->vb, VB2_BUF_STATE_ERROR);
1039 }
1040 spin_unlock_irqrestore(&dev->slock, flags);
1041}
1042
1043static void
1044buffer_queue(struct vb2_buffer *vb)
1045{
1046 struct em28xx *dev = vb2_get_drv_priv(vb->vb2_queue);
1047 struct em28xx_buffer *buf = container_of(vb, struct em28xx_buffer, vb);
1048 struct em28xx_dmaqueue *vidq = &dev->vidq;
1049 unsigned long flags = 0;
1050
1051 em28xx_videodbg("%s\n", __func__);
1052 buf->mem = vb2_plane_vaddr(vb, 0);
1053 buf->length = vb2_plane_size(vb, 0);
1054
1055 spin_lock_irqsave(&dev->slock, flags);
1056 list_add_tail(&buf->list, &vidq->active);
1057 spin_unlock_irqrestore(&dev->slock, flags);
1058}
1059
1060static struct vb2_ops em28xx_video_qops = {
1061 .queue_setup = queue_setup,
1062 .buf_prepare = buffer_prepare,
1063 .buf_queue = buffer_queue,
1064 .start_streaming = em28xx_start_analog_streaming,
1065 .stop_streaming = em28xx_stop_streaming,
1066 .wait_prepare = vb2_ops_wait_prepare,
1067 .wait_finish = vb2_ops_wait_finish,
1068};
1069
1070static int em28xx_vb2_setup(struct em28xx *dev)
1071{
1072 int rc;
1073 struct vb2_queue *q;
1074 struct em28xx_v4l2 *v4l2 = dev->v4l2;
1075
1076
1077 q = &v4l2->vb_vidq;
1078 q->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1079 q->io_modes = VB2_READ | VB2_MMAP | VB2_USERPTR | VB2_DMABUF;
1080 q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1081 q->drv_priv = dev;
1082 q->buf_struct_size = sizeof(struct em28xx_buffer);
1083 q->ops = &em28xx_video_qops;
1084 q->mem_ops = &vb2_vmalloc_memops;
1085
1086 rc = vb2_queue_init(q);
1087 if (rc < 0)
1088 return rc;
1089
1090
1091 q = &v4l2->vb_vbiq;
1092 q->type = V4L2_BUF_TYPE_VBI_CAPTURE;
1093 q->io_modes = VB2_READ | VB2_MMAP | VB2_USERPTR;
1094 q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1095 q->drv_priv = dev;
1096 q->buf_struct_size = sizeof(struct em28xx_buffer);
1097 q->ops = &em28xx_vbi_qops;
1098 q->mem_ops = &vb2_vmalloc_memops;
1099
1100 rc = vb2_queue_init(q);
1101 if (rc < 0)
1102 return rc;
1103
1104 return 0;
1105}
1106
1107
1108
1109static void video_mux(struct em28xx *dev, int index)
1110{
1111 struct v4l2_device *v4l2_dev = &dev->v4l2->v4l2_dev;
1112
1113 dev->ctl_input = index;
1114 dev->ctl_ainput = INPUT(index)->amux;
1115 dev->ctl_aoutput = INPUT(index)->aout;
1116
1117 if (!dev->ctl_aoutput)
1118 dev->ctl_aoutput = EM28XX_AOUT_MASTER;
1119
1120 v4l2_device_call_all(v4l2_dev, 0, video, s_routing,
1121 INPUT(index)->vmux, 0, 0);
1122
1123 if (dev->board.has_msp34xx) {
1124 if (dev->i2s_speed) {
1125 v4l2_device_call_all(v4l2_dev, 0, audio,
1126 s_i2s_clock_freq, dev->i2s_speed);
1127 }
1128
1129 v4l2_device_call_all(v4l2_dev, 0, audio, s_routing,
1130 dev->ctl_ainput,
1131 MSP_OUTPUT(MSP_SC_IN_DSP_SCART1), 0);
1132 }
1133
1134 if (dev->board.adecoder != EM28XX_NOADECODER) {
1135 v4l2_device_call_all(v4l2_dev, 0, audio, s_routing,
1136 dev->ctl_ainput, dev->ctl_aoutput, 0);
1137 }
1138
1139 em28xx_audio_analog_set(dev);
1140}
1141
1142static void em28xx_ctrl_notify(struct v4l2_ctrl *ctrl, void *priv)
1143{
1144 struct em28xx *dev = priv;
1145
1146
1147
1148
1149
1150
1151
1152 switch (ctrl->id) {
1153 case V4L2_CID_AUDIO_MUTE:
1154 dev->mute = ctrl->val;
1155 em28xx_audio_analog_set(dev);
1156 break;
1157 case V4L2_CID_AUDIO_VOLUME:
1158 dev->volume = ctrl->val;
1159 em28xx_audio_analog_set(dev);
1160 break;
1161 }
1162}
1163
1164static int em28xx_s_ctrl(struct v4l2_ctrl *ctrl)
1165{
1166 struct em28xx_v4l2 *v4l2 =
1167 container_of(ctrl->handler, struct em28xx_v4l2, ctrl_handler);
1168 struct em28xx *dev = v4l2->dev;
1169 int ret = -EINVAL;
1170
1171 switch (ctrl->id) {
1172 case V4L2_CID_AUDIO_MUTE:
1173 dev->mute = ctrl->val;
1174 ret = em28xx_audio_analog_set(dev);
1175 break;
1176 case V4L2_CID_AUDIO_VOLUME:
1177 dev->volume = ctrl->val;
1178 ret = em28xx_audio_analog_set(dev);
1179 break;
1180 case V4L2_CID_CONTRAST:
1181 ret = em28xx_write_reg(dev, EM28XX_R20_YGAIN, ctrl->val);
1182 break;
1183 case V4L2_CID_BRIGHTNESS:
1184 ret = em28xx_write_reg(dev, EM28XX_R21_YOFFSET, ctrl->val);
1185 break;
1186 case V4L2_CID_SATURATION:
1187 ret = em28xx_write_reg(dev, EM28XX_R22_UVGAIN, ctrl->val);
1188 break;
1189 case V4L2_CID_BLUE_BALANCE:
1190 ret = em28xx_write_reg(dev, EM28XX_R23_UOFFSET, ctrl->val);
1191 break;
1192 case V4L2_CID_RED_BALANCE:
1193 ret = em28xx_write_reg(dev, EM28XX_R24_VOFFSET, ctrl->val);
1194 break;
1195 case V4L2_CID_SHARPNESS:
1196 ret = em28xx_write_reg(dev, EM28XX_R25_SHARPNESS, ctrl->val);
1197 break;
1198 }
1199
1200 return (ret < 0) ? ret : 0;
1201}
1202
1203static const struct v4l2_ctrl_ops em28xx_ctrl_ops = {
1204 .s_ctrl = em28xx_s_ctrl,
1205};
1206
1207static void size_to_scale(struct em28xx *dev,
1208 unsigned int width, unsigned int height,
1209 unsigned int *hscale, unsigned int *vscale)
1210{
1211 unsigned int maxw = norm_maxw(dev);
1212 unsigned int maxh = norm_maxh(dev);
1213
1214 *hscale = (((unsigned long)maxw) << 12) / width - 4096L;
1215 if (*hscale > EM28XX_HVSCALE_MAX)
1216 *hscale = EM28XX_HVSCALE_MAX;
1217
1218 *vscale = (((unsigned long)maxh) << 12) / height - 4096L;
1219 if (*vscale > EM28XX_HVSCALE_MAX)
1220 *vscale = EM28XX_HVSCALE_MAX;
1221}
1222
1223static void scale_to_size(struct em28xx *dev,
1224 unsigned int hscale, unsigned int vscale,
1225 unsigned int *width, unsigned int *height)
1226{
1227 unsigned int maxw = norm_maxw(dev);
1228 unsigned int maxh = norm_maxh(dev);
1229
1230 *width = (((unsigned long)maxw) << 12) / (hscale + 4096L);
1231 *height = (((unsigned long)maxh) << 12) / (vscale + 4096L);
1232}
1233
1234
1235
1236
1237
1238static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
1239 struct v4l2_format *f)
1240{
1241 struct em28xx *dev = video_drvdata(file);
1242 struct em28xx_v4l2 *v4l2 = dev->v4l2;
1243
1244 f->fmt.pix.width = v4l2->width;
1245 f->fmt.pix.height = v4l2->height;
1246 f->fmt.pix.pixelformat = v4l2->format->fourcc;
1247 f->fmt.pix.bytesperline = (v4l2->width * v4l2->format->depth + 7) >> 3;
1248 f->fmt.pix.sizeimage = f->fmt.pix.bytesperline * v4l2->height;
1249 f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
1250
1251
1252 if (v4l2->progressive)
1253 f->fmt.pix.field = V4L2_FIELD_NONE;
1254 else
1255 f->fmt.pix.field = v4l2->interlaced_fieldmode ?
1256 V4L2_FIELD_INTERLACED : V4L2_FIELD_TOP;
1257 return 0;
1258}
1259
1260static struct em28xx_fmt *format_by_fourcc(unsigned int fourcc)
1261{
1262 unsigned int i;
1263
1264 for (i = 0; i < ARRAY_SIZE(format); i++)
1265 if (format[i].fourcc == fourcc)
1266 return &format[i];
1267
1268 return NULL;
1269}
1270
1271static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
1272 struct v4l2_format *f)
1273{
1274 struct em28xx *dev = video_drvdata(file);
1275 struct em28xx_v4l2 *v4l2 = dev->v4l2;
1276 unsigned int width = f->fmt.pix.width;
1277 unsigned int height = f->fmt.pix.height;
1278 unsigned int maxw = norm_maxw(dev);
1279 unsigned int maxh = norm_maxh(dev);
1280 unsigned int hscale, vscale;
1281 struct em28xx_fmt *fmt;
1282
1283 fmt = format_by_fourcc(f->fmt.pix.pixelformat);
1284 if (!fmt) {
1285 em28xx_videodbg("Fourcc format (%08x) invalid.\n",
1286 f->fmt.pix.pixelformat);
1287 return -EINVAL;
1288 }
1289
1290 if (dev->board.is_em2800) {
1291
1292 height = height > (3 * maxh / 4) ? maxh : maxh / 2;
1293 width = width > (3 * maxw / 4) ? maxw : maxw / 2;
1294
1295
1296
1297
1298
1299 if (width == maxw && height == maxh)
1300 width /= 2;
1301 } else {
1302
1303
1304 v4l_bound_align_image(&width, 48, maxw, 1, &height, 32, maxh,
1305 1, 0);
1306 }
1307
1308 size_to_scale(dev, width, height, &hscale, &vscale);
1309 scale_to_size(dev, hscale, vscale, &width, &height);
1310
1311 f->fmt.pix.width = width;
1312 f->fmt.pix.height = height;
1313 f->fmt.pix.pixelformat = fmt->fourcc;
1314 f->fmt.pix.bytesperline = (width * fmt->depth + 7) >> 3;
1315 f->fmt.pix.sizeimage = f->fmt.pix.bytesperline * height;
1316 f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
1317 if (v4l2->progressive)
1318 f->fmt.pix.field = V4L2_FIELD_NONE;
1319 else
1320 f->fmt.pix.field = v4l2->interlaced_fieldmode ?
1321 V4L2_FIELD_INTERLACED : V4L2_FIELD_TOP;
1322 f->fmt.pix.priv = 0;
1323
1324 return 0;
1325}
1326
1327static int em28xx_set_video_format(struct em28xx *dev, unsigned int fourcc,
1328 unsigned width, unsigned height)
1329{
1330 struct em28xx_fmt *fmt;
1331 struct em28xx_v4l2 *v4l2 = dev->v4l2;
1332
1333 fmt = format_by_fourcc(fourcc);
1334 if (!fmt)
1335 return -EINVAL;
1336
1337 v4l2->format = fmt;
1338 v4l2->width = width;
1339 v4l2->height = height;
1340
1341
1342 size_to_scale(dev, v4l2->width, v4l2->height,
1343 &v4l2->hscale, &v4l2->vscale);
1344
1345 em28xx_resolution_set(dev);
1346
1347 return 0;
1348}
1349
1350static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
1351 struct v4l2_format *f)
1352{
1353 struct em28xx *dev = video_drvdata(file);
1354 struct em28xx_v4l2 *v4l2 = dev->v4l2;
1355
1356 if (vb2_is_busy(&v4l2->vb_vidq))
1357 return -EBUSY;
1358
1359 vidioc_try_fmt_vid_cap(file, priv, f);
1360
1361 return em28xx_set_video_format(dev, f->fmt.pix.pixelformat,
1362 f->fmt.pix.width, f->fmt.pix.height);
1363}
1364
1365static int vidioc_g_std(struct file *file, void *priv, v4l2_std_id *norm)
1366{
1367 struct em28xx *dev = video_drvdata(file);
1368
1369 *norm = dev->v4l2->norm;
1370
1371 return 0;
1372}
1373
1374static int vidioc_querystd(struct file *file, void *priv, v4l2_std_id *norm)
1375{
1376 struct em28xx *dev = video_drvdata(file);
1377
1378 v4l2_device_call_all(&dev->v4l2->v4l2_dev, 0, video, querystd, norm);
1379
1380 return 0;
1381}
1382
1383static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id norm)
1384{
1385 struct em28xx *dev = video_drvdata(file);
1386 struct em28xx_v4l2 *v4l2 = dev->v4l2;
1387 struct v4l2_format f;
1388
1389 if (norm == v4l2->norm)
1390 return 0;
1391
1392 if (v4l2->streaming_users > 0)
1393 return -EBUSY;
1394
1395 v4l2->norm = norm;
1396
1397
1398 f.fmt.pix.width = 720;
1399 f.fmt.pix.height = (norm & V4L2_STD_525_60) ? 480 : 576;
1400 vidioc_try_fmt_vid_cap(file, priv, &f);
1401
1402
1403 v4l2->width = f.fmt.pix.width;
1404 v4l2->height = f.fmt.pix.height;
1405 size_to_scale(dev, v4l2->width, v4l2->height,
1406 &v4l2->hscale, &v4l2->vscale);
1407
1408 em28xx_resolution_set(dev);
1409 v4l2_device_call_all(&v4l2->v4l2_dev, 0, video, s_std, v4l2->norm);
1410
1411 return 0;
1412}
1413
1414static int vidioc_g_parm(struct file *file, void *priv,
1415 struct v4l2_streamparm *p)
1416{
1417 struct em28xx *dev = video_drvdata(file);
1418 struct em28xx_v4l2 *v4l2 = dev->v4l2;
1419 int rc = 0;
1420
1421 p->parm.capture.readbuffers = EM28XX_MIN_BUF;
1422 if (dev->board.is_webcam)
1423 rc = v4l2_device_call_until_err(&v4l2->v4l2_dev, 0,
1424 video, g_parm, p);
1425 else
1426 v4l2_video_std_frame_period(v4l2->norm,
1427 &p->parm.capture.timeperframe);
1428
1429 return rc;
1430}
1431
1432static int vidioc_s_parm(struct file *file, void *priv,
1433 struct v4l2_streamparm *p)
1434{
1435 struct em28xx *dev = video_drvdata(file);
1436
1437 p->parm.capture.readbuffers = EM28XX_MIN_BUF;
1438 return v4l2_device_call_until_err(&dev->v4l2->v4l2_dev,
1439 0, video, s_parm, p);
1440}
1441
1442static const char *iname[] = {
1443 [EM28XX_VMUX_COMPOSITE1] = "Composite1",
1444 [EM28XX_VMUX_COMPOSITE2] = "Composite2",
1445 [EM28XX_VMUX_COMPOSITE3] = "Composite3",
1446 [EM28XX_VMUX_COMPOSITE4] = "Composite4",
1447 [EM28XX_VMUX_SVIDEO] = "S-Video",
1448 [EM28XX_VMUX_TELEVISION] = "Television",
1449 [EM28XX_VMUX_CABLE] = "Cable TV",
1450 [EM28XX_VMUX_DVB] = "DVB",
1451 [EM28XX_VMUX_DEBUG] = "for debug only",
1452};
1453
1454static int vidioc_enum_input(struct file *file, void *priv,
1455 struct v4l2_input *i)
1456{
1457 struct em28xx *dev = video_drvdata(file);
1458 unsigned int n;
1459
1460 n = i->index;
1461 if (n >= MAX_EM28XX_INPUT)
1462 return -EINVAL;
1463 if (0 == INPUT(n)->type)
1464 return -EINVAL;
1465
1466 i->index = n;
1467 i->type = V4L2_INPUT_TYPE_CAMERA;
1468
1469 strcpy(i->name, iname[INPUT(n)->type]);
1470
1471 if ((EM28XX_VMUX_TELEVISION == INPUT(n)->type) ||
1472 (EM28XX_VMUX_CABLE == INPUT(n)->type))
1473 i->type = V4L2_INPUT_TYPE_TUNER;
1474
1475 i->std = dev->v4l2->vdev->tvnorms;
1476
1477 if (dev->board.is_webcam)
1478 i->capabilities = 0;
1479
1480 return 0;
1481}
1482
1483static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
1484{
1485 struct em28xx *dev = video_drvdata(file);
1486
1487 *i = dev->ctl_input;
1488
1489 return 0;
1490}
1491
1492static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
1493{
1494 struct em28xx *dev = video_drvdata(file);
1495
1496 if (i >= MAX_EM28XX_INPUT)
1497 return -EINVAL;
1498 if (0 == INPUT(i)->type)
1499 return -EINVAL;
1500
1501 video_mux(dev, i);
1502 return 0;
1503}
1504
1505static int vidioc_g_audio(struct file *file, void *priv, struct v4l2_audio *a)
1506{
1507 struct em28xx *dev = video_drvdata(file);
1508
1509 switch (a->index) {
1510 case EM28XX_AMUX_VIDEO:
1511 strcpy(a->name, "Television");
1512 break;
1513 case EM28XX_AMUX_LINE_IN:
1514 strcpy(a->name, "Line In");
1515 break;
1516 case EM28XX_AMUX_VIDEO2:
1517 strcpy(a->name, "Television alt");
1518 break;
1519 case EM28XX_AMUX_PHONE:
1520 strcpy(a->name, "Phone");
1521 break;
1522 case EM28XX_AMUX_MIC:
1523 strcpy(a->name, "Mic");
1524 break;
1525 case EM28XX_AMUX_CD:
1526 strcpy(a->name, "CD");
1527 break;
1528 case EM28XX_AMUX_AUX:
1529 strcpy(a->name, "Aux");
1530 break;
1531 case EM28XX_AMUX_PCM_OUT:
1532 strcpy(a->name, "PCM");
1533 break;
1534 default:
1535 return -EINVAL;
1536 }
1537
1538 a->index = dev->ctl_ainput;
1539 a->capability = V4L2_AUDCAP_STEREO;
1540
1541 return 0;
1542}
1543
1544static int vidioc_s_audio(struct file *file, void *priv, const struct v4l2_audio *a)
1545{
1546 struct em28xx *dev = video_drvdata(file);
1547
1548 if (a->index >= MAX_EM28XX_INPUT)
1549 return -EINVAL;
1550 if (0 == INPUT(a->index)->type)
1551 return -EINVAL;
1552
1553 dev->ctl_ainput = INPUT(a->index)->amux;
1554 dev->ctl_aoutput = INPUT(a->index)->aout;
1555
1556 if (!dev->ctl_aoutput)
1557 dev->ctl_aoutput = EM28XX_AOUT_MASTER;
1558
1559 return 0;
1560}
1561
1562static int vidioc_g_tuner(struct file *file, void *priv,
1563 struct v4l2_tuner *t)
1564{
1565 struct em28xx *dev = video_drvdata(file);
1566
1567 if (0 != t->index)
1568 return -EINVAL;
1569
1570 strcpy(t->name, "Tuner");
1571
1572 v4l2_device_call_all(&dev->v4l2->v4l2_dev, 0, tuner, g_tuner, t);
1573 return 0;
1574}
1575
1576static int vidioc_s_tuner(struct file *file, void *priv,
1577 const struct v4l2_tuner *t)
1578{
1579 struct em28xx *dev = video_drvdata(file);
1580
1581 if (0 != t->index)
1582 return -EINVAL;
1583
1584 v4l2_device_call_all(&dev->v4l2->v4l2_dev, 0, tuner, s_tuner, t);
1585 return 0;
1586}
1587
1588static int vidioc_g_frequency(struct file *file, void *priv,
1589 struct v4l2_frequency *f)
1590{
1591 struct em28xx *dev = video_drvdata(file);
1592 struct em28xx_v4l2 *v4l2 = dev->v4l2;
1593
1594 if (0 != f->tuner)
1595 return -EINVAL;
1596
1597 f->frequency = v4l2->frequency;
1598 return 0;
1599}
1600
1601static int vidioc_s_frequency(struct file *file, void *priv,
1602 const struct v4l2_frequency *f)
1603{
1604 struct v4l2_frequency new_freq = *f;
1605 struct em28xx *dev = video_drvdata(file);
1606 struct em28xx_v4l2 *v4l2 = dev->v4l2;
1607
1608 if (0 != f->tuner)
1609 return -EINVAL;
1610
1611 v4l2_device_call_all(&v4l2->v4l2_dev, 0, tuner, s_frequency, f);
1612 v4l2_device_call_all(&v4l2->v4l2_dev, 0, tuner, g_frequency, &new_freq);
1613 v4l2->frequency = new_freq.frequency;
1614
1615 return 0;
1616}
1617
1618#ifdef CONFIG_VIDEO_ADV_DEBUG
1619static int vidioc_g_chip_info(struct file *file, void *priv,
1620 struct v4l2_dbg_chip_info *chip)
1621{
1622 struct em28xx *dev = video_drvdata(file);
1623
1624 if (chip->match.addr > 1)
1625 return -EINVAL;
1626 if (chip->match.addr == 1)
1627 strlcpy(chip->name, "ac97", sizeof(chip->name));
1628 else
1629 strlcpy(chip->name,
1630 dev->v4l2->v4l2_dev.name, sizeof(chip->name));
1631 return 0;
1632}
1633
1634static int em28xx_reg_len(int reg)
1635{
1636 switch (reg) {
1637 case EM28XX_R40_AC97LSB:
1638 case EM28XX_R30_HSCALELOW:
1639 case EM28XX_R32_VSCALELOW:
1640 return 2;
1641 default:
1642 return 1;
1643 }
1644}
1645
1646static int vidioc_g_register(struct file *file, void *priv,
1647 struct v4l2_dbg_register *reg)
1648{
1649 struct em28xx *dev = video_drvdata(file);
1650 int ret;
1651
1652 if (reg->match.addr > 1)
1653 return -EINVAL;
1654 if (reg->match.addr) {
1655 ret = em28xx_read_ac97(dev, reg->reg);
1656 if (ret < 0)
1657 return ret;
1658
1659 reg->val = ret;
1660 reg->size = 1;
1661 return 0;
1662 }
1663
1664
1665 reg->size = em28xx_reg_len(reg->reg);
1666 if (reg->size == 1) {
1667 ret = em28xx_read_reg(dev, reg->reg);
1668
1669 if (ret < 0)
1670 return ret;
1671
1672 reg->val = ret;
1673 } else {
1674 __le16 val = 0;
1675
1676 ret = dev->em28xx_read_reg_req_len(dev, USB_REQ_GET_STATUS,
1677 reg->reg, (char *)&val, 2);
1678 if (ret < 0)
1679 return ret;
1680
1681 reg->val = le16_to_cpu(val);
1682 }
1683
1684 return 0;
1685}
1686
1687static int vidioc_s_register(struct file *file, void *priv,
1688 const struct v4l2_dbg_register *reg)
1689{
1690 struct em28xx *dev = video_drvdata(file);
1691 __le16 buf;
1692
1693 if (reg->match.addr > 1)
1694 return -EINVAL;
1695 if (reg->match.addr)
1696 return em28xx_write_ac97(dev, reg->reg, reg->val);
1697
1698
1699 buf = cpu_to_le16(reg->val);
1700
1701 return em28xx_write_regs(dev, reg->reg, (char *)&buf,
1702 em28xx_reg_len(reg->reg));
1703}
1704#endif
1705
1706static int vidioc_querycap(struct file *file, void *priv,
1707 struct v4l2_capability *cap)
1708{
1709 struct video_device *vdev = video_devdata(file);
1710 struct em28xx *dev = video_drvdata(file);
1711 struct em28xx_v4l2 *v4l2 = dev->v4l2;
1712
1713 strlcpy(cap->driver, "em28xx", sizeof(cap->driver));
1714 strlcpy(cap->card, em28xx_boards[dev->model].name, sizeof(cap->card));
1715 usb_make_path(dev->udev, cap->bus_info, sizeof(cap->bus_info));
1716
1717 if (vdev->vfl_type == VFL_TYPE_GRABBER)
1718 cap->device_caps = V4L2_CAP_READWRITE |
1719 V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING;
1720 else if (vdev->vfl_type == VFL_TYPE_RADIO)
1721 cap->device_caps = V4L2_CAP_RADIO;
1722 else
1723 cap->device_caps = V4L2_CAP_READWRITE | V4L2_CAP_VBI_CAPTURE;
1724
1725 if (dev->int_audio_type != EM28XX_INT_AUDIO_NONE)
1726 cap->device_caps |= V4L2_CAP_AUDIO;
1727
1728 if (dev->tuner_type != TUNER_ABSENT)
1729 cap->device_caps |= V4L2_CAP_TUNER;
1730
1731 cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS |
1732 V4L2_CAP_READWRITE | V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING;
1733 if (v4l2->vbi_dev)
1734 cap->capabilities |= V4L2_CAP_VBI_CAPTURE;
1735 if (v4l2->radio_dev)
1736 cap->capabilities |= V4L2_CAP_RADIO;
1737 return 0;
1738}
1739
1740static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv,
1741 struct v4l2_fmtdesc *f)
1742{
1743 if (unlikely(f->index >= ARRAY_SIZE(format)))
1744 return -EINVAL;
1745
1746 strlcpy(f->description, format[f->index].name, sizeof(f->description));
1747 f->pixelformat = format[f->index].fourcc;
1748
1749 return 0;
1750}
1751
1752static int vidioc_enum_framesizes(struct file *file, void *priv,
1753 struct v4l2_frmsizeenum *fsize)
1754{
1755 struct em28xx *dev = video_drvdata(file);
1756 struct em28xx_fmt *fmt;
1757 unsigned int maxw = norm_maxw(dev);
1758 unsigned int maxh = norm_maxh(dev);
1759
1760 fmt = format_by_fourcc(fsize->pixel_format);
1761 if (!fmt) {
1762 em28xx_videodbg("Fourcc format (%08x) invalid.\n",
1763 fsize->pixel_format);
1764 return -EINVAL;
1765 }
1766
1767 if (dev->board.is_em2800) {
1768 if (fsize->index > 1)
1769 return -EINVAL;
1770 fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE;
1771 fsize->discrete.width = maxw / (1 + fsize->index);
1772 fsize->discrete.height = maxh / (1 + fsize->index);
1773 return 0;
1774 }
1775
1776 if (fsize->index != 0)
1777 return -EINVAL;
1778
1779
1780 fsize->type = V4L2_FRMSIZE_TYPE_STEPWISE;
1781 scale_to_size(dev, EM28XX_HVSCALE_MAX, EM28XX_HVSCALE_MAX,
1782 &fsize->stepwise.min_width, &fsize->stepwise.min_height);
1783 if (fsize->stepwise.min_width < 48)
1784 fsize->stepwise.min_width = 48;
1785 if (fsize->stepwise.min_height < 38)
1786 fsize->stepwise.min_height = 38;
1787 fsize->stepwise.max_width = maxw;
1788 fsize->stepwise.max_height = maxh;
1789 fsize->stepwise.step_width = 1;
1790 fsize->stepwise.step_height = 1;
1791 return 0;
1792}
1793
1794
1795
1796static int vidioc_g_fmt_vbi_cap(struct file *file, void *priv,
1797 struct v4l2_format *format)
1798{
1799 struct em28xx *dev = video_drvdata(file);
1800 struct em28xx_v4l2 *v4l2 = dev->v4l2;
1801
1802 format->fmt.vbi.samples_per_line = v4l2->vbi_width;
1803 format->fmt.vbi.sample_format = V4L2_PIX_FMT_GREY;
1804 format->fmt.vbi.offset = 0;
1805 format->fmt.vbi.flags = 0;
1806 format->fmt.vbi.sampling_rate = 6750000 * 4 / 2;
1807 format->fmt.vbi.count[0] = v4l2->vbi_height;
1808 format->fmt.vbi.count[1] = v4l2->vbi_height;
1809 memset(format->fmt.vbi.reserved, 0, sizeof(format->fmt.vbi.reserved));
1810
1811
1812 if (v4l2->norm & V4L2_STD_525_60) {
1813
1814 format->fmt.vbi.start[0] = 10;
1815 format->fmt.vbi.start[1] = 273;
1816 } else if (v4l2->norm & V4L2_STD_625_50) {
1817
1818 format->fmt.vbi.start[0] = 6;
1819 format->fmt.vbi.start[1] = 318;
1820 }
1821
1822 return 0;
1823}
1824
1825
1826
1827
1828
1829static int radio_g_tuner(struct file *file, void *priv,
1830 struct v4l2_tuner *t)
1831{
1832 struct em28xx *dev = video_drvdata(file);
1833
1834 if (unlikely(t->index > 0))
1835 return -EINVAL;
1836
1837 strcpy(t->name, "Radio");
1838
1839 v4l2_device_call_all(&dev->v4l2->v4l2_dev, 0, tuner, g_tuner, t);
1840
1841 return 0;
1842}
1843
1844static int radio_s_tuner(struct file *file, void *priv,
1845 const struct v4l2_tuner *t)
1846{
1847 struct em28xx *dev = video_drvdata(file);
1848
1849 if (0 != t->index)
1850 return -EINVAL;
1851
1852 v4l2_device_call_all(&dev->v4l2->v4l2_dev, 0, tuner, s_tuner, t);
1853
1854 return 0;
1855}
1856
1857
1858
1859
1860
1861
1862
1863
1864static void em28xx_free_v4l2(struct kref *ref)
1865{
1866 struct em28xx_v4l2 *v4l2 = container_of(ref, struct em28xx_v4l2, ref);
1867
1868 v4l2->dev->v4l2 = NULL;
1869 kfree(v4l2);
1870}
1871
1872
1873
1874
1875
1876static int em28xx_v4l2_open(struct file *filp)
1877{
1878 struct video_device *vdev = video_devdata(filp);
1879 struct em28xx *dev = video_drvdata(filp);
1880 struct em28xx_v4l2 *v4l2 = dev->v4l2;
1881 enum v4l2_buf_type fh_type = 0;
1882 int ret;
1883
1884 switch (vdev->vfl_type) {
1885 case VFL_TYPE_GRABBER:
1886 fh_type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1887 break;
1888 case VFL_TYPE_VBI:
1889 fh_type = V4L2_BUF_TYPE_VBI_CAPTURE;
1890 break;
1891 case VFL_TYPE_RADIO:
1892 break;
1893 default:
1894 return -EINVAL;
1895 }
1896
1897 em28xx_videodbg("open dev=%s type=%s users=%d\n",
1898 video_device_node_name(vdev), v4l2_type_names[fh_type],
1899 v4l2->users);
1900
1901 if (mutex_lock_interruptible(&dev->lock))
1902 return -ERESTARTSYS;
1903
1904 ret = v4l2_fh_open(filp);
1905 if (ret) {
1906 em28xx_errdev("%s: v4l2_fh_open() returned error %d\n",
1907 __func__, ret);
1908 mutex_unlock(&dev->lock);
1909 return ret;
1910 }
1911
1912 if (v4l2->users == 0) {
1913 em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
1914
1915 if (vdev->vfl_type != VFL_TYPE_RADIO)
1916 em28xx_resolution_set(dev);
1917
1918
1919
1920
1921
1922 em28xx_wake_i2c(dev);
1923 }
1924
1925 if (vdev->vfl_type == VFL_TYPE_RADIO) {
1926 em28xx_videodbg("video_open: setting radio device\n");
1927 v4l2_device_call_all(&v4l2->v4l2_dev, 0, tuner, s_radio);
1928 }
1929
1930 kref_get(&dev->ref);
1931 kref_get(&v4l2->ref);
1932 v4l2->users++;
1933
1934 mutex_unlock(&dev->lock);
1935
1936 return 0;
1937}
1938
1939
1940
1941
1942
1943
1944static int em28xx_v4l2_fini(struct em28xx *dev)
1945{
1946 struct em28xx_v4l2 *v4l2 = dev->v4l2;
1947
1948 if (dev->is_audio_only) {
1949
1950 return 0;
1951 }
1952
1953 if (!dev->has_video) {
1954
1955 return 0;
1956 }
1957
1958 if (v4l2 == NULL)
1959 return 0;
1960
1961 em28xx_info("Closing video extension");
1962
1963 mutex_lock(&dev->lock);
1964
1965 v4l2_device_disconnect(&v4l2->v4l2_dev);
1966
1967 em28xx_uninit_usb_xfer(dev, EM28XX_ANALOG_MODE);
1968
1969 if (v4l2->radio_dev) {
1970 em28xx_info("V4L2 device %s deregistered\n",
1971 video_device_node_name(v4l2->radio_dev));
1972 video_unregister_device(v4l2->radio_dev);
1973 }
1974 if (v4l2->vbi_dev) {
1975 em28xx_info("V4L2 device %s deregistered\n",
1976 video_device_node_name(v4l2->vbi_dev));
1977 video_unregister_device(v4l2->vbi_dev);
1978 }
1979 if (v4l2->vdev) {
1980 em28xx_info("V4L2 device %s deregistered\n",
1981 video_device_node_name(v4l2->vdev));
1982 video_unregister_device(v4l2->vdev);
1983 }
1984
1985 v4l2_ctrl_handler_free(&v4l2->ctrl_handler);
1986 v4l2_device_unregister(&v4l2->v4l2_dev);
1987
1988 if (v4l2->clk) {
1989 v4l2_clk_unregister_fixed(v4l2->clk);
1990 v4l2->clk = NULL;
1991 }
1992
1993 kref_put(&v4l2->ref, em28xx_free_v4l2);
1994
1995 mutex_unlock(&dev->lock);
1996
1997 kref_put(&dev->ref, em28xx_free_device);
1998
1999 return 0;
2000}
2001
2002static int em28xx_v4l2_suspend(struct em28xx *dev)
2003{
2004 if (dev->is_audio_only)
2005 return 0;
2006
2007 if (!dev->has_video)
2008 return 0;
2009
2010 em28xx_info("Suspending video extension");
2011 em28xx_stop_urbs(dev);
2012 return 0;
2013}
2014
2015static int em28xx_v4l2_resume(struct em28xx *dev)
2016{
2017 if (dev->is_audio_only)
2018 return 0;
2019
2020 if (!dev->has_video)
2021 return 0;
2022
2023 em28xx_info("Resuming video extension");
2024
2025 return 0;
2026}
2027
2028
2029
2030
2031
2032
2033static int em28xx_v4l2_close(struct file *filp)
2034{
2035 struct em28xx *dev = video_drvdata(filp);
2036 struct em28xx_v4l2 *v4l2 = dev->v4l2;
2037 int errCode;
2038
2039 em28xx_videodbg("users=%d\n", v4l2->users);
2040
2041 vb2_fop_release(filp);
2042 mutex_lock(&dev->lock);
2043
2044 if (v4l2->users == 1) {
2045
2046 if (dev->disconnected)
2047 goto exit;
2048
2049
2050 v4l2_device_call_all(&v4l2->v4l2_dev, 0, core, s_power, 0);
2051
2052
2053 em28xx_set_mode(dev, EM28XX_SUSPEND);
2054
2055
2056 dev->alt = 0;
2057 em28xx_videodbg("setting alternate 0\n");
2058 errCode = usb_set_interface(dev->udev, 0, 0);
2059 if (errCode < 0) {
2060 em28xx_errdev("cannot change alternate number to "
2061 "0 (error=%i)\n", errCode);
2062 }
2063 }
2064
2065exit:
2066 v4l2->users--;
2067 kref_put(&v4l2->ref, em28xx_free_v4l2);
2068 mutex_unlock(&dev->lock);
2069 kref_put(&dev->ref, em28xx_free_device);
2070
2071 return 0;
2072}
2073
2074static const struct v4l2_file_operations em28xx_v4l_fops = {
2075 .owner = THIS_MODULE,
2076 .open = em28xx_v4l2_open,
2077 .release = em28xx_v4l2_close,
2078 .read = vb2_fop_read,
2079 .poll = vb2_fop_poll,
2080 .mmap = vb2_fop_mmap,
2081 .unlocked_ioctl = video_ioctl2,
2082};
2083
2084static const struct v4l2_ioctl_ops video_ioctl_ops = {
2085 .vidioc_querycap = vidioc_querycap,
2086 .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
2087 .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,
2088 .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap,
2089 .vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap,
2090 .vidioc_g_fmt_vbi_cap = vidioc_g_fmt_vbi_cap,
2091 .vidioc_try_fmt_vbi_cap = vidioc_g_fmt_vbi_cap,
2092 .vidioc_s_fmt_vbi_cap = vidioc_g_fmt_vbi_cap,
2093 .vidioc_enum_framesizes = vidioc_enum_framesizes,
2094 .vidioc_g_audio = vidioc_g_audio,
2095 .vidioc_s_audio = vidioc_s_audio,
2096
2097 .vidioc_reqbufs = vb2_ioctl_reqbufs,
2098 .vidioc_create_bufs = vb2_ioctl_create_bufs,
2099 .vidioc_prepare_buf = vb2_ioctl_prepare_buf,
2100 .vidioc_querybuf = vb2_ioctl_querybuf,
2101 .vidioc_qbuf = vb2_ioctl_qbuf,
2102 .vidioc_dqbuf = vb2_ioctl_dqbuf,
2103
2104 .vidioc_g_std = vidioc_g_std,
2105 .vidioc_querystd = vidioc_querystd,
2106 .vidioc_s_std = vidioc_s_std,
2107 .vidioc_g_parm = vidioc_g_parm,
2108 .vidioc_s_parm = vidioc_s_parm,
2109 .vidioc_enum_input = vidioc_enum_input,
2110 .vidioc_g_input = vidioc_g_input,
2111 .vidioc_s_input = vidioc_s_input,
2112 .vidioc_streamon = vb2_ioctl_streamon,
2113 .vidioc_streamoff = vb2_ioctl_streamoff,
2114 .vidioc_g_tuner = vidioc_g_tuner,
2115 .vidioc_s_tuner = vidioc_s_tuner,
2116 .vidioc_g_frequency = vidioc_g_frequency,
2117 .vidioc_s_frequency = vidioc_s_frequency,
2118 .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
2119 .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
2120#ifdef CONFIG_VIDEO_ADV_DEBUG
2121 .vidioc_g_chip_info = vidioc_g_chip_info,
2122 .vidioc_g_register = vidioc_g_register,
2123 .vidioc_s_register = vidioc_s_register,
2124#endif
2125};
2126
2127static const struct video_device em28xx_video_template = {
2128 .fops = &em28xx_v4l_fops,
2129 .ioctl_ops = &video_ioctl_ops,
2130 .release = video_device_release,
2131 .tvnorms = V4L2_STD_ALL,
2132};
2133
2134static const struct v4l2_file_operations radio_fops = {
2135 .owner = THIS_MODULE,
2136 .open = em28xx_v4l2_open,
2137 .release = em28xx_v4l2_close,
2138 .unlocked_ioctl = video_ioctl2,
2139};
2140
2141static const struct v4l2_ioctl_ops radio_ioctl_ops = {
2142 .vidioc_querycap = vidioc_querycap,
2143 .vidioc_g_tuner = radio_g_tuner,
2144 .vidioc_s_tuner = radio_s_tuner,
2145 .vidioc_g_frequency = vidioc_g_frequency,
2146 .vidioc_s_frequency = vidioc_s_frequency,
2147 .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
2148 .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
2149#ifdef CONFIG_VIDEO_ADV_DEBUG
2150 .vidioc_g_chip_info = vidioc_g_chip_info,
2151 .vidioc_g_register = vidioc_g_register,
2152 .vidioc_s_register = vidioc_s_register,
2153#endif
2154};
2155
2156static struct video_device em28xx_radio_template = {
2157 .fops = &radio_fops,
2158 .ioctl_ops = &radio_ioctl_ops,
2159 .release = video_device_release,
2160};
2161
2162
2163static unsigned short saa711x_addrs[] = {
2164 0x4a >> 1, 0x48 >> 1,
2165 0x42 >> 1, 0x40 >> 1,
2166 I2C_CLIENT_END };
2167
2168static unsigned short tvp5150_addrs[] = {
2169 0xb8 >> 1,
2170 0xba >> 1,
2171 I2C_CLIENT_END
2172};
2173
2174static unsigned short msp3400_addrs[] = {
2175 0x80 >> 1,
2176 0x88 >> 1,
2177 I2C_CLIENT_END
2178};
2179
2180
2181
2182static struct video_device
2183*em28xx_vdev_init(struct em28xx *dev,
2184 const struct video_device *template,
2185 const char *type_name)
2186{
2187 struct video_device *vfd;
2188
2189 vfd = video_device_alloc();
2190 if (NULL == vfd)
2191 return NULL;
2192
2193 *vfd = *template;
2194 vfd->v4l2_dev = &dev->v4l2->v4l2_dev;
2195 vfd->debug = video_debug;
2196 vfd->lock = &dev->lock;
2197 if (dev->board.is_webcam)
2198 vfd->tvnorms = 0;
2199
2200 snprintf(vfd->name, sizeof(vfd->name), "%s %s",
2201 dev->name, type_name);
2202
2203 video_set_drvdata(vfd, dev);
2204 return vfd;
2205}
2206
2207static void em28xx_tuner_setup(struct em28xx *dev, unsigned short tuner_addr)
2208{
2209 struct em28xx_v4l2 *v4l2 = dev->v4l2;
2210 struct v4l2_device *v4l2_dev = &v4l2->v4l2_dev;
2211 struct tuner_setup tun_setup;
2212 struct v4l2_frequency f;
2213
2214 memset(&tun_setup, 0, sizeof(tun_setup));
2215
2216 tun_setup.mode_mask = T_ANALOG_TV | T_RADIO;
2217 tun_setup.tuner_callback = em28xx_tuner_callback;
2218
2219 if (dev->board.radio.type) {
2220 tun_setup.type = dev->board.radio.type;
2221 tun_setup.addr = dev->board.radio_addr;
2222
2223 v4l2_device_call_all(v4l2_dev,
2224 0, tuner, s_type_addr, &tun_setup);
2225 }
2226
2227 if ((dev->tuner_type != TUNER_ABSENT) && (dev->tuner_type)) {
2228 tun_setup.type = dev->tuner_type;
2229 tun_setup.addr = tuner_addr;
2230
2231 v4l2_device_call_all(v4l2_dev,
2232 0, tuner, s_type_addr, &tun_setup);
2233 }
2234
2235 if (dev->board.tda9887_conf) {
2236 struct v4l2_priv_tun_config tda9887_cfg;
2237
2238 tda9887_cfg.tuner = TUNER_TDA9887;
2239 tda9887_cfg.priv = &dev->board.tda9887_conf;
2240
2241 v4l2_device_call_all(v4l2_dev,
2242 0, tuner, s_config, &tda9887_cfg);
2243 }
2244
2245 if (dev->tuner_type == TUNER_XC2028) {
2246 struct v4l2_priv_tun_config xc2028_cfg;
2247 struct xc2028_ctrl ctl;
2248
2249 memset(&xc2028_cfg, 0, sizeof(xc2028_cfg));
2250 memset(&ctl, 0, sizeof(ctl));
2251
2252 em28xx_setup_xc3028(dev, &ctl);
2253
2254 xc2028_cfg.tuner = TUNER_XC2028;
2255 xc2028_cfg.priv = &ctl;
2256
2257 v4l2_device_call_all(v4l2_dev, 0, tuner, s_config, &xc2028_cfg);
2258 }
2259
2260
2261 f.tuner = 0;
2262 f.type = V4L2_TUNER_ANALOG_TV;
2263 f.frequency = 9076;
2264 v4l2->frequency = f.frequency;
2265 v4l2_device_call_all(v4l2_dev, 0, tuner, s_frequency, &f);
2266}
2267
2268static int em28xx_v4l2_init(struct em28xx *dev)
2269{
2270 u8 val;
2271 int ret;
2272 unsigned int maxw;
2273 struct v4l2_ctrl_handler *hdl;
2274 struct em28xx_v4l2 *v4l2;
2275
2276 if (dev->is_audio_only) {
2277
2278 return 0;
2279 }
2280
2281 if (!dev->has_video) {
2282
2283 return 0;
2284 }
2285
2286 em28xx_info("Registering V4L2 extension\n");
2287
2288 mutex_lock(&dev->lock);
2289
2290 v4l2 = kzalloc(sizeof(struct em28xx_v4l2), GFP_KERNEL);
2291 if (v4l2 == NULL) {
2292 em28xx_info("em28xx_v4l: memory allocation failed\n");
2293 mutex_unlock(&dev->lock);
2294 return -ENOMEM;
2295 }
2296 kref_init(&v4l2->ref);
2297 v4l2->dev = dev;
2298 dev->v4l2 = v4l2;
2299
2300 ret = v4l2_device_register(&dev->udev->dev, &v4l2->v4l2_dev);
2301 if (ret < 0) {
2302 em28xx_errdev("Call to v4l2_device_register() failed!\n");
2303 goto err;
2304 }
2305
2306 hdl = &v4l2->ctrl_handler;
2307 v4l2_ctrl_handler_init(hdl, 8);
2308 v4l2->v4l2_dev.ctrl_handler = hdl;
2309
2310 if (dev->board.is_webcam)
2311 v4l2->progressive = true;
2312
2313
2314
2315
2316 v4l2->vinmode = 0x10;
2317 v4l2->vinctl = EM28XX_VINCTRL_INTERLACED |
2318 EM28XX_VINCTRL_CCIR656_ENABLE;
2319
2320
2321
2322 if (dev->board.has_msp34xx)
2323 v4l2_i2c_new_subdev(&v4l2->v4l2_dev,
2324 &dev->i2c_adap[dev->def_i2c_bus],
2325 "msp3400", 0, msp3400_addrs);
2326
2327 if (dev->board.decoder == EM28XX_SAA711X)
2328 v4l2_i2c_new_subdev(&v4l2->v4l2_dev,
2329 &dev->i2c_adap[dev->def_i2c_bus],
2330 "saa7115_auto", 0, saa711x_addrs);
2331
2332 if (dev->board.decoder == EM28XX_TVP5150)
2333 v4l2_i2c_new_subdev(&v4l2->v4l2_dev,
2334 &dev->i2c_adap[dev->def_i2c_bus],
2335 "tvp5150", 0, tvp5150_addrs);
2336
2337 if (dev->board.adecoder == EM28XX_TVAUDIO)
2338 v4l2_i2c_new_subdev(&v4l2->v4l2_dev,
2339 &dev->i2c_adap[dev->def_i2c_bus],
2340 "tvaudio", dev->board.tvaudio_addr, NULL);
2341
2342
2343
2344 if (dev->board.tuner_type != TUNER_ABSENT) {
2345 unsigned short tuner_addr = dev->board.tuner_addr;
2346 int has_demod = (dev->board.tda9887_conf & TDA9887_PRESENT);
2347
2348 if (dev->board.radio.type)
2349 v4l2_i2c_new_subdev(&v4l2->v4l2_dev,
2350 &dev->i2c_adap[dev->def_i2c_bus],
2351 "tuner", dev->board.radio_addr,
2352 NULL);
2353
2354 if (has_demod)
2355 v4l2_i2c_new_subdev(&v4l2->v4l2_dev,
2356 &dev->i2c_adap[dev->def_i2c_bus],
2357 "tuner", 0,
2358 v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
2359 if (tuner_addr == 0) {
2360 enum v4l2_i2c_tuner_type type =
2361 has_demod ? ADDRS_TV_WITH_DEMOD : ADDRS_TV;
2362 struct v4l2_subdev *sd;
2363
2364 sd = v4l2_i2c_new_subdev(&v4l2->v4l2_dev,
2365 &dev->i2c_adap[dev->def_i2c_bus],
2366 "tuner", 0,
2367 v4l2_i2c_tuner_addrs(type));
2368
2369 if (sd)
2370 tuner_addr = v4l2_i2c_subdev_addr(sd);
2371 } else {
2372 v4l2_i2c_new_subdev(&v4l2->v4l2_dev,
2373 &dev->i2c_adap[dev->def_i2c_bus],
2374 "tuner", tuner_addr, NULL);
2375 }
2376
2377 em28xx_tuner_setup(dev, tuner_addr);
2378 }
2379
2380 if (dev->em28xx_sensor != EM28XX_NOSENSOR)
2381 em28xx_init_camera(dev);
2382
2383
2384 ret = em28xx_audio_setup(dev);
2385 if (ret < 0) {
2386 em28xx_errdev("%s: Error while setting audio - error [%d]!\n",
2387 __func__, ret);
2388 goto unregister_dev;
2389 }
2390 if (dev->audio_mode.ac97 != EM28XX_NO_AC97) {
2391 v4l2_ctrl_new_std(hdl, &em28xx_ctrl_ops,
2392 V4L2_CID_AUDIO_MUTE, 0, 1, 1, 1);
2393 v4l2_ctrl_new_std(hdl, &em28xx_ctrl_ops,
2394 V4L2_CID_AUDIO_VOLUME, 0, 0x1f, 1, 0x1f);
2395 } else {
2396
2397 v4l2_ctrl_notify(v4l2_ctrl_find(hdl, V4L2_CID_AUDIO_MUTE),
2398 em28xx_ctrl_notify, dev);
2399 v4l2_ctrl_notify(v4l2_ctrl_find(hdl, V4L2_CID_AUDIO_VOLUME),
2400 em28xx_ctrl_notify, dev);
2401 }
2402
2403
2404 em28xx_wake_i2c(dev);
2405
2406
2407 INIT_LIST_HEAD(&dev->vidq.active);
2408 INIT_LIST_HEAD(&dev->vbiq.active);
2409
2410 if (dev->board.has_msp34xx) {
2411
2412 ret = em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xf7);
2413 if (ret < 0) {
2414 em28xx_errdev("%s: em28xx_write_reg - msp34xx(1) failed! error [%d]\n",
2415 __func__, ret);
2416 goto unregister_dev;
2417 }
2418 msleep(3);
2419
2420 ret = em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xff);
2421 if (ret < 0) {
2422 em28xx_errdev("%s: em28xx_write_reg - msp34xx(2) failed! error [%d]\n",
2423 __func__, ret);
2424 goto unregister_dev;
2425 }
2426 msleep(3);
2427 }
2428
2429
2430 v4l2->norm = V4L2_STD_PAL;
2431 v4l2_device_call_all(&v4l2->v4l2_dev, 0, video, s_std, v4l2->norm);
2432 v4l2->interlaced_fieldmode = EM28XX_INTERLACED_DEFAULT;
2433
2434
2435 v4l2->format = &format[0];
2436
2437 maxw = norm_maxw(dev);
2438
2439
2440 if (dev->board.is_em2800)
2441 maxw /= 2;
2442
2443 em28xx_set_video_format(dev, format[0].fourcc,
2444 maxw, norm_maxh(dev));
2445
2446 video_mux(dev, 0);
2447
2448
2449 dev->mute = 1;
2450 dev->volume = 0x1f;
2451
2452
2453 val = (u8)em28xx_read_reg(dev, EM28XX_R0F_XCLK);
2454 em28xx_write_reg(dev, EM28XX_R0F_XCLK,
2455 (EM28XX_XCLK_AUDIO_UNMUTE | val));
2456
2457 em28xx_set_outfmt(dev);
2458
2459
2460
2461
2462 if (NULL == v4l2_ctrl_find(hdl, V4L2_CID_CONTRAST))
2463 v4l2_ctrl_new_std(hdl, &em28xx_ctrl_ops,
2464 V4L2_CID_CONTRAST,
2465 0, 0x1f, 1, CONTRAST_DEFAULT);
2466 if (NULL == v4l2_ctrl_find(hdl, V4L2_CID_BRIGHTNESS))
2467 v4l2_ctrl_new_std(hdl, &em28xx_ctrl_ops,
2468 V4L2_CID_BRIGHTNESS,
2469 -0x80, 0x7f, 1, BRIGHTNESS_DEFAULT);
2470 if (NULL == v4l2_ctrl_find(hdl, V4L2_CID_SATURATION))
2471 v4l2_ctrl_new_std(hdl, &em28xx_ctrl_ops,
2472 V4L2_CID_SATURATION,
2473 0, 0x1f, 1, SATURATION_DEFAULT);
2474 if (NULL == v4l2_ctrl_find(hdl, V4L2_CID_BLUE_BALANCE))
2475 v4l2_ctrl_new_std(hdl, &em28xx_ctrl_ops,
2476 V4L2_CID_BLUE_BALANCE,
2477 -0x30, 0x30, 1, BLUE_BALANCE_DEFAULT);
2478 if (NULL == v4l2_ctrl_find(hdl, V4L2_CID_RED_BALANCE))
2479 v4l2_ctrl_new_std(hdl, &em28xx_ctrl_ops,
2480 V4L2_CID_RED_BALANCE,
2481 -0x30, 0x30, 1, RED_BALANCE_DEFAULT);
2482 if (NULL == v4l2_ctrl_find(hdl, V4L2_CID_SHARPNESS))
2483 v4l2_ctrl_new_std(hdl, &em28xx_ctrl_ops,
2484 V4L2_CID_SHARPNESS,
2485 0, 0x0f, 1, SHARPNESS_DEFAULT);
2486
2487
2488 em28xx_colorlevels_set_default(dev);
2489 v4l2_ctrl_handler_setup(hdl);
2490 ret = hdl->error;
2491 if (ret)
2492 goto unregister_dev;
2493
2494
2495 v4l2->vdev = em28xx_vdev_init(dev, &em28xx_video_template, "video");
2496 if (!v4l2->vdev) {
2497 em28xx_errdev("cannot allocate video_device.\n");
2498 ret = -ENODEV;
2499 goto unregister_dev;
2500 }
2501 mutex_init(&v4l2->vb_queue_lock);
2502 mutex_init(&v4l2->vb_vbi_queue_lock);
2503 v4l2->vdev->queue = &v4l2->vb_vidq;
2504 v4l2->vdev->queue->lock = &v4l2->vb_queue_lock;
2505
2506
2507 if (dev->board.is_webcam) {
2508 v4l2_disable_ioctl(v4l2->vdev, VIDIOC_QUERYSTD);
2509 v4l2_disable_ioctl(v4l2->vdev, VIDIOC_G_STD);
2510 v4l2_disable_ioctl(v4l2->vdev, VIDIOC_S_STD);
2511 } else {
2512 v4l2_disable_ioctl(v4l2->vdev, VIDIOC_S_PARM);
2513 }
2514 if (dev->tuner_type == TUNER_ABSENT) {
2515 v4l2_disable_ioctl(v4l2->vdev, VIDIOC_G_TUNER);
2516 v4l2_disable_ioctl(v4l2->vdev, VIDIOC_S_TUNER);
2517 v4l2_disable_ioctl(v4l2->vdev, VIDIOC_G_FREQUENCY);
2518 v4l2_disable_ioctl(v4l2->vdev, VIDIOC_S_FREQUENCY);
2519 }
2520 if (dev->int_audio_type == EM28XX_INT_AUDIO_NONE) {
2521 v4l2_disable_ioctl(v4l2->vdev, VIDIOC_G_AUDIO);
2522 v4l2_disable_ioctl(v4l2->vdev, VIDIOC_S_AUDIO);
2523 }
2524
2525
2526 ret = video_register_device(v4l2->vdev, VFL_TYPE_GRABBER,
2527 video_nr[dev->devno]);
2528 if (ret) {
2529 em28xx_errdev("unable to register video device (error=%i).\n",
2530 ret);
2531 goto unregister_dev;
2532 }
2533
2534
2535 if (em28xx_vbi_supported(dev) == 1) {
2536 v4l2->vbi_dev = em28xx_vdev_init(dev, &em28xx_video_template,
2537 "vbi");
2538
2539 v4l2->vbi_dev->queue = &v4l2->vb_vbiq;
2540 v4l2->vbi_dev->queue->lock = &v4l2->vb_vbi_queue_lock;
2541
2542
2543 v4l2_disable_ioctl(v4l2->vbi_dev, VIDIOC_S_PARM);
2544 if (dev->tuner_type == TUNER_ABSENT) {
2545 v4l2_disable_ioctl(v4l2->vbi_dev, VIDIOC_G_TUNER);
2546 v4l2_disable_ioctl(v4l2->vbi_dev, VIDIOC_S_TUNER);
2547 v4l2_disable_ioctl(v4l2->vbi_dev, VIDIOC_G_FREQUENCY);
2548 v4l2_disable_ioctl(v4l2->vbi_dev, VIDIOC_S_FREQUENCY);
2549 }
2550 if (dev->int_audio_type == EM28XX_INT_AUDIO_NONE) {
2551 v4l2_disable_ioctl(v4l2->vbi_dev, VIDIOC_G_AUDIO);
2552 v4l2_disable_ioctl(v4l2->vbi_dev, VIDIOC_S_AUDIO);
2553 }
2554
2555
2556 ret = video_register_device(v4l2->vbi_dev, VFL_TYPE_VBI,
2557 vbi_nr[dev->devno]);
2558 if (ret < 0) {
2559 em28xx_errdev("unable to register vbi device\n");
2560 goto unregister_dev;
2561 }
2562 }
2563
2564 if (em28xx_boards[dev->model].radio.type == EM28XX_RADIO) {
2565 v4l2->radio_dev = em28xx_vdev_init(dev, &em28xx_radio_template,
2566 "radio");
2567 if (!v4l2->radio_dev) {
2568 em28xx_errdev("cannot allocate video_device.\n");
2569 ret = -ENODEV;
2570 goto unregister_dev;
2571 }
2572 ret = video_register_device(v4l2->radio_dev, VFL_TYPE_RADIO,
2573 radio_nr[dev->devno]);
2574 if (ret < 0) {
2575 em28xx_errdev("can't register radio device\n");
2576 goto unregister_dev;
2577 }
2578 em28xx_info("Registered radio device as %s\n",
2579 video_device_node_name(v4l2->radio_dev));
2580 }
2581
2582 em28xx_info("V4L2 video device registered as %s\n",
2583 video_device_node_name(v4l2->vdev));
2584
2585 if (v4l2->vbi_dev)
2586 em28xx_info("V4L2 VBI device registered as %s\n",
2587 video_device_node_name(v4l2->vbi_dev));
2588
2589
2590 v4l2_device_call_all(&v4l2->v4l2_dev, 0, core, s_power, 0);
2591
2592
2593 em28xx_vb2_setup(dev);
2594
2595 em28xx_info("V4L2 extension successfully initialized\n");
2596
2597 kref_get(&dev->ref);
2598
2599 mutex_unlock(&dev->lock);
2600 return 0;
2601
2602unregister_dev:
2603 v4l2_ctrl_handler_free(&v4l2->ctrl_handler);
2604 v4l2_device_unregister(&v4l2->v4l2_dev);
2605err:
2606 dev->v4l2 = NULL;
2607 kref_put(&v4l2->ref, em28xx_free_v4l2);
2608 mutex_unlock(&dev->lock);
2609 return ret;
2610}
2611
2612static struct em28xx_ops v4l2_ops = {
2613 .id = EM28XX_V4L2,
2614 .name = "Em28xx v4l2 Extension",
2615 .init = em28xx_v4l2_init,
2616 .fini = em28xx_v4l2_fini,
2617 .suspend = em28xx_v4l2_suspend,
2618 .resume = em28xx_v4l2_resume,
2619};
2620
2621static int __init em28xx_video_register(void)
2622{
2623 return em28xx_register_extension(&v4l2_ops);
2624}
2625
2626static void __exit em28xx_video_unregister(void)
2627{
2628 em28xx_unregister_extension(&v4l2_ops);
2629}
2630
2631module_init(em28xx_video_register);
2632module_exit(em28xx_video_unregister);
2633