1 // SPDX-License-Identifier: GPL-2.0-or-later
4 * device driver for philips saa7134 based TV cards
5 * video4linux video interface
7 * (c) 2001-03 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
11 #include "saa7134-reg.h"
13 #include <linux/init.h>
14 #include <linux/list.h>
15 #include <linux/module.h>
16 #include <linux/kernel.h>
17 #include <linux/slab.h>
18 #include <linux/sort.h>
20 #include <media/v4l2-common.h>
21 #include <media/v4l2-event.h>
22 #include <media/i2c/saa6588.h>
24 /* ------------------------------------------------------------------ */
26 unsigned int video_debug
;
27 static unsigned int gbuffers
= 8;
28 static unsigned int noninterlaced
; /* 0 */
29 static unsigned int gbufsize
= 720*576*4;
30 static unsigned int gbufsize_max
= 720*576*4;
31 static char secam
[] = "--";
32 module_param(video_debug
, int, 0644);
33 MODULE_PARM_DESC(video_debug
,"enable debug messages [video]");
34 module_param(gbuffers
, int, 0444);
35 MODULE_PARM_DESC(gbuffers
,"number of capture buffers, range 2-32");
36 module_param(noninterlaced
, int, 0644);
37 MODULE_PARM_DESC(noninterlaced
,"capture non interlaced video");
38 module_param_string(secam
, secam
, sizeof(secam
), 0644);
39 MODULE_PARM_DESC(secam
, "force SECAM variant, either DK,L or Lc");
42 #define video_dbg(fmt, arg...) do { \
43 if (video_debug & 0x04) \
44 printk(KERN_DEBUG pr_fmt("video: " fmt), ## arg); \
47 /* ------------------------------------------------------------------ */
48 /* Defines for Video Output Port Register at address 0x191 */
50 /* Bit 0: VIP code T bit polarity */
52 #define VP_T_CODE_P_NON_INVERTED 0x00
53 #define VP_T_CODE_P_INVERTED 0x01
55 /* ------------------------------------------------------------------ */
56 /* Defines for Video Output Port Register at address 0x195 */
58 /* Bit 2: Video output clock delay control */
60 #define VP_CLK_CTRL2_NOT_DELAYED 0x00
61 #define VP_CLK_CTRL2_DELAYED 0x04
63 /* Bit 1: Video output clock invert control */
65 #define VP_CLK_CTRL1_NON_INVERTED 0x00
66 #define VP_CLK_CTRL1_INVERTED 0x02
68 /* ------------------------------------------------------------------ */
69 /* Defines for Video Output Port Register at address 0x196 */
71 /* Bits 2 to 0: VSYNC pin video vertical sync type */
73 #define VP_VS_TYPE_MASK 0x07
75 #define VP_VS_TYPE_OFF 0x00
76 #define VP_VS_TYPE_V123 0x01
77 #define VP_VS_TYPE_V_ITU 0x02
78 #define VP_VS_TYPE_VGATE_L 0x03
79 #define VP_VS_TYPE_RESERVED1 0x04
80 #define VP_VS_TYPE_RESERVED2 0x05
81 #define VP_VS_TYPE_F_ITU 0x06
82 #define VP_VS_TYPE_SC_FID 0x07
84 /* ------------------------------------------------------------------ */
85 /* data structs for video */
87 static int video_out
[][9] = {
88 [CCIR656
] = { 0x00, 0xb1, 0x00, 0xa1, 0x00, 0x04, 0x06, 0x00, 0x00 },
91 static struct saa7134_format formats
[] = {
93 .fourcc
= V4L2_PIX_FMT_GREY
,
97 .fourcc
= V4L2_PIX_FMT_RGB555
,
101 .fourcc
= V4L2_PIX_FMT_RGB555X
,
106 .fourcc
= V4L2_PIX_FMT_RGB565
,
110 .fourcc
= V4L2_PIX_FMT_RGB565X
,
115 .fourcc
= V4L2_PIX_FMT_BGR24
,
119 .fourcc
= V4L2_PIX_FMT_RGB24
,
124 .fourcc
= V4L2_PIX_FMT_BGR32
,
128 .fourcc
= V4L2_PIX_FMT_RGB32
,
134 .fourcc
= V4L2_PIX_FMT_YUYV
,
140 .fourcc
= V4L2_PIX_FMT_UYVY
,
145 .fourcc
= V4L2_PIX_FMT_YUV422P
,
153 .fourcc
= V4L2_PIX_FMT_YUV420
,
161 .fourcc
= V4L2_PIX_FMT_YVU420
,
171 #define FORMATS ARRAY_SIZE(formats)
173 #define NORM_625_50 \
176 .video_v_start = 24, \
177 .video_v_stop = 311, \
178 .vbi_v_start_0 = 7, \
179 .vbi_v_stop_0 = 23, \
180 .vbi_v_start_1 = 319, \
183 #define NORM_525_60 \
186 .video_v_start = 23, \
187 .video_v_stop = 262, \
188 .vbi_v_start_0 = 10, \
189 .vbi_v_stop_0 = 21, \
190 .vbi_v_start_1 = 273, \
193 static struct saa7134_tvnorm tvnorms
[] = {
195 .name
= "PAL", /* autodetect */
199 .sync_control
= 0x18,
200 .luma_control
= 0x40,
201 .chroma_ctrl1
= 0x81,
203 .chroma_ctrl2
= 0x06,
208 .id
= V4L2_STD_PAL_BG
,
211 .sync_control
= 0x18,
212 .luma_control
= 0x40,
213 .chroma_ctrl1
= 0x81,
215 .chroma_ctrl2
= 0x06,
220 .id
= V4L2_STD_PAL_I
,
223 .sync_control
= 0x18,
224 .luma_control
= 0x40,
225 .chroma_ctrl1
= 0x81,
227 .chroma_ctrl2
= 0x06,
232 .id
= V4L2_STD_PAL_DK
,
235 .sync_control
= 0x18,
236 .luma_control
= 0x40,
237 .chroma_ctrl1
= 0x81,
239 .chroma_ctrl2
= 0x06,
247 .sync_control
= 0x59,
248 .luma_control
= 0x40,
249 .chroma_ctrl1
= 0x89,
251 .chroma_ctrl2
= 0x0e,
256 .id
= V4L2_STD_SECAM
,
259 .sync_control
= 0x18,
260 .luma_control
= 0x1b,
261 .chroma_ctrl1
= 0xd1,
263 .chroma_ctrl2
= 0x00,
268 .id
= V4L2_STD_SECAM_DK
,
271 .sync_control
= 0x18,
272 .luma_control
= 0x1b,
273 .chroma_ctrl1
= 0xd1,
275 .chroma_ctrl2
= 0x00,
280 .id
= V4L2_STD_SECAM_L
,
283 .sync_control
= 0x18,
284 .luma_control
= 0x1b,
285 .chroma_ctrl1
= 0xd1,
287 .chroma_ctrl2
= 0x00,
292 .id
= V4L2_STD_SECAM_LC
,
295 .sync_control
= 0x18,
296 .luma_control
= 0x1b,
297 .chroma_ctrl1
= 0xd1,
299 .chroma_ctrl2
= 0x00,
304 .id
= V4L2_STD_PAL_M
,
307 .sync_control
= 0x59,
308 .luma_control
= 0x40,
309 .chroma_ctrl1
= 0xb9,
311 .chroma_ctrl2
= 0x0e,
316 .id
= V4L2_STD_PAL_Nc
,
319 .sync_control
= 0x18,
320 .luma_control
= 0x40,
321 .chroma_ctrl1
= 0xa1,
323 .chroma_ctrl2
= 0x06,
328 .id
= V4L2_STD_PAL_60
,
336 .vbi_v_start_1
= 273,
339 .sync_control
= 0x18,
340 .luma_control
= 0x40,
341 .chroma_ctrl1
= 0x81,
343 .chroma_ctrl2
= 0x06,
347 #define TVNORMS ARRAY_SIZE(tvnorms)
349 static struct saa7134_format
* format_by_fourcc(unsigned int fourcc
)
353 for (i
= 0; i
< FORMATS
; i
++)
354 if (formats
[i
].fourcc
== fourcc
)
359 /* ------------------------------------------------------------------ */
361 static void set_tvnorm(struct saa7134_dev
*dev
, struct saa7134_tvnorm
*norm
)
363 video_dbg("set tv norm = %s\n", norm
->name
);
367 dev
->crop_bounds
.left
= norm
->h_start
;
368 dev
->crop_defrect
.left
= norm
->h_start
;
369 dev
->crop_bounds
.width
= norm
->h_stop
- norm
->h_start
+1;
370 dev
->crop_defrect
.width
= norm
->h_stop
- norm
->h_start
+1;
372 dev
->crop_bounds
.top
= (norm
->vbi_v_stop_0
+1)*2;
373 dev
->crop_defrect
.top
= norm
->video_v_start
*2;
374 dev
->crop_bounds
.height
= ((norm
->id
& V4L2_STD_525_60
) ? 524 : 624)
375 - dev
->crop_bounds
.top
;
376 dev
->crop_defrect
.height
= (norm
->video_v_stop
- norm
->video_v_start
+1)*2;
378 dev
->crop_current
= dev
->crop_defrect
;
380 saa7134_set_tvnorm_hw(dev
);
383 static void video_mux(struct saa7134_dev
*dev
, int input
)
385 video_dbg("video input = %d [%s]\n",
386 input
, saa7134_input_name
[card_in(dev
, input
).type
]);
387 dev
->ctl_input
= input
;
388 set_tvnorm(dev
, dev
->tvnorm
);
389 saa7134_tvaudio_setinput(dev
, &card_in(dev
, input
));
393 static void saa7134_set_decoder(struct saa7134_dev
*dev
)
395 int luma_control
, sync_control
, chroma_ctrl1
, mux
;
397 struct saa7134_tvnorm
*norm
= dev
->tvnorm
;
398 mux
= card_in(dev
, dev
->ctl_input
).vmux
;
400 luma_control
= norm
->luma_control
;
401 sync_control
= norm
->sync_control
;
402 chroma_ctrl1
= norm
->chroma_ctrl1
;
405 luma_control
|= 0x80; /* svideo */
406 if (noninterlaced
|| dev
->nosignal
)
407 sync_control
|= 0x20;
409 /* switch on auto standard detection */
410 sync_control
|= SAA7134_SYNC_CTRL_AUFD
;
411 chroma_ctrl1
|= SAA7134_CHROMA_CTRL1_AUTO0
;
412 chroma_ctrl1
&= ~SAA7134_CHROMA_CTRL1_FCTC
;
413 luma_control
&= ~SAA7134_LUMA_CTRL_LDEL
;
415 /* setup video decoder */
416 saa_writeb(SAA7134_INCR_DELAY
, 0x08);
417 saa_writeb(SAA7134_ANALOG_IN_CTRL1
, 0xc0 | mux
);
418 saa_writeb(SAA7134_ANALOG_IN_CTRL2
, 0x00);
420 saa_writeb(SAA7134_ANALOG_IN_CTRL3
, 0x90);
421 saa_writeb(SAA7134_ANALOG_IN_CTRL4
, 0x90);
422 saa_writeb(SAA7134_HSYNC_START
, 0xeb);
423 saa_writeb(SAA7134_HSYNC_STOP
, 0xe0);
424 saa_writeb(SAA7134_SOURCE_TIMING1
, norm
->src_timing
);
426 saa_writeb(SAA7134_SYNC_CTRL
, sync_control
);
427 saa_writeb(SAA7134_LUMA_CTRL
, luma_control
);
428 saa_writeb(SAA7134_DEC_LUMA_BRIGHT
, dev
->ctl_bright
);
430 saa_writeb(SAA7134_DEC_LUMA_CONTRAST
,
431 dev
->ctl_invert
? -dev
->ctl_contrast
: dev
->ctl_contrast
);
433 saa_writeb(SAA7134_DEC_CHROMA_SATURATION
,
434 dev
->ctl_invert
? -dev
->ctl_saturation
: dev
->ctl_saturation
);
436 saa_writeb(SAA7134_DEC_CHROMA_HUE
, dev
->ctl_hue
);
437 saa_writeb(SAA7134_CHROMA_CTRL1
, chroma_ctrl1
);
438 saa_writeb(SAA7134_CHROMA_GAIN
, norm
->chroma_gain
);
440 saa_writeb(SAA7134_CHROMA_CTRL2
, norm
->chroma_ctrl2
);
441 saa_writeb(SAA7134_MODE_DELAY_CTRL
, 0x00);
443 saa_writeb(SAA7134_ANALOG_ADC
, 0x01);
444 saa_writeb(SAA7134_VGATE_START
, 0x11);
445 saa_writeb(SAA7134_VGATE_STOP
, 0xfe);
446 saa_writeb(SAA7134_MISC_VGATE_MSB
, norm
->vgate_misc
);
447 saa_writeb(SAA7134_RAW_DATA_GAIN
, 0x40);
448 saa_writeb(SAA7134_RAW_DATA_OFFSET
, 0x80);
451 void saa7134_set_tvnorm_hw(struct saa7134_dev
*dev
)
453 saa7134_set_decoder(dev
);
455 saa_call_all(dev
, video
, s_std
, dev
->tvnorm
->id
);
456 /* Set the correct norm for the saa6752hs. This function
457 does nothing if there is no saa6752hs. */
458 saa_call_empress(dev
, video
, s_std
, dev
->tvnorm
->id
);
461 static void set_h_prescale(struct saa7134_dev
*dev
, int task
, int prescale
)
463 static const struct {
470 /* XPSC XACL XC2_1 XDCG VPFY */
482 static const int count
= ARRAY_SIZE(vals
);
485 for (i
= 0; i
< count
; i
++)
486 if (vals
[i
].xpsc
== prescale
)
491 saa_writeb(SAA7134_H_PRESCALE(task
), vals
[i
].xpsc
);
492 saa_writeb(SAA7134_ACC_LENGTH(task
), vals
[i
].xacl
);
493 saa_writeb(SAA7134_LEVEL_CTRL(task
),
494 (vals
[i
].xc2_1
<< 3) | (vals
[i
].xdcg
));
495 saa_andorb(SAA7134_FIR_PREFILTER_CTRL(task
), 0x0f,
496 (vals
[i
].vpfy
<< 2) | vals
[i
].vpfy
);
499 static void set_v_scale(struct saa7134_dev
*dev
, int task
, int yscale
)
503 saa_writeb(SAA7134_V_SCALE_RATIO1(task
), yscale
& 0xff);
504 saa_writeb(SAA7134_V_SCALE_RATIO2(task
), yscale
>> 8);
506 mirror
= (dev
->ctl_mirror
) ? 0x02 : 0x00;
509 video_dbg("yscale LPI yscale=%d\n", yscale
);
510 saa_writeb(SAA7134_V_FILTER(task
), 0x00 | mirror
);
511 saa_writeb(SAA7134_LUMA_CONTRAST(task
), 0x40);
512 saa_writeb(SAA7134_CHROMA_SATURATION(task
), 0x40);
515 val
= 0x40 * 1024 / yscale
;
516 video_dbg("yscale ACM yscale=%d val=0x%x\n", yscale
, val
);
517 saa_writeb(SAA7134_V_FILTER(task
), 0x01 | mirror
);
518 saa_writeb(SAA7134_LUMA_CONTRAST(task
), val
);
519 saa_writeb(SAA7134_CHROMA_SATURATION(task
), val
);
521 saa_writeb(SAA7134_LUMA_BRIGHT(task
), 0x80);
524 static void set_size(struct saa7134_dev
*dev
, int task
,
525 int width
, int height
, int interlace
)
527 int prescale
,xscale
,yscale
,y_even
,y_odd
;
528 int h_start
, h_stop
, v_start
, v_stop
;
529 int div
= interlace
? 2 : 1;
531 /* setup video scaler */
532 h_start
= dev
->crop_current
.left
;
533 v_start
= dev
->crop_current
.top
/2;
534 h_stop
= (dev
->crop_current
.left
+ dev
->crop_current
.width
-1);
535 v_stop
= (dev
->crop_current
.top
+ dev
->crop_current
.height
-1)/2;
537 saa_writeb(SAA7134_VIDEO_H_START1(task
), h_start
& 0xff);
538 saa_writeb(SAA7134_VIDEO_H_START2(task
), h_start
>> 8);
539 saa_writeb(SAA7134_VIDEO_H_STOP1(task
), h_stop
& 0xff);
540 saa_writeb(SAA7134_VIDEO_H_STOP2(task
), h_stop
>> 8);
541 saa_writeb(SAA7134_VIDEO_V_START1(task
), v_start
& 0xff);
542 saa_writeb(SAA7134_VIDEO_V_START2(task
), v_start
>> 8);
543 saa_writeb(SAA7134_VIDEO_V_STOP1(task
), v_stop
& 0xff);
544 saa_writeb(SAA7134_VIDEO_V_STOP2(task
), v_stop
>> 8);
546 prescale
= dev
->crop_current
.width
/ width
;
549 xscale
= 1024 * dev
->crop_current
.width
/ prescale
/ width
;
550 yscale
= 512 * div
* dev
->crop_current
.height
/ height
;
551 video_dbg("prescale=%d xscale=%d yscale=%d\n",
552 prescale
, xscale
, yscale
);
553 set_h_prescale(dev
,task
,prescale
);
554 saa_writeb(SAA7134_H_SCALE_INC1(task
), xscale
& 0xff);
555 saa_writeb(SAA7134_H_SCALE_INC2(task
), xscale
>> 8);
556 set_v_scale(dev
,task
,yscale
);
558 saa_writeb(SAA7134_VIDEO_PIXELS1(task
), width
& 0xff);
559 saa_writeb(SAA7134_VIDEO_PIXELS2(task
), width
>> 8);
560 saa_writeb(SAA7134_VIDEO_LINES1(task
), height
/div
& 0xff);
561 saa_writeb(SAA7134_VIDEO_LINES2(task
), height
/div
>> 8);
563 /* deinterlace y offsets */
564 y_odd
= dev
->ctl_y_odd
;
565 y_even
= dev
->ctl_y_even
;
566 saa_writeb(SAA7134_V_PHASE_OFFSET0(task
), y_odd
);
567 saa_writeb(SAA7134_V_PHASE_OFFSET1(task
), y_even
);
568 saa_writeb(SAA7134_V_PHASE_OFFSET2(task
), y_odd
);
569 saa_writeb(SAA7134_V_PHASE_OFFSET3(task
), y_even
);
572 /* ------------------------------------------------------------------ */
575 * Media Controller helper functions
578 static int saa7134_enable_analog_tuner(struct saa7134_dev
*dev
)
580 #ifdef CONFIG_MEDIA_CONTROLLER
581 struct media_device
*mdev
= dev
->media_dev
;
582 struct media_entity
*source
;
583 struct media_link
*link
, *found_link
= NULL
;
584 int ret
, active_links
= 0;
586 if (!mdev
|| !dev
->decoder
)
590 * This will find the tuner that is connected into the decoder.
591 * Technically, this is not 100% correct, as the device may be
592 * using an analog input instead of the tuner. However, as we can't
593 * do DVB streaming while the DMA engine is being used for V4L2,
594 * this should be enough for the actual needs.
596 list_for_each_entry(link
, &dev
->decoder
->links
, list
) {
597 if (link
->sink
->entity
== dev
->decoder
) {
599 if (link
->flags
& MEDIA_LNK_FL_ENABLED
)
605 if (active_links
== 1 || !found_link
)
608 source
= found_link
->source
->entity
;
609 list_for_each_entry(link
, &source
->links
, list
) {
610 struct media_entity
*sink
;
613 sink
= link
->sink
->entity
;
615 if (sink
== dev
->decoder
)
616 flags
= MEDIA_LNK_FL_ENABLED
;
618 ret
= media_entity_setup_link(link
, flags
);
620 pr_err("Couldn't change link %s->%s to %s. Error %d\n",
621 source
->name
, sink
->name
,
622 flags
? "enabled" : "disabled",
631 /* ------------------------------------------------------------------ */
633 static int buffer_activate(struct saa7134_dev
*dev
,
634 struct saa7134_buf
*buf
,
635 struct saa7134_buf
*next
)
637 struct saa7134_dmaqueue
*dmaq
= buf
->vb2
.vb2_buf
.vb2_queue
->drv_priv
;
638 unsigned long base
,control
,bpl
;
639 unsigned long bpl_uv
, lines_uv
, base2
, base3
; /* planar */
641 video_dbg("buffer_activate buf=%p\n", buf
);
644 set_size(dev
, TASK_A
, dev
->width
, dev
->height
,
645 V4L2_FIELD_HAS_BOTH(dev
->field
));
647 saa_andorb(SAA7134_DATA_PATH(TASK_A
), 0x3f, 0x03);
649 saa_andorb(SAA7134_DATA_PATH(TASK_A
), 0x3f, 0x01);
650 saa_writeb(SAA7134_OFMT_VIDEO_A
, dev
->fmt
->pm
);
652 /* DMA: setup channel 0 (= Video Task A0) */
653 base
= saa7134_buffer_base(buf
);
654 if (dev
->fmt
->planar
)
657 bpl
= (dev
->width
* dev
->fmt
->depth
) / 8;
658 control
= SAA7134_RS_CONTROL_BURST_16
|
659 SAA7134_RS_CONTROL_ME
|
660 (dmaq
->pt
.dma
>> 12);
662 control
|= SAA7134_RS_CONTROL_BSWAP
;
664 control
|= SAA7134_RS_CONTROL_WSWAP
;
665 if (V4L2_FIELD_HAS_BOTH(dev
->field
)) {
667 saa_writel(SAA7134_RS_BA1(0),base
);
668 saa_writel(SAA7134_RS_BA2(0),base
+bpl
);
669 saa_writel(SAA7134_RS_PITCH(0),bpl
*2);
672 saa_writel(SAA7134_RS_BA1(0),base
);
673 saa_writel(SAA7134_RS_BA2(0),base
);
674 saa_writel(SAA7134_RS_PITCH(0),bpl
);
676 saa_writel(SAA7134_RS_CONTROL(0),control
);
678 if (dev
->fmt
->planar
) {
679 /* DMA: setup channel 4+5 (= planar task A) */
680 bpl_uv
= bpl
>> dev
->fmt
->hshift
;
681 lines_uv
= dev
->height
>> dev
->fmt
->vshift
;
682 base2
= base
+ bpl
* dev
->height
;
683 base3
= base2
+ bpl_uv
* lines_uv
;
684 if (dev
->fmt
->uvswap
)
686 video_dbg("uv: bpl=%ld lines=%ld base2/3=%ld/%ld\n",
687 bpl_uv
,lines_uv
,base2
,base3
);
688 if (V4L2_FIELD_HAS_BOTH(dev
->field
)) {
690 saa_writel(SAA7134_RS_BA1(4),base2
);
691 saa_writel(SAA7134_RS_BA2(4),base2
+bpl_uv
);
692 saa_writel(SAA7134_RS_PITCH(4),bpl_uv
*2);
693 saa_writel(SAA7134_RS_BA1(5),base3
);
694 saa_writel(SAA7134_RS_BA2(5),base3
+bpl_uv
);
695 saa_writel(SAA7134_RS_PITCH(5),bpl_uv
*2);
698 saa_writel(SAA7134_RS_BA1(4),base2
);
699 saa_writel(SAA7134_RS_BA2(4),base2
);
700 saa_writel(SAA7134_RS_PITCH(4),bpl_uv
);
701 saa_writel(SAA7134_RS_BA1(5),base3
);
702 saa_writel(SAA7134_RS_BA2(5),base3
);
703 saa_writel(SAA7134_RS_PITCH(5),bpl_uv
);
705 saa_writel(SAA7134_RS_CONTROL(4),control
);
706 saa_writel(SAA7134_RS_CONTROL(5),control
);
710 saa7134_set_dmabits(dev
);
711 mod_timer(&dmaq
->timeout
, jiffies
+ BUFFER_TIMEOUT
);
715 static int buffer_init(struct vb2_buffer
*vb2
)
717 struct saa7134_dmaqueue
*dmaq
= vb2
->vb2_queue
->drv_priv
;
718 struct vb2_v4l2_buffer
*vbuf
= to_vb2_v4l2_buffer(vb2
);
719 struct saa7134_buf
*buf
= container_of(vbuf
, struct saa7134_buf
, vb2
);
722 buf
->activate
= buffer_activate
;
726 static int buffer_prepare(struct vb2_buffer
*vb2
)
728 struct saa7134_dmaqueue
*dmaq
= vb2
->vb2_queue
->drv_priv
;
729 struct saa7134_dev
*dev
= dmaq
->dev
;
730 struct vb2_v4l2_buffer
*vbuf
= to_vb2_v4l2_buffer(vb2
);
731 struct saa7134_buf
*buf
= container_of(vbuf
, struct saa7134_buf
, vb2
);
732 struct sg_table
*dma
= vb2_dma_sg_plane_desc(vb2
, 0);
735 if (dma
->sgl
->offset
) {
736 pr_err("The buffer is not page-aligned\n");
739 size
= (dev
->width
* dev
->height
* dev
->fmt
->depth
) >> 3;
740 if (vb2_plane_size(vb2
, 0) < size
)
743 vb2_set_plane_payload(vb2
, 0, size
);
744 vbuf
->field
= dev
->field
;
746 return saa7134_pgtable_build(dev
->pci
, &dmaq
->pt
, dma
->sgl
, dma
->nents
,
747 saa7134_buffer_startpage(buf
));
750 static int queue_setup(struct vb2_queue
*q
,
751 unsigned int *nbuffers
, unsigned int *nplanes
,
752 unsigned int sizes
[], struct device
*alloc_devs
[])
754 struct saa7134_dmaqueue
*dmaq
= q
->drv_priv
;
755 struct saa7134_dev
*dev
= dmaq
->dev
;
756 int size
= dev
->fmt
->depth
* dev
->width
* dev
->height
>> 3;
758 if (dev
->width
< 48 ||
760 dev
->width
/4 > dev
->crop_current
.width
||
761 dev
->height
/4 > dev
->crop_current
.height
||
762 dev
->width
> dev
->crop_bounds
.width
||
763 dev
->height
> dev
->crop_bounds
.height
)
766 *nbuffers
= saa7134_buffer_count(size
, *nbuffers
);
770 saa7134_enable_analog_tuner(dev
);
776 * move buffer to hardware queue
778 void saa7134_vb2_buffer_queue(struct vb2_buffer
*vb
)
780 struct saa7134_dmaqueue
*dmaq
= vb
->vb2_queue
->drv_priv
;
781 struct saa7134_dev
*dev
= dmaq
->dev
;
782 struct vb2_v4l2_buffer
*vbuf
= to_vb2_v4l2_buffer(vb
);
783 struct saa7134_buf
*buf
= container_of(vbuf
, struct saa7134_buf
, vb2
);
785 saa7134_buffer_queue(dev
, dmaq
, buf
);
787 EXPORT_SYMBOL_GPL(saa7134_vb2_buffer_queue
);
789 int saa7134_vb2_start_streaming(struct vb2_queue
*vq
, unsigned int count
)
791 struct saa7134_dmaqueue
*dmaq
= vq
->drv_priv
;
792 struct saa7134_dev
*dev
= dmaq
->dev
;
795 * Planar video capture and TS share the same DMA channel,
796 * so only one can be active at a time.
798 if (card_is_empress(dev
) && vb2_is_busy(&dev
->empress_vbq
) &&
799 dmaq
== &dev
->video_q
&& dev
->fmt
->planar
) {
800 struct saa7134_buf
*buf
, *tmp
;
802 list_for_each_entry_safe(buf
, tmp
, &dmaq
->queue
, entry
) {
803 list_del(&buf
->entry
);
804 vb2_buffer_done(&buf
->vb2
.vb2_buf
,
805 VB2_BUF_STATE_QUEUED
);
808 vb2_buffer_done(&dmaq
->curr
->vb2
.vb2_buf
,
809 VB2_BUF_STATE_QUEUED
);
815 /* The SAA7134 has a 1K FIFO; the datasheet suggests that when
816 * configured conservatively, there's 22 usec of buffering for video.
817 * We therefore request a DMA latency of 20 usec, giving us 2 usec of
818 * margin in case the FIFO is configured differently to the datasheet.
819 * Unfortunately, I lack register-level documentation to check the
820 * Linux FIFO setup and confirm the perfect value.
822 if ((dmaq
== &dev
->video_q
&& !vb2_is_streaming(&dev
->vbi_vbq
)) ||
823 (dmaq
== &dev
->vbi_q
&& !vb2_is_streaming(&dev
->video_vbq
)))
824 cpu_latency_qos_add_request(&dev
->qos_request
, 20);
830 void saa7134_vb2_stop_streaming(struct vb2_queue
*vq
)
832 struct saa7134_dmaqueue
*dmaq
= vq
->drv_priv
;
833 struct saa7134_dev
*dev
= dmaq
->dev
;
835 saa7134_stop_streaming(dev
, dmaq
);
837 if ((dmaq
== &dev
->video_q
&& !vb2_is_streaming(&dev
->vbi_vbq
)) ||
838 (dmaq
== &dev
->vbi_q
&& !vb2_is_streaming(&dev
->video_vbq
)))
839 cpu_latency_qos_remove_request(&dev
->qos_request
);
842 static const struct vb2_ops vb2_qops
= {
843 .queue_setup
= queue_setup
,
844 .buf_init
= buffer_init
,
845 .buf_prepare
= buffer_prepare
,
846 .buf_queue
= saa7134_vb2_buffer_queue
,
847 .start_streaming
= saa7134_vb2_start_streaming
,
848 .stop_streaming
= saa7134_vb2_stop_streaming
,
851 /* ------------------------------------------------------------------ */
853 static int saa7134_s_ctrl(struct v4l2_ctrl
*ctrl
)
855 struct saa7134_dev
*dev
= container_of(ctrl
->handler
, struct saa7134_dev
, ctrl_handler
);
858 case V4L2_CID_BRIGHTNESS
:
859 dev
->ctl_bright
= ctrl
->val
;
860 saa_writeb(SAA7134_DEC_LUMA_BRIGHT
, ctrl
->val
);
863 dev
->ctl_hue
= ctrl
->val
;
864 saa_writeb(SAA7134_DEC_CHROMA_HUE
, ctrl
->val
);
866 case V4L2_CID_CONTRAST
:
867 dev
->ctl_contrast
= ctrl
->val
;
868 saa_writeb(SAA7134_DEC_LUMA_CONTRAST
,
869 dev
->ctl_invert
? -dev
->ctl_contrast
: dev
->ctl_contrast
);
871 case V4L2_CID_SATURATION
:
872 dev
->ctl_saturation
= ctrl
->val
;
873 saa_writeb(SAA7134_DEC_CHROMA_SATURATION
,
874 dev
->ctl_invert
? -dev
->ctl_saturation
: dev
->ctl_saturation
);
876 case V4L2_CID_AUDIO_MUTE
:
877 dev
->ctl_mute
= ctrl
->val
;
878 saa7134_tvaudio_setmute(dev
);
880 case V4L2_CID_AUDIO_VOLUME
:
881 dev
->ctl_volume
= ctrl
->val
;
882 saa7134_tvaudio_setvolume(dev
,dev
->ctl_volume
);
884 case V4L2_CID_PRIVATE_INVERT
:
885 dev
->ctl_invert
= ctrl
->val
;
886 saa_writeb(SAA7134_DEC_LUMA_CONTRAST
,
887 dev
->ctl_invert
? -dev
->ctl_contrast
: dev
->ctl_contrast
);
888 saa_writeb(SAA7134_DEC_CHROMA_SATURATION
,
889 dev
->ctl_invert
? -dev
->ctl_saturation
: dev
->ctl_saturation
);
892 dev
->ctl_mirror
= ctrl
->val
;
894 case V4L2_CID_PRIVATE_Y_EVEN
:
895 dev
->ctl_y_even
= ctrl
->val
;
897 case V4L2_CID_PRIVATE_Y_ODD
:
898 dev
->ctl_y_odd
= ctrl
->val
;
900 case V4L2_CID_PRIVATE_AUTOMUTE
:
902 struct v4l2_priv_tun_config tda9887_cfg
;
904 tda9887_cfg
.tuner
= TUNER_TDA9887
;
905 tda9887_cfg
.priv
= &dev
->tda9887_conf
;
907 dev
->ctl_automute
= ctrl
->val
;
908 if (dev
->tda9887_conf
) {
909 if (dev
->ctl_automute
)
910 dev
->tda9887_conf
|= TDA9887_AUTOMUTE
;
912 dev
->tda9887_conf
&= ~TDA9887_AUTOMUTE
;
914 saa_call_all(dev
, tuner
, s_config
, &tda9887_cfg
);
924 /* ------------------------------------------------------------------ */
926 static int video_open(struct file
*file
)
928 struct video_device
*vdev
= video_devdata(file
);
929 struct saa7134_dev
*dev
= video_drvdata(file
);
930 int ret
= v4l2_fh_open(file
);
935 mutex_lock(&dev
->lock
);
936 if (vdev
->vfl_type
== VFL_TYPE_RADIO
) {
937 /* switch to radio mode */
938 saa7134_tvaudio_setinput(dev
, &card(dev
).radio
);
939 saa_call_all(dev
, tuner
, s_radio
);
941 /* switch to video/vbi mode */
942 video_mux(dev
, dev
->ctl_input
);
944 mutex_unlock(&dev
->lock
);
949 static int video_release(struct file
*file
)
951 struct video_device
*vdev
= video_devdata(file
);
952 struct saa7134_dev
*dev
= video_drvdata(file
);
953 struct saa6588_command cmd
;
955 mutex_lock(&dev
->lock
);
956 saa7134_tvaudio_close(dev
);
958 if (vdev
->vfl_type
== VFL_TYPE_RADIO
)
959 v4l2_fh_release(file
);
961 _vb2_fop_release(file
, NULL
);
963 /* ts-capture will not work in planar mode, so turn it off Hac: 04.05*/
964 saa_andorb(SAA7134_OFMT_VIDEO_A
, 0x1f, 0);
965 saa_andorb(SAA7134_OFMT_VIDEO_B
, 0x1f, 0);
966 saa_andorb(SAA7134_OFMT_DATA_A
, 0x1f, 0);
967 saa_andorb(SAA7134_OFMT_DATA_B
, 0x1f, 0);
969 saa_call_all(dev
, tuner
, standby
);
970 if (vdev
->vfl_type
== VFL_TYPE_RADIO
)
971 saa_call_all(dev
, core
, command
, SAA6588_CMD_CLOSE
, &cmd
);
972 mutex_unlock(&dev
->lock
);
977 static ssize_t
radio_read(struct file
*file
, char __user
*data
,
978 size_t count
, loff_t
*ppos
)
980 struct saa7134_dev
*dev
= video_drvdata(file
);
981 struct saa6588_command cmd
;
983 cmd
.block_count
= count
/3;
984 cmd
.nonblocking
= file
->f_flags
& O_NONBLOCK
;
987 cmd
.result
= -ENODEV
;
989 mutex_lock(&dev
->lock
);
990 saa_call_all(dev
, core
, command
, SAA6588_CMD_READ
, &cmd
);
991 mutex_unlock(&dev
->lock
);
996 static __poll_t
radio_poll(struct file
*file
, poll_table
*wait
)
998 struct saa7134_dev
*dev
= video_drvdata(file
);
999 struct saa6588_command cmd
;
1000 __poll_t rc
= v4l2_ctrl_poll(file
, wait
);
1002 cmd
.instance
= file
;
1003 cmd
.event_list
= wait
;
1005 mutex_lock(&dev
->lock
);
1006 saa_call_all(dev
, core
, command
, SAA6588_CMD_POLL
, &cmd
);
1007 mutex_unlock(&dev
->lock
);
1009 return rc
| cmd
.poll_mask
;
1012 /* ------------------------------------------------------------------ */
1014 static int saa7134_try_get_set_fmt_vbi_cap(struct file
*file
, void *priv
,
1015 struct v4l2_format
*f
)
1017 struct saa7134_dev
*dev
= video_drvdata(file
);
1018 struct saa7134_tvnorm
*norm
= dev
->tvnorm
;
1020 memset(&f
->fmt
.vbi
.reserved
, 0, sizeof(f
->fmt
.vbi
.reserved
));
1021 f
->fmt
.vbi
.sampling_rate
= 6750000 * 4;
1022 f
->fmt
.vbi
.samples_per_line
= 2048 /* VBI_LINE_LENGTH */;
1023 f
->fmt
.vbi
.sample_format
= V4L2_PIX_FMT_GREY
;
1024 f
->fmt
.vbi
.offset
= 64 * 4;
1025 f
->fmt
.vbi
.start
[0] = norm
->vbi_v_start_0
;
1026 f
->fmt
.vbi
.count
[0] = norm
->vbi_v_stop_0
- norm
->vbi_v_start_0
+1;
1027 f
->fmt
.vbi
.start
[1] = norm
->vbi_v_start_1
;
1028 f
->fmt
.vbi
.count
[1] = f
->fmt
.vbi
.count
[0];
1029 f
->fmt
.vbi
.flags
= 0; /* VBI_UNSYNC VBI_INTERLACED */
1034 static int saa7134_g_fmt_vid_cap(struct file
*file
, void *priv
,
1035 struct v4l2_format
*f
)
1037 struct saa7134_dev
*dev
= video_drvdata(file
);
1039 f
->fmt
.pix
.width
= dev
->width
;
1040 f
->fmt
.pix
.height
= dev
->height
;
1041 f
->fmt
.pix
.field
= dev
->field
;
1042 f
->fmt
.pix
.pixelformat
= dev
->fmt
->fourcc
;
1043 if (dev
->fmt
->planar
)
1044 f
->fmt
.pix
.bytesperline
= f
->fmt
.pix
.width
;
1046 f
->fmt
.pix
.bytesperline
=
1047 (f
->fmt
.pix
.width
* dev
->fmt
->depth
) / 8;
1048 f
->fmt
.pix
.sizeimage
=
1049 (f
->fmt
.pix
.height
* f
->fmt
.pix
.width
* dev
->fmt
->depth
) / 8;
1050 f
->fmt
.pix
.colorspace
= V4L2_COLORSPACE_SMPTE170M
;
1054 static int saa7134_try_fmt_vid_cap(struct file
*file
, void *priv
,
1055 struct v4l2_format
*f
)
1057 struct saa7134_dev
*dev
= video_drvdata(file
);
1058 struct saa7134_format
*fmt
;
1059 enum v4l2_field field
;
1060 unsigned int maxw
, maxh
;
1062 fmt
= format_by_fourcc(f
->fmt
.pix
.pixelformat
);
1066 field
= f
->fmt
.pix
.field
;
1067 maxw
= min(dev
->crop_current
.width
*4, dev
->crop_bounds
.width
);
1068 maxh
= min(dev
->crop_current
.height
*4, dev
->crop_bounds
.height
);
1070 if (V4L2_FIELD_ANY
== field
) {
1071 field
= (f
->fmt
.pix
.height
> maxh
/2)
1072 ? V4L2_FIELD_INTERLACED
1073 : V4L2_FIELD_BOTTOM
;
1076 case V4L2_FIELD_TOP
:
1077 case V4L2_FIELD_BOTTOM
:
1081 field
= V4L2_FIELD_INTERLACED
;
1085 f
->fmt
.pix
.field
= field
;
1086 if (f
->fmt
.pix
.width
< 48)
1087 f
->fmt
.pix
.width
= 48;
1088 if (f
->fmt
.pix
.height
< 32)
1089 f
->fmt
.pix
.height
= 32;
1090 if (f
->fmt
.pix
.width
> maxw
)
1091 f
->fmt
.pix
.width
= maxw
;
1092 if (f
->fmt
.pix
.height
> maxh
)
1093 f
->fmt
.pix
.height
= maxh
;
1094 f
->fmt
.pix
.width
&= ~0x03;
1096 f
->fmt
.pix
.bytesperline
= f
->fmt
.pix
.width
;
1098 f
->fmt
.pix
.bytesperline
=
1099 (f
->fmt
.pix
.width
* fmt
->depth
) / 8;
1100 f
->fmt
.pix
.sizeimage
=
1101 (f
->fmt
.pix
.height
* f
->fmt
.pix
.width
* fmt
->depth
) / 8;
1102 f
->fmt
.pix
.colorspace
= V4L2_COLORSPACE_SMPTE170M
;
1107 static int saa7134_s_fmt_vid_cap(struct file
*file
, void *priv
,
1108 struct v4l2_format
*f
)
1110 struct saa7134_dev
*dev
= video_drvdata(file
);
1113 err
= saa7134_try_fmt_vid_cap(file
, priv
, f
);
1117 dev
->fmt
= format_by_fourcc(f
->fmt
.pix
.pixelformat
);
1118 dev
->width
= f
->fmt
.pix
.width
;
1119 dev
->height
= f
->fmt
.pix
.height
;
1120 dev
->field
= f
->fmt
.pix
.field
;
1124 int saa7134_enum_input(struct file
*file
, void *priv
, struct v4l2_input
*i
)
1126 struct saa7134_dev
*dev
= video_drvdata(file
);
1130 if (n
>= SAA7134_INPUT_MAX
)
1132 if (card_in(dev
, i
->index
).type
== SAA7134_NO_INPUT
)
1135 strscpy(i
->name
, saa7134_input_name
[card_in(dev
, n
).type
],
1137 switch (card_in(dev
, n
).type
) {
1138 case SAA7134_INPUT_TV
:
1139 case SAA7134_INPUT_TV_MONO
:
1140 i
->type
= V4L2_INPUT_TYPE_TUNER
;
1143 i
->type
= V4L2_INPUT_TYPE_CAMERA
;
1146 if (n
== dev
->ctl_input
) {
1147 int v1
= saa_readb(SAA7134_STATUS_VIDEO1
);
1148 int v2
= saa_readb(SAA7134_STATUS_VIDEO2
);
1150 if (0 != (v1
& 0x40))
1151 i
->status
|= V4L2_IN_ST_NO_H_LOCK
;
1152 if (0 != (v2
& 0x40))
1153 i
->status
|= V4L2_IN_ST_NO_SIGNAL
;
1154 if (0 != (v2
& 0x0e))
1155 i
->status
|= V4L2_IN_ST_MACROVISION
;
1157 i
->std
= SAA7134_NORMS
;
1160 EXPORT_SYMBOL_GPL(saa7134_enum_input
);
1162 int saa7134_g_input(struct file
*file
, void *priv
, unsigned int *i
)
1164 struct saa7134_dev
*dev
= video_drvdata(file
);
1166 *i
= dev
->ctl_input
;
1169 EXPORT_SYMBOL_GPL(saa7134_g_input
);
1171 int saa7134_s_input(struct file
*file
, void *priv
, unsigned int i
)
1173 struct saa7134_dev
*dev
= video_drvdata(file
);
1175 if (i
>= SAA7134_INPUT_MAX
)
1177 if (card_in(dev
, i
).type
== SAA7134_NO_INPUT
)
1182 EXPORT_SYMBOL_GPL(saa7134_s_input
);
1184 int saa7134_querycap(struct file
*file
, void *priv
,
1185 struct v4l2_capability
*cap
)
1187 struct saa7134_dev
*dev
= video_drvdata(file
);
1189 strscpy(cap
->driver
, "saa7134", sizeof(cap
->driver
));
1190 strscpy(cap
->card
, saa7134_boards
[dev
->board
].name
,
1192 cap
->capabilities
= V4L2_CAP_READWRITE
| V4L2_CAP_STREAMING
|
1193 V4L2_CAP_RADIO
| V4L2_CAP_VIDEO_CAPTURE
|
1194 V4L2_CAP_VBI_CAPTURE
| V4L2_CAP_DEVICE_CAPS
;
1195 if (dev
->tuner_type
!= TUNER_ABSENT
&& dev
->tuner_type
!= UNSET
)
1196 cap
->capabilities
|= V4L2_CAP_TUNER
;
1198 cap
->capabilities
|= V4L2_CAP_RDS_CAPTURE
;
1202 EXPORT_SYMBOL_GPL(saa7134_querycap
);
1204 int saa7134_s_std(struct file
*file
, void *priv
, v4l2_std_id id
)
1206 struct saa7134_dev
*dev
= video_drvdata(file
);
1210 for (i
= 0; i
< TVNORMS
; i
++)
1211 if (id
== tvnorms
[i
].id
)
1215 for (i
= 0; i
< TVNORMS
; i
++)
1216 if (id
& tvnorms
[i
].id
)
1221 if ((id
& V4L2_STD_SECAM
) && (secam
[0] != '-')) {
1222 if (secam
[0] == 'L' || secam
[0] == 'l') {
1223 if (secam
[1] == 'C' || secam
[1] == 'c')
1224 fixup
= V4L2_STD_SECAM_LC
;
1226 fixup
= V4L2_STD_SECAM_L
;
1228 if (secam
[0] == 'D' || secam
[0] == 'd')
1229 fixup
= V4L2_STD_SECAM_DK
;
1231 fixup
= V4L2_STD_SECAM
;
1233 for (i
= 0; i
< TVNORMS
; i
++) {
1234 if (fixup
== tvnorms
[i
].id
)
1241 set_tvnorm(dev
, &tvnorms
[i
]);
1243 saa7134_tvaudio_do_scan(dev
);
1246 EXPORT_SYMBOL_GPL(saa7134_s_std
);
1248 int saa7134_g_std(struct file
*file
, void *priv
, v4l2_std_id
*id
)
1250 struct saa7134_dev
*dev
= video_drvdata(file
);
1252 *id
= dev
->tvnorm
->id
;
1255 EXPORT_SYMBOL_GPL(saa7134_g_std
);
1257 static v4l2_std_id
saa7134_read_std(struct saa7134_dev
*dev
)
1259 static v4l2_std_id stds
[] = {
1265 v4l2_std_id result
= 0;
1267 u8 st1
= saa_readb(SAA7134_STATUS_VIDEO1
);
1268 u8 st2
= saa_readb(SAA7134_STATUS_VIDEO2
);
1270 if (!(st2
& 0x1)) /* RDCAP == 0 */
1271 result
= V4L2_STD_UNKNOWN
;
1273 result
= stds
[st1
& 0x03];
1278 int saa7134_querystd(struct file
*file
, void *priv
, v4l2_std_id
*std
)
1280 struct saa7134_dev
*dev
= video_drvdata(file
);
1281 *std
&= saa7134_read_std(dev
);
1284 EXPORT_SYMBOL_GPL(saa7134_querystd
);
1286 static int saa7134_g_pixelaspect(struct file
*file
, void *priv
,
1287 int type
, struct v4l2_fract
*f
)
1289 struct saa7134_dev
*dev
= video_drvdata(file
);
1291 if (type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
1294 if (dev
->tvnorm
->id
& V4L2_STD_525_60
) {
1296 f
->denominator
= 10;
1298 if (dev
->tvnorm
->id
& V4L2_STD_625_50
) {
1300 f
->denominator
= 59;
1305 static int saa7134_g_selection(struct file
*file
, void *f
, struct v4l2_selection
*sel
)
1307 struct saa7134_dev
*dev
= video_drvdata(file
);
1309 if (sel
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
1312 switch (sel
->target
) {
1313 case V4L2_SEL_TGT_CROP
:
1314 sel
->r
= dev
->crop_current
;
1316 case V4L2_SEL_TGT_CROP_DEFAULT
:
1317 sel
->r
= dev
->crop_defrect
;
1319 case V4L2_SEL_TGT_CROP_BOUNDS
:
1320 sel
->r
= dev
->crop_bounds
;
1328 static int saa7134_s_selection(struct file
*file
, void *f
, struct v4l2_selection
*sel
)
1330 struct saa7134_dev
*dev
= video_drvdata(file
);
1331 struct v4l2_rect
*b
= &dev
->crop_bounds
;
1332 struct v4l2_rect
*c
= &dev
->crop_current
;
1334 if (sel
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
1337 if (sel
->target
!= V4L2_SEL_TGT_CROP
)
1340 if (vb2_is_streaming(&dev
->video_vbq
))
1344 if (c
->top
< b
->top
)
1346 if (c
->top
> b
->top
+ b
->height
)
1347 c
->top
= b
->top
+ b
->height
;
1348 if (c
->height
> b
->top
- c
->top
+ b
->height
)
1349 c
->height
= b
->top
- c
->top
+ b
->height
;
1351 if (c
->left
< b
->left
)
1353 if (c
->left
> b
->left
+ b
->width
)
1354 c
->left
= b
->left
+ b
->width
;
1355 if (c
->width
> b
->left
- c
->left
+ b
->width
)
1356 c
->width
= b
->left
- c
->left
+ b
->width
;
1361 int saa7134_g_tuner(struct file
*file
, void *priv
,
1362 struct v4l2_tuner
*t
)
1364 struct saa7134_dev
*dev
= video_drvdata(file
);
1369 memset(t
, 0, sizeof(*t
));
1370 for (n
= 0; n
< SAA7134_INPUT_MAX
; n
++) {
1371 if (card_in(dev
, n
).type
== SAA7134_INPUT_TV
||
1372 card_in(dev
, n
).type
== SAA7134_INPUT_TV_MONO
)
1375 if (n
== SAA7134_INPUT_MAX
)
1377 if (card_in(dev
, n
).type
!= SAA7134_NO_INPUT
) {
1378 strscpy(t
->name
, "Television", sizeof(t
->name
));
1379 t
->type
= V4L2_TUNER_ANALOG_TV
;
1380 saa_call_all(dev
, tuner
, g_tuner
, t
);
1381 t
->capability
= V4L2_TUNER_CAP_NORM
|
1382 V4L2_TUNER_CAP_STEREO
|
1383 V4L2_TUNER_CAP_LANG1
|
1384 V4L2_TUNER_CAP_LANG2
;
1385 t
->rxsubchans
= saa7134_tvaudio_getstereo(dev
);
1386 t
->audmode
= saa7134_tvaudio_rx2mode(t
->rxsubchans
);
1388 if (0 != (saa_readb(SAA7134_STATUS_VIDEO1
) & 0x03))
1392 EXPORT_SYMBOL_GPL(saa7134_g_tuner
);
1394 int saa7134_s_tuner(struct file
*file
, void *priv
,
1395 const struct v4l2_tuner
*t
)
1397 struct saa7134_dev
*dev
= video_drvdata(file
);
1403 mode
= dev
->thread
.mode
;
1404 if (UNSET
== mode
) {
1405 rx
= saa7134_tvaudio_getstereo(dev
);
1406 mode
= saa7134_tvaudio_rx2mode(rx
);
1408 if (mode
!= t
->audmode
)
1409 dev
->thread
.mode
= t
->audmode
;
1413 EXPORT_SYMBOL_GPL(saa7134_s_tuner
);
1415 int saa7134_g_frequency(struct file
*file
, void *priv
,
1416 struct v4l2_frequency
*f
)
1418 struct saa7134_dev
*dev
= video_drvdata(file
);
1423 saa_call_all(dev
, tuner
, g_frequency
, f
);
1427 EXPORT_SYMBOL_GPL(saa7134_g_frequency
);
1429 int saa7134_s_frequency(struct file
*file
, void *priv
,
1430 const struct v4l2_frequency
*f
)
1432 struct saa7134_dev
*dev
= video_drvdata(file
);
1437 saa_call_all(dev
, tuner
, s_frequency
, f
);
1439 saa7134_tvaudio_do_scan(dev
);
1442 EXPORT_SYMBOL_GPL(saa7134_s_frequency
);
1444 static int saa7134_enum_fmt_vid_cap(struct file
*file
, void *priv
,
1445 struct v4l2_fmtdesc
*f
)
1447 if (f
->index
>= FORMATS
)
1450 f
->pixelformat
= formats
[f
->index
].fourcc
;
1455 #ifdef CONFIG_VIDEO_ADV_DEBUG
1456 static int vidioc_g_register (struct file
*file
, void *priv
,
1457 struct v4l2_dbg_register
*reg
)
1459 struct saa7134_dev
*dev
= video_drvdata(file
);
1461 reg
->val
= saa_readb(reg
->reg
& 0xffffff);
1466 static int vidioc_s_register (struct file
*file
, void *priv
,
1467 const struct v4l2_dbg_register
*reg
)
1469 struct saa7134_dev
*dev
= video_drvdata(file
);
1471 saa_writeb(reg
->reg
& 0xffffff, reg
->val
);
1476 static int radio_g_tuner(struct file
*file
, void *priv
,
1477 struct v4l2_tuner
*t
)
1479 struct saa7134_dev
*dev
= video_drvdata(file
);
1484 strscpy(t
->name
, "Radio", sizeof(t
->name
));
1486 saa_call_all(dev
, tuner
, g_tuner
, t
);
1487 t
->audmode
&= V4L2_TUNER_MODE_MONO
| V4L2_TUNER_MODE_STEREO
;
1488 if (dev
->input
->amux
== TV
) {
1489 t
->signal
= 0xf800 - ((saa_readb(0x581) & 0x1f) << 11);
1490 t
->rxsubchans
= (saa_readb(0x529) & 0x08) ?
1491 V4L2_TUNER_SUB_STEREO
: V4L2_TUNER_SUB_MONO
;
1495 static int radio_s_tuner(struct file
*file
, void *priv
,
1496 const struct v4l2_tuner
*t
)
1498 struct saa7134_dev
*dev
= video_drvdata(file
);
1503 saa_call_all(dev
, tuner
, s_tuner
, t
);
1507 static const struct v4l2_file_operations video_fops
=
1509 .owner
= THIS_MODULE
,
1511 .release
= video_release
,
1512 .read
= vb2_fop_read
,
1513 .poll
= vb2_fop_poll
,
1514 .mmap
= vb2_fop_mmap
,
1515 .unlocked_ioctl
= video_ioctl2
,
1518 static const struct v4l2_ioctl_ops video_ioctl_ops
= {
1519 .vidioc_querycap
= saa7134_querycap
,
1520 .vidioc_enum_fmt_vid_cap
= saa7134_enum_fmt_vid_cap
,
1521 .vidioc_g_fmt_vid_cap
= saa7134_g_fmt_vid_cap
,
1522 .vidioc_try_fmt_vid_cap
= saa7134_try_fmt_vid_cap
,
1523 .vidioc_s_fmt_vid_cap
= saa7134_s_fmt_vid_cap
,
1524 .vidioc_g_fmt_vbi_cap
= saa7134_try_get_set_fmt_vbi_cap
,
1525 .vidioc_try_fmt_vbi_cap
= saa7134_try_get_set_fmt_vbi_cap
,
1526 .vidioc_s_fmt_vbi_cap
= saa7134_try_get_set_fmt_vbi_cap
,
1527 .vidioc_g_pixelaspect
= saa7134_g_pixelaspect
,
1528 .vidioc_reqbufs
= vb2_ioctl_reqbufs
,
1529 .vidioc_querybuf
= vb2_ioctl_querybuf
,
1530 .vidioc_qbuf
= vb2_ioctl_qbuf
,
1531 .vidioc_dqbuf
= vb2_ioctl_dqbuf
,
1532 .vidioc_expbuf
= vb2_ioctl_expbuf
,
1533 .vidioc_s_std
= saa7134_s_std
,
1534 .vidioc_g_std
= saa7134_g_std
,
1535 .vidioc_querystd
= saa7134_querystd
,
1536 .vidioc_enum_input
= saa7134_enum_input
,
1537 .vidioc_g_input
= saa7134_g_input
,
1538 .vidioc_s_input
= saa7134_s_input
,
1539 .vidioc_streamon
= vb2_ioctl_streamon
,
1540 .vidioc_streamoff
= vb2_ioctl_streamoff
,
1541 .vidioc_g_tuner
= saa7134_g_tuner
,
1542 .vidioc_s_tuner
= saa7134_s_tuner
,
1543 .vidioc_g_selection
= saa7134_g_selection
,
1544 .vidioc_s_selection
= saa7134_s_selection
,
1545 .vidioc_g_frequency
= saa7134_g_frequency
,
1546 .vidioc_s_frequency
= saa7134_s_frequency
,
1547 #ifdef CONFIG_VIDEO_ADV_DEBUG
1548 .vidioc_g_register
= vidioc_g_register
,
1549 .vidioc_s_register
= vidioc_s_register
,
1551 .vidioc_log_status
= v4l2_ctrl_log_status
,
1552 .vidioc_subscribe_event
= v4l2_ctrl_subscribe_event
,
1553 .vidioc_unsubscribe_event
= v4l2_event_unsubscribe
,
1556 static const struct v4l2_file_operations radio_fops
= {
1557 .owner
= THIS_MODULE
,
1560 .release
= video_release
,
1561 .unlocked_ioctl
= video_ioctl2
,
1565 static const struct v4l2_ioctl_ops radio_ioctl_ops
= {
1566 .vidioc_querycap
= saa7134_querycap
,
1567 .vidioc_g_tuner
= radio_g_tuner
,
1568 .vidioc_s_tuner
= radio_s_tuner
,
1569 .vidioc_g_frequency
= saa7134_g_frequency
,
1570 .vidioc_s_frequency
= saa7134_s_frequency
,
1571 .vidioc_subscribe_event
= v4l2_ctrl_subscribe_event
,
1572 .vidioc_unsubscribe_event
= v4l2_event_unsubscribe
,
1575 /* ----------------------------------------------------------- */
1576 /* exported stuff */
1578 struct video_device saa7134_video_template
= {
1579 .name
= "saa7134-video",
1580 .fops
= &video_fops
,
1581 .ioctl_ops
= &video_ioctl_ops
,
1582 .tvnorms
= SAA7134_NORMS
,
1585 struct video_device saa7134_radio_template
= {
1586 .name
= "saa7134-radio",
1587 .fops
= &radio_fops
,
1588 .ioctl_ops
= &radio_ioctl_ops
,
1591 static const struct v4l2_ctrl_ops saa7134_ctrl_ops
= {
1592 .s_ctrl
= saa7134_s_ctrl
,
1595 static const struct v4l2_ctrl_config saa7134_ctrl_invert
= {
1596 .ops
= &saa7134_ctrl_ops
,
1597 .id
= V4L2_CID_PRIVATE_INVERT
,
1599 .type
= V4L2_CTRL_TYPE_BOOLEAN
,
1605 static const struct v4l2_ctrl_config saa7134_ctrl_y_odd
= {
1606 .ops
= &saa7134_ctrl_ops
,
1607 .id
= V4L2_CID_PRIVATE_Y_ODD
,
1608 .name
= "Y Offset Odd Field",
1609 .type
= V4L2_CTRL_TYPE_INTEGER
,
1615 static const struct v4l2_ctrl_config saa7134_ctrl_y_even
= {
1616 .ops
= &saa7134_ctrl_ops
,
1617 .id
= V4L2_CID_PRIVATE_Y_EVEN
,
1618 .name
= "Y Offset Even Field",
1619 .type
= V4L2_CTRL_TYPE_INTEGER
,
1625 static const struct v4l2_ctrl_config saa7134_ctrl_automute
= {
1626 .ops
= &saa7134_ctrl_ops
,
1627 .id
= V4L2_CID_PRIVATE_AUTOMUTE
,
1629 .type
= V4L2_CTRL_TYPE_BOOLEAN
,
1636 int saa7134_video_init1(struct saa7134_dev
*dev
)
1638 struct v4l2_ctrl_handler
*hdl
= &dev
->ctrl_handler
;
1639 struct vb2_queue
*q
;
1642 /* sanitycheck insmod options */
1643 if (gbuffers
< 2 || gbuffers
> VIDEO_MAX_FRAME
)
1645 if (gbufsize
> gbufsize_max
)
1646 gbufsize
= gbufsize_max
;
1647 gbufsize
= (gbufsize
+ PAGE_SIZE
- 1) & PAGE_MASK
;
1649 v4l2_ctrl_handler_init(hdl
, 11);
1650 v4l2_ctrl_new_std(hdl
, &saa7134_ctrl_ops
,
1651 V4L2_CID_BRIGHTNESS
, 0, 255, 1, 128);
1652 v4l2_ctrl_new_std(hdl
, &saa7134_ctrl_ops
,
1653 V4L2_CID_CONTRAST
, 0, 127, 1, 68);
1654 v4l2_ctrl_new_std(hdl
, &saa7134_ctrl_ops
,
1655 V4L2_CID_SATURATION
, 0, 127, 1, 64);
1656 v4l2_ctrl_new_std(hdl
, &saa7134_ctrl_ops
,
1657 V4L2_CID_HUE
, -128, 127, 1, 0);
1658 v4l2_ctrl_new_std(hdl
, &saa7134_ctrl_ops
,
1659 V4L2_CID_HFLIP
, 0, 1, 1, 0);
1660 v4l2_ctrl_new_std(hdl
, &saa7134_ctrl_ops
,
1661 V4L2_CID_AUDIO_MUTE
, 0, 1, 1, 0);
1662 v4l2_ctrl_new_std(hdl
, &saa7134_ctrl_ops
,
1663 V4L2_CID_AUDIO_VOLUME
, -15, 15, 1, 0);
1664 v4l2_ctrl_new_custom(hdl
, &saa7134_ctrl_invert
, NULL
);
1665 v4l2_ctrl_new_custom(hdl
, &saa7134_ctrl_y_odd
, NULL
);
1666 v4l2_ctrl_new_custom(hdl
, &saa7134_ctrl_y_even
, NULL
);
1667 v4l2_ctrl_new_custom(hdl
, &saa7134_ctrl_automute
, NULL
);
1670 if (card_has_radio(dev
)) {
1671 hdl
= &dev
->radio_ctrl_handler
;
1672 v4l2_ctrl_handler_init(hdl
, 2);
1673 v4l2_ctrl_add_handler(hdl
, &dev
->ctrl_handler
,
1674 v4l2_ctrl_radio_filter
, false);
1680 if (dev
->tda9887_conf
&& saa7134_ctrl_automute
.def
)
1681 dev
->tda9887_conf
|= TDA9887_AUTOMUTE
;
1684 INIT_LIST_HEAD(&dev
->video_q
.queue
);
1685 timer_setup(&dev
->video_q
.timeout
, saa7134_buffer_timeout
, 0);
1686 dev
->video_q
.dev
= dev
;
1687 dev
->fmt
= format_by_fourcc(V4L2_PIX_FMT_BGR24
);
1690 dev
->field
= V4L2_FIELD_INTERLACED
;
1692 if (saa7134_boards
[dev
->board
].video_out
)
1693 saa7134_videoport_init(dev
);
1695 q
= &dev
->video_vbq
;
1696 q
->type
= V4L2_BUF_TYPE_VIDEO_CAPTURE
;
1698 * Do not add VB2_USERPTR unless explicitly requested: the saa7134 DMA
1699 * engine cannot handle transfers that do not start at the beginning
1700 * of a page. A user-provided pointer can start anywhere in a page, so
1701 * USERPTR support is a no-go unless the application knows about these
1702 * limitations and has special support for this.
1704 q
->io_modes
= VB2_MMAP
| VB2_DMABUF
| VB2_READ
;
1705 if (saa7134_userptr
)
1706 q
->io_modes
|= VB2_USERPTR
;
1707 q
->drv_priv
= &dev
->video_q
;
1709 q
->gfp_flags
= GFP_DMA32
;
1710 q
->mem_ops
= &vb2_dma_sg_memops
;
1711 q
->buf_struct_size
= sizeof(struct saa7134_buf
);
1712 q
->timestamp_flags
= V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC
;
1713 q
->lock
= &dev
->lock
;
1714 q
->dev
= &dev
->pci
->dev
;
1715 ret
= vb2_queue_init(q
);
1718 saa7134_pgtable_alloc(dev
->pci
, &dev
->video_q
.pt
);
1721 q
->type
= V4L2_BUF_TYPE_VBI_CAPTURE
;
1722 /* Don't add VB2_USERPTR, see comment above */
1723 q
->io_modes
= VB2_MMAP
| VB2_READ
;
1724 if (saa7134_userptr
)
1725 q
->io_modes
|= VB2_USERPTR
;
1726 q
->drv_priv
= &dev
->vbi_q
;
1727 q
->ops
= &saa7134_vbi_qops
;
1728 q
->gfp_flags
= GFP_DMA32
;
1729 q
->mem_ops
= &vb2_dma_sg_memops
;
1730 q
->buf_struct_size
= sizeof(struct saa7134_buf
);
1731 q
->timestamp_flags
= V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC
;
1732 q
->lock
= &dev
->lock
;
1733 q
->dev
= &dev
->pci
->dev
;
1734 ret
= vb2_queue_init(q
);
1737 saa7134_pgtable_alloc(dev
->pci
, &dev
->vbi_q
.pt
);
1742 void saa7134_video_fini(struct saa7134_dev
*dev
)
1744 del_timer_sync(&dev
->video_q
.timeout
);
1746 saa7134_pgtable_free(dev
->pci
, &dev
->video_q
.pt
);
1747 saa7134_pgtable_free(dev
->pci
, &dev
->vbi_q
.pt
);
1748 v4l2_ctrl_handler_free(&dev
->ctrl_handler
);
1749 if (card_has_radio(dev
))
1750 v4l2_ctrl_handler_free(&dev
->radio_ctrl_handler
);
1753 int saa7134_videoport_init(struct saa7134_dev
*dev
)
1755 /* enable video output */
1756 int vo
= saa7134_boards
[dev
->board
].video_out
;
1758 unsigned int vid_port_opts
= saa7134_boards
[dev
->board
].vid_port_opts
;
1760 /* Configure videoport */
1761 saa_writeb(SAA7134_VIDEO_PORT_CTRL0
, video_out
[vo
][0]);
1762 video_reg
= video_out
[vo
][1];
1763 if (vid_port_opts
& SET_T_CODE_POLARITY_NON_INVERTED
)
1764 video_reg
&= ~VP_T_CODE_P_INVERTED
;
1765 saa_writeb(SAA7134_VIDEO_PORT_CTRL1
, video_reg
);
1766 saa_writeb(SAA7134_VIDEO_PORT_CTRL2
, video_out
[vo
][2]);
1767 saa_writeb(SAA7134_VIDEO_PORT_CTRL4
, video_out
[vo
][4]);
1768 video_reg
= video_out
[vo
][5];
1769 if (vid_port_opts
& SET_CLOCK_NOT_DELAYED
)
1770 video_reg
&= ~VP_CLK_CTRL2_DELAYED
;
1771 if (vid_port_opts
& SET_CLOCK_INVERTED
)
1772 video_reg
|= VP_CLK_CTRL1_INVERTED
;
1773 saa_writeb(SAA7134_VIDEO_PORT_CTRL5
, video_reg
);
1774 video_reg
= video_out
[vo
][6];
1775 if (vid_port_opts
& SET_VSYNC_OFF
) {
1776 video_reg
&= ~VP_VS_TYPE_MASK
;
1777 video_reg
|= VP_VS_TYPE_OFF
;
1779 saa_writeb(SAA7134_VIDEO_PORT_CTRL6
, video_reg
);
1780 saa_writeb(SAA7134_VIDEO_PORT_CTRL7
, video_out
[vo
][7]);
1781 saa_writeb(SAA7134_VIDEO_PORT_CTRL8
, video_out
[vo
][8]);
1783 /* Start videoport */
1784 saa_writeb(SAA7134_VIDEO_PORT_CTRL3
, video_out
[vo
][3]);
1789 int saa7134_video_init2(struct saa7134_dev
*dev
)
1792 set_tvnorm(dev
,&tvnorms
[0]);
1794 v4l2_ctrl_handler_setup(&dev
->ctrl_handler
);
1795 saa7134_tvaudio_setmute(dev
);
1796 saa7134_tvaudio_setvolume(dev
,dev
->ctl_volume
);
1800 void saa7134_irq_video_signalchange(struct saa7134_dev
*dev
)
1802 static const char *st
[] = {
1803 "(no signal)", "NTSC", "PAL", "SECAM" };
1806 st1
= saa_readb(SAA7134_STATUS_VIDEO1
);
1807 st2
= saa_readb(SAA7134_STATUS_VIDEO2
);
1808 video_dbg("DCSDT: pll: %s, sync: %s, norm: %s\n",
1809 (st1
& 0x40) ? "not locked" : "locked",
1810 (st2
& 0x40) ? "no" : "yes",
1812 dev
->nosignal
= (st1
& 0x40) || (st2
& 0x40) || !(st2
& 0x1);
1814 if (dev
->nosignal
) {
1815 /* no video signal -> mute audio */
1816 if (dev
->ctl_automute
)
1818 saa7134_tvaudio_setmute(dev
);
1820 /* wake up tvaudio audio carrier scan thread */
1821 saa7134_tvaudio_do_scan(dev
);
1824 if ((st2
& 0x80) && !noninterlaced
&& !dev
->nosignal
)
1825 saa_clearb(SAA7134_SYNC_CTRL
, 0x20);
1827 saa_setb(SAA7134_SYNC_CTRL
, 0x20);
1829 if (dev
->mops
&& dev
->mops
->signal_change
)
1830 dev
->mops
->signal_change(dev
);
1834 void saa7134_irq_video_done(struct saa7134_dev
*dev
, unsigned long status
)
1836 enum v4l2_field field
;
1838 spin_lock(&dev
->slock
);
1839 if (dev
->video_q
.curr
) {
1841 if (V4L2_FIELD_HAS_BOTH(field
)) {
1842 /* make sure we have seen both fields */
1843 if ((status
& 0x10) == 0x00) {
1844 dev
->video_q
.curr
->top_seen
= 1;
1847 if (!dev
->video_q
.curr
->top_seen
)
1849 } else if (field
== V4L2_FIELD_TOP
) {
1850 if ((status
& 0x10) != 0x10)
1852 } else if (field
== V4L2_FIELD_BOTTOM
) {
1853 if ((status
& 0x10) != 0x00)
1856 saa7134_buffer_finish(dev
, &dev
->video_q
, VB2_BUF_STATE_DONE
);
1858 saa7134_buffer_next(dev
, &dev
->video_q
);
1861 spin_unlock(&dev
->slock
);