Merge branch 'wimax-2.6.35.y' of git://git.kernel.org/pub/scm/linux/kernel/git/inaky...
[deliverable/linux.git] / drivers / media / video / saa7115.c
1 /* saa711x - Philips SAA711x video decoder driver
2 * This driver can work with saa7111, saa7111a, saa7113, saa7114,
3 * saa7115 and saa7118.
4 *
5 * Based on saa7114 driver by Maxim Yevtyushkin, which is based on
6 * the saa7111 driver by Dave Perks.
7 *
8 * Copyright (C) 1998 Dave Perks <dperks@ibm.net>
9 * Copyright (C) 2002 Maxim Yevtyushkin <max@linuxmedialabs.com>
10 *
11 * Slight changes for video timing and attachment output by
12 * Wolfgang Scherr <scherr@net4you.net>
13 *
14 * Moved over to the linux >= 2.4.x i2c protocol (1/1/2003)
15 * by Ronald Bultje <rbultje@ronald.bitfreak.net>
16 *
17 * Added saa7115 support by Kevin Thayer <nufan_wfk at yahoo.com>
18 * (2/17/2003)
19 *
20 * VBI support (2004) and cleanups (2005) by Hans Verkuil <hverkuil@xs4all.nl>
21 *
22 * Copyright (c) 2005-2006 Mauro Carvalho Chehab <mchehab@infradead.org>
23 * SAA7111, SAA7113 and SAA7118 support
24 *
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.
29 *
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.
34 *
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.
38 */
39
40 #include "saa711x_regs.h"
41
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-chip-ident.h>
49 #include <media/v4l2-i2c-drv.h>
50 #include <media/saa7115.h>
51 #include <asm/div64.h>
52
53 #define VRES_60HZ (480+16)
54
55 MODULE_DESCRIPTION("Philips SAA7111/SAA7113/SAA7114/SAA7115/SAA7118 video decoder driver");
56 MODULE_AUTHOR( "Maxim Yevtyushkin, Kevin Thayer, Chris Kennedy, "
57 "Hans Verkuil, Mauro Carvalho Chehab");
58 MODULE_LICENSE("GPL");
59
60 static int debug;
61 module_param(debug, bool, 0644);
62
63 MODULE_PARM_DESC(debug, "Debug level (0-1)");
64
65
66 struct saa711x_state {
67 struct v4l2_subdev sd;
68 v4l2_std_id std;
69 int input;
70 int output;
71 int enable;
72 int radio;
73 int bright;
74 int contrast;
75 int hue;
76 int sat;
77 int chroma_agc;
78 int width;
79 int height;
80 u32 ident;
81 u32 audclk_freq;
82 u32 crystal_freq;
83 u8 ucgc;
84 u8 cgcdiv;
85 u8 apll;
86 };
87
88 static inline struct saa711x_state *to_state(struct v4l2_subdev *sd)
89 {
90 return container_of(sd, struct saa711x_state, sd);
91 }
92
93 /* ----------------------------------------------------------------------- */
94
95 static inline int saa711x_write(struct v4l2_subdev *sd, u8 reg, u8 value)
96 {
97 struct i2c_client *client = v4l2_get_subdevdata(sd);
98
99 return i2c_smbus_write_byte_data(client, reg, value);
100 }
101
102 /* Sanity routine to check if a register is present */
103 static int saa711x_has_reg(const int id, const u8 reg)
104 {
105 if (id == V4L2_IDENT_SAA7111)
106 return reg < 0x20 && reg != 0x01 && reg != 0x0f &&
107 (reg < 0x13 || reg > 0x19) && reg != 0x1d && reg != 0x1e;
108 if (id == V4L2_IDENT_SAA7111A)
109 return reg < 0x20 && reg != 0x01 && reg != 0x0f &&
110 reg != 0x14 && reg != 0x18 && reg != 0x19 &&
111 reg != 0x1d && reg != 0x1e;
112
113 /* common for saa7113/4/5/8 */
114 if (unlikely((reg >= 0x3b && reg <= 0x3f) || reg == 0x5c || reg == 0x5f ||
115 reg == 0xa3 || reg == 0xa7 || reg == 0xab || reg == 0xaf || (reg >= 0xb5 && reg <= 0xb7) ||
116 reg == 0xd3 || reg == 0xd7 || reg == 0xdb || reg == 0xdf || (reg >= 0xe5 && reg <= 0xe7) ||
117 reg == 0x82 || (reg >= 0x89 && reg <= 0x8e)))
118 return 0;
119
120 switch (id) {
121 case V4L2_IDENT_SAA7113:
122 return reg != 0x14 && (reg < 0x18 || reg > 0x1e) && (reg < 0x20 || reg > 0x3f) &&
123 reg != 0x5d && reg < 0x63;
124 case V4L2_IDENT_SAA7114:
125 return (reg < 0x1a || reg > 0x1e) && (reg < 0x20 || reg > 0x2f) &&
126 (reg < 0x63 || reg > 0x7f) && reg != 0x33 && reg != 0x37 &&
127 reg != 0x81 && reg < 0xf0;
128 case V4L2_IDENT_SAA7115:
129 return (reg < 0x20 || reg > 0x2f) && reg != 0x65 && (reg < 0xfc || reg > 0xfe);
130 case V4L2_IDENT_SAA7118:
131 return (reg < 0x1a || reg > 0x1d) && (reg < 0x20 || reg > 0x22) &&
132 (reg < 0x26 || reg > 0x28) && reg != 0x33 && reg != 0x37 &&
133 (reg < 0x63 || reg > 0x7f) && reg != 0x81 && reg < 0xf0;
134 }
135 return 1;
136 }
137
138 static int saa711x_writeregs(struct v4l2_subdev *sd, const unsigned char *regs)
139 {
140 struct saa711x_state *state = to_state(sd);
141 unsigned char reg, data;
142
143 while (*regs != 0x00) {
144 reg = *(regs++);
145 data = *(regs++);
146
147 /* According with datasheets, reserved regs should be
148 filled with 0 - seems better not to touch on they */
149 if (saa711x_has_reg(state->ident, reg)) {
150 if (saa711x_write(sd, reg, data) < 0)
151 return -1;
152 } else {
153 v4l2_dbg(1, debug, sd, "tried to access reserved reg 0x%02x\n", reg);
154 }
155 }
156 return 0;
157 }
158
159 static inline int saa711x_read(struct v4l2_subdev *sd, u8 reg)
160 {
161 struct i2c_client *client = v4l2_get_subdevdata(sd);
162
163 return i2c_smbus_read_byte_data(client, reg);
164 }
165
166 /* ----------------------------------------------------------------------- */
167
168 /* SAA7111 initialization table */
169 static const unsigned char saa7111_init[] = {
170 R_01_INC_DELAY, 0x00, /* reserved */
171
172 /*front end */
173 R_02_INPUT_CNTL_1, 0xd0, /* FUSE=3, GUDL=2, MODE=0 */
174 R_03_INPUT_CNTL_2, 0x23, /* HLNRS=0, VBSL=1, WPOFF=0, HOLDG=0,
175 * GAFIX=0, GAI1=256, GAI2=256 */
176 R_04_INPUT_CNTL_3, 0x00, /* GAI1=256 */
177 R_05_INPUT_CNTL_4, 0x00, /* GAI2=256 */
178
179 /* decoder */
180 R_06_H_SYNC_START, 0xf3, /* HSB at 13(50Hz) / 17(60Hz)
181 * pixels after end of last line */
182 R_07_H_SYNC_STOP, 0xe8, /* HSS seems to be needed to
183 * work with NTSC, too */
184 R_08_SYNC_CNTL, 0xc8, /* AUFD=1, FSEL=1, EXFIL=0,
185 * VTRC=1, HPLL=0, VNOI=0 */
186 R_09_LUMA_CNTL, 0x01, /* BYPS=0, PREF=0, BPSS=0,
187 * VBLB=0, UPTCV=0, APER=1 */
188 R_0A_LUMA_BRIGHT_CNTL, 0x80,
189 R_0B_LUMA_CONTRAST_CNTL, 0x47, /* 0b - CONT=1.109 */
190 R_0C_CHROMA_SAT_CNTL, 0x40,
191 R_0D_CHROMA_HUE_CNTL, 0x00,
192 R_0E_CHROMA_CNTL_1, 0x01, /* 0e - CDTO=0, CSTD=0, DCCF=0,
193 * FCTC=0, CHBW=1 */
194 R_0F_CHROMA_GAIN_CNTL, 0x00, /* reserved */
195 R_10_CHROMA_CNTL_2, 0x48, /* 10 - OFTS=1, HDEL=0, VRLN=1, YDEL=0 */
196 R_11_MODE_DELAY_CNTL, 0x1c, /* 11 - GPSW=0, CM99=0, FECO=0, COMPO=1,
197 * OEYC=1, OEHV=1, VIPB=0, COLO=0 */
198 R_12_RT_SIGNAL_CNTL, 0x00, /* 12 - output control 2 */
199 R_13_RT_X_PORT_OUT_CNTL, 0x00, /* 13 - output control 3 */
200 R_14_ANAL_ADC_COMPAT_CNTL, 0x00,
201 R_15_VGATE_START_FID_CHG, 0x00,
202 R_16_VGATE_STOP, 0x00,
203 R_17_MISC_VGATE_CONF_AND_MSB, 0x00,
204
205 0x00, 0x00
206 };
207
208 /* SAA7113 init codes */
209 static const unsigned char saa7113_init[] = {
210 R_01_INC_DELAY, 0x08,
211 R_02_INPUT_CNTL_1, 0xc2,
212 R_03_INPUT_CNTL_2, 0x30,
213 R_04_INPUT_CNTL_3, 0x00,
214 R_05_INPUT_CNTL_4, 0x00,
215 R_06_H_SYNC_START, 0x89,
216 R_07_H_SYNC_STOP, 0x0d,
217 R_08_SYNC_CNTL, 0x88,
218 R_09_LUMA_CNTL, 0x01,
219 R_0A_LUMA_BRIGHT_CNTL, 0x80,
220 R_0B_LUMA_CONTRAST_CNTL, 0x47,
221 R_0C_CHROMA_SAT_CNTL, 0x40,
222 R_0D_CHROMA_HUE_CNTL, 0x00,
223 R_0E_CHROMA_CNTL_1, 0x01,
224 R_0F_CHROMA_GAIN_CNTL, 0x2a,
225 R_10_CHROMA_CNTL_2, 0x08,
226 R_11_MODE_DELAY_CNTL, 0x0c,
227 R_12_RT_SIGNAL_CNTL, 0x07,
228 R_13_RT_X_PORT_OUT_CNTL, 0x00,
229 R_14_ANAL_ADC_COMPAT_CNTL, 0x00,
230 R_15_VGATE_START_FID_CHG, 0x00,
231 R_16_VGATE_STOP, 0x00,
232 R_17_MISC_VGATE_CONF_AND_MSB, 0x00,
233
234 0x00, 0x00
235 };
236
237 /* If a value differs from the Hauppauge driver values, then the comment starts with
238 'was 0xXX' to denote the Hauppauge value. Otherwise the value is identical to what the
239 Hauppauge driver sets. */
240
241 /* SAA7114 and SAA7115 initialization table */
242 static const unsigned char saa7115_init_auto_input[] = {
243 /* Front-End Part */
244 R_01_INC_DELAY, 0x48, /* white peak control disabled */
245 R_03_INPUT_CNTL_2, 0x20, /* was 0x30. 0x20: long vertical blanking */
246 R_04_INPUT_CNTL_3, 0x90, /* analog gain set to 0 */
247 R_05_INPUT_CNTL_4, 0x90, /* analog gain set to 0 */
248 /* Decoder Part */
249 R_06_H_SYNC_START, 0xeb, /* horiz sync begin = -21 */
250 R_07_H_SYNC_STOP, 0xe0, /* horiz sync stop = -17 */
251 R_09_LUMA_CNTL, 0x53, /* 0x53, was 0x56 for 60hz. luminance control */
252 R_0A_LUMA_BRIGHT_CNTL, 0x80, /* was 0x88. decoder brightness, 0x80 is itu standard */
253 R_0B_LUMA_CONTRAST_CNTL, 0x44, /* was 0x48. decoder contrast, 0x44 is itu standard */
254 R_0C_CHROMA_SAT_CNTL, 0x40, /* was 0x47. decoder saturation, 0x40 is itu standard */
255 R_0D_CHROMA_HUE_CNTL, 0x00,
256 R_0F_CHROMA_GAIN_CNTL, 0x00, /* use automatic gain */
257 R_10_CHROMA_CNTL_2, 0x06, /* chroma: active adaptive combfilter */
258 R_11_MODE_DELAY_CNTL, 0x00,
259 R_12_RT_SIGNAL_CNTL, 0x9d, /* RTS0 output control: VGATE */
260 R_13_RT_X_PORT_OUT_CNTL, 0x80, /* ITU656 standard mode, RTCO output enable RTCE */
261 R_14_ANAL_ADC_COMPAT_CNTL, 0x00,
262 R_18_RAW_DATA_GAIN_CNTL, 0x40, /* gain 0x00 = nominal */
263 R_19_RAW_DATA_OFF_CNTL, 0x80,
264 R_1A_COLOR_KILL_LVL_CNTL, 0x77, /* recommended value */
265 R_1B_MISC_TVVCRDET, 0x42, /* recommended value */
266 R_1C_ENHAN_COMB_CTRL1, 0xa9, /* recommended value */
267 R_1D_ENHAN_COMB_CTRL2, 0x01, /* recommended value */
268
269
270 R_80_GLOBAL_CNTL_1, 0x0, /* No tasks enabled at init */
271
272 /* Power Device Control */
273 R_88_POWER_SAVE_ADC_PORT_CNTL, 0xd0, /* reset device */
274 R_88_POWER_SAVE_ADC_PORT_CNTL, 0xf0, /* set device programmed, all in operational mode */
275 0x00, 0x00
276 };
277
278 /* Used to reset saa7113, saa7114 and saa7115 */
279 static const unsigned char saa7115_cfg_reset_scaler[] = {
280 R_87_I_PORT_I_O_ENA_OUT_CLK_AND_GATED, 0x00, /* disable I-port output */
281 R_88_POWER_SAVE_ADC_PORT_CNTL, 0xd0, /* reset scaler */
282 R_88_POWER_SAVE_ADC_PORT_CNTL, 0xf0, /* activate scaler */
283 R_87_I_PORT_I_O_ENA_OUT_CLK_AND_GATED, 0x01, /* enable I-port output */
284 0x00, 0x00
285 };
286
287 /* ============== SAA7715 VIDEO templates ============= */
288
289 static const unsigned char saa7115_cfg_60hz_video[] = {
290 R_80_GLOBAL_CNTL_1, 0x00, /* reset tasks */
291 R_88_POWER_SAVE_ADC_PORT_CNTL, 0xd0, /* reset scaler */
292
293 R_15_VGATE_START_FID_CHG, 0x03,
294 R_16_VGATE_STOP, 0x11,
295 R_17_MISC_VGATE_CONF_AND_MSB, 0x9c,
296
297 R_08_SYNC_CNTL, 0x68, /* 0xBO: auto detection, 0x68 = NTSC */
298 R_0E_CHROMA_CNTL_1, 0x07, /* video autodetection is on */
299
300 R_5A_V_OFF_FOR_SLICER, 0x06, /* standard 60hz value for ITU656 line counting */
301
302 /* Task A */
303 R_90_A_TASK_HANDLING_CNTL, 0x80,
304 R_91_A_X_PORT_FORMATS_AND_CONF, 0x48,
305 R_92_A_X_PORT_INPUT_REFERENCE_SIGNAL, 0x40,
306 R_93_A_I_PORT_OUTPUT_FORMATS_AND_CONF, 0x84,
307
308 /* hoffset low (input), 0x0002 is minimum */
309 R_94_A_HORIZ_INPUT_WINDOW_START, 0x01,
310 R_95_A_HORIZ_INPUT_WINDOW_START_MSB, 0x00,
311
312 /* hsize low (input), 0x02d0 = 720 */
313 R_96_A_HORIZ_INPUT_WINDOW_LENGTH, 0xd0,
314 R_97_A_HORIZ_INPUT_WINDOW_LENGTH_MSB, 0x02,
315
316 R_98_A_VERT_INPUT_WINDOW_START, 0x05,
317 R_99_A_VERT_INPUT_WINDOW_START_MSB, 0x00,
318
319 R_9A_A_VERT_INPUT_WINDOW_LENGTH, 0x0c,
320 R_9B_A_VERT_INPUT_WINDOW_LENGTH_MSB, 0x00,
321
322 R_9C_A_HORIZ_OUTPUT_WINDOW_LENGTH, 0xa0,
323 R_9D_A_HORIZ_OUTPUT_WINDOW_LENGTH_MSB, 0x05,
324
325 R_9E_A_VERT_OUTPUT_WINDOW_LENGTH, 0x0c,
326 R_9F_A_VERT_OUTPUT_WINDOW_LENGTH_MSB, 0x00,
327
328 /* Task B */
329 R_C0_B_TASK_HANDLING_CNTL, 0x00,
330 R_C1_B_X_PORT_FORMATS_AND_CONF, 0x08,
331 R_C2_B_INPUT_REFERENCE_SIGNAL_DEFINITION, 0x00,
332 R_C3_B_I_PORT_FORMATS_AND_CONF, 0x80,
333
334 /* 0x0002 is minimum */
335 R_C4_B_HORIZ_INPUT_WINDOW_START, 0x02,
336 R_C5_B_HORIZ_INPUT_WINDOW_START_MSB, 0x00,
337
338 /* 0x02d0 = 720 */
339 R_C6_B_HORIZ_INPUT_WINDOW_LENGTH, 0xd0,
340 R_C7_B_HORIZ_INPUT_WINDOW_LENGTH_MSB, 0x02,
341
342 /* vwindow start 0x12 = 18 */
343 R_C8_B_VERT_INPUT_WINDOW_START, 0x12,
344 R_C9_B_VERT_INPUT_WINDOW_START_MSB, 0x00,
345
346 /* vwindow length 0xf8 = 248 */
347 R_CA_B_VERT_INPUT_WINDOW_LENGTH, VRES_60HZ>>1,
348 R_CB_B_VERT_INPUT_WINDOW_LENGTH_MSB, VRES_60HZ>>9,
349
350 /* hwindow 0x02d0 = 720 */
351 R_CC_B_HORIZ_OUTPUT_WINDOW_LENGTH, 0xd0,
352 R_CD_B_HORIZ_OUTPUT_WINDOW_LENGTH_MSB, 0x02,
353
354 R_F0_LFCO_PER_LINE, 0xad, /* Set PLL Register. 60hz 525 lines per frame, 27 MHz */
355 R_F1_P_I_PARAM_SELECT, 0x05, /* low bit with 0xF0 */
356 R_F5_PULSGEN_LINE_LENGTH, 0xad,
357 R_F6_PULSE_A_POS_LSB_AND_PULSEGEN_CONFIG, 0x01,
358
359 0x00, 0x00
360 };
361
362 static const unsigned char saa7115_cfg_50hz_video[] = {
363 R_80_GLOBAL_CNTL_1, 0x00,
364 R_88_POWER_SAVE_ADC_PORT_CNTL, 0xd0, /* reset scaler */
365
366 R_15_VGATE_START_FID_CHG, 0x37, /* VGATE start */
367 R_16_VGATE_STOP, 0x16,
368 R_17_MISC_VGATE_CONF_AND_MSB, 0x99,
369
370 R_08_SYNC_CNTL, 0x28, /* 0x28 = PAL */
371 R_0E_CHROMA_CNTL_1, 0x07,
372
373 R_5A_V_OFF_FOR_SLICER, 0x03, /* standard 50hz value */
374
375 /* Task A */
376 R_90_A_TASK_HANDLING_CNTL, 0x81,
377 R_91_A_X_PORT_FORMATS_AND_CONF, 0x48,
378 R_92_A_X_PORT_INPUT_REFERENCE_SIGNAL, 0x40,
379 R_93_A_I_PORT_OUTPUT_FORMATS_AND_CONF, 0x84,
380
381 /* This is weird: the datasheet says that you should use 2 as the minimum value, */
382 /* but Hauppauge uses 0, and changing that to 2 causes indeed problems (for 50hz) */
383 /* hoffset low (input), 0x0002 is minimum */
384 R_94_A_HORIZ_INPUT_WINDOW_START, 0x00,
385 R_95_A_HORIZ_INPUT_WINDOW_START_MSB, 0x00,
386
387 /* hsize low (input), 0x02d0 = 720 */
388 R_96_A_HORIZ_INPUT_WINDOW_LENGTH, 0xd0,
389 R_97_A_HORIZ_INPUT_WINDOW_LENGTH_MSB, 0x02,
390
391 R_98_A_VERT_INPUT_WINDOW_START, 0x03,
392 R_99_A_VERT_INPUT_WINDOW_START_MSB, 0x00,
393
394 /* vsize 0x12 = 18 */
395 R_9A_A_VERT_INPUT_WINDOW_LENGTH, 0x12,
396 R_9B_A_VERT_INPUT_WINDOW_LENGTH_MSB, 0x00,
397
398 /* hsize 0x05a0 = 1440 */
399 R_9C_A_HORIZ_OUTPUT_WINDOW_LENGTH, 0xa0,
400 R_9D_A_HORIZ_OUTPUT_WINDOW_LENGTH_MSB, 0x05, /* hsize hi (output) */
401 R_9E_A_VERT_OUTPUT_WINDOW_LENGTH, 0x12, /* vsize low (output), 0x12 = 18 */
402 R_9F_A_VERT_OUTPUT_WINDOW_LENGTH_MSB, 0x00, /* vsize hi (output) */
403
404 /* Task B */
405 R_C0_B_TASK_HANDLING_CNTL, 0x00,
406 R_C1_B_X_PORT_FORMATS_AND_CONF, 0x08,
407 R_C2_B_INPUT_REFERENCE_SIGNAL_DEFINITION, 0x00,
408 R_C3_B_I_PORT_FORMATS_AND_CONF, 0x80,
409
410 /* This is weird: the datasheet says that you should use 2 as the minimum value, */
411 /* but Hauppauge uses 0, and changing that to 2 causes indeed problems (for 50hz) */
412 /* hoffset low (input), 0x0002 is minimum. See comment above. */
413 R_C4_B_HORIZ_INPUT_WINDOW_START, 0x00,
414 R_C5_B_HORIZ_INPUT_WINDOW_START_MSB, 0x00,
415
416 /* hsize 0x02d0 = 720 */
417 R_C6_B_HORIZ_INPUT_WINDOW_LENGTH, 0xd0,
418 R_C7_B_HORIZ_INPUT_WINDOW_LENGTH_MSB, 0x02,
419
420 /* voffset 0x16 = 22 */
421 R_C8_B_VERT_INPUT_WINDOW_START, 0x16,
422 R_C9_B_VERT_INPUT_WINDOW_START_MSB, 0x00,
423
424 /* vsize 0x0120 = 288 */
425 R_CA_B_VERT_INPUT_WINDOW_LENGTH, 0x20,
426 R_CB_B_VERT_INPUT_WINDOW_LENGTH_MSB, 0x01,
427
428 /* hsize 0x02d0 = 720 */
429 R_CC_B_HORIZ_OUTPUT_WINDOW_LENGTH, 0xd0,
430 R_CD_B_HORIZ_OUTPUT_WINDOW_LENGTH_MSB, 0x02,
431
432 R_F0_LFCO_PER_LINE, 0xb0, /* Set PLL Register. 50hz 625 lines per frame, 27 MHz */
433 R_F1_P_I_PARAM_SELECT, 0x05, /* low bit with 0xF0, (was 0x05) */
434 R_F5_PULSGEN_LINE_LENGTH, 0xb0,
435 R_F6_PULSE_A_POS_LSB_AND_PULSEGEN_CONFIG, 0x01,
436
437 0x00, 0x00
438 };
439
440 /* ============== SAA7715 VIDEO templates (end) ======= */
441
442 static const unsigned char saa7115_cfg_vbi_on[] = {
443 R_80_GLOBAL_CNTL_1, 0x00, /* reset tasks */
444 R_88_POWER_SAVE_ADC_PORT_CNTL, 0xd0, /* reset scaler */
445 R_80_GLOBAL_CNTL_1, 0x30, /* Activate both tasks */
446 R_88_POWER_SAVE_ADC_PORT_CNTL, 0xf0, /* activate scaler */
447 R_87_I_PORT_I_O_ENA_OUT_CLK_AND_GATED, 0x01, /* Enable I-port output */
448
449 0x00, 0x00
450 };
451
452 static const unsigned char saa7115_cfg_vbi_off[] = {
453 R_80_GLOBAL_CNTL_1, 0x00, /* reset tasks */
454 R_88_POWER_SAVE_ADC_PORT_CNTL, 0xd0, /* reset scaler */
455 R_80_GLOBAL_CNTL_1, 0x20, /* Activate only task "B" */
456 R_88_POWER_SAVE_ADC_PORT_CNTL, 0xf0, /* activate scaler */
457 R_87_I_PORT_I_O_ENA_OUT_CLK_AND_GATED, 0x01, /* Enable I-port output */
458
459 0x00, 0x00
460 };
461
462
463 static const unsigned char saa7115_init_misc[] = {
464 R_81_V_SYNC_FLD_ID_SRC_SEL_AND_RETIMED_V_F, 0x01,
465 R_83_X_PORT_I_O_ENA_AND_OUT_CLK, 0x01,
466 R_84_I_PORT_SIGNAL_DEF, 0x20,
467 R_85_I_PORT_SIGNAL_POLAR, 0x21,
468 R_86_I_PORT_FIFO_FLAG_CNTL_AND_ARBIT, 0xc5,
469 R_87_I_PORT_I_O_ENA_OUT_CLK_AND_GATED, 0x01,
470
471 /* Task A */
472 R_A0_A_HORIZ_PRESCALING, 0x01,
473 R_A1_A_ACCUMULATION_LENGTH, 0x00,
474 R_A2_A_PRESCALER_DC_GAIN_AND_FIR_PREFILTER, 0x00,
475
476 /* Configure controls at nominal value*/
477 R_A4_A_LUMA_BRIGHTNESS_CNTL, 0x80,
478 R_A5_A_LUMA_CONTRAST_CNTL, 0x40,
479 R_A6_A_CHROMA_SATURATION_CNTL, 0x40,
480
481 /* note: 2 x zoom ensures that VBI lines have same length as video lines. */
482 R_A8_A_HORIZ_LUMA_SCALING_INC, 0x00,
483 R_A9_A_HORIZ_LUMA_SCALING_INC_MSB, 0x02,
484
485 R_AA_A_HORIZ_LUMA_PHASE_OFF, 0x00,
486
487 /* must be horiz lum scaling / 2 */
488 R_AC_A_HORIZ_CHROMA_SCALING_INC, 0x00,
489 R_AD_A_HORIZ_CHROMA_SCALING_INC_MSB, 0x01,
490
491 /* must be offset luma / 2 */
492 R_AE_A_HORIZ_CHROMA_PHASE_OFF, 0x00,
493
494 R_B0_A_VERT_LUMA_SCALING_INC, 0x00,
495 R_B1_A_VERT_LUMA_SCALING_INC_MSB, 0x04,
496
497 R_B2_A_VERT_CHROMA_SCALING_INC, 0x00,
498 R_B3_A_VERT_CHROMA_SCALING_INC_MSB, 0x04,
499
500 R_B4_A_VERT_SCALING_MODE_CNTL, 0x01,
501
502 R_B8_A_VERT_CHROMA_PHASE_OFF_00, 0x00,
503 R_B9_A_VERT_CHROMA_PHASE_OFF_01, 0x00,
504 R_BA_A_VERT_CHROMA_PHASE_OFF_10, 0x00,
505 R_BB_A_VERT_CHROMA_PHASE_OFF_11, 0x00,
506
507 R_BC_A_VERT_LUMA_PHASE_OFF_00, 0x00,
508 R_BD_A_VERT_LUMA_PHASE_OFF_01, 0x00,
509 R_BE_A_VERT_LUMA_PHASE_OFF_10, 0x00,
510 R_BF_A_VERT_LUMA_PHASE_OFF_11, 0x00,
511
512 /* Task B */
513 R_D0_B_HORIZ_PRESCALING, 0x01,
514 R_D1_B_ACCUMULATION_LENGTH, 0x00,
515 R_D2_B_PRESCALER_DC_GAIN_AND_FIR_PREFILTER, 0x00,
516
517 /* Configure controls at nominal value*/
518 R_D4_B_LUMA_BRIGHTNESS_CNTL, 0x80,
519 R_D5_B_LUMA_CONTRAST_CNTL, 0x40,
520 R_D6_B_CHROMA_SATURATION_CNTL, 0x40,
521
522 /* hor lum scaling 0x0400 = 1 */
523 R_D8_B_HORIZ_LUMA_SCALING_INC, 0x00,
524 R_D9_B_HORIZ_LUMA_SCALING_INC_MSB, 0x04,
525
526 R_DA_B_HORIZ_LUMA_PHASE_OFF, 0x00,
527
528 /* must be hor lum scaling / 2 */
529 R_DC_B_HORIZ_CHROMA_SCALING, 0x00,
530 R_DD_B_HORIZ_CHROMA_SCALING_MSB, 0x02,
531
532 /* must be offset luma / 2 */
533 R_DE_B_HORIZ_PHASE_OFFSET_CRHOMA, 0x00,
534
535 R_E0_B_VERT_LUMA_SCALING_INC, 0x00,
536 R_E1_B_VERT_LUMA_SCALING_INC_MSB, 0x04,
537
538 R_E2_B_VERT_CHROMA_SCALING_INC, 0x00,
539 R_E3_B_VERT_CHROMA_SCALING_INC_MSB, 0x04,
540
541 R_E4_B_VERT_SCALING_MODE_CNTL, 0x01,
542
543 R_E8_B_VERT_CHROMA_PHASE_OFF_00, 0x00,
544 R_E9_B_VERT_CHROMA_PHASE_OFF_01, 0x00,
545 R_EA_B_VERT_CHROMA_PHASE_OFF_10, 0x00,
546 R_EB_B_VERT_CHROMA_PHASE_OFF_11, 0x00,
547
548 R_EC_B_VERT_LUMA_PHASE_OFF_00, 0x00,
549 R_ED_B_VERT_LUMA_PHASE_OFF_01, 0x00,
550 R_EE_B_VERT_LUMA_PHASE_OFF_10, 0x00,
551 R_EF_B_VERT_LUMA_PHASE_OFF_11, 0x00,
552
553 R_F2_NOMINAL_PLL2_DTO, 0x50, /* crystal clock = 24.576 MHz, target = 27MHz */
554 R_F3_PLL_INCREMENT, 0x46,
555 R_F4_PLL2_STATUS, 0x00,
556 R_F7_PULSE_A_POS_MSB, 0x4b, /* not the recommended settings! */
557 R_F8_PULSE_B_POS, 0x00,
558 R_F9_PULSE_B_POS_MSB, 0x4b,
559 R_FA_PULSE_C_POS, 0x00,
560 R_FB_PULSE_C_POS_MSB, 0x4b,
561
562 /* PLL2 lock detection settings: 71 lines 50% phase error */
563 R_FF_S_PLL_MAX_PHASE_ERR_THRESH_NUM_LINES, 0x88,
564
565 /* Turn off VBI */
566 R_40_SLICER_CNTL_1, 0x20, /* No framing code errors allowed. */
567 R_41_LCR_BASE, 0xff,
568 R_41_LCR_BASE+1, 0xff,
569 R_41_LCR_BASE+2, 0xff,
570 R_41_LCR_BASE+3, 0xff,
571 R_41_LCR_BASE+4, 0xff,
572 R_41_LCR_BASE+5, 0xff,
573 R_41_LCR_BASE+6, 0xff,
574 R_41_LCR_BASE+7, 0xff,
575 R_41_LCR_BASE+8, 0xff,
576 R_41_LCR_BASE+9, 0xff,
577 R_41_LCR_BASE+10, 0xff,
578 R_41_LCR_BASE+11, 0xff,
579 R_41_LCR_BASE+12, 0xff,
580 R_41_LCR_BASE+13, 0xff,
581 R_41_LCR_BASE+14, 0xff,
582 R_41_LCR_BASE+15, 0xff,
583 R_41_LCR_BASE+16, 0xff,
584 R_41_LCR_BASE+17, 0xff,
585 R_41_LCR_BASE+18, 0xff,
586 R_41_LCR_BASE+19, 0xff,
587 R_41_LCR_BASE+20, 0xff,
588 R_41_LCR_BASE+21, 0xff,
589 R_41_LCR_BASE+22, 0xff,
590 R_58_PROGRAM_FRAMING_CODE, 0x40,
591 R_59_H_OFF_FOR_SLICER, 0x47,
592 R_5B_FLD_OFF_AND_MSB_FOR_H_AND_V_OFF, 0x83,
593 R_5D_DID, 0xbd,
594 R_5E_SDID, 0x35,
595
596 R_02_INPUT_CNTL_1, 0xc4, /* input tuner -> input 4, amplifier active */
597
598 R_80_GLOBAL_CNTL_1, 0x20, /* enable task B */
599 R_88_POWER_SAVE_ADC_PORT_CNTL, 0xd0,
600 R_88_POWER_SAVE_ADC_PORT_CNTL, 0xf0,
601 0x00, 0x00
602 };
603
604 static int saa711x_odd_parity(u8 c)
605 {
606 c ^= (c >> 4);
607 c ^= (c >> 2);
608 c ^= (c >> 1);
609
610 return c & 1;
611 }
612
613 static int saa711x_decode_vps(u8 *dst, u8 *p)
614 {
615 static const u8 biphase_tbl[] = {
616 0xf0, 0x78, 0x70, 0xf0, 0xb4, 0x3c, 0x34, 0xb4,
617 0xb0, 0x38, 0x30, 0xb0, 0xf0, 0x78, 0x70, 0xf0,
618 0xd2, 0x5a, 0x52, 0xd2, 0x96, 0x1e, 0x16, 0x96,
619 0x92, 0x1a, 0x12, 0x92, 0xd2, 0x5a, 0x52, 0xd2,
620 0xd0, 0x58, 0x50, 0xd0, 0x94, 0x1c, 0x14, 0x94,
621 0x90, 0x18, 0x10, 0x90, 0xd0, 0x58, 0x50, 0xd0,
622 0xf0, 0x78, 0x70, 0xf0, 0xb4, 0x3c, 0x34, 0xb4,
623 0xb0, 0x38, 0x30, 0xb0, 0xf0, 0x78, 0x70, 0xf0,
624 0xe1, 0x69, 0x61, 0xe1, 0xa5, 0x2d, 0x25, 0xa5,
625 0xa1, 0x29, 0x21, 0xa1, 0xe1, 0x69, 0x61, 0xe1,
626 0xc3, 0x4b, 0x43, 0xc3, 0x87, 0x0f, 0x07, 0x87,
627 0x83, 0x0b, 0x03, 0x83, 0xc3, 0x4b, 0x43, 0xc3,
628 0xc1, 0x49, 0x41, 0xc1, 0x85, 0x0d, 0x05, 0x85,
629 0x81, 0x09, 0x01, 0x81, 0xc1, 0x49, 0x41, 0xc1,
630 0xe1, 0x69, 0x61, 0xe1, 0xa5, 0x2d, 0x25, 0xa5,
631 0xa1, 0x29, 0x21, 0xa1, 0xe1, 0x69, 0x61, 0xe1,
632 0xe0, 0x68, 0x60, 0xe0, 0xa4, 0x2c, 0x24, 0xa4,
633 0xa0, 0x28, 0x20, 0xa0, 0xe0, 0x68, 0x60, 0xe0,
634 0xc2, 0x4a, 0x42, 0xc2, 0x86, 0x0e, 0x06, 0x86,
635 0x82, 0x0a, 0x02, 0x82, 0xc2, 0x4a, 0x42, 0xc2,
636 0xc0, 0x48, 0x40, 0xc0, 0x84, 0x0c, 0x04, 0x84,
637 0x80, 0x08, 0x00, 0x80, 0xc0, 0x48, 0x40, 0xc0,
638 0xe0, 0x68, 0x60, 0xe0, 0xa4, 0x2c, 0x24, 0xa4,
639 0xa0, 0x28, 0x20, 0xa0, 0xe0, 0x68, 0x60, 0xe0,
640 0xf0, 0x78, 0x70, 0xf0, 0xb4, 0x3c, 0x34, 0xb4,
641 0xb0, 0x38, 0x30, 0xb0, 0xf0, 0x78, 0x70, 0xf0,
642 0xd2, 0x5a, 0x52, 0xd2, 0x96, 0x1e, 0x16, 0x96,
643 0x92, 0x1a, 0x12, 0x92, 0xd2, 0x5a, 0x52, 0xd2,
644 0xd0, 0x58, 0x50, 0xd0, 0x94, 0x1c, 0x14, 0x94,
645 0x90, 0x18, 0x10, 0x90, 0xd0, 0x58, 0x50, 0xd0,
646 0xf0, 0x78, 0x70, 0xf0, 0xb4, 0x3c, 0x34, 0xb4,
647 0xb0, 0x38, 0x30, 0xb0, 0xf0, 0x78, 0x70, 0xf0,
648 };
649 int i;
650 u8 c, err = 0;
651
652 for (i = 0; i < 2 * 13; i += 2) {
653 err |= biphase_tbl[p[i]] | biphase_tbl[p[i + 1]];
654 c = (biphase_tbl[p[i + 1]] & 0xf) | ((biphase_tbl[p[i]] & 0xf) << 4);
655 dst[i / 2] = c;
656 }
657 return err & 0xf0;
658 }
659
660 static int saa711x_decode_wss(u8 *p)
661 {
662 static const int wss_bits[8] = {
663 0, 0, 0, 1, 0, 1, 1, 1
664 };
665 unsigned char parity;
666 int wss = 0;
667 int i;
668
669 for (i = 0; i < 16; i++) {
670 int b1 = wss_bits[p[i] & 7];
671 int b2 = wss_bits[(p[i] >> 3) & 7];
672
673 if (b1 == b2)
674 return -1;
675 wss |= b2 << i;
676 }
677 parity = wss & 15;
678 parity ^= parity >> 2;
679 parity ^= parity >> 1;
680
681 if (!(parity & 1))
682 return -1;
683
684 return wss;
685 }
686
687 static int saa711x_s_clock_freq(struct v4l2_subdev *sd, u32 freq)
688 {
689 struct saa711x_state *state = to_state(sd);
690 u32 acpf;
691 u32 acni;
692 u32 hz;
693 u64 f;
694 u8 acc = 0; /* reg 0x3a, audio clock control */
695
696 /* Checks for chips that don't have audio clock (saa7111, saa7113) */
697 if (!saa711x_has_reg(state->ident, R_30_AUD_MAST_CLK_CYCLES_PER_FIELD))
698 return 0;
699
700 v4l2_dbg(1, debug, sd, "set audio clock freq: %d\n", freq);
701
702 /* sanity check */
703 if (freq < 32000 || freq > 48000)
704 return -EINVAL;
705
706 /* hz is the refresh rate times 100 */
707 hz = (state->std & V4L2_STD_525_60) ? 5994 : 5000;
708 /* acpf = (256 * freq) / field_frequency == (256 * 100 * freq) / hz */
709 acpf = (25600 * freq) / hz;
710 /* acni = (256 * freq * 2^23) / crystal_frequency =
711 (freq * 2^(8+23)) / crystal_frequency =
712 (freq << 31) / crystal_frequency */
713 f = freq;
714 f = f << 31;
715 do_div(f, state->crystal_freq);
716 acni = f;
717 if (state->ucgc) {
718 acpf = acpf * state->cgcdiv / 16;
719 acni = acni * state->cgcdiv / 16;
720 acc = 0x80;
721 if (state->cgcdiv == 3)
722 acc |= 0x40;
723 }
724 if (state->apll)
725 acc |= 0x08;
726
727 saa711x_write(sd, R_38_CLK_RATIO_AMXCLK_TO_ASCLK, 0x03);
728 saa711x_write(sd, R_39_CLK_RATIO_ASCLK_TO_ALRCLK, 0x10);
729 saa711x_write(sd, R_3A_AUD_CLK_GEN_BASIC_SETUP, acc);
730
731 saa711x_write(sd, R_30_AUD_MAST_CLK_CYCLES_PER_FIELD, acpf & 0xff);
732 saa711x_write(sd, R_30_AUD_MAST_CLK_CYCLES_PER_FIELD+1,
733 (acpf >> 8) & 0xff);
734 saa711x_write(sd, R_30_AUD_MAST_CLK_CYCLES_PER_FIELD+2,
735 (acpf >> 16) & 0x03);
736
737 saa711x_write(sd, R_34_AUD_MAST_CLK_NOMINAL_INC, acni & 0xff);
738 saa711x_write(sd, R_34_AUD_MAST_CLK_NOMINAL_INC+1, (acni >> 8) & 0xff);
739 saa711x_write(sd, R_34_AUD_MAST_CLK_NOMINAL_INC+2, (acni >> 16) & 0x3f);
740 state->audclk_freq = freq;
741 return 0;
742 }
743
744 static int saa711x_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
745 {
746 struct saa711x_state *state = to_state(sd);
747 u8 val;
748
749 switch (ctrl->id) {
750 case V4L2_CID_BRIGHTNESS:
751 if (ctrl->value < 0 || ctrl->value > 255) {
752 v4l2_err(sd, "invalid brightness setting %d\n", ctrl->value);
753 return -ERANGE;
754 }
755
756 state->bright = ctrl->value;
757 saa711x_write(sd, R_0A_LUMA_BRIGHT_CNTL, state->bright);
758 break;
759
760 case V4L2_CID_CONTRAST:
761 if (ctrl->value < 0 || ctrl->value > 127) {
762 v4l2_err(sd, "invalid contrast setting %d\n", ctrl->value);
763 return -ERANGE;
764 }
765
766 state->contrast = ctrl->value;
767 saa711x_write(sd, R_0B_LUMA_CONTRAST_CNTL, state->contrast);
768 break;
769
770 case V4L2_CID_SATURATION:
771 if (ctrl->value < 0 || ctrl->value > 127) {
772 v4l2_err(sd, "invalid saturation setting %d\n", ctrl->value);
773 return -ERANGE;
774 }
775
776 state->sat = ctrl->value;
777 saa711x_write(sd, R_0C_CHROMA_SAT_CNTL, state->sat);
778 break;
779
780 case V4L2_CID_HUE:
781 if (ctrl->value < -128 || ctrl->value > 127) {
782 v4l2_err(sd, "invalid hue setting %d\n", ctrl->value);
783 return -ERANGE;
784 }
785
786 state->hue = ctrl->value;
787 saa711x_write(sd, R_0D_CHROMA_HUE_CNTL, state->hue);
788 break;
789 case V4L2_CID_CHROMA_AGC:
790 val = saa711x_read(sd, R_0F_CHROMA_GAIN_CNTL);
791 state->chroma_agc = ctrl->value;
792 if (ctrl->value)
793 val &= 0x7f;
794 else
795 val |= 0x80;
796 saa711x_write(sd, R_0F_CHROMA_GAIN_CNTL, val);
797 break;
798 case V4L2_CID_CHROMA_GAIN:
799 /* Chroma gain cannot be set when AGC is enabled */
800 if (state->chroma_agc == 1)
801 return -EINVAL;
802 saa711x_write(sd, R_0F_CHROMA_GAIN_CNTL, ctrl->value | 0x80);
803 break;
804 default:
805 return -EINVAL;
806 }
807
808 return 0;
809 }
810
811 static int saa711x_g_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
812 {
813 struct saa711x_state *state = to_state(sd);
814
815 switch (ctrl->id) {
816 case V4L2_CID_BRIGHTNESS:
817 ctrl->value = state->bright;
818 break;
819 case V4L2_CID_CONTRAST:
820 ctrl->value = state->contrast;
821 break;
822 case V4L2_CID_SATURATION:
823 ctrl->value = state->sat;
824 break;
825 case V4L2_CID_HUE:
826 ctrl->value = state->hue;
827 break;
828 case V4L2_CID_CHROMA_AGC:
829 ctrl->value = state->chroma_agc;
830 break;
831 case V4L2_CID_CHROMA_GAIN:
832 ctrl->value = saa711x_read(sd, R_0F_CHROMA_GAIN_CNTL) & 0x7f;
833 break;
834 default:
835 return -EINVAL;
836 }
837
838 return 0;
839 }
840
841 static int saa711x_set_size(struct v4l2_subdev *sd, int width, int height)
842 {
843 struct saa711x_state *state = to_state(sd);
844 int HPSC, HFSC;
845 int VSCY;
846 int res;
847 int is_50hz = state->std & V4L2_STD_625_50;
848 int Vsrc = is_50hz ? 576 : 480;
849
850 v4l2_dbg(1, debug, sd, "decoder set size to %ix%i\n", width, height);
851
852 /* FIXME need better bounds checking here */
853 if ((width < 1) || (width > 1440))
854 return -EINVAL;
855 if ((height < 1) || (height > Vsrc))
856 return -EINVAL;
857
858 if (!saa711x_has_reg(state->ident, R_D0_B_HORIZ_PRESCALING)) {
859 /* Decoder only supports 720 columns and 480 or 576 lines */
860 if (width != 720)
861 return -EINVAL;
862 if (height != Vsrc)
863 return -EINVAL;
864 }
865
866 state->width = width;
867 state->height = height;
868
869 if (!saa711x_has_reg(state->ident, R_CC_B_HORIZ_OUTPUT_WINDOW_LENGTH))
870 return 0;
871
872 /* probably have a valid size, let's set it */
873 /* Set output width/height */
874 /* width */
875
876 saa711x_write(sd, R_CC_B_HORIZ_OUTPUT_WINDOW_LENGTH,
877 (u8) (width & 0xff));
878 saa711x_write(sd, R_CD_B_HORIZ_OUTPUT_WINDOW_LENGTH_MSB,
879 (u8) ((width >> 8) & 0xff));
880
881 /* Vertical Scaling uses height/2 */
882 res = height / 2;
883
884 /* On 60Hz, it is using a higher Vertical Output Size */
885 if (!is_50hz)
886 res += (VRES_60HZ - 480) >> 1;
887
888 /* height */
889 saa711x_write(sd, R_CE_B_VERT_OUTPUT_WINDOW_LENGTH,
890 (u8) (res & 0xff));
891 saa711x_write(sd, R_CF_B_VERT_OUTPUT_WINDOW_LENGTH_MSB,
892 (u8) ((res >> 8) & 0xff));
893
894 /* Scaling settings */
895 /* Hprescaler is floor(inres/outres) */
896 HPSC = (int)(720 / width);
897 /* 0 is not allowed (div. by zero) */
898 HPSC = HPSC ? HPSC : 1;
899 HFSC = (int)((1024 * 720) / (HPSC * width));
900 /* FIXME hardcodes to "Task B"
901 * write H prescaler integer */
902 saa711x_write(sd, R_D0_B_HORIZ_PRESCALING,
903 (u8) (HPSC & 0x3f));
904
905 v4l2_dbg(1, debug, sd, "Hpsc: 0x%05x, Hfsc: 0x%05x\n", HPSC, HFSC);
906 /* write H fine-scaling (luminance) */
907 saa711x_write(sd, R_D8_B_HORIZ_LUMA_SCALING_INC,
908 (u8) (HFSC & 0xff));
909 saa711x_write(sd, R_D9_B_HORIZ_LUMA_SCALING_INC_MSB,
910 (u8) ((HFSC >> 8) & 0xff));
911 /* write H fine-scaling (chrominance)
912 * must be lum/2, so i'll just bitshift :) */
913 saa711x_write(sd, R_DC_B_HORIZ_CHROMA_SCALING,
914 (u8) ((HFSC >> 1) & 0xff));
915 saa711x_write(sd, R_DD_B_HORIZ_CHROMA_SCALING_MSB,
916 (u8) ((HFSC >> 9) & 0xff));
917
918 VSCY = (int)((1024 * Vsrc) / height);
919 v4l2_dbg(1, debug, sd, "Vsrc: %d, Vscy: 0x%05x\n", Vsrc, VSCY);
920
921 /* Correct Contrast and Luminance */
922 saa711x_write(sd, R_D5_B_LUMA_CONTRAST_CNTL,
923 (u8) (64 * 1024 / VSCY));
924 saa711x_write(sd, R_D6_B_CHROMA_SATURATION_CNTL,
925 (u8) (64 * 1024 / VSCY));
926
927 /* write V fine-scaling (luminance) */
928 saa711x_write(sd, R_E0_B_VERT_LUMA_SCALING_INC,
929 (u8) (VSCY & 0xff));
930 saa711x_write(sd, R_E1_B_VERT_LUMA_SCALING_INC_MSB,
931 (u8) ((VSCY >> 8) & 0xff));
932 /* write V fine-scaling (chrominance) */
933 saa711x_write(sd, R_E2_B_VERT_CHROMA_SCALING_INC,
934 (u8) (VSCY & 0xff));
935 saa711x_write(sd, R_E3_B_VERT_CHROMA_SCALING_INC_MSB,
936 (u8) ((VSCY >> 8) & 0xff));
937
938 saa711x_writeregs(sd, saa7115_cfg_reset_scaler);
939
940 /* Activates task "B" */
941 saa711x_write(sd, R_80_GLOBAL_CNTL_1,
942 saa711x_read(sd, R_80_GLOBAL_CNTL_1) | 0x20);
943
944 return 0;
945 }
946
947 static void saa711x_set_v4lstd(struct v4l2_subdev *sd, v4l2_std_id std)
948 {
949 struct saa711x_state *state = to_state(sd);
950
951 /* Prevent unnecessary standard changes. During a standard
952 change the I-Port is temporarily disabled. Any devices
953 reading from that port can get confused.
954 Note that s_std is also used to switch from
955 radio to TV mode, so if a s_std is broadcast to
956 all I2C devices then you do not want to have an unwanted
957 side-effect here. */
958 if (std == state->std)
959 return;
960
961 state->std = std;
962
963 // This works for NTSC-M, SECAM-L and the 50Hz PAL variants.
964 if (std & V4L2_STD_525_60) {
965 v4l2_dbg(1, debug, sd, "decoder set standard 60 Hz\n");
966 saa711x_writeregs(sd, saa7115_cfg_60hz_video);
967 saa711x_set_size(sd, 720, 480);
968 } else {
969 v4l2_dbg(1, debug, sd, "decoder set standard 50 Hz\n");
970 saa711x_writeregs(sd, saa7115_cfg_50hz_video);
971 saa711x_set_size(sd, 720, 576);
972 }
973
974 /* Register 0E - Bits D6-D4 on NO-AUTO mode
975 (SAA7111 and SAA7113 doesn't have auto mode)
976 50 Hz / 625 lines 60 Hz / 525 lines
977 000 PAL BGDHI (4.43Mhz) NTSC M (3.58MHz)
978 001 NTSC 4.43 (50 Hz) PAL 4.43 (60 Hz)
979 010 Combination-PAL N (3.58MHz) NTSC 4.43 (60 Hz)
980 011 NTSC N (3.58MHz) PAL M (3.58MHz)
981 100 reserved NTSC-Japan (3.58MHz)
982 */
983 if (state->ident <= V4L2_IDENT_SAA7113) {
984 u8 reg = saa711x_read(sd, R_0E_CHROMA_CNTL_1) & 0x8f;
985
986 if (std == V4L2_STD_PAL_M) {
987 reg |= 0x30;
988 } else if (std == V4L2_STD_PAL_Nc) {
989 reg |= 0x20;
990 } else if (std == V4L2_STD_PAL_60) {
991 reg |= 0x10;
992 } else if (std == V4L2_STD_NTSC_M_JP) {
993 reg |= 0x40;
994 } else if (std & V4L2_STD_SECAM) {
995 reg |= 0x50;
996 }
997 saa711x_write(sd, R_0E_CHROMA_CNTL_1, reg);
998 } else {
999 /* restart task B if needed */
1000 int taskb = saa711x_read(sd, R_80_GLOBAL_CNTL_1) & 0x10;
1001
1002 if (taskb && state->ident == V4L2_IDENT_SAA7114) {
1003 saa711x_writeregs(sd, saa7115_cfg_vbi_on);
1004 }
1005
1006 /* switch audio mode too! */
1007 saa711x_s_clock_freq(sd, state->audclk_freq);
1008 }
1009 }
1010
1011 /* setup the sliced VBI lcr registers according to the sliced VBI format */
1012 static void saa711x_set_lcr(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_format *fmt)
1013 {
1014 struct saa711x_state *state = to_state(sd);
1015 int is_50hz = (state->std & V4L2_STD_625_50);
1016 u8 lcr[24];
1017 int i, x;
1018
1019 #if 1
1020 /* saa7113/7114/7118 VBI support are experimental */
1021 if (!saa711x_has_reg(state->ident, R_41_LCR_BASE))
1022 return;
1023
1024 #else
1025 /* SAA7113 and SAA7118 also should support VBI - Need testing */
1026 if (state->ident != V4L2_IDENT_SAA7115)
1027 return;
1028 #endif
1029
1030 for (i = 0; i <= 23; i++)
1031 lcr[i] = 0xff;
1032
1033 if (fmt == NULL) {
1034 /* raw VBI */
1035 if (is_50hz)
1036 for (i = 6; i <= 23; i++)
1037 lcr[i] = 0xdd;
1038 else
1039 for (i = 10; i <= 21; i++)
1040 lcr[i] = 0xdd;
1041 } else {
1042 /* sliced VBI */
1043 /* first clear lines that cannot be captured */
1044 if (is_50hz) {
1045 for (i = 0; i <= 5; i++)
1046 fmt->service_lines[0][i] =
1047 fmt->service_lines[1][i] = 0;
1048 }
1049 else {
1050 for (i = 0; i <= 9; i++)
1051 fmt->service_lines[0][i] =
1052 fmt->service_lines[1][i] = 0;
1053 for (i = 22; i <= 23; i++)
1054 fmt->service_lines[0][i] =
1055 fmt->service_lines[1][i] = 0;
1056 }
1057
1058 /* Now set the lcr values according to the specified service */
1059 for (i = 6; i <= 23; i++) {
1060 lcr[i] = 0;
1061 for (x = 0; x <= 1; x++) {
1062 switch (fmt->service_lines[1-x][i]) {
1063 case 0:
1064 lcr[i] |= 0xf << (4 * x);
1065 break;
1066 case V4L2_SLICED_TELETEXT_B:
1067 lcr[i] |= 1 << (4 * x);
1068 break;
1069 case V4L2_SLICED_CAPTION_525:
1070 lcr[i] |= 4 << (4 * x);
1071 break;
1072 case V4L2_SLICED_WSS_625:
1073 lcr[i] |= 5 << (4 * x);
1074 break;
1075 case V4L2_SLICED_VPS:
1076 lcr[i] |= 7 << (4 * x);
1077 break;
1078 }
1079 }
1080 }
1081 }
1082
1083 /* write the lcr registers */
1084 for (i = 2; i <= 23; i++) {
1085 saa711x_write(sd, i - 2 + R_41_LCR_BASE, lcr[i]);
1086 }
1087
1088 /* enable/disable raw VBI capturing */
1089 saa711x_writeregs(sd, fmt == NULL ?
1090 saa7115_cfg_vbi_on :
1091 saa7115_cfg_vbi_off);
1092 }
1093
1094 static int saa711x_g_sliced_fmt(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_format *sliced)
1095 {
1096 static u16 lcr2vbi[] = {
1097 0, V4L2_SLICED_TELETEXT_B, 0, /* 1 */
1098 0, V4L2_SLICED_CAPTION_525, /* 4 */
1099 V4L2_SLICED_WSS_625, 0, /* 5 */
1100 V4L2_SLICED_VPS, 0, 0, 0, 0, /* 7 */
1101 0, 0, 0, 0
1102 };
1103 int i;
1104
1105 memset(sliced, 0, sizeof(*sliced));
1106 /* done if using raw VBI */
1107 if (saa711x_read(sd, R_80_GLOBAL_CNTL_1) & 0x10)
1108 return 0;
1109 for (i = 2; i <= 23; i++) {
1110 u8 v = saa711x_read(sd, i - 2 + R_41_LCR_BASE);
1111
1112 sliced->service_lines[0][i] = lcr2vbi[v >> 4];
1113 sliced->service_lines[1][i] = lcr2vbi[v & 0xf];
1114 sliced->service_set |=
1115 sliced->service_lines[0][i] | sliced->service_lines[1][i];
1116 }
1117 return 0;
1118 }
1119
1120 static int saa711x_g_fmt(struct v4l2_subdev *sd, struct v4l2_format *fmt)
1121 {
1122 if (fmt->type != V4L2_BUF_TYPE_SLICED_VBI_CAPTURE)
1123 return -EINVAL;
1124 return saa711x_g_sliced_fmt(sd, &fmt->fmt.sliced);
1125 }
1126
1127 static int saa711x_s_raw_fmt(struct v4l2_subdev *sd, struct v4l2_vbi_format *fmt)
1128 {
1129 saa711x_set_lcr(sd, NULL);
1130 return 0;
1131 }
1132
1133 static int saa711x_s_sliced_fmt(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_format *fmt)
1134 {
1135 saa711x_set_lcr(sd, fmt);
1136 return 0;
1137 }
1138
1139 static int saa711x_s_fmt(struct v4l2_subdev *sd, struct v4l2_format *fmt)
1140 {
1141 if (fmt->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1142 return -EINVAL;
1143
1144 return saa711x_set_size(sd, fmt->fmt.pix.width, fmt->fmt.pix.height);
1145 }
1146
1147 /* Decode the sliced VBI data stream as created by the saa7115.
1148 The format is described in the saa7115 datasheet in Tables 25 and 26
1149 and in Figure 33.
1150 The current implementation uses SAV/EAV codes and not the ancillary data
1151 headers. The vbi->p pointer points to the R_5E_SDID byte right after the SAV
1152 code. */
1153 static int saa711x_decode_vbi_line(struct v4l2_subdev *sd, struct v4l2_decode_vbi_line *vbi)
1154 {
1155 struct saa711x_state *state = to_state(sd);
1156 static const char vbi_no_data_pattern[] = {
1157 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0
1158 };
1159 u8 *p = vbi->p;
1160 u32 wss;
1161 int id1, id2; /* the ID1 and ID2 bytes from the internal header */
1162
1163 vbi->type = 0; /* mark result as a failure */
1164 id1 = p[2];
1165 id2 = p[3];
1166 /* Note: the field bit is inverted for 60 Hz video */
1167 if (state->std & V4L2_STD_525_60)
1168 id1 ^= 0x40;
1169
1170 /* Skip internal header, p now points to the start of the payload */
1171 p += 4;
1172 vbi->p = p;
1173
1174 /* calculate field and line number of the VBI packet (1-23) */
1175 vbi->is_second_field = ((id1 & 0x40) != 0);
1176 vbi->line = (id1 & 0x3f) << 3;
1177 vbi->line |= (id2 & 0x70) >> 4;
1178
1179 /* Obtain data type */
1180 id2 &= 0xf;
1181
1182 /* If the VBI slicer does not detect any signal it will fill up
1183 the payload buffer with 0xa0 bytes. */
1184 if (!memcmp(p, vbi_no_data_pattern, sizeof(vbi_no_data_pattern)))
1185 return 0;
1186
1187 /* decode payloads */
1188 switch (id2) {
1189 case 1:
1190 vbi->type = V4L2_SLICED_TELETEXT_B;
1191 break;
1192 case 4:
1193 if (!saa711x_odd_parity(p[0]) || !saa711x_odd_parity(p[1]))
1194 return 0;
1195 vbi->type = V4L2_SLICED_CAPTION_525;
1196 break;
1197 case 5:
1198 wss = saa711x_decode_wss(p);
1199 if (wss == -1)
1200 return 0;
1201 p[0] = wss & 0xff;
1202 p[1] = wss >> 8;
1203 vbi->type = V4L2_SLICED_WSS_625;
1204 break;
1205 case 7:
1206 if (saa711x_decode_vps(p, p) != 0)
1207 return 0;
1208 vbi->type = V4L2_SLICED_VPS;
1209 break;
1210 default:
1211 break;
1212 }
1213 return 0;
1214 }
1215
1216 /* ============ SAA7115 AUDIO settings (end) ============= */
1217
1218 static int saa711x_g_tuner(struct v4l2_subdev *sd, struct v4l2_tuner *vt)
1219 {
1220 struct saa711x_state *state = to_state(sd);
1221 int status;
1222
1223 if (state->radio)
1224 return 0;
1225 status = saa711x_read(sd, R_1F_STATUS_BYTE_2_VD_DEC);
1226
1227 v4l2_dbg(1, debug, sd, "status: 0x%02x\n", status);
1228 vt->signal = ((status & (1 << 6)) == 0) ? 0xffff : 0x0;
1229 return 0;
1230 }
1231
1232 static int saa711x_queryctrl(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc)
1233 {
1234 switch (qc->id) {
1235 case V4L2_CID_BRIGHTNESS:
1236 return v4l2_ctrl_query_fill(qc, 0, 255, 1, 128);
1237 case V4L2_CID_CONTRAST:
1238 case V4L2_CID_SATURATION:
1239 return v4l2_ctrl_query_fill(qc, 0, 127, 1, 64);
1240 case V4L2_CID_HUE:
1241 return v4l2_ctrl_query_fill(qc, -128, 127, 1, 0);
1242 case V4L2_CID_CHROMA_AGC:
1243 return v4l2_ctrl_query_fill(qc, 0, 1, 1, 1);
1244 case V4L2_CID_CHROMA_GAIN:
1245 return v4l2_ctrl_query_fill(qc, 0, 127, 1, 48);
1246 default:
1247 return -EINVAL;
1248 }
1249 }
1250
1251 static int saa711x_s_std(struct v4l2_subdev *sd, v4l2_std_id std)
1252 {
1253 struct saa711x_state *state = to_state(sd);
1254
1255 state->radio = 0;
1256 saa711x_set_v4lstd(sd, std);
1257 return 0;
1258 }
1259
1260 static int saa711x_s_radio(struct v4l2_subdev *sd)
1261 {
1262 struct saa711x_state *state = to_state(sd);
1263
1264 state->radio = 1;
1265 return 0;
1266 }
1267
1268 static int saa711x_s_routing(struct v4l2_subdev *sd,
1269 u32 input, u32 output, u32 config)
1270 {
1271 struct saa711x_state *state = to_state(sd);
1272 u8 mask = (state->ident <= V4L2_IDENT_SAA7111A) ? 0xf8 : 0xf0;
1273
1274 v4l2_dbg(1, debug, sd, "decoder set input %d output %d\n",
1275 input, output);
1276
1277 /* saa7111/3 does not have these inputs */
1278 if (state->ident <= V4L2_IDENT_SAA7113 &&
1279 (input == SAA7115_COMPOSITE4 ||
1280 input == SAA7115_COMPOSITE5)) {
1281 return -EINVAL;
1282 }
1283 if (input > SAA7115_SVIDEO3)
1284 return -EINVAL;
1285 if (state->input == input && state->output == output)
1286 return 0;
1287 v4l2_dbg(1, debug, sd, "now setting %s input %s output\n",
1288 (input >= SAA7115_SVIDEO0) ? "S-Video" : "Composite",
1289 (output == SAA7115_IPORT_ON) ? "iport on" : "iport off");
1290 state->input = input;
1291
1292 /* saa7111 has slightly different input numbering */
1293 if (state->ident <= V4L2_IDENT_SAA7111A) {
1294 if (input >= SAA7115_COMPOSITE4)
1295 input -= 2;
1296 /* saa7111 specific */
1297 saa711x_write(sd, R_10_CHROMA_CNTL_2,
1298 (saa711x_read(sd, R_10_CHROMA_CNTL_2) & 0x3f) |
1299 ((output & 0xc0) ^ 0x40));
1300 saa711x_write(sd, R_13_RT_X_PORT_OUT_CNTL,
1301 (saa711x_read(sd, R_13_RT_X_PORT_OUT_CNTL) & 0xf0) |
1302 ((output & 2) ? 0x0a : 0));
1303 }
1304
1305 /* select mode */
1306 saa711x_write(sd, R_02_INPUT_CNTL_1,
1307 (saa711x_read(sd, R_02_INPUT_CNTL_1) & mask) |
1308 input);
1309
1310 /* bypass chrominance trap for S-Video modes */
1311 saa711x_write(sd, R_09_LUMA_CNTL,
1312 (saa711x_read(sd, R_09_LUMA_CNTL) & 0x7f) |
1313 (state->input >= SAA7115_SVIDEO0 ? 0x80 : 0x0));
1314
1315 state->output = output;
1316 if (state->ident == V4L2_IDENT_SAA7114 ||
1317 state->ident == V4L2_IDENT_SAA7115) {
1318 saa711x_write(sd, R_83_X_PORT_I_O_ENA_AND_OUT_CLK,
1319 (saa711x_read(sd, R_83_X_PORT_I_O_ENA_AND_OUT_CLK) & 0xfe) |
1320 (state->output & 0x01));
1321 }
1322 return 0;
1323 }
1324
1325 static int saa711x_s_gpio(struct v4l2_subdev *sd, u32 val)
1326 {
1327 struct saa711x_state *state = to_state(sd);
1328
1329 if (state->ident > V4L2_IDENT_SAA7111A)
1330 return -EINVAL;
1331 saa711x_write(sd, 0x11, (saa711x_read(sd, 0x11) & 0x7f) |
1332 (val ? 0x80 : 0));
1333 return 0;
1334 }
1335
1336 static int saa711x_s_stream(struct v4l2_subdev *sd, int enable)
1337 {
1338 struct saa711x_state *state = to_state(sd);
1339
1340 v4l2_dbg(1, debug, sd, "%s output\n",
1341 enable ? "enable" : "disable");
1342
1343 if (state->enable == enable)
1344 return 0;
1345 state->enable = enable;
1346 if (!saa711x_has_reg(state->ident, R_87_I_PORT_I_O_ENA_OUT_CLK_AND_GATED))
1347 return 0;
1348 saa711x_write(sd, R_87_I_PORT_I_O_ENA_OUT_CLK_AND_GATED, state->enable);
1349 return 0;
1350 }
1351
1352 static int saa711x_s_crystal_freq(struct v4l2_subdev *sd, u32 freq, u32 flags)
1353 {
1354 struct saa711x_state *state = to_state(sd);
1355
1356 if (freq != SAA7115_FREQ_32_11_MHZ && freq != SAA7115_FREQ_24_576_MHZ)
1357 return -EINVAL;
1358 state->crystal_freq = freq;
1359 state->cgcdiv = (flags & SAA7115_FREQ_FL_CGCDIV) ? 3 : 4;
1360 state->ucgc = (flags & SAA7115_FREQ_FL_UCGC) ? 1 : 0;
1361 state->apll = (flags & SAA7115_FREQ_FL_APLL) ? 1 : 0;
1362 saa711x_s_clock_freq(sd, state->audclk_freq);
1363 return 0;
1364 }
1365
1366 static int saa711x_reset(struct v4l2_subdev *sd, u32 val)
1367 {
1368 v4l2_dbg(1, debug, sd, "decoder RESET\n");
1369 saa711x_writeregs(sd, saa7115_cfg_reset_scaler);
1370 return 0;
1371 }
1372
1373 static int saa711x_g_vbi_data(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_data *data)
1374 {
1375 /* Note: the internal field ID is inverted for NTSC,
1376 so data->field 0 maps to the saa7115 even field,
1377 whereas for PAL it maps to the saa7115 odd field. */
1378 switch (data->id) {
1379 case V4L2_SLICED_WSS_625:
1380 if (saa711x_read(sd, 0x6b) & 0xc0)
1381 return -EIO;
1382 data->data[0] = saa711x_read(sd, 0x6c);
1383 data->data[1] = saa711x_read(sd, 0x6d);
1384 return 0;
1385 case V4L2_SLICED_CAPTION_525:
1386 if (data->field == 0) {
1387 /* CC */
1388 if (saa711x_read(sd, 0x66) & 0x30)
1389 return -EIO;
1390 data->data[0] = saa711x_read(sd, 0x69);
1391 data->data[1] = saa711x_read(sd, 0x6a);
1392 return 0;
1393 }
1394 /* XDS */
1395 if (saa711x_read(sd, 0x66) & 0xc0)
1396 return -EIO;
1397 data->data[0] = saa711x_read(sd, 0x67);
1398 data->data[1] = saa711x_read(sd, 0x68);
1399 return 0;
1400 default:
1401 return -EINVAL;
1402 }
1403 }
1404
1405 static int saa711x_querystd(struct v4l2_subdev *sd, v4l2_std_id *std)
1406 {
1407 struct saa711x_state *state = to_state(sd);
1408 int reg1e;
1409
1410 *std = V4L2_STD_ALL;
1411 if (state->ident != V4L2_IDENT_SAA7115)
1412 return 0;
1413 reg1e = saa711x_read(sd, R_1E_STATUS_BYTE_1_VD_DEC);
1414
1415 switch (reg1e & 0x03) {
1416 case 1:
1417 *std = V4L2_STD_NTSC;
1418 break;
1419 case 2:
1420 *std = V4L2_STD_PAL;
1421 break;
1422 case 3:
1423 *std = V4L2_STD_SECAM;
1424 break;
1425 default:
1426 break;
1427 }
1428 return 0;
1429 }
1430
1431 static int saa711x_g_input_status(struct v4l2_subdev *sd, u32 *status)
1432 {
1433 struct saa711x_state *state = to_state(sd);
1434 int reg1e = 0x80;
1435 int reg1f;
1436
1437 *status = V4L2_IN_ST_NO_SIGNAL;
1438 if (state->ident == V4L2_IDENT_SAA7115)
1439 reg1e = saa711x_read(sd, R_1E_STATUS_BYTE_1_VD_DEC);
1440 reg1f = saa711x_read(sd, R_1F_STATUS_BYTE_2_VD_DEC);
1441 if ((reg1f & 0xc1) == 0x81 && (reg1e & 0xc0) == 0x80)
1442 *status = 0;
1443 return 0;
1444 }
1445
1446 #ifdef CONFIG_VIDEO_ADV_DEBUG
1447 static int saa711x_g_register(struct v4l2_subdev *sd, struct v4l2_dbg_register *reg)
1448 {
1449 struct i2c_client *client = v4l2_get_subdevdata(sd);
1450
1451 if (!v4l2_chip_match_i2c_client(client, &reg->match))
1452 return -EINVAL;
1453 if (!capable(CAP_SYS_ADMIN))
1454 return -EPERM;
1455 reg->val = saa711x_read(sd, reg->reg & 0xff);
1456 reg->size = 1;
1457 return 0;
1458 }
1459
1460 static int saa711x_s_register(struct v4l2_subdev *sd, struct v4l2_dbg_register *reg)
1461 {
1462 struct i2c_client *client = v4l2_get_subdevdata(sd);
1463
1464 if (!v4l2_chip_match_i2c_client(client, &reg->match))
1465 return -EINVAL;
1466 if (!capable(CAP_SYS_ADMIN))
1467 return -EPERM;
1468 saa711x_write(sd, reg->reg & 0xff, reg->val & 0xff);
1469 return 0;
1470 }
1471 #endif
1472
1473 static int saa711x_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *chip)
1474 {
1475 struct saa711x_state *state = to_state(sd);
1476 struct i2c_client *client = v4l2_get_subdevdata(sd);
1477
1478 return v4l2_chip_ident_i2c_client(client, chip, state->ident, 0);
1479 }
1480
1481 static int saa711x_log_status(struct v4l2_subdev *sd)
1482 {
1483 struct saa711x_state *state = to_state(sd);
1484 int reg1e, reg1f;
1485 int signalOk;
1486 int vcr;
1487
1488 v4l2_info(sd, "Audio frequency: %d Hz\n", state->audclk_freq);
1489 if (state->ident != V4L2_IDENT_SAA7115) {
1490 /* status for the saa7114 */
1491 reg1f = saa711x_read(sd, R_1F_STATUS_BYTE_2_VD_DEC);
1492 signalOk = (reg1f & 0xc1) == 0x81;
1493 v4l2_info(sd, "Video signal: %s\n", signalOk ? "ok" : "bad");
1494 v4l2_info(sd, "Frequency: %s\n", (reg1f & 0x20) ? "60 Hz" : "50 Hz");
1495 return 0;
1496 }
1497
1498 /* status for the saa7115 */
1499 reg1e = saa711x_read(sd, R_1E_STATUS_BYTE_1_VD_DEC);
1500 reg1f = saa711x_read(sd, R_1F_STATUS_BYTE_2_VD_DEC);
1501
1502 signalOk = (reg1f & 0xc1) == 0x81 && (reg1e & 0xc0) == 0x80;
1503 vcr = !(reg1f & 0x10);
1504
1505 if (state->input >= 6)
1506 v4l2_info(sd, "Input: S-Video %d\n", state->input - 6);
1507 else
1508 v4l2_info(sd, "Input: Composite %d\n", state->input);
1509 v4l2_info(sd, "Video signal: %s\n", signalOk ? (vcr ? "VCR" : "broadcast/DVD") : "bad");
1510 v4l2_info(sd, "Frequency: %s\n", (reg1f & 0x20) ? "60 Hz" : "50 Hz");
1511
1512 switch (reg1e & 0x03) {
1513 case 1:
1514 v4l2_info(sd, "Detected format: NTSC\n");
1515 break;
1516 case 2:
1517 v4l2_info(sd, "Detected format: PAL\n");
1518 break;
1519 case 3:
1520 v4l2_info(sd, "Detected format: SECAM\n");
1521 break;
1522 default:
1523 v4l2_info(sd, "Detected format: BW/No color\n");
1524 break;
1525 }
1526 v4l2_info(sd, "Width, Height: %d, %d\n", state->width, state->height);
1527 return 0;
1528 }
1529
1530 /* ----------------------------------------------------------------------- */
1531
1532 static const struct v4l2_subdev_core_ops saa711x_core_ops = {
1533 .log_status = saa711x_log_status,
1534 .g_chip_ident = saa711x_g_chip_ident,
1535 .g_ctrl = saa711x_g_ctrl,
1536 .s_ctrl = saa711x_s_ctrl,
1537 .queryctrl = saa711x_queryctrl,
1538 .s_std = saa711x_s_std,
1539 .reset = saa711x_reset,
1540 .s_gpio = saa711x_s_gpio,
1541 #ifdef CONFIG_VIDEO_ADV_DEBUG
1542 .g_register = saa711x_g_register,
1543 .s_register = saa711x_s_register,
1544 #endif
1545 };
1546
1547 static const struct v4l2_subdev_tuner_ops saa711x_tuner_ops = {
1548 .s_radio = saa711x_s_radio,
1549 .g_tuner = saa711x_g_tuner,
1550 };
1551
1552 static const struct v4l2_subdev_audio_ops saa711x_audio_ops = {
1553 .s_clock_freq = saa711x_s_clock_freq,
1554 };
1555
1556 static const struct v4l2_subdev_video_ops saa711x_video_ops = {
1557 .s_routing = saa711x_s_routing,
1558 .s_crystal_freq = saa711x_s_crystal_freq,
1559 .g_fmt = saa711x_g_fmt,
1560 .s_fmt = saa711x_s_fmt,
1561 .s_stream = saa711x_s_stream,
1562 .querystd = saa711x_querystd,
1563 .g_input_status = saa711x_g_input_status,
1564 };
1565
1566 static const struct v4l2_subdev_vbi_ops saa711x_vbi_ops = {
1567 .g_vbi_data = saa711x_g_vbi_data,
1568 .decode_vbi_line = saa711x_decode_vbi_line,
1569 .g_sliced_fmt = saa711x_g_sliced_fmt,
1570 .s_sliced_fmt = saa711x_s_sliced_fmt,
1571 .s_raw_fmt = saa711x_s_raw_fmt,
1572 };
1573
1574 static const struct v4l2_subdev_ops saa711x_ops = {
1575 .core = &saa711x_core_ops,
1576 .tuner = &saa711x_tuner_ops,
1577 .audio = &saa711x_audio_ops,
1578 .video = &saa711x_video_ops,
1579 .vbi = &saa711x_vbi_ops,
1580 };
1581
1582 /* ----------------------------------------------------------------------- */
1583
1584 static int saa711x_probe(struct i2c_client *client,
1585 const struct i2c_device_id *id)
1586 {
1587 struct saa711x_state *state;
1588 struct v4l2_subdev *sd;
1589 int i;
1590 char name[17];
1591 char chip_id;
1592 int autodetect = !id || id->driver_data == 1;
1593
1594 /* Check if the adapter supports the needed features */
1595 if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA))
1596 return -EIO;
1597
1598 for (i = 0; i < 0x0f; i++) {
1599 i2c_smbus_write_byte_data(client, 0, i);
1600 name[i] = (i2c_smbus_read_byte_data(client, 0) & 0x0f) + '0';
1601 if (name[i] > '9')
1602 name[i] += 'a' - '9' - 1;
1603 }
1604 name[i] = '\0';
1605
1606 chip_id = name[5];
1607
1608 /* Check whether this chip is part of the saa711x series */
1609 if (memcmp(name, "1f711", 5)) {
1610 v4l_dbg(1, debug, client, "chip found @ 0x%x (ID %s) does not match a known saa711x chip.\n",
1611 client->addr << 1, name);
1612 return -ENODEV;
1613 }
1614
1615 /* Safety check */
1616 if (!autodetect && id->name[6] != chip_id) {
1617 v4l_warn(client, "found saa711%c while %s was expected\n",
1618 chip_id, id->name);
1619 }
1620 snprintf(client->name, sizeof(client->name), "saa711%c", chip_id);
1621 v4l_info(client, "saa711%c found (%s) @ 0x%x (%s)\n", chip_id, name,
1622 client->addr << 1, client->adapter->name);
1623
1624 state = kzalloc(sizeof(struct saa711x_state), GFP_KERNEL);
1625 if (state == NULL)
1626 return -ENOMEM;
1627 sd = &state->sd;
1628 v4l2_i2c_subdev_init(sd, client, &saa711x_ops);
1629 state->input = -1;
1630 state->output = SAA7115_IPORT_ON;
1631 state->enable = 1;
1632 state->radio = 0;
1633 state->bright = 128;
1634 state->contrast = 64;
1635 state->hue = 0;
1636 state->sat = 64;
1637 state->chroma_agc = 1;
1638 switch (chip_id) {
1639 case '1':
1640 state->ident = V4L2_IDENT_SAA7111;
1641 if (saa711x_read(sd, R_00_CHIP_VERSION) & 0xf0) {
1642 v4l_info(client, "saa7111a variant found\n");
1643 state->ident = V4L2_IDENT_SAA7111A;
1644 }
1645 break;
1646 case '3':
1647 state->ident = V4L2_IDENT_SAA7113;
1648 break;
1649 case '4':
1650 state->ident = V4L2_IDENT_SAA7114;
1651 break;
1652 case '5':
1653 state->ident = V4L2_IDENT_SAA7115;
1654 break;
1655 case '8':
1656 state->ident = V4L2_IDENT_SAA7118;
1657 break;
1658 default:
1659 state->ident = V4L2_IDENT_SAA7111;
1660 v4l2_info(sd, "WARNING: Chip is not known - Falling back to saa7111\n");
1661 break;
1662 }
1663
1664 state->audclk_freq = 48000;
1665
1666 v4l2_dbg(1, debug, sd, "writing init values\n");
1667
1668 /* init to 60hz/48khz */
1669 state->crystal_freq = SAA7115_FREQ_24_576_MHZ;
1670 switch (state->ident) {
1671 case V4L2_IDENT_SAA7111:
1672 case V4L2_IDENT_SAA7111A:
1673 saa711x_writeregs(sd, saa7111_init);
1674 break;
1675 case V4L2_IDENT_SAA7113:
1676 saa711x_writeregs(sd, saa7113_init);
1677 break;
1678 default:
1679 state->crystal_freq = SAA7115_FREQ_32_11_MHZ;
1680 saa711x_writeregs(sd, saa7115_init_auto_input);
1681 }
1682 if (state->ident > V4L2_IDENT_SAA7111A)
1683 saa711x_writeregs(sd, saa7115_init_misc);
1684 saa711x_set_v4lstd(sd, V4L2_STD_NTSC);
1685
1686 v4l2_dbg(1, debug, sd, "status: (1E) 0x%02x, (1F) 0x%02x\n",
1687 saa711x_read(sd, R_1E_STATUS_BYTE_1_VD_DEC),
1688 saa711x_read(sd, R_1F_STATUS_BYTE_2_VD_DEC));
1689 return 0;
1690 }
1691
1692 /* ----------------------------------------------------------------------- */
1693
1694 static int saa711x_remove(struct i2c_client *client)
1695 {
1696 struct v4l2_subdev *sd = i2c_get_clientdata(client);
1697
1698 v4l2_device_unregister_subdev(sd);
1699 kfree(to_state(sd));
1700 return 0;
1701 }
1702
1703 static const struct i2c_device_id saa7115_id[] = {
1704 { "saa7115_auto", 1 }, /* autodetect */
1705 { "saa7111", 0 },
1706 { "saa7113", 0 },
1707 { "saa7114", 0 },
1708 { "saa7115", 0 },
1709 { "saa7118", 0 },
1710 { }
1711 };
1712 MODULE_DEVICE_TABLE(i2c, saa7115_id);
1713
1714 static struct v4l2_i2c_driver_data v4l2_i2c_data = {
1715 .name = "saa7115",
1716 .probe = saa711x_probe,
1717 .remove = saa711x_remove,
1718 .id_table = saa7115_id,
1719 };
This page took 0.0714 seconds and 5 git commands to generate.