1
2
3
4
5
6
7
8
9
10
11
12
13#include "cx231xx.h"
14#include <linux/init.h>
15#include <linux/list.h>
16#include <linux/module.h>
17#include <linux/kernel.h>
18#include <linux/bitmap.h>
19#include <linux/i2c.h>
20#include <linux/mm.h>
21#include <linux/mutex.h>
22#include <linux/slab.h>
23
24#include <media/v4l2-common.h>
25#include <media/v4l2-ioctl.h>
26#include <media/v4l2-event.h>
27#include <media/drv-intf/msp3400.h>
28#include <media/tuner.h>
29
30#include <media/dvb_frontend.h>
31
32#include "cx231xx-vbi.h"
33
34#define CX231XX_VERSION "0.0.3"
35
36#define DRIVER_AUTHOR "Srinivasa Deevi <srinivasa.deevi@conexant.com>"
37#define DRIVER_DESC "Conexant cx231xx based USB video device driver"
38
39#define cx231xx_videodbg(fmt, arg...) do {\
40 if (video_debug) \
41 printk(KERN_INFO "%s %s :"fmt, \
42 dev->name, __func__ , ##arg); } while (0)
43
44static unsigned int isoc_debug;
45module_param(isoc_debug, int, 0644);
46MODULE_PARM_DESC(isoc_debug, "enable debug messages [isoc transfers]");
47
48#define cx231xx_isocdbg(fmt, arg...) \
49do {\
50 if (isoc_debug) { \
51 printk(KERN_INFO "%s %s :"fmt, \
52 dev->name, __func__ , ##arg); \
53 } \
54 } while (0)
55
56MODULE_AUTHOR(DRIVER_AUTHOR);
57MODULE_DESCRIPTION(DRIVER_DESC);
58MODULE_LICENSE("GPL");
59MODULE_VERSION(CX231XX_VERSION);
60
61static unsigned int card[] = {[0 ... (CX231XX_MAXBOARDS - 1)] = UNSET };
62static unsigned int video_nr[] = {[0 ... (CX231XX_MAXBOARDS - 1)] = UNSET };
63static unsigned int vbi_nr[] = {[0 ... (CX231XX_MAXBOARDS - 1)] = UNSET };
64static unsigned int radio_nr[] = {[0 ... (CX231XX_MAXBOARDS - 1)] = UNSET };
65
66module_param_array(card, int, NULL, 0444);
67module_param_array(video_nr, int, NULL, 0444);
68module_param_array(vbi_nr, int, NULL, 0444);
69module_param_array(radio_nr, int, NULL, 0444);
70
71MODULE_PARM_DESC(card, "card type");
72MODULE_PARM_DESC(video_nr, "video device numbers");
73MODULE_PARM_DESC(vbi_nr, "vbi device numbers");
74MODULE_PARM_DESC(radio_nr, "radio device numbers");
75
76static unsigned int video_debug;
77module_param(video_debug, int, 0644);
78MODULE_PARM_DESC(video_debug, "enable debug messages [video]");
79
80
81static struct cx231xx_fmt format[] = {
82 {
83 .name = "16bpp YUY2, 4:2:2, packed",
84 .fourcc = V4L2_PIX_FMT_YUYV,
85 .depth = 16,
86 .reg = 0,
87 },
88};
89
90
91static int cx231xx_enable_analog_tuner(struct cx231xx *dev)
92{
93#ifdef CONFIG_MEDIA_CONTROLLER
94 struct media_device *mdev = dev->media_dev;
95 struct media_entity *entity, *decoder = NULL, *source;
96 struct media_link *link, *found_link = NULL;
97 int ret, active_links = 0;
98
99 if (!mdev)
100 return 0;
101
102
103
104
105
106
107
108
109 media_device_for_each_entity(entity, mdev) {
110 if (entity->function == MEDIA_ENT_F_ATV_DECODER) {
111 decoder = entity;
112 break;
113 }
114 }
115 if (!decoder)
116 return 0;
117
118 list_for_each_entry(link, &decoder->links, list) {
119 if (link->sink->entity == decoder) {
120 found_link = link;
121 if (link->flags & MEDIA_LNK_FL_ENABLED)
122 active_links++;
123 break;
124 }
125 }
126
127 if (active_links == 1 || !found_link)
128 return 0;
129
130 source = found_link->source->entity;
131 list_for_each_entry(link, &source->links, list) {
132 struct media_entity *sink;
133 int flags = 0;
134
135 sink = link->sink->entity;
136
137 if (sink == entity)
138 flags = MEDIA_LNK_FL_ENABLED;
139
140 ret = media_entity_setup_link(link, flags);
141 if (ret) {
142 dev_err(dev->dev,
143 "Couldn't change link %s->%s to %s. Error %d\n",
144 source->name, sink->name,
145 flags ? "enabled" : "disabled",
146 ret);
147 return ret;
148 } else
149 dev_dbg(dev->dev,
150 "link %s->%s was %s\n",
151 source->name, sink->name,
152 flags ? "ENABLED" : "disabled");
153 }
154#endif
155 return 0;
156}
157
158
159
160
161
162
163
164
165static inline void buffer_filled(struct cx231xx *dev,
166 struct cx231xx_dmaqueue *dma_q,
167 struct cx231xx_buffer *buf)
168{
169
170 cx231xx_isocdbg("[%p/%d] wakeup\n", buf, buf->vb.i);
171 buf->vb.state = VIDEOBUF_DONE;
172 buf->vb.field_count++;
173 buf->vb.ts = ktime_get_ns();
174
175 if (dev->USE_ISO)
176 dev->video_mode.isoc_ctl.buf = NULL;
177 else
178 dev->video_mode.bulk_ctl.buf = NULL;
179
180 list_del(&buf->vb.queue);
181 wake_up(&buf->vb.done);
182}
183
184static inline void print_err_status(struct cx231xx *dev, int packet, int status)
185{
186 char *errmsg = "Unknown";
187
188 switch (status) {
189 case -ENOENT:
190 errmsg = "unlinked synchronously";
191 break;
192 case -ECONNRESET:
193 errmsg = "unlinked asynchronously";
194 break;
195 case -ENOSR:
196 errmsg = "Buffer error (overrun)";
197 break;
198 case -EPIPE:
199 errmsg = "Stalled (device not responding)";
200 break;
201 case -EOVERFLOW:
202 errmsg = "Babble (bad cable?)";
203 break;
204 case -EPROTO:
205 errmsg = "Bit-stuff error (bad cable?)";
206 break;
207 case -EILSEQ:
208 errmsg = "CRC/Timeout (could be anything)";
209 break;
210 case -ETIME:
211 errmsg = "Device does not respond";
212 break;
213 }
214 if (packet < 0) {
215 cx231xx_isocdbg("URB status %d [%s].\n", status, errmsg);
216 } else {
217 cx231xx_isocdbg("URB packet %d, status %d [%s].\n",
218 packet, status, errmsg);
219 }
220}
221
222
223
224
225static inline void get_next_buf(struct cx231xx_dmaqueue *dma_q,
226 struct cx231xx_buffer **buf)
227{
228 struct cx231xx_video_mode *vmode =
229 container_of(dma_q, struct cx231xx_video_mode, vidq);
230 struct cx231xx *dev = container_of(vmode, struct cx231xx, video_mode);
231
232 char *outp;
233
234 if (list_empty(&dma_q->active)) {
235 cx231xx_isocdbg("No active queue to serve\n");
236 if (dev->USE_ISO)
237 dev->video_mode.isoc_ctl.buf = NULL;
238 else
239 dev->video_mode.bulk_ctl.buf = NULL;
240 *buf = NULL;
241 return;
242 }
243
244
245 *buf = list_entry(dma_q->active.next, struct cx231xx_buffer, vb.queue);
246
247
248 outp = videobuf_to_vmalloc(&(*buf)->vb);
249 memset(outp, 0, (*buf)->vb.size);
250
251 if (dev->USE_ISO)
252 dev->video_mode.isoc_ctl.buf = *buf;
253 else
254 dev->video_mode.bulk_ctl.buf = *buf;
255
256 return;
257}
258
259
260
261
262static inline int cx231xx_isoc_copy(struct cx231xx *dev, struct urb *urb)
263{
264 struct cx231xx_dmaqueue *dma_q = urb->context;
265 int i;
266 unsigned char *p_buffer;
267 u32 bytes_parsed = 0, buffer_size = 0;
268 u8 sav_eav = 0;
269
270 if (!dev)
271 return 0;
272
273 if (dev->state & DEV_DISCONNECTED)
274 return 0;
275
276 if (urb->status < 0) {
277 print_err_status(dev, -1, urb->status);
278 if (urb->status == -ENOENT)
279 return 0;
280 }
281
282 for (i = 0; i < urb->number_of_packets; i++) {
283 int status = urb->iso_frame_desc[i].status;
284
285 if (status < 0) {
286 print_err_status(dev, i, status);
287 if (urb->iso_frame_desc[i].status != -EPROTO)
288 continue;
289 }
290
291 if (urb->iso_frame_desc[i].actual_length <= 0) {
292
293 continue;
294 }
295 if (urb->iso_frame_desc[i].actual_length >
296 dev->video_mode.max_pkt_size) {
297 cx231xx_isocdbg("packet bigger than packet size");
298 continue;
299 }
300
301
302 p_buffer = urb->transfer_buffer + urb->iso_frame_desc[i].offset;
303 buffer_size = urb->iso_frame_desc[i].actual_length;
304 bytes_parsed = 0;
305
306 if (dma_q->is_partial_line) {
307
308 sav_eav = dma_q->last_sav;
309 } else {
310
311
312 sav_eav =
313 cx231xx_find_boundary_SAV_EAV(p_buffer,
314 dma_q->partial_buf,
315 &bytes_parsed);
316 }
317
318 sav_eav &= 0xF0;
319
320
321 if (sav_eav) {
322 bytes_parsed += cx231xx_get_video_line(dev, dma_q,
323 sav_eav,
324 p_buffer + bytes_parsed,
325 buffer_size - bytes_parsed);
326 }
327
328
329
330
331 while (bytes_parsed < buffer_size) {
332 u32 bytes_used = 0;
333
334 sav_eav = cx231xx_find_next_SAV_EAV(
335 p_buffer + bytes_parsed,
336 buffer_size - bytes_parsed,
337 &bytes_used);
338
339 bytes_parsed += bytes_used;
340
341 sav_eav &= 0xF0;
342 if (sav_eav && (bytes_parsed < buffer_size)) {
343 bytes_parsed += cx231xx_get_video_line(dev,
344 dma_q, sav_eav,
345 p_buffer + bytes_parsed,
346 buffer_size - bytes_parsed);
347 }
348 }
349
350
351
352 memcpy(dma_q->partial_buf, p_buffer + buffer_size - 4, 4);
353 bytes_parsed = 0;
354
355 }
356 return 1;
357}
358
359static inline int cx231xx_bulk_copy(struct cx231xx *dev, struct urb *urb)
360{
361 struct cx231xx_dmaqueue *dma_q = urb->context;
362 unsigned char *p_buffer;
363 u32 bytes_parsed = 0, buffer_size = 0;
364 u8 sav_eav = 0;
365
366 if (!dev)
367 return 0;
368
369 if (dev->state & DEV_DISCONNECTED)
370 return 0;
371
372 if (urb->status < 0) {
373 print_err_status(dev, -1, urb->status);
374 if (urb->status == -ENOENT)
375 return 0;
376 }
377
378 if (1) {
379
380
381 p_buffer = urb->transfer_buffer;
382 buffer_size = urb->actual_length;
383 bytes_parsed = 0;
384
385 if (dma_q->is_partial_line) {
386
387 sav_eav = dma_q->last_sav;
388 } else {
389
390
391 sav_eav =
392 cx231xx_find_boundary_SAV_EAV(p_buffer,
393 dma_q->partial_buf,
394 &bytes_parsed);
395 }
396
397 sav_eav &= 0xF0;
398
399
400 if (sav_eav) {
401 bytes_parsed += cx231xx_get_video_line(dev, dma_q,
402 sav_eav,
403 p_buffer + bytes_parsed,
404 buffer_size - bytes_parsed);
405 }
406
407
408
409
410 while (bytes_parsed < buffer_size) {
411 u32 bytes_used = 0;
412
413 sav_eav = cx231xx_find_next_SAV_EAV(
414 p_buffer + bytes_parsed,
415 buffer_size - bytes_parsed,
416 &bytes_used);
417
418 bytes_parsed += bytes_used;
419
420 sav_eav &= 0xF0;
421 if (sav_eav && (bytes_parsed < buffer_size)) {
422 bytes_parsed += cx231xx_get_video_line(dev,
423 dma_q, sav_eav,
424 p_buffer + bytes_parsed,
425 buffer_size - bytes_parsed);
426 }
427 }
428
429
430
431 memcpy(dma_q->partial_buf, p_buffer + buffer_size - 4, 4);
432 bytes_parsed = 0;
433
434 }
435 return 1;
436}
437
438
439u8 cx231xx_find_boundary_SAV_EAV(u8 *p_buffer, u8 *partial_buf,
440 u32 *p_bytes_used)
441{
442 u32 bytes_used;
443 u8 boundary_bytes[8];
444 u8 sav_eav = 0;
445
446 *p_bytes_used = 0;
447
448
449
450
451 memcpy(boundary_bytes, partial_buf, 4);
452 memcpy(boundary_bytes + 4, p_buffer, 4);
453
454
455 sav_eav = cx231xx_find_next_SAV_EAV((u8 *)&boundary_bytes, 8,
456 &bytes_used);
457
458 if (sav_eav) {
459
460
461 *p_bytes_used = bytes_used - 4;
462 }
463
464 return sav_eav;
465}
466
467u8 cx231xx_find_next_SAV_EAV(u8 *p_buffer, u32 buffer_size, u32 *p_bytes_used)
468{
469 u32 i;
470 u8 sav_eav = 0;
471
472
473
474
475
476
477 if (buffer_size < 4) {
478 *p_bytes_used = buffer_size;
479 return 0;
480 }
481
482 for (i = 0; i < (buffer_size - 3); i++) {
483
484 if ((p_buffer[i] == 0xFF) &&
485 (p_buffer[i + 1] == 0x00) && (p_buffer[i + 2] == 0x00)) {
486
487 *p_bytes_used = i + 4;
488 sav_eav = p_buffer[i + 3];
489 return sav_eav;
490 }
491 }
492
493 *p_bytes_used = buffer_size;
494 return 0;
495}
496
497u32 cx231xx_get_video_line(struct cx231xx *dev,
498 struct cx231xx_dmaqueue *dma_q, u8 sav_eav,
499 u8 *p_buffer, u32 buffer_size)
500{
501 u32 bytes_copied = 0;
502 int current_field = -1;
503
504 switch (sav_eav) {
505 case SAV_ACTIVE_VIDEO_FIELD1:
506
507
508
509 if ((buffer_size > 3) && (p_buffer[0] == 0xFF) &&
510 (p_buffer[1] == 0x00) && (p_buffer[2] == 0x00) &&
511 ((p_buffer[3] == EAV_ACTIVE_VIDEO_FIELD1) ||
512 (p_buffer[3] == EAV_ACTIVE_VIDEO_FIELD2) ||
513 (p_buffer[3] == EAV_VBLANK_FIELD1) ||
514 (p_buffer[3] == EAV_VBLANK_FIELD2)))
515 return bytes_copied;
516 current_field = 1;
517 break;
518
519 case SAV_ACTIVE_VIDEO_FIELD2:
520
521
522
523 if ((buffer_size > 3) && (p_buffer[0] == 0xFF) &&
524 (p_buffer[1] == 0x00) && (p_buffer[2] == 0x00) &&
525 ((p_buffer[3] == EAV_ACTIVE_VIDEO_FIELD1) ||
526 (p_buffer[3] == EAV_ACTIVE_VIDEO_FIELD2) ||
527 (p_buffer[3] == EAV_VBLANK_FIELD1) ||
528 (p_buffer[3] == EAV_VBLANK_FIELD2)))
529 return bytes_copied;
530 current_field = 2;
531 break;
532 }
533
534 dma_q->last_sav = sav_eav;
535
536 bytes_copied = cx231xx_copy_video_line(dev, dma_q, p_buffer,
537 buffer_size, current_field);
538
539 return bytes_copied;
540}
541
542u32 cx231xx_copy_video_line(struct cx231xx *dev,
543 struct cx231xx_dmaqueue *dma_q, u8 *p_line,
544 u32 length, int field_number)
545{
546 u32 bytes_to_copy;
547 struct cx231xx_buffer *buf;
548 u32 _line_size = dev->width * 2;
549
550 if (dma_q->current_field != field_number)
551 cx231xx_reset_video_buffer(dev, dma_q);
552
553
554 if (dev->USE_ISO)
555 buf = dev->video_mode.isoc_ctl.buf;
556 else
557 buf = dev->video_mode.bulk_ctl.buf;
558
559
560 dma_q->current_field = field_number;
561
562 bytes_to_copy = dma_q->bytes_left_in_line;
563 if (bytes_to_copy > length)
564 bytes_to_copy = length;
565
566 if (dma_q->lines_completed >= dma_q->lines_per_field) {
567 dma_q->bytes_left_in_line -= bytes_to_copy;
568 dma_q->is_partial_line = (dma_q->bytes_left_in_line == 0) ?
569 0 : 1;
570 return 0;
571 }
572
573 dma_q->is_partial_line = 1;
574
575
576
577 if (!buf) {
578 dma_q->bytes_left_in_line -= bytes_to_copy;
579 dma_q->is_partial_line = (dma_q->bytes_left_in_line == 0)
580 ? 0 : 1;
581 return bytes_to_copy;
582 }
583
584
585 cx231xx_do_copy(dev, dma_q, p_line, bytes_to_copy);
586
587 dma_q->pos += bytes_to_copy;
588 dma_q->bytes_left_in_line -= bytes_to_copy;
589
590 if (dma_q->bytes_left_in_line == 0) {
591 dma_q->bytes_left_in_line = _line_size;
592 dma_q->lines_completed++;
593 dma_q->is_partial_line = 0;
594
595 if (cx231xx_is_buffer_done(dev, dma_q) && buf) {
596 buffer_filled(dev, dma_q, buf);
597
598 dma_q->pos = 0;
599 buf = NULL;
600 dma_q->lines_completed = 0;
601 }
602 }
603
604 return bytes_to_copy;
605}
606
607void cx231xx_reset_video_buffer(struct cx231xx *dev,
608 struct cx231xx_dmaqueue *dma_q)
609{
610 struct cx231xx_buffer *buf;
611
612
613 if (dma_q->current_field == 1) {
614 if (dma_q->lines_completed >= dma_q->lines_per_field)
615 dma_q->field1_done = 1;
616 else
617 dma_q->field1_done = 0;
618 }
619
620 if (dev->USE_ISO)
621 buf = dev->video_mode.isoc_ctl.buf;
622 else
623 buf = dev->video_mode.bulk_ctl.buf;
624
625 if (buf == NULL) {
626
627 get_next_buf(dma_q, &buf);
628
629 dma_q->pos = 0;
630 dma_q->field1_done = 0;
631 dma_q->current_field = -1;
632 }
633
634
635 dma_q->bytes_left_in_line = dev->width << 1;
636 dma_q->lines_completed = 0;
637}
638
639int cx231xx_do_copy(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
640 u8 *p_buffer, u32 bytes_to_copy)
641{
642 u8 *p_out_buffer = NULL;
643 u32 current_line_bytes_copied = 0;
644 struct cx231xx_buffer *buf;
645 u32 _line_size = dev->width << 1;
646 void *startwrite;
647 int offset, lencopy;
648
649 if (dev->USE_ISO)
650 buf = dev->video_mode.isoc_ctl.buf;
651 else
652 buf = dev->video_mode.bulk_ctl.buf;
653
654 if (buf == NULL)
655 return -1;
656
657 p_out_buffer = videobuf_to_vmalloc(&buf->vb);
658
659 current_line_bytes_copied = _line_size - dma_q->bytes_left_in_line;
660
661
662 offset = (dma_q->current_field == 1) ? 0 : _line_size;
663
664
665 startwrite = p_out_buffer + offset;
666
667
668 startwrite += (dma_q->lines_completed * _line_size * 2);
669
670
671 startwrite += current_line_bytes_copied;
672
673 lencopy = dma_q->bytes_left_in_line > bytes_to_copy ?
674 bytes_to_copy : dma_q->bytes_left_in_line;
675
676 if ((u8 *)(startwrite + lencopy) > (u8 *)(p_out_buffer + buf->vb.size))
677 return 0;
678
679
680 cx231xx_swab((u16 *) p_buffer, (u16 *) startwrite, (u16) lencopy);
681
682 return 0;
683}
684
685void cx231xx_swab(u16 *from, u16 *to, u16 len)
686{
687 u16 i;
688
689 if (len <= 0)
690 return;
691
692 for (i = 0; i < len / 2; i++)
693 to[i] = (from[i] << 8) | (from[i] >> 8);
694}
695
696u8 cx231xx_is_buffer_done(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q)
697{
698 u8 buffer_complete = 0;
699
700
701 buffer_complete = ((dma_q->current_field == 2) &&
702 (dma_q->lines_completed >= dma_q->lines_per_field) &&
703 dma_q->field1_done);
704
705 return buffer_complete;
706}
707
708
709
710
711
712static int
713buffer_setup(struct videobuf_queue *vq, unsigned int *count, unsigned int *size)
714{
715 struct cx231xx_fh *fh = vq->priv_data;
716 struct cx231xx *dev = fh->dev;
717
718 *size = (fh->dev->width * fh->dev->height * dev->format->depth + 7)>>3;
719 if (0 == *count)
720 *count = CX231XX_DEF_BUF;
721
722 if (*count < CX231XX_MIN_BUF)
723 *count = CX231XX_MIN_BUF;
724
725
726 cx231xx_enable_analog_tuner(dev);
727
728 return 0;
729}
730
731
732static void free_buffer(struct videobuf_queue *vq, struct cx231xx_buffer *buf)
733{
734 struct cx231xx_fh *fh = vq->priv_data;
735 struct cx231xx *dev = fh->dev;
736 unsigned long flags = 0;
737
738 BUG_ON(in_interrupt());
739
740
741
742
743
744
745
746
747
748
749 spin_lock_irqsave(&dev->video_mode.slock, flags);
750 if (dev->USE_ISO) {
751 if (dev->video_mode.isoc_ctl.buf == buf)
752 dev->video_mode.isoc_ctl.buf = NULL;
753 } else {
754 if (dev->video_mode.bulk_ctl.buf == buf)
755 dev->video_mode.bulk_ctl.buf = NULL;
756 }
757 spin_unlock_irqrestore(&dev->video_mode.slock, flags);
758
759 videobuf_vmalloc_free(&buf->vb);
760 buf->vb.state = VIDEOBUF_NEEDS_INIT;
761}
762
763static int
764buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
765 enum v4l2_field field)
766{
767 struct cx231xx_fh *fh = vq->priv_data;
768 struct cx231xx_buffer *buf =
769 container_of(vb, struct cx231xx_buffer, vb);
770 struct cx231xx *dev = fh->dev;
771 int rc = 0, urb_init = 0;
772
773
774 buf->vb.size = (fh->dev->width * fh->dev->height * dev->format->depth
775 + 7) >> 3;
776 if (0 != buf->vb.baddr && buf->vb.bsize < buf->vb.size)
777 return -EINVAL;
778
779 buf->vb.width = dev->width;
780 buf->vb.height = dev->height;
781 buf->vb.field = field;
782
783 if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
784 rc = videobuf_iolock(vq, &buf->vb, NULL);
785 if (rc < 0)
786 goto fail;
787 }
788
789 if (dev->USE_ISO) {
790 if (!dev->video_mode.isoc_ctl.num_bufs)
791 urb_init = 1;
792 } else {
793 if (!dev->video_mode.bulk_ctl.num_bufs)
794 urb_init = 1;
795 }
796 dev_dbg(dev->dev,
797 "urb_init=%d dev->video_mode.max_pkt_size=%d\n",
798 urb_init, dev->video_mode.max_pkt_size);
799 if (urb_init) {
800 dev->mode_tv = 0;
801 if (dev->USE_ISO)
802 rc = cx231xx_init_isoc(dev, CX231XX_NUM_PACKETS,
803 CX231XX_NUM_BUFS,
804 dev->video_mode.max_pkt_size,
805 cx231xx_isoc_copy);
806 else
807 rc = cx231xx_init_bulk(dev, CX231XX_NUM_PACKETS,
808 CX231XX_NUM_BUFS,
809 dev->video_mode.max_pkt_size,
810 cx231xx_bulk_copy);
811 if (rc < 0)
812 goto fail;
813 }
814
815 buf->vb.state = VIDEOBUF_PREPARED;
816
817 return 0;
818
819fail:
820 free_buffer(vq, buf);
821 return rc;
822}
823
824static void buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
825{
826 struct cx231xx_buffer *buf =
827 container_of(vb, struct cx231xx_buffer, vb);
828 struct cx231xx_fh *fh = vq->priv_data;
829 struct cx231xx *dev = fh->dev;
830 struct cx231xx_dmaqueue *vidq = &dev->video_mode.vidq;
831
832 buf->vb.state = VIDEOBUF_QUEUED;
833 list_add_tail(&buf->vb.queue, &vidq->active);
834
835}
836
837static void buffer_release(struct videobuf_queue *vq,
838 struct videobuf_buffer *vb)
839{
840 struct cx231xx_buffer *buf =
841 container_of(vb, struct cx231xx_buffer, vb);
842 struct cx231xx_fh *fh = vq->priv_data;
843 struct cx231xx *dev = (struct cx231xx *)fh->dev;
844
845 cx231xx_isocdbg("cx231xx: called buffer_release\n");
846
847 free_buffer(vq, buf);
848}
849
850static const struct videobuf_queue_ops cx231xx_video_qops = {
851 .buf_setup = buffer_setup,
852 .buf_prepare = buffer_prepare,
853 .buf_queue = buffer_queue,
854 .buf_release = buffer_release,
855};
856
857
858
859void video_mux(struct cx231xx *dev, int index)
860{
861 dev->video_input = index;
862 dev->ctl_ainput = INPUT(index)->amux;
863
864 cx231xx_set_video_input_mux(dev, index);
865
866 cx25840_call(dev, video, s_routing, INPUT(index)->vmux, 0, 0);
867
868 cx231xx_set_audio_input(dev, dev->ctl_ainput);
869
870 dev_dbg(dev->dev, "video_mux : %d\n", index);
871
872
873 cx231xx_do_mode_ctrl_overrides(dev);
874}
875
876
877static int res_get(struct cx231xx_fh *fh)
878{
879 struct cx231xx *dev = fh->dev;
880 int rc = 0;
881
882
883 if (fh->stream_on)
884 return rc;
885
886 if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
887 if (dev->stream_on)
888 return -EBUSY;
889 dev->stream_on = 1;
890 } else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
891 if (dev->vbi_stream_on)
892 return -EBUSY;
893 dev->vbi_stream_on = 1;
894 } else
895 return -EINVAL;
896
897 fh->stream_on = 1;
898
899 return rc;
900}
901
902static int res_check(struct cx231xx_fh *fh)
903{
904 return fh->stream_on;
905}
906
907static void res_free(struct cx231xx_fh *fh)
908{
909 struct cx231xx *dev = fh->dev;
910
911 fh->stream_on = 0;
912
913 if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
914 dev->stream_on = 0;
915 if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
916 dev->vbi_stream_on = 0;
917}
918
919static int check_dev(struct cx231xx *dev)
920{
921 if (dev->state & DEV_DISCONNECTED) {
922 dev_err(dev->dev, "v4l2 ioctl: device not present\n");
923 return -ENODEV;
924 }
925 return 0;
926}
927
928
929
930
931
932static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
933 struct v4l2_format *f)
934{
935 struct cx231xx_fh *fh = priv;
936 struct cx231xx *dev = fh->dev;
937
938 f->fmt.pix.width = dev->width;
939 f->fmt.pix.height = dev->height;
940 f->fmt.pix.pixelformat = dev->format->fourcc;
941 f->fmt.pix.bytesperline = (dev->width * dev->format->depth + 7) >> 3;
942 f->fmt.pix.sizeimage = f->fmt.pix.bytesperline * dev->height;
943 f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
944
945 f->fmt.pix.field = V4L2_FIELD_INTERLACED;
946
947 return 0;
948}
949
950static struct cx231xx_fmt *format_by_fourcc(unsigned int fourcc)
951{
952 unsigned int i;
953
954 for (i = 0; i < ARRAY_SIZE(format); i++)
955 if (format[i].fourcc == fourcc)
956 return &format[i];
957
958 return NULL;
959}
960
961static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
962 struct v4l2_format *f)
963{
964 struct cx231xx_fh *fh = priv;
965 struct cx231xx *dev = fh->dev;
966 unsigned int width = f->fmt.pix.width;
967 unsigned int height = f->fmt.pix.height;
968 unsigned int maxw = norm_maxw(dev);
969 unsigned int maxh = norm_maxh(dev);
970 struct cx231xx_fmt *fmt;
971
972 fmt = format_by_fourcc(f->fmt.pix.pixelformat);
973 if (!fmt) {
974 cx231xx_videodbg("Fourcc format (%08x) invalid.\n",
975 f->fmt.pix.pixelformat);
976 return -EINVAL;
977 }
978
979
980
981 v4l_bound_align_image(&width, 48, maxw, 1, &height, 32, maxh, 1, 0);
982
983 f->fmt.pix.width = width;
984 f->fmt.pix.height = height;
985 f->fmt.pix.pixelformat = fmt->fourcc;
986 f->fmt.pix.bytesperline = (width * fmt->depth + 7) >> 3;
987 f->fmt.pix.sizeimage = f->fmt.pix.bytesperline * height;
988 f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
989 f->fmt.pix.field = V4L2_FIELD_INTERLACED;
990
991 return 0;
992}
993
994static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
995 struct v4l2_format *f)
996{
997 struct cx231xx_fh *fh = priv;
998 struct cx231xx *dev = fh->dev;
999 int rc;
1000 struct cx231xx_fmt *fmt;
1001 struct v4l2_subdev_format format = {
1002 .which = V4L2_SUBDEV_FORMAT_ACTIVE,
1003 };
1004
1005 rc = check_dev(dev);
1006 if (rc < 0)
1007 return rc;
1008
1009 vidioc_try_fmt_vid_cap(file, priv, f);
1010
1011 fmt = format_by_fourcc(f->fmt.pix.pixelformat);
1012 if (!fmt)
1013 return -EINVAL;
1014
1015 if (videobuf_queue_is_busy(&fh->vb_vidq)) {
1016 dev_err(dev->dev, "%s: queue busy\n", __func__);
1017 return -EBUSY;
1018 }
1019
1020 if (dev->stream_on && !fh->stream_on) {
1021 dev_err(dev->dev,
1022 "%s: device in use by another fh\n", __func__);
1023 return -EBUSY;
1024 }
1025
1026
1027 dev->width = f->fmt.pix.width;
1028 dev->height = f->fmt.pix.height;
1029 dev->format = fmt;
1030
1031 v4l2_fill_mbus_format(&format.format, &f->fmt.pix, MEDIA_BUS_FMT_FIXED);
1032 call_all(dev, pad, set_fmt, NULL, &format);
1033 v4l2_fill_pix_format(&f->fmt.pix, &format.format);
1034
1035 return rc;
1036}
1037
1038static int vidioc_g_std(struct file *file, void *priv, v4l2_std_id *id)
1039{
1040 struct cx231xx_fh *fh = priv;
1041 struct cx231xx *dev = fh->dev;
1042
1043 *id = dev->norm;
1044 return 0;
1045}
1046
1047static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id norm)
1048{
1049 struct cx231xx_fh *fh = priv;
1050 struct cx231xx *dev = fh->dev;
1051 struct v4l2_subdev_format format = {
1052 .which = V4L2_SUBDEV_FORMAT_ACTIVE,
1053 };
1054 int rc;
1055
1056 rc = check_dev(dev);
1057 if (rc < 0)
1058 return rc;
1059
1060 if (dev->norm == norm)
1061 return 0;
1062
1063 if (videobuf_queue_is_busy(&fh->vb_vidq))
1064 return -EBUSY;
1065
1066 dev->norm = norm;
1067
1068
1069 dev->width = 720;
1070 dev->height = (dev->norm & V4L2_STD_625_50) ? 576 : 480;
1071
1072 call_all(dev, video, s_std, dev->norm);
1073
1074
1075
1076
1077 format.format.code = MEDIA_BUS_FMT_FIXED;
1078 format.format.width = dev->width;
1079 format.format.height = dev->height;
1080 call_all(dev, pad, set_fmt, NULL, &format);
1081
1082
1083 cx231xx_do_mode_ctrl_overrides(dev);
1084
1085 return 0;
1086}
1087
1088static const char *iname[] = {
1089 [CX231XX_VMUX_COMPOSITE1] = "Composite1",
1090 [CX231XX_VMUX_SVIDEO] = "S-Video",
1091 [CX231XX_VMUX_TELEVISION] = "Television",
1092 [CX231XX_VMUX_CABLE] = "Cable TV",
1093 [CX231XX_VMUX_DVB] = "DVB",
1094};
1095
1096void cx231xx_v4l2_create_entities(struct cx231xx *dev)
1097{
1098#if defined(CONFIG_MEDIA_CONTROLLER)
1099 int ret, i;
1100
1101
1102 for (i = 0; i < MAX_CX231XX_INPUT; i++) {
1103 struct media_entity *ent = &dev->input_ent[i];
1104
1105 if (!INPUT(i)->type)
1106 break;
1107
1108 ent->name = iname[INPUT(i)->type];
1109 ent->flags = MEDIA_ENT_FL_CONNECTOR;
1110 dev->input_pad[i].flags = MEDIA_PAD_FL_SOURCE;
1111
1112 switch (INPUT(i)->type) {
1113 case CX231XX_VMUX_COMPOSITE1:
1114 ent->function = MEDIA_ENT_F_CONN_COMPOSITE;
1115 break;
1116 case CX231XX_VMUX_SVIDEO:
1117 ent->function = MEDIA_ENT_F_CONN_SVIDEO;
1118 break;
1119 case CX231XX_VMUX_TELEVISION:
1120 case CX231XX_VMUX_CABLE:
1121 case CX231XX_VMUX_DVB:
1122
1123 if (dev->tuner_type == TUNER_ABSENT)
1124 continue;
1125
1126 default:
1127 ent->function = MEDIA_ENT_F_CONN_RF;
1128 break;
1129 }
1130
1131 ret = media_entity_pads_init(ent, 1, &dev->input_pad[i]);
1132 if (ret < 0)
1133 pr_err("failed to initialize input pad[%d]!\n", i);
1134
1135 ret = media_device_register_entity(dev->media_dev, ent);
1136 if (ret < 0)
1137 pr_err("failed to register input entity %d!\n", i);
1138 }
1139#endif
1140}
1141
1142int cx231xx_enum_input(struct file *file, void *priv,
1143 struct v4l2_input *i)
1144{
1145 struct cx231xx_fh *fh = priv;
1146 struct cx231xx *dev = fh->dev;
1147 u32 gen_stat;
1148 unsigned int n;
1149 int ret;
1150
1151 n = i->index;
1152 if (n >= MAX_CX231XX_INPUT)
1153 return -EINVAL;
1154 if (0 == INPUT(n)->type)
1155 return -EINVAL;
1156
1157 i->index = n;
1158 i->type = V4L2_INPUT_TYPE_CAMERA;
1159
1160 strscpy(i->name, iname[INPUT(n)->type], sizeof(i->name));
1161
1162 if ((CX231XX_VMUX_TELEVISION == INPUT(n)->type) ||
1163 (CX231XX_VMUX_CABLE == INPUT(n)->type))
1164 i->type = V4L2_INPUT_TYPE_TUNER;
1165
1166 i->std = dev->vdev.tvnorms;
1167
1168
1169 if (n == dev->video_input) {
1170 ret = cx231xx_read_i2c_data(dev, VID_BLK_I2C_ADDRESS,
1171 GEN_STAT, 2, &gen_stat, 4);
1172 if (ret > 0) {
1173 if ((gen_stat & FLD_VPRES) == 0x00)
1174 i->status |= V4L2_IN_ST_NO_SIGNAL;
1175 if ((gen_stat & FLD_HLOCK) == 0x00)
1176 i->status |= V4L2_IN_ST_NO_H_LOCK;
1177 }
1178 }
1179
1180 return 0;
1181}
1182
1183int cx231xx_g_input(struct file *file, void *priv, unsigned int *i)
1184{
1185 struct cx231xx_fh *fh = priv;
1186 struct cx231xx *dev = fh->dev;
1187
1188 *i = dev->video_input;
1189
1190 return 0;
1191}
1192
1193int cx231xx_s_input(struct file *file, void *priv, unsigned int i)
1194{
1195 struct cx231xx_fh *fh = priv;
1196 struct cx231xx *dev = fh->dev;
1197 int rc;
1198
1199 dev->mode_tv = 0;
1200 rc = check_dev(dev);
1201 if (rc < 0)
1202 return rc;
1203
1204 if (i >= MAX_CX231XX_INPUT)
1205 return -EINVAL;
1206 if (0 == INPUT(i)->type)
1207 return -EINVAL;
1208
1209 video_mux(dev, i);
1210
1211 if (INPUT(i)->type == CX231XX_VMUX_TELEVISION ||
1212 INPUT(i)->type == CX231XX_VMUX_CABLE) {
1213
1214
1215
1216 call_all(dev, video, s_std, dev->norm);
1217 }
1218
1219 return 0;
1220}
1221
1222int cx231xx_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t)
1223{
1224 struct cx231xx_fh *fh = priv;
1225 struct cx231xx *dev = fh->dev;
1226 int rc;
1227
1228 rc = check_dev(dev);
1229 if (rc < 0)
1230 return rc;
1231
1232 if (0 != t->index)
1233 return -EINVAL;
1234
1235 strscpy(t->name, "Tuner", sizeof(t->name));
1236
1237 t->type = V4L2_TUNER_ANALOG_TV;
1238 t->capability = V4L2_TUNER_CAP_NORM;
1239 t->rangehigh = 0xffffffffUL;
1240 t->signal = 0xffff;
1241 call_all(dev, tuner, g_tuner, t);
1242
1243 return 0;
1244}
1245
1246int cx231xx_s_tuner(struct file *file, void *priv, const struct v4l2_tuner *t)
1247{
1248 struct cx231xx_fh *fh = priv;
1249 struct cx231xx *dev = fh->dev;
1250 int rc;
1251
1252 rc = check_dev(dev);
1253 if (rc < 0)
1254 return rc;
1255
1256 if (0 != t->index)
1257 return -EINVAL;
1258#if 0
1259 call_all(dev, tuner, s_tuner, t);
1260#endif
1261 return 0;
1262}
1263
1264int cx231xx_g_frequency(struct file *file, void *priv,
1265 struct v4l2_frequency *f)
1266{
1267 struct cx231xx_fh *fh = priv;
1268 struct cx231xx *dev = fh->dev;
1269
1270 if (f->tuner)
1271 return -EINVAL;
1272
1273 f->frequency = dev->ctl_freq;
1274
1275 return 0;
1276}
1277
1278int cx231xx_s_frequency(struct file *file, void *priv,
1279 const struct v4l2_frequency *f)
1280{
1281 struct cx231xx_fh *fh = priv;
1282 struct cx231xx *dev = fh->dev;
1283 struct v4l2_frequency new_freq = *f;
1284 int rc;
1285 u32 if_frequency = 5400000;
1286
1287 dev_dbg(dev->dev,
1288 "Enter vidioc_s_frequency()f->frequency=%d;f->type=%d\n",
1289 f->frequency, f->type);
1290
1291 rc = check_dev(dev);
1292 if (rc < 0)
1293 return rc;
1294
1295 if (0 != f->tuner)
1296 return -EINVAL;
1297
1298
1299 rc = cx231xx_tuner_pre_channel_change(dev);
1300
1301 call_all(dev, tuner, s_frequency, f);
1302 call_all(dev, tuner, g_frequency, &new_freq);
1303 dev->ctl_freq = new_freq.frequency;
1304
1305
1306 rc = cx231xx_tuner_post_channel_change(dev);
1307
1308 if (dev->tuner_type == TUNER_NXP_TDA18271) {
1309 if (dev->norm & (V4L2_STD_MN | V4L2_STD_NTSC_443))
1310 if_frequency = 5400000;
1311 else if (dev->norm & V4L2_STD_B)
1312 if_frequency = 6000000;
1313 else if (dev->norm & (V4L2_STD_PAL_DK | V4L2_STD_SECAM_DK))
1314 if_frequency = 6900000;
1315 else if (dev->norm & V4L2_STD_GH)
1316 if_frequency = 7100000;
1317 else if (dev->norm & V4L2_STD_PAL_I)
1318 if_frequency = 7250000;
1319 else if (dev->norm & V4L2_STD_SECAM_L)
1320 if_frequency = 6900000;
1321 else if (dev->norm & V4L2_STD_SECAM_LC)
1322 if_frequency = 1250000;
1323
1324 dev_dbg(dev->dev,
1325 "if_frequency is set to %d\n", if_frequency);
1326 cx231xx_set_Colibri_For_LowIF(dev, if_frequency, 1, 1);
1327
1328 update_HH_register_after_set_DIF(dev);
1329 }
1330
1331 dev_dbg(dev->dev, "Set New FREQUENCY to %d\n", f->frequency);
1332
1333 return rc;
1334}
1335
1336#ifdef CONFIG_VIDEO_ADV_DEBUG
1337
1338int cx231xx_g_chip_info(struct file *file, void *fh,
1339 struct v4l2_dbg_chip_info *chip)
1340{
1341 switch (chip->match.addr) {
1342 case 0:
1343 return 0;
1344 case 1:
1345 strscpy(chip->name, "AFE (byte)", sizeof(chip->name));
1346 return 0;
1347 case 2:
1348 strscpy(chip->name, "Video (byte)", sizeof(chip->name));
1349 return 0;
1350 case 3:
1351 strscpy(chip->name, "I2S (byte)", sizeof(chip->name));
1352 return 0;
1353 case 4:
1354 strscpy(chip->name, "AFE (dword)", sizeof(chip->name));
1355 return 0;
1356 case 5:
1357 strscpy(chip->name, "Video (dword)", sizeof(chip->name));
1358 return 0;
1359 case 6:
1360 strscpy(chip->name, "I2S (dword)", sizeof(chip->name));
1361 return 0;
1362 }
1363 return -EINVAL;
1364}
1365
1366int cx231xx_g_register(struct file *file, void *priv,
1367 struct v4l2_dbg_register *reg)
1368{
1369 struct cx231xx_fh *fh = priv;
1370 struct cx231xx *dev = fh->dev;
1371 int ret;
1372 u8 value[4] = { 0, 0, 0, 0 };
1373 u32 data = 0;
1374
1375 switch (reg->match.addr) {
1376 case 0:
1377 ret = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER,
1378 (u16)reg->reg, value, 4);
1379 reg->val = value[0] | value[1] << 8 |
1380 value[2] << 16 | (u32)value[3] << 24;
1381 reg->size = 4;
1382 break;
1383 case 1:
1384 ret = cx231xx_read_i2c_data(dev, AFE_DEVICE_ADDRESS,
1385 (u16)reg->reg, 2, &data, 1);
1386 reg->val = data;
1387 reg->size = 1;
1388 break;
1389 case 2:
1390 ret = cx231xx_read_i2c_data(dev, VID_BLK_I2C_ADDRESS,
1391 (u16)reg->reg, 2, &data, 1);
1392 reg->val = data;
1393 reg->size = 1;
1394 break;
1395 case 3:
1396 ret = cx231xx_read_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
1397 (u16)reg->reg, 1, &data, 1);
1398 reg->val = data;
1399 reg->size = 1;
1400 break;
1401 case 4:
1402 ret = cx231xx_read_i2c_data(dev, AFE_DEVICE_ADDRESS,
1403 (u16)reg->reg, 2, &data, 4);
1404 reg->val = data;
1405 reg->size = 4;
1406 break;
1407 case 5:
1408 ret = cx231xx_read_i2c_data(dev, VID_BLK_I2C_ADDRESS,
1409 (u16)reg->reg, 2, &data, 4);
1410 reg->val = data;
1411 reg->size = 4;
1412 break;
1413 case 6:
1414 ret = cx231xx_read_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
1415 (u16)reg->reg, 1, &data, 4);
1416 reg->val = data;
1417 reg->size = 4;
1418 break;
1419 default:
1420 return -EINVAL;
1421 }
1422 return ret < 0 ? ret : 0;
1423}
1424
1425int cx231xx_s_register(struct file *file, void *priv,
1426 const struct v4l2_dbg_register *reg)
1427{
1428 struct cx231xx_fh *fh = priv;
1429 struct cx231xx *dev = fh->dev;
1430 int ret;
1431 u8 data[4] = { 0, 0, 0, 0 };
1432
1433 switch (reg->match.addr) {
1434 case 0:
1435 data[0] = (u8) reg->val;
1436 data[1] = (u8) (reg->val >> 8);
1437 data[2] = (u8) (reg->val >> 16);
1438 data[3] = (u8) (reg->val >> 24);
1439 ret = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
1440 (u16)reg->reg, data, 4);
1441 break;
1442 case 1:
1443 ret = cx231xx_write_i2c_data(dev, AFE_DEVICE_ADDRESS,
1444 (u16)reg->reg, 2, reg->val, 1);
1445 break;
1446 case 2:
1447 ret = cx231xx_write_i2c_data(dev, VID_BLK_I2C_ADDRESS,
1448 (u16)reg->reg, 2, reg->val, 1);
1449 break;
1450 case 3:
1451 ret = cx231xx_write_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
1452 (u16)reg->reg, 1, reg->val, 1);
1453 break;
1454 case 4:
1455 ret = cx231xx_write_i2c_data(dev, AFE_DEVICE_ADDRESS,
1456 (u16)reg->reg, 2, reg->val, 4);
1457 break;
1458 case 5:
1459 ret = cx231xx_write_i2c_data(dev, VID_BLK_I2C_ADDRESS,
1460 (u16)reg->reg, 2, reg->val, 4);
1461 break;
1462 case 6:
1463 ret = cx231xx_write_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
1464 (u16)reg->reg, 1, reg->val, 4);
1465 break;
1466 default:
1467 return -EINVAL;
1468 }
1469 return ret < 0 ? ret : 0;
1470}
1471#endif
1472
1473static int vidioc_g_pixelaspect(struct file *file, void *priv,
1474 int type, struct v4l2_fract *f)
1475{
1476 struct cx231xx_fh *fh = priv;
1477 struct cx231xx *dev = fh->dev;
1478 bool is_50hz = dev->norm & V4L2_STD_625_50;
1479
1480 if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1481 return -EINVAL;
1482
1483 f->numerator = is_50hz ? 54 : 11;
1484 f->denominator = is_50hz ? 59 : 10;
1485
1486 return 0;
1487}
1488
1489static int vidioc_g_selection(struct file *file, void *priv,
1490 struct v4l2_selection *s)
1491{
1492 struct cx231xx_fh *fh = priv;
1493 struct cx231xx *dev = fh->dev;
1494
1495 if (s->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1496 return -EINVAL;
1497
1498 switch (s->target) {
1499 case V4L2_SEL_TGT_CROP_BOUNDS:
1500 case V4L2_SEL_TGT_CROP_DEFAULT:
1501 s->r.left = 0;
1502 s->r.top = 0;
1503 s->r.width = dev->width;
1504 s->r.height = dev->height;
1505 break;
1506 default:
1507 return -EINVAL;
1508 }
1509 return 0;
1510}
1511
1512static int vidioc_streamon(struct file *file, void *priv,
1513 enum v4l2_buf_type type)
1514{
1515 struct cx231xx_fh *fh = priv;
1516 struct cx231xx *dev = fh->dev;
1517 int rc;
1518
1519 rc = check_dev(dev);
1520 if (rc < 0)
1521 return rc;
1522
1523 rc = res_get(fh);
1524
1525 if (likely(rc >= 0))
1526 rc = videobuf_streamon(&fh->vb_vidq);
1527
1528 call_all(dev, video, s_stream, 1);
1529
1530 return rc;
1531}
1532
1533static int vidioc_streamoff(struct file *file, void *priv,
1534 enum v4l2_buf_type type)
1535{
1536 struct cx231xx_fh *fh = priv;
1537 struct cx231xx *dev = fh->dev;
1538 int rc;
1539
1540 rc = check_dev(dev);
1541 if (rc < 0)
1542 return rc;
1543
1544 if (type != fh->type)
1545 return -EINVAL;
1546
1547 cx25840_call(dev, video, s_stream, 0);
1548
1549 videobuf_streamoff(&fh->vb_vidq);
1550 res_free(fh);
1551
1552 return 0;
1553}
1554
1555int cx231xx_querycap(struct file *file, void *priv,
1556 struct v4l2_capability *cap)
1557{
1558 struct cx231xx_fh *fh = priv;
1559 struct cx231xx *dev = fh->dev;
1560
1561 strscpy(cap->driver, "cx231xx", sizeof(cap->driver));
1562 strscpy(cap->card, cx231xx_boards[dev->model].name, sizeof(cap->card));
1563 usb_make_path(dev->udev, cap->bus_info, sizeof(cap->bus_info));
1564 cap->capabilities = V4L2_CAP_READWRITE |
1565 V4L2_CAP_VBI_CAPTURE | V4L2_CAP_VIDEO_CAPTURE |
1566 V4L2_CAP_STREAMING | V4L2_CAP_DEVICE_CAPS;
1567 if (video_is_registered(&dev->radio_dev))
1568 cap->capabilities |= V4L2_CAP_RADIO;
1569 if (dev->tuner_type != TUNER_ABSENT)
1570 cap->capabilities |= V4L2_CAP_TUNER;
1571
1572 return 0;
1573}
1574
1575static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv,
1576 struct v4l2_fmtdesc *f)
1577{
1578 if (unlikely(f->index >= ARRAY_SIZE(format)))
1579 return -EINVAL;
1580
1581 strscpy(f->description, format[f->index].name, sizeof(f->description));
1582 f->pixelformat = format[f->index].fourcc;
1583
1584 return 0;
1585}
1586
1587
1588
1589static int vidioc_g_fmt_vbi_cap(struct file *file, void *priv,
1590 struct v4l2_format *f)
1591{
1592 struct cx231xx_fh *fh = priv;
1593 struct cx231xx *dev = fh->dev;
1594
1595 f->fmt.vbi.sampling_rate = 6750000 * 4;
1596 f->fmt.vbi.samples_per_line = VBI_LINE_LENGTH;
1597 f->fmt.vbi.sample_format = V4L2_PIX_FMT_GREY;
1598 f->fmt.vbi.offset = 0;
1599 f->fmt.vbi.start[0] = (dev->norm & V4L2_STD_625_50) ?
1600 PAL_VBI_START_LINE : NTSC_VBI_START_LINE;
1601 f->fmt.vbi.count[0] = (dev->norm & V4L2_STD_625_50) ?
1602 PAL_VBI_LINES : NTSC_VBI_LINES;
1603 f->fmt.vbi.start[1] = (dev->norm & V4L2_STD_625_50) ?
1604 PAL_VBI_START_LINE + 312 : NTSC_VBI_START_LINE + 263;
1605 f->fmt.vbi.count[1] = f->fmt.vbi.count[0];
1606 memset(f->fmt.vbi.reserved, 0, sizeof(f->fmt.vbi.reserved));
1607
1608 return 0;
1609
1610}
1611
1612static int vidioc_try_fmt_vbi_cap(struct file *file, void *priv,
1613 struct v4l2_format *f)
1614{
1615 struct cx231xx_fh *fh = priv;
1616 struct cx231xx *dev = fh->dev;
1617
1618 f->fmt.vbi.sampling_rate = 6750000 * 4;
1619 f->fmt.vbi.samples_per_line = VBI_LINE_LENGTH;
1620 f->fmt.vbi.sample_format = V4L2_PIX_FMT_GREY;
1621 f->fmt.vbi.offset = 0;
1622 f->fmt.vbi.flags = 0;
1623 f->fmt.vbi.start[0] = (dev->norm & V4L2_STD_625_50) ?
1624 PAL_VBI_START_LINE : NTSC_VBI_START_LINE;
1625 f->fmt.vbi.count[0] = (dev->norm & V4L2_STD_625_50) ?
1626 PAL_VBI_LINES : NTSC_VBI_LINES;
1627 f->fmt.vbi.start[1] = (dev->norm & V4L2_STD_625_50) ?
1628 PAL_VBI_START_LINE + 312 : NTSC_VBI_START_LINE + 263;
1629 f->fmt.vbi.count[1] = f->fmt.vbi.count[0];
1630 memset(f->fmt.vbi.reserved, 0, sizeof(f->fmt.vbi.reserved));
1631
1632 return 0;
1633
1634}
1635
1636static int vidioc_s_fmt_vbi_cap(struct file *file, void *priv,
1637 struct v4l2_format *f)
1638{
1639 struct cx231xx_fh *fh = priv;
1640 struct cx231xx *dev = fh->dev;
1641
1642 if (dev->vbi_stream_on && !fh->stream_on) {
1643 dev_err(dev->dev,
1644 "%s device in use by another fh\n", __func__);
1645 return -EBUSY;
1646 }
1647 return vidioc_try_fmt_vbi_cap(file, priv, f);
1648}
1649
1650static int vidioc_reqbufs(struct file *file, void *priv,
1651 struct v4l2_requestbuffers *rb)
1652{
1653 struct cx231xx_fh *fh = priv;
1654 struct cx231xx *dev = fh->dev;
1655 int rc;
1656
1657 rc = check_dev(dev);
1658 if (rc < 0)
1659 return rc;
1660
1661 return videobuf_reqbufs(&fh->vb_vidq, rb);
1662}
1663
1664static int vidioc_querybuf(struct file *file, void *priv, struct v4l2_buffer *b)
1665{
1666 struct cx231xx_fh *fh = priv;
1667 struct cx231xx *dev = fh->dev;
1668 int rc;
1669
1670 rc = check_dev(dev);
1671 if (rc < 0)
1672 return rc;
1673
1674 return videobuf_querybuf(&fh->vb_vidq, b);
1675}
1676
1677static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *b)
1678{
1679 struct cx231xx_fh *fh = priv;
1680 struct cx231xx *dev = fh->dev;
1681 int rc;
1682
1683 rc = check_dev(dev);
1684 if (rc < 0)
1685 return rc;
1686
1687 return videobuf_qbuf(&fh->vb_vidq, b);
1688}
1689
1690static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b)
1691{
1692 struct cx231xx_fh *fh = priv;
1693 struct cx231xx *dev = fh->dev;
1694 int rc;
1695
1696 rc = check_dev(dev);
1697 if (rc < 0)
1698 return rc;
1699
1700 return videobuf_dqbuf(&fh->vb_vidq, b, file->f_flags & O_NONBLOCK);
1701}
1702
1703
1704
1705
1706
1707static int radio_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t)
1708{
1709 struct cx231xx *dev = ((struct cx231xx_fh *)priv)->dev;
1710
1711 if (t->index)
1712 return -EINVAL;
1713
1714 strscpy(t->name, "Radio", sizeof(t->name));
1715
1716 call_all(dev, tuner, g_tuner, t);
1717
1718 return 0;
1719}
1720static int radio_s_tuner(struct file *file, void *priv, const struct v4l2_tuner *t)
1721{
1722 struct cx231xx *dev = ((struct cx231xx_fh *)priv)->dev;
1723
1724 if (t->index)
1725 return -EINVAL;
1726
1727 call_all(dev, tuner, s_tuner, t);
1728
1729 return 0;
1730}
1731
1732
1733
1734
1735
1736static int cx231xx_v4l2_open(struct file *filp)
1737{
1738 int radio = 0;
1739 struct video_device *vdev = video_devdata(filp);
1740 struct cx231xx *dev = video_drvdata(filp);
1741 struct cx231xx_fh *fh;
1742 enum v4l2_buf_type fh_type = 0;
1743
1744 switch (vdev->vfl_type) {
1745 case VFL_TYPE_GRABBER:
1746 fh_type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1747 break;
1748 case VFL_TYPE_VBI:
1749 fh_type = V4L2_BUF_TYPE_VBI_CAPTURE;
1750 break;
1751 case VFL_TYPE_RADIO:
1752 radio = 1;
1753 break;
1754 default:
1755 return -EINVAL;
1756 }
1757
1758 cx231xx_videodbg("open dev=%s type=%s users=%d\n",
1759 video_device_node_name(vdev), v4l2_type_names[fh_type],
1760 dev->users);
1761
1762#if 0
1763 errCode = cx231xx_set_mode(dev, CX231XX_ANALOG_MODE);
1764 if (errCode < 0) {
1765 dev_err(dev->dev,
1766 "Device locked on digital mode. Can't open analog\n");
1767 return -EBUSY;
1768 }
1769#endif
1770
1771 fh = kzalloc(sizeof(struct cx231xx_fh), GFP_KERNEL);
1772 if (!fh)
1773 return -ENOMEM;
1774 if (mutex_lock_interruptible(&dev->lock)) {
1775 kfree(fh);
1776 return -ERESTARTSYS;
1777 }
1778 fh->dev = dev;
1779 fh->type = fh_type;
1780 filp->private_data = fh;
1781 v4l2_fh_init(&fh->fh, vdev);
1782
1783 if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE && dev->users == 0) {
1784
1785 if (dev->board.external_av)
1786 cx231xx_set_power_mode(dev,
1787 POLARIS_AVMODE_ENXTERNAL_AV);
1788 else
1789 cx231xx_set_power_mode(dev, POLARIS_AVMODE_ANALOGT_TV);
1790
1791#if 0
1792 cx231xx_set_mode(dev, CX231XX_ANALOG_MODE);
1793#endif
1794
1795
1796 cx231xx_set_video_alternate(dev);
1797
1798
1799
1800 cx231xx_config_i2c(dev);
1801
1802
1803 dev->video_input = dev->video_input > 2 ? 2 : dev->video_input;
1804
1805 }
1806 if (radio) {
1807 cx231xx_videodbg("video_open: setting radio device\n");
1808
1809
1810
1811 call_all(dev, tuner, s_radio);
1812 }
1813
1814 dev->users++;
1815
1816 if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1817 videobuf_queue_vmalloc_init(&fh->vb_vidq, &cx231xx_video_qops,
1818 NULL, &dev->video_mode.slock,
1819 fh->type, V4L2_FIELD_INTERLACED,
1820 sizeof(struct cx231xx_buffer),
1821 fh, &dev->lock);
1822 if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
1823
1824
1825 cx231xx_set_alt_setting(dev, INDEX_VANC, 0);
1826
1827 videobuf_queue_vmalloc_init(&fh->vb_vidq, &cx231xx_vbi_qops,
1828 NULL, &dev->vbi_mode.slock,
1829 fh->type, V4L2_FIELD_SEQ_TB,
1830 sizeof(struct cx231xx_buffer),
1831 fh, &dev->lock);
1832 }
1833 mutex_unlock(&dev->lock);
1834 v4l2_fh_add(&fh->fh);
1835
1836 return 0;
1837}
1838
1839
1840
1841
1842
1843
1844void cx231xx_release_analog_resources(struct cx231xx *dev)
1845{
1846
1847
1848
1849 if (video_is_registered(&dev->radio_dev))
1850 video_unregister_device(&dev->radio_dev);
1851 if (video_is_registered(&dev->vbi_dev)) {
1852 dev_info(dev->dev, "V4L2 device %s deregistered\n",
1853 video_device_node_name(&dev->vbi_dev));
1854 video_unregister_device(&dev->vbi_dev);
1855 }
1856 if (video_is_registered(&dev->vdev)) {
1857 dev_info(dev->dev, "V4L2 device %s deregistered\n",
1858 video_device_node_name(&dev->vdev));
1859
1860 if (dev->board.has_417)
1861 cx231xx_417_unregister(dev);
1862
1863 video_unregister_device(&dev->vdev);
1864 }
1865 v4l2_ctrl_handler_free(&dev->ctrl_handler);
1866 v4l2_ctrl_handler_free(&dev->radio_ctrl_handler);
1867}
1868
1869
1870
1871
1872
1873
1874static int cx231xx_close(struct file *filp)
1875{
1876 struct cx231xx_fh *fh = filp->private_data;
1877 struct cx231xx *dev = fh->dev;
1878
1879 cx231xx_videodbg("users=%d\n", dev->users);
1880
1881 cx231xx_videodbg("users=%d\n", dev->users);
1882 if (res_check(fh))
1883 res_free(fh);
1884
1885
1886
1887
1888
1889
1890
1891 if (!dev->board.no_alt_vanc)
1892 if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
1893 videobuf_stop(&fh->vb_vidq);
1894 videobuf_mmap_free(&fh->vb_vidq);
1895
1896
1897
1898 if (dev->state & DEV_DISCONNECTED) {
1899 if (atomic_read(&dev->devlist_count) > 0) {
1900 cx231xx_release_resources(dev);
1901 fh->dev = NULL;
1902 return 0;
1903 }
1904 return 0;
1905 }
1906
1907
1908 cx231xx_uninit_vbi_isoc(dev);
1909
1910
1911 if (!dev->vbi_or_sliced_cc_mode)
1912 cx231xx_set_alt_setting(dev, INDEX_VANC, 0);
1913 else
1914 cx231xx_set_alt_setting(dev, INDEX_HANC, 0);
1915
1916 v4l2_fh_del(&fh->fh);
1917 v4l2_fh_exit(&fh->fh);
1918 kfree(fh);
1919 dev->users--;
1920 wake_up_interruptible(&dev->open);
1921 return 0;
1922 }
1923
1924 v4l2_fh_del(&fh->fh);
1925 dev->users--;
1926 if (!dev->users) {
1927 videobuf_stop(&fh->vb_vidq);
1928 videobuf_mmap_free(&fh->vb_vidq);
1929
1930
1931
1932 if (dev->state & DEV_DISCONNECTED) {
1933 cx231xx_release_resources(dev);
1934 fh->dev = NULL;
1935 return 0;
1936 }
1937
1938
1939 call_all(dev, tuner, standby);
1940
1941
1942 if (dev->USE_ISO)
1943 cx231xx_uninit_isoc(dev);
1944 else
1945 cx231xx_uninit_bulk(dev);
1946 cx231xx_set_mode(dev, CX231XX_SUSPEND);
1947
1948
1949 cx231xx_set_alt_setting(dev, INDEX_VIDEO, 0);
1950 }
1951 v4l2_fh_exit(&fh->fh);
1952 kfree(fh);
1953 wake_up_interruptible(&dev->open);
1954 return 0;
1955}
1956
1957static int cx231xx_v4l2_close(struct file *filp)
1958{
1959 struct cx231xx_fh *fh = filp->private_data;
1960 struct cx231xx *dev = fh->dev;
1961 int rc;
1962
1963 mutex_lock(&dev->lock);
1964 rc = cx231xx_close(filp);
1965 mutex_unlock(&dev->lock);
1966 return rc;
1967}
1968
1969
1970
1971
1972
1973static ssize_t
1974cx231xx_v4l2_read(struct file *filp, char __user *buf, size_t count,
1975 loff_t *pos)
1976{
1977 struct cx231xx_fh *fh = filp->private_data;
1978 struct cx231xx *dev = fh->dev;
1979 int rc;
1980
1981 rc = check_dev(dev);
1982 if (rc < 0)
1983 return rc;
1984
1985 if ((fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) ||
1986 (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)) {
1987 rc = res_get(fh);
1988
1989 if (unlikely(rc < 0))
1990 return rc;
1991
1992 if (mutex_lock_interruptible(&dev->lock))
1993 return -ERESTARTSYS;
1994 rc = videobuf_read_stream(&fh->vb_vidq, buf, count, pos, 0,
1995 filp->f_flags & O_NONBLOCK);
1996 mutex_unlock(&dev->lock);
1997 return rc;
1998 }
1999 return 0;
2000}
2001
2002
2003
2004
2005
2006static __poll_t cx231xx_v4l2_poll(struct file *filp, poll_table *wait)
2007{
2008 __poll_t req_events = poll_requested_events(wait);
2009 struct cx231xx_fh *fh = filp->private_data;
2010 struct cx231xx *dev = fh->dev;
2011 __poll_t res = 0;
2012 int rc;
2013
2014 rc = check_dev(dev);
2015 if (rc < 0)
2016 return EPOLLERR;
2017
2018 rc = res_get(fh);
2019
2020 if (unlikely(rc < 0))
2021 return EPOLLERR;
2022
2023 if (v4l2_event_pending(&fh->fh))
2024 res |= EPOLLPRI;
2025 else
2026 poll_wait(filp, &fh->fh.wait, wait);
2027
2028 if (!(req_events & (EPOLLIN | EPOLLRDNORM)))
2029 return res;
2030
2031 if ((V4L2_BUF_TYPE_VIDEO_CAPTURE == fh->type) ||
2032 (V4L2_BUF_TYPE_VBI_CAPTURE == fh->type)) {
2033 mutex_lock(&dev->lock);
2034 res |= videobuf_poll_stream(filp, &fh->vb_vidq, wait);
2035 mutex_unlock(&dev->lock);
2036 return res;
2037 }
2038 return res | EPOLLERR;
2039}
2040
2041
2042
2043
2044static int cx231xx_v4l2_mmap(struct file *filp, struct vm_area_struct *vma)
2045{
2046 struct cx231xx_fh *fh = filp->private_data;
2047 struct cx231xx *dev = fh->dev;
2048 int rc;
2049
2050 rc = check_dev(dev);
2051 if (rc < 0)
2052 return rc;
2053
2054 rc = res_get(fh);
2055
2056 if (unlikely(rc < 0))
2057 return rc;
2058
2059 if (mutex_lock_interruptible(&dev->lock))
2060 return -ERESTARTSYS;
2061 rc = videobuf_mmap_mapper(&fh->vb_vidq, vma);
2062 mutex_unlock(&dev->lock);
2063
2064 cx231xx_videodbg("vma start=0x%08lx, size=%ld, ret=%d\n",
2065 (unsigned long)vma->vm_start,
2066 (unsigned long)vma->vm_end -
2067 (unsigned long)vma->vm_start, rc);
2068
2069 return rc;
2070}
2071
2072static const struct v4l2_file_operations cx231xx_v4l_fops = {
2073 .owner = THIS_MODULE,
2074 .open = cx231xx_v4l2_open,
2075 .release = cx231xx_v4l2_close,
2076 .read = cx231xx_v4l2_read,
2077 .poll = cx231xx_v4l2_poll,
2078 .mmap = cx231xx_v4l2_mmap,
2079 .unlocked_ioctl = video_ioctl2,
2080};
2081
2082static const struct v4l2_ioctl_ops video_ioctl_ops = {
2083 .vidioc_querycap = cx231xx_querycap,
2084 .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
2085 .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,
2086 .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap,
2087 .vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap,
2088 .vidioc_g_fmt_vbi_cap = vidioc_g_fmt_vbi_cap,
2089 .vidioc_try_fmt_vbi_cap = vidioc_try_fmt_vbi_cap,
2090 .vidioc_s_fmt_vbi_cap = vidioc_s_fmt_vbi_cap,
2091 .vidioc_g_pixelaspect = vidioc_g_pixelaspect,
2092 .vidioc_g_selection = vidioc_g_selection,
2093 .vidioc_reqbufs = vidioc_reqbufs,
2094 .vidioc_querybuf = vidioc_querybuf,
2095 .vidioc_qbuf = vidioc_qbuf,
2096 .vidioc_dqbuf = vidioc_dqbuf,
2097 .vidioc_s_std = vidioc_s_std,
2098 .vidioc_g_std = vidioc_g_std,
2099 .vidioc_enum_input = cx231xx_enum_input,
2100 .vidioc_g_input = cx231xx_g_input,
2101 .vidioc_s_input = cx231xx_s_input,
2102 .vidioc_streamon = vidioc_streamon,
2103 .vidioc_streamoff = vidioc_streamoff,
2104 .vidioc_g_tuner = cx231xx_g_tuner,
2105 .vidioc_s_tuner = cx231xx_s_tuner,
2106 .vidioc_g_frequency = cx231xx_g_frequency,
2107 .vidioc_s_frequency = cx231xx_s_frequency,
2108#ifdef CONFIG_VIDEO_ADV_DEBUG
2109 .vidioc_g_chip_info = cx231xx_g_chip_info,
2110 .vidioc_g_register = cx231xx_g_register,
2111 .vidioc_s_register = cx231xx_s_register,
2112#endif
2113 .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
2114 .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
2115};
2116
2117static struct video_device cx231xx_vbi_template;
2118
2119static const struct video_device cx231xx_video_template = {
2120 .fops = &cx231xx_v4l_fops,
2121 .release = video_device_release_empty,
2122 .ioctl_ops = &video_ioctl_ops,
2123 .tvnorms = V4L2_STD_ALL,
2124};
2125
2126static const struct v4l2_file_operations radio_fops = {
2127 .owner = THIS_MODULE,
2128 .open = cx231xx_v4l2_open,
2129 .release = cx231xx_v4l2_close,
2130 .poll = v4l2_ctrl_poll,
2131 .unlocked_ioctl = video_ioctl2,
2132};
2133
2134static const struct v4l2_ioctl_ops radio_ioctl_ops = {
2135 .vidioc_querycap = cx231xx_querycap,
2136 .vidioc_g_tuner = radio_g_tuner,
2137 .vidioc_s_tuner = radio_s_tuner,
2138 .vidioc_g_frequency = cx231xx_g_frequency,
2139 .vidioc_s_frequency = cx231xx_s_frequency,
2140#ifdef CONFIG_VIDEO_ADV_DEBUG
2141 .vidioc_g_chip_info = cx231xx_g_chip_info,
2142 .vidioc_g_register = cx231xx_g_register,
2143 .vidioc_s_register = cx231xx_s_register,
2144#endif
2145 .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
2146 .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
2147};
2148
2149static struct video_device cx231xx_radio_template = {
2150 .name = "cx231xx-radio",
2151 .fops = &radio_fops,
2152 .ioctl_ops = &radio_ioctl_ops,
2153};
2154
2155
2156
2157static void cx231xx_vdev_init(struct cx231xx *dev,
2158 struct video_device *vfd,
2159 const struct video_device *template,
2160 const char *type_name)
2161{
2162 *vfd = *template;
2163 vfd->v4l2_dev = &dev->v4l2_dev;
2164 vfd->release = video_device_release_empty;
2165 vfd->lock = &dev->lock;
2166
2167 snprintf(vfd->name, sizeof(vfd->name), "%s %s", dev->name, type_name);
2168
2169 video_set_drvdata(vfd, dev);
2170 if (dev->tuner_type == TUNER_ABSENT) {
2171 v4l2_disable_ioctl(vfd, VIDIOC_G_FREQUENCY);
2172 v4l2_disable_ioctl(vfd, VIDIOC_S_FREQUENCY);
2173 v4l2_disable_ioctl(vfd, VIDIOC_G_TUNER);
2174 v4l2_disable_ioctl(vfd, VIDIOC_S_TUNER);
2175 }
2176}
2177
2178int cx231xx_register_analog_devices(struct cx231xx *dev)
2179{
2180 int ret;
2181
2182 dev_info(dev->dev, "v4l2 driver version %s\n", CX231XX_VERSION);
2183
2184
2185 dev->norm = V4L2_STD_PAL;
2186 dev->width = norm_maxw(dev);
2187 dev->height = norm_maxh(dev);
2188 dev->interlaced = 0;
2189
2190
2191 dev->format = &format[0];
2192
2193
2194 video_mux(dev, dev->video_input);
2195
2196 call_all(dev, video, s_std, dev->norm);
2197
2198 v4l2_ctrl_handler_init(&dev->ctrl_handler, 10);
2199 v4l2_ctrl_handler_init(&dev->radio_ctrl_handler, 5);
2200
2201 if (dev->sd_cx25840) {
2202 v4l2_ctrl_add_handler(&dev->ctrl_handler,
2203 dev->sd_cx25840->ctrl_handler, NULL, true);
2204 v4l2_ctrl_add_handler(&dev->radio_ctrl_handler,
2205 dev->sd_cx25840->ctrl_handler,
2206 v4l2_ctrl_radio_filter, true);
2207 }
2208
2209 if (dev->ctrl_handler.error)
2210 return dev->ctrl_handler.error;
2211 if (dev->radio_ctrl_handler.error)
2212 return dev->radio_ctrl_handler.error;
2213
2214
2215
2216
2217
2218 cx231xx_vdev_init(dev, &dev->vdev, &cx231xx_video_template, "video");
2219#if defined(CONFIG_MEDIA_CONTROLLER)
2220 dev->video_pad.flags = MEDIA_PAD_FL_SINK;
2221 ret = media_entity_pads_init(&dev->vdev.entity, 1, &dev->video_pad);
2222 if (ret < 0)
2223 dev_err(dev->dev, "failed to initialize video media entity!\n");
2224#endif
2225 dev->vdev.ctrl_handler = &dev->ctrl_handler;
2226 dev->vdev.device_caps = V4L2_CAP_READWRITE | V4L2_CAP_STREAMING |
2227 V4L2_CAP_VIDEO_CAPTURE;
2228 if (dev->tuner_type != TUNER_ABSENT)
2229 dev->vdev.device_caps |= V4L2_CAP_TUNER;
2230
2231
2232 ret = video_register_device(&dev->vdev, VFL_TYPE_GRABBER,
2233 video_nr[dev->devno]);
2234 if (ret) {
2235 dev_err(dev->dev,
2236 "unable to register video device (error=%i).\n",
2237 ret);
2238 return ret;
2239 }
2240
2241 dev_info(dev->dev, "Registered video device %s [v4l2]\n",
2242 video_device_node_name(&dev->vdev));
2243
2244
2245 cx231xx_vbi_template = cx231xx_video_template;
2246 strscpy(cx231xx_vbi_template.name, "cx231xx-vbi",
2247 sizeof(cx231xx_vbi_template.name));
2248
2249
2250 cx231xx_vdev_init(dev, &dev->vbi_dev, &cx231xx_vbi_template, "vbi");
2251
2252#if defined(CONFIG_MEDIA_CONTROLLER)
2253 dev->vbi_pad.flags = MEDIA_PAD_FL_SINK;
2254 ret = media_entity_pads_init(&dev->vbi_dev.entity, 1, &dev->vbi_pad);
2255 if (ret < 0)
2256 dev_err(dev->dev, "failed to initialize vbi media entity!\n");
2257#endif
2258 dev->vbi_dev.ctrl_handler = &dev->ctrl_handler;
2259 dev->vbi_dev.device_caps = V4L2_CAP_READWRITE | V4L2_CAP_STREAMING |
2260 V4L2_CAP_VBI_CAPTURE;
2261 if (dev->tuner_type != TUNER_ABSENT)
2262 dev->vbi_dev.device_caps |= V4L2_CAP_TUNER;
2263
2264
2265 ret = video_register_device(&dev->vbi_dev, VFL_TYPE_VBI,
2266 vbi_nr[dev->devno]);
2267 if (ret < 0) {
2268 dev_err(dev->dev, "unable to register vbi device\n");
2269 return ret;
2270 }
2271
2272 dev_info(dev->dev, "Registered VBI device %s\n",
2273 video_device_node_name(&dev->vbi_dev));
2274
2275 if (cx231xx_boards[dev->model].radio.type == CX231XX_RADIO) {
2276 cx231xx_vdev_init(dev, &dev->radio_dev,
2277 &cx231xx_radio_template, "radio");
2278 dev->radio_dev.ctrl_handler = &dev->radio_ctrl_handler;
2279 dev->radio_dev.device_caps = V4L2_CAP_RADIO | V4L2_CAP_TUNER;
2280 ret = video_register_device(&dev->radio_dev, VFL_TYPE_RADIO,
2281 radio_nr[dev->devno]);
2282 if (ret < 0) {
2283 dev_err(dev->dev,
2284 "can't register radio device\n");
2285 return ret;
2286 }
2287 dev_info(dev->dev, "Registered radio device as %s\n",
2288 video_device_node_name(&dev->radio_dev));
2289 }
2290
2291 return 0;
2292}
2293