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