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