1 /* saa711x - Philips SAA711x video decoder driver
2 * This driver can work with saa7111, saa7111a, saa7113, saa7114,
5 * Based on saa7114 driver by Maxim Yevtyushkin, which is based on
6 * the saa7111 driver by Dave Perks.
8 * Copyright (C) 1998 Dave Perks <dperks@ibm.net>
9 * Copyright (C) 2002 Maxim Yevtyushkin <max@linuxmedialabs.com>
11 * Slight changes for video timing and attachment output by
12 * Wolfgang Scherr <scherr@net4you.net>
14 * Moved over to the linux >= 2.4.x i2c protocol (1/1/2003)
15 * by Ronald Bultje <rbultje@ronald.bitfreak.net>
17 * Added saa7115 support by Kevin Thayer <nufan_wfk at yahoo.com>
20 * VBI support (2004) and cleanups (2005) by Hans Verkuil <hverkuil@xs4all.nl>
22 * Copyright (c) 2005-2006 Mauro Carvalho Chehab <mchehab@infradead.org>
23 * SAA7111, SAA7113 and SAA7118 support
25 * This program is free software; you can redistribute it and/or
26 * modify it under the terms of the GNU General Public License
27 * as published by the Free Software Foundation; either version 2
28 * of the License, or (at your option) any later version.
30 * This program is distributed in the hope that it will be useful,
31 * but WITHOUT ANY WARRANTY; without even the implied warranty of
32 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
33 * GNU General Public License for more details.
35 * You should have received a copy of the GNU General Public License
36 * along with this program; if not, write to the Free Software
37 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
40 #include "saa711x_regs.h"
42 #include <linux/kernel.h>
43 #include <linux/module.h>
44 #include <linux/slab.h>
45 #include <linux/i2c.h>
46 #include <linux/videodev2.h>
47 #include <media/v4l2-device.h>
48 #include <media/v4l2-ctrls.h>
49 #include <media/saa7115.h>
50 #include <asm/div64.h>
52 #define VRES_60HZ (480+16)
54 MODULE_DESCRIPTION("Philips SAA7111/SAA7113/SAA7114/SAA7115/SAA7118 video decoder driver");
55 MODULE_AUTHOR( "Maxim Yevtyushkin, Kevin Thayer, Chris Kennedy, "
56 "Hans Verkuil, Mauro Carvalho Chehab");
57 MODULE_LICENSE("GPL");
60 module_param(debug
, bool, 0644);
62 MODULE_PARM_DESC(debug
, "Debug level (0-1)");
75 struct saa711x_state
{
76 struct v4l2_subdev sd
;
77 struct v4l2_ctrl_handler hdl
;
80 /* chroma gain control cluster */
81 struct v4l2_ctrl
*agc
;
82 struct v4l2_ctrl
*gain
;
92 enum saa711x_model ident
;
101 static inline struct saa711x_state
*to_state(struct v4l2_subdev
*sd
)
103 return container_of(sd
, struct saa711x_state
, sd
);
106 static inline struct v4l2_subdev
*to_sd(struct v4l2_ctrl
*ctrl
)
108 return &container_of(ctrl
->handler
, struct saa711x_state
, hdl
)->sd
;
111 /* ----------------------------------------------------------------------- */
113 static inline int saa711x_write(struct v4l2_subdev
*sd
, u8 reg
, u8 value
)
115 struct i2c_client
*client
= v4l2_get_subdevdata(sd
);
117 return i2c_smbus_write_byte_data(client
, reg
, value
);
120 /* Sanity routine to check if a register is present */
121 static int saa711x_has_reg(const int id
, const u8 reg
)
124 return reg
< 0x20 && reg
!= 0x01 && reg
!= 0x0f &&
125 (reg
< 0x13 || reg
> 0x19) && reg
!= 0x1d && reg
!= 0x1e;
127 return reg
< 0x20 && reg
!= 0x01 && reg
!= 0x0f &&
128 reg
!= 0x14 && reg
!= 0x18 && reg
!= 0x19 &&
129 reg
!= 0x1d && reg
!= 0x1e;
131 /* common for saa7113/4/5/8 */
132 if (unlikely((reg
>= 0x3b && reg
<= 0x3f) || reg
== 0x5c || reg
== 0x5f ||
133 reg
== 0xa3 || reg
== 0xa7 || reg
== 0xab || reg
== 0xaf || (reg
>= 0xb5 && reg
<= 0xb7) ||
134 reg
== 0xd3 || reg
== 0xd7 || reg
== 0xdb || reg
== 0xdf || (reg
>= 0xe5 && reg
<= 0xe7) ||
135 reg
== 0x82 || (reg
>= 0x89 && reg
<= 0x8e)))
140 return reg
!= 0x14 && (reg
< 0x18 || reg
> 0x1e) && reg
< 0x20;
142 return reg
!= 0x14 && (reg
< 0x18 || reg
> 0x1e) && (reg
< 0x20 || reg
> 0x3f) &&
143 reg
!= 0x5d && reg
< 0x63;
145 return (reg
< 0x1a || reg
> 0x1e) && (reg
< 0x20 || reg
> 0x2f) &&
146 (reg
< 0x63 || reg
> 0x7f) && reg
!= 0x33 && reg
!= 0x37 &&
147 reg
!= 0x81 && reg
< 0xf0;
149 return (reg
< 0x20 || reg
> 0x2f) && reg
!= 0x65 && (reg
< 0xfc || reg
> 0xfe);
151 return (reg
< 0x1a || reg
> 0x1d) && (reg
< 0x20 || reg
> 0x22) &&
152 (reg
< 0x26 || reg
> 0x28) && reg
!= 0x33 && reg
!= 0x37 &&
153 (reg
< 0x63 || reg
> 0x7f) && reg
!= 0x81 && reg
< 0xf0;
158 static int saa711x_writeregs(struct v4l2_subdev
*sd
, const unsigned char *regs
)
160 struct saa711x_state
*state
= to_state(sd
);
161 unsigned char reg
, data
;
163 while (*regs
!= 0x00) {
167 /* According with datasheets, reserved regs should be
168 filled with 0 - seems better not to touch on they */
169 if (saa711x_has_reg(state
->ident
, reg
)) {
170 if (saa711x_write(sd
, reg
, data
) < 0)
173 v4l2_dbg(1, debug
, sd
, "tried to access reserved reg 0x%02x\n", reg
);
179 static inline int saa711x_read(struct v4l2_subdev
*sd
, u8 reg
)
181 struct i2c_client
*client
= v4l2_get_subdevdata(sd
);
183 return i2c_smbus_read_byte_data(client
, reg
);
186 /* ----------------------------------------------------------------------- */
188 /* SAA7111 initialization table */
189 static const unsigned char saa7111_init
[] = {
190 R_01_INC_DELAY
, 0x00, /* reserved */
193 R_02_INPUT_CNTL_1
, 0xd0, /* FUSE=3, GUDL=2, MODE=0 */
194 R_03_INPUT_CNTL_2
, 0x23, /* HLNRS=0, VBSL=1, WPOFF=0, HOLDG=0,
195 * GAFIX=0, GAI1=256, GAI2=256 */
196 R_04_INPUT_CNTL_3
, 0x00, /* GAI1=256 */
197 R_05_INPUT_CNTL_4
, 0x00, /* GAI2=256 */
200 R_06_H_SYNC_START
, 0xf3, /* HSB at 13(50Hz) / 17(60Hz)
201 * pixels after end of last line */
202 R_07_H_SYNC_STOP
, 0xe8, /* HSS seems to be needed to
203 * work with NTSC, too */
204 R_08_SYNC_CNTL
, 0xc8, /* AUFD=1, FSEL=1, EXFIL=0,
205 * VTRC=1, HPLL=0, VNOI=0 */
206 R_09_LUMA_CNTL
, 0x01, /* BYPS=0, PREF=0, BPSS=0,
207 * VBLB=0, UPTCV=0, APER=1 */
208 R_0A_LUMA_BRIGHT_CNTL
, 0x80,
209 R_0B_LUMA_CONTRAST_CNTL
, 0x47, /* 0b - CONT=1.109 */
210 R_0C_CHROMA_SAT_CNTL
, 0x40,
211 R_0D_CHROMA_HUE_CNTL
, 0x00,
212 R_0E_CHROMA_CNTL_1
, 0x01, /* 0e - CDTO=0, CSTD=0, DCCF=0,
214 R_0F_CHROMA_GAIN_CNTL
, 0x00, /* reserved */
215 R_10_CHROMA_CNTL_2
, 0x48, /* 10 - OFTS=1, HDEL=0, VRLN=1, YDEL=0 */
216 R_11_MODE_DELAY_CNTL
, 0x1c, /* 11 - GPSW=0, CM99=0, FECO=0, COMPO=1,
217 * OEYC=1, OEHV=1, VIPB=0, COLO=0 */
218 R_12_RT_SIGNAL_CNTL
, 0x00, /* 12 - output control 2 */
219 R_13_RT_X_PORT_OUT_CNTL
, 0x00, /* 13 - output control 3 */
220 R_14_ANAL_ADC_COMPAT_CNTL
, 0x00,
221 R_15_VGATE_START_FID_CHG
, 0x00,
222 R_16_VGATE_STOP
, 0x00,
223 R_17_MISC_VGATE_CONF_AND_MSB
, 0x00,
228 /* SAA7113/GM7113C init codes
229 * It's important that R_14... R_17 == 0x00
230 * for the gm7113c chip to deliver stable video
232 static const unsigned char saa7113_init
[] = {
233 R_01_INC_DELAY
, 0x08,
234 R_02_INPUT_CNTL_1
, 0xc2,
235 R_03_INPUT_CNTL_2
, 0x30,
236 R_04_INPUT_CNTL_3
, 0x00,
237 R_05_INPUT_CNTL_4
, 0x00,
238 R_06_H_SYNC_START
, 0x89,
239 R_07_H_SYNC_STOP
, 0x0d,
240 R_08_SYNC_CNTL
, 0x88,
241 R_09_LUMA_CNTL
, 0x01,
242 R_0A_LUMA_BRIGHT_CNTL
, 0x80,
243 R_0B_LUMA_CONTRAST_CNTL
, 0x47,
244 R_0C_CHROMA_SAT_CNTL
, 0x40,
245 R_0D_CHROMA_HUE_CNTL
, 0x00,
246 R_0E_CHROMA_CNTL_1
, 0x01,
247 R_0F_CHROMA_GAIN_CNTL
, 0x2a,
248 R_10_CHROMA_CNTL_2
, 0x08,
249 R_11_MODE_DELAY_CNTL
, 0x0c,
250 R_12_RT_SIGNAL_CNTL
, 0x07,
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,
260 /* If a value differs from the Hauppauge driver values, then the comment starts with
261 'was 0xXX' to denote the Hauppauge value. Otherwise the value is identical to what the
262 Hauppauge driver sets. */
264 /* SAA7114 and SAA7115 initialization table */
265 static const unsigned char saa7115_init_auto_input
[] = {
267 R_01_INC_DELAY
, 0x48, /* white peak control disabled */
268 R_03_INPUT_CNTL_2
, 0x20, /* was 0x30. 0x20: long vertical blanking */
269 R_04_INPUT_CNTL_3
, 0x90, /* analog gain set to 0 */
270 R_05_INPUT_CNTL_4
, 0x90, /* analog gain set to 0 */
272 R_06_H_SYNC_START
, 0xeb, /* horiz sync begin = -21 */
273 R_07_H_SYNC_STOP
, 0xe0, /* horiz sync stop = -17 */
274 R_09_LUMA_CNTL
, 0x53, /* 0x53, was 0x56 for 60hz. luminance control */
275 R_0A_LUMA_BRIGHT_CNTL
, 0x80, /* was 0x88. decoder brightness, 0x80 is itu standard */
276 R_0B_LUMA_CONTRAST_CNTL
, 0x44, /* was 0x48. decoder contrast, 0x44 is itu standard */
277 R_0C_CHROMA_SAT_CNTL
, 0x40, /* was 0x47. decoder saturation, 0x40 is itu standard */
278 R_0D_CHROMA_HUE_CNTL
, 0x00,
279 R_0F_CHROMA_GAIN_CNTL
, 0x00, /* use automatic gain */
280 R_10_CHROMA_CNTL_2
, 0x06, /* chroma: active adaptive combfilter */
281 R_11_MODE_DELAY_CNTL
, 0x00,
282 R_12_RT_SIGNAL_CNTL
, 0x9d, /* RTS0 output control: VGATE */
283 R_13_RT_X_PORT_OUT_CNTL
, 0x80, /* ITU656 standard mode, RTCO output enable RTCE */
284 R_14_ANAL_ADC_COMPAT_CNTL
, 0x00,
285 R_18_RAW_DATA_GAIN_CNTL
, 0x40, /* gain 0x00 = nominal */
286 R_19_RAW_DATA_OFF_CNTL
, 0x80,
287 R_1A_COLOR_KILL_LVL_CNTL
, 0x77, /* recommended value */
288 R_1B_MISC_TVVCRDET
, 0x42, /* recommended value */
289 R_1C_ENHAN_COMB_CTRL1
, 0xa9, /* recommended value */
290 R_1D_ENHAN_COMB_CTRL2
, 0x01, /* recommended value */
293 R_80_GLOBAL_CNTL_1
, 0x0, /* No tasks enabled at init */
295 /* Power Device Control */
296 R_88_POWER_SAVE_ADC_PORT_CNTL
, 0xd0, /* reset device */
297 R_88_POWER_SAVE_ADC_PORT_CNTL
, 0xf0, /* set device programmed, all in operational mode */
301 /* Used to reset saa7113, saa7114 and saa7115 */
302 static const unsigned char saa7115_cfg_reset_scaler
[] = {
303 R_87_I_PORT_I_O_ENA_OUT_CLK_AND_GATED
, 0x00, /* disable I-port output */
304 R_88_POWER_SAVE_ADC_PORT_CNTL
, 0xd0, /* reset scaler */
305 R_88_POWER_SAVE_ADC_PORT_CNTL
, 0xf0, /* activate scaler */
306 R_87_I_PORT_I_O_ENA_OUT_CLK_AND_GATED
, 0x01, /* enable I-port output */
310 /* ============== SAA7715 VIDEO templates ============= */
312 static const unsigned char saa7115_cfg_60hz_video
[] = {
313 R_80_GLOBAL_CNTL_1
, 0x00, /* reset tasks */
314 R_88_POWER_SAVE_ADC_PORT_CNTL
, 0xd0, /* reset scaler */
316 R_15_VGATE_START_FID_CHG
, 0x03,
317 R_16_VGATE_STOP
, 0x11,
318 R_17_MISC_VGATE_CONF_AND_MSB
, 0x9c,
320 R_08_SYNC_CNTL
, 0x68, /* 0xBO: auto detection, 0x68 = NTSC */
321 R_0E_CHROMA_CNTL_1
, 0x07, /* video autodetection is on */
323 R_5A_V_OFF_FOR_SLICER
, 0x06, /* standard 60hz value for ITU656 line counting */
326 R_90_A_TASK_HANDLING_CNTL
, 0x80,
327 R_91_A_X_PORT_FORMATS_AND_CONF
, 0x48,
328 R_92_A_X_PORT_INPUT_REFERENCE_SIGNAL
, 0x40,
329 R_93_A_I_PORT_OUTPUT_FORMATS_AND_CONF
, 0x84,
331 /* hoffset low (input), 0x0002 is minimum */
332 R_94_A_HORIZ_INPUT_WINDOW_START
, 0x01,
333 R_95_A_HORIZ_INPUT_WINDOW_START_MSB
, 0x00,
335 /* hsize low (input), 0x02d0 = 720 */
336 R_96_A_HORIZ_INPUT_WINDOW_LENGTH
, 0xd0,
337 R_97_A_HORIZ_INPUT_WINDOW_LENGTH_MSB
, 0x02,
339 R_98_A_VERT_INPUT_WINDOW_START
, 0x05,
340 R_99_A_VERT_INPUT_WINDOW_START_MSB
, 0x00,
342 R_9A_A_VERT_INPUT_WINDOW_LENGTH
, 0x0c,
343 R_9B_A_VERT_INPUT_WINDOW_LENGTH_MSB
, 0x00,
345 R_9C_A_HORIZ_OUTPUT_WINDOW_LENGTH
, 0xa0,
346 R_9D_A_HORIZ_OUTPUT_WINDOW_LENGTH_MSB
, 0x05,
348 R_9E_A_VERT_OUTPUT_WINDOW_LENGTH
, 0x0c,
349 R_9F_A_VERT_OUTPUT_WINDOW_LENGTH_MSB
, 0x00,
352 R_C0_B_TASK_HANDLING_CNTL
, 0x00,
353 R_C1_B_X_PORT_FORMATS_AND_CONF
, 0x08,
354 R_C2_B_INPUT_REFERENCE_SIGNAL_DEFINITION
, 0x00,
355 R_C3_B_I_PORT_FORMATS_AND_CONF
, 0x80,
357 /* 0x0002 is minimum */
358 R_C4_B_HORIZ_INPUT_WINDOW_START
, 0x02,
359 R_C5_B_HORIZ_INPUT_WINDOW_START_MSB
, 0x00,
362 R_C6_B_HORIZ_INPUT_WINDOW_LENGTH
, 0xd0,
363 R_C7_B_HORIZ_INPUT_WINDOW_LENGTH_MSB
, 0x02,
365 /* vwindow start 0x12 = 18 */
366 R_C8_B_VERT_INPUT_WINDOW_START
, 0x12,
367 R_C9_B_VERT_INPUT_WINDOW_START_MSB
, 0x00,
369 /* vwindow length 0xf8 = 248 */
370 R_CA_B_VERT_INPUT_WINDOW_LENGTH
, VRES_60HZ
>>1,
371 R_CB_B_VERT_INPUT_WINDOW_LENGTH_MSB
, VRES_60HZ
>>9,
373 /* hwindow 0x02d0 = 720 */
374 R_CC_B_HORIZ_OUTPUT_WINDOW_LENGTH
, 0xd0,
375 R_CD_B_HORIZ_OUTPUT_WINDOW_LENGTH_MSB
, 0x02,
377 R_F0_LFCO_PER_LINE
, 0xad, /* Set PLL Register. 60hz 525 lines per frame, 27 MHz */
378 R_F1_P_I_PARAM_SELECT
, 0x05, /* low bit with 0xF0 */
379 R_F5_PULSGEN_LINE_LENGTH
, 0xad,
380 R_F6_PULSE_A_POS_LSB_AND_PULSEGEN_CONFIG
, 0x01,
385 static const unsigned char saa7115_cfg_50hz_video
[] = {
386 R_80_GLOBAL_CNTL_1
, 0x00,
387 R_88_POWER_SAVE_ADC_PORT_CNTL
, 0xd0, /* reset scaler */
389 R_15_VGATE_START_FID_CHG
, 0x37, /* VGATE start */
390 R_16_VGATE_STOP
, 0x16,
391 R_17_MISC_VGATE_CONF_AND_MSB
, 0x99,
393 R_08_SYNC_CNTL
, 0x28, /* 0x28 = PAL */
394 R_0E_CHROMA_CNTL_1
, 0x07,
396 R_5A_V_OFF_FOR_SLICER
, 0x03, /* standard 50hz value */
399 R_90_A_TASK_HANDLING_CNTL
, 0x81,
400 R_91_A_X_PORT_FORMATS_AND_CONF
, 0x48,
401 R_92_A_X_PORT_INPUT_REFERENCE_SIGNAL
, 0x40,
402 R_93_A_I_PORT_OUTPUT_FORMATS_AND_CONF
, 0x84,
404 /* This is weird: the datasheet says that you should use 2 as the minimum value, */
405 /* but Hauppauge uses 0, and changing that to 2 causes indeed problems (for 50hz) */
406 /* hoffset low (input), 0x0002 is minimum */
407 R_94_A_HORIZ_INPUT_WINDOW_START
, 0x00,
408 R_95_A_HORIZ_INPUT_WINDOW_START_MSB
, 0x00,
410 /* hsize low (input), 0x02d0 = 720 */
411 R_96_A_HORIZ_INPUT_WINDOW_LENGTH
, 0xd0,
412 R_97_A_HORIZ_INPUT_WINDOW_LENGTH_MSB
, 0x02,
414 R_98_A_VERT_INPUT_WINDOW_START
, 0x03,
415 R_99_A_VERT_INPUT_WINDOW_START_MSB
, 0x00,
417 /* vsize 0x12 = 18 */
418 R_9A_A_VERT_INPUT_WINDOW_LENGTH
, 0x12,
419 R_9B_A_VERT_INPUT_WINDOW_LENGTH_MSB
, 0x00,
421 /* hsize 0x05a0 = 1440 */
422 R_9C_A_HORIZ_OUTPUT_WINDOW_LENGTH
, 0xa0,
423 R_9D_A_HORIZ_OUTPUT_WINDOW_LENGTH_MSB
, 0x05, /* hsize hi (output) */
424 R_9E_A_VERT_OUTPUT_WINDOW_LENGTH
, 0x12, /* vsize low (output), 0x12 = 18 */
425 R_9F_A_VERT_OUTPUT_WINDOW_LENGTH_MSB
, 0x00, /* vsize hi (output) */
428 R_C0_B_TASK_HANDLING_CNTL
, 0x00,
429 R_C1_B_X_PORT_FORMATS_AND_CONF
, 0x08,
430 R_C2_B_INPUT_REFERENCE_SIGNAL_DEFINITION
, 0x00,
431 R_C3_B_I_PORT_FORMATS_AND_CONF
, 0x80,
433 /* This is weird: the datasheet says that you should use 2 as the minimum value, */
434 /* but Hauppauge uses 0, and changing that to 2 causes indeed problems (for 50hz) */
435 /* hoffset low (input), 0x0002 is minimum. See comment above. */
436 R_C4_B_HORIZ_INPUT_WINDOW_START
, 0x00,
437 R_C5_B_HORIZ_INPUT_WINDOW_START_MSB
, 0x00,
439 /* hsize 0x02d0 = 720 */
440 R_C6_B_HORIZ_INPUT_WINDOW_LENGTH
, 0xd0,
441 R_C7_B_HORIZ_INPUT_WINDOW_LENGTH_MSB
, 0x02,
443 /* voffset 0x16 = 22 */
444 R_C8_B_VERT_INPUT_WINDOW_START
, 0x16,
445 R_C9_B_VERT_INPUT_WINDOW_START_MSB
, 0x00,
447 /* vsize 0x0120 = 288 */
448 R_CA_B_VERT_INPUT_WINDOW_LENGTH
, 0x20,
449 R_CB_B_VERT_INPUT_WINDOW_LENGTH_MSB
, 0x01,
451 /* hsize 0x02d0 = 720 */
452 R_CC_B_HORIZ_OUTPUT_WINDOW_LENGTH
, 0xd0,
453 R_CD_B_HORIZ_OUTPUT_WINDOW_LENGTH_MSB
, 0x02,
455 R_F0_LFCO_PER_LINE
, 0xb0, /* Set PLL Register. 50hz 625 lines per frame, 27 MHz */
456 R_F1_P_I_PARAM_SELECT
, 0x05, /* low bit with 0xF0, (was 0x05) */
457 R_F5_PULSGEN_LINE_LENGTH
, 0xb0,
458 R_F6_PULSE_A_POS_LSB_AND_PULSEGEN_CONFIG
, 0x01,
463 /* ============== SAA7715 VIDEO templates (end) ======= */
465 /* ============== GM7113C VIDEO templates ============= */
466 static const unsigned char gm7113c_cfg_60hz_video
[] = {
467 R_08_SYNC_CNTL
, 0x68, /* 0xBO: auto detection, 0x68 = NTSC */
468 R_0E_CHROMA_CNTL_1
, 0x07, /* video autodetection is on */
473 static const unsigned char gm7113c_cfg_50hz_video
[] = {
474 R_08_SYNC_CNTL
, 0x28, /* 0x28 = PAL */
475 R_0E_CHROMA_CNTL_1
, 0x07,
480 /* ============== GM7113C VIDEO templates (end) ======= */
483 static const unsigned char saa7115_cfg_vbi_on
[] = {
484 R_80_GLOBAL_CNTL_1
, 0x00, /* reset tasks */
485 R_88_POWER_SAVE_ADC_PORT_CNTL
, 0xd0, /* reset scaler */
486 R_80_GLOBAL_CNTL_1
, 0x30, /* Activate both tasks */
487 R_88_POWER_SAVE_ADC_PORT_CNTL
, 0xf0, /* activate scaler */
488 R_87_I_PORT_I_O_ENA_OUT_CLK_AND_GATED
, 0x01, /* Enable I-port output */
493 static const unsigned char saa7115_cfg_vbi_off
[] = {
494 R_80_GLOBAL_CNTL_1
, 0x00, /* reset tasks */
495 R_88_POWER_SAVE_ADC_PORT_CNTL
, 0xd0, /* reset scaler */
496 R_80_GLOBAL_CNTL_1
, 0x20, /* Activate only task "B" */
497 R_88_POWER_SAVE_ADC_PORT_CNTL
, 0xf0, /* activate scaler */
498 R_87_I_PORT_I_O_ENA_OUT_CLK_AND_GATED
, 0x01, /* Enable I-port output */
504 static const unsigned char saa7115_init_misc
[] = {
505 R_81_V_SYNC_FLD_ID_SRC_SEL_AND_RETIMED_V_F
, 0x01,
506 R_83_X_PORT_I_O_ENA_AND_OUT_CLK
, 0x01,
507 R_84_I_PORT_SIGNAL_DEF
, 0x20,
508 R_85_I_PORT_SIGNAL_POLAR
, 0x21,
509 R_86_I_PORT_FIFO_FLAG_CNTL_AND_ARBIT
, 0xc5,
510 R_87_I_PORT_I_O_ENA_OUT_CLK_AND_GATED
, 0x01,
513 R_A0_A_HORIZ_PRESCALING
, 0x01,
514 R_A1_A_ACCUMULATION_LENGTH
, 0x00,
515 R_A2_A_PRESCALER_DC_GAIN_AND_FIR_PREFILTER
, 0x00,
517 /* Configure controls at nominal value*/
518 R_A4_A_LUMA_BRIGHTNESS_CNTL
, 0x80,
519 R_A5_A_LUMA_CONTRAST_CNTL
, 0x40,
520 R_A6_A_CHROMA_SATURATION_CNTL
, 0x40,
522 /* note: 2 x zoom ensures that VBI lines have same length as video lines. */
523 R_A8_A_HORIZ_LUMA_SCALING_INC
, 0x00,
524 R_A9_A_HORIZ_LUMA_SCALING_INC_MSB
, 0x02,
526 R_AA_A_HORIZ_LUMA_PHASE_OFF
, 0x00,
528 /* must be horiz lum scaling / 2 */
529 R_AC_A_HORIZ_CHROMA_SCALING_INC
, 0x00,
530 R_AD_A_HORIZ_CHROMA_SCALING_INC_MSB
, 0x01,
532 /* must be offset luma / 2 */
533 R_AE_A_HORIZ_CHROMA_PHASE_OFF
, 0x00,
535 R_B0_A_VERT_LUMA_SCALING_INC
, 0x00,
536 R_B1_A_VERT_LUMA_SCALING_INC_MSB
, 0x04,
538 R_B2_A_VERT_CHROMA_SCALING_INC
, 0x00,
539 R_B3_A_VERT_CHROMA_SCALING_INC_MSB
, 0x04,
541 R_B4_A_VERT_SCALING_MODE_CNTL
, 0x01,
543 R_B8_A_VERT_CHROMA_PHASE_OFF_00
, 0x00,
544 R_B9_A_VERT_CHROMA_PHASE_OFF_01
, 0x00,
545 R_BA_A_VERT_CHROMA_PHASE_OFF_10
, 0x00,
546 R_BB_A_VERT_CHROMA_PHASE_OFF_11
, 0x00,
548 R_BC_A_VERT_LUMA_PHASE_OFF_00
, 0x00,
549 R_BD_A_VERT_LUMA_PHASE_OFF_01
, 0x00,
550 R_BE_A_VERT_LUMA_PHASE_OFF_10
, 0x00,
551 R_BF_A_VERT_LUMA_PHASE_OFF_11
, 0x00,
554 R_D0_B_HORIZ_PRESCALING
, 0x01,
555 R_D1_B_ACCUMULATION_LENGTH
, 0x00,
556 R_D2_B_PRESCALER_DC_GAIN_AND_FIR_PREFILTER
, 0x00,
558 /* Configure controls at nominal value*/
559 R_D4_B_LUMA_BRIGHTNESS_CNTL
, 0x80,
560 R_D5_B_LUMA_CONTRAST_CNTL
, 0x40,
561 R_D6_B_CHROMA_SATURATION_CNTL
, 0x40,
563 /* hor lum scaling 0x0400 = 1 */
564 R_D8_B_HORIZ_LUMA_SCALING_INC
, 0x00,
565 R_D9_B_HORIZ_LUMA_SCALING_INC_MSB
, 0x04,
567 R_DA_B_HORIZ_LUMA_PHASE_OFF
, 0x00,
569 /* must be hor lum scaling / 2 */
570 R_DC_B_HORIZ_CHROMA_SCALING
, 0x00,
571 R_DD_B_HORIZ_CHROMA_SCALING_MSB
, 0x02,
573 /* must be offset luma / 2 */
574 R_DE_B_HORIZ_PHASE_OFFSET_CRHOMA
, 0x00,
576 R_E0_B_VERT_LUMA_SCALING_INC
, 0x00,
577 R_E1_B_VERT_LUMA_SCALING_INC_MSB
, 0x04,
579 R_E2_B_VERT_CHROMA_SCALING_INC
, 0x00,
580 R_E3_B_VERT_CHROMA_SCALING_INC_MSB
, 0x04,
582 R_E4_B_VERT_SCALING_MODE_CNTL
, 0x01,
584 R_E8_B_VERT_CHROMA_PHASE_OFF_00
, 0x00,
585 R_E9_B_VERT_CHROMA_PHASE_OFF_01
, 0x00,
586 R_EA_B_VERT_CHROMA_PHASE_OFF_10
, 0x00,
587 R_EB_B_VERT_CHROMA_PHASE_OFF_11
, 0x00,
589 R_EC_B_VERT_LUMA_PHASE_OFF_00
, 0x00,
590 R_ED_B_VERT_LUMA_PHASE_OFF_01
, 0x00,
591 R_EE_B_VERT_LUMA_PHASE_OFF_10
, 0x00,
592 R_EF_B_VERT_LUMA_PHASE_OFF_11
, 0x00,
594 R_F2_NOMINAL_PLL2_DTO
, 0x50, /* crystal clock = 24.576 MHz, target = 27MHz */
595 R_F3_PLL_INCREMENT
, 0x46,
596 R_F4_PLL2_STATUS
, 0x00,
597 R_F7_PULSE_A_POS_MSB
, 0x4b, /* not the recommended settings! */
598 R_F8_PULSE_B_POS
, 0x00,
599 R_F9_PULSE_B_POS_MSB
, 0x4b,
600 R_FA_PULSE_C_POS
, 0x00,
601 R_FB_PULSE_C_POS_MSB
, 0x4b,
603 /* PLL2 lock detection settings: 71 lines 50% phase error */
604 R_FF_S_PLL_MAX_PHASE_ERR_THRESH_NUM_LINES
, 0x88,
607 R_40_SLICER_CNTL_1
, 0x20, /* No framing code errors allowed. */
609 R_41_LCR_BASE
+1, 0xff,
610 R_41_LCR_BASE
+2, 0xff,
611 R_41_LCR_BASE
+3, 0xff,
612 R_41_LCR_BASE
+4, 0xff,
613 R_41_LCR_BASE
+5, 0xff,
614 R_41_LCR_BASE
+6, 0xff,
615 R_41_LCR_BASE
+7, 0xff,
616 R_41_LCR_BASE
+8, 0xff,
617 R_41_LCR_BASE
+9, 0xff,
618 R_41_LCR_BASE
+10, 0xff,
619 R_41_LCR_BASE
+11, 0xff,
620 R_41_LCR_BASE
+12, 0xff,
621 R_41_LCR_BASE
+13, 0xff,
622 R_41_LCR_BASE
+14, 0xff,
623 R_41_LCR_BASE
+15, 0xff,
624 R_41_LCR_BASE
+16, 0xff,
625 R_41_LCR_BASE
+17, 0xff,
626 R_41_LCR_BASE
+18, 0xff,
627 R_41_LCR_BASE
+19, 0xff,
628 R_41_LCR_BASE
+20, 0xff,
629 R_41_LCR_BASE
+21, 0xff,
630 R_41_LCR_BASE
+22, 0xff,
631 R_58_PROGRAM_FRAMING_CODE
, 0x40,
632 R_59_H_OFF_FOR_SLICER
, 0x47,
633 R_5B_FLD_OFF_AND_MSB_FOR_H_AND_V_OFF
, 0x83,
637 R_02_INPUT_CNTL_1
, 0xc4, /* input tuner -> input 4, amplifier active */
639 R_80_GLOBAL_CNTL_1
, 0x20, /* enable task B */
640 R_88_POWER_SAVE_ADC_PORT_CNTL
, 0xd0,
641 R_88_POWER_SAVE_ADC_PORT_CNTL
, 0xf0,
645 static int saa711x_odd_parity(u8 c
)
654 static int saa711x_decode_vps(u8
*dst
, u8
*p
)
656 static const u8 biphase_tbl
[] = {
657 0xf0, 0x78, 0x70, 0xf0, 0xb4, 0x3c, 0x34, 0xb4,
658 0xb0, 0x38, 0x30, 0xb0, 0xf0, 0x78, 0x70, 0xf0,
659 0xd2, 0x5a, 0x52, 0xd2, 0x96, 0x1e, 0x16, 0x96,
660 0x92, 0x1a, 0x12, 0x92, 0xd2, 0x5a, 0x52, 0xd2,
661 0xd0, 0x58, 0x50, 0xd0, 0x94, 0x1c, 0x14, 0x94,
662 0x90, 0x18, 0x10, 0x90, 0xd0, 0x58, 0x50, 0xd0,
663 0xf0, 0x78, 0x70, 0xf0, 0xb4, 0x3c, 0x34, 0xb4,
664 0xb0, 0x38, 0x30, 0xb0, 0xf0, 0x78, 0x70, 0xf0,
665 0xe1, 0x69, 0x61, 0xe1, 0xa5, 0x2d, 0x25, 0xa5,
666 0xa1, 0x29, 0x21, 0xa1, 0xe1, 0x69, 0x61, 0xe1,
667 0xc3, 0x4b, 0x43, 0xc3, 0x87, 0x0f, 0x07, 0x87,
668 0x83, 0x0b, 0x03, 0x83, 0xc3, 0x4b, 0x43, 0xc3,
669 0xc1, 0x49, 0x41, 0xc1, 0x85, 0x0d, 0x05, 0x85,
670 0x81, 0x09, 0x01, 0x81, 0xc1, 0x49, 0x41, 0xc1,
671 0xe1, 0x69, 0x61, 0xe1, 0xa5, 0x2d, 0x25, 0xa5,
672 0xa1, 0x29, 0x21, 0xa1, 0xe1, 0x69, 0x61, 0xe1,
673 0xe0, 0x68, 0x60, 0xe0, 0xa4, 0x2c, 0x24, 0xa4,
674 0xa0, 0x28, 0x20, 0xa0, 0xe0, 0x68, 0x60, 0xe0,
675 0xc2, 0x4a, 0x42, 0xc2, 0x86, 0x0e, 0x06, 0x86,
676 0x82, 0x0a, 0x02, 0x82, 0xc2, 0x4a, 0x42, 0xc2,
677 0xc0, 0x48, 0x40, 0xc0, 0x84, 0x0c, 0x04, 0x84,
678 0x80, 0x08, 0x00, 0x80, 0xc0, 0x48, 0x40, 0xc0,
679 0xe0, 0x68, 0x60, 0xe0, 0xa4, 0x2c, 0x24, 0xa4,
680 0xa0, 0x28, 0x20, 0xa0, 0xe0, 0x68, 0x60, 0xe0,
681 0xf0, 0x78, 0x70, 0xf0, 0xb4, 0x3c, 0x34, 0xb4,
682 0xb0, 0x38, 0x30, 0xb0, 0xf0, 0x78, 0x70, 0xf0,
683 0xd2, 0x5a, 0x52, 0xd2, 0x96, 0x1e, 0x16, 0x96,
684 0x92, 0x1a, 0x12, 0x92, 0xd2, 0x5a, 0x52, 0xd2,
685 0xd0, 0x58, 0x50, 0xd0, 0x94, 0x1c, 0x14, 0x94,
686 0x90, 0x18, 0x10, 0x90, 0xd0, 0x58, 0x50, 0xd0,
687 0xf0, 0x78, 0x70, 0xf0, 0xb4, 0x3c, 0x34, 0xb4,
688 0xb0, 0x38, 0x30, 0xb0, 0xf0, 0x78, 0x70, 0xf0,
693 for (i
= 0; i
< 2 * 13; i
+= 2) {
694 err
|= biphase_tbl
[p
[i
]] | biphase_tbl
[p
[i
+ 1]];
695 c
= (biphase_tbl
[p
[i
+ 1]] & 0xf) | ((biphase_tbl
[p
[i
]] & 0xf) << 4);
701 static int saa711x_decode_wss(u8
*p
)
703 static const int wss_bits
[8] = {
704 0, 0, 0, 1, 0, 1, 1, 1
706 unsigned char parity
;
710 for (i
= 0; i
< 16; i
++) {
711 int b1
= wss_bits
[p
[i
] & 7];
712 int b2
= wss_bits
[(p
[i
] >> 3) & 7];
719 parity
^= parity
>> 2;
720 parity
^= parity
>> 1;
728 static int saa711x_s_clock_freq(struct v4l2_subdev
*sd
, u32 freq
)
730 struct saa711x_state
*state
= to_state(sd
);
735 u8 acc
= 0; /* reg 0x3a, audio clock control */
737 /* Checks for chips that don't have audio clock (saa7111, saa7113) */
738 if (!saa711x_has_reg(state
->ident
, R_30_AUD_MAST_CLK_CYCLES_PER_FIELD
))
741 v4l2_dbg(1, debug
, sd
, "set audio clock freq: %d\n", freq
);
744 if (freq
< 32000 || freq
> 48000)
747 /* hz is the refresh rate times 100 */
748 hz
= (state
->std
& V4L2_STD_525_60
) ? 5994 : 5000;
749 /* acpf = (256 * freq) / field_frequency == (256 * 100 * freq) / hz */
750 acpf
= (25600 * freq
) / hz
;
751 /* acni = (256 * freq * 2^23) / crystal_frequency =
752 (freq * 2^(8+23)) / crystal_frequency =
753 (freq << 31) / crystal_frequency */
756 do_div(f
, state
->crystal_freq
);
759 acpf
= acpf
* state
->cgcdiv
/ 16;
760 acni
= acni
* state
->cgcdiv
/ 16;
762 if (state
->cgcdiv
== 3)
768 if (state
->double_asclk
) {
772 saa711x_write(sd
, R_38_CLK_RATIO_AMXCLK_TO_ASCLK
, 0x03);
773 saa711x_write(sd
, R_39_CLK_RATIO_ASCLK_TO_ALRCLK
, 0x10 << state
->double_asclk
);
774 saa711x_write(sd
, R_3A_AUD_CLK_GEN_BASIC_SETUP
, acc
);
776 saa711x_write(sd
, R_30_AUD_MAST_CLK_CYCLES_PER_FIELD
, acpf
& 0xff);
777 saa711x_write(sd
, R_30_AUD_MAST_CLK_CYCLES_PER_FIELD
+1,
779 saa711x_write(sd
, R_30_AUD_MAST_CLK_CYCLES_PER_FIELD
+2,
780 (acpf
>> 16) & 0x03);
782 saa711x_write(sd
, R_34_AUD_MAST_CLK_NOMINAL_INC
, acni
& 0xff);
783 saa711x_write(sd
, R_34_AUD_MAST_CLK_NOMINAL_INC
+1, (acni
>> 8) & 0xff);
784 saa711x_write(sd
, R_34_AUD_MAST_CLK_NOMINAL_INC
+2, (acni
>> 16) & 0x3f);
785 state
->audclk_freq
= freq
;
789 static int saa711x_g_volatile_ctrl(struct v4l2_ctrl
*ctrl
)
791 struct v4l2_subdev
*sd
= to_sd(ctrl
);
792 struct saa711x_state
*state
= to_state(sd
);
795 case V4L2_CID_CHROMA_AGC
:
796 /* chroma gain cluster */
799 saa711x_read(sd
, R_0F_CHROMA_GAIN_CNTL
) & 0x7f;
805 static int saa711x_s_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_BRIGHTNESS
:
812 saa711x_write(sd
, R_0A_LUMA_BRIGHT_CNTL
, ctrl
->val
);
815 case V4L2_CID_CONTRAST
:
816 saa711x_write(sd
, R_0B_LUMA_CONTRAST_CNTL
, ctrl
->val
);
819 case V4L2_CID_SATURATION
:
820 saa711x_write(sd
, R_0C_CHROMA_SAT_CNTL
, ctrl
->val
);
824 saa711x_write(sd
, R_0D_CHROMA_HUE_CNTL
, ctrl
->val
);
827 case V4L2_CID_CHROMA_AGC
:
828 /* chroma gain cluster */
830 saa711x_write(sd
, R_0F_CHROMA_GAIN_CNTL
, state
->gain
->val
);
832 saa711x_write(sd
, R_0F_CHROMA_GAIN_CNTL
, state
->gain
->val
| 0x80);
842 static int saa711x_set_size(struct v4l2_subdev
*sd
, int width
, int height
)
844 struct saa711x_state
*state
= to_state(sd
);
848 int is_50hz
= state
->std
& V4L2_STD_625_50
;
849 int Vsrc
= is_50hz
? 576 : 480;
851 v4l2_dbg(1, debug
, sd
, "decoder set size to %ix%i\n", width
, height
);
853 /* FIXME need better bounds checking here */
854 if ((width
< 1) || (width
> 1440))
856 if ((height
< 1) || (height
> Vsrc
))
859 if (!saa711x_has_reg(state
->ident
, R_D0_B_HORIZ_PRESCALING
)) {
860 /* Decoder only supports 720 columns and 480 or 576 lines */
867 state
->width
= width
;
868 state
->height
= height
;
870 if (!saa711x_has_reg(state
->ident
, R_CC_B_HORIZ_OUTPUT_WINDOW_LENGTH
))
873 /* probably have a valid size, let's set it */
874 /* Set output width/height */
877 saa711x_write(sd
, R_CC_B_HORIZ_OUTPUT_WINDOW_LENGTH
,
878 (u8
) (width
& 0xff));
879 saa711x_write(sd
, R_CD_B_HORIZ_OUTPUT_WINDOW_LENGTH_MSB
,
880 (u8
) ((width
>> 8) & 0xff));
882 /* Vertical Scaling uses height/2 */
885 /* On 60Hz, it is using a higher Vertical Output Size */
887 res
+= (VRES_60HZ
- 480) >> 1;
890 saa711x_write(sd
, R_CE_B_VERT_OUTPUT_WINDOW_LENGTH
,
892 saa711x_write(sd
, R_CF_B_VERT_OUTPUT_WINDOW_LENGTH_MSB
,
893 (u8
) ((res
>> 8) & 0xff));
895 /* Scaling settings */
896 /* Hprescaler is floor(inres/outres) */
897 HPSC
= (int)(720 / width
);
898 /* 0 is not allowed (div. by zero) */
899 HPSC
= HPSC
? HPSC
: 1;
900 HFSC
= (int)((1024 * 720) / (HPSC
* width
));
901 /* FIXME hardcodes to "Task B"
902 * write H prescaler integer */
903 saa711x_write(sd
, R_D0_B_HORIZ_PRESCALING
,
906 v4l2_dbg(1, debug
, sd
, "Hpsc: 0x%05x, Hfsc: 0x%05x\n", HPSC
, HFSC
);
907 /* write H fine-scaling (luminance) */
908 saa711x_write(sd
, R_D8_B_HORIZ_LUMA_SCALING_INC
,
910 saa711x_write(sd
, R_D9_B_HORIZ_LUMA_SCALING_INC_MSB
,
911 (u8
) ((HFSC
>> 8) & 0xff));
912 /* write H fine-scaling (chrominance)
913 * must be lum/2, so i'll just bitshift :) */
914 saa711x_write(sd
, R_DC_B_HORIZ_CHROMA_SCALING
,
915 (u8
) ((HFSC
>> 1) & 0xff));
916 saa711x_write(sd
, R_DD_B_HORIZ_CHROMA_SCALING_MSB
,
917 (u8
) ((HFSC
>> 9) & 0xff));
919 VSCY
= (int)((1024 * Vsrc
) / height
);
920 v4l2_dbg(1, debug
, sd
, "Vsrc: %d, Vscy: 0x%05x\n", Vsrc
, VSCY
);
922 /* Correct Contrast and Luminance */
923 saa711x_write(sd
, R_D5_B_LUMA_CONTRAST_CNTL
,
924 (u8
) (64 * 1024 / VSCY
));
925 saa711x_write(sd
, R_D6_B_CHROMA_SATURATION_CNTL
,
926 (u8
) (64 * 1024 / VSCY
));
928 /* write V fine-scaling (luminance) */
929 saa711x_write(sd
, R_E0_B_VERT_LUMA_SCALING_INC
,
931 saa711x_write(sd
, R_E1_B_VERT_LUMA_SCALING_INC_MSB
,
932 (u8
) ((VSCY
>> 8) & 0xff));
933 /* write V fine-scaling (chrominance) */
934 saa711x_write(sd
, R_E2_B_VERT_CHROMA_SCALING_INC
,
936 saa711x_write(sd
, R_E3_B_VERT_CHROMA_SCALING_INC_MSB
,
937 (u8
) ((VSCY
>> 8) & 0xff));
939 saa711x_writeregs(sd
, saa7115_cfg_reset_scaler
);
941 /* Activates task "B" */
942 saa711x_write(sd
, R_80_GLOBAL_CNTL_1
,
943 saa711x_read(sd
, R_80_GLOBAL_CNTL_1
) | 0x20);
948 static void saa711x_set_v4lstd(struct v4l2_subdev
*sd
, v4l2_std_id std
)
950 struct saa711x_state
*state
= to_state(sd
);
952 /* Prevent unnecessary standard changes. During a standard
953 change the I-Port is temporarily disabled. Any devices
954 reading from that port can get confused.
955 Note that s_std is also used to switch from
956 radio to TV mode, so if a s_std is broadcast to
957 all I2C devices then you do not want to have an unwanted
959 if (std
== state
->std
)
964 // This works for NTSC-M, SECAM-L and the 50Hz PAL variants.
965 if (std
& V4L2_STD_525_60
) {
966 v4l2_dbg(1, debug
, sd
, "decoder set standard 60 Hz\n");
967 if (state
->ident
== GM7113C
)
968 saa711x_writeregs(sd
, gm7113c_cfg_60hz_video
);
970 saa711x_writeregs(sd
, saa7115_cfg_60hz_video
);
971 saa711x_set_size(sd
, 720, 480);
973 v4l2_dbg(1, debug
, sd
, "decoder set standard 50 Hz\n");
974 if (state
->ident
== GM7113C
)
975 saa711x_writeregs(sd
, gm7113c_cfg_50hz_video
);
977 saa711x_writeregs(sd
, saa7115_cfg_50hz_video
);
978 saa711x_set_size(sd
, 720, 576);
981 /* Register 0E - Bits D6-D4 on NO-AUTO mode
982 (SAA7111 and SAA7113 doesn't have auto mode)
983 50 Hz / 625 lines 60 Hz / 525 lines
984 000 PAL BGDHI (4.43Mhz) NTSC M (3.58MHz)
985 001 NTSC 4.43 (50 Hz) PAL 4.43 (60 Hz)
986 010 Combination-PAL N (3.58MHz) NTSC 4.43 (60 Hz)
987 011 NTSC N (3.58MHz) PAL M (3.58MHz)
988 100 reserved NTSC-Japan (3.58MHz)
990 if (state
->ident
<= SAA7113
||
991 state
->ident
== GM7113C
) {
992 u8 reg
= saa711x_read(sd
, R_0E_CHROMA_CNTL_1
) & 0x8f;
994 if (std
== V4L2_STD_PAL_M
) {
996 } else if (std
== V4L2_STD_PAL_Nc
) {
998 } else if (std
== V4L2_STD_PAL_60
) {
1000 } else if (std
== V4L2_STD_NTSC_M_JP
) {
1002 } else if (std
& V4L2_STD_SECAM
) {
1005 saa711x_write(sd
, R_0E_CHROMA_CNTL_1
, reg
);
1007 /* restart task B if needed */
1008 int taskb
= saa711x_read(sd
, R_80_GLOBAL_CNTL_1
) & 0x10;
1010 if (taskb
&& state
->ident
== SAA7114
)
1011 saa711x_writeregs(sd
, saa7115_cfg_vbi_on
);
1013 /* switch audio mode too! */
1014 saa711x_s_clock_freq(sd
, state
->audclk_freq
);
1018 /* setup the sliced VBI lcr registers according to the sliced VBI format */
1019 static void saa711x_set_lcr(struct v4l2_subdev
*sd
, struct v4l2_sliced_vbi_format
*fmt
)
1021 struct saa711x_state
*state
= to_state(sd
);
1022 int is_50hz
= (state
->std
& V4L2_STD_625_50
);
1027 /* saa7113/7114/7118 VBI support are experimental */
1028 if (!saa711x_has_reg(state
->ident
, R_41_LCR_BASE
))
1032 /* SAA7113 and SAA7118 also should support VBI - Need testing */
1033 if (state
->ident
!= SAA7115
)
1037 for (i
= 0; i
<= 23; i
++)
1043 for (i
= 6; i
<= 23; i
++)
1046 for (i
= 10; i
<= 21; i
++)
1050 /* first clear lines that cannot be captured */
1052 for (i
= 0; i
<= 5; i
++)
1053 fmt
->service_lines
[0][i
] =
1054 fmt
->service_lines
[1][i
] = 0;
1057 for (i
= 0; i
<= 9; i
++)
1058 fmt
->service_lines
[0][i
] =
1059 fmt
->service_lines
[1][i
] = 0;
1060 for (i
= 22; i
<= 23; i
++)
1061 fmt
->service_lines
[0][i
] =
1062 fmt
->service_lines
[1][i
] = 0;
1065 /* Now set the lcr values according to the specified service */
1066 for (i
= 6; i
<= 23; i
++) {
1068 for (x
= 0; x
<= 1; x
++) {
1069 switch (fmt
->service_lines
[1-x
][i
]) {
1071 lcr
[i
] |= 0xf << (4 * x
);
1073 case V4L2_SLICED_TELETEXT_B
:
1074 lcr
[i
] |= 1 << (4 * x
);
1076 case V4L2_SLICED_CAPTION_525
:
1077 lcr
[i
] |= 4 << (4 * x
);
1079 case V4L2_SLICED_WSS_625
:
1080 lcr
[i
] |= 5 << (4 * x
);
1082 case V4L2_SLICED_VPS
:
1083 lcr
[i
] |= 7 << (4 * x
);
1090 /* write the lcr registers */
1091 for (i
= 2; i
<= 23; i
++) {
1092 saa711x_write(sd
, i
- 2 + R_41_LCR_BASE
, lcr
[i
]);
1095 /* enable/disable raw VBI capturing */
1096 saa711x_writeregs(sd
, fmt
== NULL
?
1097 saa7115_cfg_vbi_on
:
1098 saa7115_cfg_vbi_off
);
1101 static int saa711x_g_sliced_fmt(struct v4l2_subdev
*sd
, struct v4l2_sliced_vbi_format
*sliced
)
1103 static u16 lcr2vbi
[] = {
1104 0, V4L2_SLICED_TELETEXT_B
, 0, /* 1 */
1105 0, V4L2_SLICED_CAPTION_525
, /* 4 */
1106 V4L2_SLICED_WSS_625
, 0, /* 5 */
1107 V4L2_SLICED_VPS
, 0, 0, 0, 0, /* 7 */
1112 memset(sliced
->service_lines
, 0, sizeof(sliced
->service_lines
));
1113 sliced
->service_set
= 0;
1114 /* done if using raw VBI */
1115 if (saa711x_read(sd
, R_80_GLOBAL_CNTL_1
) & 0x10)
1117 for (i
= 2; i
<= 23; i
++) {
1118 u8 v
= saa711x_read(sd
, i
- 2 + R_41_LCR_BASE
);
1120 sliced
->service_lines
[0][i
] = lcr2vbi
[v
>> 4];
1121 sliced
->service_lines
[1][i
] = lcr2vbi
[v
& 0xf];
1122 sliced
->service_set
|=
1123 sliced
->service_lines
[0][i
] | sliced
->service_lines
[1][i
];
1128 static int saa711x_s_raw_fmt(struct v4l2_subdev
*sd
, struct v4l2_vbi_format
*fmt
)
1130 saa711x_set_lcr(sd
, NULL
);
1134 static int saa711x_s_sliced_fmt(struct v4l2_subdev
*sd
, struct v4l2_sliced_vbi_format
*fmt
)
1136 saa711x_set_lcr(sd
, fmt
);
1140 static int saa711x_s_mbus_fmt(struct v4l2_subdev
*sd
, struct v4l2_mbus_framefmt
*fmt
)
1142 if (fmt
->code
!= V4L2_MBUS_FMT_FIXED
)
1144 fmt
->field
= V4L2_FIELD_INTERLACED
;
1145 fmt
->colorspace
= V4L2_COLORSPACE_SMPTE170M
;
1146 return saa711x_set_size(sd
, fmt
->width
, fmt
->height
);
1149 /* Decode the sliced VBI data stream as created by the saa7115.
1150 The format is described in the saa7115 datasheet in Tables 25 and 26
1152 The current implementation uses SAV/EAV codes and not the ancillary data
1153 headers. The vbi->p pointer points to the R_5E_SDID byte right after the SAV
1155 static int saa711x_decode_vbi_line(struct v4l2_subdev
*sd
, struct v4l2_decode_vbi_line
*vbi
)
1157 struct saa711x_state
*state
= to_state(sd
);
1158 static const char vbi_no_data_pattern
[] = {
1159 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0
1163 int id1
, id2
; /* the ID1 and ID2 bytes from the internal header */
1165 vbi
->type
= 0; /* mark result as a failure */
1168 /* Note: the field bit is inverted for 60 Hz video */
1169 if (state
->std
& V4L2_STD_525_60
)
1172 /* Skip internal header, p now points to the start of the payload */
1176 /* calculate field and line number of the VBI packet (1-23) */
1177 vbi
->is_second_field
= ((id1
& 0x40) != 0);
1178 vbi
->line
= (id1
& 0x3f) << 3;
1179 vbi
->line
|= (id2
& 0x70) >> 4;
1181 /* Obtain data type */
1184 /* If the VBI slicer does not detect any signal it will fill up
1185 the payload buffer with 0xa0 bytes. */
1186 if (!memcmp(p
, vbi_no_data_pattern
, sizeof(vbi_no_data_pattern
)))
1189 /* decode payloads */
1192 vbi
->type
= V4L2_SLICED_TELETEXT_B
;
1195 if (!saa711x_odd_parity(p
[0]) || !saa711x_odd_parity(p
[1]))
1197 vbi
->type
= V4L2_SLICED_CAPTION_525
;
1200 wss
= saa711x_decode_wss(p
);
1205 vbi
->type
= V4L2_SLICED_WSS_625
;
1208 if (saa711x_decode_vps(p
, p
) != 0)
1210 vbi
->type
= V4L2_SLICED_VPS
;
1218 /* ============ SAA7115 AUDIO settings (end) ============= */
1220 static int saa711x_g_tuner(struct v4l2_subdev
*sd
, struct v4l2_tuner
*vt
)
1222 struct saa711x_state
*state
= to_state(sd
);
1227 status
= saa711x_read(sd
, R_1F_STATUS_BYTE_2_VD_DEC
);
1229 v4l2_dbg(1, debug
, sd
, "status: 0x%02x\n", status
);
1230 vt
->signal
= ((status
& (1 << 6)) == 0) ? 0xffff : 0x0;
1234 static int saa711x_s_std(struct v4l2_subdev
*sd
, v4l2_std_id std
)
1236 struct saa711x_state
*state
= to_state(sd
);
1239 saa711x_set_v4lstd(sd
, std
);
1243 static int saa711x_s_radio(struct v4l2_subdev
*sd
)
1245 struct saa711x_state
*state
= to_state(sd
);
1251 static int saa711x_s_routing(struct v4l2_subdev
*sd
,
1252 u32 input
, u32 output
, u32 config
)
1254 struct saa711x_state
*state
= to_state(sd
);
1255 u8 mask
= (state
->ident
<= SAA7111A
) ? 0xf8 : 0xf0;
1257 v4l2_dbg(1, debug
, sd
, "decoder set input %d output %d\n",
1260 /* saa7111/3 does not have these inputs */
1261 if ((state
->ident
<= SAA7113
||
1262 state
->ident
== GM7113C
) &&
1263 (input
== SAA7115_COMPOSITE4
||
1264 input
== SAA7115_COMPOSITE5
)) {
1267 if (input
> SAA7115_SVIDEO3
)
1269 if (state
->input
== input
&& state
->output
== output
)
1271 v4l2_dbg(1, debug
, sd
, "now setting %s input %s output\n",
1272 (input
>= SAA7115_SVIDEO0
) ? "S-Video" : "Composite",
1273 (output
== SAA7115_IPORT_ON
) ? "iport on" : "iport off");
1274 state
->input
= input
;
1276 /* saa7111 has slightly different input numbering */
1277 if (state
->ident
<= SAA7111A
) {
1278 if (input
>= SAA7115_COMPOSITE4
)
1280 /* saa7111 specific */
1281 saa711x_write(sd
, R_10_CHROMA_CNTL_2
,
1282 (saa711x_read(sd
, R_10_CHROMA_CNTL_2
) & 0x3f) |
1283 ((output
& 0xc0) ^ 0x40));
1284 saa711x_write(sd
, R_13_RT_X_PORT_OUT_CNTL
,
1285 (saa711x_read(sd
, R_13_RT_X_PORT_OUT_CNTL
) & 0xf0) |
1286 ((output
& 2) ? 0x0a : 0));
1290 saa711x_write(sd
, R_02_INPUT_CNTL_1
,
1291 (saa711x_read(sd
, R_02_INPUT_CNTL_1
) & mask
) |
1294 /* bypass chrominance trap for S-Video modes */
1295 saa711x_write(sd
, R_09_LUMA_CNTL
,
1296 (saa711x_read(sd
, R_09_LUMA_CNTL
) & 0x7f) |
1297 (state
->input
>= SAA7115_SVIDEO0
? 0x80 : 0x0));
1299 state
->output
= output
;
1300 if (state
->ident
== SAA7114
||
1301 state
->ident
== SAA7115
) {
1302 saa711x_write(sd
, R_83_X_PORT_I_O_ENA_AND_OUT_CLK
,
1303 (saa711x_read(sd
, R_83_X_PORT_I_O_ENA_AND_OUT_CLK
) & 0xfe) |
1304 (state
->output
& 0x01));
1306 if (state
->ident
> SAA7111A
) {
1307 if (config
& SAA7115_IDQ_IS_DEFAULT
)
1308 saa711x_write(sd
, R_85_I_PORT_SIGNAL_POLAR
, 0x20);
1310 saa711x_write(sd
, R_85_I_PORT_SIGNAL_POLAR
, 0x21);
1315 static int saa711x_s_gpio(struct v4l2_subdev
*sd
, u32 val
)
1317 struct saa711x_state
*state
= to_state(sd
);
1319 if (state
->ident
> SAA7111A
)
1321 saa711x_write(sd
, 0x11, (saa711x_read(sd
, 0x11) & 0x7f) |
1326 static int saa711x_s_stream(struct v4l2_subdev
*sd
, int enable
)
1328 struct saa711x_state
*state
= to_state(sd
);
1330 v4l2_dbg(1, debug
, sd
, "%s output\n",
1331 enable
? "enable" : "disable");
1333 if (state
->enable
== enable
)
1335 state
->enable
= enable
;
1336 if (!saa711x_has_reg(state
->ident
, R_87_I_PORT_I_O_ENA_OUT_CLK_AND_GATED
))
1338 saa711x_write(sd
, R_87_I_PORT_I_O_ENA_OUT_CLK_AND_GATED
, state
->enable
);
1342 static int saa711x_s_crystal_freq(struct v4l2_subdev
*sd
, u32 freq
, u32 flags
)
1344 struct saa711x_state
*state
= to_state(sd
);
1346 if (freq
!= SAA7115_FREQ_32_11_MHZ
&& freq
!= SAA7115_FREQ_24_576_MHZ
)
1348 state
->crystal_freq
= freq
;
1349 state
->double_asclk
= flags
& SAA7115_FREQ_FL_DOUBLE_ASCLK
;
1350 state
->cgcdiv
= (flags
& SAA7115_FREQ_FL_CGCDIV
) ? 3 : 4;
1351 state
->ucgc
= flags
& SAA7115_FREQ_FL_UCGC
;
1352 state
->apll
= flags
& SAA7115_FREQ_FL_APLL
;
1353 saa711x_s_clock_freq(sd
, state
->audclk_freq
);
1357 static int saa711x_reset(struct v4l2_subdev
*sd
, u32 val
)
1359 v4l2_dbg(1, debug
, sd
, "decoder RESET\n");
1360 saa711x_writeregs(sd
, saa7115_cfg_reset_scaler
);
1364 static int saa711x_g_vbi_data(struct v4l2_subdev
*sd
, struct v4l2_sliced_vbi_data
*data
)
1366 /* Note: the internal field ID is inverted for NTSC,
1367 so data->field 0 maps to the saa7115 even field,
1368 whereas for PAL it maps to the saa7115 odd field. */
1370 case V4L2_SLICED_WSS_625
:
1371 if (saa711x_read(sd
, 0x6b) & 0xc0)
1373 data
->data
[0] = saa711x_read(sd
, 0x6c);
1374 data
->data
[1] = saa711x_read(sd
, 0x6d);
1376 case V4L2_SLICED_CAPTION_525
:
1377 if (data
->field
== 0) {
1379 if (saa711x_read(sd
, 0x66) & 0x30)
1381 data
->data
[0] = saa711x_read(sd
, 0x69);
1382 data
->data
[1] = saa711x_read(sd
, 0x6a);
1386 if (saa711x_read(sd
, 0x66) & 0xc0)
1388 data
->data
[0] = saa711x_read(sd
, 0x67);
1389 data
->data
[1] = saa711x_read(sd
, 0x68);
1396 static int saa711x_querystd(struct v4l2_subdev
*sd
, v4l2_std_id
*std
)
1398 struct saa711x_state
*state
= to_state(sd
);
1402 * The V4L2 core already initializes std with all supported
1403 * Standards. All driver needs to do is to mask it, to remove
1404 * standards that don't apply from the mask
1407 reg1f
= saa711x_read(sd
, R_1F_STATUS_BYTE_2_VD_DEC
);
1409 if (state
->ident
== SAA7115
) {
1410 reg1e
= saa711x_read(sd
, R_1E_STATUS_BYTE_1_VD_DEC
);
1412 v4l2_dbg(1, debug
, sd
, "Status byte 1 (0x1e)=0x%02x\n", reg1e
);
1414 switch (reg1e
& 0x03) {
1416 *std
&= V4L2_STD_NTSC
;
1420 * V4L2_STD_PAL just cover the european PAL standards.
1421 * This is wrong, as the device could also be using an
1422 * other PAL standard.
1424 *std
&= V4L2_STD_PAL
| V4L2_STD_PAL_N
| V4L2_STD_PAL_Nc
|
1425 V4L2_STD_PAL_M
| V4L2_STD_PAL_60
;
1428 *std
&= V4L2_STD_SECAM
;
1431 *std
= V4L2_STD_UNKNOWN
;
1432 /* Can't detect anything */
1437 v4l2_dbg(1, debug
, sd
, "Status byte 2 (0x1f)=0x%02x\n", reg1f
);
1439 /* horizontal/vertical not locked */
1441 *std
= V4L2_STD_UNKNOWN
;
1446 *std
&= V4L2_STD_525_60
;
1448 *std
&= V4L2_STD_625_50
;
1451 v4l2_dbg(1, debug
, sd
, "detected std mask = %08Lx\n", *std
);
1456 static int saa711x_g_input_status(struct v4l2_subdev
*sd
, u32
*status
)
1458 struct saa711x_state
*state
= to_state(sd
);
1462 *status
= V4L2_IN_ST_NO_SIGNAL
;
1463 if (state
->ident
== SAA7115
)
1464 reg1e
= saa711x_read(sd
, R_1E_STATUS_BYTE_1_VD_DEC
);
1465 reg1f
= saa711x_read(sd
, R_1F_STATUS_BYTE_2_VD_DEC
);
1466 if ((reg1f
& 0xc1) == 0x81 && (reg1e
& 0xc0) == 0x80)
1471 #ifdef CONFIG_VIDEO_ADV_DEBUG
1472 static int saa711x_g_register(struct v4l2_subdev
*sd
, struct v4l2_dbg_register
*reg
)
1474 reg
->val
= saa711x_read(sd
, reg
->reg
& 0xff);
1479 static int saa711x_s_register(struct v4l2_subdev
*sd
, const struct v4l2_dbg_register
*reg
)
1481 saa711x_write(sd
, reg
->reg
& 0xff, reg
->val
& 0xff);
1486 static int saa711x_log_status(struct v4l2_subdev
*sd
)
1488 struct saa711x_state
*state
= to_state(sd
);
1493 v4l2_info(sd
, "Audio frequency: %d Hz\n", state
->audclk_freq
);
1494 if (state
->ident
!= SAA7115
) {
1495 /* status for the saa7114 */
1496 reg1f
= saa711x_read(sd
, R_1F_STATUS_BYTE_2_VD_DEC
);
1497 signalOk
= (reg1f
& 0xc1) == 0x81;
1498 v4l2_info(sd
, "Video signal: %s\n", signalOk
? "ok" : "bad");
1499 v4l2_info(sd
, "Frequency: %s\n", (reg1f
& 0x20) ? "60 Hz" : "50 Hz");
1503 /* status for the saa7115 */
1504 reg1e
= saa711x_read(sd
, R_1E_STATUS_BYTE_1_VD_DEC
);
1505 reg1f
= saa711x_read(sd
, R_1F_STATUS_BYTE_2_VD_DEC
);
1507 signalOk
= (reg1f
& 0xc1) == 0x81 && (reg1e
& 0xc0) == 0x80;
1508 vcr
= !(reg1f
& 0x10);
1510 if (state
->input
>= 6)
1511 v4l2_info(sd
, "Input: S-Video %d\n", state
->input
- 6);
1513 v4l2_info(sd
, "Input: Composite %d\n", state
->input
);
1514 v4l2_info(sd
, "Video signal: %s\n", signalOk
? (vcr
? "VCR" : "broadcast/DVD") : "bad");
1515 v4l2_info(sd
, "Frequency: %s\n", (reg1f
& 0x20) ? "60 Hz" : "50 Hz");
1517 switch (reg1e
& 0x03) {
1519 v4l2_info(sd
, "Detected format: NTSC\n");
1522 v4l2_info(sd
, "Detected format: PAL\n");
1525 v4l2_info(sd
, "Detected format: SECAM\n");
1528 v4l2_info(sd
, "Detected format: BW/No color\n");
1531 v4l2_info(sd
, "Width, Height: %d, %d\n", state
->width
, state
->height
);
1532 v4l2_ctrl_handler_log_status(&state
->hdl
, sd
->name
);
1536 /* ----------------------------------------------------------------------- */
1538 static const struct v4l2_ctrl_ops saa711x_ctrl_ops
= {
1539 .s_ctrl
= saa711x_s_ctrl
,
1540 .g_volatile_ctrl
= saa711x_g_volatile_ctrl
,
1543 static const struct v4l2_subdev_core_ops saa711x_core_ops
= {
1544 .log_status
= saa711x_log_status
,
1545 .g_ext_ctrls
= v4l2_subdev_g_ext_ctrls
,
1546 .try_ext_ctrls
= v4l2_subdev_try_ext_ctrls
,
1547 .s_ext_ctrls
= v4l2_subdev_s_ext_ctrls
,
1548 .g_ctrl
= v4l2_subdev_g_ctrl
,
1549 .s_ctrl
= v4l2_subdev_s_ctrl
,
1550 .queryctrl
= v4l2_subdev_queryctrl
,
1551 .querymenu
= v4l2_subdev_querymenu
,
1552 .s_std
= saa711x_s_std
,
1553 .reset
= saa711x_reset
,
1554 .s_gpio
= saa711x_s_gpio
,
1555 #ifdef CONFIG_VIDEO_ADV_DEBUG
1556 .g_register
= saa711x_g_register
,
1557 .s_register
= saa711x_s_register
,
1561 static const struct v4l2_subdev_tuner_ops saa711x_tuner_ops
= {
1562 .s_radio
= saa711x_s_radio
,
1563 .g_tuner
= saa711x_g_tuner
,
1566 static const struct v4l2_subdev_audio_ops saa711x_audio_ops
= {
1567 .s_clock_freq
= saa711x_s_clock_freq
,
1570 static const struct v4l2_subdev_video_ops saa711x_video_ops
= {
1571 .s_routing
= saa711x_s_routing
,
1572 .s_crystal_freq
= saa711x_s_crystal_freq
,
1573 .s_mbus_fmt
= saa711x_s_mbus_fmt
,
1574 .s_stream
= saa711x_s_stream
,
1575 .querystd
= saa711x_querystd
,
1576 .g_input_status
= saa711x_g_input_status
,
1579 static const struct v4l2_subdev_vbi_ops saa711x_vbi_ops
= {
1580 .g_vbi_data
= saa711x_g_vbi_data
,
1581 .decode_vbi_line
= saa711x_decode_vbi_line
,
1582 .g_sliced_fmt
= saa711x_g_sliced_fmt
,
1583 .s_sliced_fmt
= saa711x_s_sliced_fmt
,
1584 .s_raw_fmt
= saa711x_s_raw_fmt
,
1587 static const struct v4l2_subdev_ops saa711x_ops
= {
1588 .core
= &saa711x_core_ops
,
1589 .tuner
= &saa711x_tuner_ops
,
1590 .audio
= &saa711x_audio_ops
,
1591 .video
= &saa711x_video_ops
,
1592 .vbi
= &saa711x_vbi_ops
,
1595 #define CHIP_VER_SIZE 16
1597 /* ----------------------------------------------------------------------- */
1600 * saa711x_detect_chip - Detects the saa711x (or clone) variant
1601 * @client: I2C client structure.
1602 * @id: I2C device ID structure.
1603 * @name: Name of the device to be filled.
1605 * Detects the Philips/NXP saa711x chip, or some clone of it.
1606 * if 'id' is NULL or id->driver_data is equal to 1, it auto-probes
1608 * If the tuner is not found, it returns -ENODEV.
1609 * If auto-detection is disabled and the tuner doesn't match what it was
1610 * requred, it returns -EINVAL and fills 'name'.
1611 * If the chip is found, it returns the chip ID and fills 'name'.
1613 static int saa711x_detect_chip(struct i2c_client
*client
,
1614 const struct i2c_device_id
*id
,
1617 char chip_ver
[CHIP_VER_SIZE
];
1622 autodetect
= !id
|| id
->driver_data
== 1;
1624 /* Read the chip version register */
1625 for (i
= 0; i
< CHIP_VER_SIZE
; i
++) {
1626 i2c_smbus_write_byte_data(client
, 0, i
);
1627 chip_ver
[i
] = i2c_smbus_read_byte_data(client
, 0);
1628 name
[i
] = (chip_ver
[i
] & 0x0f) + '0';
1630 name
[i
] += 'a' - '9' - 1;
1634 /* Check if it is a Philips/NXP chip */
1635 if (!memcmp(name
+ 1, "f711", 4)) {
1637 snprintf(name
, CHIP_VER_SIZE
, "saa711%c", chip_id
);
1639 if (!autodetect
&& strcmp(name
, id
->name
))
1644 if (chip_ver
[0] & 0xf0) {
1645 snprintf(name
, CHIP_VER_SIZE
, "saa711%ca", chip_id
);
1646 v4l_info(client
, "saa7111a variant found\n");
1660 "WARNING: Philips/NXP chip unknown - Falling back to saa7111\n");
1665 /* Check if it is a gm7113c */
1666 if (!memcmp(name
, "0000", 4)) {
1668 for (i
= 0; i
< 4; i
++) {
1669 chip_id
= chip_id
<< 1;
1670 chip_id
|= (chip_ver
[i
] & 0x80) ? 1 : 0;
1674 * Note: From the datasheet, only versions 1 and 2
1675 * exists. However, tests on a device labeled as:
1676 * "GM7113C 1145" returned "10" on all 16 chip
1677 * version (reg 0x00) reads. So, we need to also
1678 * accept at least verion 0. For now, let's just
1679 * assume that a device that returns "0000" for
1680 * the lower nibble is a gm7113c.
1683 strlcpy(name
, "gm7113c", CHIP_VER_SIZE
);
1685 if (!autodetect
&& strcmp(name
, id
->name
))
1688 v4l_dbg(1, debug
, client
,
1689 "It seems to be a %s chip (%*ph) @ 0x%x.\n",
1690 name
, 16, chip_ver
, client
->addr
<< 1);
1695 /* Chip was not discovered. Return its ID and don't bind */
1696 v4l_dbg(1, debug
, client
, "chip %*ph @ 0x%x is unknown.\n",
1697 16, chip_ver
, client
->addr
<< 1);
1701 static int saa711x_probe(struct i2c_client
*client
,
1702 const struct i2c_device_id
*id
)
1704 struct saa711x_state
*state
;
1705 struct v4l2_subdev
*sd
;
1706 struct v4l2_ctrl_handler
*hdl
;
1708 char name
[CHIP_VER_SIZE
+ 1];
1710 /* Check if the adapter supports the needed features */
1711 if (!i2c_check_functionality(client
->adapter
, I2C_FUNC_SMBUS_BYTE_DATA
))
1714 ident
= saa711x_detect_chip(client
, id
, name
);
1715 if (ident
== -EINVAL
) {
1716 /* Chip exists, but doesn't match */
1717 v4l_warn(client
, "found %s while %s was expected\n",
1724 strlcpy(client
->name
, name
, sizeof(client
->name
));
1726 state
= devm_kzalloc(&client
->dev
, sizeof(*state
), GFP_KERNEL
);
1730 v4l2_i2c_subdev_init(sd
, client
, &saa711x_ops
);
1732 v4l_info(client
, "%s found @ 0x%x (%s)\n", name
,
1733 client
->addr
<< 1, client
->adapter
->name
);
1735 v4l2_ctrl_handler_init(hdl
, 6);
1736 /* add in ascending ID order */
1737 v4l2_ctrl_new_std(hdl
, &saa711x_ctrl_ops
,
1738 V4L2_CID_BRIGHTNESS
, 0, 255, 1, 128);
1739 v4l2_ctrl_new_std(hdl
, &saa711x_ctrl_ops
,
1740 V4L2_CID_CONTRAST
, 0, 127, 1, 64);
1741 v4l2_ctrl_new_std(hdl
, &saa711x_ctrl_ops
,
1742 V4L2_CID_SATURATION
, 0, 127, 1, 64);
1743 v4l2_ctrl_new_std(hdl
, &saa711x_ctrl_ops
,
1744 V4L2_CID_HUE
, -128, 127, 1, 0);
1745 state
->agc
= v4l2_ctrl_new_std(hdl
, &saa711x_ctrl_ops
,
1746 V4L2_CID_CHROMA_AGC
, 0, 1, 1, 1);
1747 state
->gain
= v4l2_ctrl_new_std(hdl
, &saa711x_ctrl_ops
,
1748 V4L2_CID_CHROMA_GAIN
, 0, 127, 1, 40);
1749 sd
->ctrl_handler
= hdl
;
1751 int err
= hdl
->error
;
1753 v4l2_ctrl_handler_free(hdl
);
1756 v4l2_ctrl_auto_cluster(2, &state
->agc
, 0, true);
1759 state
->output
= SAA7115_IPORT_ON
;
1762 state
->ident
= ident
;
1764 state
->audclk_freq
= 48000;
1766 v4l2_dbg(1, debug
, sd
, "writing init values\n");
1768 /* init to 60hz/48khz */
1769 state
->crystal_freq
= SAA7115_FREQ_24_576_MHZ
;
1770 switch (state
->ident
) {
1773 saa711x_writeregs(sd
, saa7111_init
);
1777 saa711x_writeregs(sd
, saa7113_init
);
1780 state
->crystal_freq
= SAA7115_FREQ_32_11_MHZ
;
1781 saa711x_writeregs(sd
, saa7115_init_auto_input
);
1783 if (state
->ident
> SAA7111A
)
1784 saa711x_writeregs(sd
, saa7115_init_misc
);
1785 saa711x_set_v4lstd(sd
, V4L2_STD_NTSC
);
1786 v4l2_ctrl_handler_setup(hdl
);
1788 v4l2_dbg(1, debug
, sd
, "status: (1E) 0x%02x, (1F) 0x%02x\n",
1789 saa711x_read(sd
, R_1E_STATUS_BYTE_1_VD_DEC
),
1790 saa711x_read(sd
, R_1F_STATUS_BYTE_2_VD_DEC
));
1794 /* ----------------------------------------------------------------------- */
1796 static int saa711x_remove(struct i2c_client
*client
)
1798 struct v4l2_subdev
*sd
= i2c_get_clientdata(client
);
1800 v4l2_device_unregister_subdev(sd
);
1801 v4l2_ctrl_handler_free(sd
->ctrl_handler
);
1805 static const struct i2c_device_id saa711x_id
[] = {
1806 { "saa7115_auto", 1 }, /* autodetect */
1815 MODULE_DEVICE_TABLE(i2c
, saa711x_id
);
1817 static struct i2c_driver saa711x_driver
= {
1819 .owner
= THIS_MODULE
,
1822 .probe
= saa711x_probe
,
1823 .remove
= saa711x_remove
,
1824 .id_table
= saa711x_id
,
1827 module_i2c_driver(saa711x_driver
);