1 // SPDX-License-Identifier: GPL-2.0+
2 // saa711x - Philips SAA711x video decoder driver
3 // This driver can work with saa7111, saa7111a, saa7113, saa7114,
4 // saa7115 and saa7118.
6 // Based on saa7114 driver by Maxim Yevtyushkin, which is based on
7 // the saa7111 driver by Dave Perks.
9 // Copyright (C) 1998 Dave Perks <dperks@ibm.net>
10 // Copyright (C) 2002 Maxim Yevtyushkin <max@linuxmedialabs.com>
12 // Slight changes for video timing and attachment output by
13 // Wolfgang Scherr <scherr@net4you.net>
15 // Moved over to the linux >= 2.4.x i2c protocol (1/1/2003)
16 // by Ronald Bultje <rbultje@ronald.bitfreak.net>
18 // Added saa7115 support by Kevin Thayer <nufan_wfk at yahoo.com>
21 // VBI support (2004) and cleanups (2005) by Hans Verkuil <hverkuil@xs4all.nl>
23 // Copyright (c) 2005-2006 Mauro Carvalho Chehab <mchehab@kernel.org>
24 // SAA7111, SAA7113 and SAA7118 support
26 #include "saa711x_regs.h"
28 #include <linux/kernel.h>
29 #include <linux/module.h>
30 #include <linux/slab.h>
31 #include <linux/i2c.h>
32 #include <linux/videodev2.h>
33 #include <media/v4l2-device.h>
34 #include <media/v4l2-ctrls.h>
35 #include <media/v4l2-mc.h>
36 #include <media/i2c/saa7115.h>
37 #include <asm/div64.h>
39 #define VRES_60HZ (480+16)
41 MODULE_DESCRIPTION("Philips SAA7111/SAA7113/SAA7114/SAA7115/SAA7118 video decoder driver");
42 MODULE_AUTHOR( "Maxim Yevtyushkin, Kevin Thayer, Chris Kennedy, "
43 "Hans Verkuil, Mauro Carvalho Chehab");
44 MODULE_LICENSE("GPL");
47 module_param(debug
, bool, 0644);
49 MODULE_PARM_DESC(debug
, "Debug level (0-1)");
62 struct saa711x_state
{
63 struct v4l2_subdev sd
;
64 #ifdef CONFIG_MEDIA_CONTROLLER
65 struct media_pad pads
[DEMOD_NUM_PADS
];
67 struct v4l2_ctrl_handler hdl
;
70 /* chroma gain control cluster */
71 struct v4l2_ctrl
*agc
;
72 struct v4l2_ctrl
*gain
;
82 enum saa711x_model ident
;
91 static inline struct saa711x_state
*to_state(struct v4l2_subdev
*sd
)
93 return container_of(sd
, struct saa711x_state
, sd
);
96 static inline struct v4l2_subdev
*to_sd(struct v4l2_ctrl
*ctrl
)
98 return &container_of(ctrl
->handler
, struct saa711x_state
, hdl
)->sd
;
101 /* ----------------------------------------------------------------------- */
103 static inline int saa711x_write(struct v4l2_subdev
*sd
, u8 reg
, u8 value
)
105 struct i2c_client
*client
= v4l2_get_subdevdata(sd
);
107 return i2c_smbus_write_byte_data(client
, reg
, value
);
110 /* Sanity routine to check if a register is present */
111 static int saa711x_has_reg(const int id
, const u8 reg
)
114 return reg
< 0x20 && reg
!= 0x01 && reg
!= 0x0f &&
115 (reg
< 0x13 || reg
> 0x19) && reg
!= 0x1d && reg
!= 0x1e;
117 return reg
< 0x20 && reg
!= 0x01 && reg
!= 0x0f &&
118 reg
!= 0x14 && reg
!= 0x18 && reg
!= 0x19 &&
119 reg
!= 0x1d && reg
!= 0x1e;
121 /* common for saa7113/4/5/8 */
122 if (unlikely((reg
>= 0x3b && reg
<= 0x3f) || reg
== 0x5c || reg
== 0x5f ||
123 reg
== 0xa3 || reg
== 0xa7 || reg
== 0xab || reg
== 0xaf || (reg
>= 0xb5 && reg
<= 0xb7) ||
124 reg
== 0xd3 || reg
== 0xd7 || reg
== 0xdb || reg
== 0xdf || (reg
>= 0xe5 && reg
<= 0xe7) ||
125 reg
== 0x82 || (reg
>= 0x89 && reg
<= 0x8e)))
130 return reg
!= 0x14 && (reg
< 0x18 || reg
> 0x1e) && reg
< 0x20;
132 return reg
!= 0x14 && (reg
< 0x18 || reg
> 0x1e) && (reg
< 0x20 || reg
> 0x3f) &&
133 reg
!= 0x5d && reg
< 0x63;
135 return (reg
< 0x1a || reg
> 0x1e) && (reg
< 0x20 || reg
> 0x2f) &&
136 (reg
< 0x63 || reg
> 0x7f) && reg
!= 0x33 && reg
!= 0x37 &&
137 reg
!= 0x81 && reg
< 0xf0;
139 return (reg
< 0x20 || reg
> 0x2f) && reg
!= 0x65 && (reg
< 0xfc || reg
> 0xfe);
141 return (reg
< 0x1a || reg
> 0x1d) && (reg
< 0x20 || reg
> 0x22) &&
142 (reg
< 0x26 || reg
> 0x28) && reg
!= 0x33 && reg
!= 0x37 &&
143 (reg
< 0x63 || reg
> 0x7f) && reg
!= 0x81 && reg
< 0xf0;
148 static int saa711x_writeregs(struct v4l2_subdev
*sd
, const unsigned char *regs
)
150 struct saa711x_state
*state
= to_state(sd
);
151 unsigned char reg
, data
;
153 while (*regs
!= 0x00) {
157 /* According with datasheets, reserved regs should be
158 filled with 0 - seems better not to touch on they */
159 if (saa711x_has_reg(state
->ident
, reg
)) {
160 if (saa711x_write(sd
, reg
, data
) < 0)
163 v4l2_dbg(1, debug
, sd
, "tried to access reserved reg 0x%02x\n", reg
);
169 static inline int saa711x_read(struct v4l2_subdev
*sd
, u8 reg
)
171 struct i2c_client
*client
= v4l2_get_subdevdata(sd
);
173 return i2c_smbus_read_byte_data(client
, reg
);
176 /* ----------------------------------------------------------------------- */
178 /* SAA7111 initialization table */
179 static const unsigned char saa7111_init
[] = {
180 R_01_INC_DELAY
, 0x00, /* reserved */
183 R_02_INPUT_CNTL_1
, 0xd0, /* FUSE=3, GUDL=2, MODE=0 */
184 R_03_INPUT_CNTL_2
, 0x23, /* HLNRS=0, VBSL=1, WPOFF=0, HOLDG=0,
185 * GAFIX=0, GAI1=256, GAI2=256 */
186 R_04_INPUT_CNTL_3
, 0x00, /* GAI1=256 */
187 R_05_INPUT_CNTL_4
, 0x00, /* GAI2=256 */
190 R_06_H_SYNC_START
, 0xf3, /* HSB at 13(50Hz) / 17(60Hz)
191 * pixels after end of last line */
192 R_07_H_SYNC_STOP
, 0xe8, /* HSS seems to be needed to
193 * work with NTSC, too */
194 R_08_SYNC_CNTL
, 0xc8, /* AUFD=1, FSEL=1, EXFIL=0,
195 * VTRC=1, HPLL=0, VNOI=0 */
196 R_09_LUMA_CNTL
, 0x01, /* BYPS=0, PREF=0, BPSS=0,
197 * VBLB=0, UPTCV=0, APER=1 */
198 R_0A_LUMA_BRIGHT_CNTL
, 0x80,
199 R_0B_LUMA_CONTRAST_CNTL
, 0x47, /* 0b - CONT=1.109 */
200 R_0C_CHROMA_SAT_CNTL
, 0x40,
201 R_0D_CHROMA_HUE_CNTL
, 0x00,
202 R_0E_CHROMA_CNTL_1
, 0x01, /* 0e - CDTO=0, CSTD=0, DCCF=0,
204 R_0F_CHROMA_GAIN_CNTL
, 0x00, /* reserved */
205 R_10_CHROMA_CNTL_2
, 0x48, /* 10 - OFTS=1, HDEL=0, VRLN=1, YDEL=0 */
206 R_11_MODE_DELAY_CNTL
, 0x1c, /* 11 - GPSW=0, CM99=0, FECO=0, COMPO=1,
207 * OEYC=1, OEHV=1, VIPB=0, COLO=0 */
208 R_12_RT_SIGNAL_CNTL
, 0x00, /* 12 - output control 2 */
209 R_13_RT_X_PORT_OUT_CNTL
, 0x00, /* 13 - output control 3 */
210 R_14_ANAL_ADC_COMPAT_CNTL
, 0x00,
211 R_15_VGATE_START_FID_CHG
, 0x00,
212 R_16_VGATE_STOP
, 0x00,
213 R_17_MISC_VGATE_CONF_AND_MSB
, 0x00,
219 * This table has one illegal value, and some values that are not
220 * correct according to the datasheet initialization table.
222 * If you need a table with legal/default values tell the driver in
223 * i2c_board_info.platform_data, and you will get the gm7113c_init
227 /* SAA7113 Init codes */
228 static const unsigned char saa7113_init
[] = {
229 R_01_INC_DELAY
, 0x08,
230 R_02_INPUT_CNTL_1
, 0xc2,
231 R_03_INPUT_CNTL_2
, 0x30,
232 R_04_INPUT_CNTL_3
, 0x00,
233 R_05_INPUT_CNTL_4
, 0x00,
234 R_06_H_SYNC_START
, 0x89, /* Illegal value -119,
235 * min. value = -108 (0x94) */
236 R_07_H_SYNC_STOP
, 0x0d,
237 R_08_SYNC_CNTL
, 0x88, /* Not datasheet default.
238 * HTC = VTR mode, should be 0x98 */
239 R_09_LUMA_CNTL
, 0x01,
240 R_0A_LUMA_BRIGHT_CNTL
, 0x80,
241 R_0B_LUMA_CONTRAST_CNTL
, 0x47,
242 R_0C_CHROMA_SAT_CNTL
, 0x40,
243 R_0D_CHROMA_HUE_CNTL
, 0x00,
244 R_0E_CHROMA_CNTL_1
, 0x01,
245 R_0F_CHROMA_GAIN_CNTL
, 0x2a,
246 R_10_CHROMA_CNTL_2
, 0x08, /* Not datsheet default.
247 * VRLN enabled, should be 0x00 */
248 R_11_MODE_DELAY_CNTL
, 0x0c,
249 R_12_RT_SIGNAL_CNTL
, 0x07, /* Not datasheet default,
251 R_13_RT_X_PORT_OUT_CNTL
, 0x00,
252 R_14_ANAL_ADC_COMPAT_CNTL
, 0x00,
253 R_15_VGATE_START_FID_CHG
, 0x00,
254 R_16_VGATE_STOP
, 0x00,
255 R_17_MISC_VGATE_CONF_AND_MSB
, 0x00,
261 * GM7113C is a clone of the SAA7113 chip
262 * This init table is copied out of the saa7113 datasheet.
263 * In R_08 we enable "Automatic Field Detection" [AUFD],
264 * this is disabled when saa711x_set_v4lstd is called.
266 static const unsigned char gm7113c_init
[] = {
267 R_01_INC_DELAY
, 0x08,
268 R_02_INPUT_CNTL_1
, 0xc0,
269 R_03_INPUT_CNTL_2
, 0x33,
270 R_04_INPUT_CNTL_3
, 0x00,
271 R_05_INPUT_CNTL_4
, 0x00,
272 R_06_H_SYNC_START
, 0xe9,
273 R_07_H_SYNC_STOP
, 0x0d,
274 R_08_SYNC_CNTL
, 0x98,
275 R_09_LUMA_CNTL
, 0x01,
276 R_0A_LUMA_BRIGHT_CNTL
, 0x80,
277 R_0B_LUMA_CONTRAST_CNTL
, 0x47,
278 R_0C_CHROMA_SAT_CNTL
, 0x40,
279 R_0D_CHROMA_HUE_CNTL
, 0x00,
280 R_0E_CHROMA_CNTL_1
, 0x01,
281 R_0F_CHROMA_GAIN_CNTL
, 0x2a,
282 R_10_CHROMA_CNTL_2
, 0x00,
283 R_11_MODE_DELAY_CNTL
, 0x0c,
284 R_12_RT_SIGNAL_CNTL
, 0x01,
285 R_13_RT_X_PORT_OUT_CNTL
, 0x00,
286 R_14_ANAL_ADC_COMPAT_CNTL
, 0x00,
287 R_15_VGATE_START_FID_CHG
, 0x00,
288 R_16_VGATE_STOP
, 0x00,
289 R_17_MISC_VGATE_CONF_AND_MSB
, 0x00,
294 /* If a value differs from the Hauppauge driver values, then the comment starts with
295 'was 0xXX' to denote the Hauppauge value. Otherwise the value is identical to what the
296 Hauppauge driver sets. */
298 /* SAA7114 and SAA7115 initialization table */
299 static const unsigned char saa7115_init_auto_input
[] = {
301 R_01_INC_DELAY
, 0x48, /* white peak control disabled */
302 R_03_INPUT_CNTL_2
, 0x20, /* was 0x30. 0x20: long vertical blanking */
303 R_04_INPUT_CNTL_3
, 0x90, /* analog gain set to 0 */
304 R_05_INPUT_CNTL_4
, 0x90, /* analog gain set to 0 */
306 R_06_H_SYNC_START
, 0xeb, /* horiz sync begin = -21 */
307 R_07_H_SYNC_STOP
, 0xe0, /* horiz sync stop = -17 */
308 R_09_LUMA_CNTL
, 0x53, /* 0x53, was 0x56 for 60hz. luminance control */
309 R_0A_LUMA_BRIGHT_CNTL
, 0x80, /* was 0x88. decoder brightness, 0x80 is itu standard */
310 R_0B_LUMA_CONTRAST_CNTL
, 0x44, /* was 0x48. decoder contrast, 0x44 is itu standard */
311 R_0C_CHROMA_SAT_CNTL
, 0x40, /* was 0x47. decoder saturation, 0x40 is itu standard */
312 R_0D_CHROMA_HUE_CNTL
, 0x00,
313 R_0F_CHROMA_GAIN_CNTL
, 0x00, /* use automatic gain */
314 R_10_CHROMA_CNTL_2
, 0x06, /* chroma: active adaptive combfilter */
315 R_11_MODE_DELAY_CNTL
, 0x00,
316 R_12_RT_SIGNAL_CNTL
, 0x9d, /* RTS0 output control: VGATE */
317 R_13_RT_X_PORT_OUT_CNTL
, 0x80, /* ITU656 standard mode, RTCO output enable RTCE */
318 R_14_ANAL_ADC_COMPAT_CNTL
, 0x00,
319 R_18_RAW_DATA_GAIN_CNTL
, 0x40, /* gain 0x00 = nominal */
320 R_19_RAW_DATA_OFF_CNTL
, 0x80,
321 R_1A_COLOR_KILL_LVL_CNTL
, 0x77, /* recommended value */
322 R_1B_MISC_TVVCRDET
, 0x42, /* recommended value */
323 R_1C_ENHAN_COMB_CTRL1
, 0xa9, /* recommended value */
324 R_1D_ENHAN_COMB_CTRL2
, 0x01, /* recommended value */
327 R_80_GLOBAL_CNTL_1
, 0x0, /* No tasks enabled at init */
329 /* Power Device Control */
330 R_88_POWER_SAVE_ADC_PORT_CNTL
, 0xd0, /* reset device */
331 R_88_POWER_SAVE_ADC_PORT_CNTL
, 0xf0, /* set device programmed, all in operational mode */
335 /* Used to reset saa7113, saa7114 and saa7115 */
336 static const unsigned char saa7115_cfg_reset_scaler
[] = {
337 R_87_I_PORT_I_O_ENA_OUT_CLK_AND_GATED
, 0x00, /* disable I-port output */
338 R_88_POWER_SAVE_ADC_PORT_CNTL
, 0xd0, /* reset scaler */
339 R_88_POWER_SAVE_ADC_PORT_CNTL
, 0xf0, /* activate scaler */
340 R_87_I_PORT_I_O_ENA_OUT_CLK_AND_GATED
, 0x01, /* enable I-port output */
344 /* ============== SAA7715 VIDEO templates ============= */
346 static const unsigned char saa7115_cfg_60hz_video
[] = {
347 R_80_GLOBAL_CNTL_1
, 0x00, /* reset tasks */
348 R_88_POWER_SAVE_ADC_PORT_CNTL
, 0xd0, /* reset scaler */
350 R_15_VGATE_START_FID_CHG
, 0x03,
351 R_16_VGATE_STOP
, 0x11,
352 R_17_MISC_VGATE_CONF_AND_MSB
, 0x9c,
354 R_08_SYNC_CNTL
, 0x68, /* 0xBO: auto detection, 0x68 = NTSC */
355 R_0E_CHROMA_CNTL_1
, 0x07, /* video autodetection is on */
357 R_5A_V_OFF_FOR_SLICER
, 0x06, /* standard 60hz value for ITU656 line counting */
360 R_90_A_TASK_HANDLING_CNTL
, 0x80,
361 R_91_A_X_PORT_FORMATS_AND_CONF
, 0x48,
362 R_92_A_X_PORT_INPUT_REFERENCE_SIGNAL
, 0x40,
363 R_93_A_I_PORT_OUTPUT_FORMATS_AND_CONF
, 0x84,
365 /* hoffset low (input), 0x0002 is minimum */
366 R_94_A_HORIZ_INPUT_WINDOW_START
, 0x01,
367 R_95_A_HORIZ_INPUT_WINDOW_START_MSB
, 0x00,
369 /* hsize low (input), 0x02d0 = 720 */
370 R_96_A_HORIZ_INPUT_WINDOW_LENGTH
, 0xd0,
371 R_97_A_HORIZ_INPUT_WINDOW_LENGTH_MSB
, 0x02,
373 R_98_A_VERT_INPUT_WINDOW_START
, 0x05,
374 R_99_A_VERT_INPUT_WINDOW_START_MSB
, 0x00,
376 R_9A_A_VERT_INPUT_WINDOW_LENGTH
, 0x0c,
377 R_9B_A_VERT_INPUT_WINDOW_LENGTH_MSB
, 0x00,
379 R_9C_A_HORIZ_OUTPUT_WINDOW_LENGTH
, 0xa0,
380 R_9D_A_HORIZ_OUTPUT_WINDOW_LENGTH_MSB
, 0x05,
382 R_9E_A_VERT_OUTPUT_WINDOW_LENGTH
, 0x0c,
383 R_9F_A_VERT_OUTPUT_WINDOW_LENGTH_MSB
, 0x00,
386 R_C0_B_TASK_HANDLING_CNTL
, 0x00,
387 R_C1_B_X_PORT_FORMATS_AND_CONF
, 0x08,
388 R_C2_B_INPUT_REFERENCE_SIGNAL_DEFINITION
, 0x00,
389 R_C3_B_I_PORT_FORMATS_AND_CONF
, 0x80,
391 /* 0x0002 is minimum */
392 R_C4_B_HORIZ_INPUT_WINDOW_START
, 0x02,
393 R_C5_B_HORIZ_INPUT_WINDOW_START_MSB
, 0x00,
396 R_C6_B_HORIZ_INPUT_WINDOW_LENGTH
, 0xd0,
397 R_C7_B_HORIZ_INPUT_WINDOW_LENGTH_MSB
, 0x02,
399 /* vwindow start 0x12 = 18 */
400 R_C8_B_VERT_INPUT_WINDOW_START
, 0x12,
401 R_C9_B_VERT_INPUT_WINDOW_START_MSB
, 0x00,
403 /* vwindow length 0xf8 = 248 */
404 R_CA_B_VERT_INPUT_WINDOW_LENGTH
, VRES_60HZ
>>1,
405 R_CB_B_VERT_INPUT_WINDOW_LENGTH_MSB
, VRES_60HZ
>>9,
407 /* hwindow 0x02d0 = 720 */
408 R_CC_B_HORIZ_OUTPUT_WINDOW_LENGTH
, 0xd0,
409 R_CD_B_HORIZ_OUTPUT_WINDOW_LENGTH_MSB
, 0x02,
411 R_F0_LFCO_PER_LINE
, 0xad, /* Set PLL Register. 60hz 525 lines per frame, 27 MHz */
412 R_F1_P_I_PARAM_SELECT
, 0x05, /* low bit with 0xF0 */
413 R_F5_PULSGEN_LINE_LENGTH
, 0xad,
414 R_F6_PULSE_A_POS_LSB_AND_PULSEGEN_CONFIG
, 0x01,
419 static const unsigned char saa7115_cfg_50hz_video
[] = {
420 R_80_GLOBAL_CNTL_1
, 0x00,
421 R_88_POWER_SAVE_ADC_PORT_CNTL
, 0xd0, /* reset scaler */
423 R_15_VGATE_START_FID_CHG
, 0x37, /* VGATE start */
424 R_16_VGATE_STOP
, 0x16,
425 R_17_MISC_VGATE_CONF_AND_MSB
, 0x99,
427 R_08_SYNC_CNTL
, 0x28, /* 0x28 = PAL */
428 R_0E_CHROMA_CNTL_1
, 0x07,
430 R_5A_V_OFF_FOR_SLICER
, 0x03, /* standard 50hz value */
433 R_90_A_TASK_HANDLING_CNTL
, 0x81,
434 R_91_A_X_PORT_FORMATS_AND_CONF
, 0x48,
435 R_92_A_X_PORT_INPUT_REFERENCE_SIGNAL
, 0x40,
436 R_93_A_I_PORT_OUTPUT_FORMATS_AND_CONF
, 0x84,
438 /* This is weird: the datasheet says that you should use 2 as the minimum value, */
439 /* but Hauppauge uses 0, and changing that to 2 causes indeed problems (for 50hz) */
440 /* hoffset low (input), 0x0002 is minimum */
441 R_94_A_HORIZ_INPUT_WINDOW_START
, 0x00,
442 R_95_A_HORIZ_INPUT_WINDOW_START_MSB
, 0x00,
444 /* hsize low (input), 0x02d0 = 720 */
445 R_96_A_HORIZ_INPUT_WINDOW_LENGTH
, 0xd0,
446 R_97_A_HORIZ_INPUT_WINDOW_LENGTH_MSB
, 0x02,
448 R_98_A_VERT_INPUT_WINDOW_START
, 0x03,
449 R_99_A_VERT_INPUT_WINDOW_START_MSB
, 0x00,
451 /* vsize 0x12 = 18 */
452 R_9A_A_VERT_INPUT_WINDOW_LENGTH
, 0x12,
453 R_9B_A_VERT_INPUT_WINDOW_LENGTH_MSB
, 0x00,
455 /* hsize 0x05a0 = 1440 */
456 R_9C_A_HORIZ_OUTPUT_WINDOW_LENGTH
, 0xa0,
457 R_9D_A_HORIZ_OUTPUT_WINDOW_LENGTH_MSB
, 0x05, /* hsize hi (output) */
458 R_9E_A_VERT_OUTPUT_WINDOW_LENGTH
, 0x12, /* vsize low (output), 0x12 = 18 */
459 R_9F_A_VERT_OUTPUT_WINDOW_LENGTH_MSB
, 0x00, /* vsize hi (output) */
462 R_C0_B_TASK_HANDLING_CNTL
, 0x00,
463 R_C1_B_X_PORT_FORMATS_AND_CONF
, 0x08,
464 R_C2_B_INPUT_REFERENCE_SIGNAL_DEFINITION
, 0x00,
465 R_C3_B_I_PORT_FORMATS_AND_CONF
, 0x80,
467 /* This is weird: the datasheet says that you should use 2 as the minimum value, */
468 /* but Hauppauge uses 0, and changing that to 2 causes indeed problems (for 50hz) */
469 /* hoffset low (input), 0x0002 is minimum. See comment above. */
470 R_C4_B_HORIZ_INPUT_WINDOW_START
, 0x00,
471 R_C5_B_HORIZ_INPUT_WINDOW_START_MSB
, 0x00,
473 /* hsize 0x02d0 = 720 */
474 R_C6_B_HORIZ_INPUT_WINDOW_LENGTH
, 0xd0,
475 R_C7_B_HORIZ_INPUT_WINDOW_LENGTH_MSB
, 0x02,
477 /* voffset 0x16 = 22 */
478 R_C8_B_VERT_INPUT_WINDOW_START
, 0x16,
479 R_C9_B_VERT_INPUT_WINDOW_START_MSB
, 0x00,
481 /* vsize 0x0120 = 288 */
482 R_CA_B_VERT_INPUT_WINDOW_LENGTH
, 0x20,
483 R_CB_B_VERT_INPUT_WINDOW_LENGTH_MSB
, 0x01,
485 /* hsize 0x02d0 = 720 */
486 R_CC_B_HORIZ_OUTPUT_WINDOW_LENGTH
, 0xd0,
487 R_CD_B_HORIZ_OUTPUT_WINDOW_LENGTH_MSB
, 0x02,
489 R_F0_LFCO_PER_LINE
, 0xb0, /* Set PLL Register. 50hz 625 lines per frame, 27 MHz */
490 R_F1_P_I_PARAM_SELECT
, 0x05, /* low bit with 0xF0, (was 0x05) */
491 R_F5_PULSGEN_LINE_LENGTH
, 0xb0,
492 R_F6_PULSE_A_POS_LSB_AND_PULSEGEN_CONFIG
, 0x01,
497 /* ============== SAA7715 VIDEO templates (end) ======= */
499 static const unsigned char saa7115_cfg_vbi_on
[] = {
500 R_80_GLOBAL_CNTL_1
, 0x00, /* reset tasks */
501 R_88_POWER_SAVE_ADC_PORT_CNTL
, 0xd0, /* reset scaler */
502 R_80_GLOBAL_CNTL_1
, 0x30, /* Activate both tasks */
503 R_88_POWER_SAVE_ADC_PORT_CNTL
, 0xf0, /* activate scaler */
504 R_87_I_PORT_I_O_ENA_OUT_CLK_AND_GATED
, 0x01, /* Enable I-port output */
509 static const unsigned char saa7115_cfg_vbi_off
[] = {
510 R_80_GLOBAL_CNTL_1
, 0x00, /* reset tasks */
511 R_88_POWER_SAVE_ADC_PORT_CNTL
, 0xd0, /* reset scaler */
512 R_80_GLOBAL_CNTL_1
, 0x20, /* Activate only task "B" */
513 R_88_POWER_SAVE_ADC_PORT_CNTL
, 0xf0, /* activate scaler */
514 R_87_I_PORT_I_O_ENA_OUT_CLK_AND_GATED
, 0x01, /* Enable I-port output */
520 static const unsigned char saa7115_init_misc
[] = {
521 R_81_V_SYNC_FLD_ID_SRC_SEL_AND_RETIMED_V_F
, 0x01,
522 R_83_X_PORT_I_O_ENA_AND_OUT_CLK
, 0x01,
523 R_84_I_PORT_SIGNAL_DEF
, 0x20,
524 R_85_I_PORT_SIGNAL_POLAR
, 0x21,
525 R_86_I_PORT_FIFO_FLAG_CNTL_AND_ARBIT
, 0xc5,
526 R_87_I_PORT_I_O_ENA_OUT_CLK_AND_GATED
, 0x01,
529 R_A0_A_HORIZ_PRESCALING
, 0x01,
530 R_A1_A_ACCUMULATION_LENGTH
, 0x00,
531 R_A2_A_PRESCALER_DC_GAIN_AND_FIR_PREFILTER
, 0x00,
533 /* Configure controls at nominal value*/
534 R_A4_A_LUMA_BRIGHTNESS_CNTL
, 0x80,
535 R_A5_A_LUMA_CONTRAST_CNTL
, 0x40,
536 R_A6_A_CHROMA_SATURATION_CNTL
, 0x40,
538 /* note: 2 x zoom ensures that VBI lines have same length as video lines. */
539 R_A8_A_HORIZ_LUMA_SCALING_INC
, 0x00,
540 R_A9_A_HORIZ_LUMA_SCALING_INC_MSB
, 0x02,
542 R_AA_A_HORIZ_LUMA_PHASE_OFF
, 0x00,
544 /* must be horiz lum scaling / 2 */
545 R_AC_A_HORIZ_CHROMA_SCALING_INC
, 0x00,
546 R_AD_A_HORIZ_CHROMA_SCALING_INC_MSB
, 0x01,
548 /* must be offset luma / 2 */
549 R_AE_A_HORIZ_CHROMA_PHASE_OFF
, 0x00,
551 R_B0_A_VERT_LUMA_SCALING_INC
, 0x00,
552 R_B1_A_VERT_LUMA_SCALING_INC_MSB
, 0x04,
554 R_B2_A_VERT_CHROMA_SCALING_INC
, 0x00,
555 R_B3_A_VERT_CHROMA_SCALING_INC_MSB
, 0x04,
557 R_B4_A_VERT_SCALING_MODE_CNTL
, 0x01,
559 R_B8_A_VERT_CHROMA_PHASE_OFF_00
, 0x00,
560 R_B9_A_VERT_CHROMA_PHASE_OFF_01
, 0x00,
561 R_BA_A_VERT_CHROMA_PHASE_OFF_10
, 0x00,
562 R_BB_A_VERT_CHROMA_PHASE_OFF_11
, 0x00,
564 R_BC_A_VERT_LUMA_PHASE_OFF_00
, 0x00,
565 R_BD_A_VERT_LUMA_PHASE_OFF_01
, 0x00,
566 R_BE_A_VERT_LUMA_PHASE_OFF_10
, 0x00,
567 R_BF_A_VERT_LUMA_PHASE_OFF_11
, 0x00,
570 R_D0_B_HORIZ_PRESCALING
, 0x01,
571 R_D1_B_ACCUMULATION_LENGTH
, 0x00,
572 R_D2_B_PRESCALER_DC_GAIN_AND_FIR_PREFILTER
, 0x00,
574 /* Configure controls at nominal value*/
575 R_D4_B_LUMA_BRIGHTNESS_CNTL
, 0x80,
576 R_D5_B_LUMA_CONTRAST_CNTL
, 0x40,
577 R_D6_B_CHROMA_SATURATION_CNTL
, 0x40,
579 /* hor lum scaling 0x0400 = 1 */
580 R_D8_B_HORIZ_LUMA_SCALING_INC
, 0x00,
581 R_D9_B_HORIZ_LUMA_SCALING_INC_MSB
, 0x04,
583 R_DA_B_HORIZ_LUMA_PHASE_OFF
, 0x00,
585 /* must be hor lum scaling / 2 */
586 R_DC_B_HORIZ_CHROMA_SCALING
, 0x00,
587 R_DD_B_HORIZ_CHROMA_SCALING_MSB
, 0x02,
589 /* must be offset luma / 2 */
590 R_DE_B_HORIZ_PHASE_OFFSET_CRHOMA
, 0x00,
592 R_E0_B_VERT_LUMA_SCALING_INC
, 0x00,
593 R_E1_B_VERT_LUMA_SCALING_INC_MSB
, 0x04,
595 R_E2_B_VERT_CHROMA_SCALING_INC
, 0x00,
596 R_E3_B_VERT_CHROMA_SCALING_INC_MSB
, 0x04,
598 R_E4_B_VERT_SCALING_MODE_CNTL
, 0x01,
600 R_E8_B_VERT_CHROMA_PHASE_OFF_00
, 0x00,
601 R_E9_B_VERT_CHROMA_PHASE_OFF_01
, 0x00,
602 R_EA_B_VERT_CHROMA_PHASE_OFF_10
, 0x00,
603 R_EB_B_VERT_CHROMA_PHASE_OFF_11
, 0x00,
605 R_EC_B_VERT_LUMA_PHASE_OFF_00
, 0x00,
606 R_ED_B_VERT_LUMA_PHASE_OFF_01
, 0x00,
607 R_EE_B_VERT_LUMA_PHASE_OFF_10
, 0x00,
608 R_EF_B_VERT_LUMA_PHASE_OFF_11
, 0x00,
610 R_F2_NOMINAL_PLL2_DTO
, 0x50, /* crystal clock = 24.576 MHz, target = 27MHz */
611 R_F3_PLL_INCREMENT
, 0x46,
612 R_F4_PLL2_STATUS
, 0x00,
613 R_F7_PULSE_A_POS_MSB
, 0x4b, /* not the recommended settings! */
614 R_F8_PULSE_B_POS
, 0x00,
615 R_F9_PULSE_B_POS_MSB
, 0x4b,
616 R_FA_PULSE_C_POS
, 0x00,
617 R_FB_PULSE_C_POS_MSB
, 0x4b,
619 /* PLL2 lock detection settings: 71 lines 50% phase error */
620 R_FF_S_PLL_MAX_PHASE_ERR_THRESH_NUM_LINES
, 0x88,
623 R_40_SLICER_CNTL_1
, 0x20, /* No framing code errors allowed. */
625 R_41_LCR_BASE
+1, 0xff,
626 R_41_LCR_BASE
+2, 0xff,
627 R_41_LCR_BASE
+3, 0xff,
628 R_41_LCR_BASE
+4, 0xff,
629 R_41_LCR_BASE
+5, 0xff,
630 R_41_LCR_BASE
+6, 0xff,
631 R_41_LCR_BASE
+7, 0xff,
632 R_41_LCR_BASE
+8, 0xff,
633 R_41_LCR_BASE
+9, 0xff,
634 R_41_LCR_BASE
+10, 0xff,
635 R_41_LCR_BASE
+11, 0xff,
636 R_41_LCR_BASE
+12, 0xff,
637 R_41_LCR_BASE
+13, 0xff,
638 R_41_LCR_BASE
+14, 0xff,
639 R_41_LCR_BASE
+15, 0xff,
640 R_41_LCR_BASE
+16, 0xff,
641 R_41_LCR_BASE
+17, 0xff,
642 R_41_LCR_BASE
+18, 0xff,
643 R_41_LCR_BASE
+19, 0xff,
644 R_41_LCR_BASE
+20, 0xff,
645 R_41_LCR_BASE
+21, 0xff,
646 R_41_LCR_BASE
+22, 0xff,
647 R_58_PROGRAM_FRAMING_CODE
, 0x40,
648 R_59_H_OFF_FOR_SLICER
, 0x47,
649 R_5B_FLD_OFF_AND_MSB_FOR_H_AND_V_OFF
, 0x83,
653 R_02_INPUT_CNTL_1
, 0xc4, /* input tuner -> input 4, amplifier active */
655 R_80_GLOBAL_CNTL_1
, 0x20, /* enable task B */
656 R_88_POWER_SAVE_ADC_PORT_CNTL
, 0xd0,
657 R_88_POWER_SAVE_ADC_PORT_CNTL
, 0xf0,
661 static int saa711x_odd_parity(u8 c
)
670 static int saa711x_decode_vps(u8
*dst
, u8
*p
)
672 static const u8 biphase_tbl
[] = {
673 0xf0, 0x78, 0x70, 0xf0, 0xb4, 0x3c, 0x34, 0xb4,
674 0xb0, 0x38, 0x30, 0xb0, 0xf0, 0x78, 0x70, 0xf0,
675 0xd2, 0x5a, 0x52, 0xd2, 0x96, 0x1e, 0x16, 0x96,
676 0x92, 0x1a, 0x12, 0x92, 0xd2, 0x5a, 0x52, 0xd2,
677 0xd0, 0x58, 0x50, 0xd0, 0x94, 0x1c, 0x14, 0x94,
678 0x90, 0x18, 0x10, 0x90, 0xd0, 0x58, 0x50, 0xd0,
679 0xf0, 0x78, 0x70, 0xf0, 0xb4, 0x3c, 0x34, 0xb4,
680 0xb0, 0x38, 0x30, 0xb0, 0xf0, 0x78, 0x70, 0xf0,
681 0xe1, 0x69, 0x61, 0xe1, 0xa5, 0x2d, 0x25, 0xa5,
682 0xa1, 0x29, 0x21, 0xa1, 0xe1, 0x69, 0x61, 0xe1,
683 0xc3, 0x4b, 0x43, 0xc3, 0x87, 0x0f, 0x07, 0x87,
684 0x83, 0x0b, 0x03, 0x83, 0xc3, 0x4b, 0x43, 0xc3,
685 0xc1, 0x49, 0x41, 0xc1, 0x85, 0x0d, 0x05, 0x85,
686 0x81, 0x09, 0x01, 0x81, 0xc1, 0x49, 0x41, 0xc1,
687 0xe1, 0x69, 0x61, 0xe1, 0xa5, 0x2d, 0x25, 0xa5,
688 0xa1, 0x29, 0x21, 0xa1, 0xe1, 0x69, 0x61, 0xe1,
689 0xe0, 0x68, 0x60, 0xe0, 0xa4, 0x2c, 0x24, 0xa4,
690 0xa0, 0x28, 0x20, 0xa0, 0xe0, 0x68, 0x60, 0xe0,
691 0xc2, 0x4a, 0x42, 0xc2, 0x86, 0x0e, 0x06, 0x86,
692 0x82, 0x0a, 0x02, 0x82, 0xc2, 0x4a, 0x42, 0xc2,
693 0xc0, 0x48, 0x40, 0xc0, 0x84, 0x0c, 0x04, 0x84,
694 0x80, 0x08, 0x00, 0x80, 0xc0, 0x48, 0x40, 0xc0,
695 0xe0, 0x68, 0x60, 0xe0, 0xa4, 0x2c, 0x24, 0xa4,
696 0xa0, 0x28, 0x20, 0xa0, 0xe0, 0x68, 0x60, 0xe0,
697 0xf0, 0x78, 0x70, 0xf0, 0xb4, 0x3c, 0x34, 0xb4,
698 0xb0, 0x38, 0x30, 0xb0, 0xf0, 0x78, 0x70, 0xf0,
699 0xd2, 0x5a, 0x52, 0xd2, 0x96, 0x1e, 0x16, 0x96,
700 0x92, 0x1a, 0x12, 0x92, 0xd2, 0x5a, 0x52, 0xd2,
701 0xd0, 0x58, 0x50, 0xd0, 0x94, 0x1c, 0x14, 0x94,
702 0x90, 0x18, 0x10, 0x90, 0xd0, 0x58, 0x50, 0xd0,
703 0xf0, 0x78, 0x70, 0xf0, 0xb4, 0x3c, 0x34, 0xb4,
704 0xb0, 0x38, 0x30, 0xb0, 0xf0, 0x78, 0x70, 0xf0,
709 for (i
= 0; i
< 2 * 13; i
+= 2) {
710 err
|= biphase_tbl
[p
[i
]] | biphase_tbl
[p
[i
+ 1]];
711 c
= (biphase_tbl
[p
[i
+ 1]] & 0xf) | ((biphase_tbl
[p
[i
]] & 0xf) << 4);
717 static int saa711x_decode_wss(u8
*p
)
719 static const int wss_bits
[8] = {
720 0, 0, 0, 1, 0, 1, 1, 1
722 unsigned char parity
;
726 for (i
= 0; i
< 16; i
++) {
727 int b1
= wss_bits
[p
[i
] & 7];
728 int b2
= wss_bits
[(p
[i
] >> 3) & 7];
735 parity
^= parity
>> 2;
736 parity
^= parity
>> 1;
744 static int saa711x_s_clock_freq(struct v4l2_subdev
*sd
, u32 freq
)
746 struct saa711x_state
*state
= to_state(sd
);
751 u8 acc
= 0; /* reg 0x3a, audio clock control */
753 /* Checks for chips that don't have audio clock (saa7111, saa7113) */
754 if (!saa711x_has_reg(state
->ident
, R_30_AUD_MAST_CLK_CYCLES_PER_FIELD
))
757 v4l2_dbg(1, debug
, sd
, "set audio clock freq: %d\n", freq
);
760 if (freq
< 32000 || freq
> 48000)
763 /* hz is the refresh rate times 100 */
764 hz
= (state
->std
& V4L2_STD_525_60
) ? 5994 : 5000;
765 /* acpf = (256 * freq) / field_frequency == (256 * 100 * freq) / hz */
766 acpf
= (25600 * freq
) / hz
;
767 /* acni = (256 * freq * 2^23) / crystal_frequency =
768 (freq * 2^(8+23)) / crystal_frequency =
769 (freq << 31) / crystal_frequency */
772 do_div(f
, state
->crystal_freq
);
775 acpf
= acpf
* state
->cgcdiv
/ 16;
776 acni
= acni
* state
->cgcdiv
/ 16;
778 if (state
->cgcdiv
== 3)
784 if (state
->double_asclk
) {
788 saa711x_write(sd
, R_38_CLK_RATIO_AMXCLK_TO_ASCLK
, 0x03);
789 saa711x_write(sd
, R_39_CLK_RATIO_ASCLK_TO_ALRCLK
, 0x10 << state
->double_asclk
);
790 saa711x_write(sd
, R_3A_AUD_CLK_GEN_BASIC_SETUP
, acc
);
792 saa711x_write(sd
, R_30_AUD_MAST_CLK_CYCLES_PER_FIELD
, acpf
& 0xff);
793 saa711x_write(sd
, R_30_AUD_MAST_CLK_CYCLES_PER_FIELD
+1,
795 saa711x_write(sd
, R_30_AUD_MAST_CLK_CYCLES_PER_FIELD
+2,
796 (acpf
>> 16) & 0x03);
798 saa711x_write(sd
, R_34_AUD_MAST_CLK_NOMINAL_INC
, acni
& 0xff);
799 saa711x_write(sd
, R_34_AUD_MAST_CLK_NOMINAL_INC
+1, (acni
>> 8) & 0xff);
800 saa711x_write(sd
, R_34_AUD_MAST_CLK_NOMINAL_INC
+2, (acni
>> 16) & 0x3f);
801 state
->audclk_freq
= freq
;
805 static int saa711x_g_volatile_ctrl(struct v4l2_ctrl
*ctrl
)
807 struct v4l2_subdev
*sd
= to_sd(ctrl
);
808 struct saa711x_state
*state
= to_state(sd
);
811 case V4L2_CID_CHROMA_AGC
:
812 /* chroma gain cluster */
815 saa711x_read(sd
, R_0F_CHROMA_GAIN_CNTL
) & 0x7f;
821 static int saa711x_s_ctrl(struct v4l2_ctrl
*ctrl
)
823 struct v4l2_subdev
*sd
= to_sd(ctrl
);
824 struct saa711x_state
*state
= to_state(sd
);
827 case V4L2_CID_BRIGHTNESS
:
828 saa711x_write(sd
, R_0A_LUMA_BRIGHT_CNTL
, ctrl
->val
);
831 case V4L2_CID_CONTRAST
:
832 saa711x_write(sd
, R_0B_LUMA_CONTRAST_CNTL
, ctrl
->val
);
835 case V4L2_CID_SATURATION
:
836 saa711x_write(sd
, R_0C_CHROMA_SAT_CNTL
, ctrl
->val
);
840 saa711x_write(sd
, R_0D_CHROMA_HUE_CNTL
, ctrl
->val
);
843 case V4L2_CID_CHROMA_AGC
:
844 /* chroma gain cluster */
846 saa711x_write(sd
, R_0F_CHROMA_GAIN_CNTL
, state
->gain
->val
);
848 saa711x_write(sd
, R_0F_CHROMA_GAIN_CNTL
, state
->gain
->val
| 0x80);
858 static int saa711x_set_size(struct v4l2_subdev
*sd
, int width
, int height
)
860 struct saa711x_state
*state
= to_state(sd
);
864 int is_50hz
= state
->std
& V4L2_STD_625_50
;
865 int Vsrc
= is_50hz
? 576 : 480;
867 v4l2_dbg(1, debug
, sd
, "decoder set size to %ix%i\n", width
, height
);
869 /* FIXME need better bounds checking here */
870 if ((width
< 1) || (width
> 1440))
872 if ((height
< 1) || (height
> Vsrc
))
875 if (!saa711x_has_reg(state
->ident
, R_D0_B_HORIZ_PRESCALING
)) {
876 /* Decoder only supports 720 columns and 480 or 576 lines */
883 state
->width
= width
;
884 state
->height
= height
;
886 if (!saa711x_has_reg(state
->ident
, R_CC_B_HORIZ_OUTPUT_WINDOW_LENGTH
))
889 /* probably have a valid size, let's set it */
890 /* Set output width/height */
893 saa711x_write(sd
, R_CC_B_HORIZ_OUTPUT_WINDOW_LENGTH
,
894 (u8
) (width
& 0xff));
895 saa711x_write(sd
, R_CD_B_HORIZ_OUTPUT_WINDOW_LENGTH_MSB
,
896 (u8
) ((width
>> 8) & 0xff));
898 /* Vertical Scaling uses height/2 */
901 /* On 60Hz, it is using a higher Vertical Output Size */
903 res
+= (VRES_60HZ
- 480) >> 1;
906 saa711x_write(sd
, R_CE_B_VERT_OUTPUT_WINDOW_LENGTH
,
908 saa711x_write(sd
, R_CF_B_VERT_OUTPUT_WINDOW_LENGTH_MSB
,
909 (u8
) ((res
>> 8) & 0xff));
911 /* Scaling settings */
912 /* Hprescaler is floor(inres/outres) */
913 HPSC
= (int)(720 / width
);
914 /* 0 is not allowed (div. by zero) */
915 HPSC
= HPSC
? HPSC
: 1;
916 HFSC
= (int)((1024 * 720) / (HPSC
* width
));
917 /* FIXME hardcodes to "Task B"
918 * write H prescaler integer */
919 saa711x_write(sd
, R_D0_B_HORIZ_PRESCALING
,
922 v4l2_dbg(1, debug
, sd
, "Hpsc: 0x%05x, Hfsc: 0x%05x\n", HPSC
, HFSC
);
923 /* write H fine-scaling (luminance) */
924 saa711x_write(sd
, R_D8_B_HORIZ_LUMA_SCALING_INC
,
926 saa711x_write(sd
, R_D9_B_HORIZ_LUMA_SCALING_INC_MSB
,
927 (u8
) ((HFSC
>> 8) & 0xff));
928 /* write H fine-scaling (chrominance)
929 * must be lum/2, so i'll just bitshift :) */
930 saa711x_write(sd
, R_DC_B_HORIZ_CHROMA_SCALING
,
931 (u8
) ((HFSC
>> 1) & 0xff));
932 saa711x_write(sd
, R_DD_B_HORIZ_CHROMA_SCALING_MSB
,
933 (u8
) ((HFSC
>> 9) & 0xff));
935 VSCY
= (int)((1024 * Vsrc
) / height
);
936 v4l2_dbg(1, debug
, sd
, "Vsrc: %d, Vscy: 0x%05x\n", Vsrc
, VSCY
);
938 /* Correct Contrast and Luminance */
939 saa711x_write(sd
, R_D5_B_LUMA_CONTRAST_CNTL
,
940 (u8
) (64 * 1024 / VSCY
));
941 saa711x_write(sd
, R_D6_B_CHROMA_SATURATION_CNTL
,
942 (u8
) (64 * 1024 / VSCY
));
944 /* write V fine-scaling (luminance) */
945 saa711x_write(sd
, R_E0_B_VERT_LUMA_SCALING_INC
,
947 saa711x_write(sd
, R_E1_B_VERT_LUMA_SCALING_INC_MSB
,
948 (u8
) ((VSCY
>> 8) & 0xff));
949 /* write V fine-scaling (chrominance) */
950 saa711x_write(sd
, R_E2_B_VERT_CHROMA_SCALING_INC
,
952 saa711x_write(sd
, R_E3_B_VERT_CHROMA_SCALING_INC_MSB
,
953 (u8
) ((VSCY
>> 8) & 0xff));
955 saa711x_writeregs(sd
, saa7115_cfg_reset_scaler
);
957 /* Activates task "B" */
958 saa711x_write(sd
, R_80_GLOBAL_CNTL_1
,
959 saa711x_read(sd
, R_80_GLOBAL_CNTL_1
) | 0x20);
964 static void saa711x_set_v4lstd(struct v4l2_subdev
*sd
, v4l2_std_id std
)
966 struct saa711x_state
*state
= to_state(sd
);
968 /* Prevent unnecessary standard changes. During a standard
969 change the I-Port is temporarily disabled. Any devices
970 reading from that port can get confused.
971 Note that s_std is also used to switch from
972 radio to TV mode, so if a s_std is broadcast to
973 all I2C devices then you do not want to have an unwanted
975 if (std
== state
->std
)
980 // This works for NTSC-M, SECAM-L and the 50Hz PAL variants.
981 if (std
& V4L2_STD_525_60
) {
982 v4l2_dbg(1, debug
, sd
, "decoder set standard 60 Hz\n");
983 if (state
->ident
== GM7113C
) {
984 u8 reg
= saa711x_read(sd
, R_08_SYNC_CNTL
);
985 reg
&= ~(SAA7113_R_08_FSEL
| SAA7113_R_08_AUFD
);
986 reg
|= SAA7113_R_08_FSEL
;
987 saa711x_write(sd
, R_08_SYNC_CNTL
, reg
);
989 saa711x_writeregs(sd
, saa7115_cfg_60hz_video
);
991 saa711x_set_size(sd
, 720, 480);
993 v4l2_dbg(1, debug
, sd
, "decoder set standard 50 Hz\n");
994 if (state
->ident
== GM7113C
) {
995 u8 reg
= saa711x_read(sd
, R_08_SYNC_CNTL
);
996 reg
&= ~(SAA7113_R_08_FSEL
| SAA7113_R_08_AUFD
);
997 saa711x_write(sd
, R_08_SYNC_CNTL
, reg
);
999 saa711x_writeregs(sd
, saa7115_cfg_50hz_video
);
1001 saa711x_set_size(sd
, 720, 576);
1004 /* Register 0E - Bits D6-D4 on NO-AUTO mode
1005 (SAA7111 and SAA7113 doesn't have auto mode)
1006 50 Hz / 625 lines 60 Hz / 525 lines
1007 000 PAL BGDHI (4.43Mhz) NTSC M (3.58MHz)
1008 001 NTSC 4.43 (50 Hz) PAL 4.43 (60 Hz)
1009 010 Combination-PAL N (3.58MHz) NTSC 4.43 (60 Hz)
1010 011 NTSC N (3.58MHz) PAL M (3.58MHz)
1011 100 reserved NTSC-Japan (3.58MHz)
1013 if (state
->ident
<= SAA7113
||
1014 state
->ident
== GM7113C
) {
1015 u8 reg
= saa711x_read(sd
, R_0E_CHROMA_CNTL_1
) & 0x8f;
1017 if (std
== V4L2_STD_PAL_M
) {
1019 } else if (std
== V4L2_STD_PAL_Nc
) {
1021 } else if (std
== V4L2_STD_PAL_60
) {
1023 } else if (std
== V4L2_STD_NTSC_M_JP
) {
1025 } else if (std
& V4L2_STD_SECAM
) {
1028 saa711x_write(sd
, R_0E_CHROMA_CNTL_1
, reg
);
1030 /* restart task B if needed */
1031 int taskb
= saa711x_read(sd
, R_80_GLOBAL_CNTL_1
) & 0x10;
1033 if (taskb
&& state
->ident
== SAA7114
)
1034 saa711x_writeregs(sd
, saa7115_cfg_vbi_on
);
1036 /* switch audio mode too! */
1037 saa711x_s_clock_freq(sd
, state
->audclk_freq
);
1041 /* setup the sliced VBI lcr registers according to the sliced VBI format */
1042 static void saa711x_set_lcr(struct v4l2_subdev
*sd
, struct v4l2_sliced_vbi_format
*fmt
)
1044 struct saa711x_state
*state
= to_state(sd
);
1045 int is_50hz
= (state
->std
& V4L2_STD_625_50
);
1050 /* saa7113/7114/7118 VBI support are experimental */
1051 if (!saa711x_has_reg(state
->ident
, R_41_LCR_BASE
))
1055 /* SAA7113 and SAA7118 also should support VBI - Need testing */
1056 if (state
->ident
!= SAA7115
)
1060 for (i
= 0; i
<= 23; i
++)
1066 for (i
= 6; i
<= 23; i
++)
1069 for (i
= 10; i
<= 21; i
++)
1073 /* first clear lines that cannot be captured */
1075 for (i
= 0; i
<= 5; i
++)
1076 fmt
->service_lines
[0][i
] =
1077 fmt
->service_lines
[1][i
] = 0;
1080 for (i
= 0; i
<= 9; i
++)
1081 fmt
->service_lines
[0][i
] =
1082 fmt
->service_lines
[1][i
] = 0;
1083 for (i
= 22; i
<= 23; i
++)
1084 fmt
->service_lines
[0][i
] =
1085 fmt
->service_lines
[1][i
] = 0;
1088 /* Now set the lcr values according to the specified service */
1089 for (i
= 6; i
<= 23; i
++) {
1091 for (x
= 0; x
<= 1; x
++) {
1092 switch (fmt
->service_lines
[1-x
][i
]) {
1094 lcr
[i
] |= 0xf << (4 * x
);
1096 case V4L2_SLICED_TELETEXT_B
:
1097 lcr
[i
] |= 1 << (4 * x
);
1099 case V4L2_SLICED_CAPTION_525
:
1100 lcr
[i
] |= 4 << (4 * x
);
1102 case V4L2_SLICED_WSS_625
:
1103 lcr
[i
] |= 5 << (4 * x
);
1105 case V4L2_SLICED_VPS
:
1106 lcr
[i
] |= 7 << (4 * x
);
1113 /* write the lcr registers */
1114 for (i
= 2; i
<= 23; i
++) {
1115 saa711x_write(sd
, i
- 2 + R_41_LCR_BASE
, lcr
[i
]);
1118 /* enable/disable raw VBI capturing */
1119 saa711x_writeregs(sd
, fmt
== NULL
?
1120 saa7115_cfg_vbi_on
:
1121 saa7115_cfg_vbi_off
);
1124 static int saa711x_g_sliced_fmt(struct v4l2_subdev
*sd
, struct v4l2_sliced_vbi_format
*sliced
)
1126 static u16 lcr2vbi
[] = {
1127 0, V4L2_SLICED_TELETEXT_B
, 0, /* 1 */
1128 0, V4L2_SLICED_CAPTION_525
, /* 4 */
1129 V4L2_SLICED_WSS_625
, 0, /* 5 */
1130 V4L2_SLICED_VPS
, 0, 0, 0, 0, /* 7 */
1135 memset(sliced
->service_lines
, 0, sizeof(sliced
->service_lines
));
1136 sliced
->service_set
= 0;
1137 /* done if using raw VBI */
1138 if (saa711x_read(sd
, R_80_GLOBAL_CNTL_1
) & 0x10)
1140 for (i
= 2; i
<= 23; i
++) {
1141 u8 v
= saa711x_read(sd
, i
- 2 + R_41_LCR_BASE
);
1143 sliced
->service_lines
[0][i
] = lcr2vbi
[v
>> 4];
1144 sliced
->service_lines
[1][i
] = lcr2vbi
[v
& 0xf];
1145 sliced
->service_set
|=
1146 sliced
->service_lines
[0][i
] | sliced
->service_lines
[1][i
];
1151 static int saa711x_s_raw_fmt(struct v4l2_subdev
*sd
, struct v4l2_vbi_format
*fmt
)
1153 saa711x_set_lcr(sd
, NULL
);
1157 static int saa711x_s_sliced_fmt(struct v4l2_subdev
*sd
, struct v4l2_sliced_vbi_format
*fmt
)
1159 saa711x_set_lcr(sd
, fmt
);
1163 static int saa711x_set_fmt(struct v4l2_subdev
*sd
,
1164 struct v4l2_subdev_pad_config
*cfg
,
1165 struct v4l2_subdev_format
*format
)
1167 struct v4l2_mbus_framefmt
*fmt
= &format
->format
;
1169 if (format
->pad
|| fmt
->code
!= MEDIA_BUS_FMT_FIXED
)
1171 fmt
->field
= V4L2_FIELD_INTERLACED
;
1172 fmt
->colorspace
= V4L2_COLORSPACE_SMPTE170M
;
1173 if (format
->which
== V4L2_SUBDEV_FORMAT_TRY
)
1175 return saa711x_set_size(sd
, fmt
->width
, fmt
->height
);
1178 /* Decode the sliced VBI data stream as created by the saa7115.
1179 The format is described in the saa7115 datasheet in Tables 25 and 26
1181 The current implementation uses SAV/EAV codes and not the ancillary data
1182 headers. The vbi->p pointer points to the R_5E_SDID byte right after the SAV
1184 static int saa711x_decode_vbi_line(struct v4l2_subdev
*sd
, struct v4l2_decode_vbi_line
*vbi
)
1186 struct saa711x_state
*state
= to_state(sd
);
1187 static const char vbi_no_data_pattern
[] = {
1188 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0
1192 int id1
, id2
; /* the ID1 and ID2 bytes from the internal header */
1194 vbi
->type
= 0; /* mark result as a failure */
1197 /* Note: the field bit is inverted for 60 Hz video */
1198 if (state
->std
& V4L2_STD_525_60
)
1201 /* Skip internal header, p now points to the start of the payload */
1205 /* calculate field and line number of the VBI packet (1-23) */
1206 vbi
->is_second_field
= ((id1
& 0x40) != 0);
1207 vbi
->line
= (id1
& 0x3f) << 3;
1208 vbi
->line
|= (id2
& 0x70) >> 4;
1210 /* Obtain data type */
1213 /* If the VBI slicer does not detect any signal it will fill up
1214 the payload buffer with 0xa0 bytes. */
1215 if (!memcmp(p
, vbi_no_data_pattern
, sizeof(vbi_no_data_pattern
)))
1218 /* decode payloads */
1221 vbi
->type
= V4L2_SLICED_TELETEXT_B
;
1224 if (!saa711x_odd_parity(p
[0]) || !saa711x_odd_parity(p
[1]))
1226 vbi
->type
= V4L2_SLICED_CAPTION_525
;
1229 wss
= saa711x_decode_wss(p
);
1234 vbi
->type
= V4L2_SLICED_WSS_625
;
1237 if (saa711x_decode_vps(p
, p
) != 0)
1239 vbi
->type
= V4L2_SLICED_VPS
;
1247 /* ============ SAA7115 AUDIO settings (end) ============= */
1249 static int saa711x_g_tuner(struct v4l2_subdev
*sd
, struct v4l2_tuner
*vt
)
1251 struct saa711x_state
*state
= to_state(sd
);
1256 status
= saa711x_read(sd
, R_1F_STATUS_BYTE_2_VD_DEC
);
1258 v4l2_dbg(1, debug
, sd
, "status: 0x%02x\n", status
);
1259 vt
->signal
= ((status
& (1 << 6)) == 0) ? 0xffff : 0x0;
1263 static int saa711x_s_std(struct v4l2_subdev
*sd
, v4l2_std_id std
)
1265 struct saa711x_state
*state
= to_state(sd
);
1268 saa711x_set_v4lstd(sd
, std
);
1272 static int saa711x_s_radio(struct v4l2_subdev
*sd
)
1274 struct saa711x_state
*state
= to_state(sd
);
1280 static int saa711x_s_routing(struct v4l2_subdev
*sd
,
1281 u32 input
, u32 output
, u32 config
)
1283 struct saa711x_state
*state
= to_state(sd
);
1284 u8 mask
= (state
->ident
<= SAA7111A
) ? 0xf8 : 0xf0;
1286 v4l2_dbg(1, debug
, sd
, "decoder set input %d output %d\n",
1289 /* saa7111/3 does not have these inputs */
1290 if ((state
->ident
<= SAA7113
||
1291 state
->ident
== GM7113C
) &&
1292 (input
== SAA7115_COMPOSITE4
||
1293 input
== SAA7115_COMPOSITE5
)) {
1296 if (input
> SAA7115_SVIDEO3
)
1298 if (state
->input
== input
&& state
->output
== output
)
1300 v4l2_dbg(1, debug
, sd
, "now setting %s input %s output\n",
1301 (input
>= SAA7115_SVIDEO0
) ? "S-Video" : "Composite",
1302 (output
== SAA7115_IPORT_ON
) ? "iport on" : "iport off");
1303 state
->input
= input
;
1305 /* saa7111 has slightly different input numbering */
1306 if (state
->ident
<= SAA7111A
) {
1307 if (input
>= SAA7115_COMPOSITE4
)
1309 /* saa7111 specific */
1310 saa711x_write(sd
, R_10_CHROMA_CNTL_2
,
1311 (saa711x_read(sd
, R_10_CHROMA_CNTL_2
) & 0x3f) |
1312 ((output
& 0xc0) ^ 0x40));
1313 saa711x_write(sd
, R_13_RT_X_PORT_OUT_CNTL
,
1314 (saa711x_read(sd
, R_13_RT_X_PORT_OUT_CNTL
) & 0xf0) |
1315 ((output
& 2) ? 0x0a : 0));
1319 saa711x_write(sd
, R_02_INPUT_CNTL_1
,
1320 (saa711x_read(sd
, R_02_INPUT_CNTL_1
) & mask
) |
1323 /* bypass chrominance trap for S-Video modes */
1324 saa711x_write(sd
, R_09_LUMA_CNTL
,
1325 (saa711x_read(sd
, R_09_LUMA_CNTL
) & 0x7f) |
1326 (state
->input
>= SAA7115_SVIDEO0
? 0x80 : 0x0));
1328 state
->output
= output
;
1329 if (state
->ident
== SAA7114
||
1330 state
->ident
== SAA7115
) {
1331 saa711x_write(sd
, R_83_X_PORT_I_O_ENA_AND_OUT_CLK
,
1332 (saa711x_read(sd
, R_83_X_PORT_I_O_ENA_AND_OUT_CLK
) & 0xfe) |
1333 (state
->output
& 0x01));
1335 if (state
->ident
> SAA7111A
) {
1336 if (config
& SAA7115_IDQ_IS_DEFAULT
)
1337 saa711x_write(sd
, R_85_I_PORT_SIGNAL_POLAR
, 0x20);
1339 saa711x_write(sd
, R_85_I_PORT_SIGNAL_POLAR
, 0x21);
1344 static int saa711x_s_gpio(struct v4l2_subdev
*sd
, u32 val
)
1346 struct saa711x_state
*state
= to_state(sd
);
1348 if (state
->ident
> SAA7111A
)
1350 saa711x_write(sd
, 0x11, (saa711x_read(sd
, 0x11) & 0x7f) |
1355 static int saa711x_s_stream(struct v4l2_subdev
*sd
, int enable
)
1357 struct saa711x_state
*state
= to_state(sd
);
1359 v4l2_dbg(1, debug
, sd
, "%s output\n",
1360 enable
? "enable" : "disable");
1362 if (state
->enable
== enable
)
1364 state
->enable
= enable
;
1365 if (!saa711x_has_reg(state
->ident
, R_87_I_PORT_I_O_ENA_OUT_CLK_AND_GATED
))
1367 saa711x_write(sd
, R_87_I_PORT_I_O_ENA_OUT_CLK_AND_GATED
, state
->enable
);
1371 static int saa711x_s_crystal_freq(struct v4l2_subdev
*sd
, u32 freq
, u32 flags
)
1373 struct saa711x_state
*state
= to_state(sd
);
1375 if (freq
!= SAA7115_FREQ_32_11_MHZ
&& freq
!= SAA7115_FREQ_24_576_MHZ
)
1377 state
->crystal_freq
= freq
;
1378 state
->double_asclk
= flags
& SAA7115_FREQ_FL_DOUBLE_ASCLK
;
1379 state
->cgcdiv
= (flags
& SAA7115_FREQ_FL_CGCDIV
) ? 3 : 4;
1380 state
->ucgc
= flags
& SAA7115_FREQ_FL_UCGC
;
1381 state
->apll
= flags
& SAA7115_FREQ_FL_APLL
;
1382 saa711x_s_clock_freq(sd
, state
->audclk_freq
);
1386 static int saa711x_reset(struct v4l2_subdev
*sd
, u32 val
)
1388 v4l2_dbg(1, debug
, sd
, "decoder RESET\n");
1389 saa711x_writeregs(sd
, saa7115_cfg_reset_scaler
);
1393 static int saa711x_g_vbi_data(struct v4l2_subdev
*sd
, struct v4l2_sliced_vbi_data
*data
)
1395 /* Note: the internal field ID is inverted for NTSC,
1396 so data->field 0 maps to the saa7115 even field,
1397 whereas for PAL it maps to the saa7115 odd field. */
1399 case V4L2_SLICED_WSS_625
:
1400 if (saa711x_read(sd
, 0x6b) & 0xc0)
1402 data
->data
[0] = saa711x_read(sd
, 0x6c);
1403 data
->data
[1] = saa711x_read(sd
, 0x6d);
1405 case V4L2_SLICED_CAPTION_525
:
1406 if (data
->field
== 0) {
1408 if (saa711x_read(sd
, 0x66) & 0x30)
1410 data
->data
[0] = saa711x_read(sd
, 0x69);
1411 data
->data
[1] = saa711x_read(sd
, 0x6a);
1415 if (saa711x_read(sd
, 0x66) & 0xc0)
1417 data
->data
[0] = saa711x_read(sd
, 0x67);
1418 data
->data
[1] = saa711x_read(sd
, 0x68);
1425 static int saa711x_querystd(struct v4l2_subdev
*sd
, v4l2_std_id
*std
)
1427 struct saa711x_state
*state
= to_state(sd
);
1431 * The V4L2 core already initializes std with all supported
1432 * Standards. All driver needs to do is to mask it, to remove
1433 * standards that don't apply from the mask
1436 reg1f
= saa711x_read(sd
, R_1F_STATUS_BYTE_2_VD_DEC
);
1438 if (state
->ident
== SAA7115
) {
1439 reg1e
= saa711x_read(sd
, R_1E_STATUS_BYTE_1_VD_DEC
);
1441 v4l2_dbg(1, debug
, sd
, "Status byte 1 (0x1e)=0x%02x\n", reg1e
);
1443 switch (reg1e
& 0x03) {
1445 *std
&= V4L2_STD_NTSC
;
1449 * V4L2_STD_PAL just cover the european PAL standards.
1450 * This is wrong, as the device could also be using an
1451 * other PAL standard.
1453 *std
&= V4L2_STD_PAL
| V4L2_STD_PAL_N
| V4L2_STD_PAL_Nc
|
1454 V4L2_STD_PAL_M
| V4L2_STD_PAL_60
;
1457 *std
&= V4L2_STD_SECAM
;
1460 *std
= V4L2_STD_UNKNOWN
;
1461 /* Can't detect anything */
1466 v4l2_dbg(1, debug
, sd
, "Status byte 2 (0x1f)=0x%02x\n", reg1f
);
1468 /* horizontal/vertical not locked */
1470 *std
= V4L2_STD_UNKNOWN
;
1475 *std
&= V4L2_STD_525_60
;
1477 *std
&= V4L2_STD_625_50
;
1480 v4l2_dbg(1, debug
, sd
, "detected std mask = %08Lx\n", *std
);
1485 static int saa711x_g_input_status(struct v4l2_subdev
*sd
, u32
*status
)
1487 struct saa711x_state
*state
= to_state(sd
);
1491 *status
= V4L2_IN_ST_NO_SIGNAL
;
1492 if (state
->ident
== SAA7115
)
1493 reg1e
= saa711x_read(sd
, R_1E_STATUS_BYTE_1_VD_DEC
);
1494 reg1f
= saa711x_read(sd
, R_1F_STATUS_BYTE_2_VD_DEC
);
1495 if ((reg1f
& 0xc1) == 0x81 && (reg1e
& 0xc0) == 0x80)
1500 #ifdef CONFIG_VIDEO_ADV_DEBUG
1501 static int saa711x_g_register(struct v4l2_subdev
*sd
, struct v4l2_dbg_register
*reg
)
1503 reg
->val
= saa711x_read(sd
, reg
->reg
& 0xff);
1508 static int saa711x_s_register(struct v4l2_subdev
*sd
, const struct v4l2_dbg_register
*reg
)
1510 saa711x_write(sd
, reg
->reg
& 0xff, reg
->val
& 0xff);
1515 static int saa711x_log_status(struct v4l2_subdev
*sd
)
1517 struct saa711x_state
*state
= to_state(sd
);
1522 v4l2_info(sd
, "Audio frequency: %d Hz\n", state
->audclk_freq
);
1523 if (state
->ident
!= SAA7115
) {
1524 /* status for the saa7114 */
1525 reg1f
= saa711x_read(sd
, R_1F_STATUS_BYTE_2_VD_DEC
);
1526 signalOk
= (reg1f
& 0xc1) == 0x81;
1527 v4l2_info(sd
, "Video signal: %s\n", signalOk
? "ok" : "bad");
1528 v4l2_info(sd
, "Frequency: %s\n", (reg1f
& 0x20) ? "60 Hz" : "50 Hz");
1532 /* status for the saa7115 */
1533 reg1e
= saa711x_read(sd
, R_1E_STATUS_BYTE_1_VD_DEC
);
1534 reg1f
= saa711x_read(sd
, R_1F_STATUS_BYTE_2_VD_DEC
);
1536 signalOk
= (reg1f
& 0xc1) == 0x81 && (reg1e
& 0xc0) == 0x80;
1537 vcr
= !(reg1f
& 0x10);
1539 if (state
->input
>= 6)
1540 v4l2_info(sd
, "Input: S-Video %d\n", state
->input
- 6);
1542 v4l2_info(sd
, "Input: Composite %d\n", state
->input
);
1543 v4l2_info(sd
, "Video signal: %s\n", signalOk
? (vcr
? "VCR" : "broadcast/DVD") : "bad");
1544 v4l2_info(sd
, "Frequency: %s\n", (reg1f
& 0x20) ? "60 Hz" : "50 Hz");
1546 switch (reg1e
& 0x03) {
1548 v4l2_info(sd
, "Detected format: NTSC\n");
1551 v4l2_info(sd
, "Detected format: PAL\n");
1554 v4l2_info(sd
, "Detected format: SECAM\n");
1557 v4l2_info(sd
, "Detected format: BW/No color\n");
1560 v4l2_info(sd
, "Width, Height: %d, %d\n", state
->width
, state
->height
);
1561 v4l2_ctrl_handler_log_status(&state
->hdl
, sd
->name
);
1565 /* ----------------------------------------------------------------------- */
1567 static const struct v4l2_ctrl_ops saa711x_ctrl_ops
= {
1568 .s_ctrl
= saa711x_s_ctrl
,
1569 .g_volatile_ctrl
= saa711x_g_volatile_ctrl
,
1572 static const struct v4l2_subdev_core_ops saa711x_core_ops
= {
1573 .log_status
= saa711x_log_status
,
1574 .reset
= saa711x_reset
,
1575 .s_gpio
= saa711x_s_gpio
,
1576 #ifdef CONFIG_VIDEO_ADV_DEBUG
1577 .g_register
= saa711x_g_register
,
1578 .s_register
= saa711x_s_register
,
1582 static const struct v4l2_subdev_tuner_ops saa711x_tuner_ops
= {
1583 .s_radio
= saa711x_s_radio
,
1584 .g_tuner
= saa711x_g_tuner
,
1587 static const struct v4l2_subdev_audio_ops saa711x_audio_ops
= {
1588 .s_clock_freq
= saa711x_s_clock_freq
,
1591 static const struct v4l2_subdev_video_ops saa711x_video_ops
= {
1592 .s_std
= saa711x_s_std
,
1593 .s_routing
= saa711x_s_routing
,
1594 .s_crystal_freq
= saa711x_s_crystal_freq
,
1595 .s_stream
= saa711x_s_stream
,
1596 .querystd
= saa711x_querystd
,
1597 .g_input_status
= saa711x_g_input_status
,
1600 static const struct v4l2_subdev_vbi_ops saa711x_vbi_ops
= {
1601 .g_vbi_data
= saa711x_g_vbi_data
,
1602 .decode_vbi_line
= saa711x_decode_vbi_line
,
1603 .g_sliced_fmt
= saa711x_g_sliced_fmt
,
1604 .s_sliced_fmt
= saa711x_s_sliced_fmt
,
1605 .s_raw_fmt
= saa711x_s_raw_fmt
,
1608 static const struct v4l2_subdev_pad_ops saa711x_pad_ops
= {
1609 .set_fmt
= saa711x_set_fmt
,
1612 static const struct v4l2_subdev_ops saa711x_ops
= {
1613 .core
= &saa711x_core_ops
,
1614 .tuner
= &saa711x_tuner_ops
,
1615 .audio
= &saa711x_audio_ops
,
1616 .video
= &saa711x_video_ops
,
1617 .vbi
= &saa711x_vbi_ops
,
1618 .pad
= &saa711x_pad_ops
,
1621 #define CHIP_VER_SIZE 16
1623 /* ----------------------------------------------------------------------- */
1625 static void saa711x_write_platform_data(struct saa711x_state
*state
,
1626 struct saa7115_platform_data
*data
)
1628 struct v4l2_subdev
*sd
= &state
->sd
;
1631 if (state
->ident
!= GM7113C
&&
1632 state
->ident
!= SAA7113
)
1635 if (data
->saa7113_r08_htc
) {
1636 work
= saa711x_read(sd
, R_08_SYNC_CNTL
);
1637 work
&= ~SAA7113_R_08_HTC_MASK
;
1638 work
|= ((*data
->saa7113_r08_htc
) << SAA7113_R_08_HTC_OFFSET
);
1639 saa711x_write(sd
, R_08_SYNC_CNTL
, work
);
1642 if (data
->saa7113_r10_vrln
) {
1643 work
= saa711x_read(sd
, R_10_CHROMA_CNTL_2
);
1644 work
&= ~SAA7113_R_10_VRLN_MASK
;
1645 if (*data
->saa7113_r10_vrln
)
1646 work
|= (1 << SAA7113_R_10_VRLN_OFFSET
);
1647 saa711x_write(sd
, R_10_CHROMA_CNTL_2
, work
);
1650 if (data
->saa7113_r10_ofts
) {
1651 work
= saa711x_read(sd
, R_10_CHROMA_CNTL_2
);
1652 work
&= ~SAA7113_R_10_OFTS_MASK
;
1653 work
|= (*data
->saa7113_r10_ofts
<< SAA7113_R_10_OFTS_OFFSET
);
1654 saa711x_write(sd
, R_10_CHROMA_CNTL_2
, work
);
1657 if (data
->saa7113_r12_rts0
) {
1658 work
= saa711x_read(sd
, R_12_RT_SIGNAL_CNTL
);
1659 work
&= ~SAA7113_R_12_RTS0_MASK
;
1660 work
|= (*data
->saa7113_r12_rts0
<< SAA7113_R_12_RTS0_OFFSET
);
1662 /* According to the datasheet,
1663 * SAA7113_RTS_DOT_IN should only be used on RTS1 */
1664 WARN_ON(*data
->saa7113_r12_rts0
== SAA7113_RTS_DOT_IN
);
1665 saa711x_write(sd
, R_12_RT_SIGNAL_CNTL
, work
);
1668 if (data
->saa7113_r12_rts1
) {
1669 work
= saa711x_read(sd
, R_12_RT_SIGNAL_CNTL
);
1670 work
&= ~SAA7113_R_12_RTS1_MASK
;
1671 work
|= (*data
->saa7113_r12_rts1
<< SAA7113_R_12_RTS1_OFFSET
);
1672 saa711x_write(sd
, R_12_RT_SIGNAL_CNTL
, work
);
1675 if (data
->saa7113_r13_adlsb
) {
1676 work
= saa711x_read(sd
, R_13_RT_X_PORT_OUT_CNTL
);
1677 work
&= ~SAA7113_R_13_ADLSB_MASK
;
1678 if (*data
->saa7113_r13_adlsb
)
1679 work
|= (1 << SAA7113_R_13_ADLSB_OFFSET
);
1680 saa711x_write(sd
, R_13_RT_X_PORT_OUT_CNTL
, work
);
1685 * saa711x_detect_chip - Detects the saa711x (or clone) variant
1686 * @client: I2C client structure.
1687 * @id: I2C device ID structure.
1688 * @name: Name of the device to be filled.
1690 * Detects the Philips/NXP saa711x chip, or some clone of it.
1691 * if 'id' is NULL or id->driver_data is equal to 1, it auto-probes
1693 * If the tuner is not found, it returns -ENODEV.
1694 * If auto-detection is disabled and the tuner doesn't match what it was
1695 * required, it returns -EINVAL and fills 'name'.
1696 * If the chip is found, it returns the chip ID and fills 'name'.
1698 static int saa711x_detect_chip(struct i2c_client
*client
,
1699 const struct i2c_device_id
*id
,
1702 char chip_ver
[CHIP_VER_SIZE
];
1707 autodetect
= !id
|| id
->driver_data
== 1;
1709 /* Read the chip version register */
1710 for (i
= 0; i
< CHIP_VER_SIZE
; i
++) {
1711 i2c_smbus_write_byte_data(client
, 0, i
);
1712 chip_ver
[i
] = i2c_smbus_read_byte_data(client
, 0);
1713 name
[i
] = (chip_ver
[i
] & 0x0f) + '0';
1715 name
[i
] += 'a' - '9' - 1;
1719 /* Check if it is a Philips/NXP chip */
1720 if (!memcmp(name
+ 1, "f711", 4)) {
1722 snprintf(name
, CHIP_VER_SIZE
, "saa711%c", chip_id
);
1724 if (!autodetect
&& strcmp(name
, id
->name
))
1729 if (chip_ver
[0] & 0xf0) {
1730 snprintf(name
, CHIP_VER_SIZE
, "saa711%ca", chip_id
);
1731 v4l_info(client
, "saa7111a variant found\n");
1745 "WARNING: Philips/NXP chip unknown - Falling back to saa7111\n");
1750 /* Check if it is a gm7113c */
1751 if (!memcmp(name
, "0000", 4)) {
1753 for (i
= 0; i
< 4; i
++) {
1754 chip_id
= chip_id
<< 1;
1755 chip_id
|= (chip_ver
[i
] & 0x80) ? 1 : 0;
1759 * Note: From the datasheet, only versions 1 and 2
1760 * exists. However, tests on a device labeled as:
1761 * "GM7113C 1145" returned "10" on all 16 chip
1762 * version (reg 0x00) reads. So, we need to also
1763 * accept at least verion 0. For now, let's just
1764 * assume that a device that returns "0000" for
1765 * the lower nibble is a gm7113c.
1768 strlcpy(name
, "gm7113c", CHIP_VER_SIZE
);
1770 if (!autodetect
&& strcmp(name
, id
->name
))
1773 v4l_dbg(1, debug
, client
,
1774 "It seems to be a %s chip (%*ph) @ 0x%x.\n",
1775 name
, 16, chip_ver
, client
->addr
<< 1);
1780 /* Check if it is a CJC7113 */
1781 if (!memcmp(name
, "1111111111111111", CHIP_VER_SIZE
)) {
1782 strlcpy(name
, "cjc7113", CHIP_VER_SIZE
);
1784 if (!autodetect
&& strcmp(name
, id
->name
))
1787 v4l_dbg(1, debug
, client
,
1788 "It seems to be a %s chip (%*ph) @ 0x%x.\n",
1789 name
, 16, chip_ver
, client
->addr
<< 1);
1791 /* CJC7113 seems to be SAA7113-compatible */
1795 /* Chip was not discovered. Return its ID and don't bind */
1796 v4l_dbg(1, debug
, client
, "chip %*ph @ 0x%x is unknown.\n",
1797 16, chip_ver
, client
->addr
<< 1);
1801 static int saa711x_probe(struct i2c_client
*client
,
1802 const struct i2c_device_id
*id
)
1804 struct saa711x_state
*state
;
1805 struct v4l2_subdev
*sd
;
1806 struct v4l2_ctrl_handler
*hdl
;
1807 struct saa7115_platform_data
*pdata
;
1809 char name
[CHIP_VER_SIZE
+ 1];
1810 #if defined(CONFIG_MEDIA_CONTROLLER)
1814 /* Check if the adapter supports the needed features */
1815 if (!i2c_check_functionality(client
->adapter
, I2C_FUNC_SMBUS_BYTE_DATA
))
1818 ident
= saa711x_detect_chip(client
, id
, name
);
1819 if (ident
== -EINVAL
) {
1820 /* Chip exists, but doesn't match */
1821 v4l_warn(client
, "found %s while %s was expected\n",
1828 strlcpy(client
->name
, name
, sizeof(client
->name
));
1830 state
= devm_kzalloc(&client
->dev
, sizeof(*state
), GFP_KERNEL
);
1834 v4l2_i2c_subdev_init(sd
, client
, &saa711x_ops
);
1836 #if defined(CONFIG_MEDIA_CONTROLLER)
1837 state
->pads
[DEMOD_PAD_IF_INPUT
].flags
= MEDIA_PAD_FL_SINK
;
1838 state
->pads
[DEMOD_PAD_VID_OUT
].flags
= MEDIA_PAD_FL_SOURCE
;
1839 state
->pads
[DEMOD_PAD_VBI_OUT
].flags
= MEDIA_PAD_FL_SOURCE
;
1841 sd
->entity
.function
= MEDIA_ENT_F_ATV_DECODER
;
1843 ret
= media_entity_pads_init(&sd
->entity
, DEMOD_NUM_PADS
, state
->pads
);
1848 v4l_info(client
, "%s found @ 0x%x (%s)\n", name
,
1849 client
->addr
<< 1, client
->adapter
->name
);
1851 v4l2_ctrl_handler_init(hdl
, 6);
1852 /* add in ascending ID order */
1853 v4l2_ctrl_new_std(hdl
, &saa711x_ctrl_ops
,
1854 V4L2_CID_BRIGHTNESS
, 0, 255, 1, 128);
1855 v4l2_ctrl_new_std(hdl
, &saa711x_ctrl_ops
,
1856 V4L2_CID_CONTRAST
, 0, 127, 1, 64);
1857 v4l2_ctrl_new_std(hdl
, &saa711x_ctrl_ops
,
1858 V4L2_CID_SATURATION
, 0, 127, 1, 64);
1859 v4l2_ctrl_new_std(hdl
, &saa711x_ctrl_ops
,
1860 V4L2_CID_HUE
, -128, 127, 1, 0);
1861 state
->agc
= v4l2_ctrl_new_std(hdl
, &saa711x_ctrl_ops
,
1862 V4L2_CID_CHROMA_AGC
, 0, 1, 1, 1);
1863 state
->gain
= v4l2_ctrl_new_std(hdl
, &saa711x_ctrl_ops
,
1864 V4L2_CID_CHROMA_GAIN
, 0, 127, 1, 40);
1865 sd
->ctrl_handler
= hdl
;
1867 int err
= hdl
->error
;
1869 v4l2_ctrl_handler_free(hdl
);
1872 v4l2_ctrl_auto_cluster(2, &state
->agc
, 0, true);
1875 state
->output
= SAA7115_IPORT_ON
;
1878 state
->ident
= ident
;
1880 state
->audclk_freq
= 48000;
1882 v4l2_dbg(1, debug
, sd
, "writing init values\n");
1884 /* init to 60hz/48khz */
1885 state
->crystal_freq
= SAA7115_FREQ_24_576_MHZ
;
1886 pdata
= client
->dev
.platform_data
;
1887 switch (state
->ident
) {
1890 saa711x_writeregs(sd
, saa7111_init
);
1893 saa711x_writeregs(sd
, gm7113c_init
);
1896 if (pdata
&& pdata
->saa7113_force_gm7113c_init
)
1897 saa711x_writeregs(sd
, gm7113c_init
);
1899 saa711x_writeregs(sd
, saa7113_init
);
1902 state
->crystal_freq
= SAA7115_FREQ_32_11_MHZ
;
1903 saa711x_writeregs(sd
, saa7115_init_auto_input
);
1905 if (state
->ident
> SAA7111A
&& state
->ident
!= GM7113C
)
1906 saa711x_writeregs(sd
, saa7115_init_misc
);
1909 saa711x_write_platform_data(state
, pdata
);
1911 saa711x_set_v4lstd(sd
, V4L2_STD_NTSC
);
1912 v4l2_ctrl_handler_setup(hdl
);
1914 v4l2_dbg(1, debug
, sd
, "status: (1E) 0x%02x, (1F) 0x%02x\n",
1915 saa711x_read(sd
, R_1E_STATUS_BYTE_1_VD_DEC
),
1916 saa711x_read(sd
, R_1F_STATUS_BYTE_2_VD_DEC
));
1920 /* ----------------------------------------------------------------------- */
1922 static int saa711x_remove(struct i2c_client
*client
)
1924 struct v4l2_subdev
*sd
= i2c_get_clientdata(client
);
1926 v4l2_device_unregister_subdev(sd
);
1927 v4l2_ctrl_handler_free(sd
->ctrl_handler
);
1931 static const struct i2c_device_id saa711x_id
[] = {
1932 { "saa7115_auto", 1 }, /* autodetect */
1941 MODULE_DEVICE_TABLE(i2c
, saa711x_id
);
1943 static struct i2c_driver saa711x_driver
= {
1947 .probe
= saa711x_probe
,
1948 .remove
= saa711x_remove
,
1949 .id_table
= saa711x_id
,
1952 module_i2c_driver(saa711x_driver
);