1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Driver for the Conexant CX23885 PCIe bridge
5 * Copyright (c) 2007 Steven Toth <stoth@linuxtv.org>
9 #include "cx23885-video.h"
11 #include <linux/init.h>
12 #include <linux/list.h>
13 #include <linux/module.h>
14 #include <linux/moduleparam.h>
15 #include <linux/kmod.h>
16 #include <linux/kernel.h>
17 #include <linux/slab.h>
18 #include <linux/interrupt.h>
19 #include <linux/delay.h>
20 #include <linux/kthread.h>
21 #include <asm/div64.h>
23 #include <media/v4l2-common.h>
24 #include <media/v4l2-ioctl.h>
25 #include <media/v4l2-event.h>
26 #include "cx23885-ioctl.h"
29 #include <media/drv-intf/cx25840.h>
31 MODULE_DESCRIPTION("v4l2 driver module for cx23885 based TV cards");
32 MODULE_AUTHOR("Steven Toth <stoth@linuxtv.org>");
33 MODULE_LICENSE("GPL");
35 /* ------------------------------------------------------------------ */
37 static unsigned int video_nr
[] = {[0 ... (CX23885_MAXBOARDS
- 1)] = UNSET
};
38 static unsigned int vbi_nr
[] = {[0 ... (CX23885_MAXBOARDS
- 1)] = UNSET
};
40 module_param_array(video_nr
, int, NULL
, 0444);
41 module_param_array(vbi_nr
, int, NULL
, 0444);
43 MODULE_PARM_DESC(video_nr
, "video device numbers");
44 MODULE_PARM_DESC(vbi_nr
, "vbi device numbers");
46 static unsigned int video_debug
;
47 module_param(video_debug
, int, 0644);
48 MODULE_PARM_DESC(video_debug
, "enable debug messages [video]");
50 static unsigned int irq_debug
;
51 module_param(irq_debug
, int, 0644);
52 MODULE_PARM_DESC(irq_debug
, "enable debug messages [IRQ handler]");
54 static unsigned int vid_limit
= 16;
55 module_param(vid_limit
, int, 0644);
56 MODULE_PARM_DESC(vid_limit
, "capture memory limit in megabytes");
58 #define dprintk(level, fmt, arg...)\
59 do { if (video_debug >= level)\
60 printk(KERN_DEBUG pr_fmt("%s: video:" fmt), \
64 /* ------------------------------------------------------------------- */
67 #define FORMAT_FLAGS_PACKED 0x01
68 static struct cx23885_fmt formats
[] = {
70 .fourcc
= V4L2_PIX_FMT_YUYV
,
72 .flags
= FORMAT_FLAGS_PACKED
,
76 static struct cx23885_fmt
*format_by_fourcc(unsigned int fourcc
)
80 for (i
= 0; i
< ARRAY_SIZE(formats
); i
++)
81 if (formats
[i
].fourcc
== fourcc
)
86 /* ------------------------------------------------------------------- */
88 void cx23885_video_wakeup(struct cx23885_dev
*dev
,
89 struct cx23885_dmaqueue
*q
, u32 count
)
91 struct cx23885_buffer
*buf
;
93 if (list_empty(&q
->active
))
95 buf
= list_entry(q
->active
.next
,
96 struct cx23885_buffer
, queue
);
98 buf
->vb
.sequence
= q
->count
++;
99 buf
->vb
.vb2_buf
.timestamp
= ktime_get_ns();
100 dprintk(2, "[%p/%d] wakeup reg=%d buf=%d\n", buf
,
101 buf
->vb
.vb2_buf
.index
, count
, q
->count
);
102 list_del(&buf
->queue
);
103 vb2_buffer_done(&buf
->vb
.vb2_buf
, VB2_BUF_STATE_DONE
);
106 int cx23885_set_tvnorm(struct cx23885_dev
*dev
, v4l2_std_id norm
)
108 struct v4l2_subdev_format format
= {
109 .which
= V4L2_SUBDEV_FORMAT_ACTIVE
,
110 .format
.code
= MEDIA_BUS_FMT_FIXED
,
113 dprintk(1, "%s(norm = 0x%08x) name: [%s]\n",
116 v4l2_norm_to_name(norm
));
118 if (dev
->tvnorm
== norm
)
121 if (dev
->tvnorm
!= norm
) {
122 if (vb2_is_busy(&dev
->vb2_vidq
) || vb2_is_busy(&dev
->vb2_vbiq
) ||
123 vb2_is_busy(&dev
->vb2_mpegq
))
129 dev
->height
= norm_maxh(norm
);
130 dev
->field
= V4L2_FIELD_INTERLACED
;
132 call_all(dev
, video
, s_std
, norm
);
134 format
.format
.width
= dev
->width
;
135 format
.format
.height
= dev
->height
;
136 format
.format
.field
= dev
->field
;
137 call_all(dev
, pad
, set_fmt
, NULL
, &format
);
142 static struct video_device
*cx23885_vdev_init(struct cx23885_dev
*dev
,
144 struct video_device
*template,
147 struct video_device
*vfd
;
148 dprintk(1, "%s()\n", __func__
);
150 vfd
= video_device_alloc();
154 vfd
->v4l2_dev
= &dev
->v4l2_dev
;
155 vfd
->release
= video_device_release
;
156 vfd
->lock
= &dev
->lock
;
157 snprintf(vfd
->name
, sizeof(vfd
->name
), "%s (%s)",
158 cx23885_boards
[dev
->board
].name
, type
);
159 video_set_drvdata(vfd
, dev
);
163 int cx23885_flatiron_write(struct cx23885_dev
*dev
, u8 reg
, u8 data
)
165 /* 8 bit registers, 8 bit values */
166 u8 buf
[] = { reg
, data
};
168 struct i2c_msg msg
= { .addr
= 0x98 >> 1,
169 .flags
= 0, .buf
= buf
, .len
= 2 };
171 return i2c_transfer(&dev
->i2c_bus
[2].i2c_adap
, &msg
, 1);
174 u8
cx23885_flatiron_read(struct cx23885_dev
*dev
, u8 reg
)
176 /* 8 bit registers, 8 bit values */
181 struct i2c_msg msg
[] = {
182 { .addr
= 0x98 >> 1, .flags
= 0, .buf
= b0
, .len
= 1 },
183 { .addr
= 0x98 >> 1, .flags
= I2C_M_RD
, .buf
= b1
, .len
= 1 }
186 ret
= i2c_transfer(&dev
->i2c_bus
[2].i2c_adap
, &msg
[0], 2);
188 pr_err("%s() error\n", __func__
);
193 static void cx23885_flatiron_dump(struct cx23885_dev
*dev
)
196 dprintk(1, "Flatiron dump\n");
197 for (i
= 0; i
< 0x24; i
++) {
198 dprintk(1, "FI[%02x] = %02x\n", i
,
199 cx23885_flatiron_read(dev
, i
));
203 static int cx23885_flatiron_mux(struct cx23885_dev
*dev
, int input
)
206 dprintk(1, "%s(input = %d)\n", __func__
, input
);
209 val
= cx23885_flatiron_read(dev
, CH_PWR_CTRL1
) & ~FLD_CH_SEL
;
211 val
= cx23885_flatiron_read(dev
, CH_PWR_CTRL1
) | FLD_CH_SEL
;
215 val
|= 0x20; /* Enable clock to delta-sigma and dec filter */
217 cx23885_flatiron_write(dev
, CH_PWR_CTRL1
, val
);
220 cx23885_flatiron_write(dev
, CH_PWR_CTRL2
, 0);
223 cx23885_flatiron_dump(dev
);
228 static int cx23885_video_mux(struct cx23885_dev
*dev
, unsigned int input
)
230 dprintk(1, "%s() video_mux: %d [vmux=%d, gpio=0x%x,0x%x,0x%x,0x%x]\n",
232 input
, INPUT(input
)->vmux
,
233 INPUT(input
)->gpio0
, INPUT(input
)->gpio1
,
234 INPUT(input
)->gpio2
, INPUT(input
)->gpio3
);
237 if (dev
->board
== CX23885_BOARD_MYGICA_X8506
||
238 dev
->board
== CX23885_BOARD_MAGICPRO_PROHDTVE2
||
239 dev
->board
== CX23885_BOARD_MYGICA_X8507
) {
240 /* Select Analog TV */
241 if (INPUT(input
)->type
== CX23885_VMUX_TELEVISION
)
242 cx23885_gpio_clear(dev
, GPIO_0
);
245 /* Tell the internal A/V decoder */
246 v4l2_subdev_call(dev
->sd_cx25840
, video
, s_routing
,
247 INPUT(input
)->vmux
, 0, 0);
249 if ((dev
->board
== CX23885_BOARD_HAUPPAUGE_HVR1800
) ||
250 (dev
->board
== CX23885_BOARD_MPX885
) ||
251 (dev
->board
== CX23885_BOARD_HAUPPAUGE_HVR1250
) ||
252 (dev
->board
== CX23885_BOARD_HAUPPAUGE_IMPACTVCBE
) ||
253 (dev
->board
== CX23885_BOARD_HAUPPAUGE_HVR1255
) ||
254 (dev
->board
== CX23885_BOARD_HAUPPAUGE_HVR1255_22111
) ||
255 (dev
->board
== CX23885_BOARD_HAUPPAUGE_HVR1265_K4
) ||
256 (dev
->board
== CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC
) ||
257 (dev
->board
== CX23885_BOARD_HAUPPAUGE_QUADHD_DVB
) ||
258 (dev
->board
== CX23885_BOARD_HAUPPAUGE_HVR1850
) ||
259 (dev
->board
== CX23885_BOARD_HAUPPAUGE_HVR5525
) ||
260 (dev
->board
== CX23885_BOARD_MYGICA_X8507
) ||
261 (dev
->board
== CX23885_BOARD_AVERMEDIA_HC81R
) ||
262 (dev
->board
== CX23885_BOARD_VIEWCAST_260E
) ||
263 (dev
->board
== CX23885_BOARD_VIEWCAST_460E
) ||
264 (dev
->board
== CX23885_BOARD_AVERMEDIA_CE310B
)) {
265 /* Configure audio routing */
266 v4l2_subdev_call(dev
->sd_cx25840
, audio
, s_routing
,
267 INPUT(input
)->amux
, 0, 0);
269 if (INPUT(input
)->amux
== CX25840_AUDIO7
)
270 cx23885_flatiron_mux(dev
, 1);
271 else if (INPUT(input
)->amux
== CX25840_AUDIO6
)
272 cx23885_flatiron_mux(dev
, 2);
278 static int cx23885_audio_mux(struct cx23885_dev
*dev
, unsigned int input
)
280 dprintk(1, "%s(input=%d)\n", __func__
, input
);
282 /* The baseband video core of the cx23885 has two audio inputs.
283 * LR1 and LR2. In almost every single case so far only HVR1xxx
284 * cards we've only ever supported LR1. Time to support LR2,
285 * which is available via the optional white breakout header on
287 * We'll use a could of existing enums in the card struct to allow
288 * devs to specify which baseband input they need, or just default
289 * to what we've always used.
291 if (INPUT(input
)->amux
== CX25840_AUDIO7
)
292 cx23885_flatiron_mux(dev
, 1);
293 else if (INPUT(input
)->amux
== CX25840_AUDIO6
)
294 cx23885_flatiron_mux(dev
, 2);
296 /* Not specifically defined, assume the default. */
297 cx23885_flatiron_mux(dev
, 1);
303 /* ------------------------------------------------------------------ */
304 static int cx23885_start_video_dma(struct cx23885_dev
*dev
,
305 struct cx23885_dmaqueue
*q
,
306 struct cx23885_buffer
*buf
)
308 dprintk(1, "%s()\n", __func__
);
310 /* Stop the dma/fifo before we tamper with it's risc programs */
311 cx_clear(VID_A_DMA_CTL
, 0x11);
313 /* setup fifo + format */
314 cx23885_sram_channel_setup(dev
, &dev
->sram_channels
[SRAM_CH01
],
315 buf
->bpl
, buf
->risc
.dma
);
318 cx_write(VID_A_GPCNT_CTL
, 3);
322 cx23885_irq_add_enable(dev
, 0x01);
323 cx_set(VID_A_INT_MSK
, 0x000011);
326 cx_set(DEV_CNTRL2
, (1<<5));
327 cx_set(VID_A_DMA_CTL
, 0x11); /* FIFO and RISC enable */
332 static int queue_setup(struct vb2_queue
*q
,
333 unsigned int *num_buffers
, unsigned int *num_planes
,
334 unsigned int sizes
[], struct device
*alloc_devs
[])
336 struct cx23885_dev
*dev
= q
->drv_priv
;
339 sizes
[0] = (dev
->fmt
->depth
* dev
->width
* dev
->height
) >> 3;
343 static int buffer_prepare(struct vb2_buffer
*vb
)
346 struct vb2_v4l2_buffer
*vbuf
= to_vb2_v4l2_buffer(vb
);
347 struct cx23885_dev
*dev
= vb
->vb2_queue
->drv_priv
;
348 struct cx23885_buffer
*buf
=
349 container_of(vbuf
, struct cx23885_buffer
, vb
);
350 u32 line0_offset
, line1_offset
;
351 struct sg_table
*sgt
= vb2_dma_sg_plane_desc(vb
, 0);
354 buf
->bpl
= (dev
->width
* dev
->fmt
->depth
) >> 3;
356 if (vb2_plane_size(vb
, 0) < dev
->height
* buf
->bpl
)
358 vb2_set_plane_payload(vb
, 0, dev
->height
* buf
->bpl
);
360 switch (dev
->field
) {
362 ret
= cx23885_risc_buffer(dev
->pci
, &buf
->risc
,
364 buf
->bpl
, 0, dev
->height
);
366 case V4L2_FIELD_BOTTOM
:
367 ret
= cx23885_risc_buffer(dev
->pci
, &buf
->risc
,
369 buf
->bpl
, 0, dev
->height
);
371 case V4L2_FIELD_INTERLACED
:
372 if (dev
->tvnorm
& V4L2_STD_525_60
)
378 if (cx23885_boards
[dev
->board
].force_bff
)
379 /* PAL / SECAM OR 888 in NTSC MODE */
383 /* cx25840 transmits NTSC bottom field first */
384 dprintk(1, "%s() Creating TFF/NTSC risc\n",
386 line0_offset
= buf
->bpl
;
389 /* All other formats are top field first */
390 dprintk(1, "%s() Creating BFF/PAL/SECAM risc\n",
393 line1_offset
= buf
->bpl
;
395 ret
= cx23885_risc_buffer(dev
->pci
, &buf
->risc
,
396 sgt
->sgl
, line0_offset
,
401 case V4L2_FIELD_SEQ_TB
:
402 ret
= cx23885_risc_buffer(dev
->pci
, &buf
->risc
,
404 0, buf
->bpl
* (dev
->height
>> 1),
408 case V4L2_FIELD_SEQ_BT
:
409 ret
= cx23885_risc_buffer(dev
->pci
, &buf
->risc
,
411 buf
->bpl
* (dev
->height
>> 1), 0,
416 return -EINVAL
; /* should not happen */
418 dprintk(2, "[%p/%d] buffer_init - %dx%d %dbpp 0x%08x - dma=0x%08lx\n",
419 buf
, buf
->vb
.vb2_buf
.index
,
420 dev
->width
, dev
->height
, dev
->fmt
->depth
, dev
->fmt
->fourcc
,
421 (unsigned long)buf
->risc
.dma
);
425 static void buffer_finish(struct vb2_buffer
*vb
)
427 struct vb2_v4l2_buffer
*vbuf
= to_vb2_v4l2_buffer(vb
);
428 struct cx23885_buffer
*buf
= container_of(vbuf
,
429 struct cx23885_buffer
, vb
);
431 cx23885_free_buffer(vb
->vb2_queue
->drv_priv
, buf
);
435 * The risc program for each buffer works as follows: it starts with a simple
436 * 'JUMP to addr + 12', which is effectively a NOP. Then the code to DMA the
437 * buffer follows and at the end we have a JUMP back to the start + 12 (skipping
440 * This is the risc program of the first buffer to be queued if the active list
441 * is empty and it just keeps DMAing this buffer without generating any
444 * If a new buffer is added then the initial JUMP in the code for that buffer
445 * will generate an interrupt which signals that the previous buffer has been
446 * DMAed successfully and that it can be returned to userspace.
448 * It also sets the final jump of the previous buffer to the start of the new
449 * buffer, thus chaining the new buffer into the DMA chain. This is a single
450 * atomic u32 write, so there is no race condition.
452 * The end-result of all this that you only get an interrupt when a buffer
453 * is ready, so the control flow is very easy.
455 static void buffer_queue(struct vb2_buffer
*vb
)
457 struct vb2_v4l2_buffer
*vbuf
= to_vb2_v4l2_buffer(vb
);
458 struct cx23885_dev
*dev
= vb
->vb2_queue
->drv_priv
;
459 struct cx23885_buffer
*buf
= container_of(vbuf
,
460 struct cx23885_buffer
, vb
);
461 struct cx23885_buffer
*prev
;
462 struct cx23885_dmaqueue
*q
= &dev
->vidq
;
465 /* add jump to start */
466 buf
->risc
.cpu
[1] = cpu_to_le32(buf
->risc
.dma
+ 12);
467 buf
->risc
.jmp
[0] = cpu_to_le32(RISC_JUMP
| RISC_CNT_INC
);
468 buf
->risc
.jmp
[1] = cpu_to_le32(buf
->risc
.dma
+ 12);
469 buf
->risc
.jmp
[2] = cpu_to_le32(0); /* bits 63-32 */
471 spin_lock_irqsave(&dev
->slock
, flags
);
472 if (list_empty(&q
->active
)) {
473 list_add_tail(&buf
->queue
, &q
->active
);
474 dprintk(2, "[%p/%d] buffer_queue - first active\n",
475 buf
, buf
->vb
.vb2_buf
.index
);
477 buf
->risc
.cpu
[0] |= cpu_to_le32(RISC_IRQ1
);
478 prev
= list_entry(q
->active
.prev
, struct cx23885_buffer
,
480 list_add_tail(&buf
->queue
, &q
->active
);
481 prev
->risc
.jmp
[1] = cpu_to_le32(buf
->risc
.dma
);
482 dprintk(2, "[%p/%d] buffer_queue - append to active\n",
483 buf
, buf
->vb
.vb2_buf
.index
);
485 spin_unlock_irqrestore(&dev
->slock
, flags
);
488 static int cx23885_start_streaming(struct vb2_queue
*q
, unsigned int count
)
490 struct cx23885_dev
*dev
= q
->drv_priv
;
491 struct cx23885_dmaqueue
*dmaq
= &dev
->vidq
;
492 struct cx23885_buffer
*buf
= list_entry(dmaq
->active
.next
,
493 struct cx23885_buffer
, queue
);
495 cx23885_start_video_dma(dev
, dmaq
, buf
);
499 static void cx23885_stop_streaming(struct vb2_queue
*q
)
501 struct cx23885_dev
*dev
= q
->drv_priv
;
502 struct cx23885_dmaqueue
*dmaq
= &dev
->vidq
;
505 cx_clear(VID_A_DMA_CTL
, 0x11);
506 spin_lock_irqsave(&dev
->slock
, flags
);
507 while (!list_empty(&dmaq
->active
)) {
508 struct cx23885_buffer
*buf
= list_entry(dmaq
->active
.next
,
509 struct cx23885_buffer
, queue
);
511 list_del(&buf
->queue
);
512 vb2_buffer_done(&buf
->vb
.vb2_buf
, VB2_BUF_STATE_ERROR
);
514 spin_unlock_irqrestore(&dev
->slock
, flags
);
517 static const struct vb2_ops cx23885_video_qops
= {
518 .queue_setup
= queue_setup
,
519 .buf_prepare
= buffer_prepare
,
520 .buf_finish
= buffer_finish
,
521 .buf_queue
= buffer_queue
,
522 .start_streaming
= cx23885_start_streaming
,
523 .stop_streaming
= cx23885_stop_streaming
,
526 /* ------------------------------------------------------------------ */
529 static int vidioc_g_fmt_vid_cap(struct file
*file
, void *priv
,
530 struct v4l2_format
*f
)
532 struct cx23885_dev
*dev
= video_drvdata(file
);
534 f
->fmt
.pix
.width
= dev
->width
;
535 f
->fmt
.pix
.height
= dev
->height
;
536 f
->fmt
.pix
.field
= dev
->field
;
537 f
->fmt
.pix
.pixelformat
= dev
->fmt
->fourcc
;
538 f
->fmt
.pix
.bytesperline
=
539 (f
->fmt
.pix
.width
* dev
->fmt
->depth
) >> 3;
540 f
->fmt
.pix
.sizeimage
=
541 f
->fmt
.pix
.height
* f
->fmt
.pix
.bytesperline
;
542 f
->fmt
.pix
.colorspace
= V4L2_COLORSPACE_SMPTE170M
;
547 static int vidioc_try_fmt_vid_cap(struct file
*file
, void *priv
,
548 struct v4l2_format
*f
)
550 struct cx23885_dev
*dev
= video_drvdata(file
);
551 struct cx23885_fmt
*fmt
;
552 enum v4l2_field field
;
553 unsigned int maxw
, maxh
;
555 fmt
= format_by_fourcc(f
->fmt
.pix
.pixelformat
);
559 field
= f
->fmt
.pix
.field
;
561 maxh
= norm_maxh(dev
->tvnorm
);
563 if (V4L2_FIELD_ANY
== field
) {
564 field
= (f
->fmt
.pix
.height
> maxh
/2)
565 ? V4L2_FIELD_INTERLACED
571 case V4L2_FIELD_BOTTOM
:
574 case V4L2_FIELD_INTERLACED
:
575 case V4L2_FIELD_SEQ_TB
:
576 case V4L2_FIELD_SEQ_BT
:
579 field
= V4L2_FIELD_INTERLACED
;
583 f
->fmt
.pix
.field
= field
;
584 v4l_bound_align_image(&f
->fmt
.pix
.width
, 48, maxw
, 2,
585 &f
->fmt
.pix
.height
, 32, maxh
, 0, 0);
586 f
->fmt
.pix
.bytesperline
=
587 (f
->fmt
.pix
.width
* fmt
->depth
) >> 3;
588 f
->fmt
.pix
.sizeimage
=
589 f
->fmt
.pix
.height
* f
->fmt
.pix
.bytesperline
;
590 f
->fmt
.pix
.colorspace
= V4L2_COLORSPACE_SMPTE170M
;
595 static int vidioc_s_fmt_vid_cap(struct file
*file
, void *priv
,
596 struct v4l2_format
*f
)
598 struct cx23885_dev
*dev
= video_drvdata(file
);
599 struct v4l2_subdev_format format
= {
600 .which
= V4L2_SUBDEV_FORMAT_ACTIVE
,
604 dprintk(2, "%s()\n", __func__
);
605 err
= vidioc_try_fmt_vid_cap(file
, priv
, f
);
610 if (vb2_is_busy(&dev
->vb2_vidq
) || vb2_is_busy(&dev
->vb2_vbiq
) ||
611 vb2_is_busy(&dev
->vb2_mpegq
))
614 dev
->fmt
= format_by_fourcc(f
->fmt
.pix
.pixelformat
);
615 dev
->width
= f
->fmt
.pix
.width
;
616 dev
->height
= f
->fmt
.pix
.height
;
617 dev
->field
= f
->fmt
.pix
.field
;
618 dprintk(2, "%s() width=%d height=%d field=%d\n", __func__
,
619 dev
->width
, dev
->height
, dev
->field
);
620 v4l2_fill_mbus_format(&format
.format
, &f
->fmt
.pix
, MEDIA_BUS_FMT_FIXED
);
621 call_all(dev
, pad
, set_fmt
, NULL
, &format
);
622 v4l2_fill_pix_format(&f
->fmt
.pix
, &format
.format
);
623 /* set_fmt overwrites f->fmt.pix.field, restore it */
624 f
->fmt
.pix
.field
= dev
->field
;
628 static int vidioc_querycap(struct file
*file
, void *priv
,
629 struct v4l2_capability
*cap
)
631 struct cx23885_dev
*dev
= video_drvdata(file
);
633 strscpy(cap
->driver
, "cx23885", sizeof(cap
->driver
));
634 strscpy(cap
->card
, cx23885_boards
[dev
->board
].name
,
636 sprintf(cap
->bus_info
, "PCIe:%s", pci_name(dev
->pci
));
637 cap
->capabilities
= V4L2_CAP_READWRITE
| V4L2_CAP_STREAMING
|
638 V4L2_CAP_AUDIO
| V4L2_CAP_VBI_CAPTURE
|
639 V4L2_CAP_VIDEO_CAPTURE
|
640 V4L2_CAP_DEVICE_CAPS
;
641 switch (dev
->board
) { /* i2c device tuners */
642 case CX23885_BOARD_HAUPPAUGE_HVR1265_K4
:
643 case CX23885_BOARD_HAUPPAUGE_HVR5525
:
644 case CX23885_BOARD_HAUPPAUGE_QUADHD_DVB
:
645 case CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC
:
646 cap
->capabilities
|= V4L2_CAP_TUNER
;
649 if (dev
->tuner_type
!= TUNER_ABSENT
)
650 cap
->capabilities
|= V4L2_CAP_TUNER
;
656 static int vidioc_enum_fmt_vid_cap(struct file
*file
, void *priv
,
657 struct v4l2_fmtdesc
*f
)
659 if (unlikely(f
->index
>= ARRAY_SIZE(formats
)))
662 f
->pixelformat
= formats
[f
->index
].fourcc
;
667 static int vidioc_g_pixelaspect(struct file
*file
, void *priv
,
668 int type
, struct v4l2_fract
*f
)
670 struct cx23885_dev
*dev
= video_drvdata(file
);
671 bool is_50hz
= dev
->tvnorm
& V4L2_STD_625_50
;
673 if (type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
676 f
->numerator
= is_50hz
? 54 : 11;
677 f
->denominator
= is_50hz
? 59 : 10;
682 static int vidioc_g_selection(struct file
*file
, void *fh
,
683 struct v4l2_selection
*sel
)
685 struct cx23885_dev
*dev
= video_drvdata(file
);
687 if (sel
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
690 switch (sel
->target
) {
691 case V4L2_SEL_TGT_CROP_BOUNDS
:
692 case V4L2_SEL_TGT_CROP_DEFAULT
:
696 sel
->r
.height
= norm_maxh(dev
->tvnorm
);
704 static int vidioc_g_std(struct file
*file
, void *priv
, v4l2_std_id
*id
)
706 struct cx23885_dev
*dev
= video_drvdata(file
);
707 dprintk(1, "%s()\n", __func__
);
713 static int vidioc_s_std(struct file
*file
, void *priv
, v4l2_std_id tvnorms
)
715 struct cx23885_dev
*dev
= video_drvdata(file
);
716 dprintk(1, "%s()\n", __func__
);
718 return cx23885_set_tvnorm(dev
, tvnorms
);
721 int cx23885_enum_input(struct cx23885_dev
*dev
, struct v4l2_input
*i
)
723 static const char *iname
[] = {
724 [CX23885_VMUX_COMPOSITE1
] = "Composite1",
725 [CX23885_VMUX_COMPOSITE2
] = "Composite2",
726 [CX23885_VMUX_COMPOSITE3
] = "Composite3",
727 [CX23885_VMUX_COMPOSITE4
] = "Composite4",
728 [CX23885_VMUX_SVIDEO
] = "S-Video",
729 [CX23885_VMUX_COMPONENT
] = "Component",
730 [CX23885_VMUX_TELEVISION
] = "Television",
731 [CX23885_VMUX_CABLE
] = "Cable TV",
732 [CX23885_VMUX_DVB
] = "DVB",
733 [CX23885_VMUX_DEBUG
] = "for debug only",
736 dprintk(1, "%s()\n", __func__
);
739 if (n
>= MAX_CX23885_INPUT
)
742 if (0 == INPUT(n
)->type
)
746 i
->type
= V4L2_INPUT_TYPE_CAMERA
;
747 strscpy(i
->name
, iname
[INPUT(n
)->type
], sizeof(i
->name
));
748 i
->std
= CX23885_NORMS
;
749 if ((CX23885_VMUX_TELEVISION
== INPUT(n
)->type
) ||
750 (CX23885_VMUX_CABLE
== INPUT(n
)->type
)) {
751 i
->type
= V4L2_INPUT_TYPE_TUNER
;
754 /* Two selectable audio inputs for non-tv inputs */
758 if (dev
->input
== n
) {
759 /* enum'd input matches our configured input.
760 * Ask the video decoder to process the call
761 * and give it an oppertunity to update the
764 call_all(dev
, video
, g_input_status
, &i
->status
);
770 static int vidioc_enum_input(struct file
*file
, void *priv
,
771 struct v4l2_input
*i
)
773 struct cx23885_dev
*dev
= video_drvdata(file
);
774 dprintk(1, "%s()\n", __func__
);
775 return cx23885_enum_input(dev
, i
);
778 int cx23885_get_input(struct file
*file
, void *priv
, unsigned int *i
)
780 struct cx23885_dev
*dev
= video_drvdata(file
);
783 dprintk(1, "%s() returns %d\n", __func__
, *i
);
787 static int vidioc_g_input(struct file
*file
, void *priv
, unsigned int *i
)
789 return cx23885_get_input(file
, priv
, i
);
792 int cx23885_set_input(struct file
*file
, void *priv
, unsigned int i
)
794 struct cx23885_dev
*dev
= video_drvdata(file
);
796 dprintk(1, "%s(%d)\n", __func__
, i
);
798 if (i
>= MAX_CX23885_INPUT
) {
799 dprintk(1, "%s() -EINVAL\n", __func__
);
803 if (INPUT(i
)->type
== 0)
806 cx23885_video_mux(dev
, i
);
808 /* By default establish the default audio input for the card also */
809 /* Caller is free to use VIDIOC_S_AUDIO to override afterwards */
810 cx23885_audio_mux(dev
, i
);
814 static int vidioc_s_input(struct file
*file
, void *priv
, unsigned int i
)
816 return cx23885_set_input(file
, priv
, i
);
819 static int vidioc_log_status(struct file
*file
, void *priv
)
821 struct cx23885_dev
*dev
= video_drvdata(file
);
823 call_all(dev
, core
, log_status
);
827 static int cx23885_query_audinput(struct file
*file
, void *priv
,
828 struct v4l2_audio
*i
)
830 static const char *iname
[] = {
831 [0] = "Baseband L/R 1",
832 [1] = "Baseband L/R 2",
836 dprintk(1, "%s()\n", __func__
);
842 memset(i
, 0, sizeof(*i
));
844 strscpy(i
->name
, iname
[n
], sizeof(i
->name
));
845 i
->capability
= V4L2_AUDCAP_STEREO
;
850 static int vidioc_enum_audinput(struct file
*file
, void *priv
,
851 struct v4l2_audio
*i
)
853 return cx23885_query_audinput(file
, priv
, i
);
856 static int vidioc_g_audinput(struct file
*file
, void *priv
,
857 struct v4l2_audio
*i
)
859 struct cx23885_dev
*dev
= video_drvdata(file
);
861 if ((CX23885_VMUX_TELEVISION
== INPUT(dev
->input
)->type
) ||
862 (CX23885_VMUX_CABLE
== INPUT(dev
->input
)->type
))
865 i
->index
= dev
->audinput
;
866 dprintk(1, "%s(input=%d)\n", __func__
, i
->index
);
868 return cx23885_query_audinput(file
, priv
, i
);
871 static int vidioc_s_audinput(struct file
*file
, void *priv
,
872 const struct v4l2_audio
*i
)
874 struct cx23885_dev
*dev
= video_drvdata(file
);
876 if ((CX23885_VMUX_TELEVISION
== INPUT(dev
->input
)->type
) ||
877 (CX23885_VMUX_CABLE
== INPUT(dev
->input
)->type
)) {
878 return i
->index
!= 2 ? -EINVAL
: 0;
883 dprintk(1, "%s(%d)\n", __func__
, i
->index
);
885 dev
->audinput
= i
->index
;
887 /* Skip the audio defaults from the cards struct, caller wants
888 * directly touch the audio mux hardware. */
889 cx23885_flatiron_mux(dev
, dev
->audinput
+ 1);
893 static int vidioc_g_tuner(struct file
*file
, void *priv
,
894 struct v4l2_tuner
*t
)
896 struct cx23885_dev
*dev
= video_drvdata(file
);
898 switch (dev
->board
) { /* i2c device tuners */
899 case CX23885_BOARD_HAUPPAUGE_HVR1265_K4
:
900 case CX23885_BOARD_HAUPPAUGE_HVR5525
:
901 case CX23885_BOARD_HAUPPAUGE_QUADHD_DVB
:
902 case CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC
:
905 if (dev
->tuner_type
== TUNER_ABSENT
)
912 strscpy(t
->name
, "Television", sizeof(t
->name
));
914 call_all(dev
, tuner
, g_tuner
, t
);
918 static int vidioc_s_tuner(struct file
*file
, void *priv
,
919 const struct v4l2_tuner
*t
)
921 struct cx23885_dev
*dev
= video_drvdata(file
);
923 switch (dev
->board
) { /* i2c device tuners */
924 case CX23885_BOARD_HAUPPAUGE_HVR1265_K4
:
925 case CX23885_BOARD_HAUPPAUGE_HVR5525
:
926 case CX23885_BOARD_HAUPPAUGE_QUADHD_DVB
:
927 case CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC
:
930 if (dev
->tuner_type
== TUNER_ABSENT
)
936 /* Update the A/V core */
937 call_all(dev
, tuner
, s_tuner
, t
);
942 static int vidioc_g_frequency(struct file
*file
, void *priv
,
943 struct v4l2_frequency
*f
)
945 struct cx23885_dev
*dev
= video_drvdata(file
);
947 switch (dev
->board
) { /* i2c device tuners */
948 case CX23885_BOARD_HAUPPAUGE_HVR1265_K4
:
949 case CX23885_BOARD_HAUPPAUGE_HVR5525
:
950 case CX23885_BOARD_HAUPPAUGE_QUADHD_DVB
:
951 case CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC
:
954 if (dev
->tuner_type
== TUNER_ABSENT
)
958 f
->type
= V4L2_TUNER_ANALOG_TV
;
959 f
->frequency
= dev
->freq
;
961 call_all(dev
, tuner
, g_frequency
, f
);
966 static int cx23885_set_freq(struct cx23885_dev
*dev
, const struct v4l2_frequency
*f
)
968 struct v4l2_ctrl
*mute
;
969 int old_mute_val
= 1;
971 switch (dev
->board
) { /* i2c device tuners */
972 case CX23885_BOARD_HAUPPAUGE_HVR1265_K4
:
973 case CX23885_BOARD_HAUPPAUGE_HVR5525
:
974 case CX23885_BOARD_HAUPPAUGE_QUADHD_DVB
:
975 case CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC
:
978 if (dev
->tuner_type
== TUNER_ABSENT
)
982 if (unlikely(f
->tuner
!= 0))
985 dev
->freq
= f
->frequency
;
987 /* I need to mute audio here */
988 mute
= v4l2_ctrl_find(&dev
->ctrl_handler
, V4L2_CID_AUDIO_MUTE
);
990 old_mute_val
= v4l2_ctrl_g_ctrl(mute
);
992 v4l2_ctrl_s_ctrl(mute
, 1);
995 call_all(dev
, tuner
, s_frequency
, f
);
997 /* When changing channels it is required to reset TVAUDIO */
1000 /* I need to unmute audio here */
1001 if (old_mute_val
== 0)
1002 v4l2_ctrl_s_ctrl(mute
, old_mute_val
);
1007 static int cx23885_set_freq_via_ops(struct cx23885_dev
*dev
,
1008 const struct v4l2_frequency
*f
)
1010 struct v4l2_ctrl
*mute
;
1011 int old_mute_val
= 1;
1012 struct vb2_dvb_frontend
*vfe
;
1013 struct dvb_frontend
*fe
;
1015 struct analog_parameters params
= {
1016 .mode
= V4L2_TUNER_ANALOG_TV
,
1017 .audmode
= V4L2_TUNER_MODE_STEREO
,
1019 .frequency
= f
->frequency
1022 dev
->freq
= f
->frequency
;
1024 /* I need to mute audio here */
1025 mute
= v4l2_ctrl_find(&dev
->ctrl_handler
, V4L2_CID_AUDIO_MUTE
);
1027 old_mute_val
= v4l2_ctrl_g_ctrl(mute
);
1029 v4l2_ctrl_s_ctrl(mute
, 1);
1033 dprintk(1, "%s() frequency=%d tuner=%d std=0x%llx\n", __func__
,
1034 params
.frequency
, f
->tuner
, params
.std
);
1036 vfe
= vb2_dvb_get_frontend(&dev
->ts2
.frontends
, 1);
1041 fe
= vfe
->dvb
.frontend
;
1043 if ((dev
->board
== CX23885_BOARD_HAUPPAUGE_HVR1850
) ||
1044 (dev
->board
== CX23885_BOARD_HAUPPAUGE_HVR1255
) ||
1045 (dev
->board
== CX23885_BOARD_HAUPPAUGE_HVR1255_22111
) ||
1046 (dev
->board
== CX23885_BOARD_HAUPPAUGE_HVR1265_K4
) ||
1047 (dev
->board
== CX23885_BOARD_HAUPPAUGE_HVR5525
) ||
1048 (dev
->board
== CX23885_BOARD_HAUPPAUGE_QUADHD_DVB
) ||
1049 (dev
->board
== CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC
))
1050 fe
= &dev
->ts1
.analog_fe
;
1052 if (fe
&& fe
->ops
.tuner_ops
.set_analog_params
) {
1053 call_all(dev
, video
, s_std
, dev
->tvnorm
);
1054 fe
->ops
.tuner_ops
.set_analog_params(fe
, ¶ms
);
1057 pr_err("%s() No analog tuner, aborting\n", __func__
);
1059 /* When changing channels it is required to reset TVAUDIO */
1062 /* I need to unmute audio here */
1063 if (old_mute_val
== 0)
1064 v4l2_ctrl_s_ctrl(mute
, old_mute_val
);
1069 int cx23885_set_frequency(struct file
*file
, void *priv
,
1070 const struct v4l2_frequency
*f
)
1072 struct cx23885_dev
*dev
= video_drvdata(file
);
1075 switch (dev
->board
) {
1076 case CX23885_BOARD_HAUPPAUGE_HVR1255
:
1077 case CX23885_BOARD_HAUPPAUGE_HVR1255_22111
:
1078 case CX23885_BOARD_HAUPPAUGE_HVR1265_K4
:
1079 case CX23885_BOARD_HAUPPAUGE_HVR1850
:
1080 case CX23885_BOARD_HAUPPAUGE_HVR5525
:
1081 case CX23885_BOARD_HAUPPAUGE_QUADHD_DVB
:
1082 case CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC
:
1083 ret
= cx23885_set_freq_via_ops(dev
, f
);
1086 ret
= cx23885_set_freq(dev
, f
);
1092 static int vidioc_s_frequency(struct file
*file
, void *priv
,
1093 const struct v4l2_frequency
*f
)
1095 return cx23885_set_frequency(file
, priv
, f
);
1098 /* ----------------------------------------------------------- */
1100 int cx23885_video_irq(struct cx23885_dev
*dev
, u32 status
)
1105 mask
= cx_read(VID_A_INT_MSK
);
1106 if (0 == (status
& mask
))
1109 cx_write(VID_A_INT_STAT
, status
);
1111 /* risc op code error, fifo overflow or line sync detection error */
1112 if ((status
& VID_BC_MSK_OPC_ERR
) ||
1113 (status
& VID_BC_MSK_SYNC
) ||
1114 (status
& VID_BC_MSK_OF
)) {
1116 if (status
& VID_BC_MSK_OPC_ERR
) {
1117 dprintk(7, " (VID_BC_MSK_OPC_ERR 0x%08x)\n",
1118 VID_BC_MSK_OPC_ERR
);
1119 pr_warn("%s: video risc op code error\n",
1121 cx23885_sram_channel_dump(dev
,
1122 &dev
->sram_channels
[SRAM_CH01
]);
1125 if (status
& VID_BC_MSK_SYNC
)
1126 dprintk(7, " (VID_BC_MSK_SYNC 0x%08x) video lines miss-match\n",
1129 if (status
& VID_BC_MSK_OF
)
1130 dprintk(7, " (VID_BC_MSK_OF 0x%08x) fifo overflow\n",
1136 if (status
& VID_BC_MSK_RISCI1
) {
1137 spin_lock(&dev
->slock
);
1138 count
= cx_read(VID_A_GPCNT
);
1139 cx23885_video_wakeup(dev
, &dev
->vidq
, count
);
1140 spin_unlock(&dev
->slock
);
1144 /* Allow the VBI framework to process it's payload */
1145 handled
+= cx23885_vbi_irq(dev
, status
);
1150 /* ----------------------------------------------------------- */
1151 /* exported stuff */
1153 static const struct v4l2_file_operations video_fops
= {
1154 .owner
= THIS_MODULE
,
1155 .open
= v4l2_fh_open
,
1156 .release
= vb2_fop_release
,
1157 .read
= vb2_fop_read
,
1158 .poll
= vb2_fop_poll
,
1159 .unlocked_ioctl
= video_ioctl2
,
1160 .mmap
= vb2_fop_mmap
,
1163 static const struct v4l2_ioctl_ops video_ioctl_ops
= {
1164 .vidioc_querycap
= vidioc_querycap
,
1165 .vidioc_enum_fmt_vid_cap
= vidioc_enum_fmt_vid_cap
,
1166 .vidioc_g_fmt_vid_cap
= vidioc_g_fmt_vid_cap
,
1167 .vidioc_try_fmt_vid_cap
= vidioc_try_fmt_vid_cap
,
1168 .vidioc_s_fmt_vid_cap
= vidioc_s_fmt_vid_cap
,
1169 .vidioc_g_fmt_vbi_cap
= cx23885_vbi_fmt
,
1170 .vidioc_try_fmt_vbi_cap
= cx23885_vbi_fmt
,
1171 .vidioc_s_fmt_vbi_cap
= cx23885_vbi_fmt
,
1172 .vidioc_reqbufs
= vb2_ioctl_reqbufs
,
1173 .vidioc_prepare_buf
= vb2_ioctl_prepare_buf
,
1174 .vidioc_querybuf
= vb2_ioctl_querybuf
,
1175 .vidioc_qbuf
= vb2_ioctl_qbuf
,
1176 .vidioc_dqbuf
= vb2_ioctl_dqbuf
,
1177 .vidioc_streamon
= vb2_ioctl_streamon
,
1178 .vidioc_streamoff
= vb2_ioctl_streamoff
,
1179 .vidioc_g_pixelaspect
= vidioc_g_pixelaspect
,
1180 .vidioc_g_selection
= vidioc_g_selection
,
1181 .vidioc_s_std
= vidioc_s_std
,
1182 .vidioc_g_std
= vidioc_g_std
,
1183 .vidioc_enum_input
= vidioc_enum_input
,
1184 .vidioc_g_input
= vidioc_g_input
,
1185 .vidioc_s_input
= vidioc_s_input
,
1186 .vidioc_log_status
= vidioc_log_status
,
1187 .vidioc_g_tuner
= vidioc_g_tuner
,
1188 .vidioc_s_tuner
= vidioc_s_tuner
,
1189 .vidioc_g_frequency
= vidioc_g_frequency
,
1190 .vidioc_s_frequency
= vidioc_s_frequency
,
1191 #ifdef CONFIG_VIDEO_ADV_DEBUG
1192 .vidioc_g_chip_info
= cx23885_g_chip_info
,
1193 .vidioc_g_register
= cx23885_g_register
,
1194 .vidioc_s_register
= cx23885_s_register
,
1196 .vidioc_enumaudio
= vidioc_enum_audinput
,
1197 .vidioc_g_audio
= vidioc_g_audinput
,
1198 .vidioc_s_audio
= vidioc_s_audinput
,
1199 .vidioc_subscribe_event
= v4l2_ctrl_subscribe_event
,
1200 .vidioc_unsubscribe_event
= v4l2_event_unsubscribe
,
1203 static struct video_device cx23885_vbi_template
;
1204 static struct video_device cx23885_video_template
= {
1205 .name
= "cx23885-video",
1206 .fops
= &video_fops
,
1207 .ioctl_ops
= &video_ioctl_ops
,
1208 .tvnorms
= CX23885_NORMS
,
1211 void cx23885_video_unregister(struct cx23885_dev
*dev
)
1213 dprintk(1, "%s()\n", __func__
);
1214 cx23885_irq_remove(dev
, 0x01);
1217 if (video_is_registered(dev
->vbi_dev
))
1218 video_unregister_device(dev
->vbi_dev
);
1220 video_device_release(dev
->vbi_dev
);
1221 dev
->vbi_dev
= NULL
;
1223 if (dev
->video_dev
) {
1224 if (video_is_registered(dev
->video_dev
))
1225 video_unregister_device(dev
->video_dev
);
1227 video_device_release(dev
->video_dev
);
1228 dev
->video_dev
= NULL
;
1232 cx23885_audio_unregister(dev
);
1235 int cx23885_video_register(struct cx23885_dev
*dev
)
1237 struct vb2_queue
*q
;
1240 dprintk(1, "%s()\n", __func__
);
1242 /* Initialize VBI template */
1243 cx23885_vbi_template
= cx23885_video_template
;
1244 strscpy(cx23885_vbi_template
.name
, "cx23885-vbi",
1245 sizeof(cx23885_vbi_template
.name
));
1247 dev
->tvnorm
= V4L2_STD_NTSC_M
;
1248 dev
->fmt
= format_by_fourcc(V4L2_PIX_FMT_YUYV
);
1249 dev
->field
= V4L2_FIELD_INTERLACED
;
1251 dev
->height
= norm_maxh(dev
->tvnorm
);
1253 /* init video dma queues */
1254 INIT_LIST_HEAD(&dev
->vidq
.active
);
1256 /* init vbi dma queues */
1257 INIT_LIST_HEAD(&dev
->vbiq
.active
);
1259 cx23885_irq_add_enable(dev
, 0x01);
1261 if ((TUNER_ABSENT
!= dev
->tuner_type
) &&
1262 ((dev
->tuner_bus
== 0) || (dev
->tuner_bus
== 1))) {
1263 struct v4l2_subdev
*sd
= NULL
;
1265 if (dev
->tuner_addr
)
1266 sd
= v4l2_i2c_new_subdev(&dev
->v4l2_dev
,
1267 &dev
->i2c_bus
[dev
->tuner_bus
].i2c_adap
,
1268 "tuner", dev
->tuner_addr
, NULL
);
1270 sd
= v4l2_i2c_new_subdev(&dev
->v4l2_dev
,
1271 &dev
->i2c_bus
[dev
->tuner_bus
].i2c_adap
,
1272 "tuner", 0, v4l2_i2c_tuner_addrs(ADDRS_TV
));
1274 struct tuner_setup tun_setup
;
1276 memset(&tun_setup
, 0, sizeof(tun_setup
));
1277 tun_setup
.mode_mask
= T_ANALOG_TV
;
1278 tun_setup
.type
= dev
->tuner_type
;
1279 tun_setup
.addr
= v4l2_i2c_subdev_addr(sd
);
1280 tun_setup
.tuner_callback
= cx23885_tuner_callback
;
1282 v4l2_subdev_call(sd
, tuner
, s_type_addr
, &tun_setup
);
1284 if ((dev
->board
== CX23885_BOARD_LEADTEK_WINFAST_PXTV1200
) ||
1285 (dev
->board
== CX23885_BOARD_LEADTEK_WINFAST_PXPVR2200
)) {
1286 struct xc2028_ctrl ctrl
= {
1287 .fname
= XC2028_DEFAULT_FIRMWARE
,
1290 struct v4l2_priv_tun_config cfg
= {
1291 .tuner
= dev
->tuner_type
,
1294 v4l2_subdev_call(sd
, tuner
, s_config
, &cfg
);
1297 if (dev
->board
== CX23885_BOARD_AVERMEDIA_HC81R
) {
1298 struct xc2028_ctrl ctrl
= {
1299 .fname
= "xc3028L-v36.fw",
1302 struct v4l2_priv_tun_config cfg
= {
1303 .tuner
= dev
->tuner_type
,
1306 v4l2_subdev_call(sd
, tuner
, s_config
, &cfg
);
1311 /* initial device configuration */
1312 mutex_lock(&dev
->lock
);
1313 cx23885_set_tvnorm(dev
, dev
->tvnorm
);
1314 cx23885_video_mux(dev
, 0);
1315 cx23885_audio_mux(dev
, 0);
1316 mutex_unlock(&dev
->lock
);
1319 q
->type
= V4L2_BUF_TYPE_VIDEO_CAPTURE
;
1320 q
->io_modes
= VB2_MMAP
| VB2_USERPTR
| VB2_DMABUF
| VB2_READ
;
1321 q
->gfp_flags
= GFP_DMA32
;
1322 q
->min_queued_buffers
= 2;
1324 q
->buf_struct_size
= sizeof(struct cx23885_buffer
);
1325 q
->ops
= &cx23885_video_qops
;
1326 q
->mem_ops
= &vb2_dma_sg_memops
;
1327 q
->timestamp_flags
= V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC
;
1328 q
->lock
= &dev
->lock
;
1329 q
->dev
= &dev
->pci
->dev
;
1331 err
= vb2_queue_init(q
);
1336 q
->type
= V4L2_BUF_TYPE_VBI_CAPTURE
;
1337 q
->io_modes
= VB2_MMAP
| VB2_USERPTR
| VB2_DMABUF
| VB2_READ
;
1338 q
->gfp_flags
= GFP_DMA32
;
1339 q
->min_queued_buffers
= 2;
1341 q
->buf_struct_size
= sizeof(struct cx23885_buffer
);
1342 q
->ops
= &cx23885_vbi_qops
;
1343 q
->mem_ops
= &vb2_dma_sg_memops
;
1344 q
->timestamp_flags
= V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC
;
1345 q
->lock
= &dev
->lock
;
1346 q
->dev
= &dev
->pci
->dev
;
1348 err
= vb2_queue_init(q
);
1352 /* register Video device */
1353 dev
->video_dev
= cx23885_vdev_init(dev
, dev
->pci
,
1354 &cx23885_video_template
, "video");
1355 if (!dev
->video_dev
) {
1359 dev
->video_dev
->queue
= &dev
->vb2_vidq
;
1360 dev
->video_dev
->device_caps
= V4L2_CAP_READWRITE
| V4L2_CAP_STREAMING
|
1361 V4L2_CAP_AUDIO
| V4L2_CAP_VIDEO_CAPTURE
;
1362 switch (dev
->board
) { /* i2c device tuners */
1363 case CX23885_BOARD_HAUPPAUGE_HVR1265_K4
:
1364 case CX23885_BOARD_HAUPPAUGE_HVR5525
:
1365 case CX23885_BOARD_HAUPPAUGE_QUADHD_DVB
:
1366 case CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC
:
1367 dev
->video_dev
->device_caps
|= V4L2_CAP_TUNER
;
1370 if (dev
->tuner_type
!= TUNER_ABSENT
)
1371 dev
->video_dev
->device_caps
|= V4L2_CAP_TUNER
;
1374 err
= video_register_device(dev
->video_dev
, VFL_TYPE_VIDEO
,
1377 pr_info("%s: can't register video device\n",
1381 pr_info("%s: registered device %s [v4l2]\n",
1382 dev
->name
, video_device_node_name(dev
->video_dev
));
1384 /* register VBI device */
1385 dev
->vbi_dev
= cx23885_vdev_init(dev
, dev
->pci
,
1386 &cx23885_vbi_template
, "vbi");
1387 if (!dev
->vbi_dev
) {
1391 dev
->vbi_dev
->queue
= &dev
->vb2_vbiq
;
1392 dev
->vbi_dev
->device_caps
= V4L2_CAP_READWRITE
| V4L2_CAP_STREAMING
|
1393 V4L2_CAP_AUDIO
| V4L2_CAP_VBI_CAPTURE
;
1394 switch (dev
->board
) { /* i2c device tuners */
1395 case CX23885_BOARD_HAUPPAUGE_HVR1265_K4
:
1396 case CX23885_BOARD_HAUPPAUGE_HVR5525
:
1397 case CX23885_BOARD_HAUPPAUGE_QUADHD_DVB
:
1398 case CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC
:
1399 dev
->vbi_dev
->device_caps
|= V4L2_CAP_TUNER
;
1402 if (dev
->tuner_type
!= TUNER_ABSENT
)
1403 dev
->vbi_dev
->device_caps
|= V4L2_CAP_TUNER
;
1405 err
= video_register_device(dev
->vbi_dev
, VFL_TYPE_VBI
,
1408 pr_info("%s: can't register vbi device\n",
1412 pr_info("%s: registered device %s\n",
1413 dev
->name
, video_device_node_name(dev
->vbi_dev
));
1415 /* Register ALSA audio device */
1416 dev
->audio_dev
= cx23885_audio_register(dev
);
1421 cx23885_video_unregister(dev
);