• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/drivers/media/video/gspca/
1/*
2 * Z-Star/Vimicro zc301/zc302p/vc30x library
3 *
4 * Copyright (C) 2009-2010 Jean-Francois Moine <http://moinejf.free.fr>
5 * Copyright (C) 2004 2005 2006 Michel Xhaard mxhaard@magic.fr
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22#define MODULE_NAME "zc3xx"
23
24#ifdef CONFIG_INPUT
25#include <linux/input.h>
26#endif
27#include "gspca.h"
28#include "jpeg.h"
29
30MODULE_AUTHOR("Jean-Francois Moine <http://moinejf.free.fr>, "
31		"Serge A. Suchkov <Serge.A.S@tochka.ru>");
32MODULE_DESCRIPTION("GSPCA ZC03xx/VC3xx USB Camera Driver");
33MODULE_LICENSE("GPL");
34
35static int force_sensor = -1;
36
37#define QUANT_VAL 1		/* quantization table */
38#include "zc3xx-reg.h"
39
40/* specific webcam descriptor */
41struct sd {
42	struct gspca_dev gspca_dev;	/* !! must be the first item */
43
44	u8 brightness;
45	u8 contrast;
46	u8 gamma;
47	u8 autogain;
48	u8 lightfreq;
49	u8 sharpness;
50	u8 quality;			/* image quality */
51#define QUALITY_MIN 50
52#define QUALITY_MAX 80
53#define QUALITY_DEF 70
54
55	u8 bridge;
56	u8 sensor;		/* Type of image sensor chip */
57	u16 chip_revision;
58
59	u8 jpeg_hdr[JPEG_HDR_SZ];
60};
61enum bridges {
62	BRIDGE_ZC301,
63	BRIDGE_ZC303,
64};
65enum sensors {
66	SENSOR_ADCM2700,
67	SENSOR_CS2102,
68	SENSOR_CS2102K,
69	SENSOR_GC0305,
70	SENSOR_HDCS2020b,
71	SENSOR_HV7131B,
72	SENSOR_HV7131R,
73	SENSOR_ICM105A,
74	SENSOR_MC501CB,
75	SENSOR_MT9V111_1,	/* (mi360soc) zc301 */
76	SENSOR_MT9V111_3,	/* (mi360soc) zc303 */
77	SENSOR_OV7620,		/* OV7648 - same values */
78	SENSOR_OV7630C,
79	SENSOR_PAS106,
80	SENSOR_PAS202B,
81	SENSOR_PB0330,
82	SENSOR_PO2030,
83	SENSOR_TAS5130C,
84	SENSOR_TAS5130C_VF0250,
85	SENSOR_MAX
86};
87
88/* V4L2 controls supported by the driver */
89static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val);
90static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val);
91static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val);
92static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val);
93static int sd_setautogain(struct gspca_dev *gspca_dev, __s32 val);
94static int sd_getautogain(struct gspca_dev *gspca_dev, __s32 *val);
95static int sd_setgamma(struct gspca_dev *gspca_dev, __s32 val);
96static int sd_getgamma(struct gspca_dev *gspca_dev, __s32 *val);
97static int sd_setfreq(struct gspca_dev *gspca_dev, __s32 val);
98static int sd_getfreq(struct gspca_dev *gspca_dev, __s32 *val);
99static int sd_setsharpness(struct gspca_dev *gspca_dev, __s32 val);
100static int sd_getsharpness(struct gspca_dev *gspca_dev, __s32 *val);
101
102static const struct ctrl sd_ctrls[] = {
103	{
104	    {
105		.id      = V4L2_CID_BRIGHTNESS,
106		.type    = V4L2_CTRL_TYPE_INTEGER,
107		.name    = "Brightness",
108		.minimum = 0,
109		.maximum = 255,
110		.step    = 1,
111#define BRIGHTNESS_DEF 128
112		.default_value = BRIGHTNESS_DEF,
113	    },
114	    .set = sd_setbrightness,
115	    .get = sd_getbrightness,
116	},
117	{
118	    {
119		.id      = V4L2_CID_CONTRAST,
120		.type    = V4L2_CTRL_TYPE_INTEGER,
121		.name    = "Contrast",
122		.minimum = 0,
123		.maximum = 255,
124		.step    = 1,
125#define CONTRAST_DEF 128
126		.default_value = CONTRAST_DEF,
127	    },
128	    .set = sd_setcontrast,
129	    .get = sd_getcontrast,
130	},
131	{
132	    {
133		.id      = V4L2_CID_GAMMA,
134		.type    = V4L2_CTRL_TYPE_INTEGER,
135		.name    = "Gamma",
136		.minimum = 1,
137		.maximum = 6,
138		.step    = 1,
139		.default_value = 4,
140	    },
141	    .set = sd_setgamma,
142	    .get = sd_getgamma,
143	},
144	{
145	    {
146		.id      = V4L2_CID_AUTOGAIN,
147		.type    = V4L2_CTRL_TYPE_BOOLEAN,
148		.name    = "Auto Gain",
149		.minimum = 0,
150		.maximum = 1,
151		.step    = 1,
152#define AUTOGAIN_DEF 1
153		.default_value = AUTOGAIN_DEF,
154	    },
155	    .set = sd_setautogain,
156	    .get = sd_getautogain,
157	},
158#define LIGHTFREQ_IDX 4
159	{
160	    {
161		.id	 = V4L2_CID_POWER_LINE_FREQUENCY,
162		.type    = V4L2_CTRL_TYPE_MENU,
163		.name    = "Light frequency filter",
164		.minimum = 0,
165		.maximum = 2,	/* 0: 0, 1: 50Hz, 2:60Hz */
166		.step    = 1,
167#define FREQ_DEF 0
168		.default_value = FREQ_DEF,
169	    },
170	    .set = sd_setfreq,
171	    .get = sd_getfreq,
172	},
173	{
174	    {
175		.id	 = V4L2_CID_SHARPNESS,
176		.type    = V4L2_CTRL_TYPE_INTEGER,
177		.name    = "Sharpness",
178		.minimum = 0,
179		.maximum = 3,
180		.step    = 1,
181#define SHARPNESS_DEF 2
182		.default_value = SHARPNESS_DEF,
183	    },
184	    .set = sd_setsharpness,
185	    .get = sd_getsharpness,
186	},
187};
188
189static const struct v4l2_pix_format vga_mode[] = {
190	{320, 240, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
191		.bytesperline = 320,
192		.sizeimage = 320 * 240 * 3 / 8 + 590,
193		.colorspace = V4L2_COLORSPACE_JPEG,
194		.priv = 1},
195	{640, 480, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
196		.bytesperline = 640,
197		.sizeimage = 640 * 480 * 3 / 8 + 590,
198		.colorspace = V4L2_COLORSPACE_JPEG,
199		.priv = 0},
200};
201
202static const struct v4l2_pix_format broken_vga_mode[] = {
203	{320, 232, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
204		.bytesperline = 320,
205		.sizeimage = 320 * 232 * 4 / 8 + 590,
206		.colorspace = V4L2_COLORSPACE_JPEG,
207		.priv = 1},
208	{640, 472, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
209		.bytesperline = 640,
210		.sizeimage = 640 * 472 * 3 / 8 + 590,
211		.colorspace = V4L2_COLORSPACE_JPEG,
212		.priv = 0},
213};
214
215static const struct v4l2_pix_format sif_mode[] = {
216	{176, 144, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
217		.bytesperline = 176,
218		.sizeimage = 176 * 144 * 3 / 8 + 590,
219		.colorspace = V4L2_COLORSPACE_JPEG,
220		.priv = 1},
221	{352, 288, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
222		.bytesperline = 352,
223		.sizeimage = 352 * 288 * 3 / 8 + 590,
224		.colorspace = V4L2_COLORSPACE_JPEG,
225		.priv = 0},
226};
227
228/* usb exchanges */
229struct usb_action {
230	u8	req;
231	u8	val;
232	u16	idx;
233};
234
235static const struct usb_action adcm2700_Initial[] = {
236	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},		/* 00,00,01,cc */
237	{0xa0, 0x04, ZC3XX_R002_CLOCKSELECT},		/* 00,02,04,cc */
238	{0xa0, 0x00, ZC3XX_R008_CLOCKSETTING},		/* 00,08,03,cc */
239	{0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,0a,cc */
240	{0xa0, 0xd3, ZC3XX_R08B_I2CDEVICEADDR},		/* 00,8b,d3,cc */
241	{0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},	/* 00,03,02,cc */
242	{0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},		/* 00,04,80,cc */
243	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},	/* 00,05,01,cc */
244	{0xa0, 0xd8, ZC3XX_R006_FRAMEHEIGHTLOW},	/* 00,06,d8,cc */
245	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},	/* 00,01,01,cc */
246	{0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC},	/* 00,12,03,cc */
247	{0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},	/* 00,12,01,cc */
248	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},	/* 00,12,05,cc */
249	{0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},		/* 00,98,00,cc */
250	{0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},		/* 00,9a,00,cc */
251	{0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},		/* 01,1a,00,cc */
252	{0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},		/* 01,1c,00,cc */
253	{0xa0, 0xde, ZC3XX_R09C_WINHEIGHTLOW},		/* 00,9c,de,cc */
254	{0xa0, 0x86, ZC3XX_R09E_WINWIDTHLOW},		/* 00,9e,86,cc */
255	{0xbb, 0x00, 0x0400},				/* 04,00,00,bb */
256	{0xdd, 0x00, 0x0010},				/* 00,00,10,dd */
257	{0xbb, 0x0f, 0x140f},				/* 14,0f,0f,bb */
258	{0xa0, 0xb7, ZC3XX_R101_SENSORCORRECTION},	/* 01,01,37,cc */
259	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},		/* 01,00,0d,cc */
260	{0xa0, 0x06, ZC3XX_R189_AWBSTATUS},		/* 01,89,06,cc */
261	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},		/* 01,c5,03,cc */
262	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},		/* 01,cb,13,cc */
263	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},	/* 02,50,08,cc */
264	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},		/* 03,01,08,cc */
265	{0xa0, 0x58, ZC3XX_R116_RGAIN},			/* 01,16,58,cc */
266	{0xa0, 0x5a, ZC3XX_R118_BGAIN},			/* 01,18,5a,cc */
267	{0xa0, 0x02, ZC3XX_R180_AUTOCORRECTENABLE},	/* 01,80,02,cc */
268	{0xa0, 0xd3, ZC3XX_R08B_I2CDEVICEADDR},		/* 00,8b,d3,cc */
269	{0xbb, 0x00, 0x0408},				/* 04,00,08,bb */
270	{0xdd, 0x00, 0x0200},				/* 00,02,00,dd */
271	{0xbb, 0x00, 0x0400},				/* 04,00,00,bb */
272	{0xdd, 0x00, 0x0010},				/* 00,00,10,dd */
273	{0xbb, 0x0f, 0x140f},				/* 14,0f,0f,bb */
274	{0xbb, 0xe0, 0x0c2e},				/* 0c,e0,2e,bb */
275	{0xbb, 0x01, 0x2000},				/* 20,01,00,bb */
276	{0xbb, 0x96, 0x2400},				/* 24,96,00,bb */
277	{0xbb, 0x06, 0x1006},				/* 10,06,06,bb */
278	{0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,01,cc */
279	{0xdd, 0x00, 0x0010},				/* 00,00,10,dd */
280	{0xaa, 0xfe, 0x0002},				/* 00,fe,02,aa */
281	{0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,0a,cc */
282	{0xdd, 0x00, 0x0010},				/* 00,00,10,dd */
283	{0xbb, 0x5f, 0x2090},				/* 20,5f,90,bb */
284	{0xbb, 0x01, 0x8000},				/* 80,01,00,bb */
285	{0xbb, 0x09, 0x8400},				/* 84,09,00,bb */
286	{0xbb, 0x86, 0x0002},				/* 00,86,02,bb */
287	{0xbb, 0xe6, 0x0401},				/* 04,e6,01,bb */
288	{0xbb, 0x86, 0x0802},				/* 08,86,02,bb */
289	{0xbb, 0xe6, 0x0c01},				/* 0c,e6,01,bb */
290	{0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,01,cc */
291	{0xdd, 0x00, 0x0010},				/* 00,00,10,dd */
292	{0xaa, 0xfe, 0x0000},				/* 00,fe,00,aa */
293	{0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,0a,cc */
294	{0xdd, 0x00, 0x0010},				/* 00,00,10,dd */
295	{0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,01,cc */
296	{0xaa, 0xfe, 0x0020},				/* 00,fe,20,aa */
297/*mswin+*/
298	{0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT},
299	{0xaa, 0xfe, 0x0002},
300	{0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT},
301	{0xaa, 0xb4, 0xcd37},
302	{0xaa, 0xa4, 0x0004},
303	{0xaa, 0xa8, 0x0007},
304	{0xaa, 0xac, 0x0004},
305/*mswin-*/
306	{0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,0a,cc */
307	{0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,01,cc */
308	{0xdd, 0x00, 0x0010},				/* 00,00,10,dd */
309	{0xaa, 0xfe, 0x0000},				/* 00,fe,00,aa */
310	{0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,0a,cc */
311	{0xdd, 0x00, 0x0010},				/* 00,00,10,dd */
312	{0xbb, 0x04, 0x0400},				/* 04,04,00,bb */
313	{0xdd, 0x00, 0x0100},				/* 00,01,00,dd */
314	{0xbb, 0x01, 0x0400},				/* 04,01,00,bb */
315	{0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,01,cc */
316	{0xaa, 0xfe, 0x0002},				/* 00,fe,02,aa */
317	{0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,0a,cc */
318	{0xbb, 0x41, 0x2803},				/* 28,41,03,bb */
319	{0xbb, 0x40, 0x2c03},				/* 2c,40,03,bb */
320	{0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,01,cc */
321	{0xaa, 0xfe, 0x0010},				/* 00,fe,10,aa */
322	{}
323};
324static const struct usb_action adcm2700_InitialScale[] = {
325	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},		/* 00,00,01,cc */
326	{0xa0, 0x10, ZC3XX_R002_CLOCKSELECT},		/* 00,02,10,cc */
327	{0xa0, 0x00, ZC3XX_R008_CLOCKSETTING},		/* 00,08,03,cc */
328	{0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,0a,cc */
329	{0xa0, 0xd3, ZC3XX_R08B_I2CDEVICEADDR},		/* 00,8b,d3,cc */
330	{0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},	/* 00,03,02,cc */
331	{0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},		/* 00,04,80,cc */
332	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},	/* 00,05,01,cc */
333	{0xa0, 0xd0, ZC3XX_R006_FRAMEHEIGHTLOW},	/* 00,06,d0,cc */
334	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},	/* 00,01,01,cc */
335	{0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC},	/* 00,12,03,cc */
336	{0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},	/* 00,12,01,cc */
337	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},	/* 00,12,05,cc */
338	{0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},		/* 00,98,00,cc */
339	{0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},		/* 00,9a,00,cc */
340	{0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},		/* 01,1a,00,cc */
341	{0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},		/* 01,1c,00,cc */
342	{0xa0, 0xd8, ZC3XX_R09C_WINHEIGHTLOW},		/* 00,9c,d8,cc */
343	{0xa0, 0x88, ZC3XX_R09E_WINWIDTHLOW},		/* 00,9e,88,cc */
344	{0xbb, 0x00, 0x0400},				/* 04,00,00,bb */
345	{0xdd, 0x00, 0x0010},				/* 00,00,10,dd */
346	{0xbb, 0x0f, 0x140f},				/* 14,0f,0f,bb */
347	{0xa0, 0xb7, ZC3XX_R101_SENSORCORRECTION},	/* 01,01,37,cc */
348	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},		/* 01,00,0d,cc */
349	{0xa0, 0x06, ZC3XX_R189_AWBSTATUS},		/* 01,89,06,cc */
350	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},		/* 01,c5,03,cc */
351	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},		/* 01,cb,13,cc */
352	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},	/* 02,50,08,cc */
353	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},		/* 03,01,08,cc */
354	{0xa0, 0x58, ZC3XX_R116_RGAIN},			/* 01,16,58,cc */
355	{0xa0, 0x5a, ZC3XX_R118_BGAIN},			/* 01,18,5a,cc */
356	{0xa0, 0x02, ZC3XX_R180_AUTOCORRECTENABLE},	/* 01,80,02,cc */
357	{0xa0, 0xd3, ZC3XX_R08B_I2CDEVICEADDR},		/* 00,8b,d3,cc */
358	{0xbb, 0x00, 0x0408},				/* 04,00,08,bb */
359	{0xdd, 0x00, 0x0200},				/* 00,02,00,dd */
360	{0xbb, 0x00, 0x0400},				/* 04,00,00,bb */
361	{0xdd, 0x00, 0x0050},				/* 00,00,50,dd */
362	{0xbb, 0x0f, 0x140f},				/* 14,0f,0f,bb */
363	{0xbb, 0xe0, 0x0c2e},				/* 0c,e0,2e,bb */
364	{0xbb, 0x01, 0x2000},				/* 20,01,00,bb */
365	{0xbb, 0x96, 0x2400},				/* 24,96,00,bb */
366	{0xbb, 0x06, 0x1006},				/* 10,06,06,bb */
367	{0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,01,cc */
368	{0xdd, 0x00, 0x0010},				/* 00,00,10,dd */
369	{0xaa, 0xfe, 0x0002},				/* 00,fe,02,aa */
370	{0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,0a,cc */
371	{0xdd, 0x00, 0x0010},				/* 00,00,10,dd */
372	{0xbb, 0x5f, 0x2090},				/* 20,5f,90,bb */
373	{0xbb, 0x01, 0x8000},				/* 80,01,00,bb */
374	{0xbb, 0x09, 0x8400},				/* 84,09,00,bb */
375	{0xbb, 0x86, 0x0002},				/* 00,88,02,bb */
376	{0xbb, 0xe6, 0x0401},				/* 04,e6,01,bb */
377	{0xbb, 0x86, 0x0802},				/* 08,88,02,bb */
378	{0xbb, 0xe6, 0x0c01},				/* 0c,e6,01,bb */
379	{0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,01,cc */
380	{0xdd, 0x00, 0x0010},				/* 00,00,10,dd */
381	{0xaa, 0xfe, 0x0000},				/* 00,fe,00,aa */
382	{0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,0a,cc */
383	{0xdd, 0x00, 0x0010},				/* 00,00,10,dd */
384	{0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,01,cc */
385	{0xaa, 0xfe, 0x0020},				/* 00,fe,20,aa */
386	/*******/
387	{0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,0a,cc */
388	{0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,01,cc */
389	{0xdd, 0x00, 0x0010},				/* 00,00,10,dd */
390	{0xaa, 0xfe, 0x0000},				/* 00,fe,00,aa */
391	{0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,0a,cc */
392	{0xdd, 0x00, 0x0010},				/* 00,00,10,dd */
393	{0xbb, 0x04, 0x0400},				/* 04,04,00,bb */
394	{0xdd, 0x00, 0x0100},				/* 00,01,00,dd */
395	{0xbb, 0x01, 0x0400},				/* 04,01,00,bb */
396	{0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,01,cc */
397	{0xaa, 0xfe, 0x0002},				/* 00,fe,02,aa */
398	{0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,0a,cc */
399	{0xbb, 0x41, 0x2803},				/* 28,41,03,bb */
400	{0xbb, 0x40, 0x2c03},				/* 2c,40,03,bb */
401	{0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,01,cc */
402	{0xaa, 0xfe, 0x0010},				/* 00,fe,10,aa */
403	{}
404};
405static const struct usb_action adcm2700_50HZ[] = {
406	{0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,01,cc */
407	{0xaa, 0xfe, 0x0002},				/* 00,fe,02,aa */
408	{0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,0a,cc */
409	{0xbb, 0x05, 0x8400},				/* 84,05,00,bb */
410	{0xbb, 0xd0, 0xb007},				/* b0,d0,07,bb */
411	{0xbb, 0xa0, 0xb80f},				/* b8,a0,0f,bb */
412	{0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,01,cc */
413	{0xaa, 0xfe, 0x0010},				/* 00,fe,10,aa */
414	{0xaa, 0x26, 0x00d0},				/* 00,26,d0,aa */
415	{0xaa, 0x28, 0x0002},				/* 00,28,02,aa */
416	{}
417};
418static const struct usb_action adcm2700_60HZ[] = {
419	{0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,01,cc */
420	{0xaa, 0xfe, 0x0002},				/* 00,fe,02,aa */
421	{0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,0a,cc */
422	{0xbb, 0x07, 0x8400},				/* 84,07,00,bb */
423	{0xbb, 0x82, 0xb006},				/* b0,82,06,bb */
424	{0xbb, 0x04, 0xb80d},				/* b8,04,0d,bb */
425	{0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,01,cc */
426	{0xaa, 0xfe, 0x0010},				/* 00,fe,10,aa */
427	{0xaa, 0x26, 0x0057},				/* 00,26,57,aa */
428	{0xaa, 0x28, 0x0002},				/* 00,28,02,aa */
429	{}
430};
431static const struct usb_action adcm2700_NoFliker[] = {
432	{0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,01,cc */
433	{0xaa, 0xfe, 0x0002},				/* 00,fe,02,aa */
434	{0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,0a,cc */
435	{0xbb, 0x07, 0x8400},				/* 84,07,00,bb */
436	{0xbb, 0x05, 0xb000},				/* b0,05,00,bb */
437	{0xbb, 0xa0, 0xb801},				/* b8,a0,01,bb */
438	{0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,01,cc */
439	{0xaa, 0xfe, 0x0010},				/* 00,fe,10,aa */
440	{}
441};
442static const struct usb_action cs2102_InitialScale[] = {	/* 320x240 */
443	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},
444	{0xa0, 0x10, ZC3XX_R002_CLOCKSELECT},
445	{0xa0, 0x00, ZC3XX_R010_CMOSSENSORSELECT},
446	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},
447	{0xa0, 0x20, ZC3XX_R080_HBLANKHIGH},
448	{0xa0, 0x21, ZC3XX_R081_HBLANKLOW},
449	{0xa0, 0x30, ZC3XX_R083_RGAINADDR},
450	{0xa0, 0x31, ZC3XX_R084_GGAINADDR},
451	{0xa0, 0x32, ZC3XX_R085_BGAINADDR},
452	{0xa0, 0x23, ZC3XX_R086_EXPTIMEHIGH},
453	{0xa0, 0x24, ZC3XX_R087_EXPTIMEMID},
454	{0xa0, 0x25, ZC3XX_R088_EXPTIMELOW},
455	{0xa0, 0xb3, ZC3XX_R08B_I2CDEVICEADDR},
456	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},	/* 00 */
457	{0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC},
458	{0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},
459	{0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},
460	{0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},
461	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},
462	{0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},
463	{0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},
464	{0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},
465	{0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},
466	{0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},
467	{0xaa, 0x02, 0x0008},
468	{0xaa, 0x03, 0x0000},
469	{0xaa, 0x11, 0x0000},
470	{0xaa, 0x12, 0x0089},
471	{0xaa, 0x13, 0x0000},
472	{0xaa, 0x14, 0x00e9},
473	{0xaa, 0x20, 0x0000},
474	{0xaa, 0x22, 0x0000},
475	{0xaa, 0x0b, 0x0004},
476	{0xaa, 0x30, 0x0030},
477	{0xaa, 0x31, 0x0030},
478	{0xaa, 0x32, 0x0030},
479	{0xa0, 0x37, ZC3XX_R101_SENSORCORRECTION},
480	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
481	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},
482	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},
483	{0xa0, 0x06, ZC3XX_R189_AWBSTATUS},
484	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},
485	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},
486	{0xa0, 0x10, 0x01ae},
487	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},
488	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},
489	{0xa0, 0x68, ZC3XX_R18D_YTARGET},
490	{0xa0, 0x00, 0x01ad},
491	{}
492};
493
494static const struct usb_action cs2102_Initial[] = {	/* 640x480 */
495	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},
496	{0xa0, 0x00, ZC3XX_R002_CLOCKSELECT},
497	{0xa0, 0x00, ZC3XX_R010_CMOSSENSORSELECT},
498	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},
499	{0xa0, 0x20, ZC3XX_R080_HBLANKHIGH},
500	{0xa0, 0x21, ZC3XX_R081_HBLANKLOW},
501	{0xa0, 0x30, ZC3XX_R083_RGAINADDR},
502	{0xa0, 0x31, ZC3XX_R084_GGAINADDR},
503	{0xa0, 0x32, ZC3XX_R085_BGAINADDR},
504	{0xa0, 0x23, ZC3XX_R086_EXPTIMEHIGH},
505	{0xa0, 0x24, ZC3XX_R087_EXPTIMEMID},
506	{0xa0, 0x25, ZC3XX_R088_EXPTIMELOW},
507	{0xa0, 0xb3, ZC3XX_R08B_I2CDEVICEADDR},
508	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},	/* 00 */
509	{0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC},
510	{0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},
511	{0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},
512	{0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},
513	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},
514	{0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},
515	{0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},
516	{0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},
517	{0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},
518	{0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},
519	{0xaa, 0x02, 0x0008},
520	{0xaa, 0x03, 0x0000},
521	{0xaa, 0x11, 0x0001},
522	{0xaa, 0x12, 0x0087},
523	{0xaa, 0x13, 0x0001},
524	{0xaa, 0x14, 0x00e7},
525	{0xaa, 0x20, 0x0000},
526	{0xaa, 0x22, 0x0000},
527	{0xaa, 0x0b, 0x0004},
528	{0xaa, 0x30, 0x0030},
529	{0xaa, 0x31, 0x0030},
530	{0xaa, 0x32, 0x0030},
531	{0xa0, 0x77, ZC3XX_R101_SENSORCORRECTION},
532	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
533	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},
534	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},
535	{0xa0, 0x06, ZC3XX_R189_AWBSTATUS},
536	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},
537	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},
538	{0xa0, 0x15, 0x01ae},
539	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},
540	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},
541	{0xa0, 0x68, ZC3XX_R18D_YTARGET},
542	{0xa0, 0x00, 0x01ad},
543	{}
544};
545static const struct usb_action cs2102_50HZScale[] = {
546	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
547	{0xaa, 0x23, 0x0001},
548	{0xaa, 0x24, 0x005f},
549	{0xaa, 0x25, 0x0090},
550	{0xaa, 0x21, 0x00dd},
551	{0xa0, 0x02, ZC3XX_R190_EXPOSURELIMITHIGH},
552	{0xa0, 0xbf, ZC3XX_R191_EXPOSURELIMITMID},
553	{0xa0, 0x20, ZC3XX_R192_EXPOSURELIMITLOW},
554	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
555	{0xa0, 0x3a, ZC3XX_R196_ANTIFLICKERMID},
556	{0xa0, 0x98, ZC3XX_R197_ANTIFLICKERLOW},
557	{0xa0, 0x10, ZC3XX_R18C_AEFREEZE},
558	{0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},
559	{0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF},
560	{0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},
561	{0xa0, 0xdd, ZC3XX_R01D_HSYNC_0},
562	{0xa0, 0xe4, ZC3XX_R01E_HSYNC_1},
563	{0xa0, 0xf0, ZC3XX_R01F_HSYNC_2},
564	{0xa0, 0xff, ZC3XX_R020_HSYNC_3},
565	{}
566};
567static const struct usb_action cs2102_50HZ[] = {
568	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
569	{0xaa, 0x23, 0x0000},
570	{0xaa, 0x24, 0x00af},
571	{0xaa, 0x25, 0x00c8},
572	{0xaa, 0x21, 0x0068},
573	{0xa0, 0x01, ZC3XX_R190_EXPOSURELIMITHIGH},
574	{0xa0, 0x5f, ZC3XX_R191_EXPOSURELIMITMID},
575	{0xa0, 0x90, ZC3XX_R192_EXPOSURELIMITLOW},
576	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
577	{0xa0, 0x1d, ZC3XX_R196_ANTIFLICKERMID},
578	{0xa0, 0x4c, ZC3XX_R197_ANTIFLICKERLOW},
579	{0xa0, 0x10, ZC3XX_R18C_AEFREEZE},
580	{0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},
581	{0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF},
582	{0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},
583	{0xa0, 0x68, ZC3XX_R01D_HSYNC_0},
584	{0xa0, 0xe3, ZC3XX_R01E_HSYNC_1},
585	{0xa0, 0xf0, ZC3XX_R01F_HSYNC_2},
586	{0xa0, 0xff, ZC3XX_R020_HSYNC_3},
587	{}
588};
589static const struct usb_action cs2102_60HZScale[] = {
590	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
591	{0xaa, 0x23, 0x0001},
592	{0xaa, 0x24, 0x0055},
593	{0xaa, 0x25, 0x00cc},
594	{0xaa, 0x21, 0x003f},
595	{0xa0, 0x02, ZC3XX_R190_EXPOSURELIMITHIGH},
596	{0xa0, 0xab, ZC3XX_R191_EXPOSURELIMITMID},
597	{0xa0, 0x98, ZC3XX_R192_EXPOSURELIMITLOW},
598	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
599	{0xa0, 0x30, ZC3XX_R196_ANTIFLICKERMID},
600	{0xa0, 0xd4, ZC3XX_R197_ANTIFLICKERLOW},
601	{0xa0, 0x10, ZC3XX_R18C_AEFREEZE},
602	{0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},
603	{0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF},
604	{0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},
605	{0xa0, 0x39, ZC3XX_R01D_HSYNC_0},
606	{0xa0, 0x70, ZC3XX_R01E_HSYNC_1},
607	{0xa0, 0xb0, ZC3XX_R01F_HSYNC_2},
608	{0xa0, 0xff, ZC3XX_R020_HSYNC_3},
609	{}
610};
611static const struct usb_action cs2102_60HZ[] = {
612	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
613	{0xaa, 0x23, 0x0000},
614	{0xaa, 0x24, 0x00aa},
615	{0xaa, 0x25, 0x00e6},
616	{0xaa, 0x21, 0x003f},
617	{0xa0, 0x01, ZC3XX_R190_EXPOSURELIMITHIGH},
618	{0xa0, 0x55, ZC3XX_R191_EXPOSURELIMITMID},
619	{0xa0, 0xcc, ZC3XX_R192_EXPOSURELIMITLOW},
620	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
621	{0xa0, 0x18, ZC3XX_R196_ANTIFLICKERMID},
622	{0xa0, 0x6a, ZC3XX_R197_ANTIFLICKERLOW},
623	{0xa0, 0x10, ZC3XX_R18C_AEFREEZE},
624	{0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},
625	{0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF},
626	{0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},
627	{0xa0, 0x3f, ZC3XX_R01D_HSYNC_0},
628	{0xa0, 0xa5, ZC3XX_R01E_HSYNC_1},
629	{0xa0, 0xf0, ZC3XX_R01F_HSYNC_2},
630	{0xa0, 0xff, ZC3XX_R020_HSYNC_3},
631	{}
632};
633static const struct usb_action cs2102_NoFlikerScale[] = {
634	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
635	{0xaa, 0x23, 0x0001},
636	{0xaa, 0x24, 0x005f},
637	{0xaa, 0x25, 0x0000},
638	{0xaa, 0x21, 0x0001},
639	{0xa0, 0x02, ZC3XX_R190_EXPOSURELIMITHIGH},
640	{0xa0, 0xbf, ZC3XX_R191_EXPOSURELIMITMID},
641	{0xa0, 0x00, ZC3XX_R192_EXPOSURELIMITLOW},
642	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
643	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},
644	{0xa0, 0x80, ZC3XX_R197_ANTIFLICKERLOW},
645	{0xa0, 0x10, ZC3XX_R18C_AEFREEZE},
646	{0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},
647	{0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF},
648	{0xa0, 0x00, ZC3XX_R1AA_DIGITALGAINSTEP},
649	{0xa0, 0x01, ZC3XX_R01D_HSYNC_0},
650	{0xa0, 0x40, ZC3XX_R01E_HSYNC_1},
651	{0xa0, 0xa0, ZC3XX_R01F_HSYNC_2},
652	{0xa0, 0xff, ZC3XX_R020_HSYNC_3},
653	{}
654};
655static const struct usb_action cs2102_NoFliker[] = {
656	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
657	{0xaa, 0x23, 0x0000},
658	{0xaa, 0x24, 0x00af},
659	{0xaa, 0x25, 0x0080},
660	{0xaa, 0x21, 0x0001},
661	{0xa0, 0x01, ZC3XX_R190_EXPOSURELIMITHIGH},
662	{0xa0, 0x5f, ZC3XX_R191_EXPOSURELIMITMID},
663	{0xa0, 0x80, ZC3XX_R192_EXPOSURELIMITLOW},
664	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
665	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},
666	{0xa0, 0x80, ZC3XX_R197_ANTIFLICKERLOW},
667	{0xa0, 0x10, ZC3XX_R18C_AEFREEZE},
668	{0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},
669	{0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF},
670	{0xa0, 0x00, ZC3XX_R1AA_DIGITALGAINSTEP},
671	{0xa0, 0x01, ZC3XX_R01D_HSYNC_0},
672	{0xa0, 0x40, ZC3XX_R01E_HSYNC_1},
673	{0xa0, 0xa0, ZC3XX_R01F_HSYNC_2},
674	{0xa0, 0xff, ZC3XX_R020_HSYNC_3},
675	{}
676};
677
678/* CS2102_KOCOM */
679static const struct usb_action cs2102K_InitialScale[] = {
680	{0xa0, 0x11, ZC3XX_R002_CLOCKSELECT},
681	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},
682	{0xa0, 0x08, ZC3XX_R010_CMOSSENSORSELECT},
683	{0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},
684	{0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},
685	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},
686	{0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},
687	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},
688	{0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC},
689	{0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},
690	{0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},
691	{0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},
692	{0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},
693	{0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},
694	{0xa0, 0xe8, ZC3XX_R09C_WINHEIGHTLOW},
695	{0xa0, 0x88, ZC3XX_R09E_WINWIDTHLOW},
696	{0xa0, 0x55, ZC3XX_R08B_I2CDEVICEADDR},
697	{0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},
698	{0xa0, 0x00, ZC3XX_R093_I2CSETVALUE},
699	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
700	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
701	{0xa0, 0x0a, ZC3XX_R092_I2CADDRESSSELECT},
702	{0xa0, 0x02, ZC3XX_R093_I2CSETVALUE},
703	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
704	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
705	{0xa0, 0x0b, ZC3XX_R092_I2CADDRESSSELECT},
706	{0xa0, 0x02, ZC3XX_R093_I2CSETVALUE},
707	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
708	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
709	{0xa0, 0x0c, ZC3XX_R092_I2CADDRESSSELECT},
710	{0xa0, 0x7c, ZC3XX_R093_I2CSETVALUE},
711	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
712	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
713	{0xa0, 0x0d, ZC3XX_R092_I2CADDRESSSELECT},
714	{0xa0, 0xa3, ZC3XX_R093_I2CSETVALUE},
715	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
716	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
717	{0xa0, 0x03, ZC3XX_R092_I2CADDRESSSELECT},
718	{0xa0, 0xfb, ZC3XX_R093_I2CSETVALUE},
719	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
720	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
721	{0xa0, 0x05, ZC3XX_R092_I2CADDRESSSELECT},
722	{0xa0, 0x00, ZC3XX_R093_I2CSETVALUE},
723	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
724	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
725	{0xa0, 0x06, ZC3XX_R092_I2CADDRESSSELECT},
726	{0xa0, 0x03, ZC3XX_R093_I2CSETVALUE},
727	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
728	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
729	{0xa0, 0x09, ZC3XX_R092_I2CADDRESSSELECT},
730	{0xa0, 0x08, ZC3XX_R093_I2CSETVALUE},
731	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
732	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
733	{0xa0, 0x0e, ZC3XX_R092_I2CADDRESSSELECT},
734	{0xa0, 0x04, ZC3XX_R093_I2CSETVALUE},
735	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
736	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
737	{0xa0, 0x0f, ZC3XX_R092_I2CADDRESSSELECT},
738	{0xa0, 0x18, ZC3XX_R093_I2CSETVALUE},
739	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
740	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
741	{0xa0, 0x10, ZC3XX_R092_I2CADDRESSSELECT},
742	{0xa0, 0x18, ZC3XX_R093_I2CSETVALUE},
743	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
744	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
745	{0xa0, 0x11, ZC3XX_R092_I2CADDRESSSELECT},
746	{0xa0, 0x18, ZC3XX_R093_I2CSETVALUE},
747	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
748	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
749	{0xa0, 0x12, ZC3XX_R092_I2CADDRESSSELECT},
750	{0xa0, 0x18, ZC3XX_R093_I2CSETVALUE},
751	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
752	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
753	{0xa0, 0x15, ZC3XX_R092_I2CADDRESSSELECT},
754	{0xa0, 0x00, ZC3XX_R093_I2CSETVALUE},
755	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
756	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
757	{0xa0, 0x16, ZC3XX_R092_I2CADDRESSSELECT},
758	{0xa0, 0x0c, ZC3XX_R093_I2CSETVALUE},
759	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
760	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
761	{0xa0, 0x17, ZC3XX_R092_I2CADDRESSSELECT},
762	{0xa0, 0x0c, ZC3XX_R093_I2CSETVALUE},
763	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
764	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
765	{0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},
766	{0xa0, 0x04, ZC3XX_R093_I2CSETVALUE},
767	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
768	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
769	{0xa0, 0xb7, ZC3XX_R101_SENSORCORRECTION},
770	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},
771	{0xa0, 0x78, ZC3XX_R18D_YTARGET},
772	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},
773	{0xa0, 0x06, ZC3XX_R189_AWBSTATUS},
774	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},
775	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},
776	{0xa0, 0x20, ZC3XX_R087_EXPTIMEMID},
777	{0xa0, 0x21, ZC3XX_R088_EXPTIMELOW},
778	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},
779	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},
780	{0xa0, 0x00, 0x01ad},
781	{0xa0, 0x01, 0x01b1},
782	{0xa0, 0x02, ZC3XX_R180_AUTOCORRECTENABLE},
783	{0xa0, 0x60, ZC3XX_R116_RGAIN},
784	{0xa0, 0x40, ZC3XX_R117_GGAIN},
785	{0xa0, 0x4c, ZC3XX_R118_BGAIN},
786	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},	/* clock ? */
787	{0xa0, 0x08, ZC3XX_R1C6_SHARPNESS00},	/* sharpness+ */
788	{0xa0, 0x0f, ZC3XX_R1CB_SHARPNESS05},	/* sharpness- */
789	{0xa0, 0x13, ZC3XX_R120_GAMMA00},	/* gamma 4 */
790	{0xa0, 0x38, ZC3XX_R121_GAMMA01},
791	{0xa0, 0x59, ZC3XX_R122_GAMMA02},
792	{0xa0, 0x79, ZC3XX_R123_GAMMA03},
793	{0xa0, 0x92, ZC3XX_R124_GAMMA04},
794	{0xa0, 0xa7, ZC3XX_R125_GAMMA05},
795	{0xa0, 0xb9, ZC3XX_R126_GAMMA06},
796	{0xa0, 0xc8, ZC3XX_R127_GAMMA07},
797	{0xa0, 0xd4, ZC3XX_R128_GAMMA08},
798	{0xa0, 0xdf, ZC3XX_R129_GAMMA09},
799	{0xa0, 0xe7, ZC3XX_R12A_GAMMA0A},
800	{0xa0, 0xee, ZC3XX_R12B_GAMMA0B},
801	{0xa0, 0xf4, ZC3XX_R12C_GAMMA0C},
802	{0xa0, 0xf9, ZC3XX_R12D_GAMMA0D},
803	{0xa0, 0xfc, ZC3XX_R12E_GAMMA0E},
804	{0xa0, 0xff, ZC3XX_R12F_GAMMA0F},
805	{0xa0, 0x26, ZC3XX_R130_GAMMA10},
806	{0xa0, 0x22, ZC3XX_R131_GAMMA11},
807	{0xa0, 0x20, ZC3XX_R132_GAMMA12},
808	{0xa0, 0x1c, ZC3XX_R133_GAMMA13},
809	{0xa0, 0x16, ZC3XX_R134_GAMMA14},
810	{0xa0, 0x13, ZC3XX_R135_GAMMA15},
811	{0xa0, 0x10, ZC3XX_R136_GAMMA16},
812	{0xa0, 0x0d, ZC3XX_R137_GAMMA17},
813	{0xa0, 0x0b, ZC3XX_R138_GAMMA18},
814	{0xa0, 0x09, ZC3XX_R139_GAMMA19},
815	{0xa0, 0x07, ZC3XX_R13A_GAMMA1A},
816	{0xa0, 0x06, ZC3XX_R13B_GAMMA1B},
817	{0xa0, 0x05, ZC3XX_R13C_GAMMA1C},
818	{0xa0, 0x04, ZC3XX_R13D_GAMMA1D},
819	{0xa0, 0x03, ZC3XX_R13E_GAMMA1E},
820	{0xa0, 0x02, ZC3XX_R13F_GAMMA1F},
821	{0xa0, 0x58, ZC3XX_R10A_RGB00},	/* matrix */
822	{0xa0, 0xf4, ZC3XX_R10B_RGB01},
823	{0xa0, 0xf4, ZC3XX_R10C_RGB02},
824	{0xa0, 0xf4, ZC3XX_R10D_RGB10},
825	{0xa0, 0x58, ZC3XX_R10E_RGB11},
826	{0xa0, 0xf4, ZC3XX_R10F_RGB12},
827	{0xa0, 0xf4, ZC3XX_R110_RGB20},
828	{0xa0, 0xf4, ZC3XX_R111_RGB21},
829	{0xa0, 0x58, ZC3XX_R112_RGB22},
830	{0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},
831	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
832	{0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},
833	{0xa0, 0x00, ZC3XX_R093_I2CSETVALUE},
834	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
835	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
836	{0xa0, 0x13, ZC3XX_R092_I2CADDRESSSELECT},
837	{0xa0, 0x22, ZC3XX_R093_I2CSETVALUE},
838	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
839	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
840	{0xa0, 0x14, ZC3XX_R092_I2CADDRESSSELECT},
841	{0xa0, 0x01, ZC3XX_R093_I2CSETVALUE},
842	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
843	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
844	{0xa0, 0x20, ZC3XX_R092_I2CADDRESSSELECT},
845	{0xa0, 0x01, ZC3XX_R093_I2CSETVALUE},
846	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
847	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
848	{0xa0, 0x21, ZC3XX_R092_I2CADDRESSSELECT},
849	{0xa0, 0x22, ZC3XX_R093_I2CSETVALUE},
850	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
851	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
852	{0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},
853	{0xa0, 0x04, ZC3XX_R093_I2CSETVALUE},
854	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
855	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
856	{0xa0, 0x01, ZC3XX_R0A3_EXPOSURETIMEHIGH},
857	{0xa0, 0x22, ZC3XX_R0A4_EXPOSURETIMELOW},
858	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},
859	{0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},
860	{0xa0, 0xee, ZC3XX_R192_EXPOSURELIMITLOW},
861	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
862	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},
863	{0xa0, 0x3a, ZC3XX_R197_ANTIFLICKERLOW},
864	{0xa0, 0x10, ZC3XX_R18C_AEFREEZE},
865	{0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},
866	{0xa0, 0x0c, ZC3XX_R1A9_DIGITALLIMITDIFF},
867	{0xa0, 0x28, ZC3XX_R1AA_DIGITALGAINSTEP},
868	{0xa0, 0x04, ZC3XX_R01D_HSYNC_0},
869	{0xa0, 0x0f, ZC3XX_R01E_HSYNC_1},
870	{0xa0, 0x19, ZC3XX_R01F_HSYNC_2},
871	{0xa0, 0x1f, ZC3XX_R020_HSYNC_3},
872	{0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},
873	{0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},
874	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},
875	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},
876	{0xa0, 0x60, ZC3XX_R116_RGAIN},
877	{0xa0, 0x40, ZC3XX_R117_GGAIN},
878	{0xa0, 0x4c, ZC3XX_R118_BGAIN},
879	{0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},
880	{0xa0, 0x20, ZC3XX_R092_I2CADDRESSSELECT},
881	{0xa0, 0x01, ZC3XX_R093_I2CSETVALUE},
882	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
883	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
884	{0xa0, 0x21, ZC3XX_R092_I2CADDRESSSELECT},
885	{0xa0, 0x5c, ZC3XX_R093_I2CSETVALUE},
886	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
887	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
888	{0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},
889	{0xa0, 0x00, ZC3XX_R093_I2CSETVALUE},
890	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
891	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
892	{0xa0, 0x13, ZC3XX_R092_I2CADDRESSSELECT},
893	{0xa0, 0x5c, ZC3XX_R093_I2CSETVALUE},
894	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
895	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
896	{0xa0, 0x14, ZC3XX_R092_I2CADDRESSSELECT},
897	{0xa0, 0x01, ZC3XX_R093_I2CSETVALUE},
898	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
899	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
900	{0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},
901	{0xa0, 0x04, ZC3XX_R093_I2CSETVALUE},
902	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
903	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
904	{0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},
905	{0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},
906	{0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},
907	{0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},
908	{0xa0, 0x20, ZC3XX_R092_I2CADDRESSSELECT},
909	{0xa0, 0x01, ZC3XX_R093_I2CSETVALUE},
910	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
911	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
912	{0xa0, 0x21, ZC3XX_R092_I2CADDRESSSELECT},
913	{0xa0, 0x96, ZC3XX_R093_I2CSETVALUE},
914	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
915	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
916	{0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},
917	{0xa0, 0x00, ZC3XX_R093_I2CSETVALUE},
918	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
919	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
920	{0xa0, 0x13, ZC3XX_R092_I2CADDRESSSELECT},
921	{0xa0, 0x96, ZC3XX_R093_I2CSETVALUE},
922	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
923	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
924	{0xa0, 0x14, ZC3XX_R092_I2CADDRESSSELECT},
925	{0xa0, 0x01, ZC3XX_R093_I2CSETVALUE},
926	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
927	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
928	{0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},
929	{0xa0, 0x04, ZC3XX_R093_I2CSETVALUE},
930	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
931	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
932	{0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},
933	{0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},
934	{0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},
935	{}
936};
937
938static const struct usb_action cs2102K_Initial[] = {
939	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},
940	{0xa0, 0x00, ZC3XX_R002_CLOCKSELECT},
941	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},
942	{0xa0, 0x08, ZC3XX_R010_CMOSSENSORSELECT},
943	{0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},
944	{0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},
945	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},
946	{0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},
947	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},
948	{0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC},
949	{0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},
950	{0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},
951	{0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},
952	{0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},
953	{0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},
954	{0xa0, 0xe8, ZC3XX_R09C_WINHEIGHTLOW},
955	{0xa0, 0x88, ZC3XX_R09E_WINWIDTHLOW},
956	{0xa0, 0x55, ZC3XX_R08B_I2CDEVICEADDR},
957	{0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},
958	{0xa0, 0x00, ZC3XX_R093_I2CSETVALUE},
959	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
960	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
961	{0xa0, 0x0a, ZC3XX_R092_I2CADDRESSSELECT},
962	{0xa0, 0x02, ZC3XX_R093_I2CSETVALUE},
963	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
964	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
965	{0xa0, 0x0b, ZC3XX_R092_I2CADDRESSSELECT},
966	{0xa0, 0x02, ZC3XX_R093_I2CSETVALUE},
967	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
968	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
969	{0xa0, 0x0c, ZC3XX_R092_I2CADDRESSSELECT},
970	{0xa0, 0x7b, ZC3XX_R093_I2CSETVALUE},
971	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
972	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
973	{0xa0, 0x0d, ZC3XX_R092_I2CADDRESSSELECT},
974	{0xa0, 0xa3, ZC3XX_R093_I2CSETVALUE},
975	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
976	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
977	{0xa0, 0x03, ZC3XX_R092_I2CADDRESSSELECT},
978	{0xa0, 0xfb, ZC3XX_R093_I2CSETVALUE},
979	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
980	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
981	{0xa0, 0x05, ZC3XX_R092_I2CADDRESSSELECT},
982	{0xa0, 0x00, ZC3XX_R093_I2CSETVALUE},
983	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
984	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
985	{0xa0, 0x06, ZC3XX_R092_I2CADDRESSSELECT},
986	{0xa0, 0x03, ZC3XX_R093_I2CSETVALUE},
987	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
988	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
989	{0xa0, 0x09, ZC3XX_R092_I2CADDRESSSELECT},
990	{0xa0, 0x08, ZC3XX_R093_I2CSETVALUE},
991	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
992	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
993	{0xa0, 0x0e, ZC3XX_R092_I2CADDRESSSELECT},
994	{0xa0, 0x04, ZC3XX_R093_I2CSETVALUE},
995	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
996	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
997	{0xa0, 0x0f, ZC3XX_R092_I2CADDRESSSELECT},
998	{0xa0, 0x18, ZC3XX_R093_I2CSETVALUE},
999	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1000	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1001	{0xa0, 0x10, ZC3XX_R092_I2CADDRESSSELECT},
1002	{0xa0, 0x18, ZC3XX_R093_I2CSETVALUE},
1003	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1004	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1005	{0xa0, 0x11, ZC3XX_R092_I2CADDRESSSELECT},
1006	{0xa0, 0x18, ZC3XX_R093_I2CSETVALUE},
1007	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1008	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1009	{0xa0, 0x12, ZC3XX_R092_I2CADDRESSSELECT},
1010	{0xa0, 0x18, ZC3XX_R093_I2CSETVALUE},
1011	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1012	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1013	{0xa0, 0x15, ZC3XX_R092_I2CADDRESSSELECT},
1014	{0xa0, 0x00, ZC3XX_R093_I2CSETVALUE},
1015	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1016	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1017	{0xa0, 0x16, ZC3XX_R092_I2CADDRESSSELECT},
1018	{0xa0, 0x0c, ZC3XX_R093_I2CSETVALUE},
1019	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1020	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1021	{0xa0, 0x17, ZC3XX_R092_I2CADDRESSSELECT},
1022	{0xa0, 0x0c, ZC3XX_R093_I2CSETVALUE},
1023	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1024	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1025	{0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},
1026	{0xa0, 0x04, ZC3XX_R093_I2CSETVALUE},
1027	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1028	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1029	{0xa0, 0xf7, ZC3XX_R101_SENSORCORRECTION},
1030	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},
1031	{0xa0, 0x78, ZC3XX_R18D_YTARGET},
1032	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},
1033	{0xa0, 0x06, ZC3XX_R189_AWBSTATUS},
1034	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},
1035	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},
1036	{0xa0, 0x20, ZC3XX_R087_EXPTIMEMID},
1037	{0xa0, 0x21, ZC3XX_R088_EXPTIMELOW},
1038	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},
1039	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},
1040	{0xa0, 0x00, 0x01ad},
1041	{0xa0, 0x01, 0x01b1},
1042	{0xa0, 0x02, ZC3XX_R180_AUTOCORRECTENABLE},
1043	{0xa0, 0x60, ZC3XX_R116_RGAIN},
1044	{0xa0, 0x40, ZC3XX_R117_GGAIN},
1045	{0xa0, 0x4c, ZC3XX_R118_BGAIN},
1046	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},	/* clock ? */
1047	{0xa0, 0x08, ZC3XX_R1C6_SHARPNESS00},	/* sharpness+ */
1048	{0xa0, 0x0f, ZC3XX_R1CB_SHARPNESS05},	/* sharpness- */
1049	{0xa0, 0x13, ZC3XX_R120_GAMMA00},	/* gamma 4 */
1050	{0xa0, 0x38, ZC3XX_R121_GAMMA01},
1051	{0xa0, 0x59, ZC3XX_R122_GAMMA02},
1052	{0xa0, 0x79, ZC3XX_R123_GAMMA03},
1053	{0xa0, 0x92, ZC3XX_R124_GAMMA04},
1054	{0xa0, 0xa7, ZC3XX_R125_GAMMA05},
1055	{0xa0, 0xb9, ZC3XX_R126_GAMMA06},
1056	{0xa0, 0xc8, ZC3XX_R127_GAMMA07},
1057	{0xa0, 0xd4, ZC3XX_R128_GAMMA08},
1058	{0xa0, 0xdf, ZC3XX_R129_GAMMA09},
1059	{0xa0, 0xe7, ZC3XX_R12A_GAMMA0A},
1060	{0xa0, 0xee, ZC3XX_R12B_GAMMA0B},
1061	{0xa0, 0xf4, ZC3XX_R12C_GAMMA0C},
1062	{0xa0, 0xf9, ZC3XX_R12D_GAMMA0D},
1063	{0xa0, 0xfc, ZC3XX_R12E_GAMMA0E},
1064	{0xa0, 0xff, ZC3XX_R12F_GAMMA0F},
1065	{0xa0, 0x26, ZC3XX_R130_GAMMA10},
1066	{0xa0, 0x22, ZC3XX_R131_GAMMA11},
1067	{0xa0, 0x20, ZC3XX_R132_GAMMA12},
1068	{0xa0, 0x1c, ZC3XX_R133_GAMMA13},
1069	{0xa0, 0x16, ZC3XX_R134_GAMMA14},
1070	{0xa0, 0x13, ZC3XX_R135_GAMMA15},
1071	{0xa0, 0x10, ZC3XX_R136_GAMMA16},
1072	{0xa0, 0x0d, ZC3XX_R137_GAMMA17},
1073	{0xa0, 0x0b, ZC3XX_R138_GAMMA18},
1074	{0xa0, 0x09, ZC3XX_R139_GAMMA19},
1075	{0xa0, 0x07, ZC3XX_R13A_GAMMA1A},
1076	{0xa0, 0x06, ZC3XX_R13B_GAMMA1B},
1077	{0xa0, 0x05, ZC3XX_R13C_GAMMA1C},
1078	{0xa0, 0x04, ZC3XX_R13D_GAMMA1D},
1079	{0xa0, 0x03, ZC3XX_R13E_GAMMA1E},
1080	{0xa0, 0x02, ZC3XX_R13F_GAMMA1F},
1081	{0xa0, 0x58, ZC3XX_R10A_RGB00},	/* matrix */
1082	{0xa0, 0xf4, ZC3XX_R10B_RGB01},
1083	{0xa0, 0xf4, ZC3XX_R10C_RGB02},
1084	{0xa0, 0xf4, ZC3XX_R10D_RGB10},
1085	{0xa0, 0x58, ZC3XX_R10E_RGB11},
1086	{0xa0, 0xf4, ZC3XX_R10F_RGB12},
1087	{0xa0, 0xf4, ZC3XX_R110_RGB20},
1088	{0xa0, 0xf4, ZC3XX_R111_RGB21},
1089	{0xa0, 0x58, ZC3XX_R112_RGB22},
1090	{0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},
1091	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
1092	{0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},
1093	{0xa0, 0x00, ZC3XX_R093_I2CSETVALUE},
1094	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1095	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1096	{0xa0, 0x13, ZC3XX_R092_I2CADDRESSSELECT},
1097	{0xa0, 0x22, ZC3XX_R093_I2CSETVALUE},
1098	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1099	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1100	{0xa0, 0x14, ZC3XX_R092_I2CADDRESSSELECT},
1101	{0xa0, 0x01, ZC3XX_R093_I2CSETVALUE},
1102	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1103	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1104	{0xa0, 0x20, ZC3XX_R092_I2CADDRESSSELECT},
1105	{0xa0, 0x01, ZC3XX_R093_I2CSETVALUE},
1106	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1107	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1108	{0xa0, 0x21, ZC3XX_R092_I2CADDRESSSELECT},
1109	{0xa0, 0x22, ZC3XX_R093_I2CSETVALUE},
1110	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1111	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1112	{0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},
1113	{0xa0, 0x04, ZC3XX_R093_I2CSETVALUE},
1114	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1115	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1116	{0xa0, 0x01, ZC3XX_R0A3_EXPOSURETIMEHIGH},
1117	{0xa0, 0x22, ZC3XX_R0A4_EXPOSURETIMELOW},
1118	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},
1119	{0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},
1120	{0xa0, 0xee, ZC3XX_R192_EXPOSURELIMITLOW},
1121	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
1122	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},
1123	{0xa0, 0x3a, ZC3XX_R197_ANTIFLICKERLOW},
1124	{0xa0, 0x10, ZC3XX_R18C_AEFREEZE},
1125	{0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},
1126	{0xa0, 0x0c, ZC3XX_R1A9_DIGITALLIMITDIFF},
1127	{0xa0, 0x28, ZC3XX_R1AA_DIGITALGAINSTEP},
1128	{0xa0, 0x04, ZC3XX_R01D_HSYNC_0},
1129	{0xa0, 0x0f, ZC3XX_R01E_HSYNC_1},
1130	{0xa0, 0x19, ZC3XX_R01F_HSYNC_2},
1131	{0xa0, 0x1f, ZC3XX_R020_HSYNC_3},
1132	{0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},
1133	{0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},
1134	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},
1135	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},
1136	{0xa0, 0x60, ZC3XX_R116_RGAIN},
1137	{0xa0, 0x40, ZC3XX_R117_GGAIN},
1138	{0xa0, 0x4c, ZC3XX_R118_BGAIN},
1139	{0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},
1140	{0xa0, 0x20, ZC3XX_R092_I2CADDRESSSELECT},
1141	{0xa0, 0x01, ZC3XX_R093_I2CSETVALUE},
1142	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1143	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1144	{0xa0, 0x21, ZC3XX_R092_I2CADDRESSSELECT},
1145	{0xa0, 0x5c, ZC3XX_R093_I2CSETVALUE},
1146	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1147	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1148	{0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},
1149	{0xa0, 0x00, ZC3XX_R093_I2CSETVALUE},
1150	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1151	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1152	{0xa0, 0x13, ZC3XX_R092_I2CADDRESSSELECT},
1153	{0xa0, 0x5c, ZC3XX_R093_I2CSETVALUE},
1154	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1155	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1156	{0xa0, 0x14, ZC3XX_R092_I2CADDRESSSELECT},
1157	{0xa0, 0x01, ZC3XX_R093_I2CSETVALUE},
1158	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1159	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1160	{0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},
1161	{0xa0, 0x04, ZC3XX_R093_I2CSETVALUE},
1162	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1163	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1164	{0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},
1165	{0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},
1166	{0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},
1167	{0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},
1168	{0xa0, 0x20, ZC3XX_R092_I2CADDRESSSELECT},
1169	{0xa0, 0x01, ZC3XX_R093_I2CSETVALUE},
1170	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1171	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1172	{0xa0, 0x21, ZC3XX_R092_I2CADDRESSSELECT},
1173	{0xa0, 0x96, ZC3XX_R093_I2CSETVALUE},
1174	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1175	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1176	{0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},
1177	{0xa0, 0x00, ZC3XX_R093_I2CSETVALUE},
1178	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1179	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1180	{0xa0, 0x13, ZC3XX_R092_I2CADDRESSSELECT},
1181	{0xa0, 0x96, ZC3XX_R093_I2CSETVALUE},
1182	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1183	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1184	{0xa0, 0x14, ZC3XX_R092_I2CADDRESSSELECT},
1185	{0xa0, 0x01, ZC3XX_R093_I2CSETVALUE},
1186	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1187	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1188	{0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},
1189	{0xa0, 0x04, ZC3XX_R093_I2CSETVALUE},
1190	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1191	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1192	{0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},
1193	{0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},
1194	{0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},
1195	{0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},
1196	{0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},
1197	{0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},
1198	{0xa0, 0x20, ZC3XX_R092_I2CADDRESSSELECT},
1199	{0xa0, 0x01, ZC3XX_R093_I2CSETVALUE},
1200	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1201	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1202	{0xa0, 0x21, ZC3XX_R092_I2CADDRESSSELECT},
1203	{0xa0, 0xd0, ZC3XX_R093_I2CSETVALUE},
1204	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1205	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1206	{0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},
1207	{0xa0, 0x00, ZC3XX_R093_I2CSETVALUE},
1208	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1209	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1210	{0xa0, 0x13, ZC3XX_R092_I2CADDRESSSELECT},
1211	{0xa0, 0xd0, ZC3XX_R093_I2CSETVALUE},
1212	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1213	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1214	{0xa0, 0x14, ZC3XX_R092_I2CADDRESSSELECT},
1215	{0xa0, 0x01, ZC3XX_R093_I2CSETVALUE},
1216	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1217	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1218	{0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},
1219	{0xa0, 0x04, ZC3XX_R093_I2CSETVALUE},
1220	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1221	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1222	{0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},
1223	{0xa0, 0x02, ZC3XX_R008_CLOCKSETTING},
1224	{0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},
1225	{0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},
1226	{0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},
1227	{0xa0, 0x20, ZC3XX_R092_I2CADDRESSSELECT},
1228	{0xa0, 0x02, ZC3XX_R093_I2CSETVALUE},
1229	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1230	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1231	{0xa0, 0x21, ZC3XX_R092_I2CADDRESSSELECT},
1232	{0xa0, 0x0a, ZC3XX_R093_I2CSETVALUE},
1233	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1234	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1235	{0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},
1236	{0xa0, 0x00, ZC3XX_R093_I2CSETVALUE},
1237	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1238	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1239	{0xa0, 0x13, ZC3XX_R092_I2CADDRESSSELECT},
1240	{0xa0, 0x0a, ZC3XX_R093_I2CSETVALUE},
1241	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1242	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1243	{0xa0, 0x14, ZC3XX_R092_I2CADDRESSSELECT},
1244	{0xa0, 0x02, ZC3XX_R093_I2CSETVALUE},
1245	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1246	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1247	{0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},
1248	{0xa0, 0x04, ZC3XX_R093_I2CSETVALUE},
1249	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1250	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1251	{0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},
1252	{0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},
1253	{0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},
1254	{0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},
1255	{0xa0, 0x20, ZC3XX_R092_I2CADDRESSSELECT},
1256	{0xa0, 0x02, ZC3XX_R093_I2CSETVALUE},
1257	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1258	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1259	{0xa0, 0x21, ZC3XX_R092_I2CADDRESSSELECT},
1260	{0xa0, 0x44, ZC3XX_R093_I2CSETVALUE},
1261	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1262	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1263	{0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},
1264	{0xa0, 0x00, ZC3XX_R093_I2CSETVALUE},
1265	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1266	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1267	{0xa0, 0x13, ZC3XX_R092_I2CADDRESSSELECT},
1268	{0xa0, 0x44, ZC3XX_R093_I2CSETVALUE},
1269	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1270	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1271	{0xa0, 0x14, ZC3XX_R092_I2CADDRESSSELECT},
1272	{0xa0, 0x02, ZC3XX_R093_I2CSETVALUE},
1273	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1274	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1275	{0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},
1276	{0xa0, 0x04, ZC3XX_R093_I2CSETVALUE},
1277	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1278	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1279	{0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},
1280	{0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},
1281	{0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},
1282	{0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},
1283	{0xa0, 0x20, ZC3XX_R092_I2CADDRESSSELECT},
1284	{0xa0, 0x02, ZC3XX_R093_I2CSETVALUE},
1285	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1286	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1287	{0xa0, 0x21, ZC3XX_R092_I2CADDRESSSELECT},
1288	{0xa0, 0x7e, ZC3XX_R093_I2CSETVALUE},
1289	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1290	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1291	{0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},
1292	{0xa0, 0x00, ZC3XX_R093_I2CSETVALUE},
1293	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1294	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1295	{0xa0, 0x13, ZC3XX_R092_I2CADDRESSSELECT},
1296	{0xa0, 0x7e, ZC3XX_R093_I2CSETVALUE},
1297	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1298	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1299	{0xa0, 0x14, ZC3XX_R092_I2CADDRESSSELECT},
1300	{0xa0, 0x02, ZC3XX_R093_I2CSETVALUE},
1301	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1302	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1303	{0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},
1304	{0xa0, 0x04, ZC3XX_R093_I2CSETVALUE},
1305	{0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},
1306	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
1307	{0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},
1308	{0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},
1309	{0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},
1310	{0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},
1311	{}
1312};
1313
1314static const struct usb_action gc0305_Initial[] = {	/* 640x480 */
1315	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},	/* 00,00,01,cc */
1316	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},	/* 00,08,03,cc */
1317	{0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,01,cc */
1318	{0xa0, 0x04, ZC3XX_R002_CLOCKSELECT},	/* 00,02,04,cc */
1319	{0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},	/* 00,03,02,cc */
1320	{0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},	/* 00,04,80,cc */
1321	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},	/* 00,05,01,cc */
1322	{0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},	/* 00,06,e0,cc */
1323	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},	/* 00,01,01,cc */
1324	{0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC},	/* 00,12,03,cc */
1325	{0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},	/* 00,12,01,cc */
1326	{0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},	/* 00,98,00,cc */
1327	{0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},	/* 00,9a,00,cc */
1328	{0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},	/* 01,1a,00,cc */
1329	{0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},	/* 01,1c,00,cc */
1330	{0xa0, 0xe6, ZC3XX_R09C_WINHEIGHTLOW},	/* 00,9c,e6,cc */
1331	{0xa0, 0x86, ZC3XX_R09E_WINWIDTHLOW},	/* 00,9e,86,cc */
1332	{0xa0, 0x98, ZC3XX_R08B_I2CDEVICEADDR},	/* 00,8b,98,cc */
1333	{0xaa, 0x13, 0x0002},	/* 00,13,02,aa */
1334	{0xaa, 0x15, 0x0003},	/* 00,15,03,aa */
1335	{0xaa, 0x01, 0x0000},	/* 00,01,00,aa */
1336	{0xaa, 0x02, 0x0000},	/* 00,02,00,aa */
1337	{0xaa, 0x1a, 0x0000},	/* 00,1a,00,aa */
1338	{0xaa, 0x1c, 0x0017},	/* 00,1c,17,aa */
1339	{0xaa, 0x1d, 0x0080},	/* 00,1d,80,aa */
1340	{0xaa, 0x1f, 0x0008},	/* 00,1f,08,aa */
1341	{0xaa, 0x21, 0x0012},	/* 00,21,12,aa */
1342	{0xa0, 0x82, ZC3XX_R086_EXPTIMEHIGH},	/* 00,86,82,cc */
1343	{0xa0, 0x83, ZC3XX_R087_EXPTIMEMID},	/* 00,87,83,cc */
1344	{0xa0, 0x84, ZC3XX_R088_EXPTIMELOW},	/* 00,88,84,cc */
1345	{0xaa, 0x05, 0x0000},	/* 00,05,00,aa */
1346	{0xaa, 0x0a, 0x0000},	/* 00,0a,00,aa */
1347	{0xaa, 0x0b, 0x00b0},	/* 00,0b,b0,aa */
1348	{0xaa, 0x0c, 0x0000},	/* 00,0c,00,aa */
1349	{0xaa, 0x0d, 0x00b0},	/* 00,0d,b0,aa */
1350	{0xaa, 0x0e, 0x0000},	/* 00,0e,00,aa */
1351	{0xaa, 0x0f, 0x00b0},	/* 00,0f,b0,aa */
1352	{0xaa, 0x10, 0x0000},	/* 00,10,00,aa */
1353	{0xaa, 0x11, 0x00b0},	/* 00,11,b0,aa */
1354	{0xaa, 0x16, 0x0001},	/* 00,16,01,aa */
1355	{0xaa, 0x17, 0x00e6},	/* 00,17,e6,aa */
1356	{0xaa, 0x18, 0x0002},	/* 00,18,02,aa */
1357	{0xaa, 0x19, 0x0086},	/* 00,19,86,aa */
1358	{0xaa, 0x20, 0x0000},	/* 00,20,00,aa */
1359	{0xaa, 0x1b, 0x0020},	/* 00,1b,20,aa */
1360	{0xa0, 0xb7, ZC3XX_R101_SENSORCORRECTION},	/* 01,01,b7,cc */
1361	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},	/* 00,12,05,cc */
1362	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},	/* 01,00,0d,cc */
1363	{0xa0, 0x76, ZC3XX_R189_AWBSTATUS},	/* 01,89,76,cc */
1364	{0xa0, 0x09, 0x01ad},	/* 01,ad,09,cc */
1365	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},	/* 01,c5,03,cc */
1366	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},	/* 01,cb,13,cc */
1367	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},	/* 02,50,08,cc */
1368	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},	/* 03,01,08,cc */
1369	{0xa0, 0x60, ZC3XX_R1A8_DIGITALGAIN},	/* 01,a8,60,cc */
1370	{0xa0, 0x85, ZC3XX_R18D_YTARGET},	/* 01,8d,85,cc */
1371	{0xa0, 0x00, 0x011e},	/* 01,1e,00,cc */
1372	{0xa0, 0x52, ZC3XX_R116_RGAIN},	/* 01,16,52,cc */
1373	{0xa0, 0x40, ZC3XX_R117_GGAIN},	/* 01,17,40,cc */
1374	{0xa0, 0x52, ZC3XX_R118_BGAIN},	/* 01,18,52,cc */
1375	{0xa0, 0x03, ZC3XX_R113_RGB03},	/* 01,13,03,cc */
1376	{}
1377};
1378static const struct usb_action gc0305_InitialScale[] = { /* 320x240 */
1379	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},	/* 00,00,01,cc */
1380	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},	/* 00,08,03,cc */
1381	{0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,01,cc */
1382	{0xa0, 0x10, ZC3XX_R002_CLOCKSELECT},	/* 00,02,10,cc */
1383	{0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},	/* 00,03,02,cc */
1384	{0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},	/* 00,04,80,cc */
1385	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},	/* 00,05,01,cc */
1386	{0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},	/* 00,06,e0,cc */
1387	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},	/* 00,01,01,cc */
1388	{0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC},	/* 00,12,03,cc */
1389	{0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},	/* 00,12,01,cc */
1390	{0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},	/* 00,98,00,cc */
1391	{0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},	/* 00,9a,00,cc */
1392	{0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},	/* 01,1a,00,cc */
1393	{0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},	/* 01,1c,00,cc */
1394	{0xa0, 0xe8, ZC3XX_R09C_WINHEIGHTLOW},	/* 00,9c,e8,cc */
1395	{0xa0, 0x88, ZC3XX_R09E_WINWIDTHLOW},	/* 00,9e,88,cc */
1396	{0xa0, 0x98, ZC3XX_R08B_I2CDEVICEADDR},	/* 00,8b,98,cc */
1397	{0xaa, 0x13, 0x0000},	/* 00,13,00,aa */
1398	{0xaa, 0x15, 0x0001},	/* 00,15,01,aa */
1399	{0xaa, 0x01, 0x0000},	/* 00,01,00,aa */
1400	{0xaa, 0x02, 0x0000},	/* 00,02,00,aa */
1401	{0xaa, 0x1a, 0x0000},	/* 00,1a,00,aa */
1402	{0xaa, 0x1c, 0x0017},	/* 00,1c,17,aa */
1403	{0xaa, 0x1d, 0x0080},	/* 00,1d,80,aa */
1404	{0xaa, 0x1f, 0x0008},	/* 00,1f,08,aa */
1405	{0xaa, 0x21, 0x0012},	/* 00,21,12,aa */
1406	{0xa0, 0x82, ZC3XX_R086_EXPTIMEHIGH},	/* 00,86,82,cc */
1407	{0xa0, 0x83, ZC3XX_R087_EXPTIMEMID},	/* 00,87,83,cc */
1408	{0xa0, 0x84, ZC3XX_R088_EXPTIMELOW},	/* 00,88,84,cc */
1409	{0xaa, 0x05, 0x0000},	/* 00,05,00,aa */
1410	{0xaa, 0x0a, 0x0000},	/* 00,0a,00,aa */
1411	{0xaa, 0x0b, 0x00b0},	/* 00,0b,b0,aa */
1412	{0xaa, 0x0c, 0x0000},	/* 00,0c,00,aa */
1413	{0xaa, 0x0d, 0x00b0},	/* 00,0d,b0,aa */
1414	{0xaa, 0x0e, 0x0000},	/* 00,0e,00,aa */
1415	{0xaa, 0x0f, 0x00b0},	/* 00,0f,b0,aa */
1416	{0xaa, 0x10, 0x0000},	/* 00,10,00,aa */
1417	{0xaa, 0x11, 0x00b0},	/* 00,11,b0,aa */
1418	{0xaa, 0x16, 0x0001},	/* 00,16,01,aa */
1419	{0xaa, 0x17, 0x00e8},	/* 00,17,e8,aa */
1420	{0xaa, 0x18, 0x0002},	/* 00,18,02,aa */
1421	{0xaa, 0x19, 0x0088},	/* 00,19,88,aa */
1422	{0xaa, 0x20, 0x0000},	/* 00,20,00,aa */
1423	{0xaa, 0x1b, 0x0020},	/* 00,1b,20,aa */
1424	{0xa0, 0xb7, ZC3XX_R101_SENSORCORRECTION},	/* 01,01,b7,cc */
1425	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},	/* 00,12,05,cc */
1426	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},	/* 01,00,0d,cc */
1427	{0xa0, 0x76, ZC3XX_R189_AWBSTATUS},	/* 01,89,76,cc */
1428	{0xa0, 0x09, 0x01ad},	/* 01,ad,09,cc */
1429	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},	/* 01,c5,03,cc */
1430	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},	/* 01,cb,13,cc */
1431	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},	/* 02,50,08,cc */
1432	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},	/* 03,01,08,cc */
1433	{0xa0, 0x60, ZC3XX_R1A8_DIGITALGAIN},	/* 01,a8,60,cc */
1434	{0xa0, 0x00, 0x011e},	/* 01,1e,00,cc */
1435	{0xa0, 0x52, ZC3XX_R116_RGAIN},	/* 01,16,52,cc */
1436	{0xa0, 0x40, ZC3XX_R117_GGAIN},	/* 01,17,40,cc */
1437	{0xa0, 0x52, ZC3XX_R118_BGAIN},	/* 01,18,52,cc */
1438	{0xa0, 0x03, ZC3XX_R113_RGB03},	/* 01,13,03,cc */
1439	{}
1440};
1441static const struct usb_action gc0305_50HZ[] = {
1442	{0xaa, 0x82, 0x0000},	/* 00,82,00,aa */
1443	{0xaa, 0x83, 0x0002},	/* 00,83,02,aa */
1444	{0xaa, 0x84, 0x0038},	/* 00,84,38,aa */	/* win: 00,84,ec */
1445	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},	/* 01,90,00,cc */
1446	{0xa0, 0x0b, ZC3XX_R191_EXPOSURELIMITMID},	/* 01,91,0b,cc */
1447	{0xa0, 0x18, ZC3XX_R192_EXPOSURELIMITLOW},	/* 01,92,18,cc */
1448							/* win: 01,92,10 */
1449	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},	/* 01,95,00,cc */
1450	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},	/* 01,96,00,cc */
1451	{0xa0, 0x8e, ZC3XX_R197_ANTIFLICKERLOW},	/* 01,97,8e,cc */
1452							/* win: 01,97,ec */
1453	{0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},	/* 01,8c,0e,cc */
1454	{0xa0, 0x15, ZC3XX_R18F_AEUNFREEZE},	/* 01,8f,15,cc */
1455	{0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF},	/* 01,a9,10,cc */
1456	{0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},	/* 01,aa,24,cc */
1457	{0xa0, 0x62, ZC3XX_R01D_HSYNC_0},	/* 00,1d,62,cc */
1458	{0xa0, 0x90, ZC3XX_R01E_HSYNC_1},	/* 00,1e,90,cc */
1459	{0xa0, 0xc8, ZC3XX_R01F_HSYNC_2},	/* 00,1f,c8,cc */
1460	{0xa0, 0xff, ZC3XX_R020_HSYNC_3},	/* 00,20,ff,cc */
1461	{0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},	/* 01,1d,60,cc */
1462	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},	/* 01,80,42,cc */
1463/*	{0xa0, 0x85, ZC3XX_R18D_YTARGET},	 * 01,8d,85,cc *
1464						 * if 640x480 */
1465	{}
1466};
1467static const struct usb_action gc0305_60HZ[] = {
1468	{0xaa, 0x82, 0x0000},	/* 00,82,00,aa */
1469	{0xaa, 0x83, 0x0000},	/* 00,83,00,aa */
1470	{0xaa, 0x84, 0x00ec},	/* 00,84,ec,aa */
1471	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},	/* 01,90,00,cc */
1472	{0xa0, 0x0b, ZC3XX_R191_EXPOSURELIMITMID},	/* 01,91,0b,cc */
1473	{0xa0, 0x10, ZC3XX_R192_EXPOSURELIMITLOW},	/* 01,92,10,cc */
1474	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},	/* 01,95,00,cc */
1475	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},	/* 01,96,00,cc */
1476	{0xa0, 0xec, ZC3XX_R197_ANTIFLICKERLOW},	/* 01,97,ec,cc */
1477	{0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},	/* 01,8c,0e,cc */
1478	{0xa0, 0x15, ZC3XX_R18F_AEUNFREEZE},	/* 01,8f,15,cc */
1479	{0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF},	/* 01,a9,10,cc */
1480	{0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},	/* 01,aa,24,cc */
1481	{0xa0, 0x62, ZC3XX_R01D_HSYNC_0},	/* 00,1d,62,cc */
1482	{0xa0, 0x90, ZC3XX_R01E_HSYNC_1},	/* 00,1e,90,cc */
1483	{0xa0, 0xc8, ZC3XX_R01F_HSYNC_2},	/* 00,1f,c8,cc */
1484	{0xa0, 0xff, ZC3XX_R020_HSYNC_3},	/* 00,20,ff,cc */
1485	{0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},	/* 01,1d,60,cc */
1486	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},	/* 01,80,42,cc */
1487	{0xa0, 0x80, ZC3XX_R18D_YTARGET},	/* 01,8d,80,cc */
1488	{}
1489};
1490
1491static const struct usb_action gc0305_NoFliker[] = {
1492	{0xa0, 0x0c, ZC3XX_R100_OPERATIONMODE},	/* 01,00,0c,cc */
1493	{0xaa, 0x82, 0x0000},	/* 00,82,00,aa */
1494	{0xaa, 0x83, 0x0000},	/* 00,83,00,aa */
1495	{0xaa, 0x84, 0x0020},	/* 00,84,20,aa */
1496	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},	/* 01,90,00,cc */
1497	{0xa0, 0x00, ZC3XX_R191_EXPOSURELIMITMID},	/* 01,91,00,cc */
1498	{0xa0, 0x48, ZC3XX_R192_EXPOSURELIMITLOW},	/* 01,92,48,cc */
1499	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},	/* 01,95,00,cc */
1500	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},	/* 01,96,00,cc */
1501	{0xa0, 0x10, ZC3XX_R197_ANTIFLICKERLOW},	/* 01,97,10,cc */
1502	{0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},	/* 01,8c,0e,cc */
1503	{0xa0, 0x15, ZC3XX_R18F_AEUNFREEZE},	/* 01,8f,15,cc */
1504	{0xa0, 0x62, ZC3XX_R01D_HSYNC_0},	/* 00,1d,62,cc */
1505	{0xa0, 0x90, ZC3XX_R01E_HSYNC_1},	/* 00,1e,90,cc */
1506	{0xa0, 0xc8, ZC3XX_R01F_HSYNC_2},	/* 00,1f,c8,cc */
1507	{0xa0, 0xff, ZC3XX_R020_HSYNC_3},	/* 00,20,ff,cc */
1508	{0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},	/* 01,1d,60,cc */
1509	{0xa0, 0x03, ZC3XX_R180_AUTOCORRECTENABLE},	/* 01,80,03,cc */
1510	{0xa0, 0x80, ZC3XX_R18D_YTARGET},	/* 01,8d,80,cc */
1511	{}
1512};
1513
1514static const struct usb_action hdcs2020b_InitialScale[] = {
1515	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},
1516	{0xa0, 0x11, ZC3XX_R002_CLOCKSELECT},
1517	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},	/* qtable 0x05 */
1518	{0xa0, 0x08, ZC3XX_R010_CMOSSENSORSELECT},
1519	{0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},
1520	{0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},
1521	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},
1522	{0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},
1523	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},
1524	{0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC},
1525	{0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},
1526	{0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},
1527	{0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},
1528	{0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},
1529	{0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},
1530	{0xa0, 0xe8, ZC3XX_R09C_WINHEIGHTLOW},
1531	{0xa0, 0x88, ZC3XX_R09E_WINWIDTHLOW},
1532	{0xaa, 0x1c, 0x0000},
1533	{0xaa, 0x0a, 0x0001},
1534	{0xaa, 0x0b, 0x0006},
1535	{0xaa, 0x0c, 0x007b},
1536	{0xaa, 0x0d, 0x00a7},
1537	{0xaa, 0x03, 0x00fb},
1538	{0xaa, 0x05, 0x0000},
1539	{0xaa, 0x06, 0x0003},
1540	{0xaa, 0x09, 0x0008},
1541
1542	{0xaa, 0x0f, 0x0018},	/* set sensor gain */
1543	{0xaa, 0x10, 0x0018},
1544	{0xaa, 0x11, 0x0018},
1545	{0xaa, 0x12, 0x0018},
1546
1547	{0xaa, 0x15, 0x004e},
1548	{0xaa, 0x1c, 0x0004},
1549	{0xa0, 0xb7, ZC3XX_R101_SENSORCORRECTION},
1550	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},
1551	{0xa0, 0x70, ZC3XX_R18D_YTARGET},
1552	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},
1553	{0xa0, 0x06, ZC3XX_R189_AWBSTATUS},
1554	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},
1555	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},
1556	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},
1557	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},
1558	{0xa1, 0x01, 0x0002},
1559	{0xa1, 0x01, 0x0008},
1560	{0xa1, 0x01, 0x0180},
1561	{0xa0, 0x02, ZC3XX_R180_AUTOCORRECTENABLE},
1562	{0xa0, 0x40, ZC3XX_R116_RGAIN},
1563	{0xa0, 0x40, ZC3XX_R117_GGAIN},
1564	{0xa0, 0x40, ZC3XX_R118_BGAIN},
1565	{0xa1, 0x01, 0x0008},
1566	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},	/* clock ? */
1567	{0xa0, 0x08, ZC3XX_R1C6_SHARPNESS00},	/* sharpness+ */
1568	{0xa1, 0x01, 0x01c8},
1569	{0xa1, 0x01, 0x01c9},
1570	{0xa1, 0x01, 0x01ca},
1571	{0xa0, 0x0f, ZC3XX_R1CB_SHARPNESS05},	/* sharpness- */
1572	{0xa0, 0x13, ZC3XX_R120_GAMMA00},	/* gamma 4 */
1573	{0xa0, 0x38, ZC3XX_R121_GAMMA01},
1574	{0xa0, 0x59, ZC3XX_R122_GAMMA02},
1575	{0xa0, 0x79, ZC3XX_R123_GAMMA03},
1576	{0xa0, 0x92, ZC3XX_R124_GAMMA04},
1577	{0xa0, 0xa7, ZC3XX_R125_GAMMA05},
1578	{0xa0, 0xb9, ZC3XX_R126_GAMMA06},
1579	{0xa0, 0xc8, ZC3XX_R127_GAMMA07},
1580	{0xa0, 0xd4, ZC3XX_R128_GAMMA08},
1581	{0xa0, 0xdf, ZC3XX_R129_GAMMA09},
1582	{0xa0, 0xe7, ZC3XX_R12A_GAMMA0A},
1583	{0xa0, 0xee, ZC3XX_R12B_GAMMA0B},
1584	{0xa0, 0xf4, ZC3XX_R12C_GAMMA0C},
1585	{0xa0, 0xf9, ZC3XX_R12D_GAMMA0D},
1586	{0xa0, 0xfc, ZC3XX_R12E_GAMMA0E},
1587	{0xa0, 0xff, ZC3XX_R12F_GAMMA0F},
1588	{0xa0, 0x26, ZC3XX_R130_GAMMA10},
1589	{0xa0, 0x22, ZC3XX_R131_GAMMA11},
1590	{0xa0, 0x20, ZC3XX_R132_GAMMA12},
1591	{0xa0, 0x1c, ZC3XX_R133_GAMMA13},
1592	{0xa0, 0x16, ZC3XX_R134_GAMMA14},
1593	{0xa0, 0x13, ZC3XX_R135_GAMMA15},
1594	{0xa0, 0x10, ZC3XX_R136_GAMMA16},
1595	{0xa0, 0x0d, ZC3XX_R137_GAMMA17},
1596	{0xa0, 0x0b, ZC3XX_R138_GAMMA18},
1597	{0xa0, 0x09, ZC3XX_R139_GAMMA19},
1598	{0xa0, 0x07, ZC3XX_R13A_GAMMA1A},
1599	{0xa0, 0x06, ZC3XX_R13B_GAMMA1B},
1600	{0xa0, 0x05, ZC3XX_R13C_GAMMA1C},
1601	{0xa0, 0x04, ZC3XX_R13D_GAMMA1D},
1602	{0xa0, 0x03, ZC3XX_R13E_GAMMA1E},
1603	{0xa0, 0x02, ZC3XX_R13F_GAMMA1F},
1604
1605	{0xa0, 0x66, ZC3XX_R10A_RGB00},	/* matrix */
1606	{0xa0, 0xed, ZC3XX_R10B_RGB01},
1607	{0xa0, 0xed, ZC3XX_R10C_RGB02},
1608	{0xa0, 0xed, ZC3XX_R10D_RGB10},
1609	{0xa0, 0x66, ZC3XX_R10E_RGB11},
1610	{0xa0, 0xed, ZC3XX_R10F_RGB12},
1611	{0xa0, 0xed, ZC3XX_R110_RGB20},
1612	{0xa0, 0xed, ZC3XX_R111_RGB21},
1613	{0xa0, 0x66, ZC3XX_R112_RGB22},
1614
1615	{0xa1, 0x01, 0x0180},
1616	{0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},
1617	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
1618	{0xaa, 0x13, 0x0031},
1619	{0xaa, 0x14, 0x0001},
1620	{0xaa, 0x0e, 0x0004},
1621	{0xaa, 0x19, 0x00cd},
1622	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},
1623	{0xa0, 0x02, ZC3XX_R191_EXPOSURELIMITMID},
1624	{0xa0, 0x62, ZC3XX_R192_EXPOSURELIMITLOW},
1625	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
1626	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},
1627	{0xa0, 0x3d, ZC3XX_R197_ANTIFLICKERLOW},
1628	{0xa0, 0x10, ZC3XX_R18C_AEFREEZE},
1629	{0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},
1630
1631	{0xa0, 0x0c, ZC3XX_R1A9_DIGITALLIMITDIFF},	/* 0x14 */
1632	{0xa0, 0x28, ZC3XX_R1AA_DIGITALGAINSTEP},
1633	{0xa0, 0x04, ZC3XX_R01D_HSYNC_0},
1634	{0xa0, 0x18, ZC3XX_R01E_HSYNC_1},
1635	{0xa0, 0x2c, ZC3XX_R01F_HSYNC_2},
1636	{0xa0, 0x41, ZC3XX_R020_HSYNC_3},
1637	{0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},
1638	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},
1639	{0xa1, 0x01, 0x0180},
1640	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},
1641	{0xa0, 0x40, ZC3XX_R116_RGAIN},
1642	{0xa0, 0x40, ZC3XX_R117_GGAIN},
1643	{0xa0, 0x40, ZC3XX_R118_BGAIN},
1644	{}
1645};
1646static const struct usb_action hdcs2020b_Initial[] = {
1647	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},
1648	{0xa0, 0x00, ZC3XX_R002_CLOCKSELECT},
1649	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},
1650	{0xa0, 0x08, ZC3XX_R010_CMOSSENSORSELECT},
1651	{0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},
1652	{0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},
1653	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},
1654	{0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},
1655	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},
1656	{0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC},
1657	{0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},
1658	{0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},
1659	{0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},
1660	{0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},
1661	{0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},
1662	{0xa0, 0xe8, ZC3XX_R09C_WINHEIGHTLOW},
1663	{0xa0, 0x88, ZC3XX_R09E_WINWIDTHLOW},
1664	{0xaa, 0x1c, 0x0000},
1665	{0xaa, 0x0a, 0x0001},
1666	{0xaa, 0x0b, 0x0006},
1667	{0xaa, 0x0c, 0x007a},
1668	{0xaa, 0x0d, 0x00a7},
1669	{0xaa, 0x03, 0x00fb},
1670	{0xaa, 0x05, 0x0000},
1671	{0xaa, 0x06, 0x0003},
1672	{0xaa, 0x09, 0x0008},
1673	{0xaa, 0x0f, 0x0018},	/* original setting */
1674	{0xaa, 0x10, 0x0018},
1675	{0xaa, 0x11, 0x0018},
1676	{0xaa, 0x12, 0x0018},
1677	{0xaa, 0x15, 0x004e},
1678	{0xaa, 0x1c, 0x0004},
1679	{0xa0, 0xf7, ZC3XX_R101_SENSORCORRECTION},
1680	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},
1681	{0xa0, 0x70, ZC3XX_R18D_YTARGET},
1682	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},
1683	{0xa0, 0x06, ZC3XX_R189_AWBSTATUS},
1684	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},
1685	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},
1686	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},
1687	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},
1688	{0xa1, 0x01, 0x0002},
1689	{0xa1, 0x01, 0x0008},
1690	{0xa1, 0x01, 0x0180},
1691	{0xa0, 0x02, ZC3XX_R180_AUTOCORRECTENABLE},
1692	{0xa0, 0x40, ZC3XX_R116_RGAIN},
1693	{0xa0, 0x40, ZC3XX_R117_GGAIN},
1694	{0xa0, 0x40, ZC3XX_R118_BGAIN},
1695	{0xa1, 0x01, 0x0008},
1696	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},	/* clock ? */
1697	{0xa0, 0x08, ZC3XX_R1C6_SHARPNESS00},	/* sharpness+ */
1698	{0xa1, 0x01, 0x01c8},
1699	{0xa1, 0x01, 0x01c9},
1700	{0xa1, 0x01, 0x01ca},
1701	{0xa0, 0x0f, ZC3XX_R1CB_SHARPNESS05},	/* sharpness- */
1702	{0xa0, 0x13, ZC3XX_R120_GAMMA00},	/* gamma 4 */
1703	{0xa0, 0x38, ZC3XX_R121_GAMMA01},
1704	{0xa0, 0x59, ZC3XX_R122_GAMMA02},
1705	{0xa0, 0x79, ZC3XX_R123_GAMMA03},
1706	{0xa0, 0x92, ZC3XX_R124_GAMMA04},
1707	{0xa0, 0xa7, ZC3XX_R125_GAMMA05},
1708	{0xa0, 0xb9, ZC3XX_R126_GAMMA06},
1709	{0xa0, 0xc8, ZC3XX_R127_GAMMA07},
1710	{0xa0, 0xd4, ZC3XX_R128_GAMMA08},
1711	{0xa0, 0xdf, ZC3XX_R129_GAMMA09},
1712	{0xa0, 0xe7, ZC3XX_R12A_GAMMA0A},
1713	{0xa0, 0xee, ZC3XX_R12B_GAMMA0B},
1714	{0xa0, 0xf4, ZC3XX_R12C_GAMMA0C},
1715	{0xa0, 0xf9, ZC3XX_R12D_GAMMA0D},
1716	{0xa0, 0xfc, ZC3XX_R12E_GAMMA0E},
1717	{0xa0, 0xff, ZC3XX_R12F_GAMMA0F},
1718	{0xa0, 0x26, ZC3XX_R130_GAMMA10},
1719	{0xa0, 0x22, ZC3XX_R131_GAMMA11},
1720	{0xa0, 0x20, ZC3XX_R132_GAMMA12},
1721	{0xa0, 0x1c, ZC3XX_R133_GAMMA13},
1722	{0xa0, 0x16, ZC3XX_R134_GAMMA14},
1723	{0xa0, 0x13, ZC3XX_R135_GAMMA15},
1724	{0xa0, 0x10, ZC3XX_R136_GAMMA16},
1725	{0xa0, 0x0d, ZC3XX_R137_GAMMA17},
1726	{0xa0, 0x0b, ZC3XX_R138_GAMMA18},
1727	{0xa0, 0x09, ZC3XX_R139_GAMMA19},
1728	{0xa0, 0x07, ZC3XX_R13A_GAMMA1A},
1729	{0xa0, 0x06, ZC3XX_R13B_GAMMA1B},
1730	{0xa0, 0x05, ZC3XX_R13C_GAMMA1C},
1731	{0xa0, 0x04, ZC3XX_R13D_GAMMA1D},
1732	{0xa0, 0x03, ZC3XX_R13E_GAMMA1E},
1733	{0xa0, 0x02, ZC3XX_R13F_GAMMA1F},
1734	{0xa0, 0x66, ZC3XX_R10A_RGB00},	/* matrix */
1735	{0xa0, 0xed, ZC3XX_R10B_RGB01},
1736	{0xa0, 0xed, ZC3XX_R10C_RGB02},
1737	{0xa0, 0xed, ZC3XX_R10D_RGB10},
1738	{0xa0, 0x66, ZC3XX_R10E_RGB11},
1739	{0xa0, 0xed, ZC3XX_R10F_RGB12},
1740	{0xa0, 0xed, ZC3XX_R110_RGB20},
1741	{0xa0, 0xed, ZC3XX_R111_RGB21},
1742	{0xa0, 0x66, ZC3XX_R112_RGB22},
1743	{0xa1, 0x01, 0x0180},
1744	{0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},
1745	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
1746 /**** set exposure ***/
1747	{0xaa, 0x13, 0x0031},
1748	{0xaa, 0x14, 0x0001},
1749	{0xaa, 0x0e, 0x0004},
1750	{0xaa, 0x19, 0x00cd},
1751	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},
1752	{0xa0, 0x02, ZC3XX_R191_EXPOSURELIMITMID},
1753	{0xa0, 0x62, ZC3XX_R192_EXPOSURELIMITLOW},
1754	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
1755	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},
1756	{0xa0, 0x3d, ZC3XX_R197_ANTIFLICKERLOW},
1757	{0xa0, 0x10, ZC3XX_R18C_AEFREEZE},
1758	{0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},
1759	{0xa0, 0x0c, ZC3XX_R1A9_DIGITALLIMITDIFF},
1760	{0xa0, 0x28, ZC3XX_R1AA_DIGITALGAINSTEP},
1761	{0xa0, 0x04, ZC3XX_R01D_HSYNC_0},
1762	{0xa0, 0x18, ZC3XX_R01E_HSYNC_1},
1763	{0xa0, 0x2c, ZC3XX_R01F_HSYNC_2},
1764	{0xa0, 0x41, ZC3XX_R020_HSYNC_3},
1765	{0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},
1766	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},
1767	{0xa1, 0x01, 0x0180},
1768	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},
1769	{0xa0, 0x40, ZC3XX_R116_RGAIN},
1770	{0xa0, 0x40, ZC3XX_R117_GGAIN},
1771	{0xa0, 0x40, ZC3XX_R118_BGAIN},
1772	{}
1773};
1774static const struct usb_action hdcs2020b_50HZ[] = {
1775	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */
1776	{0xaa, 0x13, 0x0018},			/* 00,13,18,aa */
1777	{0xaa, 0x14, 0x0001},			/* 00,14,01,aa */
1778	{0xaa, 0x0e, 0x0005},			/* 00,0e,05,aa */
1779	{0xaa, 0x19, 0x001f},			/* 00,19,1f,aa */
1780	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */
1781	{0xa0, 0x02, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,02,cc */
1782	{0xa0, 0x76, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,76,cc */
1783	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */
1784	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */
1785	{0xa0, 0x46, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,46,cc */
1786	{0xa0, 0x10, ZC3XX_R18C_AEFREEZE}, /* 01,8c,10,cc */
1787	{0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,20,cc */
1788	{0xa0, 0x0c, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,0c,cc */
1789	{0xa0, 0x28, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,28,cc */
1790	{0xa0, 0x05, ZC3XX_R01D_HSYNC_0}, /* 00,1d,05,cc */
1791	{0xa0, 0x1a, ZC3XX_R01E_HSYNC_1}, /* 00,1e,1a,cc */
1792	{0xa0, 0x2f, ZC3XX_R01F_HSYNC_2}, /* 00,1f,2f,cc */
1793	{}
1794};
1795static const struct usb_action hdcs2020b_60HZ[] = {
1796	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */
1797	{0xaa, 0x13, 0x0031},			/* 00,13,31,aa */
1798	{0xaa, 0x14, 0x0001},			/* 00,14,01,aa */
1799	{0xaa, 0x0e, 0x0004},			/* 00,0e,04,aa */
1800	{0xaa, 0x19, 0x00cd},			/* 00,19,cd,aa */
1801	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */
1802	{0xa0, 0x02, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,02,cc */
1803	{0xa0, 0x62, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,62,cc */
1804	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */
1805	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */
1806	{0xa0, 0x3d, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,3d,cc */
1807	{0xa0, 0x10, ZC3XX_R18C_AEFREEZE}, /* 01,8c,10,cc */
1808	{0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,20,cc */
1809	{0xa0, 0x0c, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,0c,cc */
1810	{0xa0, 0x28, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,28,cc */
1811	{0xa0, 0x04, ZC3XX_R01D_HSYNC_0}, /* 00,1d,04,cc */
1812	{0xa0, 0x18, ZC3XX_R01E_HSYNC_1}, /* 00,1e,18,cc */
1813	{0xa0, 0x2c, ZC3XX_R01F_HSYNC_2}, /* 00,1f,2c,cc */
1814	{}
1815};
1816static const struct usb_action hdcs2020b_NoFliker[] = {
1817	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */
1818	{0xaa, 0x13, 0x0010},			/* 00,13,10,aa */
1819	{0xaa, 0x14, 0x0001},			/* 00,14,01,aa */
1820	{0xaa, 0x0e, 0x0004},			/* 00,0e,04,aa */
1821	{0xaa, 0x19, 0x0000},			/* 00,19,00,aa */
1822	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */
1823	{0xa0, 0x02, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,02,cc */
1824	{0xa0, 0x70, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,70,cc */
1825	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */
1826	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */
1827	{0xa0, 0x10, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,10,cc */
1828	{0xa0, 0x10, ZC3XX_R18C_AEFREEZE}, /* 01,8c,10,cc */
1829	{0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,20,cc */
1830	{0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,00,cc */
1831	{0xa0, 0x00, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,00,cc */
1832	{0xa0, 0x04, ZC3XX_R01D_HSYNC_0}, /* 00,1d,04,cc */
1833	{0xa0, 0x17, ZC3XX_R01E_HSYNC_1}, /* 00,1e,17,cc */
1834	{0xa0, 0x2a, ZC3XX_R01F_HSYNC_2}, /* 00,1f,2a,cc */
1835	{}
1836};
1837
1838static const struct usb_action hv7131b_InitialScale[] = {	/* 320x240 */
1839	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},
1840	{0xa0, 0x10, ZC3XX_R002_CLOCKSELECT},
1841	{0xa0, 0x00, ZC3XX_R010_CMOSSENSORSELECT},
1842	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},
1843	{0xa0, 0x77, ZC3XX_R101_SENSORCORRECTION},
1844	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},	/* 00 */
1845	{0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC},
1846	{0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},
1847	{0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},
1848	{0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},
1849	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},
1850	{0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},
1851	{0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},
1852	{0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},
1853	{0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},
1854	{0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},
1855	{0xaa, 0x30, 0x002d},
1856	{0xaa, 0x01, 0x0005},
1857	{0xaa, 0x11, 0x0000},
1858	{0xaa, 0x13, 0x0001},	/* {0xaa, 0x13, 0x0000}, */
1859	{0xaa, 0x14, 0x0001},
1860	{0xaa, 0x15, 0x00e8},
1861	{0xaa, 0x16, 0x0002},
1862	{0xaa, 0x17, 0x0086},		/* 00,17,88,aa */
1863	{0xaa, 0x31, 0x0038},
1864	{0xaa, 0x32, 0x0038},
1865	{0xaa, 0x33, 0x0038},
1866	{0xaa, 0x5b, 0x0001},
1867	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
1868	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},
1869	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},
1870	{0xa0, 0x68, ZC3XX_R18D_YTARGET},
1871	{0xa0, 0x60, ZC3XX_R1A8_DIGITALGAIN},
1872	{0xa0, 0x00, 0x01ad},
1873	{0xa0, 0xc0, 0x019b},
1874	{0xa0, 0xa0, 0x019c},
1875	{0xa0, 0x02, ZC3XX_R188_MINGAIN},
1876	{0xa0, 0x06, ZC3XX_R189_AWBSTATUS},
1877	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},
1878	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},
1879	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},
1880	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},
1881	{0xaa, 0x02, 0x0090},			/* 00,02,80,aa */
1882	{}
1883};
1884
1885static const struct usb_action hv7131b_Initial[] = {	/* 640x480*/
1886	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},
1887	{0xa0, 0x00, ZC3XX_R002_CLOCKSELECT},
1888	{0xa0, 0x00, ZC3XX_R010_CMOSSENSORSELECT},
1889	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},
1890	{0xa0, 0x37, ZC3XX_R101_SENSORCORRECTION},
1891	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},	/* 00 */
1892	{0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC},
1893	{0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},
1894	{0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},
1895	{0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},
1896	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},
1897	{0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},
1898	{0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},
1899	{0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},
1900	{0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},
1901	{0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},
1902	{0xaa, 0x30, 0x002d},
1903	{0xaa, 0x01, 0x0005},
1904	{0xaa, 0x11, 0x0001},
1905	{0xaa, 0x13, 0x0000},	/* {0xaa, 0x13, 0x0001}; */
1906	{0xaa, 0x14, 0x0001},
1907	{0xaa, 0x15, 0x00e6},
1908	{0xaa, 0x16, 0x0002},
1909	{0xaa, 0x17, 0x0086},
1910	{0xaa, 0x31, 0x0038},
1911	{0xaa, 0x32, 0x0038},
1912	{0xaa, 0x33, 0x0038},
1913	{0xaa, 0x5b, 0x0001},
1914	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
1915	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},
1916	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},
1917	{0xa0, 0x70, ZC3XX_R18D_YTARGET},
1918	{0xa0, 0x60, ZC3XX_R1A8_DIGITALGAIN},
1919	{0xa0, 0x00, 0x01ad},
1920	{0xa0, 0xc0, 0x019b},
1921	{0xa0, 0xa0, 0x019c},
1922	{0xa0, 0x02, ZC3XX_R188_MINGAIN},
1923	{0xa0, 0x06, ZC3XX_R189_AWBSTATUS},
1924	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},
1925	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},
1926	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},
1927	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},
1928	{0xaa, 0x02, 0x0090},	/* {0xaa, 0x02, 0x0080}, */
1929	{}
1930};
1931static const struct usb_action hv7131b_50HZ[] = {	/* 640x480*/
1932	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},	/* 00,19,00,cc */
1933	{0xaa, 0x25, 0x0007},			/* 00,25,07,aa */
1934	{0xaa, 0x26, 0x0053},			/* 00,26,53,aa */
1935	{0xaa, 0x27, 0x0000},			/* 00,27,00,aa */
1936	{0xaa, 0x20, 0x0000},			/* 00,20,00,aa */
1937	{0xaa, 0x21, 0x0050},			/* 00,21,50,aa */
1938	{0xaa, 0x22, 0x001b},			/* 00,22,1b,aa */
1939	{0xaa, 0x23, 0x00fc},			/* 00,23,fc,aa */
1940	{0xa0, 0x2f, ZC3XX_R190_EXPOSURELIMITHIGH},	/* 01,90,2f,cc */
1941	{0xa0, 0x9b, ZC3XX_R191_EXPOSURELIMITMID},	/* 01,91,9b,cc */
1942	{0xa0, 0x80, ZC3XX_R192_EXPOSURELIMITLOW},	/* 01,92,80,cc */
1943	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},	/* 01,95,00,cc */
1944	{0xa0, 0xea, ZC3XX_R196_ANTIFLICKERMID},	/* 01,96,ea,cc */
1945	{0xa0, 0x60, ZC3XX_R197_ANTIFLICKERLOW},	/* 01,97,60,cc */
1946	{0xa0, 0x0c, ZC3XX_R18C_AEFREEZE},	/* 01,8c,0c,cc */
1947	{0xa0, 0x18, ZC3XX_R18F_AEUNFREEZE},	/* 01,8f,18,cc */
1948	{0xa0, 0x18, ZC3XX_R1A9_DIGITALLIMITDIFF},	/* 01,a9,18,cc */
1949	{0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},	/* 01,aa,24,cc */
1950	{0xa0, 0x00, ZC3XX_R01D_HSYNC_0},	/* 00,1d,00,cc */
1951	{0xa0, 0x50, ZC3XX_R01E_HSYNC_1},	/* 00,1e,50,cc */
1952	{0xa0, 0x1b, ZC3XX_R01F_HSYNC_2},	/* 00,1f,1b,cc */
1953	{0xa0, 0xfc, ZC3XX_R020_HSYNC_3},	/* 00,20,fc,cc */
1954	{}
1955};
1956static const struct usb_action hv7131b_50HZScale[] = {	/* 320x240 */
1957	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},	/* 00,19,00,cc */
1958	{0xaa, 0x25, 0x0007},			/* 00,25,07,aa */
1959	{0xaa, 0x26, 0x0053},			/* 00,26,53,aa */
1960	{0xaa, 0x27, 0x0000},			/* 00,27,00,aa */
1961	{0xaa, 0x20, 0x0000},			/* 00,20,00,aa */
1962	{0xaa, 0x21, 0x0050},			/* 00,21,50,aa */
1963	{0xaa, 0x22, 0x0012},			/* 00,22,12,aa */
1964	{0xaa, 0x23, 0x0080},			/* 00,23,80,aa */
1965	{0xa0, 0x2f, ZC3XX_R190_EXPOSURELIMITHIGH},	/* 01,90,2f,cc */
1966	{0xa0, 0x9b, ZC3XX_R191_EXPOSURELIMITMID},	/* 01,91,9b,cc */
1967	{0xa0, 0x80, ZC3XX_R192_EXPOSURELIMITLOW},	/* 01,92,80,cc */
1968	{0xa0, 0x01, ZC3XX_R195_ANTIFLICKERHIGH},	/* 01,95,01,cc */
1969	{0xa0, 0xd4, ZC3XX_R196_ANTIFLICKERMID},	/* 01,96,d4,cc */
1970	{0xa0, 0xc0, ZC3XX_R197_ANTIFLICKERLOW},	/* 01,97,c0,cc */
1971	{0xa0, 0x07, ZC3XX_R18C_AEFREEZE},	/* 01,8c,07,cc */
1972	{0xa0, 0x0f, ZC3XX_R18F_AEUNFREEZE},	/* 01,8f,0f,cc */
1973	{0xa0, 0x18, ZC3XX_R1A9_DIGITALLIMITDIFF},	/* 01,a9,18,cc */
1974	{0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},	/* 01,aa,24,cc */
1975	{0xa0, 0x00, ZC3XX_R01D_HSYNC_0},	/* 00,1d,00,cc */
1976	{0xa0, 0x50, ZC3XX_R01E_HSYNC_1},	/* 00,1e,50,cc */
1977	{0xa0, 0x12, ZC3XX_R01F_HSYNC_2},	/* 00,1f,12,cc */
1978	{0xa0, 0x80, ZC3XX_R020_HSYNC_3},	/* 00,20,80,cc */
1979	{}
1980};
1981static const struct usb_action hv7131b_60HZ[] = {	/* 640x480*/
1982	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},	/* 00,19,00,cc */
1983	{0xaa, 0x25, 0x0007},			/* 00,25,07,aa */
1984	{0xaa, 0x26, 0x00a1},			/* 00,26,a1,aa */
1985	{0xaa, 0x27, 0x0020},			/* 00,27,20,aa */
1986	{0xaa, 0x20, 0x0000},			/* 00,20,00,aa */
1987	{0xaa, 0x21, 0x0040},			/* 00,21,40,aa */
1988	{0xaa, 0x22, 0x0013},			/* 00,22,13,aa */
1989	{0xaa, 0x23, 0x004c},			/* 00,23,4c,aa */
1990	{0xa0, 0x2f, ZC3XX_R190_EXPOSURELIMITHIGH},	/* 01,90,2f,cc */
1991	{0xa0, 0x4d, ZC3XX_R191_EXPOSURELIMITMID},	/* 01,91,4d,cc */
1992	{0xa0, 0x60, ZC3XX_R192_EXPOSURELIMITLOW},	/* 01,92,60,cc */
1993	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},	/* 01,95,00,cc */
1994	{0xa0, 0xc3, ZC3XX_R196_ANTIFLICKERMID},	/* 01,96,c3,cc */
1995	{0xa0, 0x50, ZC3XX_R197_ANTIFLICKERLOW},	/* 01,97,50,cc */
1996	{0xa0, 0x0c, ZC3XX_R18C_AEFREEZE},	/* 01,8c,0c,cc */
1997	{0xa0, 0x18, ZC3XX_R18F_AEUNFREEZE},	/* 01,8f,18,cc */
1998	{0xa0, 0x18, ZC3XX_R1A9_DIGITALLIMITDIFF},	/* 01,a9,18,cc */
1999	{0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},	/* 01,aa,24,cc */
2000	{0xa0, 0x00, ZC3XX_R01D_HSYNC_0},	/* 00,1d,00,cc */
2001	{0xa0, 0x40, ZC3XX_R01E_HSYNC_1},	/* 00,1e,40,cc */
2002	{0xa0, 0x13, ZC3XX_R01F_HSYNC_2},	/* 00,1f,13,cc */
2003	{0xa0, 0x4c, ZC3XX_R020_HSYNC_3},	/* 00,20,4c,cc */
2004	{}
2005};
2006static const struct usb_action hv7131b_60HZScale[] = {	/* 320x240 */
2007	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},	/* 00,19,00,cc */
2008	{0xaa, 0x25, 0x0007},			/* 00,25,07,aa */
2009	{0xaa, 0x26, 0x00a1},			/* 00,26,a1,aa */
2010	{0xaa, 0x27, 0x0020},			/* 00,27,20,aa */
2011	{0xaa, 0x20, 0x0000},			/* 00,20,00,aa */
2012	{0xaa, 0x21, 0x00a0},			/* 00,21,a0,aa */
2013	{0xaa, 0x22, 0x0016},			/* 00,22,16,aa */
2014	{0xaa, 0x23, 0x0040},			/* 00,23,40,aa */
2015	{0xa0, 0x2f, ZC3XX_R190_EXPOSURELIMITHIGH},	/* 01,90,2f,cc */
2016	{0xa0, 0x4d, ZC3XX_R191_EXPOSURELIMITMID},	/* 01,91,4d,cc */
2017	{0xa0, 0x60, ZC3XX_R192_EXPOSURELIMITLOW},	/* 01,92,60,cc */
2018	{0xa0, 0x01, ZC3XX_R195_ANTIFLICKERHIGH},	/* 01,95,01,cc */
2019	{0xa0, 0x86, ZC3XX_R196_ANTIFLICKERMID},	/* 01,96,86,cc */
2020	{0xa0, 0xa0, ZC3XX_R197_ANTIFLICKERLOW},	/* 01,97,a0,cc */
2021	{0xa0, 0x07, ZC3XX_R18C_AEFREEZE},	/* 01,8c,07,cc */
2022	{0xa0, 0x0f, ZC3XX_R18F_AEUNFREEZE},	/* 01,8f,0f,cc */
2023	{0xa0, 0x18, ZC3XX_R1A9_DIGITALLIMITDIFF},	/* 01,a9,18,cc */
2024	{0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},	/* 01,aa,24,cc */
2025	{0xa0, 0x00, ZC3XX_R01D_HSYNC_0},	/* 00,1d,00,cc */
2026	{0xa0, 0xa0, ZC3XX_R01E_HSYNC_1},	/* 00,1e,a0,cc */
2027	{0xa0, 0x16, ZC3XX_R01F_HSYNC_2},	/* 00,1f,16,cc */
2028	{0xa0, 0x40, ZC3XX_R020_HSYNC_3},	/* 00,20,40,cc */
2029	{}
2030};
2031static const struct usb_action hv7131b_NoFliker[] = {	/* 640x480*/
2032	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},	/* 00,19,00,cc */
2033	{0xaa, 0x25, 0x0003},			/* 00,25,03,aa */
2034	{0xaa, 0x26, 0x0000},			/* 00,26,00,aa */
2035	{0xaa, 0x27, 0x0000},			/* 00,27,00,aa */
2036	{0xaa, 0x20, 0x0000},			/* 00,20,00,aa */
2037	{0xaa, 0x21, 0x0010},			/* 00,21,10,aa */
2038	{0xaa, 0x22, 0x0000},			/* 00,22,00,aa */
2039	{0xaa, 0x23, 0x0003},			/* 00,23,03,aa */
2040	{0xa0, 0x2f, ZC3XX_R190_EXPOSURELIMITHIGH},	/* 01,90,2f,cc */
2041	{0xa0, 0xf8, ZC3XX_R191_EXPOSURELIMITMID},	/* 01,91,f8,cc */
2042	{0xa0, 0x00, ZC3XX_R192_EXPOSURELIMITLOW},	/* 01,92,00,cc */
2043	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},	/* 01,95,00,cc */
2044	{0xa0, 0x02, ZC3XX_R196_ANTIFLICKERMID},	/* 01,96,02,cc */
2045	{0xa0, 0x00, ZC3XX_R197_ANTIFLICKERLOW},	/* 01,97,00,cc */
2046	{0xa0, 0x10, ZC3XX_R18C_AEFREEZE},	/* 01,8c,10,cc */
2047	{0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},	/* 01,8f,20,cc */
2048	{0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF},	/* 01,a9,00,cc */
2049	{0xa0, 0x00, ZC3XX_R1AA_DIGITALGAINSTEP},	/* 01,aa,00,cc */
2050	{0xa0, 0x00, ZC3XX_R01D_HSYNC_0},	/* 00,1d,00,cc */
2051	{0xa0, 0x10, ZC3XX_R01E_HSYNC_1},	/* 00,1e,10,cc */
2052	{0xa0, 0x00, ZC3XX_R01F_HSYNC_2},	/* 00,1f,00,cc */
2053	{0xa0, 0x03, ZC3XX_R020_HSYNC_3},	/* 00,20,03,cc */
2054	{}
2055};
2056static const struct usb_action hv7131b_NoFlikerScale[] = { /* 320x240 */
2057	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},	/* 00,19,00,cc */
2058	{0xaa, 0x25, 0x0003},			/* 00,25,03,aa */
2059	{0xaa, 0x26, 0x0000},			/* 00,26,00,aa */
2060	{0xaa, 0x27, 0x0000},			/* 00,27,00,aa */
2061	{0xaa, 0x20, 0x0000},			/* 00,20,00,aa */
2062	{0xaa, 0x21, 0x00a0},			/* 00,21,a0,aa */
2063	{0xaa, 0x22, 0x0016},			/* 00,22,16,aa */
2064	{0xaa, 0x23, 0x0040},			/* 00,23,40,aa */
2065	{0xa0, 0x2f, ZC3XX_R190_EXPOSURELIMITHIGH},	/* 01,90,2f,cc */
2066	{0xa0, 0xf8, ZC3XX_R191_EXPOSURELIMITMID},	/* 01,91,f8,cc */
2067	{0xa0, 0x00, ZC3XX_R192_EXPOSURELIMITLOW},	/* 01,92,00,cc */
2068	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},	/* 01,95,00,cc */
2069	{0xa0, 0x02, ZC3XX_R196_ANTIFLICKERMID},	/* 01,96,02,cc */
2070	{0xa0, 0x00, ZC3XX_R197_ANTIFLICKERLOW},	/* 01,97,00,cc */
2071	{0xa0, 0x10, ZC3XX_R18C_AEFREEZE},	/* 01,8c,10,cc */
2072	{0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},	/* 01,8f,20,cc */
2073	{0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF},	/* 01,a9,00,cc */
2074	{0xa0, 0x00, ZC3XX_R1AA_DIGITALGAINSTEP},	/* 01,aa,00,cc */
2075	{0xa0, 0x00, ZC3XX_R01D_HSYNC_0},	/* 00,1d,00,cc */
2076	{0xa0, 0xa0, ZC3XX_R01E_HSYNC_1},	/* 00,1e,a0,cc */
2077	{0xa0, 0x16, ZC3XX_R01F_HSYNC_2},	/* 00,1f,16,cc */
2078	{0xa0, 0x40, ZC3XX_R020_HSYNC_3},	/* 00,20,40,cc */
2079	{}
2080};
2081
2082/* from lPEPI264v.inf (hv7131b!) */
2083static const struct usb_action hv7131r_InitialScale[] = {
2084	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},
2085	{0xa0, 0x10, ZC3XX_R002_CLOCKSELECT},
2086	{0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT},
2087	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},
2088	{0xa0, 0x77, ZC3XX_R101_SENSORCORRECTION},
2089	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},
2090	{0xa0, 0x07, ZC3XX_R012_VIDEOCONTROLFUNC},
2091	{0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},
2092	{0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},
2093	{0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},
2094	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},
2095	{0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},
2096	{0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},
2097	{0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},
2098	{0xa0, 0x01, ZC3XX_R09B_WINHEIGHTHIGH},
2099	{0xa0, 0xe8, ZC3XX_R09C_WINHEIGHTLOW},
2100	{0xa0, 0x02, ZC3XX_R09D_WINWIDTHHIGH},
2101	{0xa0, 0x88, ZC3XX_R09E_WINWIDTHLOW},
2102	{0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},
2103	{0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},
2104	{0xa0, 0x07, ZC3XX_R012_VIDEOCONTROLFUNC},
2105	{0xdd, 0x00, 0x0200},
2106	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},
2107	{0xaa, 0x01, 0x000c},
2108	{0xaa, 0x11, 0x0000},
2109	{0xaa, 0x13, 0x0000},
2110	{0xaa, 0x14, 0x0001},
2111	{0xaa, 0x15, 0x00e8},
2112	{0xaa, 0x16, 0x0002},
2113	{0xaa, 0x17, 0x0088},
2114	{0xaa, 0x30, 0x000b},
2115	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
2116	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},
2117	{0xa0, 0x78, ZC3XX_R18D_YTARGET},
2118	{0xa0, 0x50, ZC3XX_R1A8_DIGITALGAIN},
2119	{0xa0, 0x00, 0x01ad},
2120	{0xa0, 0xc0, 0x019b},
2121	{0xa0, 0xa0, 0x019c},
2122	{0xa0, 0x06, ZC3XX_R189_AWBSTATUS},
2123	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},
2124	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},
2125	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},
2126	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},
2127	{}
2128};
2129static const struct usb_action hv7131r_Initial[] = {
2130	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},
2131	{0xa0, 0x00, ZC3XX_R002_CLOCKSELECT},
2132	{0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT},
2133	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},
2134	{0xa0, 0x77, ZC3XX_R101_SENSORCORRECTION},
2135	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},
2136	{0xa0, 0x07, ZC3XX_R012_VIDEOCONTROLFUNC},
2137	{0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},
2138	{0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},
2139	{0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},
2140	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},
2141	{0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},
2142
2143	{0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},
2144	{0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},
2145	{0xa0, 0x01, ZC3XX_R09B_WINHEIGHTHIGH},
2146	{0xa0, 0xe6, ZC3XX_R09C_WINHEIGHTLOW},
2147	{0xa0, 0x02, ZC3XX_R09D_WINWIDTHHIGH},
2148	{0xa0, 0x86, ZC3XX_R09E_WINWIDTHLOW},
2149	{0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},
2150	{0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},
2151	{0xa0, 0x07, ZC3XX_R012_VIDEOCONTROLFUNC},
2152	{0xdd, 0x00, 0x0200},
2153	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},
2154	{0xaa, 0x01, 0x000c},
2155	{0xaa, 0x11, 0x0000},
2156	{0xaa, 0x13, 0x0000},
2157	{0xaa, 0x14, 0x0001},
2158	{0xaa, 0x15, 0x00e6},
2159	{0xaa, 0x16, 0x0002},
2160	{0xaa, 0x17, 0x0086},
2161	{0xaa, 0x30, 0x000b},
2162	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
2163	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},
2164	{0xa0, 0x78, ZC3XX_R18D_YTARGET},
2165	{0xa0, 0x50, ZC3XX_R1A8_DIGITALGAIN},
2166	{0xa0, 0x00, 0x01ad},
2167	{0xa0, 0xc0, 0x019b},
2168	{0xa0, 0xa0, 0x019c},
2169	{0xa0, 0x06, ZC3XX_R189_AWBSTATUS},
2170	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},
2171	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},
2172	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},
2173	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},
2174	{}
2175};
2176static const struct usb_action hv7131r_50HZ[] = {
2177	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
2178	{0xa0, 0x06, ZC3XX_R190_EXPOSURELIMITHIGH},
2179	{0xa0, 0x68, ZC3XX_R191_EXPOSURELIMITMID},
2180	{0xa0, 0xa0, ZC3XX_R192_EXPOSURELIMITLOW},
2181	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
2182	{0xa0, 0xea, ZC3XX_R196_ANTIFLICKERMID},
2183	{0xa0, 0x60, ZC3XX_R197_ANTIFLICKERLOW},
2184	{0xa0, 0x18, ZC3XX_R18C_AEFREEZE},
2185	{0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},
2186	{0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF},
2187	{0xa0, 0x66, ZC3XX_R1AA_DIGITALGAINSTEP},
2188	{0xa0, 0x00, ZC3XX_R01D_HSYNC_0},
2189	{0xa0, 0xd0, ZC3XX_R01E_HSYNC_1},
2190	{0xa0, 0x00, ZC3XX_R01F_HSYNC_2},
2191	{0xa0, 0x08, ZC3XX_R020_HSYNC_3},
2192	{}
2193};
2194static const struct usb_action hv7131r_50HZScale[] = {
2195	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
2196	{0xa0, 0x0c, ZC3XX_R190_EXPOSURELIMITHIGH},
2197	{0xa0, 0xd1, ZC3XX_R191_EXPOSURELIMITMID},
2198	{0xa0, 0x40, ZC3XX_R192_EXPOSURELIMITLOW},
2199	{0xa0, 0x01, ZC3XX_R195_ANTIFLICKERHIGH},
2200	{0xa0, 0xd4, ZC3XX_R196_ANTIFLICKERMID},
2201	{0xa0, 0xc0, ZC3XX_R197_ANTIFLICKERLOW},
2202	{0xa0, 0x18, ZC3XX_R18C_AEFREEZE},
2203	{0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},
2204	{0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF},
2205	{0xa0, 0x66, ZC3XX_R1AA_DIGITALGAINSTEP},
2206	{0xa0, 0x00, ZC3XX_R01D_HSYNC_0},
2207	{0xa0, 0xd0, ZC3XX_R01E_HSYNC_1},
2208	{0xa0, 0x00, ZC3XX_R01F_HSYNC_2},
2209	{0xa0, 0x08, ZC3XX_R020_HSYNC_3},
2210	{}
2211};
2212static const struct usb_action hv7131r_60HZ[] = {
2213	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
2214	{0xa0, 0x06, ZC3XX_R190_EXPOSURELIMITHIGH},
2215	{0xa0, 0x1a, ZC3XX_R191_EXPOSURELIMITMID},
2216	{0xa0, 0x80, ZC3XX_R192_EXPOSURELIMITLOW},
2217	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
2218	{0xa0, 0xc3, ZC3XX_R196_ANTIFLICKERMID},
2219	{0xa0, 0x50, ZC3XX_R197_ANTIFLICKERLOW},
2220	{0xa0, 0x18, ZC3XX_R18C_AEFREEZE},
2221	{0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},
2222	{0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF},
2223	{0xa0, 0x66, ZC3XX_R1AA_DIGITALGAINSTEP},
2224	{0xa0, 0x00, ZC3XX_R01D_HSYNC_0},
2225	{0xa0, 0xd0, ZC3XX_R01E_HSYNC_1},
2226	{0xa0, 0x00, ZC3XX_R01F_HSYNC_2},
2227	{0xa0, 0x08, ZC3XX_R020_HSYNC_3},
2228	{}
2229};
2230static const struct usb_action hv7131r_60HZScale[] = {
2231	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
2232	{0xa0, 0x0c, ZC3XX_R190_EXPOSURELIMITHIGH},
2233	{0xa0, 0x35, ZC3XX_R191_EXPOSURELIMITMID},
2234	{0xa0, 0x00, ZC3XX_R192_EXPOSURELIMITLOW},
2235	{0xa0, 0x01, ZC3XX_R195_ANTIFLICKERHIGH},
2236	{0xa0, 0x86, ZC3XX_R196_ANTIFLICKERMID},
2237	{0xa0, 0xa0, ZC3XX_R197_ANTIFLICKERLOW},
2238	{0xa0, 0x18, ZC3XX_R18C_AEFREEZE},
2239	{0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},
2240	{0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF},
2241	{0xa0, 0x66, ZC3XX_R1AA_DIGITALGAINSTEP},
2242	{0xa0, 0x00, ZC3XX_R01D_HSYNC_0},
2243	{0xa0, 0xd0, ZC3XX_R01E_HSYNC_1},
2244	{0xa0, 0x00, ZC3XX_R01F_HSYNC_2},
2245	{0xa0, 0x08, ZC3XX_R020_HSYNC_3},
2246	{}
2247};
2248static const struct usb_action hv7131r_NoFliker[] = {
2249	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
2250	{0xa0, 0x2f, ZC3XX_R190_EXPOSURELIMITHIGH},
2251	{0xa0, 0xf8, ZC3XX_R191_EXPOSURELIMITMID},
2252	{0xa0, 0x00, ZC3XX_R192_EXPOSURELIMITLOW},
2253	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
2254	{0xa0, 0x02, ZC3XX_R196_ANTIFLICKERMID},
2255	{0xa0, 0x58, ZC3XX_R197_ANTIFLICKERLOW},
2256	{0xa0, 0x0c, ZC3XX_R18C_AEFREEZE},
2257	{0xa0, 0x18, ZC3XX_R18F_AEUNFREEZE},
2258	{0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF},
2259	{0xa0, 0x00, ZC3XX_R1AA_DIGITALGAINSTEP},
2260	{0xa0, 0x00, ZC3XX_R01D_HSYNC_0},
2261	{0xa0, 0xd0, ZC3XX_R01E_HSYNC_1},
2262	{0xa0, 0x00, ZC3XX_R01F_HSYNC_2},
2263	{0xa0, 0x08, ZC3XX_R020_HSYNC_3},
2264	{}
2265};
2266static const struct usb_action hv7131r_NoFlikerScale[] = {
2267	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
2268	{0xa0, 0x2f, ZC3XX_R190_EXPOSURELIMITHIGH},
2269	{0xa0, 0xf8, ZC3XX_R191_EXPOSURELIMITMID},
2270	{0xa0, 0x00, ZC3XX_R192_EXPOSURELIMITLOW},
2271	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
2272	{0xa0, 0x04, ZC3XX_R196_ANTIFLICKERMID},
2273	{0xa0, 0xb0, ZC3XX_R197_ANTIFLICKERLOW},
2274	{0xa0, 0x0c, ZC3XX_R18C_AEFREEZE},
2275	{0xa0, 0x18, ZC3XX_R18F_AEUNFREEZE},
2276	{0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF},
2277	{0xa0, 0x00, ZC3XX_R1AA_DIGITALGAINSTEP},
2278	{0xa0, 0x00, ZC3XX_R01D_HSYNC_0},
2279	{0xa0, 0xd0, ZC3XX_R01E_HSYNC_1},
2280	{0xa0, 0x00, ZC3XX_R01F_HSYNC_2},
2281	{0xa0, 0x08, ZC3XX_R020_HSYNC_3},
2282	{}
2283};
2284
2285static const struct usb_action icm105a_InitialScale[] = {
2286	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},
2287	{0xa0, 0x10, ZC3XX_R002_CLOCKSELECT},
2288	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},
2289	{0xa0, 0x0c, ZC3XX_R010_CMOSSENSORSELECT},
2290	{0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},
2291	{0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},
2292	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},
2293	{0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},
2294	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},
2295	{0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC},
2296	{0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},
2297	{0xa0, 0xa1, ZC3XX_R08B_I2CDEVICEADDR},
2298	{0xa0, 0x00, ZC3XX_R097_WINYSTARTHIGH},
2299	{0xa0, 0x01, ZC3XX_R098_WINYSTARTLOW},
2300	{0xa0, 0x00, ZC3XX_R099_WINXSTARTHIGH},
2301	{0xa0, 0x01, ZC3XX_R09A_WINXSTARTLOW},
2302	{0xa0, 0x01, ZC3XX_R11A_FIRSTYLOW},
2303	{0xa0, 0x01, ZC3XX_R11C_FIRSTXLOW},
2304	{0xa0, 0x01, ZC3XX_R09B_WINHEIGHTHIGH},
2305	{0xa0, 0xe8, ZC3XX_R09C_WINHEIGHTLOW},
2306	{0xa0, 0x02, ZC3XX_R09D_WINWIDTHHIGH},
2307	{0xa0, 0x88, ZC3XX_R09E_WINWIDTHLOW},
2308	{0xa0, 0x37, ZC3XX_R101_SENSORCORRECTION},
2309	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},
2310	{0xa0, 0x06, ZC3XX_R189_AWBSTATUS},
2311	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},
2312	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},
2313	{0xaa, 0x01, 0x0010},
2314	{0xaa, 0x03, 0x0000},
2315	{0xaa, 0x04, 0x0001},
2316	{0xaa, 0x05, 0x0020},
2317	{0xaa, 0x06, 0x0001},
2318	{0xaa, 0x08, 0x0000},
2319	{0xaa, 0x03, 0x0001},
2320	{0xaa, 0x04, 0x0011},
2321	{0xaa, 0x05, 0x00a0},
2322	{0xaa, 0x06, 0x0001},
2323	{0xaa, 0x08, 0x0000},
2324	{0xaa, 0x03, 0x0002},
2325	{0xaa, 0x04, 0x0013},
2326	{0xaa, 0x05, 0x0020},
2327	{0xaa, 0x06, 0x0001},
2328	{0xaa, 0x08, 0x0000},
2329	{0xaa, 0x03, 0x0003},
2330	{0xaa, 0x04, 0x0015},
2331	{0xaa, 0x05, 0x0020},
2332	{0xaa, 0x06, 0x0005},
2333	{0xaa, 0x08, 0x0000},
2334	{0xaa, 0x03, 0x0004},
2335	{0xaa, 0x04, 0x0017},
2336	{0xaa, 0x05, 0x0020},
2337	{0xaa, 0x06, 0x000d},
2338	{0xaa, 0x08, 0x0000},
2339	{0xaa, 0x03, 0x0005},
2340	{0xaa, 0x04, 0x0019},
2341	{0xaa, 0x05, 0x0020},
2342	{0xaa, 0x06, 0x0005},
2343	{0xaa, 0x08, 0x0000},
2344	{0xaa, 0x03, 0x0006},
2345	{0xaa, 0x04, 0x0017},
2346	{0xaa, 0x05, 0x0026},
2347	{0xaa, 0x06, 0x0005},
2348	{0xaa, 0x08, 0x0000},
2349	{0xaa, 0x03, 0x0007},
2350	{0xaa, 0x04, 0x0019},
2351	{0xaa, 0x05, 0x0022},
2352	{0xaa, 0x06, 0x0005},
2353	{0xaa, 0x08, 0x0000},
2354	{0xaa, 0x03, 0x0008},
2355	{0xaa, 0x04, 0x0021},
2356	{0xaa, 0x05, 0x00aa},
2357	{0xaa, 0x06, 0x0005},
2358	{0xaa, 0x08, 0x0000},
2359	{0xaa, 0x03, 0x0009},
2360	{0xaa, 0x04, 0x0023},
2361	{0xaa, 0x05, 0x00aa},
2362	{0xaa, 0x06, 0x000d},
2363	{0xaa, 0x08, 0x0000},
2364	{0xaa, 0x03, 0x000a},
2365	{0xaa, 0x04, 0x0025},
2366	{0xaa, 0x05, 0x00aa},
2367	{0xaa, 0x06, 0x0005},
2368	{0xaa, 0x08, 0x0000},
2369	{0xaa, 0x03, 0x000b},
2370	{0xaa, 0x04, 0x00ec},
2371	{0xaa, 0x05, 0x002e},
2372	{0xaa, 0x06, 0x0005},
2373	{0xaa, 0x08, 0x0000},
2374	{0xaa, 0x03, 0x000c},
2375	{0xaa, 0x04, 0x00fa},
2376	{0xaa, 0x05, 0x002a},
2377	{0xaa, 0x06, 0x0005},
2378	{0xaa, 0x08, 0x0000},
2379	{0xaa, 0x07, 0x000d},
2380	{0xaa, 0x01, 0x0005},
2381	{0xaa, 0x94, 0x0002},
2382	{0xaa, 0x90, 0x0000},
2383	{0xaa, 0x91, 0x001f},
2384	{0xaa, 0x10, 0x0064},
2385	{0xaa, 0x9b, 0x00f0},
2386	{0xaa, 0x9c, 0x0002},
2387	{0xaa, 0x14, 0x001a},
2388	{0xaa, 0x20, 0x0080},
2389	{0xaa, 0x22, 0x0080},
2390	{0xaa, 0x24, 0x0080},
2391	{0xaa, 0x26, 0x0080},
2392	{0xaa, 0x00, 0x0084},
2393	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},
2394	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},
2395	{0xaa, 0xa8, 0x00c0},
2396	{0xa1, 0x01, 0x0002},
2397	{0xa1, 0x01, 0x0008},
2398	{0xa1, 0x01, 0x0180},
2399	{0xa0, 0x02, ZC3XX_R180_AUTOCORRECTENABLE},
2400	{0xa0, 0x40, ZC3XX_R116_RGAIN},
2401	{0xa0, 0x40, ZC3XX_R117_GGAIN},
2402	{0xa0, 0x40, ZC3XX_R118_BGAIN},
2403	{0xa1, 0x01, 0x0008},
2404
2405	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},	/* clock ? */
2406	{0xa0, 0x08, ZC3XX_R1C6_SHARPNESS00},	/* sharpness+ */
2407	{0xa1, 0x01, 0x01c8},
2408	{0xa1, 0x01, 0x01c9},
2409	{0xa1, 0x01, 0x01ca},
2410	{0xa0, 0x0f, ZC3XX_R1CB_SHARPNESS05},	/* sharpness- */
2411	{0xa0, 0x52, ZC3XX_R10A_RGB00},	/* matrix */
2412	{0xa0, 0xf7, ZC3XX_R10B_RGB01},
2413	{0xa0, 0xf7, ZC3XX_R10C_RGB02},
2414	{0xa0, 0xf7, ZC3XX_R10D_RGB10},
2415	{0xa0, 0x52, ZC3XX_R10E_RGB11},
2416	{0xa0, 0xf7, ZC3XX_R10F_RGB12},
2417	{0xa0, 0xf7, ZC3XX_R110_RGB20},
2418	{0xa0, 0xf7, ZC3XX_R111_RGB21},
2419	{0xa0, 0x52, ZC3XX_R112_RGB22},
2420	{0xa1, 0x01, 0x0180},
2421	{0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},
2422	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
2423	{0xaa, 0x0d, 0x0003},
2424	{0xaa, 0x0c, 0x008c},
2425	{0xaa, 0x0e, 0x0095},
2426	{0xaa, 0x0f, 0x0002},
2427	{0xaa, 0x1c, 0x0094},
2428	{0xaa, 0x1d, 0x0002},
2429	{0xaa, 0x20, 0x0080},
2430	{0xaa, 0x22, 0x0080},
2431	{0xaa, 0x24, 0x0080},
2432	{0xaa, 0x26, 0x0080},
2433	{0xaa, 0x00, 0x0084},
2434	{0xa0, 0x02, ZC3XX_R0A3_EXPOSURETIMEHIGH},
2435	{0xa0, 0x94, ZC3XX_R0A4_EXPOSURETIMELOW},
2436	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},
2437	{0xa0, 0x04, ZC3XX_R191_EXPOSURELIMITMID},
2438	{0xa0, 0x20, ZC3XX_R192_EXPOSURELIMITLOW},
2439	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
2440	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},
2441	{0xa0, 0x84, ZC3XX_R197_ANTIFLICKERLOW},
2442	{0xa0, 0x10, ZC3XX_R18C_AEFREEZE},
2443	{0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},
2444	{0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF},
2445	{0xa0, 0x12, ZC3XX_R1AA_DIGITALGAINSTEP},
2446	{0xa0, 0xe3, ZC3XX_R01D_HSYNC_0},
2447	{0xa0, 0xec, ZC3XX_R01E_HSYNC_1},
2448	{0xa0, 0xf5, ZC3XX_R01F_HSYNC_2},
2449	{0xa0, 0xff, ZC3XX_R020_HSYNC_3},
2450	{0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},
2451	{0xa0, 0xc0, ZC3XX_R1A8_DIGITALGAIN},
2452	{0xa0, 0xc0, ZC3XX_R11D_GLOBALGAIN},
2453	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},
2454	{0xa1, 0x01, 0x0180},
2455	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},
2456	{0xa0, 0x40, ZC3XX_R116_RGAIN},
2457	{0xa0, 0x40, ZC3XX_R117_GGAIN},
2458	{0xa0, 0x40, ZC3XX_R118_BGAIN},
2459	{}
2460};
2461
2462static const struct usb_action icm105a_Initial[] = {
2463	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},
2464	{0xa0, 0x00, ZC3XX_R002_CLOCKSELECT},
2465	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},
2466	{0xa0, 0x0c, ZC3XX_R010_CMOSSENSORSELECT},
2467	{0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},
2468	{0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},
2469	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},
2470	{0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},
2471	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},
2472	{0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC},
2473	{0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},
2474	{0xa0, 0xa1, ZC3XX_R08B_I2CDEVICEADDR},
2475	{0xa0, 0x00, ZC3XX_R097_WINYSTARTHIGH},
2476	{0xa0, 0x02, ZC3XX_R098_WINYSTARTLOW},
2477	{0xa0, 0x00, ZC3XX_R099_WINXSTARTHIGH},
2478	{0xa0, 0x02, ZC3XX_R09A_WINXSTARTLOW},
2479	{0xa0, 0x02, ZC3XX_R11A_FIRSTYLOW},
2480	{0xa0, 0x02, ZC3XX_R11C_FIRSTXLOW},
2481	{0xa0, 0x01, ZC3XX_R09B_WINHEIGHTHIGH},
2482	{0xa0, 0xe6, ZC3XX_R09C_WINHEIGHTLOW},
2483	{0xa0, 0x02, ZC3XX_R09D_WINWIDTHHIGH},
2484	{0xa0, 0x86, ZC3XX_R09E_WINWIDTHLOW},
2485	{0xa0, 0x77, ZC3XX_R101_SENSORCORRECTION},
2486	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},
2487	{0xa0, 0x06, ZC3XX_R189_AWBSTATUS},
2488	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},
2489	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},
2490	{0xaa, 0x01, 0x0010},
2491	{0xaa, 0x03, 0x0000},
2492	{0xaa, 0x04, 0x0001},
2493	{0xaa, 0x05, 0x0020},
2494	{0xaa, 0x06, 0x0001},
2495	{0xaa, 0x08, 0x0000},
2496	{0xaa, 0x03, 0x0001},
2497	{0xaa, 0x04, 0x0011},
2498	{0xaa, 0x05, 0x00a0},
2499	{0xaa, 0x06, 0x0001},
2500	{0xaa, 0x08, 0x0000},
2501	{0xaa, 0x03, 0x0002},
2502	{0xaa, 0x04, 0x0013},
2503	{0xaa, 0x05, 0x0020},
2504	{0xaa, 0x06, 0x0001},
2505	{0xaa, 0x08, 0x0000},
2506	{0xaa, 0x03, 0x0003},
2507	{0xaa, 0x04, 0x0015},
2508	{0xaa, 0x05, 0x0020},
2509	{0xaa, 0x06, 0x0005},
2510	{0xaa, 0x08, 0x0000},
2511	{0xaa, 0x03, 0x0004},
2512	{0xaa, 0x04, 0x0017},
2513	{0xaa, 0x05, 0x0020},
2514	{0xaa, 0x06, 0x000d},
2515	{0xaa, 0x08, 0x0000},
2516	{0xaa, 0x03, 0x0005},
2517	{0xa0, 0x04, ZC3XX_R092_I2CADDRESSSELECT},
2518	{0xa0, 0x19, ZC3XX_R093_I2CSETVALUE},
2519	{0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},
2520	{0xa1, 0x01, 0x0091},
2521	{0xaa, 0x05, 0x0020},
2522	{0xaa, 0x06, 0x0005},
2523	{0xaa, 0x08, 0x0000},
2524	{0xaa, 0x03, 0x0006},
2525	{0xaa, 0x04, 0x0017},
2526	{0xaa, 0x05, 0x0026},
2527	{0xaa, 0x06, 0x0005},
2528	{0xaa, 0x08, 0x0000},
2529	{0xaa, 0x03, 0x0007},
2530	{0xaa, 0x04, 0x0019},
2531	{0xaa, 0x05, 0x0022},
2532	{0xaa, 0x06, 0x0005},
2533	{0xaa, 0x08, 0x0000},
2534	{0xaa, 0x03, 0x0008},
2535	{0xaa, 0x04, 0x0021},
2536	{0xaa, 0x05, 0x00aa},
2537	{0xaa, 0x06, 0x0005},
2538	{0xaa, 0x08, 0x0000},
2539	{0xaa, 0x03, 0x0009},
2540	{0xaa, 0x04, 0x0023},
2541	{0xaa, 0x05, 0x00aa},
2542	{0xaa, 0x06, 0x000d},
2543	{0xaa, 0x08, 0x0000},
2544	{0xaa, 0x03, 0x000a},
2545	{0xaa, 0x04, 0x0025},
2546	{0xaa, 0x05, 0x00aa},
2547	{0xaa, 0x06, 0x0005},
2548	{0xaa, 0x08, 0x0000},
2549	{0xaa, 0x03, 0x000b},
2550	{0xaa, 0x04, 0x00ec},
2551	{0xaa, 0x05, 0x002e},
2552	{0xaa, 0x06, 0x0005},
2553	{0xaa, 0x08, 0x0000},
2554	{0xaa, 0x03, 0x000c},
2555	{0xaa, 0x04, 0x00fa},
2556	{0xaa, 0x05, 0x002a},
2557	{0xaa, 0x06, 0x0005},
2558	{0xaa, 0x08, 0x0000},
2559	{0xaa, 0x07, 0x000d},
2560	{0xaa, 0x01, 0x0005},
2561	{0xaa, 0x94, 0x0002},
2562	{0xaa, 0x90, 0x0000},
2563	{0xaa, 0x91, 0x0010},
2564	{0xaa, 0x10, 0x0064},
2565	{0xaa, 0x9b, 0x00f0},
2566	{0xaa, 0x9c, 0x0002},
2567	{0xaa, 0x14, 0x001a},
2568	{0xaa, 0x20, 0x0080},
2569	{0xaa, 0x22, 0x0080},
2570	{0xaa, 0x24, 0x0080},
2571	{0xaa, 0x26, 0x0080},
2572	{0xaa, 0x00, 0x0084},
2573	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},
2574	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},
2575	{0xaa, 0xa8, 0x0080},
2576	{0xa0, 0x78, ZC3XX_R18D_YTARGET},
2577	{0xa1, 0x01, 0x0002},
2578	{0xa1, 0x01, 0x0008},
2579	{0xa1, 0x01, 0x0180},
2580	{0xa0, 0x02, ZC3XX_R180_AUTOCORRECTENABLE},
2581	{0xa0, 0x40, ZC3XX_R116_RGAIN},
2582	{0xa0, 0x40, ZC3XX_R117_GGAIN},
2583	{0xa0, 0x40, ZC3XX_R118_BGAIN},
2584	{0xa1, 0x01, 0x0008},
2585
2586	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},	/* clock ? */
2587	{0xa0, 0x08, ZC3XX_R1C6_SHARPNESS00},	/* sharpness+ */
2588	{0xa1, 0x01, 0x01c8},
2589	{0xa1, 0x01, 0x01c9},
2590	{0xa1, 0x01, 0x01ca},
2591	{0xa0, 0x0f, ZC3XX_R1CB_SHARPNESS05},	/* sharpness- */
2592
2593	{0xa0, 0x52, ZC3XX_R10A_RGB00},	/* matrix */
2594	{0xa0, 0xf7, ZC3XX_R10B_RGB01},
2595	{0xa0, 0xf7, ZC3XX_R10C_RGB02},
2596	{0xa0, 0xf7, ZC3XX_R10D_RGB10},
2597	{0xa0, 0x52, ZC3XX_R10E_RGB11},
2598	{0xa0, 0xf7, ZC3XX_R10F_RGB12},
2599	{0xa0, 0xf7, ZC3XX_R110_RGB20},
2600	{0xa0, 0xf7, ZC3XX_R111_RGB21},
2601	{0xa0, 0x52, ZC3XX_R112_RGB22},
2602	{0xa1, 0x01, 0x0180},
2603	{0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},
2604	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
2605	{0xaa, 0x0d, 0x0003},
2606	{0xaa, 0x0c, 0x0020},
2607	{0xaa, 0x0e, 0x000e},
2608	{0xaa, 0x0f, 0x0002},
2609	{0xaa, 0x1c, 0x000d},
2610	{0xaa, 0x1d, 0x0002},
2611	{0xaa, 0x20, 0x0080},
2612	{0xaa, 0x22, 0x0080},
2613	{0xaa, 0x24, 0x0080},
2614	{0xaa, 0x26, 0x0080},
2615	{0xaa, 0x00, 0x0084},
2616	{0xa0, 0x02, ZC3XX_R0A3_EXPOSURETIMEHIGH},
2617	{0xa0, 0x0d, ZC3XX_R0A4_EXPOSURETIMELOW},
2618	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},
2619	{0xa0, 0x04, ZC3XX_R191_EXPOSURELIMITMID},
2620	{0xa0, 0x1a, ZC3XX_R192_EXPOSURELIMITLOW},
2621	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
2622	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},
2623	{0xa0, 0x4b, ZC3XX_R197_ANTIFLICKERLOW},
2624	{0xa0, 0x10, ZC3XX_R18C_AEFREEZE},
2625	{0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},
2626	{0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF},
2627	{0xa0, 0x12, ZC3XX_R1AA_DIGITALGAINSTEP},
2628	{0xa0, 0xc8, ZC3XX_R01D_HSYNC_0},
2629	{0xa0, 0xd8, ZC3XX_R01E_HSYNC_1},
2630	{0xa0, 0xea, ZC3XX_R01F_HSYNC_2},
2631	{0xa0, 0xff, ZC3XX_R020_HSYNC_3},
2632	{0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},
2633	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},
2634	{0xa1, 0x01, 0x0180},
2635	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},
2636	{0xa0, 0x40, ZC3XX_R116_RGAIN},
2637	{0xa0, 0x40, ZC3XX_R117_GGAIN},
2638	{0xa0, 0x40, ZC3XX_R118_BGAIN},
2639	{}
2640};
2641static const struct usb_action icm105a_50HZScale[] = {
2642	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */
2643	{0xaa, 0x0d, 0x0003}, /* 00,0d,03,aa */
2644	{0xaa, 0x0c, 0x0020}, /* 00,0c,20,aa */
2645	{0xaa, 0x0e, 0x000e}, /* 00,0e,0e,aa */
2646	{0xaa, 0x0f, 0x0002}, /* 00,0f,02,aa */
2647	{0xaa, 0x1c, 0x000d}, /* 00,1c,0d,aa */
2648	{0xaa, 0x1d, 0x0002}, /* 00,1d,02,aa */
2649	{0xaa, 0x20, 0x0080}, /* 00,20,80,aa */
2650	{0xaa, 0x22, 0x0080}, /* 00,22,80,aa */
2651	{0xaa, 0x24, 0x0080}, /* 00,24,80,aa */
2652	{0xaa, 0x26, 0x0080}, /* 00,26,80,aa */
2653	{0xaa, 0x00, 0x0084}, /* 00,00,84,aa */
2654	{0xa0, 0x02, ZC3XX_R0A3_EXPOSURETIMEHIGH}, /* 00,a3,02,cc */
2655	{0xa0, 0x0d, ZC3XX_R0A4_EXPOSURETIMELOW}, /* 00,a4,0d,cc */
2656	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */
2657	{0xa0, 0x04, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,04,cc */
2658	{0xa0, 0x1a, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,1a,cc */
2659	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */
2660	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */
2661	{0xa0, 0x4b, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,4b,cc */
2662	{0xa0, 0x10, ZC3XX_R18C_AEFREEZE}, /* 01,8c,10,cc */
2663	{0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,20,cc */
2664	{0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,10,cc */
2665	{0xa0, 0x12, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,12,cc */
2666	{0xa0, 0xc8, ZC3XX_R01D_HSYNC_0}, /* 00,1d,c8,cc */
2667	{0xa0, 0xd8, ZC3XX_R01E_HSYNC_1}, /* 00,1e,d8,cc */
2668	{0xa0, 0xea, ZC3XX_R01F_HSYNC_2}, /* 00,1f,ea,cc */
2669	{0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,20,ff,cc */
2670	{}
2671};
2672static const struct usb_action icm105a_50HZ[] = {
2673	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */
2674	{0xaa, 0x0d, 0x0003}, /* 00,0d,03,aa */
2675	{0xaa, 0x0c, 0x008c}, /* 00,0c,8c,aa */
2676	{0xaa, 0x0e, 0x0095}, /* 00,0e,95,aa */
2677	{0xaa, 0x0f, 0x0002}, /* 00,0f,02,aa */
2678	{0xaa, 0x1c, 0x0094}, /* 00,1c,94,aa */
2679	{0xaa, 0x1d, 0x0002}, /* 00,1d,02,aa */
2680	{0xaa, 0x20, 0x0080}, /* 00,20,80,aa */
2681	{0xaa, 0x22, 0x0080}, /* 00,22,80,aa */
2682	{0xaa, 0x24, 0x0080}, /* 00,24,80,aa */
2683	{0xaa, 0x26, 0x0080}, /* 00,26,80,aa */
2684	{0xaa, 0x00, 0x0084}, /* 00,00,84,aa */
2685	{0xa0, 0x02, ZC3XX_R0A3_EXPOSURETIMEHIGH}, /* 00,a3,02,cc */
2686	{0xa0, 0x94, ZC3XX_R0A4_EXPOSURETIMELOW}, /* 00,a4,94,cc */
2687	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */
2688	{0xa0, 0x04, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,04,cc */
2689	{0xa0, 0x20, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,20,cc */
2690	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */
2691	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */
2692	{0xa0, 0x84, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,84,cc */
2693	{0xa0, 0x10, ZC3XX_R18C_AEFREEZE}, /* 01,8c,10,cc */
2694	{0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,20,cc */
2695	{0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,10,cc */
2696	{0xa0, 0x12, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,12,cc */
2697	{0xa0, 0xe3, ZC3XX_R01D_HSYNC_0}, /* 00,1d,e3,cc */
2698	{0xa0, 0xec, ZC3XX_R01E_HSYNC_1}, /* 00,1e,ec,cc */
2699	{0xa0, 0xf5, ZC3XX_R01F_HSYNC_2}, /* 00,1f,f5,cc */
2700	{0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,20,ff,cc */
2701	{0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN}, /* 01,a7,00,cc */
2702	{0xa0, 0xc0, ZC3XX_R1A8_DIGITALGAIN}, /* 01,a8,c0,cc */
2703	{}
2704};
2705static const struct usb_action icm105a_60HZScale[] = {
2706	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */
2707	{0xaa, 0x0d, 0x0003}, /* 00,0d,03,aa */
2708	{0xaa, 0x0c, 0x0004}, /* 00,0c,04,aa */
2709	{0xaa, 0x0e, 0x000d}, /* 00,0e,0d,aa */
2710	{0xaa, 0x0f, 0x0002}, /* 00,0f,02,aa */
2711	{0xaa, 0x1c, 0x0008}, /* 00,1c,08,aa */
2712	{0xaa, 0x1d, 0x0002}, /* 00,1d,02,aa */
2713	{0xaa, 0x20, 0x0080}, /* 00,20,80,aa */
2714	{0xaa, 0x22, 0x0080}, /* 00,22,80,aa */
2715	{0xaa, 0x24, 0x0080}, /* 00,24,80,aa */
2716	{0xaa, 0x26, 0x0080}, /* 00,26,80,aa */
2717	{0xaa, 0x00, 0x0084}, /* 00,00,84,aa */
2718	{0xa0, 0x02, ZC3XX_R0A3_EXPOSURETIMEHIGH}, /* 00,a3,02,cc */
2719	{0xa0, 0x08, ZC3XX_R0A4_EXPOSURETIMELOW}, /* 00,a4,08,cc */
2720	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */
2721	{0xa0, 0x04, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,04,cc */
2722	{0xa0, 0x10, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,10,cc */
2723	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */
2724	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */
2725	{0xa0, 0x41, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,41,cc */
2726	{0xa0, 0x10, ZC3XX_R18C_AEFREEZE}, /* 01,8c,10,cc */
2727	{0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,20,cc */
2728	{0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,10,cc */
2729	{0xa0, 0x12, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,12,cc */
2730	{0xa0, 0xc1, ZC3XX_R01D_HSYNC_0}, /* 00,1d,c1,cc */
2731	{0xa0, 0xd4, ZC3XX_R01E_HSYNC_1}, /* 00,1e,d4,cc */
2732	{0xa0, 0xe8, ZC3XX_R01F_HSYNC_2}, /* 00,1f,e8,cc */
2733	{0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,20,ff,cc */
2734	{}
2735};
2736static const struct usb_action icm105a_60HZ[] = {
2737	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */
2738	{0xaa, 0x0d, 0x0003}, /* 00,0d,03,aa */
2739	{0xaa, 0x0c, 0x0008}, /* 00,0c,08,aa */
2740	{0xaa, 0x0e, 0x0086}, /* 00,0e,86,aa */
2741	{0xaa, 0x0f, 0x0002}, /* 00,0f,02,aa */
2742	{0xaa, 0x1c, 0x0085}, /* 00,1c,85,aa */
2743	{0xaa, 0x1d, 0x0002}, /* 00,1d,02,aa */
2744	{0xaa, 0x20, 0x0080}, /* 00,20,80,aa */
2745	{0xaa, 0x22, 0x0080}, /* 00,22,80,aa */
2746	{0xaa, 0x24, 0x0080}, /* 00,24,80,aa */
2747	{0xaa, 0x26, 0x0080}, /* 00,26,80,aa */
2748	{0xaa, 0x00, 0x0084}, /* 00,00,84,aa */
2749	{0xa0, 0x02, ZC3XX_R0A3_EXPOSURETIMEHIGH}, /* 00,a3,02,cc */
2750	{0xa0, 0x85, ZC3XX_R0A4_EXPOSURETIMELOW}, /* 00,a4,85,cc */
2751	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */
2752	{0xa0, 0x04, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,04,cc */
2753	{0xa0, 0x08, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,08,cc */
2754	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */
2755	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */
2756	{0xa0, 0x81, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,81,cc */
2757	{0xa0, 0x10, ZC3XX_R18C_AEFREEZE}, /* 01,8c,10,cc */
2758	{0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,20,cc */
2759	{0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,10,cc */
2760	{0xa0, 0x12, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,12,cc */
2761	{0xa0, 0xc2, ZC3XX_R01D_HSYNC_0}, /* 00,1d,c2,cc */
2762	{0xa0, 0xd6, ZC3XX_R01E_HSYNC_1}, /* 00,1e,d6,cc */
2763	{0xa0, 0xea, ZC3XX_R01F_HSYNC_2}, /* 00,1f,ea,cc */
2764	{0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,20,ff,cc */
2765	{0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN}, /* 01,a7,00,cc */
2766	{0xa0, 0xc0, ZC3XX_R1A8_DIGITALGAIN}, /* 01,a8,c0,cc */
2767	{}
2768};
2769static const struct usb_action icm105a_NoFlikerScale[] = {
2770	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */
2771	{0xaa, 0x0d, 0x0003}, /* 00,0d,03,aa */
2772	{0xaa, 0x0c, 0x0004}, /* 00,0c,04,aa */
2773	{0xaa, 0x0e, 0x000d}, /* 00,0e,0d,aa */
2774	{0xaa, 0x0f, 0x0002}, /* 00,0f,02,aa */
2775	{0xaa, 0x1c, 0x0000}, /* 00,1c,00,aa */
2776	{0xaa, 0x1d, 0x0002}, /* 00,1d,02,aa */
2777	{0xaa, 0x20, 0x0080}, /* 00,20,80,aa */
2778	{0xaa, 0x22, 0x0080}, /* 00,22,80,aa */
2779	{0xaa, 0x24, 0x0080}, /* 00,24,80,aa */
2780	{0xaa, 0x26, 0x0080}, /* 00,26,80,aa */
2781	{0xaa, 0x00, 0x0084}, /* 00,00,84,aa */
2782	{0xa0, 0x02, ZC3XX_R0A3_EXPOSURETIMEHIGH}, /* 00,a3,02,cc */
2783	{0xa0, 0x00, ZC3XX_R0A4_EXPOSURETIMELOW}, /* 00,a4,00,cc */
2784	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */
2785	{0xa0, 0x04, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,04,cc */
2786	{0xa0, 0x20, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,20,cc */
2787	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */
2788	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */
2789	{0xa0, 0x10, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,10,cc */
2790	{0xa0, 0x10, ZC3XX_R18C_AEFREEZE}, /* 01,8c,10,cc */
2791	{0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,20,cc */
2792	{0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,00,cc */
2793	{0xa0, 0x00, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,00,cc */
2794	{0xa0, 0xc1, ZC3XX_R01D_HSYNC_0}, /* 00,1d,c1,cc */
2795	{0xa0, 0xd4, ZC3XX_R01E_HSYNC_1}, /* 00,1e,d4,cc */
2796	{0xa0, 0xe8, ZC3XX_R01F_HSYNC_2}, /* 00,1f,e8,cc */
2797	{0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,20,ff,cc */
2798	{}
2799};
2800static const struct usb_action icm105a_NoFliker[] = {
2801	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */
2802	{0xaa, 0x0d, 0x0003}, /* 00,0d,03,aa */
2803	{0xaa, 0x0c, 0x0004}, /* 00,0c,04,aa */
2804	{0xaa, 0x0e, 0x0081}, /* 00,0e,81,aa */
2805	{0xaa, 0x0f, 0x0002}, /* 00,0f,02,aa */
2806	{0xaa, 0x1c, 0x0080}, /* 00,1c,80,aa */
2807	{0xaa, 0x1d, 0x0002}, /* 00,1d,02,aa */
2808	{0xaa, 0x20, 0x0080}, /* 00,20,80,aa */
2809	{0xaa, 0x22, 0x0080}, /* 00,22,80,aa */
2810	{0xaa, 0x24, 0x0080}, /* 00,24,80,aa */
2811	{0xaa, 0x26, 0x0080}, /* 00,26,80,aa */
2812	{0xaa, 0x00, 0x0084}, /* 00,00,84,aa */
2813	{0xa0, 0x02, ZC3XX_R0A3_EXPOSURETIMEHIGH}, /* 00,a3,02,cc */
2814	{0xa0, 0x80, ZC3XX_R0A4_EXPOSURETIMELOW}, /* 00,a4,80,cc */
2815	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */
2816	{0xa0, 0x04, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,04,cc */
2817	{0xa0, 0x20, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,20,cc */
2818	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */
2819	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */
2820	{0xa0, 0x10, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,10,cc */
2821	{0xa0, 0x10, ZC3XX_R18C_AEFREEZE}, /* 01,8c,10,cc */
2822	{0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,20,cc */
2823	{0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,00,cc */
2824	{0xa0, 0x00, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,00,cc */
2825	{0xa0, 0xc1, ZC3XX_R01D_HSYNC_0}, /* 00,1d,c1,cc */
2826	{0xa0, 0xd4, ZC3XX_R01E_HSYNC_1}, /* 00,1e,d4,cc */
2827	{0xa0, 0xe8, ZC3XX_R01F_HSYNC_2}, /* 00,1f,e8,cc */
2828	{0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,20,ff,cc */
2829	{0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN}, /* 01,a7,00,cc */
2830	{0xa0, 0xc0, ZC3XX_R1A8_DIGITALGAIN}, /* 01,a8,c0,cc */
2831	{}
2832};
2833
2834static const struct usb_action mc501cb_Initial[] = {
2835	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL}, /* 00,00,01,cc */
2836	{0xa0, 0x00, ZC3XX_R002_CLOCKSELECT}, /* 00,02,00,cc */
2837	{0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,01,cc */
2838	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING}, /* 00,01,01,cc */
2839	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING}, /* 00,08,03,cc */
2840	{0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,01,cc */
2841	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,05,cc */
2842	{0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH}, /* 00,03,02,cc */
2843	{0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW}, /* 00,04,80,cc */
2844	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH}, /* 00,05,01,cc */
2845	{0xa0, 0xd8, ZC3XX_R006_FRAMEHEIGHTLOW}, /* 00,06,d8,cc */
2846	{0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW}, /* 00,98,00,cc */
2847	{0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW}, /* 00,9a,00,cc */
2848	{0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW}, /* 01,1a,00,cc */
2849	{0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW}, /* 01,1c,00,cc */
2850	{0xa0, 0x01, ZC3XX_R09B_WINHEIGHTHIGH}, /* 00,9b,01,cc */
2851	{0xa0, 0xde, ZC3XX_R09C_WINHEIGHTLOW}, /* 00,9c,de,cc */
2852	{0xa0, 0x02, ZC3XX_R09D_WINWIDTHHIGH}, /* 00,9d,02,cc */
2853	{0xa0, 0x86, ZC3XX_R09E_WINWIDTHLOW}, /* 00,9e,86,cc */
2854	{0xa0, 0x33, ZC3XX_R086_EXPTIMEHIGH}, /* 00,86,33,cc */
2855	{0xa0, 0x34, ZC3XX_R087_EXPTIMEMID}, /* 00,87,34,cc */
2856	{0xa0, 0x35, ZC3XX_R088_EXPTIMELOW}, /* 00,88,35,cc */
2857	{0xa0, 0xb0, ZC3XX_R08B_I2CDEVICEADDR}, /* 00,8b,b0,cc */
2858	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,05,cc */
2859	{0xaa, 0x01, 0x0001}, /* 00,01,01,aa */
2860	{0xaa, 0x01, 0x0003}, /* 00,01,03,aa */
2861	{0xaa, 0x01, 0x0001}, /* 00,01,01,aa */
2862	{0xaa, 0x03, 0x0000}, /* 00,03,00,aa */
2863	{0xaa, 0x10, 0x0000}, /* 00,10,00,aa */
2864	{0xaa, 0x11, 0x0080}, /* 00,11,80,aa */
2865	{0xaa, 0x12, 0x0000}, /* 00,12,00,aa */
2866	{0xaa, 0x13, 0x0000}, /* 00,13,00,aa */
2867	{0xaa, 0x14, 0x0000}, /* 00,14,00,aa */
2868	{0xaa, 0x15, 0x0000}, /* 00,15,00,aa */
2869	{0xaa, 0x16, 0x0000}, /* 00,16,00,aa */
2870	{0xaa, 0x17, 0x0001}, /* 00,17,01,aa */
2871	{0xaa, 0x18, 0x00de}, /* 00,18,de,aa */
2872	{0xaa, 0x19, 0x0002}, /* 00,19,02,aa */
2873	{0xaa, 0x1a, 0x0086}, /* 00,1a,86,aa */
2874	{0xaa, 0x20, 0x00a8}, /* 00,20,a8,aa */
2875	{0xaa, 0x22, 0x0000}, /* 00,22,00,aa */
2876	{0xaa, 0x23, 0x0000}, /* 00,23,00,aa */
2877	{0xaa, 0x24, 0x0000}, /* 00,24,00,aa */
2878	{0xaa, 0x40, 0x0033}, /* 00,40,33,aa */
2879	{0xaa, 0x41, 0x0077}, /* 00,41,77,aa */
2880	{0xaa, 0x42, 0x0053}, /* 00,42,53,aa */
2881	{0xaa, 0x43, 0x00b0}, /* 00,43,b0,aa */
2882	{0xaa, 0x4b, 0x0001}, /* 00,4b,01,aa */
2883	{0xaa, 0x72, 0x0020}, /* 00,72,20,aa */
2884	{0xaa, 0x73, 0x0000}, /* 00,73,00,aa */
2885	{0xaa, 0x80, 0x0000}, /* 00,80,00,aa */
2886	{0xaa, 0x85, 0x0050}, /* 00,85,50,aa */
2887	{0xaa, 0x91, 0x0070}, /* 00,91,70,aa */
2888	{0xaa, 0x92, 0x0072}, /* 00,92,72,aa */
2889	{0xaa, 0x03, 0x0001}, /* 00,03,01,aa */
2890	{0xaa, 0x10, 0x00a0}, /* 00,10,a0,aa */
2891	{0xaa, 0x11, 0x0001}, /* 00,11,01,aa */
2892	{0xaa, 0x30, 0x0000}, /* 00,30,00,aa */
2893	{0xaa, 0x60, 0x0000}, /* 00,60,00,aa */
2894	{0xaa, 0xa0, ZC3XX_R01A_LASTFRAMESTATE}, /* 00,a0,1a,aa */
2895	{0xaa, 0xa1, 0x0000}, /* 00,a1,00,aa */
2896	{0xaa, 0xa2, 0x003f}, /* 00,a2,3f,aa */
2897	{0xaa, 0xa3, 0x0028}, /* 00,a3,28,aa */
2898	{0xaa, 0xa4, 0x0010}, /* 00,a4,10,aa */
2899	{0xaa, 0xa5, 0x0020}, /* 00,a5,20,aa */
2900	{0xaa, 0xb1, 0x0044}, /* 00,b1,44,aa */
2901	{0xaa, 0xd0, 0x0001}, /* 00,d0,01,aa */
2902	{0xaa, 0xd1, 0x0085}, /* 00,d1,85,aa */
2903	{0xaa, 0xd2, 0x0080}, /* 00,d2,80,aa */
2904	{0xaa, 0xd3, 0x0080}, /* 00,d3,80,aa */
2905	{0xaa, 0xd4, 0x0080}, /* 00,d4,80,aa */
2906	{0xaa, 0xd5, 0x0080}, /* 00,d5,80,aa */
2907	{0xaa, 0xc0, 0x00c3}, /* 00,c0,c3,aa */
2908	{0xaa, 0xc2, 0x0044}, /* 00,c2,44,aa */
2909	{0xaa, 0xc4, 0x0040}, /* 00,c4,40,aa */
2910	{0xaa, 0xc5, 0x0020}, /* 00,c5,20,aa */
2911	{0xaa, 0xc6, 0x0008}, /* 00,c6,08,aa */
2912	{0xaa, 0x03, 0x0004}, /* 00,03,04,aa */
2913	{0xaa, 0x10, 0x0000}, /* 00,10,00,aa */
2914	{0xaa, 0x40, 0x0030}, /* 00,40,30,aa */
2915	{0xaa, 0x41, 0x0020}, /* 00,41,20,aa */
2916	{0xaa, 0x42, 0x002d}, /* 00,42,2d,aa */
2917	{0xaa, 0x03, 0x0003}, /* 00,03,03,aa */
2918	{0xaa, 0x1c, 0x0050}, /* 00,1C,50,aa */
2919	{0xaa, 0x11, 0x0081}, /* 00,11,81,aa */
2920	{0xaa, 0x3b, 0x001d}, /* 00,3b,1D,aa */
2921	{0xaa, 0x3c, 0x004c}, /* 00,3c,4C,aa */
2922	{0xaa, 0x3d, 0x0018}, /* 00,3d,18,aa */
2923	{0xaa, 0x3e, 0x006a}, /* 00,3e,6A,aa */
2924	{0xaa, 0x01, 0x0000}, /* 00,01,00,aa */
2925	{0xaa, 0x52, 0x00ff}, /* 00,52,FF,aa */
2926	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */
2927	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE}, /* 01,00,0d,cc */
2928	{0xa0, 0x37, ZC3XX_R101_SENSORCORRECTION}, /* 01,01,37,cc */
2929	{0xa0, 0x06, ZC3XX_R189_AWBSTATUS}, /* 01,89,06,cc */
2930	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE}, /* 01,c5,03,cc */
2931	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05}, /* 01,cb,13,cc */
2932	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE}, /* 02,50,08,cc */
2933	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS}, /* 03,01,08,cc */
2934	{0xa0, 0x02, ZC3XX_R180_AUTOCORRECTENABLE}, /* 01,80,02,cc */
2935	{0xaa, 0x03, 0x0002}, /* 00,03,02,aa */
2936	{0xaa, 0x51, 0x0027}, /* 00,51,27,aa */
2937	{0xaa, 0x52, 0x0020}, /* 00,52,20,aa */
2938	{0xaa, 0x03, 0x0003}, /* 00,03,03,aa */
2939	{0xaa, 0x50, 0x0010}, /* 00,50,10,aa */
2940	{0xaa, 0x51, 0x0010}, /* 00,51,10,aa */
2941	{0xaa, 0x54, 0x0010}, /* 00,54,10,aa */
2942	{0xaa, 0x55, 0x0010}, /* 00,55,10,aa */
2943	{0xa0, 0xf0, 0x0199}, /* 01,99,F0,cc */
2944	{0xa0, 0x80, 0x019a}, /* 01,9A,80,cc */
2945
2946	{0xaa, 0x03, 0x0003}, /* 00,03,03,aa */
2947	{0xaa, 0x10, 0x00fc}, /* 00,10,fc,aa */
2948	{0xaa, 0x36, 0x001d}, /* 00,36,1D,aa */
2949	{0xaa, 0x37, 0x004c}, /* 00,37,4C,aa */
2950	{0xaa, 0x3b, 0x001d}, /* 00,3B,1D,aa */
2951	{}
2952};
2953
2954static const struct usb_action mc501cb_InitialScale[] = {	 /* 320x240 */
2955	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL}, /* 00,00,01,cc */
2956	{0xa0, 0x10, ZC3XX_R002_CLOCKSELECT}, /* 00,02,10,cc */
2957	{0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,01,cc */
2958	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING}, /* 00,01,01,cc */
2959	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING}, /* 00,08,03,cc */
2960	{0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,01,cc */
2961	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,05,cc */
2962	{0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH}, /* 00,03,02,cc */
2963	{0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW}, /* 00,04,80,cc */
2964	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH}, /* 00,05,01,cc */
2965	{0xa0, 0xd0, ZC3XX_R006_FRAMEHEIGHTLOW}, /* 00,06,d0,cc */
2966	{0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW}, /* 00,98,00,cc */
2967	{0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW}, /* 00,9a,00,cc */
2968	{0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW}, /* 01,1a,00,cc */
2969	{0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW}, /* 01,1c,00,cc */
2970	{0xa0, 0x01, ZC3XX_R09B_WINHEIGHTHIGH}, /* 00,9b,01,cc */
2971	{0xa0, 0xd8, ZC3XX_R09C_WINHEIGHTLOW}, /* 00,9c,d8,cc */
2972	{0xa0, 0x02, ZC3XX_R09D_WINWIDTHHIGH}, /* 00,9d,02,cc */
2973	{0xa0, 0x88, ZC3XX_R09E_WINWIDTHLOW}, /* 00,9e,88,cc */
2974	{0xa0, 0x33, ZC3XX_R086_EXPTIMEHIGH}, /* 00,86,33,cc */
2975	{0xa0, 0x34, ZC3XX_R087_EXPTIMEMID}, /* 00,87,34,cc */
2976	{0xa0, 0x35, ZC3XX_R088_EXPTIMELOW}, /* 00,88,35,cc */
2977	{0xa0, 0xb0, ZC3XX_R08B_I2CDEVICEADDR}, /* 00,8b,b0,cc */
2978	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,05,cc */
2979	{0xaa, 0x01, 0x0001}, /* 00,01,01,aa */
2980	{0xaa, 0x01, 0x0003}, /* 00,01,03,aa */
2981	{0xaa, 0x01, 0x0001}, /* 00,01,01,aa */
2982	{0xaa, 0x03, 0x0000}, /* 00,03,00,aa */
2983	{0xaa, 0x10, 0x0000}, /* 00,10,00,aa */
2984	{0xaa, 0x11, 0x0080}, /* 00,11,80,aa */
2985	{0xaa, 0x12, 0x0000}, /* 00,12,00,aa */
2986	{0xaa, 0x13, 0x0000}, /* 00,13,00,aa */
2987	{0xaa, 0x14, 0x0000}, /* 00,14,00,aa */
2988	{0xaa, 0x15, 0x0000}, /* 00,15,00,aa */
2989	{0xaa, 0x16, 0x0000}, /* 00,16,00,aa */
2990	{0xaa, 0x17, 0x0001}, /* 00,17,01,aa */
2991	{0xaa, 0x18, 0x00d8}, /* 00,18,d8,aa */
2992	{0xaa, 0x19, 0x0002}, /* 00,19,02,aa */
2993	{0xaa, 0x1a, 0x0088}, /* 00,1a,88,aa */
2994	{0xaa, 0x20, 0x00a8}, /* 00,20,a8,aa */
2995	{0xaa, 0x22, 0x0000}, /* 00,22,00,aa */
2996	{0xaa, 0x23, 0x0000}, /* 00,23,00,aa */
2997	{0xaa, 0x24, 0x0000}, /* 00,24,00,aa */
2998	{0xaa, 0x40, 0x0033}, /* 00,40,33,aa */
2999	{0xaa, 0x41, 0x0077}, /* 00,41,77,aa */
3000	{0xaa, 0x42, 0x0053}, /* 00,42,53,aa */
3001	{0xaa, 0x43, 0x00b0}, /* 00,43,b0,aa */
3002	{0xaa, 0x4b, 0x0001}, /* 00,4b,01,aa */
3003	{0xaa, 0x72, 0x0020}, /* 00,72,20,aa */
3004	{0xaa, 0x73, 0x0000}, /* 00,73,00,aa */
3005	{0xaa, 0x80, 0x0000}, /* 00,80,00,aa */
3006	{0xaa, 0x85, 0x0050}, /* 00,85,50,aa */
3007	{0xaa, 0x91, 0x0070}, /* 00,91,70,aa */
3008	{0xaa, 0x92, 0x0072}, /* 00,92,72,aa */
3009	{0xaa, 0x03, 0x0001}, /* 00,03,01,aa */
3010	{0xaa, 0x10, 0x00a0}, /* 00,10,a0,aa */
3011	{0xaa, 0x11, 0x0001}, /* 00,11,01,aa */
3012	{0xaa, 0x30, 0x0000}, /* 00,30,00,aa */
3013	{0xaa, 0x60, 0x0000}, /* 00,60,00,aa */
3014	{0xaa, 0xa0, ZC3XX_R01A_LASTFRAMESTATE}, /* 00,a0,1a,aa */
3015	{0xaa, 0xa1, 0x0000}, /* 00,a1,00,aa */
3016	{0xaa, 0xa2, 0x003f}, /* 00,a2,3f,aa */
3017	{0xaa, 0xa3, 0x0028}, /* 00,a3,28,aa */
3018	{0xaa, 0xa4, 0x0010}, /* 00,a4,10,aa */
3019	{0xaa, 0xa5, 0x0020}, /* 00,a5,20,aa */
3020	{0xaa, 0xb1, 0x0044}, /* 00,b1,44,aa */
3021	{0xaa, 0xd0, 0x0001}, /* 00,d0,01,aa */
3022	{0xaa, 0xd1, 0x0085}, /* 00,d1,85,aa */
3023	{0xaa, 0xd2, 0x0080}, /* 00,d2,80,aa */
3024	{0xaa, 0xd3, 0x0080}, /* 00,d3,80,aa */
3025	{0xaa, 0xd4, 0x0080}, /* 00,d4,80,aa */
3026	{0xaa, 0xd5, 0x0080}, /* 00,d5,80,aa */
3027	{0xaa, 0xc0, 0x00c3}, /* 00,c0,c3,aa */
3028	{0xaa, 0xc2, 0x0044}, /* 00,c2,44,aa */
3029	{0xaa, 0xc4, 0x0040}, /* 00,c4,40,aa */
3030	{0xaa, 0xc5, 0x0020}, /* 00,c5,20,aa */
3031	{0xaa, 0xc6, 0x0008}, /* 00,c6,08,aa */
3032	{0xaa, 0x03, 0x0004}, /* 00,03,04,aa */
3033	{0xaa, 0x10, 0x0000}, /* 00,10,00,aa */
3034	{0xaa, 0x40, 0x0030}, /* 00,40,30,aa */
3035	{0xaa, 0x41, 0x0020}, /* 00,41,20,aa */
3036	{0xaa, 0x42, 0x002d}, /* 00,42,2d,aa */
3037	{0xaa, 0x03, 0x0003}, /* 00,03,03,aa */
3038	{0xaa, 0x1c, 0x0050}, /* 00,1c,50,aa */
3039	{0xaa, 0x11, 0x0081}, /* 00,11,81,aa */
3040	{0xaa, 0x3b, 0x003a}, /* 00,3b,3A,aa */
3041	{0xaa, 0x3c, 0x0098}, /* 00,3c,98,aa */
3042	{0xaa, 0x3d, 0x0030}, /* 00,3d,30,aa */
3043	{0xaa, 0x3e, 0x00d4}, /* 00,3E,D4,aa */
3044	{0xaa, 0x01, 0x0000}, /* 00,01,00,aa */
3045	{0xaa, 0x52, 0x00ff}, /* 00,52,FF,aa */
3046	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */
3047	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE}, /* 01,00,0d,cc */
3048	{0xa0, 0x37, ZC3XX_R101_SENSORCORRECTION}, /* 01,01,37,cc */
3049	{0xa0, 0x06, ZC3XX_R189_AWBSTATUS}, /* 01,89,06,cc */
3050	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE}, /* 01,c5,03,cc */
3051	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05}, /* 01,cb,13,cc */
3052	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE}, /* 02,50,08,cc */
3053	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS}, /* 03,01,08,cc */
3054	{0xa0, 0x02, ZC3XX_R180_AUTOCORRECTENABLE}, /* 01,80,02,cc */
3055	{0xaa, 0x03, 0x0002}, /* 00,03,02,aa */
3056	{0xaa, 0x51, 0x004e}, /* 00,51,4E,aa */
3057	{0xaa, 0x52, 0x0041}, /* 00,52,41,aa */
3058	{0xaa, 0x03, 0x0003}, /* 00,03,03,aa */
3059	{0xaa, 0x50, 0x0010}, /* 00,50,10,aa */
3060	{0xaa, 0x51, 0x0010}, /* 00,51,10,aa */
3061	{0xaa, 0x54, 0x0010}, /* 00,54,10,aa */
3062	{0xaa, 0x55, 0x0010}, /* 00,55,10,aa */
3063	{0xa0, 0xf0, 0x0199}, /* 01,99,F0,cc */
3064	{0xa0, 0x80, 0x019a}, /* 01,9A,80,cc */
3065	{0xaa, 0x03, 0x0003}, /* 00,03,03,aa */
3066	{0xaa, 0x10, 0x00fc}, /* 00,10,fc,aa */
3067	{0xaa, 0x36, 0x001d}, /* 00,36,1D,aa */
3068	{0xaa, 0x37, 0x004c}, /* 00,37,4C,aa */
3069	{0xaa, 0x3b, 0x001d}, /* 00,3B,1D,aa */
3070	{}
3071};
3072
3073static const struct usb_action mc501cb_50HZScale[] = {
3074	{0xaa, 0x03, 0x0003}, /* 00,03,03,aa */
3075	{0xaa, 0x10, 0x00fc}, /* 00,10,fc,aa */
3076	{0xaa, 0x36, 0x001d}, /* 00,36,1D,aa */
3077	{0xaa, 0x37, 0x004c}, /* 00,37,4C,aa */
3078	{0xaa, 0x3b, 0x001d}, /* 00,3B,1D,aa */
3079	{0xaa, 0x3c, 0x004c}, /* 00,3C,4C,aa */
3080	{0xaa, 0x3d, 0x001d}, /* 00,3D,1D,aa */
3081	{0xaa, 0x3e, 0x004c}, /* 00,3E,4C,aa */
3082	{0xaa, 0x03, 0x0003}, /* 00,03,03,aa */
3083	{0xaa, 0x10, 0x00fc}, /* 00,10,fc,aa */
3084	{0xaa, 0x36, 0x003a}, /* 00,36,3A,aa */
3085	{0xaa, 0x37, 0x0098}, /* 00,37,98,aa */
3086	{0xaa, 0x3b, 0x003a}, /* 00,3B,3A,aa */
3087	{}
3088};
3089
3090static const struct usb_action mc501cb_50HZ[] = {
3091	{0xaa, 0x03, 0x0003}, /* 00,03,03,aa */
3092	{0xaa, 0x10, 0x00fc}, /* 00,10,fc,aa */
3093	{0xaa, 0x36, 0x003a}, /* 00,36,3A,aa */
3094	{0xaa, 0x37, 0x0098}, /* 00,37,98,aa */
3095	{0xaa, 0x3b, 0x003a}, /* 00,3B,3A,aa */
3096	{0xaa, 0x3c, 0x0098}, /* 00,3C,98,aa */
3097	{0xaa, 0x3d, 0x003a}, /* 00,3D,3A,aa */
3098	{0xaa, 0x3e, 0x0098}, /* 00,3E,98,aa */
3099	{0xaa, 0x03, 0x0003}, /* 00,03,03,aa */
3100	{0xaa, 0x10, 0x00fc}, /* 00,10,fc,aa */
3101	{0xaa, 0x36, 0x0018}, /* 00,36,18,aa */
3102	{0xaa, 0x37, 0x006a}, /* 00,37,6A,aa */
3103	{0xaa, 0x3d, 0x0018}, /* 00,3D,18,aa */
3104	{}
3105};
3106
3107static const struct usb_action mc501cb_60HZScale[] = {
3108	{0xaa, 0x03, 0x0003}, /* 00,03,03,aa */
3109	{0xaa, 0x10, 0x00fc}, /* 00,10,fc,aa */
3110	{0xaa, 0x36, 0x0018}, /* 00,36,18,aa */
3111	{0xaa, 0x37, 0x006a}, /* 00,37,6A,aa */
3112	{0xaa, 0x3d, 0x0018}, /* 00,3D,18,aa */
3113	{0xaa, 0x3e, 0x006a}, /* 00,3E,6A,aa */
3114	{0xaa, 0x3b, 0x0018}, /* 00,3B,18,aa */
3115	{0xaa, 0x3c, 0x006a}, /* 00,3C,6A,aa */
3116	{0xaa, 0x03, 0x0003}, /* 00,03,03,aa */
3117	{0xaa, 0x10, 0x00fc}, /* 00,10,fc,aa */
3118	{0xaa, 0x36, 0x0030}, /* 00,36,30,aa */
3119	{0xaa, 0x37, 0x00d4}, /* 00,37,D4,aa */
3120	{0xaa, 0x3d, 0x0030}, /* 00,3D,30,aa */
3121	{}
3122};
3123
3124static const struct usb_action mc501cb_60HZ[] = {
3125	{0xaa, 0x03, 0x0003}, /* 00,03,03,aa */
3126	{0xaa, 0x10, 0x00fc}, /* 00,10,fc,aa */
3127	{0xaa, 0x36, 0x0030}, /* 00,36,30,aa */
3128	{0xaa, 0x37, 0x00d4}, /* 00,37,D4,aa */
3129	{0xaa, 0x3d, 0x0030}, /* 00,3D,30,aa */
3130	{0xaa, 0x3e, 0x00d4}, /* 00,3E,D4,aa */
3131	{0xaa, 0x3b, 0x0030}, /* 00,3B,30,aa */
3132	{0xaa, 0x3c, 0x00d4}, /* 00,3C,D4,aa */
3133	{0xaa, 0x03, 0x0003}, /* 00,03,03,aa */
3134	{0xaa, 0x10, 0x00fc}, /* 00,10,fc,aa */
3135	{0xaa, 0x36, 0x0018}, /* 00,36,18,aa */
3136	{0xaa, 0x37, 0x006a}, /* 00,37,6A,aa */
3137	{0xaa, 0x3d, 0x0018}, /* 00,3D,18,aa */
3138	{}
3139};
3140
3141static const struct usb_action mc501cb_NoFlikerScale[] = {
3142	{0xaa, 0x03, 0x0003}, /* 00,03,03,aa */
3143	{0xaa, 0x10, 0x00fc}, /* 00,10,fc,aa */
3144	{0xaa, 0x36, 0x0018}, /* 00,36,18,aa */
3145	{0xaa, 0x37, 0x006a}, /* 00,37,6A,aa */
3146	{0xaa, 0x3d, 0x0018}, /* 00,3D,18,aa */
3147	{0xaa, 0x3e, 0x006a}, /* 00,3E,6A,aa */
3148	{0xaa, 0x3b, 0x0018}, /* 00,3B,18,aa */
3149	{0xaa, 0x3c, 0x006a}, /* 00,3C,6A,aa */
3150	{0xaa, 0x03, 0x0003}, /* 00,03,03,aa */
3151	{0xaa, 0x10, 0x00fc}, /* 00,10,fc,aa */
3152	{0xaa, 0x36, 0x0030}, /* 00,36,30,aa */
3153	{0xaa, 0x37, 0x00d4}, /* 00,37,D4,aa */
3154	{0xaa, 0x3d, 0x0030}, /* 00,3D,30,aa */
3155	{}
3156};
3157
3158static const struct usb_action mc501cb_NoFliker[] = {
3159	{0xaa, 0x03, 0x0003}, /* 00,03,03,aa */
3160	{0xaa, 0x10, 0x00fc}, /* 00,10,fc,aa */
3161	{0xaa, 0x36, 0x0030}, /* 00,36,30,aa */
3162	{0xaa, 0x37, 0x00d4}, /* 00,37,D4,aa */
3163	{0xaa, 0x3d, 0x0030}, /* 00,3D,30,aa */
3164	{0xaa, 0x3e, 0x00d4}, /* 00,3E,D4,aa */
3165	{0xaa, 0x3b, 0x0030}, /* 00,3B,30,aa */
3166	{0xaa, 0x3c, 0x00d4}, /* 00,3C,D4,aa */
3167	{}
3168};
3169
3170/* from zs211.inf */
3171static const struct usb_action ov7620_Initial[] = {	/* 640x480 */
3172	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL}, /* 00,00,01,cc */
3173	{0xa0, 0x40, ZC3XX_R002_CLOCKSELECT}, /* 00,02,40,cc */
3174	{0xa0, 0x00, ZC3XX_R008_CLOCKSETTING}, /* 00,08,00,cc */
3175	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING}, /* 00,01,01,cc */
3176	{0xa0, 0x06, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,06,cc */
3177	{0xa0, 0x02, ZC3XX_R083_RGAINADDR}, /* 00,83,02,cc */
3178	{0xa0, 0x01, ZC3XX_R085_BGAINADDR}, /* 00,85,01,cc */
3179	{0xa0, 0x80, ZC3XX_R086_EXPTIMEHIGH}, /* 00,86,80,cc */
3180	{0xa0, 0x81, ZC3XX_R087_EXPTIMEMID}, /* 00,87,81,cc */
3181	{0xa0, 0x10, ZC3XX_R088_EXPTIMELOW}, /* 00,88,10,cc */
3182	{0xa0, 0xa1, ZC3XX_R08B_I2CDEVICEADDR}, /* 00,8b,a1,cc */
3183	{0xa0, 0x08, ZC3XX_R08D_COMPABILITYMODE}, /* 00,8d,08,cc */
3184	{0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH}, /* 00,03,02,cc */
3185	{0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW}, /* 00,04,80,cc */
3186	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH}, /* 00,05,01,cc */
3187	{0xa0, 0xd8, ZC3XX_R006_FRAMEHEIGHTLOW}, /* 00,06,d8,cc */
3188	{0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,03,cc */
3189	{0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,01,cc */
3190	{0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW}, /* 00,98,00,cc */
3191	{0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW}, /* 00,9a,00,cc */
3192	{0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW}, /* 01,1a,00,cc */
3193	{0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW}, /* 01,1c,00,cc */
3194	{0xa0, 0xde, ZC3XX_R09C_WINHEIGHTLOW}, /* 00,9c,de,cc */
3195	{0xa0, 0x86, ZC3XX_R09E_WINWIDTHLOW}, /* 00,9e,86,cc */
3196	{0xaa, 0x12, 0x0088}, /* 00,12,88,aa */
3197	{0xaa, 0x12, 0x0048}, /* 00,12,48,aa */
3198	{0xaa, 0x75, 0x008a}, /* 00,75,8a,aa */
3199	{0xaa, 0x13, 0x00a3}, /* 00,13,a3,aa */
3200	{0xaa, 0x04, 0x0000}, /* 00,04,00,aa */
3201	{0xaa, 0x05, 0x0000}, /* 00,05,00,aa */
3202	{0xaa, 0x14, 0x0000}, /* 00,14,00,aa */
3203	{0xaa, 0x15, 0x0004}, /* 00,15,04,aa */
3204	{0xaa, 0x17, 0x0018}, /* 00,17,18,aa */
3205	{0xaa, 0x18, 0x00ba}, /* 00,18,ba,aa */
3206	{0xaa, 0x19, 0x0002}, /* 00,19,02,aa */
3207	{0xaa, 0x1a, 0x00f1}, /* 00,1a,f1,aa */
3208	{0xaa, 0x20, 0x0040}, /* 00,20,40,aa */
3209	{0xaa, 0x24, 0x0088}, /* 00,24,88,aa */
3210	{0xaa, 0x25, 0x0078}, /* 00,25,78,aa */
3211	{0xaa, 0x27, 0x00f6}, /* 00,27,f6,aa */
3212	{0xaa, 0x28, 0x00a0}, /* 00,28,a0,aa */
3213	{0xaa, 0x21, 0x0000}, /* 00,21,00,aa */
3214	{0xaa, 0x2a, 0x0083}, /* 00,2a,83,aa */
3215	{0xaa, 0x2b, 0x0096}, /* 00,2b,96,aa */
3216	{0xaa, 0x2d, 0x0005}, /* 00,2d,05,aa */
3217	{0xaa, 0x74, 0x0020}, /* 00,74,20,aa */
3218	{0xaa, 0x61, 0x0068}, /* 00,61,68,aa */
3219	{0xaa, 0x64, 0x0088}, /* 00,64,88,aa */
3220	{0xaa, 0x00, 0x0000}, /* 00,00,00,aa */
3221	{0xaa, 0x06, 0x0080}, /* 00,06,80,aa */
3222	{0xaa, 0x01, 0x0090}, /* 00,01,90,aa */
3223	{0xaa, 0x02, 0x0030}, /* 00,02,30,aa */
3224	{0xa0, 0x77, ZC3XX_R101_SENSORCORRECTION}, /* 01,01,77,cc */
3225	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,05,cc */
3226	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE}, /* 01,00,0d,cc */
3227	{0xa0, 0x06, ZC3XX_R189_AWBSTATUS}, /* 01,89,06,cc */
3228	{0xa0, 0x00, 0x01ad}, /* 01,ad,00,cc */
3229	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE}, /* 01,c5,03,cc */
3230	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05}, /* 01,cb,13,cc */
3231	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE}, /* 02,50,08,cc */
3232	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS}, /* 03,01,08,cc */
3233	{0xa0, 0x68, ZC3XX_R116_RGAIN}, /* 01,16,68,cc */
3234	{0xa0, 0x52, ZC3XX_R118_BGAIN}, /* 01,18,52,cc */
3235	{0xa0, 0x40, ZC3XX_R11D_GLOBALGAIN}, /* 01,1d,40,cc */
3236	{0xa0, 0x02, ZC3XX_R180_AUTOCORRECTENABLE}, /* 01,80,02,cc */
3237	{0xa0, 0x50, ZC3XX_R1A8_DIGITALGAIN}, /* 01,a8,50,cc */
3238	{}
3239};
3240static const struct usb_action ov7620_InitialScale[] = {	/* 320x240 */
3241	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL}, /* 00,00,01,cc */
3242	{0xa0, 0x50, ZC3XX_R002_CLOCKSELECT},	/* 00,02,50,cc */
3243	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},	/* 00,08,00,cc */
3244						/* mx change? */
3245	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING}, /* 00,01,01,cc */
3246	{0xa0, 0x06, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,06,cc */
3247	{0xa0, 0x02, ZC3XX_R083_RGAINADDR},	/* 00,83,02,cc */
3248	{0xa0, 0x01, ZC3XX_R085_BGAINADDR},	/* 00,85,01,cc */
3249	{0xa0, 0x80, ZC3XX_R086_EXPTIMEHIGH},	/* 00,86,80,cc */
3250	{0xa0, 0x81, ZC3XX_R087_EXPTIMEMID},	/* 00,87,81,cc */
3251	{0xa0, 0x10, ZC3XX_R088_EXPTIMELOW},	/* 00,88,10,cc */
3252	{0xa0, 0xa1, ZC3XX_R08B_I2CDEVICEADDR}, /* 00,8b,a1,cc */
3253	{0xa0, 0x08, ZC3XX_R08D_COMPABILITYMODE}, /* 00,8d,08,cc */
3254	{0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH}, /* 00,03,02,cc */
3255	{0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW}, /* 00,04,80,cc */
3256	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH}, /* 00,05,01,cc */
3257	{0xa0, 0xd0, ZC3XX_R006_FRAMEHEIGHTLOW}, /* 00,06,d0,cc */
3258	{0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,03,cc */
3259	{0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,01,cc */
3260	{0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},	/* 00,98,00,cc */
3261	{0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},	/* 00,9a,00,cc */
3262	{0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},	/* 01,1a,00,cc */
3263	{0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},	/* 01,1c,00,cc */
3264	{0xa0, 0xd6, ZC3XX_R09C_WINHEIGHTLOW},	/* 00,9c,d6,cc */
3265						/* OV7648 00,9c,d8,cc */
3266	{0xa0, 0x88, ZC3XX_R09E_WINWIDTHLOW},	/* 00,9e,88,cc */
3267	{0xaa, 0x12, 0x0088}, /* 00,12,88,aa */
3268	{0xaa, 0x12, 0x0048}, /* 00,12,48,aa */
3269	{0xaa, 0x75, 0x008a}, /* 00,75,8a,aa */
3270	{0xaa, 0x13, 0x00a3}, /* 00,13,a3,aa */
3271	{0xaa, 0x04, 0x0000}, /* 00,04,00,aa */
3272	{0xaa, 0x05, 0x0000}, /* 00,05,00,aa */
3273	{0xaa, 0x14, 0x0000}, /* 00,14,00,aa */
3274	{0xaa, 0x15, 0x0004}, /* 00,15,04,aa */
3275	{0xaa, 0x24, 0x0088}, /* 00,24,88,aa */
3276	{0xaa, 0x25, 0x0078}, /* 00,25,78,aa */
3277	{0xaa, 0x17, 0x0018}, /* 00,17,18,aa */
3278	{0xaa, 0x18, 0x00ba}, /* 00,18,ba,aa */
3279	{0xaa, 0x19, 0x0002}, /* 00,19,02,aa */
3280	{0xaa, 0x1a, 0x00f2}, /* 00,1a,f2,aa */
3281	{0xaa, 0x20, 0x0040}, /* 00,20,40,aa */
3282	{0xaa, 0x27, 0x00f6}, /* 00,27,f6,aa */
3283	{0xaa, 0x28, 0x00a0}, /* 00,28,a0,aa */
3284	{0xaa, 0x21, 0x0000}, /* 00,21,00,aa */
3285	{0xaa, 0x2a, 0x0083}, /* 00,2a,83,aa */
3286	{0xaa, 0x2b, 0x0096}, /* 00,2b,96,aa */
3287	{0xaa, 0x2d, 0x0005}, /* 00,2d,05,aa */
3288	{0xaa, 0x74, 0x0020}, /* 00,74,20,aa */
3289	{0xaa, 0x61, 0x0068}, /* 00,61,68,aa */
3290	{0xaa, 0x64, 0x0088}, /* 00,64,88,aa */
3291	{0xaa, 0x00, 0x0000}, /* 00,00,00,aa */
3292	{0xaa, 0x06, 0x0080}, /* 00,06,80,aa */
3293	{0xaa, 0x01, 0x0090}, /* 00,01,90,aa */
3294	{0xaa, 0x02, 0x0030}, /* 00,02,30,aa */
3295	{0xa0, 0x77, ZC3XX_R101_SENSORCORRECTION}, /* 01,01,77,cc */
3296	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,05,cc */
3297	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE}, /* 01,00,0d,cc */
3298	{0xa0, 0x06, ZC3XX_R189_AWBSTATUS},	/* 01,89,06,cc */
3299	{0xa0, 0x00, 0x01ad},			/* 01,ad,00,cc */
3300	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE}, /* 01,c5,03,cc */
3301	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},	/* 01,cb,13,cc */
3302	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE}, /* 02,50,08,cc */
3303	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},	/* 03,01,08,cc */
3304	{0xa0, 0x68, ZC3XX_R116_RGAIN},		/* 01,16,68,cc */
3305	{0xa0, 0x52, ZC3XX_R118_BGAIN},		/* 01,18,52,cc */
3306	{0xa0, 0x50, ZC3XX_R11D_GLOBALGAIN},	/* 01,1d,50,cc */
3307	{0xa0, 0x02, ZC3XX_R180_AUTOCORRECTENABLE}, /* 01,80,02,cc */
3308	{0xa0, 0x50, ZC3XX_R1A8_DIGITALGAIN},	/* 01,a8,50,cc */
3309	{}
3310};
3311static const struct usb_action ov7620_50HZ[] = {
3312	{0xaa, 0x13, 0x00a3},	/* 00,13,a3,aa */
3313	{0xdd, 0x00, 0x0100},	/* 00,01,00,dd */
3314	{0xaa, 0x2b, 0x0096},	/* 00,2b,96,aa */
3315	{0xaa, 0x75, 0x008a},	/* 00,75,8a,aa */
3316	{0xaa, 0x2d, 0x0005},	/* 00,2d,05,aa */
3317	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},	/* 01,90,00,cc */
3318	{0xa0, 0x04, ZC3XX_R191_EXPOSURELIMITMID},	/* 01,91,04,cc */
3319	{0xa0, 0x18, ZC3XX_R192_EXPOSURELIMITLOW},	/* 01,92,18,cc */
3320	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},	/* 01,95,00,cc */
3321	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},	/* 01,96,00,cc */
3322	{0xa0, 0x83, ZC3XX_R197_ANTIFLICKERLOW},	/* 01,97,83,cc */
3323	{0xaa, 0x10, 0x0082},				/* 00,10,82,aa */
3324	{0xaa, 0x76, 0x0003},				/* 00,76,03,aa */
3325/*	{0xa0, 0x40, ZC3XX_R002_CLOCKSELECT},		 * 00,02,40,cc
3326							 if mode0 (640x480) */
3327	{}
3328};
3329static const struct usb_action ov7620_60HZ[] = {
3330	{0xaa, 0x13, 0x00a3},			/* 00,13,a3,aa */
3331						/* (bug in zs211.inf) */
3332	{0xdd, 0x00, 0x0100},			/* 00,01,00,dd */
3333	{0xaa, 0x2b, 0x0000},			/* 00,2b,00,aa */
3334	{0xaa, 0x75, 0x008a},			/* 00,75,8a,aa */
3335	{0xaa, 0x2d, 0x0005},			/* 00,2d,05,aa */
3336	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */
3337	{0xa0, 0x04, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,04,cc */
3338	{0xa0, 0x18, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,18,cc */
3339	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */
3340	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */
3341	{0xa0, 0x83, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,83,cc */
3342	{0xaa, 0x10, 0x0020},			/* 00,10,20,aa */
3343	{0xaa, 0x76, 0x0003},			/* 00,76,03,aa */
3344/*	{0xa0, 0x40, ZC3XX_R002_CLOCKSELECT},	 * 00,02,40,cc
3345						 * if mode0 (640x480) */
3346/* ?? in gspca v1, it was
3347	{0xa0, 0x00, 0x0039},  * 00,00,00,dd *
3348	{0xa1, 0x01, 0x0037},		*/
3349	{}
3350};
3351static const struct usb_action ov7620_NoFliker[] = {
3352	{0xaa, 0x13, 0x00a3},			/* 00,13,a3,aa */
3353						/* (bug in zs211.inf) */
3354	{0xdd, 0x00, 0x0100},			/* 00,01,00,dd */
3355	{0xaa, 0x2b, 0x0000},			/* 00,2b,00,aa */
3356	{0xaa, 0x75, 0x008e},			/* 00,75,8e,aa */
3357	{0xaa, 0x2d, 0x0001},			/* 00,2d,01,aa */
3358	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */
3359	{0xa0, 0x04, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,04,cc */
3360	{0xa0, 0x18, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,18,cc */
3361	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */
3362	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */
3363	{0xa0, 0x01, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,01,cc */
3364/*	{0xa0, 0x44, ZC3XX_R002_CLOCKSELECT},	 * 00,02,44,cc
3365						 * if mode1 (320x240) */
3366/* ?? was
3367	{0xa0, 0x00, 0x0039},  * 00,00,00,dd *
3368	{0xa1, 0x01, 0x0037},		*/
3369	{}
3370};
3371
3372static const struct usb_action ov7630c_InitialScale[] = {
3373	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},
3374	{0xa0, 0x10, ZC3XX_R002_CLOCKSELECT},
3375	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},
3376	{0xa0, 0x10, ZC3XX_R002_CLOCKSELECT},
3377	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},
3378	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},
3379	{0xa0, 0x06, ZC3XX_R010_CMOSSENSORSELECT},
3380	{0xa0, 0xa1, ZC3XX_R08B_I2CDEVICEADDR},
3381	{0xa0, 0x08, ZC3XX_R08D_COMPABILITYMODE},
3382	{0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},
3383	{0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},
3384	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},
3385	{0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},
3386	{0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},
3387	{0xaa, 0x12, 0x0080},
3388	{0xa0, 0x02, ZC3XX_R083_RGAINADDR},
3389	{0xa0, 0x01, ZC3XX_R085_BGAINADDR},
3390	{0xa0, 0x90, ZC3XX_R086_EXPTIMEHIGH},
3391	{0xa0, 0x91, ZC3XX_R087_EXPTIMEMID},
3392	{0xa0, 0x10, ZC3XX_R088_EXPTIMELOW},
3393	{0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},
3394	{0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},
3395	{0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},
3396	{0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},
3397	{0xa0, 0xd8, ZC3XX_R09C_WINHEIGHTLOW},
3398	{0xa0, 0x88, ZC3XX_R09E_WINWIDTHLOW},
3399	{0xaa, 0x12, 0x0069},
3400	{0xaa, 0x04, 0x0020},
3401	{0xaa, 0x06, 0x0050},
3402	{0xaa, 0x13, 0x0083},
3403	{0xaa, 0x14, 0x0000},
3404	{0xaa, 0x15, 0x0024},
3405	{0xaa, 0x17, 0x0018},
3406	{0xaa, 0x18, 0x00ba},
3407	{0xaa, 0x19, 0x0002},
3408	{0xaa, 0x1a, 0x00f6},
3409	{0xaa, 0x1b, 0x0002},
3410	{0xaa, 0x20, 0x00c2},
3411	{0xaa, 0x24, 0x0060},
3412	{0xaa, 0x25, 0x0040},
3413	{0xaa, 0x26, 0x0030},
3414	{0xaa, 0x27, 0x00ea},
3415	{0xaa, 0x28, 0x00a0},
3416	{0xaa, 0x21, 0x0000},
3417	{0xaa, 0x2a, 0x0081},
3418	{0xaa, 0x2b, 0x0096},
3419	{0xaa, 0x2d, 0x0094},
3420	{0xaa, 0x2f, 0x003d},
3421	{0xaa, 0x30, 0x0024},
3422	{0xaa, 0x60, 0x0000},
3423	{0xaa, 0x61, 0x0040},
3424	{0xaa, 0x68, 0x007c},
3425	{0xaa, 0x6f, 0x0015},
3426	{0xaa, 0x75, 0x0088},
3427	{0xaa, 0x77, 0x00b5},
3428	{0xaa, 0x01, 0x0060},
3429	{0xaa, 0x02, 0x0060},
3430	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},
3431	{0xa0, 0x77, ZC3XX_R101_SENSORCORRECTION},
3432	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},
3433	{0xa0, 0x06, ZC3XX_R189_AWBSTATUS},
3434	{0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},
3435	{0xa0, 0x00, 0x01ad},
3436	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},
3437	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},
3438	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},
3439	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},
3440	{0xa0, 0x60, ZC3XX_R116_RGAIN},
3441	{0xa0, 0x46, ZC3XX_R118_BGAIN},
3442	{0xa0, 0x04, ZC3XX_R113_RGB03},
3443/* 0x10, */
3444	{0xa1, 0x01, 0x0002},
3445	{0xa0, 0x50, ZC3XX_R10A_RGB00},	/* matrix */
3446	{0xa0, 0xf8, ZC3XX_R10B_RGB01},
3447	{0xa0, 0xf8, ZC3XX_R10C_RGB02},
3448	{0xa0, 0xf8, ZC3XX_R10D_RGB10},
3449	{0xa0, 0x50, ZC3XX_R10E_RGB11},
3450	{0xa0, 0xf8, ZC3XX_R10F_RGB12},
3451	{0xa0, 0xf8, ZC3XX_R110_RGB20},
3452	{0xa0, 0xf8, ZC3XX_R111_RGB21},
3453	{0xa0, 0x50, ZC3XX_R112_RGB22},
3454	{0xa1, 0x01, 0x0008},
3455	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},	/* clock ? */
3456	{0xa0, 0x08, ZC3XX_R1C6_SHARPNESS00},	/* sharpness+ */
3457	{0xa1, 0x01, 0x01c8},
3458	{0xa1, 0x01, 0x01c9},
3459	{0xa1, 0x01, 0x01ca},
3460	{0xa0, 0x0f, ZC3XX_R1CB_SHARPNESS05},	/* sharpness- */
3461	{0xa0, 0x01, ZC3XX_R120_GAMMA00},	/* gamma 2 ?*/
3462	{0xa0, 0x0c, ZC3XX_R121_GAMMA01},
3463	{0xa0, 0x1f, ZC3XX_R122_GAMMA02},
3464	{0xa0, 0x3a, ZC3XX_R123_GAMMA03},
3465	{0xa0, 0x53, ZC3XX_R124_GAMMA04},
3466	{0xa0, 0x6d, ZC3XX_R125_GAMMA05},
3467	{0xa0, 0x85, ZC3XX_R126_GAMMA06},
3468	{0xa0, 0x9c, ZC3XX_R127_GAMMA07},
3469	{0xa0, 0xb0, ZC3XX_R128_GAMMA08},
3470	{0xa0, 0xc2, ZC3XX_R129_GAMMA09},
3471	{0xa0, 0xd1, ZC3XX_R12A_GAMMA0A},
3472	{0xa0, 0xde, ZC3XX_R12B_GAMMA0B},
3473	{0xa0, 0xe9, ZC3XX_R12C_GAMMA0C},
3474	{0xa0, 0xf2, ZC3XX_R12D_GAMMA0D},
3475	{0xa0, 0xf9, ZC3XX_R12E_GAMMA0E},
3476	{0xa0, 0xff, ZC3XX_R12F_GAMMA0F},
3477	{0xa0, 0x05, ZC3XX_R130_GAMMA10},
3478	{0xa0, 0x0f, ZC3XX_R131_GAMMA11},
3479	{0xa0, 0x16, ZC3XX_R132_GAMMA12},
3480	{0xa0, 0x1a, ZC3XX_R133_GAMMA13},
3481	{0xa0, 0x19, ZC3XX_R134_GAMMA14},
3482	{0xa0, 0x19, ZC3XX_R135_GAMMA15},
3483	{0xa0, 0x17, ZC3XX_R136_GAMMA16},
3484	{0xa0, 0x15, ZC3XX_R137_GAMMA17},
3485	{0xa0, 0x12, ZC3XX_R138_GAMMA18},
3486	{0xa0, 0x10, ZC3XX_R139_GAMMA19},
3487	{0xa0, 0x0e, ZC3XX_R13A_GAMMA1A},
3488	{0xa0, 0x0b, ZC3XX_R13B_GAMMA1B},
3489	{0xa0, 0x09, ZC3XX_R13C_GAMMA1C},
3490	{0xa0, 0x08, ZC3XX_R13D_GAMMA1D},
3491	{0xa0, 0x06, ZC3XX_R13E_GAMMA1E},
3492	{0xa0, 0x03, ZC3XX_R13F_GAMMA1F},
3493	{0xa0, 0x50, ZC3XX_R10A_RGB00},	/* matrix */
3494	{0xa0, 0xf8, ZC3XX_R10B_RGB01},
3495	{0xa0, 0xf8, ZC3XX_R10C_RGB02},
3496	{0xa0, 0xf8, ZC3XX_R10D_RGB10},
3497	{0xa0, 0x50, ZC3XX_R10E_RGB11},
3498	{0xa0, 0xf8, ZC3XX_R10F_RGB12},
3499	{0xa0, 0xf8, ZC3XX_R110_RGB20},
3500	{0xa0, 0xf8, ZC3XX_R111_RGB21},
3501	{0xa0, 0x50, ZC3XX_R112_RGB22},
3502
3503	{0xa1, 0x01, 0x0180},
3504	{0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},
3505	{0xaa, 0x10, 0x001b},
3506	{0xaa, 0x76, 0x0002},
3507	{0xaa, 0x2a, 0x0081},
3508	{0xaa, 0x2b, 0x0000},
3509	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},
3510	{0xa0, 0x01, ZC3XX_R191_EXPOSURELIMITMID},
3511	{0xa0, 0xb8, ZC3XX_R192_EXPOSURELIMITLOW},
3512	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
3513	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},
3514	{0xa0, 0x37, ZC3XX_R197_ANTIFLICKERLOW},
3515	{0xa0, 0x10, ZC3XX_R18C_AEFREEZE},
3516	{0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},
3517	{0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF},
3518	{0xa0, 0x26, ZC3XX_R1AA_DIGITALGAINSTEP},
3519	{0xa0, 0x50, ZC3XX_R11D_GLOBALGAIN},
3520	{0xa0, 0x02, ZC3XX_R180_AUTOCORRECTENABLE},
3521	{0xa0, 0x40, ZC3XX_R180_AUTOCORRECTENABLE},
3522	{0xaa, 0x13, 0x0083},	/* 40 */
3523	{0xa1, 0x01, 0x0180},
3524	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},
3525	{}
3526};
3527
3528static const struct usb_action ov7630c_Initial[] = {
3529	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},
3530	{0xa0, 0x00, ZC3XX_R002_CLOCKSELECT},
3531	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},
3532	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},
3533	{0xa0, 0x06, ZC3XX_R010_CMOSSENSORSELECT},
3534	{0xa0, 0xa1, ZC3XX_R08B_I2CDEVICEADDR},
3535	{0xa0, 0x08, ZC3XX_R08D_COMPABILITYMODE},
3536	{0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},
3537	{0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},
3538	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},
3539	{0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},
3540	{0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},
3541
3542	{0xaa, 0x12, 0x0080},
3543	{0xa0, 0x02, ZC3XX_R083_RGAINADDR},
3544	{0xa0, 0x01, ZC3XX_R085_BGAINADDR},
3545	{0xa0, 0x90, ZC3XX_R086_EXPTIMEHIGH},
3546	{0xa0, 0x91, ZC3XX_R087_EXPTIMEMID},
3547	{0xa0, 0x10, ZC3XX_R088_EXPTIMELOW},
3548	{0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},
3549	{0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},
3550	{0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},
3551	{0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},
3552	{0xa0, 0xe6, ZC3XX_R09C_WINHEIGHTLOW},
3553	{0xa0, 0x86, ZC3XX_R09E_WINWIDTHLOW},
3554	{0xaa, 0x12, 0x0069},	/* i2c */
3555	{0xaa, 0x04, 0x0020},
3556	{0xaa, 0x06, 0x0050},
3557	{0xaa, 0x13, 0x00c3},
3558	{0xaa, 0x14, 0x0000},
3559	{0xaa, 0x15, 0x0024},
3560	{0xaa, 0x19, 0x0003},
3561	{0xaa, 0x1a, 0x00f6},
3562	{0xaa, 0x1b, 0x0002},
3563	{0xaa, 0x20, 0x00c2},
3564	{0xaa, 0x24, 0x0060},
3565	{0xaa, 0x25, 0x0040},
3566	{0xaa, 0x26, 0x0030},
3567	{0xaa, 0x27, 0x00ea},
3568	{0xaa, 0x28, 0x00a0},
3569	{0xaa, 0x21, 0x0000},
3570	{0xaa, 0x2a, 0x0081},
3571	{0xaa, 0x2b, 0x0096},
3572	{0xaa, 0x2d, 0x0084},
3573	{0xaa, 0x2f, 0x003d},
3574	{0xaa, 0x30, 0x0024},
3575	{0xaa, 0x60, 0x0000},
3576	{0xaa, 0x61, 0x0040},
3577	{0xaa, 0x68, 0x007c},
3578	{0xaa, 0x6f, 0x0015},
3579	{0xaa, 0x75, 0x0088},
3580	{0xaa, 0x77, 0x00b5},
3581	{0xaa, 0x01, 0x0060},
3582	{0xaa, 0x02, 0x0060},
3583	{0xaa, 0x17, 0x0018},
3584	{0xaa, 0x18, 0x00ba},
3585	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},
3586	{0xa0, 0x77, ZC3XX_R101_SENSORCORRECTION},
3587	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},
3588	{0xa0, 0x06, ZC3XX_R189_AWBSTATUS},
3589	{0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},
3590	{0xa0, 0x00, 0x01ad},
3591	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},
3592	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},
3593	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},
3594	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},
3595	{0xa0, 0x60, ZC3XX_R116_RGAIN},
3596	{0xa0, 0x46, ZC3XX_R118_BGAIN},
3597	{0xa0, 0x04, ZC3XX_R113_RGB03},
3598
3599	{0xa1, 0x01, 0x0002},
3600	{0xa0, 0x4e, ZC3XX_R10A_RGB00},	/* matrix */
3601	{0xa0, 0xfe, ZC3XX_R10B_RGB01},
3602	{0xa0, 0xf4, ZC3XX_R10C_RGB02},
3603	{0xa0, 0xf7, ZC3XX_R10D_RGB10},
3604	{0xa0, 0x4d, ZC3XX_R10E_RGB11},
3605	{0xa0, 0xfc, ZC3XX_R10F_RGB12},
3606	{0xa0, 0x00, ZC3XX_R110_RGB20},
3607	{0xa0, 0xf6, ZC3XX_R111_RGB21},
3608	{0xa0, 0x4a, ZC3XX_R112_RGB22},
3609
3610	{0xa1, 0x01, 0x0008},
3611	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},	/* clock ? */
3612	{0xa0, 0x08, ZC3XX_R1C6_SHARPNESS00},	/* sharpness+ */
3613	{0xa1, 0x01, 0x01c8},
3614	{0xa1, 0x01, 0x01c9},
3615	{0xa1, 0x01, 0x01ca},
3616	{0xa0, 0x0f, ZC3XX_R1CB_SHARPNESS05},	/* sharpness- */
3617	{0xa0, 0x16, ZC3XX_R120_GAMMA00},	/* gamma ~4 */
3618	{0xa0, 0x3a, ZC3XX_R121_GAMMA01},
3619	{0xa0, 0x5b, ZC3XX_R122_GAMMA02},
3620	{0xa0, 0x7c, ZC3XX_R123_GAMMA03},
3621	{0xa0, 0x94, ZC3XX_R124_GAMMA04},
3622	{0xa0, 0xa9, ZC3XX_R125_GAMMA05},
3623	{0xa0, 0xbb, ZC3XX_R126_GAMMA06},
3624	{0xa0, 0xca, ZC3XX_R127_GAMMA07},
3625	{0xa0, 0xd7, ZC3XX_R128_GAMMA08},
3626	{0xa0, 0xe1, ZC3XX_R129_GAMMA09},
3627	{0xa0, 0xea, ZC3XX_R12A_GAMMA0A},
3628	{0xa0, 0xf1, ZC3XX_R12B_GAMMA0B},
3629	{0xa0, 0xf7, ZC3XX_R12C_GAMMA0C},
3630	{0xa0, 0xfc, ZC3XX_R12D_GAMMA0D},
3631	{0xa0, 0xff, ZC3XX_R12E_GAMMA0E},
3632	{0xa0, 0xff, ZC3XX_R12F_GAMMA0F},
3633	{0xa0, 0x20, ZC3XX_R130_GAMMA10},
3634	{0xa0, 0x22, ZC3XX_R131_GAMMA11},
3635	{0xa0, 0x20, ZC3XX_R132_GAMMA12},
3636	{0xa0, 0x1c, ZC3XX_R133_GAMMA13},
3637	{0xa0, 0x16, ZC3XX_R134_GAMMA14},
3638	{0xa0, 0x13, ZC3XX_R135_GAMMA15},
3639	{0xa0, 0x10, ZC3XX_R136_GAMMA16},
3640	{0xa0, 0x0d, ZC3XX_R137_GAMMA17},
3641	{0xa0, 0x0b, ZC3XX_R138_GAMMA18},
3642	{0xa0, 0x09, ZC3XX_R139_GAMMA19},
3643	{0xa0, 0x07, ZC3XX_R13A_GAMMA1A},
3644	{0xa0, 0x06, ZC3XX_R13B_GAMMA1B},
3645	{0xa0, 0x05, ZC3XX_R13C_GAMMA1C},
3646	{0xa0, 0x04, ZC3XX_R13D_GAMMA1D},
3647	{0xa0, 0x00, ZC3XX_R13E_GAMMA1E},
3648	{0xa0, 0x01, ZC3XX_R13F_GAMMA1F},
3649	{0xa0, 0x4e, ZC3XX_R10A_RGB00},	/* matrix */
3650	{0xa0, 0xfe, ZC3XX_R10B_RGB01},
3651	{0xa0, 0xf4, ZC3XX_R10C_RGB02},
3652	{0xa0, 0xf7, ZC3XX_R10D_RGB10},
3653	{0xa0, 0x4d, ZC3XX_R10E_RGB11},
3654	{0xa0, 0xfc, ZC3XX_R10F_RGB12},
3655	{0xa0, 0x00, ZC3XX_R110_RGB20},
3656	{0xa0, 0xf6, ZC3XX_R111_RGB21},
3657	{0xa0, 0x4a, ZC3XX_R112_RGB22},
3658
3659	{0xa1, 0x01, 0x0180},
3660	{0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},
3661	{0xaa, 0x10, 0x000d},
3662	{0xaa, 0x76, 0x0002},
3663	{0xaa, 0x2a, 0x0081},
3664	{0xaa, 0x2b, 0x0000},
3665	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},
3666	{0xa0, 0x00, ZC3XX_R191_EXPOSURELIMITMID},
3667	{0xa0, 0xd8, ZC3XX_R192_EXPOSURELIMITLOW},
3668	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
3669	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},
3670	{0xa0, 0x1b, ZC3XX_R197_ANTIFLICKERLOW},
3671	{0xa0, 0x10, ZC3XX_R18C_AEFREEZE},
3672	{0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},
3673	{0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF},
3674	{0xa0, 0x26, ZC3XX_R1AA_DIGITALGAINSTEP},
3675	{0xa0, 0x50, ZC3XX_R11D_GLOBALGAIN},
3676	{0xa0, 0x02, ZC3XX_R180_AUTOCORRECTENABLE},
3677	{0xa0, 0x40, ZC3XX_R180_AUTOCORRECTENABLE},
3678	{0xaa, 0x13, 0x00c3},
3679
3680	{0xa1, 0x01, 0x0180},
3681	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},
3682	{}
3683};
3684
3685static const struct usb_action pas106b_Initial_com[] = {
3686/* Sream and Sensor specific */
3687	{0xa1, 0x01, 0x0010},	/* CMOSSensorSelect */
3688/* System */
3689	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},	/* SystemControl */
3690	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},	/* SystemControl */
3691/* Picture size */
3692	{0xa0, 0x00, ZC3XX_R002_CLOCKSELECT},	/* ClockSelect */
3693	{0xa0, 0x03, 0x003a},
3694	{0xa0, 0x0c, 0x003b},
3695	{0xa0, 0x04, 0x0038},
3696	{}
3697};
3698
3699static const struct usb_action pas106b_InitialScale[] = {	/* 176x144 */
3700/* JPEG control */
3701	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},
3702/* Sream and Sensor specific */
3703	{0xa0, 0x0f, ZC3XX_R010_CMOSSENSORSELECT},
3704/* Picture size */
3705	{0xa0, 0x00, ZC3XX_R003_FRAMEWIDTHHIGH},
3706	{0xa0, 0xb0, ZC3XX_R004_FRAMEWIDTHLOW},
3707	{0xa0, 0x00, ZC3XX_R005_FRAMEHEIGHTHIGH},
3708	{0xa0, 0x90, ZC3XX_R006_FRAMEHEIGHTLOW},
3709/* System */
3710	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},
3711/* Sream and Sensor specific */
3712	{0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC},
3713	{0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},
3714/* Sensor Interface */
3715	{0xa0, 0x08, ZC3XX_R08D_COMPABILITYMODE},
3716/* Window inside sensor array */
3717	{0xa0, 0x03, ZC3XX_R09A_WINXSTARTLOW},
3718	{0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},
3719	{0xa0, 0x03, ZC3XX_R11C_FIRSTXLOW},
3720	{0xa0, 0x28, ZC3XX_R09C_WINHEIGHTLOW},
3721	{0xa0, 0x68, ZC3XX_R09E_WINWIDTHLOW},
3722/* Init the sensor */
3723	{0xaa, 0x02, 0x0004},
3724	{0xaa, 0x08, 0x0000},
3725	{0xaa, 0x09, 0x0005},
3726	{0xaa, 0x0a, 0x0002},
3727	{0xaa, 0x0b, 0x0002},
3728	{0xaa, 0x0c, 0x0005},
3729	{0xaa, 0x0d, 0x0000},
3730	{0xaa, 0x0e, 0x0002},
3731	{0xaa, 0x14, 0x0081},
3732
3733/* Other registers */
3734	{0xa0, 0x37, ZC3XX_R101_SENSORCORRECTION},
3735/* Frame retreiving */
3736	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
3737/* Gains */
3738	{0xa0, 0xa0, ZC3XX_R1A8_DIGITALGAIN},
3739/* Unknown */
3740	{0xa0, 0x00, 0x01ad},
3741/* Sharpness */
3742	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},
3743	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},
3744/* Other registers */
3745	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},
3746/* Auto exposure and white balance */
3747	{0xa0, 0x06, ZC3XX_R189_AWBSTATUS},
3748/*Dead pixels */
3749	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},
3750/* EEPROM */
3751	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},
3752/* JPEG control */
3753	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},
3754	{0xa0, 0x08, ZC3XX_R1C6_SHARPNESS00},
3755	{0xa0, 0x0f, ZC3XX_R1CB_SHARPNESS05},
3756/* Other registers */
3757	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},
3758/* Auto exposure and white balance */
3759	{0xa0, 0x06, ZC3XX_R189_AWBSTATUS},
3760/*Dead pixels */
3761	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},
3762/* EEPROM */
3763	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},
3764/* JPEG control */
3765	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},
3766	{0xa0, 0x08, ZC3XX_R1C6_SHARPNESS00},
3767	{0xa0, 0x0f, ZC3XX_R1CB_SHARPNESS05},
3768
3769	{0xa0, 0x58, ZC3XX_R10A_RGB00},	/* matrix */
3770	{0xa0, 0xf4, ZC3XX_R10B_RGB01},
3771	{0xa0, 0xf4, ZC3XX_R10C_RGB02},
3772	{0xa0, 0xf4, ZC3XX_R10D_RGB10},
3773	{0xa0, 0x58, ZC3XX_R10E_RGB11},
3774	{0xa0, 0xf4, ZC3XX_R10F_RGB12},
3775	{0xa0, 0xf4, ZC3XX_R110_RGB20},
3776	{0xa0, 0xf4, ZC3XX_R111_RGB21},
3777	{0xa0, 0x58, ZC3XX_R112_RGB22},
3778/* Auto correction */
3779	{0xa0, 0x03, ZC3XX_R181_WINXSTART},
3780	{0xa0, 0x08, ZC3XX_R182_WINXWIDTH},
3781	{0xa0, 0x16, ZC3XX_R183_WINXCENTER},
3782	{0xa0, 0x03, ZC3XX_R184_WINYSTART},
3783	{0xa0, 0x05, ZC3XX_R185_WINYWIDTH},
3784	{0xa0, 0x14, ZC3XX_R186_WINYCENTER},
3785	{0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},
3786
3787/* Auto exposure and white balance */
3788	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},
3789	{0xa0, 0x03, ZC3XX_R191_EXPOSURELIMITMID},
3790	{0xa0, 0xb1, ZC3XX_R192_EXPOSURELIMITLOW},
3791	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
3792	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},
3793	{0xa0, 0x87, ZC3XX_R197_ANTIFLICKERLOW},
3794	{0xa0, 0x0c, ZC3XX_R18C_AEFREEZE},
3795	{0xa0, 0x18, ZC3XX_R18F_AEUNFREEZE},
3796/* sensor on */
3797	{0xaa, 0x07, 0x00b1},
3798	{0xaa, 0x05, 0x0003},
3799	{0xaa, 0x04, 0x0001},
3800	{0xaa, 0x03, 0x003b},
3801/* Gains */
3802	{0xa0, 0x20, ZC3XX_R1A9_DIGITALLIMITDIFF},
3803	{0xa0, 0x26, ZC3XX_R1AA_DIGITALGAINSTEP},
3804	{0xa0, 0xa0, ZC3XX_R11D_GLOBALGAIN},
3805	{0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},
3806/* Auto correction */
3807	{0xa0, 0x40, ZC3XX_R180_AUTOCORRECTENABLE},
3808	{0xa1, 0x01, 0x0180},				/* AutoCorrectEnable */
3809	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},
3810/* Gains */
3811	{0xa0, 0x40, ZC3XX_R116_RGAIN},
3812	{0xa0, 0x40, ZC3XX_R117_GGAIN},
3813	{0xa0, 0x40, ZC3XX_R118_BGAIN},
3814	{}
3815};
3816
3817static const struct usb_action pas106b_Initial[] = {	/* 352x288 */
3818/* JPEG control */
3819	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},
3820/* Sream and Sensor specific */
3821	{0xa0, 0x0f, ZC3XX_R010_CMOSSENSORSELECT},
3822/* Picture size */
3823	{0xa0, 0x01, ZC3XX_R003_FRAMEWIDTHHIGH},
3824	{0xa0, 0x60, ZC3XX_R004_FRAMEWIDTHLOW},
3825	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},
3826	{0xa0, 0x20, ZC3XX_R006_FRAMEHEIGHTLOW},
3827/* System */
3828	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},
3829/* Sream and Sensor specific */
3830	{0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC},
3831	{0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},
3832/* Sensor Interface */
3833	{0xa0, 0x08, ZC3XX_R08D_COMPABILITYMODE},
3834/* Window inside sensor array */
3835	{0xa0, 0x03, ZC3XX_R09A_WINXSTARTLOW},
3836	{0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},
3837	{0xa0, 0x03, ZC3XX_R11C_FIRSTXLOW},
3838	{0xa0, 0x28, ZC3XX_R09C_WINHEIGHTLOW},
3839	{0xa0, 0x68, ZC3XX_R09E_WINWIDTHLOW},
3840/* Init the sensor */
3841	{0xaa, 0x02, 0x0004},
3842	{0xaa, 0x08, 0x0000},
3843	{0xaa, 0x09, 0x0005},
3844	{0xaa, 0x0a, 0x0002},
3845	{0xaa, 0x0b, 0x0002},
3846	{0xaa, 0x0c, 0x0005},
3847	{0xaa, 0x0d, 0x0000},
3848	{0xaa, 0x0e, 0x0002},
3849	{0xaa, 0x14, 0x0081},
3850
3851/* Other registers */
3852	{0xa0, 0x37, ZC3XX_R101_SENSORCORRECTION},
3853/* Frame retreiving */
3854	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
3855/* Gains */
3856	{0xa0, 0xa0, ZC3XX_R1A8_DIGITALGAIN},
3857/* Unknown */
3858	{0xa0, 0x00, 0x01ad},
3859/* Sharpness */
3860	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},
3861	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},
3862/* Other registers */
3863	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},
3864/* Auto exposure and white balance */
3865	{0xa0, 0x06, ZC3XX_R189_AWBSTATUS},
3866	{0xa0, 0x80, ZC3XX_R18D_YTARGET},
3867/*Dead pixels */
3868	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},
3869/* EEPROM */
3870	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},
3871/* JPEG control */
3872	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},
3873	{0xa0, 0x08, ZC3XX_R1C6_SHARPNESS00},
3874	{0xa0, 0x0f, ZC3XX_R1CB_SHARPNESS05},
3875/* Other registers */
3876	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},
3877/* Auto exposure and white balance */
3878	{0xa0, 0x06, ZC3XX_R189_AWBSTATUS},
3879/*Dead pixels */
3880	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},
3881/* EEPROM */
3882	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},
3883/* JPEG control */
3884	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},
3885	{0xa0, 0x08, ZC3XX_R1C6_SHARPNESS00},
3886	{0xa0, 0x0f, ZC3XX_R1CB_SHARPNESS05},
3887
3888	{0xa0, 0x58, ZC3XX_R10A_RGB00},	/* matrix */
3889	{0xa0, 0xf4, ZC3XX_R10B_RGB01},
3890	{0xa0, 0xf4, ZC3XX_R10C_RGB02},
3891	{0xa0, 0xf4, ZC3XX_R10D_RGB10},
3892	{0xa0, 0x58, ZC3XX_R10E_RGB11},
3893	{0xa0, 0xf4, ZC3XX_R10F_RGB12},
3894	{0xa0, 0xf4, ZC3XX_R110_RGB20},
3895	{0xa0, 0xf4, ZC3XX_R111_RGB21},
3896	{0xa0, 0x58, ZC3XX_R112_RGB22},
3897/* Auto correction */
3898	{0xa0, 0x03, ZC3XX_R181_WINXSTART},
3899	{0xa0, 0x08, ZC3XX_R182_WINXWIDTH},
3900	{0xa0, 0x16, ZC3XX_R183_WINXCENTER},
3901	{0xa0, 0x03, ZC3XX_R184_WINYSTART},
3902	{0xa0, 0x05, ZC3XX_R185_WINYWIDTH},
3903	{0xa0, 0x14, ZC3XX_R186_WINYCENTER},
3904	{0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},
3905
3906/* Auto exposure and white balance */
3907	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},
3908	{0xa0, 0x03, ZC3XX_R191_EXPOSURELIMITMID},
3909	{0xa0, 0xb1, ZC3XX_R192_EXPOSURELIMITLOW},
3910
3911	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
3912	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},
3913	{0xa0, 0x87, ZC3XX_R197_ANTIFLICKERLOW},
3914
3915	{0xa0, 0x10, ZC3XX_R18C_AEFREEZE},
3916	{0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},
3917/* sensor on */
3918	{0xaa, 0x07, 0x00b1},
3919	{0xaa, 0x05, 0x0003},
3920	{0xaa, 0x04, 0x0001},
3921	{0xaa, 0x03, 0x003b},
3922/* Gains */
3923	{0xa0, 0x20, ZC3XX_R1A9_DIGITALLIMITDIFF},
3924	{0xa0, 0x26, ZC3XX_R1AA_DIGITALGAINSTEP},
3925	{0xa0, 0xa0, ZC3XX_R11D_GLOBALGAIN},
3926	{0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},
3927/* Auto correction */
3928	{0xa0, 0x40, ZC3XX_R180_AUTOCORRECTENABLE},
3929	{0xa1, 0x01, 0x0180},				/* AutoCorrectEnable */
3930	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},
3931/* Gains */
3932	{0xa0, 0x40, ZC3XX_R116_RGAIN},
3933	{0xa0, 0x40, ZC3XX_R117_GGAIN},
3934	{0xa0, 0x40, ZC3XX_R118_BGAIN},
3935
3936	{0xa0, 0x00, 0x0007},			/* AutoCorrectEnable */
3937	{0xa0, 0xff, ZC3XX_R018_FRAMELOST},	/* Frame adjust */
3938	{}
3939};
3940static const struct usb_action pas106b_50HZ[] = {
3941	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */
3942	{0xa0, 0x06, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,06,cc */
3943	{0xa0, 0x54, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,54,cc */
3944	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */
3945	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */
3946	{0xa0, 0x87, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,87,cc */
3947	{0xa0, 0x10, ZC3XX_R18C_AEFREEZE},	/* 01,8c,10,cc */
3948	{0xa0, 0x30, ZC3XX_R18F_AEUNFREEZE},	/* 01,8f,30,cc */
3949	{0xaa, 0x03, 0x0021},			/* 00,03,21,aa */
3950	{0xaa, 0x04, 0x000c},			/* 00,04,0c,aa */
3951	{0xaa, 0x05, 0x0002},			/* 00,05,02,aa */
3952	{0xaa, 0x07, 0x001c},			/* 00,07,1c,aa */
3953	{0xa0, 0x04, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,04,cc */
3954	{}
3955};
3956static const struct usb_action pas106b_60HZ[] = {
3957	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */
3958	{0xa0, 0x06, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,06,cc */
3959	{0xa0, 0x2e, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,2e,cc */
3960	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */
3961	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */
3962	{0xa0, 0x71, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,71,cc */
3963	{0xa0, 0x10, ZC3XX_R18C_AEFREEZE},	/* 01,8c,10,cc */
3964	{0xa0, 0x30, ZC3XX_R18F_AEUNFREEZE},	/* 01,8f,30,cc */
3965	{0xaa, 0x03, 0x001c},			/* 00,03,1c,aa */
3966	{0xaa, 0x04, 0x0004},			/* 00,04,04,aa */
3967	{0xaa, 0x05, 0x0001},			/* 00,05,01,aa */
3968	{0xaa, 0x07, 0x00c4},			/* 00,07,c4,aa */
3969	{0xa0, 0x04, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,04,cc */
3970	{}
3971};
3972static const struct usb_action pas106b_NoFliker[] = {
3973	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */
3974	{0xa0, 0x06, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,06,cc */
3975	{0xa0, 0x50, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,50,cc */
3976	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */
3977	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */
3978	{0xa0, 0x10, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,10,cc */
3979	{0xa0, 0x10, ZC3XX_R18C_AEFREEZE},	/* 01,8c,10,cc */
3980	{0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},	/* 01,8f,20,cc */
3981	{0xaa, 0x03, 0x0013},			/* 00,03,13,aa */
3982	{0xaa, 0x04, 0x0000},			/* 00,04,00,aa */
3983	{0xaa, 0x05, 0x0001},			/* 00,05,01,aa */
3984	{0xaa, 0x07, 0x0030},			/* 00,07,30,aa */
3985	{0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,00,cc */
3986	{}
3987};
3988
3989/* from lvWIMv.inf 046d:08a2/:08aa 2007/06/03 */
3990static const struct usb_action pas202b_Initial[] = {	/* 640x480 */
3991	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},		/* 00,00,01,cc */
3992	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},
3993	{0xa0, 0x0e, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,0e,cc */
3994	{0xa0, 0x00, ZC3XX_R002_CLOCKSELECT},		/* 00,02,00,cc */
3995	{0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},	/* 00,03,02,cc */
3996	{0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},		/* 00,04,80,cc */
3997	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},	/* 00,05,01,cc */
3998	{0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},	/* 00,06,e0,cc */
3999	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},	/* 00,01,01,cc */
4000	{0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC},	/* 00,12,03,cc */
4001	{0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},	/* 00,12,01,cc */
4002	{0xa0, 0x08, ZC3XX_R08D_COMPABILITYMODE},	/* 00,8d,08,cc */
4003	{0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},		/* 00,98,00,cc */
4004	{0xa0, 0x03, ZC3XX_R09A_WINXSTARTLOW},		/* 00,9a,03,cc */
4005	{0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},		/* 01,1a,00,cc */
4006	{0xa0, 0x03, ZC3XX_R11C_FIRSTXLOW},		/* 01,1c,03,cc */
4007	{0xa0, 0x01, ZC3XX_R09B_WINHEIGHTHIGH},		/* 00,9b,01,cc */
4008	{0xa0, 0xe6, ZC3XX_R09C_WINHEIGHTLOW},		/* 00,9c,e6,cc */
4009	{0xa0, 0x02, ZC3XX_R09D_WINWIDTHHIGH},		/* 00,9d,02,cc */
4010	{0xa0, 0x86, ZC3XX_R09E_WINWIDTHLOW},		/* 00,9e,86,cc */
4011	{0xaa, 0x02, 0x0002},			/* 00,02,04,aa --> 02 */
4012	{0xaa, 0x07, 0x0006},				/* 00,07,06,aa */
4013	{0xaa, 0x08, 0x0002},				/* 00,08,02,aa */
4014	{0xaa, 0x09, 0x0006},				/* 00,09,06,aa */
4015	{0xaa, 0x0a, 0x0001},				/* 00,0a,01,aa */
4016	{0xaa, 0x0b, 0x0001},				/* 00,0b,01,aa */
4017	{0xaa, 0x0c, 0x0006},
4018	{0xaa, 0x0d, 0x0000},				/* 00,0d,00,aa */
4019	{0xaa, 0x10, 0x0000},				/* 00,10,00,aa */
4020	{0xaa, 0x12, 0x0005},				/* 00,12,05,aa */
4021	{0xaa, 0x13, 0x0063},				/* 00,13,63,aa */
4022	{0xaa, 0x15, 0x0070},				/* 00,15,70,aa */
4023	{0xa0, 0xb7, ZC3XX_R101_SENSORCORRECTION},	/* 01,01,b7,cc */
4024	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},		/* 01,00,0d,cc */
4025	{0xa0, 0x06, ZC3XX_R189_AWBSTATUS},		/* 01,89,06,cc */
4026	{0xa0, 0x00, 0x01ad},				/* 01,ad,00,cc */
4027	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},		/* 01,c5,03,cc */
4028	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},		/* 01,cb,13,cc */
4029	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},	/* 02,50,08,cc */
4030	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},		/* 03,01,08,cc */
4031	{0xa0, 0x70, ZC3XX_R18D_YTARGET},		/* 01,8d,70,cc */
4032	{}
4033};
4034static const struct usb_action pas202b_InitialScale[] = {	/* 320x240 */
4035	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},		/* 00,00,01,cc */
4036	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},
4037	{0xa0, 0x0e, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,0e,cc */
4038	{0xa0, 0x10, ZC3XX_R002_CLOCKSELECT},		/* 00,02,10,cc */
4039	{0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},	/* 00,03,02,cc */
4040	{0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},		/* 00,04,80,cc */
4041	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},	/* 00,05,01,cc */
4042	{0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},
4043	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},	/* 00,01,01,cc */
4044	{0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC},	/* 00,12,03,cc */
4045	{0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},	/* 00,12,01,cc */
4046	{0xa0, 0x08, ZC3XX_R08D_COMPABILITYMODE},	/* 00,8d,08,cc */
4047	{0xa0, 0x08, ZC3XX_R098_WINYSTARTLOW},		/* 00,98,08,cc */
4048	{0xa0, 0x02, ZC3XX_R09A_WINXSTARTLOW},		/* 00,9a,02,cc */
4049	{0xa0, 0x08, ZC3XX_R11A_FIRSTYLOW},		/* 01,1a,08,cc */
4050	{0xa0, 0x02, ZC3XX_R11C_FIRSTXLOW},		/* 01,1c,02,cc */
4051	{0xa0, 0x01, ZC3XX_R09B_WINHEIGHTHIGH},		/* 00,9b,01,cc */
4052	{0xa0, 0xe8, ZC3XX_R09C_WINHEIGHTLOW},
4053	{0xa0, 0x02, ZC3XX_R09D_WINWIDTHHIGH},		/* 00,9d,02,cc */
4054	{0xa0, 0x88, ZC3XX_R09E_WINWIDTHLOW},		/* 00,9e,88,cc */
4055	{0xaa, 0x02, 0x0002},				/* 00,02,02,aa */
4056	{0xaa, 0x07, 0x0006},				/* 00,07,06,aa */
4057	{0xaa, 0x08, 0x0002},				/* 00,08,02,aa */
4058	{0xaa, 0x09, 0x0006},				/* 00,09,06,aa */
4059	{0xaa, 0x0a, 0x0001},				/* 00,0a,01,aa */
4060	{0xaa, 0x0b, 0x0001},				/* 00,0b,01,aa */
4061	{0xaa, 0x0c, 0x0006},
4062	{0xaa, 0x0d, 0x0000},				/* 00,0d,00,aa */
4063	{0xaa, 0x10, 0x0000},				/* 00,10,00,aa */
4064	{0xaa, 0x12, 0x0005},				/* 00,12,05,aa */
4065	{0xaa, 0x13, 0x0063},				/* 00,13,63,aa */
4066	{0xaa, 0x15, 0x0070},				/* 00,15,70,aa */
4067	{0xa0, 0x37, ZC3XX_R101_SENSORCORRECTION},	/* 01,01,37,cc */
4068	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},		/* 01,00,0d,cc */
4069	{0xa0, 0x06, ZC3XX_R189_AWBSTATUS},		/* 01,89,06,cc */
4070	{0xa0, 0x00, 0x01ad},				/* 01,ad,00,cc */
4071	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},		/* 01,c5,03,cc */
4072	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},		/* 01,cb,13,cc */
4073	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},	/* 02,50,08,cc */
4074	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},		/* 03,01,08,cc */
4075	{0xa0, 0x70, ZC3XX_R18D_YTARGET},		/* 01,8d,70,cc */
4076	{0xa0, 0xff, ZC3XX_R097_WINYSTARTHIGH},
4077	{0xa0, 0xfe, ZC3XX_R098_WINYSTARTLOW},
4078	{}
4079};
4080static const struct usb_action pas202b_50HZ[] = {
4081	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},		/* 00,19,00,cc */
4082	{0xa0, 0x20, ZC3XX_R087_EXPTIMEMID},		/* 00,87,20,cc */
4083	{0xa0, 0x21, ZC3XX_R088_EXPTIMELOW},		/* 00,88,21,cc */
4084	{0xaa, 0x20, 0x0002},				/* 00,20,02,aa */
4085	{0xaa, 0x21, 0x001b},
4086	{0xaa, 0x03, 0x0044},				/* 00,03,44,aa */
4087	{0xaa, 0x04, 0x0008},
4088	{0xaa, 0x05, 0x001b},
4089	{0xaa, 0x0e, 0x0001},				/* 00,0e,01,aa */
4090	{0xaa, 0x0f, 0x0000},				/* 00,0f,00,aa */
4091	{0xa0, 0x1c, ZC3XX_R1A9_DIGITALLIMITDIFF},
4092	{0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},	/* 01,aa,24,cc */
4093	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},	/* 01,90,00,cc */
4094	{0xa0, 0x02, ZC3XX_R191_EXPOSURELIMITMID},
4095	{0xa0, 0x1b, ZC3XX_R192_EXPOSURELIMITLOW},
4096	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},	/* 01,95,00,cc */
4097	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},	/* 01,96,00,cc */
4098	{0xa0, 0x4d, ZC3XX_R197_ANTIFLICKERLOW},	/* 01,97,4d,cc */
4099	{0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},
4100	{0xa0, 0x1b, ZC3XX_R18F_AEUNFREEZE},
4101	{0xa0, 0x44, ZC3XX_R01D_HSYNC_0},		/* 00,1d,44,cc */
4102	{0xa0, 0x6f, ZC3XX_R01E_HSYNC_1},		/* 00,1e,6f,cc */
4103	{0xa0, 0xad, ZC3XX_R01F_HSYNC_2},		/* 00,1f,ad,cc */
4104	{0xa0, 0xeb, ZC3XX_R020_HSYNC_3},		/* 00,20,eb,cc */
4105	{0xa0, 0x0f, ZC3XX_R087_EXPTIMEMID},		/* 00,87,0f,cc */
4106	{0xa0, 0x0e, ZC3XX_R088_EXPTIMELOW},		/* 00,88,0e,cc */
4107	{}
4108};
4109static const struct usb_action pas202b_50HZScale[] = {
4110	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},		/* 00,19,00,cc */
4111	{0xa0, 0x20, ZC3XX_R087_EXPTIMEMID},		/* 00,87,20,cc */
4112	{0xa0, 0x21, ZC3XX_R088_EXPTIMELOW},		/* 00,88,21,cc */
4113	{0xaa, 0x20, 0x0004},
4114	{0xaa, 0x21, 0x003d},
4115	{0xaa, 0x03, 0x0041},				/* 00,03,41,aa */
4116	{0xaa, 0x04, 0x0010},
4117	{0xaa, 0x05, 0x003d},
4118	{0xaa, 0x0e, 0x0001},				/* 00,0e,01,aa */
4119	{0xaa, 0x0f, 0x0000},				/* 00,0f,00,aa */
4120	{0xa0, 0x1c, ZC3XX_R1A9_DIGITALLIMITDIFF},
4121	{0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},	/* 01,aa,24,cc */
4122	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},	/* 01,90,00,cc */
4123	{0xa0, 0x04, ZC3XX_R191_EXPOSURELIMITMID},
4124	{0xa0, 0x3d, ZC3XX_R192_EXPOSURELIMITLOW},
4125	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},	/* 01,95,00,cc */
4126	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},	/* 01,96,00,cc */
4127	{0xa0, 0x9b, ZC3XX_R197_ANTIFLICKERLOW},	/* 01,97,9b,cc */
4128	{0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},
4129	{0xa0, 0x1b, ZC3XX_R18F_AEUNFREEZE},
4130	{0xa0, 0x41, ZC3XX_R01D_HSYNC_0},		/* 00,1d,41,cc */
4131	{0xa0, 0x6f, ZC3XX_R01E_HSYNC_1},		/* 00,1e,6f,cc */
4132	{0xa0, 0xad, ZC3XX_R01F_HSYNC_2},		/* 00,1f,ad,cc */
4133	{0xa0, 0xff, ZC3XX_R020_HSYNC_3},		/* 00,20,ff,cc */
4134	{0xa0, 0x0f, ZC3XX_R087_EXPTIMEMID},		/* 00,87,0f,cc */
4135	{0xa0, 0x0e, ZC3XX_R088_EXPTIMELOW},		/* 00,88,0e,cc */
4136	{}
4137};
4138static const struct usb_action pas202b_60HZ[] = {
4139	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},		/* 00,19,00,cc */
4140	{0xa0, 0x20, ZC3XX_R087_EXPTIMEMID},		/* 00,87,20,cc */
4141	{0xa0, 0x21, ZC3XX_R088_EXPTIMELOW},		/* 00,88,21,cc */
4142	{0xaa, 0x20, 0x0002},				/* 00,20,02,aa */
4143	{0xaa, 0x21, 0x0000},				/* 00,21,00,aa */
4144	{0xaa, 0x03, 0x0045},				/* 00,03,45,aa */
4145	{0xaa, 0x04, 0x0008},				/* 00,04,08,aa */
4146	{0xaa, 0x05, 0x0000},				/* 00,05,00,aa */
4147	{0xaa, 0x0e, 0x0001},				/* 00,0e,01,aa */
4148	{0xaa, 0x0f, 0x0000},				/* 00,0f,00,aa */
4149	{0xa0, 0x1c, ZC3XX_R1A9_DIGITALLIMITDIFF},
4150	{0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},	/* 01,aa,24,cc */
4151	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},	/* 01,90,00,cc */
4152	{0xa0, 0x02, ZC3XX_R191_EXPOSURELIMITMID},
4153	{0xa0, 0x00, ZC3XX_R192_EXPOSURELIMITLOW},
4154	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},	/* 01,95,00,cc */
4155	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},	/* 01,96,00,cc */
4156	{0xa0, 0x40, ZC3XX_R197_ANTIFLICKERLOW},	/* 01,97,40,cc */
4157	{0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},
4158	{0xa0, 0x1b, ZC3XX_R18F_AEUNFREEZE},
4159	{0xa0, 0x45, ZC3XX_R01D_HSYNC_0},		/* 00,1d,45,cc */
4160	{0xa0, 0x8e, ZC3XX_R01E_HSYNC_1},		/* 00,1e,8e,cc */
4161	{0xa0, 0xc1, ZC3XX_R01F_HSYNC_2},		/* 00,1f,c1,cc */
4162	{0xa0, 0xf5, ZC3XX_R020_HSYNC_3},		/* 00,20,f5,cc */
4163	{0xa0, 0x0f, ZC3XX_R087_EXPTIMEMID},		/* 00,87,0f,cc */
4164	{0xa0, 0x0e, ZC3XX_R088_EXPTIMELOW},		/* 00,88,0e,cc */
4165	{}
4166};
4167static const struct usb_action pas202b_60HZScale[] = {
4168	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},		/* 00,19,00,cc */
4169	{0xa0, 0x20, ZC3XX_R087_EXPTIMEMID},		/* 00,87,20,cc */
4170	{0xa0, 0x21, ZC3XX_R088_EXPTIMELOW},		/* 00,88,21,cc */
4171	{0xaa, 0x20, 0x0004},
4172	{0xaa, 0x21, 0x0008},
4173	{0xaa, 0x03, 0x0042},				/* 00,03,42,aa */
4174	{0xaa, 0x04, 0x0010},
4175	{0xaa, 0x05, 0x0008},
4176	{0xaa, 0x0e, 0x0001},				/* 00,0e,01,aa */
4177	{0xaa, 0x0f, 0x0000},				/* 00,0f,00,aa */
4178	{0xa0, 0x1c, ZC3XX_R1A9_DIGITALLIMITDIFF},
4179	{0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},	/* 01,aa,24,cc */
4180	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},	/* 01,90,00,cc */
4181	{0xa0, 0x04, ZC3XX_R191_EXPOSURELIMITMID},
4182	{0xa0, 0x08, ZC3XX_R192_EXPOSURELIMITLOW},
4183	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},	/* 01,95,00,cc */
4184	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},	/* 01,96,00,cc */
4185	{0xa0, 0x81, ZC3XX_R197_ANTIFLICKERLOW},	/* 01,97,81,cc */
4186	{0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},
4187	{0xa0, 0x1b, ZC3XX_R18F_AEUNFREEZE},
4188	{0xa0, 0x42, ZC3XX_R01D_HSYNC_0},		/* 00,1d,42,cc */
4189	{0xa0, 0x6f, ZC3XX_R01E_HSYNC_1},		/* 00,1e,6f,cc */
4190	{0xa0, 0xaf, ZC3XX_R01F_HSYNC_2},		/* 00,1f,af,cc */
4191	{0xa0, 0xff, ZC3XX_R020_HSYNC_3},		/* 00,20,ff,cc */
4192	{0xa0, 0x0f, ZC3XX_R087_EXPTIMEMID},		/* 00,87,0f,cc */
4193	{0xa0, 0x0e, ZC3XX_R088_EXPTIMELOW},		/* 00,88,0e,cc */
4194	{}
4195};
4196static const struct usb_action pas202b_NoFliker[] = {
4197	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},		/* 00,19,00,cc */
4198	{0xa0, 0x20, ZC3XX_R087_EXPTIMEMID},		/* 00,87,20,cc */
4199	{0xa0, 0x21, ZC3XX_R088_EXPTIMELOW},		/* 00,88,21,cc */
4200	{0xaa, 0x20, 0x0002},				/* 00,20,02,aa */
4201	{0xaa, 0x21, 0x0006},
4202	{0xaa, 0x03, 0x0040},				/* 00,03,40,aa */
4203	{0xaa, 0x04, 0x0008},				/* 00,04,08,aa */
4204	{0xaa, 0x05, 0x0006},
4205	{0xaa, 0x0e, 0x0001},				/* 00,0e,01,aa */
4206	{0xaa, 0x0f, 0x0000},				/* 00,0f,00,aa */
4207	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},	/* 01,90,00,cc */
4208	{0xa0, 0x02, ZC3XX_R191_EXPOSURELIMITMID},
4209	{0xa0, 0x06, ZC3XX_R192_EXPOSURELIMITLOW},
4210	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},	/* 01,95,00,cc */
4211	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},	/* 01,96,00,cc */
4212	{0xa0, 0x01, ZC3XX_R197_ANTIFLICKERLOW},
4213	{0xa0, 0x10, ZC3XX_R18C_AEFREEZE},		/* 01,8c,10,cc */
4214	{0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},		/* 01,8f,20,cc */
4215	{0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF},	/* 01,a9,00,cc */
4216	{0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},
4217	{0xa0, 0x40, ZC3XX_R01D_HSYNC_0},		/* 00,1d,40,cc */
4218	{0xa0, 0x60, ZC3XX_R01E_HSYNC_1},		/* 00,1e,60,cc */
4219	{0xa0, 0x90, ZC3XX_R01F_HSYNC_2},		/* 00,1f,90,cc */
4220	{0xa0, 0xff, ZC3XX_R020_HSYNC_3},		/* 00,20,ff,cc */
4221	{0xa0, 0x0f, ZC3XX_R087_EXPTIMEMID},		/* 00,87,0f,cc */
4222	{0xa0, 0x0e, ZC3XX_R088_EXPTIMELOW},		/* 00,88,0e,cc */
4223	{}
4224};
4225static const struct usb_action pas202b_NoFlikerScale[] = {
4226	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},		/* 00,19,00,cc */
4227	{0xa0, 0x20, ZC3XX_R087_EXPTIMEMID},		/* 00,87,20,cc */
4228	{0xa0, 0x21, ZC3XX_R088_EXPTIMELOW},		/* 00,88,21,cc */
4229	{0xaa, 0x20, 0x0004},
4230	{0xaa, 0x21, 0x000c},
4231	{0xaa, 0x03, 0x0040},				/* 00,03,40,aa */
4232	{0xaa, 0x04, 0x0010},
4233	{0xaa, 0x05, 0x000c},
4234	{0xaa, 0x0e, 0x0001},				/* 00,0e,01,aa */
4235	{0xaa, 0x0f, 0x0000},				/* 00,0f,00,aa */
4236	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},	/* 01,90,00,cc */
4237	{0xa0, 0x04, ZC3XX_R191_EXPOSURELIMITMID},
4238	{0xa0, 0x0c, ZC3XX_R192_EXPOSURELIMITLOW},
4239	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},	/* 01,95,00,cc */
4240	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},	/* 01,96,00,cc */
4241	{0xa0, 0x02, ZC3XX_R197_ANTIFLICKERLOW},	/* 01,97,02,cc */
4242	{0xa0, 0x10, ZC3XX_R18C_AEFREEZE},		/* 01,8c,10,cc */
4243	{0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},		/* 01,8f,20,cc */
4244	{0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF},	/* 01,a9,00,cc */
4245	{0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},
4246	{0xa0, 0x40, ZC3XX_R01D_HSYNC_0},		/* 00,1d,40,cc */
4247	{0xa0, 0x60, ZC3XX_R01E_HSYNC_1},		/* 00,1e,60,cc */
4248	{0xa0, 0x90, ZC3XX_R01F_HSYNC_2},		/* 00,1f,90,cc */
4249	{0xa0, 0xff, ZC3XX_R020_HSYNC_3},		/* 00,20,ff,cc */
4250	{0xa0, 0x0f, ZC3XX_R087_EXPTIMEMID},		/* 00,87,0f,cc */
4251	{0xa0, 0x0e, ZC3XX_R088_EXPTIMELOW},		/* 00,88,0e,cc */
4252	{}
4253};
4254
4255/* mt9v111 (mi0360soc) and pb0330 from vm30x.inf 0ac8:301b 07/02/13 */
4256static const struct usb_action mt9v111_1_Initial[] = {	/* 640x480 */
4257	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},
4258	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},
4259	{0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT},
4260	{0xa0, 0x00, ZC3XX_R002_CLOCKSELECT},
4261	{0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},
4262	{0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},
4263	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},
4264	{0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},
4265	{0xa0, 0xdc, ZC3XX_R08B_I2CDEVICEADDR},
4266	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},
4267	{0xa0, 0x07, ZC3XX_R012_VIDEOCONTROLFUNC},
4268	{0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},
4269	{0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},
4270	{0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},
4271	{0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},
4272	{0xa0, 0xdc, ZC3XX_R08B_I2CDEVICEADDR},
4273	{0xdd, 0x00, 0x0200},
4274	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},
4275	{0xaa, 0x01, 0x0001},
4276	{0xaa, 0x06, 0x0000},
4277	{0xaa, 0x08, 0x0483},
4278	{0xaa, 0x01, 0x0004},
4279	{0xaa, 0x08, 0x0006},
4280	{0xaa, 0x02, 0x0011},
4281	{0xaa, 0x03, 0x01e5},			/*jfm: was 01e7*/
4282	{0xaa, 0x04, 0x0285},			/*jfm: was 0287*/
4283	{0xaa, 0x07, 0x3002},
4284	{0xaa, 0x20, 0x5100},
4285	{0xaa, 0x35, 0x507f},
4286	{0xaa, 0x30, 0x0005},
4287	{0xaa, 0x31, 0x0000},
4288	{0xaa, 0x58, 0x0078},
4289	{0xaa, 0x62, 0x0411},
4290	{0xaa, 0x2b, 0x007f},
4291	{0xaa, 0x2c, 0x007f},			/*jfm: was 0030*/
4292	{0xaa, 0x2d, 0x007f},			/*jfm: was 0030*/
4293	{0xaa, 0x2e, 0x007f},			/*jfm: was 0030*/
4294	{0xa0, 0x10, ZC3XX_R087_EXPTIMEMID},
4295	{0xa0, 0xb7, ZC3XX_R101_SENSORCORRECTION},
4296	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},
4297	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},
4298	{0xa0, 0x06, ZC3XX_R189_AWBSTATUS},
4299	{0xa0, 0x09, 0x01ad},			/*jfm: was 00*/
4300	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},
4301	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},
4302	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},
4303	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},
4304	{0xa0, 0x60, ZC3XX_R1A8_DIGITALGAIN},
4305	{0xa0, 0x6c, ZC3XX_R18D_YTARGET},
4306	{0xa0, 0x61, ZC3XX_R116_RGAIN},
4307	{0xa0, 0x65, ZC3XX_R118_BGAIN},
4308	{}
4309};
4310static const struct usb_action mt9v111_1_InitialScale[] = {	/* 320x240 */
4311	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},
4312	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},
4313	{0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT},
4314	{0xa0, 0x10, ZC3XX_R002_CLOCKSELECT},
4315	{0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},
4316	{0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},
4317	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},
4318	{0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},
4319	{0xa0, 0xdc, ZC3XX_R08B_I2CDEVICEADDR},
4320	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},
4321	{0xa0, 0x07, ZC3XX_R012_VIDEOCONTROLFUNC},
4322	{0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},
4323	{0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},
4324	{0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},
4325	{0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},
4326	{0xa0, 0xdc, ZC3XX_R08B_I2CDEVICEADDR},
4327	{0xdd, 0x00, 0x0200},
4328	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},
4329	{0xaa, 0x01, 0x0001},
4330	{0xaa, 0x06, 0x0000},
4331	{0xaa, 0x08, 0x0483},
4332	{0xaa, 0x01, 0x0004},
4333	{0xaa, 0x08, 0x0006},
4334	{0xaa, 0x02, 0x0011},
4335	{0xaa, 0x03, 0x01e7},
4336	{0xaa, 0x04, 0x0287},
4337	{0xaa, 0x07, 0x3002},
4338	{0xaa, 0x20, 0x5100},
4339	{0xaa, 0x35, 0x007f},			/*jfm: was 0050*/
4340	{0xaa, 0x30, 0x0005},
4341	{0xaa, 0x31, 0x0000},
4342	{0xaa, 0x58, 0x0078},
4343	{0xaa, 0x62, 0x0411},
4344	{0xaa, 0x2b, 0x007f},			/*jfm: was 28*/
4345	{0xaa, 0x2c, 0x007f},			/*jfm: was 30*/
4346	{0xaa, 0x2d, 0x007f},			/*jfm: was 30*/
4347	{0xaa, 0x2e, 0x007f},			/*jfm: was 28*/
4348	{0xa0, 0x10, ZC3XX_R087_EXPTIMEMID},
4349	{0xa0, 0xb7, ZC3XX_R101_SENSORCORRECTION},
4350	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},
4351	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},
4352	{0xa0, 0x06, ZC3XX_R189_AWBSTATUS},
4353	{0xa0, 0x09, 0x01ad},			/*jfm: was 00*/
4354	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},
4355	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},
4356	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},
4357	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},
4358	{0xa0, 0x60, ZC3XX_R1A8_DIGITALGAIN},
4359	{0xa0, 0x6c, ZC3XX_R18D_YTARGET},
4360	{0xa0, 0x61, ZC3XX_R116_RGAIN},
4361	{0xa0, 0x65, ZC3XX_R118_BGAIN},
4362	{}
4363};
4364static const struct usb_action mt9v111_1_AE50HZ[] = {
4365	{0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},
4366	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
4367	{0xbb, 0x00, 0x0562},
4368	{0xbb, 0x01, 0x09aa},
4369	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},
4370	{0xa0, 0x03, ZC3XX_R191_EXPOSURELIMITMID},
4371	{0xa0, 0x9b, ZC3XX_R192_EXPOSURELIMITLOW},
4372	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
4373	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},
4374	{0xa0, 0x47, ZC3XX_R197_ANTIFLICKERLOW},
4375	{0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},
4376	{0xa0, 0x1c, ZC3XX_R18F_AEUNFREEZE},
4377	{0xa0, 0x14, ZC3XX_R1A9_DIGITALLIMITDIFF},
4378	{0xa0, 0x66, ZC3XX_R1AA_DIGITALGAINSTEP},
4379	{0xa0, 0x62, ZC3XX_R01D_HSYNC_0},
4380	{0xa0, 0x90, ZC3XX_R01E_HSYNC_1},
4381	{0xa0, 0xc8, ZC3XX_R01F_HSYNC_2},
4382	{0xa0, 0xff, ZC3XX_R020_HSYNC_3},
4383	{0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},
4384	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},
4385	{}
4386};
4387static const struct usb_action mt9v111_1_AE50HZScale[] = {
4388	{0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},
4389	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
4390	{0xbb, 0x00, 0x0509},
4391	{0xbb, 0x01, 0x0934},
4392	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},
4393	{0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},
4394	{0xa0, 0xd2, ZC3XX_R192_EXPOSURELIMITLOW},
4395	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
4396	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},
4397	{0xa0, 0x9a, ZC3XX_R197_ANTIFLICKERLOW},
4398	{0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},
4399	{0xa0, 0x1c, ZC3XX_R18F_AEUNFREEZE},
4400	{0xa0, 0x14, ZC3XX_R1A9_DIGITALLIMITDIFF},
4401	{0xa0, 0x66, ZC3XX_R1AA_DIGITALGAINSTEP},
4402	{0xa0, 0xd7, ZC3XX_R01D_HSYNC_0},
4403	{0xa0, 0xf4, ZC3XX_R01E_HSYNC_1},
4404	{0xa0, 0xf9, ZC3XX_R01F_HSYNC_2},
4405	{0xa0, 0xff, ZC3XX_R020_HSYNC_3},
4406	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},
4407	{}
4408};
4409static const struct usb_action mt9v111_1_AE60HZ[] = {
4410	{0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},
4411	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
4412	{0xaa, 0x05, 0x003d},
4413	{0xaa, 0x09, 0x016e},
4414	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},
4415	{0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},
4416	{0xa0, 0xdd, ZC3XX_R192_EXPOSURELIMITLOW},
4417	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
4418	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},
4419	{0xa0, 0x3d, ZC3XX_R197_ANTIFLICKERLOW},
4420	{0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},
4421	{0xa0, 0x1c, ZC3XX_R18F_AEUNFREEZE},
4422	{0xa0, 0x14, ZC3XX_R1A9_DIGITALLIMITDIFF},
4423	{0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},
4424	{0xa0, 0x62, ZC3XX_R01D_HSYNC_0},
4425	{0xa0, 0x90, ZC3XX_R01E_HSYNC_1},
4426	{0xa0, 0xc8, ZC3XX_R01F_HSYNC_2},
4427	{0xa0, 0xff, ZC3XX_R020_HSYNC_3},
4428	{0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},
4429	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},
4430	{}
4431};
4432static const struct usb_action mt9v111_1_AE60HZScale[] = {
4433	{0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},
4434	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
4435	{0xbb, 0x00, 0x0509},
4436	{0xbb, 0x01, 0x0983},
4437	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},
4438	{0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},
4439	{0xa0, 0x8f, ZC3XX_R192_EXPOSURELIMITLOW},
4440	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
4441	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},
4442	{0xa0, 0x81, ZC3XX_R197_ANTIFLICKERLOW},
4443	{0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},
4444	{0xa0, 0x1c, ZC3XX_R18F_AEUNFREEZE},
4445	{0xa0, 0x14, ZC3XX_R1A9_DIGITALLIMITDIFF},
4446	{0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},
4447	{0xa0, 0xd7, ZC3XX_R01D_HSYNC_0},
4448	{0xa0, 0xf4, ZC3XX_R01E_HSYNC_1},
4449	{0xa0, 0xf9, ZC3XX_R01F_HSYNC_2},
4450	{0xa0, 0xff, ZC3XX_R020_HSYNC_3},
4451	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},
4452	{}
4453};
4454static const struct usb_action mt9v111_1_AENoFliker[] = {
4455	{0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},
4456	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
4457	{0xbb, 0x00, 0x0509},
4458	{0xbb, 0x01, 0x0960},
4459	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},
4460	{0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},
4461	{0xa0, 0xf0, ZC3XX_R192_EXPOSURELIMITLOW},
4462	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
4463	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},
4464	{0xa0, 0x04, ZC3XX_R197_ANTIFLICKERLOW},
4465	{0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},
4466	{0xa0, 0x1c, ZC3XX_R18F_AEUNFREEZE},
4467	{0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF},
4468	{0xa0, 0x00, ZC3XX_R1AA_DIGITALGAINSTEP},
4469	{0xa0, 0x09, ZC3XX_R01D_HSYNC_0},
4470	{0xa0, 0x40, ZC3XX_R01E_HSYNC_1},
4471	{0xa0, 0x90, ZC3XX_R01F_HSYNC_2},
4472	{0xa0, 0xe0, ZC3XX_R020_HSYNC_3},
4473	{0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},
4474	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},
4475	{}
4476};
4477static const struct usb_action mt9v111_1_AENoFlikerScale[] = {
4478	{0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},
4479	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
4480	{0xbb, 0x00, 0x0534},
4481	{0xbb, 0x02, 0x0960},
4482	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},
4483	{0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},
4484	{0xa0, 0xf0, ZC3XX_R192_EXPOSURELIMITLOW},
4485	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
4486	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},
4487	{0xa0, 0x04, ZC3XX_R197_ANTIFLICKERLOW},
4488	{0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},
4489	{0xa0, 0x1c, ZC3XX_R18F_AEUNFREEZE},
4490	{0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF},
4491	{0xa0, 0x00, ZC3XX_R1AA_DIGITALGAINSTEP},
4492	{0xa0, 0x34, ZC3XX_R01D_HSYNC_0},
4493	{0xa0, 0x60, ZC3XX_R01E_HSYNC_1},
4494	{0xa0, 0x90, ZC3XX_R01F_HSYNC_2},
4495	{0xa0, 0xe0, ZC3XX_R020_HSYNC_3},
4496	{0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},
4497	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},
4498	{}
4499};
4500/* from usbvm303.inf 0ac8:303b 07/03/25 (3 - tas5130c) */
4501static const struct usb_action mt9v111_3_Initial[] = {
4502	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},
4503	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},
4504	{0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT},
4505	{0xa0, 0x04, ZC3XX_R002_CLOCKSELECT},
4506	{0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},
4507	{0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},
4508	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},
4509	{0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},
4510	{0xa0, 0xdc, ZC3XX_R08B_I2CDEVICEADDR},
4511	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},
4512	{0xa0, 0x07, ZC3XX_R012_VIDEOCONTROLFUNC},
4513	{0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},
4514	{0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},
4515	{0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},
4516	{0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},
4517	{0xa0, 0xdc, ZC3XX_R08B_I2CDEVICEADDR},
4518	{0xdd, 0x00, 0x0200},
4519	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},
4520	{0xaa, 0x01, 0x0001},		/* select IFP/SOC registers */
4521	{0xaa, 0x06, 0x0000},		/* operating mode control */
4522	{0xaa, 0x08, 0x0483},		/* output format control */
4523					/* H red first, V red or blue first,
4524					 * raw Bayer, auto flicker */
4525	{0xaa, 0x01, 0x0004},		/* select sensor core registers */
4526	{0xaa, 0x08, 0x0006},		/* row start */
4527	{0xaa, 0x02, 0x0011},		/* column start */
4528	{0xaa, 0x03, 0x01e5},		/* window height - 1 */
4529	{0xaa, 0x04, 0x0285},		/* window width - 1 */
4530	{0xaa, 0x07, 0x3002},		/* output control */
4531	{0xaa, 0x20, 0x1100},		/* read mode: bits 8 & 12 (?) */
4532	{0xaa, 0x35, 0x007f},		/* global gain */
4533	{0xaa, 0x30, 0x0005},
4534	{0xaa, 0x31, 0x0000},
4535	{0xaa, 0x58, 0x0078},
4536	{0xaa, 0x62, 0x0411},
4537	{0xaa, 0x2b, 0x007f},		/* green1 gain */
4538	{0xaa, 0x2c, 0x007f},		/* blue gain */
4539	{0xaa, 0x2d, 0x007f},		/* red gain */
4540	{0xaa, 0x2e, 0x007f},		/* green2 gain */
4541	{0xa0, 0x10, ZC3XX_R087_EXPTIMEMID},
4542	{0xa0, 0x37, ZC3XX_R101_SENSORCORRECTION},
4543	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},
4544	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},
4545	{0xa0, 0x06, ZC3XX_R189_AWBSTATUS},
4546	{0xa0, 0x00, 0x01ad},
4547	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},
4548	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},
4549	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},
4550	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},
4551	{0xa0, 0x60, ZC3XX_R1A8_DIGITALGAIN},
4552	{0xa0, 0x80, ZC3XX_R18D_YTARGET},
4553	{0xa0, 0x61, ZC3XX_R116_RGAIN},
4554	{0xa0, 0x65, ZC3XX_R118_BGAIN},
4555	{}
4556};
4557static const struct usb_action mt9v111_3_InitialScale[] = {
4558	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},
4559	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},
4560	{0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT},
4561	{0xa0, 0x10, ZC3XX_R002_CLOCKSELECT},
4562	{0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},
4563	{0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},
4564	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},
4565	{0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},
4566	{0xa0, 0xdc, ZC3XX_R08B_I2CDEVICEADDR},
4567	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},
4568	{0xa0, 0x07, ZC3XX_R012_VIDEOCONTROLFUNC},
4569	{0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},
4570	{0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},
4571	{0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},
4572	{0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},
4573	{0xa0, 0xdc, ZC3XX_R08B_I2CDEVICEADDR},
4574	{0xdd, 0x00, 0x0200},
4575	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},
4576	{0xaa, 0x01, 0x0001},
4577	{0xaa, 0x06, 0x0000},
4578	{0xaa, 0x08, 0x0483},
4579	{0xaa, 0x01, 0x0004},
4580	{0xaa, 0x08, 0x0006},
4581	{0xaa, 0x02, 0x0011},
4582	{0xaa, 0x03, 0x01e7},
4583	{0xaa, 0x04, 0x0287},
4584	{0xaa, 0x07, 0x3002},
4585	{0xaa, 0x20, 0x1100},
4586	{0xaa, 0x35, 0x007f},
4587	{0xaa, 0x30, 0x0005},
4588	{0xaa, 0x31, 0x0000},
4589	{0xaa, 0x58, 0x0078},
4590	{0xaa, 0x62, 0x0411},
4591	{0xaa, 0x2b, 0x007f},
4592	{0xaa, 0x2c, 0x007f},
4593	{0xaa, 0x2d, 0x007f},
4594	{0xaa, 0x2e, 0x007f},
4595	{0xa0, 0x10, ZC3XX_R087_EXPTIMEMID},
4596	{0xa0, 0x37, ZC3XX_R101_SENSORCORRECTION},
4597	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},
4598	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},
4599	{0xa0, 0x06, ZC3XX_R189_AWBSTATUS},
4600	{0xa0, 0x00, 0x01ad},
4601	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},
4602	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},
4603	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},
4604	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},
4605	{0xa0, 0x60, ZC3XX_R1A8_DIGITALGAIN},
4606	{0xa0, 0x80, ZC3XX_R18D_YTARGET},
4607	{0xa0, 0x61, ZC3XX_R116_RGAIN},
4608	{0xa0, 0x65, ZC3XX_R118_BGAIN},
4609	{}
4610};
4611static const struct usb_action mt9v111_3_AE50HZ[] = {
4612	{0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},
4613	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
4614	{0xaa, 0x05, 0x0009},		/* horizontal blanking */
4615	{0xaa, 0x09, 0x01ce},		/* shutter width */
4616	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},
4617	{0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},
4618	{0xa0, 0xd2, ZC3XX_R192_EXPOSURELIMITLOW},
4619	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
4620	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},
4621	{0xa0, 0x9a, ZC3XX_R197_ANTIFLICKERLOW},
4622	{0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},
4623	{0xa0, 0x1c, ZC3XX_R18F_AEUNFREEZE},
4624	{0xa0, 0x14, ZC3XX_R1A9_DIGITALLIMITDIFF},
4625	{0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},
4626	{0xa0, 0xd7, ZC3XX_R01D_HSYNC_0},
4627	{0xa0, 0xf4, ZC3XX_R01E_HSYNC_1},
4628	{0xa0, 0xf9, ZC3XX_R01F_HSYNC_2},
4629	{0xa0, 0xff, ZC3XX_R020_HSYNC_3},
4630	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},
4631	{}
4632};
4633static const struct usb_action mt9v111_3_AE50HZScale[] = {
4634	{0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},
4635	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
4636	{0xaa, 0x05, 0x0009},
4637	{0xaa, 0x09, 0x01ce},
4638	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},
4639	{0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},
4640	{0xa0, 0xd2, ZC3XX_R192_EXPOSURELIMITLOW},
4641	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
4642	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},
4643	{0xa0, 0x9a, ZC3XX_R197_ANTIFLICKERLOW},
4644	{0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},
4645	{0xa0, 0x1c, ZC3XX_R18F_AEUNFREEZE},
4646	{0xa0, 0x14, ZC3XX_R1A9_DIGITALLIMITDIFF},
4647	{0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},
4648	{0xa0, 0xd7, ZC3XX_R01D_HSYNC_0},
4649	{0xa0, 0xf4, ZC3XX_R01E_HSYNC_1},
4650	{0xa0, 0xf9, ZC3XX_R01F_HSYNC_2},
4651	{0xa0, 0xff, ZC3XX_R020_HSYNC_3},
4652	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},
4653	{}
4654};
4655static const struct usb_action mt9v111_3_AE60HZ[] = {
4656	{0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},
4657	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
4658	{0xaa, 0x05, 0x0009},
4659	{0xaa, 0x09, 0x0083},
4660	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},
4661	{0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},
4662	{0xa0, 0x8f, ZC3XX_R192_EXPOSURELIMITLOW},
4663	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
4664	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},
4665	{0xa0, 0x81, ZC3XX_R197_ANTIFLICKERLOW},
4666	{0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},
4667	{0xa0, 0x1c, ZC3XX_R18F_AEUNFREEZE},
4668	{0xa0, 0x14, ZC3XX_R1A9_DIGITALLIMITDIFF},
4669	{0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},
4670	{0xa0, 0xd7, ZC3XX_R01D_HSYNC_0},
4671	{0xa0, 0xf4, ZC3XX_R01E_HSYNC_1},
4672	{0xa0, 0xf9, ZC3XX_R01F_HSYNC_2},
4673	{0xa0, 0xff, ZC3XX_R020_HSYNC_3},
4674	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},
4675	{}
4676};
4677static const struct usb_action mt9v111_3_AE60HZScale[] = {
4678	{0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},
4679	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
4680	{0xaa, 0x05, 0x0009},
4681	{0xaa, 0x09, 0x0083},
4682	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},
4683	{0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},
4684	{0xa0, 0x8f, ZC3XX_R192_EXPOSURELIMITLOW},
4685	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
4686	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},
4687	{0xa0, 0x81, ZC3XX_R197_ANTIFLICKERLOW},
4688	{0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},
4689	{0xa0, 0x1c, ZC3XX_R18F_AEUNFREEZE},
4690	{0xa0, 0x14, ZC3XX_R1A9_DIGITALLIMITDIFF},
4691	{0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},
4692	{0xa0, 0xd7, ZC3XX_R01D_HSYNC_0},
4693	{0xa0, 0xf4, ZC3XX_R01E_HSYNC_1},
4694	{0xa0, 0xf9, ZC3XX_R01F_HSYNC_2},
4695	{0xa0, 0xff, ZC3XX_R020_HSYNC_3},
4696	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},
4697	{}
4698};
4699static const struct usb_action mt9v111_3_AENoFliker[] = {
4700	{0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},
4701	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
4702	{0xaa, 0x05, 0x0034},
4703	{0xaa, 0x09, 0x0260},
4704	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},
4705	{0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},
4706	{0xa0, 0xf0, ZC3XX_R192_EXPOSURELIMITLOW},
4707	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
4708	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},
4709	{0xa0, 0x04, ZC3XX_R197_ANTIFLICKERLOW},
4710	{0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},
4711	{0xa0, 0x1c, ZC3XX_R18F_AEUNFREEZE},
4712	{0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF},
4713	{0xa0, 0x00, ZC3XX_R1AA_DIGITALGAINSTEP},
4714	{0xa0, 0x34, ZC3XX_R01D_HSYNC_0},
4715	{0xa0, 0x60, ZC3XX_R01E_HSYNC_1},
4716	{0xa0, 0x90, ZC3XX_R01F_HSYNC_2},
4717	{0xa0, 0xe0, ZC3XX_R020_HSYNC_3},
4718	{0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},
4719	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},
4720	{}
4721};
4722static const struct usb_action mt9v111_3_AENoFlikerScale[] = {
4723	{0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},
4724	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
4725	{0xaa, 0x05, 0x0034},
4726	{0xaa, 0x09, 0x0260},
4727	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},
4728	{0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},
4729	{0xa0, 0xf0, ZC3XX_R192_EXPOSURELIMITLOW},
4730	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
4731	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},
4732	{0xa0, 0x04, ZC3XX_R197_ANTIFLICKERLOW},
4733	{0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},
4734	{0xa0, 0x1c, ZC3XX_R18F_AEUNFREEZE},
4735	{0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF},
4736	{0xa0, 0x00, ZC3XX_R1AA_DIGITALGAINSTEP},
4737	{0xa0, 0x34, ZC3XX_R01D_HSYNC_0},
4738	{0xa0, 0x60, ZC3XX_R01E_HSYNC_1},
4739	{0xa0, 0x90, ZC3XX_R01F_HSYNC_2},
4740	{0xa0, 0xe0, ZC3XX_R020_HSYNC_3},
4741	{0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},
4742	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},
4743	{}
4744};
4745
4746static const struct usb_action pb0330_Initial[] = {	/* 640x480 */
4747	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},
4748	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},	/* 00 */
4749	{0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT},
4750	{0xa0, 0x00, ZC3XX_R002_CLOCKSELECT},
4751	{0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},
4752	{0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},
4753	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},
4754	{0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},
4755	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},
4756	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},
4757	{0xa0, 0x07, ZC3XX_R012_VIDEOCONTROLFUNC},
4758	{0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},
4759	{0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},
4760	{0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},
4761	{0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},
4762	{0xdd, 0x00, 0x0200},
4763	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},
4764	{0xaa, 0x01, 0x0006},
4765	{0xaa, 0x02, 0x0011},
4766	{0xaa, 0x03, 0x01e5},			/*jfm: was 1e7*/
4767	{0xaa, 0x04, 0x0285},			/*jfm: was 0287*/
4768	{0xaa, 0x06, 0x0003},
4769	{0xaa, 0x07, 0x3002},
4770	{0xaa, 0x20, 0x1100},
4771	{0xaa, 0x2f, 0xf7b0},
4772	{0xaa, 0x30, 0x0005},
4773	{0xaa, 0x31, 0x0000},
4774	{0xaa, 0x34, 0x0100},
4775	{0xaa, 0x35, 0x0060},
4776	{0xaa, 0x3d, 0x068f},
4777	{0xaa, 0x40, 0x01e0},
4778	{0xaa, 0x58, 0x0078},
4779	{0xaa, 0x62, 0x0411},
4780	{0xa0, 0x10, ZC3XX_R087_EXPTIMEMID},
4781	{0xa0, 0x37, ZC3XX_R101_SENSORCORRECTION},
4782	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},
4783	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},
4784	{0xa0, 0x06, ZC3XX_R189_AWBSTATUS},
4785	{0xa0, 0x09, 0x01ad},			/*jfm: was 00 */
4786	{0xa0, 0x15, 0x01ae},
4787	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},
4788	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},
4789	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},
4790	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},
4791	{0xa0, 0x60, ZC3XX_R1A8_DIGITALGAIN},
4792	{0xa0, 0x78, ZC3XX_R18D_YTARGET},	/*jfm: was 6c*/
4793	{}
4794};
4795static const struct usb_action pb0330_InitialScale[] = {	/* 320x240 */
4796	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},
4797	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},	/* 00 */
4798	{0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT},
4799	{0xa0, 0x10, ZC3XX_R002_CLOCKSELECT},
4800	{0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},
4801	{0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},
4802	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},
4803	{0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},
4804	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},
4805	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},
4806	{0xa0, 0x07, ZC3XX_R012_VIDEOCONTROLFUNC},
4807	{0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},
4808	{0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},
4809	{0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},
4810	{0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},
4811	{0xdd, 0x00, 0x0200},
4812	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},
4813	{0xaa, 0x01, 0x0006},
4814	{0xaa, 0x02, 0x0011},
4815	{0xaa, 0x03, 0x01e7},
4816	{0xaa, 0x04, 0x0287},
4817	{0xaa, 0x06, 0x0003},
4818	{0xaa, 0x07, 0x3002},
4819	{0xaa, 0x20, 0x1100},
4820	{0xaa, 0x2f, 0xf7b0},
4821	{0xaa, 0x30, 0x0005},
4822	{0xaa, 0x31, 0x0000},
4823	{0xaa, 0x34, 0x0100},
4824	{0xaa, 0x35, 0x0060},
4825	{0xaa, 0x3d, 0x068f},
4826	{0xaa, 0x40, 0x01e0},
4827	{0xaa, 0x58, 0x0078},
4828	{0xaa, 0x62, 0x0411},
4829	{0xa0, 0x10, ZC3XX_R087_EXPTIMEMID},
4830	{0xa0, 0x37, ZC3XX_R101_SENSORCORRECTION},
4831	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},
4832	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},
4833	{0xa0, 0x06, ZC3XX_R189_AWBSTATUS},
4834	{0xa0, 0x09, 0x01ad},
4835	{0xa0, 0x15, 0x01ae},
4836	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},
4837	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},
4838	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},
4839	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},
4840	{0xa0, 0x60, ZC3XX_R1A8_DIGITALGAIN},
4841	{0xa0, 0x78, ZC3XX_R18D_YTARGET},	/*jfm: was 6c*/
4842	{}
4843};
4844static const struct usb_action pb0330_50HZ[] = {
4845	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
4846	{0xbb, 0x00, 0x055c},
4847	{0xbb, 0x01, 0x09aa},
4848	{0xbb, 0x00, 0x1001},
4849	{0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},
4850	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},
4851	{0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},
4852	{0xa0, 0xc4, ZC3XX_R192_EXPOSURELIMITLOW},
4853	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
4854	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},
4855	{0xa0, 0x47, ZC3XX_R197_ANTIFLICKERLOW},
4856	{0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},
4857	{0xa0, 0x1a, ZC3XX_R18F_AEUNFREEZE},
4858	{0xa0, 0x14, ZC3XX_R1A9_DIGITALLIMITDIFF},
4859	{0xa0, 0x66, ZC3XX_R1AA_DIGITALGAINSTEP},
4860	{0xa0, 0x5c, ZC3XX_R01D_HSYNC_0},
4861	{0xa0, 0x90, ZC3XX_R01E_HSYNC_1},
4862	{0xa0, 0xc8, ZC3XX_R01F_HSYNC_2},
4863	{0xa0, 0xff, ZC3XX_R020_HSYNC_3},
4864	{}
4865};
4866static const struct usb_action pb0330_50HZScale[] = {
4867	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
4868	{0xbb, 0x00, 0x0566},
4869	{0xbb, 0x02, 0x09b2},
4870	{0xbb, 0x00, 0x1002},
4871	{0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},
4872	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},
4873	{0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},
4874	{0xa0, 0x8c, ZC3XX_R192_EXPOSURELIMITLOW},
4875	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
4876	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},
4877	{0xa0, 0x8a, ZC3XX_R197_ANTIFLICKERLOW},
4878	{0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},
4879	{0xa0, 0x1a, ZC3XX_R18F_AEUNFREEZE},
4880	{0xa0, 0x14, ZC3XX_R1A9_DIGITALLIMITDIFF},
4881	{0xa0, 0x66, ZC3XX_R1AA_DIGITALGAINSTEP},
4882	{0xa0, 0xd7, ZC3XX_R01D_HSYNC_0},
4883	{0xa0, 0xf0, ZC3XX_R01E_HSYNC_1},
4884	{0xa0, 0xf8, ZC3XX_R01F_HSYNC_2},
4885	{0xa0, 0xff, ZC3XX_R020_HSYNC_3},
4886	{}
4887};
4888static const struct usb_action pb0330_60HZ[] = {
4889	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
4890	{0xbb, 0x00, 0x0535},
4891	{0xbb, 0x01, 0x0974},
4892	{0xbb, 0x00, 0x1001},
4893	{0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},
4894	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},
4895	{0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},
4896	{0xa0, 0xfe, ZC3XX_R192_EXPOSURELIMITLOW},
4897	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
4898	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},
4899	{0xa0, 0x3e, ZC3XX_R197_ANTIFLICKERLOW},
4900	{0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},
4901	{0xa0, 0x1a, ZC3XX_R18F_AEUNFREEZE},
4902	{0xa0, 0x14, ZC3XX_R1A9_DIGITALLIMITDIFF},
4903	{0xa0, 0x66, ZC3XX_R1AA_DIGITALGAINSTEP},
4904	{0xa0, 0x35, ZC3XX_R01D_HSYNC_0},
4905	{0xa0, 0x50, ZC3XX_R01E_HSYNC_1},
4906	{0xa0, 0x90, ZC3XX_R01F_HSYNC_2},
4907	{0xa0, 0xd0, ZC3XX_R020_HSYNC_3},
4908	{}
4909};
4910static const struct usb_action pb0330_60HZScale[] = {
4911	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
4912	{0xbb, 0x00, 0x0535},
4913	{0xbb, 0x02, 0x096c},
4914	{0xbb, 0x00, 0x1002},
4915	{0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},
4916	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},
4917	{0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},
4918	{0xa0, 0xc0, ZC3XX_R192_EXPOSURELIMITLOW},
4919	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
4920	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},
4921	{0xa0, 0x7c, ZC3XX_R197_ANTIFLICKERLOW},
4922	{0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},
4923	{0xa0, 0x1a, ZC3XX_R18F_AEUNFREEZE},
4924	{0xa0, 0x14, ZC3XX_R1A9_DIGITALLIMITDIFF},
4925	{0xa0, 0x66, ZC3XX_R1AA_DIGITALGAINSTEP},
4926	{0xa0, 0x35, ZC3XX_R01D_HSYNC_0},
4927	{0xa0, 0x50, ZC3XX_R01E_HSYNC_1},
4928	{0xa0, 0x90, ZC3XX_R01F_HSYNC_2},
4929	{0xa0, 0xd0, ZC3XX_R020_HSYNC_3},
4930	{}
4931};
4932static const struct usb_action pb0330_NoFliker[] = {
4933	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
4934	{0xbb, 0x00, 0x0509},
4935	{0xbb, 0x02, 0x0940},
4936	{0xbb, 0x00, 0x1002},
4937	{0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},
4938	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},
4939	{0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},
4940	{0xa0, 0xf0, ZC3XX_R192_EXPOSURELIMITLOW},
4941	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
4942	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},
4943	{0xa0, 0x01, ZC3XX_R197_ANTIFLICKERLOW},
4944	{0xa0, 0x10, ZC3XX_R18C_AEFREEZE},
4945	{0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},
4946	{0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF},
4947	{0xa0, 0x00, ZC3XX_R1AA_DIGITALGAINSTEP},
4948	{0xa0, 0x09, ZC3XX_R01D_HSYNC_0},
4949	{0xa0, 0x40, ZC3XX_R01E_HSYNC_1},
4950	{0xa0, 0x90, ZC3XX_R01F_HSYNC_2},
4951	{0xa0, 0xe0, ZC3XX_R020_HSYNC_3},
4952	{}
4953};
4954static const struct usb_action pb0330_NoFlikerScale[] = {
4955	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
4956	{0xbb, 0x00, 0x0535},
4957	{0xbb, 0x01, 0x0980},
4958	{0xbb, 0x00, 0x1001},
4959	{0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},
4960	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},
4961	{0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},
4962	{0xa0, 0xf0, ZC3XX_R192_EXPOSURELIMITLOW},
4963	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
4964	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},
4965	{0xa0, 0x01, ZC3XX_R197_ANTIFLICKERLOW},
4966	{0xa0, 0x10, ZC3XX_R18C_AEFREEZE},
4967	{0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},
4968	{0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF},
4969	{0xa0, 0x00, ZC3XX_R1AA_DIGITALGAINSTEP},
4970	{0xa0, 0x35, ZC3XX_R01D_HSYNC_0},
4971	{0xa0, 0x60, ZC3XX_R01E_HSYNC_1},
4972	{0xa0, 0x90, ZC3XX_R01F_HSYNC_2},
4973	{0xa0, 0xe0, ZC3XX_R020_HSYNC_3},
4974	{}
4975};
4976
4977/* from oem9.inf */
4978static const struct usb_action po2030_Initial[] = {	/* 640x480 */
4979	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL}, /* 00,00,01,cc */
4980	{0xa0, 0x04, ZC3XX_R002_CLOCKSELECT},	/* 00,02,04,cc */
4981	{0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,01,cc */
4982	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING}, /* 00,01,01,cc */
4983	{0xa0, 0x04, ZC3XX_R080_HBLANKHIGH}, /* 00,80,04,cc */
4984	{0xa0, 0x05, ZC3XX_R081_HBLANKLOW}, /* 00,81,05,cc */
4985	{0xa0, 0x16, ZC3XX_R083_RGAINADDR}, /* 00,83,16,cc */
4986	{0xa0, 0x18, ZC3XX_R085_BGAINADDR}, /* 00,85,18,cc */
4987	{0xa0, 0x1a, ZC3XX_R086_EXPTIMEHIGH}, /* 00,86,1a,cc */
4988	{0xa0, 0x1b, ZC3XX_R087_EXPTIMEMID}, /* 00,87,1b,cc */
4989	{0xa0, 0x1c, ZC3XX_R088_EXPTIMELOW}, /* 00,88,1c,cc */
4990	{0xa0, 0xee, ZC3XX_R08B_I2CDEVICEADDR}, /* 00,8b,ee,cc */
4991	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING}, /* 00,08,03,cc */
4992	{0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,03,cc */
4993	{0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,01,cc */
4994	{0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH}, /* 00,03,02,cc */
4995	{0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW}, /* 00,04,80,cc */
4996	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH}, /* 00,05,01,cc */
4997	{0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW}, /* 00,06,e0,cc */
4998	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE}, /* 01,80,42,cc */
4999	{0xaa, 0x8d, 0x0008},			/* 00,8d,08,aa */
5000	{0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},	/* 00,98,00,cc */
5001	{0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},	/* 00,9a,00,cc */
5002	{0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},	/* 01,1a,00,cc */
5003	{0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},	/* 01,1c,00,cc */
5004	{0xa0, 0xe6, ZC3XX_R09C_WINHEIGHTLOW},	/* 00,9c,e6,cc */
5005	{0xa0, 0x86, ZC3XX_R09E_WINWIDTHLOW},	/* 00,9e,86,cc */
5006	{0xaa, 0x09, 0x00ce}, /* 00,09,ce,aa */
5007	{0xaa, 0x0b, 0x0005}, /* 00,0b,05,aa */
5008	{0xaa, 0x0d, 0x0054}, /* 00,0d,54,aa */
5009	{0xaa, 0x0f, 0x00eb}, /* 00,0f,eb,aa */
5010	{0xaa, 0x87, 0x0000}, /* 00,87,00,aa */
5011	{0xaa, 0x88, 0x0004}, /* 00,88,04,aa */
5012	{0xaa, 0x89, 0x0000}, /* 00,89,00,aa */
5013	{0xaa, 0x8a, 0x0005}, /* 00,8a,05,aa */
5014	{0xaa, 0x13, 0x0003}, /* 00,13,03,aa */
5015	{0xaa, 0x16, 0x0040}, /* 00,16,40,aa */
5016	{0xaa, 0x18, 0x0040}, /* 00,18,40,aa */
5017	{0xaa, 0x1d, 0x0002}, /* 00,1d,02,aa */
5018	{0xaa, 0x29, 0x00e8}, /* 00,29,e8,aa */
5019	{0xaa, 0x45, 0x0045}, /* 00,45,45,aa */
5020	{0xaa, 0x50, 0x00ed}, /* 00,50,ed,aa */
5021	{0xaa, 0x51, 0x0025}, /* 00,51,25,aa */
5022	{0xaa, 0x52, 0x0042}, /* 00,52,42,aa */
5023	{0xaa, 0x53, 0x002f}, /* 00,53,2f,aa */
5024	{0xaa, 0x79, 0x0025}, /* 00,79,25,aa */
5025	{0xaa, 0x7b, 0x0000}, /* 00,7b,00,aa */
5026	{0xaa, 0x7e, 0x0025}, /* 00,7e,25,aa */
5027	{0xaa, 0x7f, 0x0025}, /* 00,7f,25,aa */
5028	{0xaa, 0x21, 0x0000}, /* 00,21,00,aa */
5029	{0xaa, 0x33, 0x0036}, /* 00,33,36,aa */
5030	{0xaa, 0x36, 0x0060}, /* 00,36,60,aa */
5031	{0xaa, 0x37, 0x0008}, /* 00,37,08,aa */
5032	{0xaa, 0x3b, 0x0031}, /* 00,3b,31,aa */
5033	{0xaa, 0x44, 0x000f}, /* 00,44,0f,aa */
5034	{0xaa, 0x58, 0x0002}, /* 00,58,02,aa */
5035	{0xaa, 0x66, 0x00c0}, /* 00,66,c0,aa */
5036	{0xaa, 0x67, 0x0044}, /* 00,67,44,aa */
5037	{0xaa, 0x6b, 0x00a0}, /* 00,6b,a0,aa */
5038	{0xaa, 0x6c, 0x0054}, /* 00,6c,54,aa */
5039	{0xaa, 0xd6, 0x0007}, /* 00,d6,07,aa */
5040	{0xa0, 0xf7, ZC3XX_R101_SENSORCORRECTION}, /* 01,01,f7,cc */
5041	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,05,cc */
5042	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE}, /* 01,00,0d,cc */
5043	{0xa0, 0x06, ZC3XX_R189_AWBSTATUS}, /* 01,89,06,cc */
5044	{0xa0, 0x00, 0x01ad}, /* 01,ad,00,cc */
5045	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE}, /* 01,c5,03,cc */
5046	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05}, /* 01,cb,13,cc */
5047	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE}, /* 02,50,08,cc */
5048	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS}, /* 03,01,08,cc */
5049	{0xa0, 0x7a, ZC3XX_R116_RGAIN}, /* 01,16,7a,cc */
5050	{0xa0, 0x4a, ZC3XX_R118_BGAIN}, /* 01,18,4a,cc */
5051	{}
5052};
5053
5054/* from oem9.inf */
5055static const struct usb_action po2030_InitialScale[] = {	/* 320x240 */
5056	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL}, /* 00,00,01,cc */
5057	{0xa0, 0x10, ZC3XX_R002_CLOCKSELECT}, /* 00,02,10,cc */
5058	{0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,01,cc */
5059	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING}, /* 00,01,01,cc */
5060	{0xa0, 0x04, ZC3XX_R080_HBLANKHIGH}, /* 00,80,04,cc */
5061	{0xa0, 0x05, ZC3XX_R081_HBLANKLOW}, /* 00,81,05,cc */
5062	{0xa0, 0x16, ZC3XX_R083_RGAINADDR}, /* 00,83,16,cc */
5063	{0xa0, 0x18, ZC3XX_R085_BGAINADDR}, /* 00,85,18,cc */
5064	{0xa0, 0x1a, ZC3XX_R086_EXPTIMEHIGH}, /* 00,86,1a,cc */
5065	{0xa0, 0x1b, ZC3XX_R087_EXPTIMEMID}, /* 00,87,1b,cc */
5066	{0xa0, 0x1c, ZC3XX_R088_EXPTIMELOW}, /* 00,88,1c,cc */
5067	{0xa0, 0xee, ZC3XX_R08B_I2CDEVICEADDR}, /* 00,8b,ee,cc */
5068	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING}, /* 00,08,03,cc */
5069	{0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,03,cc */
5070	{0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,01,cc */
5071	{0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH}, /* 00,03,02,cc */
5072	{0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW}, /* 00,04,80,cc */
5073	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH}, /* 00,05,01,cc */
5074	{0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW}, /* 00,06,e0,cc */
5075	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE}, /* 01,80,42,cc */
5076	{0xaa, 0x8d, 0x0008},			/* 00,8d,08,aa */
5077	{0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW}, /* 00,98,00,cc */
5078	{0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW}, /* 00,9a,00,cc */
5079	{0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW}, /* 01,1a,00,cc */
5080	{0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW}, /* 01,1c,00,cc */
5081	{0xa0, 0xe8, ZC3XX_R09C_WINHEIGHTLOW}, /* 00,9c,e8,cc */
5082	{0xa0, 0x88, ZC3XX_R09E_WINWIDTHLOW}, /* 00,9e,88,cc */
5083	{0xaa, 0x09, 0x00cc}, /* 00,09,cc,aa */
5084	{0xaa, 0x0b, 0x0005}, /* 00,0b,05,aa */
5085	{0xaa, 0x0d, 0x0058}, /* 00,0d,58,aa */
5086	{0xaa, 0x0f, 0x00ed}, /* 00,0f,ed,aa */
5087	{0xaa, 0x87, 0x0000}, /* 00,87,00,aa */
5088	{0xaa, 0x88, 0x0004}, /* 00,88,04,aa */
5089	{0xaa, 0x89, 0x0000}, /* 00,89,00,aa */
5090	{0xaa, 0x8a, 0x0005}, /* 00,8a,05,aa */
5091	{0xaa, 0x13, 0x0003}, /* 00,13,03,aa */
5092	{0xaa, 0x16, 0x0040}, /* 00,16,40,aa */
5093	{0xaa, 0x18, 0x0040}, /* 00,18,40,aa */
5094	{0xaa, 0x1d, 0x0002}, /* 00,1d,02,aa */
5095	{0xaa, 0x29, 0x00e8}, /* 00,29,e8,aa */
5096	{0xaa, 0x45, 0x0045}, /* 00,45,45,aa */
5097	{0xaa, 0x50, 0x00ed}, /* 00,50,ed,aa */
5098	{0xaa, 0x51, 0x0025}, /* 00,51,25,aa */
5099	{0xaa, 0x52, 0x0042}, /* 00,52,42,aa */
5100	{0xaa, 0x53, 0x002f}, /* 00,53,2f,aa */
5101	{0xaa, 0x79, 0x0025}, /* 00,79,25,aa */
5102	{0xaa, 0x7b, 0x0000}, /* 00,7b,00,aa */
5103	{0xaa, 0x7e, 0x0025}, /* 00,7e,25,aa */
5104	{0xaa, 0x7f, 0x0025}, /* 00,7f,25,aa */
5105	{0xaa, 0x21, 0x0000}, /* 00,21,00,aa */
5106	{0xaa, 0x33, 0x0036}, /* 00,33,36,aa */
5107	{0xaa, 0x36, 0x0060}, /* 00,36,60,aa */
5108	{0xaa, 0x37, 0x0008}, /* 00,37,08,aa */
5109	{0xaa, 0x3b, 0x0031}, /* 00,3b,31,aa */
5110	{0xaa, 0x44, 0x000f}, /* 00,44,0f,aa */
5111	{0xaa, 0x58, 0x0002}, /* 00,58,02,aa */
5112	{0xaa, 0x66, 0x00c0}, /* 00,66,c0,aa */
5113	{0xaa, 0x67, 0x0044}, /* 00,67,44,aa */
5114	{0xaa, 0x6b, 0x00a0}, /* 00,6b,a0,aa */
5115	{0xaa, 0x6c, 0x0054}, /* 00,6c,54,aa */
5116	{0xaa, 0xd6, 0x0007}, /* 00,d6,07,aa */
5117	{0xa0, 0xf7, ZC3XX_R101_SENSORCORRECTION}, /* 01,01,f7,cc */
5118	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,05,cc */
5119	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE}, /* 01,00,0d,cc */
5120	{0xa0, 0x06, ZC3XX_R189_AWBSTATUS}, /* 01,89,06,cc */
5121	{0xa0, 0x00, 0x01ad}, /* 01,ad,00,cc */
5122	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE}, /* 01,c5,03,cc */
5123	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05}, /* 01,cb,13,cc */
5124	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE}, /* 02,50,08,cc */
5125	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS}, /* 03,01,08,cc */
5126	{0xa0, 0x7a, ZC3XX_R116_RGAIN}, /* 01,16,7a,cc */
5127	{0xa0, 0x4a, ZC3XX_R118_BGAIN}, /* 01,18,4a,cc */
5128	{}
5129};
5130
5131static const struct usb_action po2030_50HZ[] = {
5132	{0xaa, 0x8d, 0x0008}, /* 00,8d,08,aa */
5133	{0xaa, 0x1a, 0x0001}, /* 00,1a,01,aa */
5134	{0xaa, 0x1b, 0x000a}, /* 00,1b,0a,aa */
5135	{0xaa, 0x1c, 0x00b0}, /* 00,1c,b0,aa */
5136	{0xa0, 0x05, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,05,cc */
5137	{0xa0, 0x35, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,35,cc */
5138	{0xa0, 0x70, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,70,cc */
5139	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */
5140	{0xa0, 0x85, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,85,cc */
5141	{0xa0, 0x58, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,58,cc */
5142	{0xa0, 0x0c, ZC3XX_R18C_AEFREEZE}, /* 01,8c,0c,cc */
5143	{0xa0, 0x18, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,18,cc */
5144	{0xa0, 0x60, ZC3XX_R1A8_DIGITALGAIN}, /* 01,a8,60,cc */
5145	{0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,10,cc */
5146	{0xa0, 0x22, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,22,cc */
5147	{0xa0, 0x88, ZC3XX_R18D_YTARGET}, /* 01,8d,88,cc */
5148	{0xa0, 0x58, ZC3XX_R11D_GLOBALGAIN}, /* 01,1d,58,cc */
5149	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE}, /* 01,80,42,cc */
5150	{}
5151};
5152
5153static const struct usb_action po2030_60HZ[] = {
5154	{0xaa, 0x8d, 0x0008}, /* 00,8d,08,aa */
5155	{0xaa, 0x1a, 0x0000}, /* 00,1a,00,aa */
5156	{0xaa, 0x1b, 0x00de}, /* 00,1b,de,aa */
5157	{0xaa, 0x1c, 0x0040}, /* 00,1c,40,aa */
5158	{0xa0, 0x08, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,08,cc */
5159	{0xa0, 0xae, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,ae,cc */
5160	{0xa0, 0x80, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,80,cc */
5161	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */
5162	{0xa0, 0x6f, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,6f,cc */
5163	{0xa0, 0x20, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,20,cc */
5164	{0xa0, 0x0c, ZC3XX_R18C_AEFREEZE}, /* 01,8c,0c,cc */
5165	{0xa0, 0x18, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,18,cc */
5166	{0xa0, 0x60, ZC3XX_R1A8_DIGITALGAIN}, /* 01,a8,60,cc */
5167	{0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,10,cc */
5168	{0xa0, 0x22, ZC3XX_R1AA_DIGITALGAINSTEP},	/* 01,aa,22,cc */
5169	{0xa0, 0x88, ZC3XX_R18D_YTARGET},		/* 01,8d,88,cc */
5170							/* win: 01,8d,80 */
5171	{0xa0, 0x58, ZC3XX_R11D_GLOBALGAIN},		/* 01,1d,58,cc */
5172	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},	/* 01,80,42,cc */
5173	{}
5174};
5175
5176static const struct usb_action po2030_NoFliker[] = {
5177	{0xa0, 0x02, ZC3XX_R180_AUTOCORRECTENABLE}, /* 01,80,02,cc */
5178	{0xaa, 0x8d, 0x000d}, /* 00,8d,0d,aa */
5179	{0xaa, 0x1a, 0x0000}, /* 00,1a,00,aa */
5180	{0xaa, 0x1b, 0x0002}, /* 00,1b,02,aa */
5181	{0xaa, 0x1c, 0x0078}, /* 00,1c,78,aa */
5182	{0xaa, 0x46, 0x0000}, /* 00,46,00,aa */
5183	{0xaa, 0x15, 0x0000}, /* 00,15,00,aa */
5184	{}
5185};
5186
5187static const struct usb_action tas5130c_InitialScale[] = {	/* 320x240 */
5188	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},
5189	{0xa0, 0x50, ZC3XX_R002_CLOCKSELECT},
5190	{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},
5191	{0xa0, 0x02, ZC3XX_R010_CMOSSENSORSELECT},
5192	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},
5193	{0xa0, 0x00, ZC3XX_R001_SYSTEMOPERATING},
5194	{0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},
5195	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},
5196	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},
5197	{0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},
5198	{0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},
5199	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},
5200	{0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},
5201
5202	{0xa0, 0x04, ZC3XX_R098_WINYSTARTLOW},
5203	{0xa0, 0x0f, ZC3XX_R09A_WINXSTARTLOW},
5204	{0xa0, 0x04, ZC3XX_R11A_FIRSTYLOW},
5205	{0xa0, 0x0f, ZC3XX_R11C_FIRSTXLOW},
5206	{0xa0, 0xe8, ZC3XX_R09C_WINHEIGHTLOW},
5207	{0xa0, 0x02, ZC3XX_R09D_WINWIDTHHIGH},
5208	{0xa0, 0x88, ZC3XX_R09E_WINWIDTHLOW},
5209	{0xa0, 0x06, ZC3XX_R08D_COMPABILITYMODE},
5210	{0xa0, 0xf7, ZC3XX_R101_SENSORCORRECTION},
5211	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},
5212	{0xa0, 0x06, ZC3XX_R189_AWBSTATUS},
5213	{0xa0, 0x70, ZC3XX_R18D_YTARGET},
5214	{0xa0, 0x50, ZC3XX_R1A8_DIGITALGAIN},
5215	{0xa0, 0x00, 0x01ad},
5216	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},
5217	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},
5218	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},
5219	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},
5220	{0xa0, 0x07, ZC3XX_R0A5_EXPOSUREGAIN},
5221	{0xa0, 0x02, ZC3XX_R0A6_EXPOSUREBLACKLVL},
5222	{}
5223};
5224static const struct usb_action tas5130c_Initial[] = {	/* 640x480 */
5225	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},
5226	{0xa0, 0x40, ZC3XX_R002_CLOCKSELECT},
5227	{0xa0, 0x00, ZC3XX_R008_CLOCKSETTING},
5228	{0xa0, 0x02, ZC3XX_R010_CMOSSENSORSELECT},
5229	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},
5230	{0xa0, 0x00, ZC3XX_R001_SYSTEMOPERATING},
5231	{0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},
5232	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},
5233	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},
5234	{0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},
5235	{0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},
5236	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},
5237	{0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},
5238	{0xa0, 0x05, ZC3XX_R098_WINYSTARTLOW},
5239	{0xa0, 0x0f, ZC3XX_R09A_WINXSTARTLOW},
5240	{0xa0, 0x05, ZC3XX_R11A_FIRSTYLOW},
5241	{0xa0, 0x0f, ZC3XX_R11C_FIRSTXLOW},
5242	{0xa0, 0xe6, ZC3XX_R09C_WINHEIGHTLOW},
5243	{0xa0, 0x02, ZC3XX_R09D_WINWIDTHHIGH},
5244	{0xa0, 0x86, ZC3XX_R09E_WINWIDTHLOW},
5245	{0xa0, 0x06, ZC3XX_R08D_COMPABILITYMODE},
5246	{0xa0, 0x37, ZC3XX_R101_SENSORCORRECTION},
5247	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},
5248	{0xa0, 0x06, ZC3XX_R189_AWBSTATUS},
5249	{0xa0, 0x70, ZC3XX_R18D_YTARGET},
5250	{0xa0, 0x50, ZC3XX_R1A8_DIGITALGAIN},
5251	{0xa0, 0x00, 0x01ad},
5252	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},
5253	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},
5254	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},
5255	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},
5256	{0xa0, 0x07, ZC3XX_R0A5_EXPOSUREGAIN},
5257	{0xa0, 0x02, ZC3XX_R0A6_EXPOSUREBLACKLVL},
5258	{}
5259};
5260static const struct usb_action tas5130c_50HZ[] = {
5261	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */
5262	{0xaa, 0xa3, 0x0001}, /* 00,a3,01,aa */
5263	{0xaa, 0xa4, 0x0063}, /* 00,a4,63,aa */
5264	{0xa0, 0x01, ZC3XX_R0A3_EXPOSURETIMEHIGH}, /* 00,a3,01,cc */
5265	{0xa0, 0x63, ZC3XX_R0A4_EXPOSURETIMELOW}, /* 00,a4,63,cc */
5266	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */
5267	{0xa0, 0x04, ZC3XX_R191_EXPOSURELIMITMID},
5268	{0xa0, 0xfe, ZC3XX_R192_EXPOSURELIMITLOW},
5269	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */
5270	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */
5271	{0xa0, 0x47, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,47,cc */
5272	{0xa0, 0x0c, ZC3XX_R18C_AEFREEZE},
5273	{0xa0, 0x18, ZC3XX_R18F_AEUNFREEZE},
5274	{0xa0, 0x08, ZC3XX_R1A9_DIGITALLIMITDIFF},
5275	{0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},
5276	{0xa0, 0xd3, ZC3XX_R01D_HSYNC_0}, /* 00,1d,d3,cc */
5277	{0xa0, 0xda, ZC3XX_R01E_HSYNC_1}, /* 00,1e,da,cc */
5278	{0xa0, 0xea, ZC3XX_R01F_HSYNC_2}, /* 00,1f,ea,cc */
5279	{0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,20,ff,cc */
5280	{0xa0, 0x03, ZC3XX_R09F_MAXXHIGH}, /* 00,9f,03,cc */
5281	{0xa0, 0x4c, ZC3XX_R0A0_MAXXLOW},
5282	{0xa0, 0x50, ZC3XX_R11D_GLOBALGAIN},
5283	{}
5284};
5285static const struct usb_action tas5130c_50HZScale[] = {
5286	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */
5287	{0xaa, 0xa3, 0x0001}, /* 00,a3,01,aa */
5288	{0xaa, 0xa4, 0x0077}, /* 00,a4,77,aa */
5289	{0xa0, 0x01, ZC3XX_R0A3_EXPOSURETIMEHIGH}, /* 00,a3,01,cc */
5290	{0xa0, 0x77, ZC3XX_R0A4_EXPOSURETIMELOW}, /* 00,a4,77,cc */
5291	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */
5292	{0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},
5293	{0xa0, 0xd0, ZC3XX_R192_EXPOSURELIMITLOW},
5294	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */
5295	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */
5296	{0xa0, 0x7d, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,7d,cc */
5297	{0xa0, 0x0c, ZC3XX_R18C_AEFREEZE},
5298	{0xa0, 0x18, ZC3XX_R18F_AEUNFREEZE},
5299	{0xa0, 0x08, ZC3XX_R1A9_DIGITALLIMITDIFF},
5300	{0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},
5301	{0xa0, 0xf0, ZC3XX_R01D_HSYNC_0}, /* 00,1d,f0,cc */
5302	{0xa0, 0xf4, ZC3XX_R01E_HSYNC_1}, /* 00,1e,f4,cc */
5303	{0xa0, 0xf8, ZC3XX_R01F_HSYNC_2}, /* 00,1f,f8,cc */
5304	{0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,20,ff,cc */
5305	{0xa0, 0x03, ZC3XX_R09F_MAXXHIGH}, /* 00,9f,03,cc */
5306	{0xa0, 0xc0, ZC3XX_R0A0_MAXXLOW},
5307	{0xa0, 0x50, ZC3XX_R11D_GLOBALGAIN},
5308	{}
5309};
5310static const struct usb_action tas5130c_60HZ[] = {
5311	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */
5312	{0xaa, 0xa3, 0x0001}, /* 00,a3,01,aa */
5313	{0xaa, 0xa4, 0x0036}, /* 00,a4,36,aa */
5314	{0xa0, 0x01, ZC3XX_R0A3_EXPOSURETIMEHIGH}, /* 00,a3,01,cc */
5315	{0xa0, 0x36, ZC3XX_R0A4_EXPOSURETIMELOW}, /* 00,a4,36,cc */
5316	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */
5317	{0xa0, 0x05, ZC3XX_R191_EXPOSURELIMITMID},
5318	{0xa0, 0x54, ZC3XX_R192_EXPOSURELIMITLOW},
5319	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */
5320	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */
5321	{0xa0, 0x3e, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,3e,cc */
5322	{0xa0, 0x0c, ZC3XX_R18C_AEFREEZE},
5323	{0xa0, 0x18, ZC3XX_R18F_AEUNFREEZE},
5324	{0xa0, 0x08, ZC3XX_R1A9_DIGITALLIMITDIFF},
5325	{0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},
5326	{0xa0, 0xca, ZC3XX_R01D_HSYNC_0}, /* 00,1d,ca,cc */
5327	{0xa0, 0xd0, ZC3XX_R01E_HSYNC_1}, /* 00,1e,d0,cc */
5328	{0xa0, 0xe0, ZC3XX_R01F_HSYNC_2}, /* 00,1f,e0,cc */
5329	{0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,20,ff,cc */
5330	{0xa0, 0x03, ZC3XX_R09F_MAXXHIGH}, /* 00,9f,03,cc */
5331	{0xa0, 0x28, ZC3XX_R0A0_MAXXLOW},
5332	{0xa0, 0x50, ZC3XX_R11D_GLOBALGAIN},
5333	{}
5334};
5335static const struct usb_action tas5130c_60HZScale[] = {
5336	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */
5337	{0xaa, 0xa3, 0x0001}, /* 00,a3,01,aa */
5338	{0xaa, 0xa4, 0x0077}, /* 00,a4,77,aa */
5339	{0xa0, 0x01, ZC3XX_R0A3_EXPOSURETIMEHIGH}, /* 00,a3,01,cc */
5340	{0xa0, 0x77, ZC3XX_R0A4_EXPOSURETIMELOW}, /* 00,a4,77,cc */
5341	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */
5342	{0xa0, 0x09, ZC3XX_R191_EXPOSURELIMITMID},
5343	{0xa0, 0x47, ZC3XX_R192_EXPOSURELIMITLOW},
5344	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */
5345	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */
5346	{0xa0, 0x7d, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,7d,cc */
5347	{0xa0, 0x0c, ZC3XX_R18C_AEFREEZE},
5348	{0xa0, 0x18, ZC3XX_R18F_AEUNFREEZE},
5349	{0xa0, 0x08, ZC3XX_R1A9_DIGITALLIMITDIFF},
5350	{0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},
5351	{0xa0, 0xc8, ZC3XX_R01D_HSYNC_0}, /* 00,1d,c8,cc */
5352	{0xa0, 0xd0, ZC3XX_R01E_HSYNC_1}, /* 00,1e,d0,cc */
5353	{0xa0, 0xe0, ZC3XX_R01F_HSYNC_2}, /* 00,1f,e0,cc */
5354	{0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,20,ff,cc */
5355	{0xa0, 0x03, ZC3XX_R09F_MAXXHIGH}, /* 00,9f,03,cc */
5356	{0xa0, 0x20, ZC3XX_R0A0_MAXXLOW},
5357	{0xa0, 0x50, ZC3XX_R11D_GLOBALGAIN},
5358	{}
5359};
5360static const struct usb_action tas5130c_NoFliker[] = {
5361	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */
5362	{0xaa, 0xa3, 0x0001}, /* 00,a3,01,aa */
5363	{0xaa, 0xa4, 0x0040}, /* 00,a4,40,aa */
5364	{0xa0, 0x01, ZC3XX_R0A3_EXPOSURETIMEHIGH}, /* 00,a3,01,cc */
5365	{0xa0, 0x40, ZC3XX_R0A4_EXPOSURETIMELOW}, /* 00,a4,40,cc */
5366	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */
5367	{0xa0, 0x05, ZC3XX_R191_EXPOSURELIMITMID},
5368	{0xa0, 0xa0, ZC3XX_R192_EXPOSURELIMITLOW},
5369	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
5370	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},
5371	{0xa0, 0x04, ZC3XX_R197_ANTIFLICKERLOW},
5372	{0xa0, 0x0c, ZC3XX_R18C_AEFREEZE},
5373	{0xa0, 0x18, ZC3XX_R18F_AEUNFREEZE},
5374	{0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,00,cc */
5375	{0xa0, 0x00, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,00,cc */
5376	{0xa0, 0xbc, ZC3XX_R01D_HSYNC_0}, /* 00,1d,bc,cc */
5377	{0xa0, 0xd0, ZC3XX_R01E_HSYNC_1}, /* 00,1e,d0,cc */
5378	{0xa0, 0xe0, ZC3XX_R01F_HSYNC_2}, /* 00,1f,e0,cc */
5379	{0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,20,ff,cc */
5380	{0xa0, 0x02, ZC3XX_R09F_MAXXHIGH}, /* 00,9f,02,cc */
5381	{0xa0, 0xf0, ZC3XX_R0A0_MAXXLOW},
5382	{0xa0, 0x50, ZC3XX_R11D_GLOBALGAIN},
5383	{}
5384};
5385
5386static const struct usb_action tas5130c_NoFlikerScale[] = {
5387	{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */
5388	{0xaa, 0xa3, 0x0001}, /* 00,a3,01,aa */
5389	{0xaa, 0xa4, 0x0090}, /* 00,a4,90,aa */
5390	{0xa0, 0x01, ZC3XX_R0A3_EXPOSURETIMEHIGH}, /* 00,a3,01,cc */
5391	{0xa0, 0x90, ZC3XX_R0A4_EXPOSURETIMELOW}, /* 00,a4,90,cc */
5392	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */
5393	{0xa0, 0x0a, ZC3XX_R191_EXPOSURELIMITMID},
5394	{0xa0, 0x00, ZC3XX_R192_EXPOSURELIMITLOW},
5395	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
5396	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},
5397	{0xa0, 0x04, ZC3XX_R197_ANTIFLICKERLOW},
5398	{0xa0, 0x0c, ZC3XX_R18C_AEFREEZE},
5399	{0xa0, 0x18, ZC3XX_R18F_AEUNFREEZE},
5400	{0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,00,cc */
5401	{0xa0, 0x00, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,00,cc */
5402	{0xa0, 0xbc, ZC3XX_R01D_HSYNC_0}, /* 00,1d,bc,cc */
5403	{0xa0, 0xd0, ZC3XX_R01E_HSYNC_1}, /* 00,1e,d0,cc */
5404	{0xa0, 0xe0, ZC3XX_R01F_HSYNC_2}, /* 00,1f,e0,cc */
5405	{0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,20,ff,cc */
5406	{0xa0, 0x02, ZC3XX_R09F_MAXXHIGH}, /* 00,9f,02,cc */
5407	{0xa0, 0xf0, ZC3XX_R0A0_MAXXLOW},
5408	{0xa0, 0x50, ZC3XX_R11D_GLOBALGAIN},
5409	{}
5410};
5411
5412static const struct usb_action tas5130c_vf0250_InitialScale[] = {
5413	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},		/* 00,00,01,cc, */
5414	{0xa0, 0x02, ZC3XX_R008_CLOCKSETTING},		/* 00,08,02,cc, */
5415	{0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,01,cc, */
5416	{0xa0, 0x10, ZC3XX_R002_CLOCKSELECT},		/* 00,02,00,cc,
5417							 * 0<->10 */
5418	{0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},	/* 00,03,02,cc, */
5419	{0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},		/* 00,04,80,cc, */
5420	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},	/* 00,05,01,cc, */
5421	{0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},	/* 00,06,e0,cc, */
5422	{0xa0, 0x98, ZC3XX_R08B_I2CDEVICEADDR},		/* 00,8b,98,cc, */
5423	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},	/* 00,01,01,cc, */
5424	{0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC},	/* 00,12,03,cc, */
5425	{0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},	/* 00,12,01,cc, */
5426	{0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},		/* 00,98,00,cc, */
5427	{0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},		/* 00,9a,00,cc, */
5428	{0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},		/* 01,1a,00,cc, */
5429	{0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},		/* 01,1c,00,cc, */
5430	{0xa0, 0xe8, ZC3XX_R09C_WINHEIGHTLOW},		/* 00,9c,e6,cc,
5431							 * 6<->8 */
5432	{0xa0, 0x88, ZC3XX_R09E_WINWIDTHLOW},		/* 00,9e,86,cc,
5433							 * 6<->8 */
5434	{0xa0, 0x10, ZC3XX_R087_EXPTIMEMID},		/* 00,87,10,cc, */
5435	{0xa0, 0x98, ZC3XX_R08B_I2CDEVICEADDR},		/* 00,8b,98,cc, */
5436	{0xaa, 0x1b, 0x0024},		/* 00,1b,24,aa, */
5437	{0xdd, 0x00, 0x0080},		/* 00,00,80,dd, */
5438	{0xaa, 0x1b, 0x0000},		/* 00,1b,00,aa, */
5439	{0xaa, 0x13, 0x0002},		/* 00,13,02,aa, */
5440	{0xaa, 0x15, 0x0004},		/* 00,15,04,aa */
5441/*??	{0xaa, 0x01, 0x0000}, */
5442	{0xaa, 0x01, 0x0000},
5443	{0xaa, 0x1a, 0x0000},		/* 00,1a,00,aa, */
5444	{0xaa, 0x1c, 0x0017},		/* 00,1c,17,aa, */
5445	{0xa0, 0x82, ZC3XX_R086_EXPTIMEHIGH},		/* 00,86,82,cc, */
5446	{0xa0, 0x83, ZC3XX_R087_EXPTIMEMID},		/* 00,87,83,cc, */
5447	{0xa0, 0x84, ZC3XX_R088_EXPTIMELOW},		/* 00,88,84,cc, */
5448	{0xaa, 0x05, 0x0010},		/* 00,05,10,aa, */
5449	{0xaa, 0x0a, 0x0000},		/* 00,0a,00,aa, */
5450	{0xaa, 0x0b, 0x00a0},		/* 00,0b,a0,aa, */
5451	{0xaa, 0x0c, 0x0000},		/* 00,0c,00,aa, */
5452	{0xaa, 0x0d, 0x00a0},		/* 00,0d,a0,aa, */
5453	{0xaa, 0x0e, 0x0000},		/* 00,0e,00,aa, */
5454	{0xaa, 0x0f, 0x00a0},		/* 00,0f,a0,aa, */
5455	{0xaa, 0x10, 0x0000},		/* 00,10,00,aa, */
5456	{0xaa, 0x11, 0x00a0},		/* 00,11,a0,aa, */
5457/*??	{0xa0, 0x00, 0x0039},
5458	{0xa1, 0x01, 0x0037}, */
5459	{0xaa, 0x16, 0x0001},		/* 00,16,01,aa, */
5460	{0xaa, 0x17, 0x00e8},		/* 00,17,e6,aa, (e6 -> e8) */
5461	{0xaa, 0x18, 0x0002},		/* 00,18,02,aa, */
5462	{0xaa, 0x19, 0x0088},		/* 00,19,86,aa, */
5463	{0xaa, 0x20, 0x0020},		/* 00,20,20,aa, */
5464	{0xa0, 0xb7, ZC3XX_R101_SENSORCORRECTION},	/* 01,01,b7,cc, */
5465	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},	/* 00,12,05,cc, */
5466	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},		/* 01,00,0d,cc, */
5467	{0xa0, 0x76, ZC3XX_R189_AWBSTATUS},		/* 01,89,76,cc, */
5468	{0xa0, 0x09, 0x01ad},				/* 01,ad,09,cc, */
5469	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},		/* 01,c5,03,cc, */
5470	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},		/* 01,cb,13,cc, */
5471	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},	/* 02,50,08,cc, */
5472	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},		/* 03,01,08,cc, */
5473	{0xa0, 0x60, ZC3XX_R1A8_DIGITALGAIN},		/* 01,a8,60,cc, */
5474	{0xa0, 0x61, ZC3XX_R116_RGAIN},			/* 01,16,61,cc, */
5475	{0xa0, 0x65, ZC3XX_R118_BGAIN},			/* 01,18,65,cc */
5476	{}
5477};
5478
5479static const struct usb_action tas5130c_vf0250_Initial[] = {
5480	{0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},		/* 00,00,01,cc, */
5481	{0xa0, 0x02, ZC3XX_R008_CLOCKSETTING},		/* 00,08,02,cc, */
5482	{0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT},	/* 00,10,01,cc, */
5483	{0xa0, 0x00, ZC3XX_R002_CLOCKSELECT},		/* 00,02,10,cc, */
5484	{0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},	/* 00,03,02,cc, */
5485	{0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},		/* 00,04,80,cc, */
5486	{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},	/* 00,05,01,cc, */
5487	{0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},	/* 00,06,e0,cc, */
5488	{0xa0, 0x98, ZC3XX_R08B_I2CDEVICEADDR},		/* 00,8b,98,cc, */
5489	{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},	/* 00,01,01,cc, */
5490	{0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC},	/* 00,12,03,cc, */
5491	{0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},	/* 00,12,01,cc, */
5492	{0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},		/* 00,98,00,cc, */
5493	{0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},		/* 00,9a,00,cc, */
5494	{0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},		/* 01,1a,00,cc, */
5495	{0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},		/* 01,1c,00,cc, */
5496	{0xa0, 0xe8, ZC3XX_R09C_WINHEIGHTLOW},		/* 00,9c,e8,cc,
5497							 * 8<->6 */
5498	{0xa0, 0x88, ZC3XX_R09E_WINWIDTHLOW},		/* 00,9e,88,cc,
5499							 * 8<->6 */
5500	{0xa0, 0x10, ZC3XX_R087_EXPTIMEMID},		/* 00,87,10,cc, */
5501	{0xa0, 0x98, ZC3XX_R08B_I2CDEVICEADDR},		/* 00,8b,98,cc, */
5502	{0xaa, 0x1b, 0x0024},		/* 00,1b,24,aa, */
5503	{0xdd, 0x00, 0x0080},		/* 00,00,80,dd, */
5504	{0xaa, 0x1b, 0x0000},		/* 00,1b,00,aa, */
5505	{0xaa, 0x13, 0x0002},		/* 00,13,02,aa, */
5506	{0xaa, 0x15, 0x0004},		/* 00,15,04,aa */
5507/*??	{0xaa, 0x01, 0x0000}, */
5508	{0xaa, 0x01, 0x0000},
5509	{0xaa, 0x1a, 0x0000},		/* 00,1a,00,aa, */
5510	{0xaa, 0x1c, 0x0017},		/* 00,1c,17,aa, */
5511	{0xa0, 0x82, ZC3XX_R086_EXPTIMEHIGH},	/* 00,86,82,cc, */
5512	{0xa0, 0x83, ZC3XX_R087_EXPTIMEMID},	/* 00,87,83,cc, */
5513	{0xa0, 0x84, ZC3XX_R088_EXPTIMELOW},	/* 00,88,84,cc, */
5514	{0xaa, 0x05, 0x0010},		/* 00,05,10,aa, */
5515	{0xaa, 0x0a, 0x0000},		/* 00,0a,00,aa, */
5516	{0xaa, 0x0b, 0x00a0},		/* 00,0b,a0,aa, */
5517	{0xaa, 0x0c, 0x0000},		/* 00,0c,00,aa, */
5518	{0xaa, 0x0d, 0x00a0},		/* 00,0d,a0,aa, */
5519	{0xaa, 0x0e, 0x0000},		/* 00,0e,00,aa, */
5520	{0xaa, 0x0f, 0x00a0},		/* 00,0f,a0,aa, */
5521	{0xaa, 0x10, 0x0000},		/* 00,10,00,aa, */
5522	{0xaa, 0x11, 0x00a0},		/* 00,11,a0,aa, */
5523/*??	{0xa0, 0x00, 0x0039},
5524	{0xa1, 0x01, 0x0037}, */
5525	{0xaa, 0x16, 0x0001},		/* 00,16,01,aa, */
5526	{0xaa, 0x17, 0x00e8},		/* 00,17,e6,aa (e6 -> e8) */
5527	{0xaa, 0x18, 0x0002},		/* 00,18,02,aa, */
5528	{0xaa, 0x19, 0x0088},		/* 00,19,88,aa, */
5529	{0xaa, 0x20, 0x0020},		/* 00,20,20,aa, */
5530	{0xa0, 0xb7, ZC3XX_R101_SENSORCORRECTION},	/* 01,01,b7,cc, */
5531	{0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},	/* 00,12,05,cc, */
5532	{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},		/* 01,00,0d,cc, */
5533	{0xa0, 0x76, ZC3XX_R189_AWBSTATUS},		/* 01,89,76,cc, */
5534	{0xa0, 0x09, 0x01ad},				/* 01,ad,09,cc, */
5535	{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},		/* 01,c5,03,cc, */
5536	{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},		/* 01,cb,13,cc, */
5537	{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},	/* 02,50,08,cc, */
5538	{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},		/* 03,01,08,cc, */
5539	{0xa0, 0x60, ZC3XX_R1A8_DIGITALGAIN},		/* 01,a8,60,cc, */
5540	{0xa0, 0x61, ZC3XX_R116_RGAIN},		/* 01,16,61,cc, */
5541	{0xa0, 0x65, ZC3XX_R118_BGAIN},		/* 01,18,65,cc */
5542	{}
5543};
5544static const struct usb_action tas5130c_vf0250_50HZScale[] = {
5545	{0xaa, 0x82, 0x0000},		/* 00,82,00,aa */
5546	{0xaa, 0x83, 0x0001},		/* 00,83,01,aa */
5547	{0xaa, 0x84, 0x00aa},		/* 00,84,aa,aa */
5548	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},	/* 01,90,00,cc, */
5549	{0xa0, 0x06, ZC3XX_R191_EXPOSURELIMITMID},	/* 01,91,0d,cc, */
5550	{0xa0, 0xa8, ZC3XX_R192_EXPOSURELIMITLOW},	/* 01,92,50,cc, */
5551	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},	/* 01,95,00,cc, */
5552	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},	/* 01,96,00,cc, */
5553	{0xa0, 0x8e, ZC3XX_R197_ANTIFLICKERLOW},	/* 01,97,47,cc, */
5554	{0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},		/* 01,8c,0e,cc, */
5555	{0xa0, 0x15, ZC3XX_R18F_AEUNFREEZE},		/* 01,8f,15,cc, */
5556	{0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF},	/* 01,a9,10,cc, */
5557	{0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},	/* 01,aa,24,cc, */
5558	{0xa0, 0x62, ZC3XX_R01D_HSYNC_0},		/* 00,1d,62,cc, */
5559	{0xa0, 0x90, ZC3XX_R01E_HSYNC_1},		/* 00,1e,90,cc, */
5560	{0xa0, 0xc8, ZC3XX_R01F_HSYNC_2},		/* 00,1f,c8,cc, */
5561	{0xa0, 0xff, ZC3XX_R020_HSYNC_3},		/* 00,20,ff,cc, */
5562	{0xa0, 0x58, ZC3XX_R11D_GLOBALGAIN},		/* 01,1d,58,cc, */
5563	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},	/* 01,80,42,cc, */
5564	{0xa0, 0x78, ZC3XX_R18D_YTARGET},		/* 01,8d,78,cc */
5565	{}
5566};
5567
5568static const struct usb_action tas5130c_vf0250_50HZ[] = {
5569	{0xaa, 0x82, 0x0000},		/* 00,82,00,aa */
5570	{0xaa, 0x83, 0x0003},		/* 00,83,03,aa */
5571	{0xaa, 0x84, 0x0054},		/* 00,84,54,aa */
5572	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},	/* 01,90,00,cc, */
5573	{0xa0, 0x0d, ZC3XX_R191_EXPOSURELIMITMID},	/* 01,91,0d,cc, */
5574	{0xa0, 0x50, ZC3XX_R192_EXPOSURELIMITLOW},	/* 01,92,50,cc, */
5575	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},	/* 01,95,00,cc, */
5576	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},	/* 01,96,00,cc, */
5577	{0xa0, 0x8e, ZC3XX_R197_ANTIFLICKERLOW},	/* 01,97,8e,cc, */
5578	{0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},		/* 01,8c,0e,cc, */
5579	{0xa0, 0x15, ZC3XX_R18F_AEUNFREEZE},		/* 01,8f,15,cc, */
5580	{0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF},	/* 01,a9,10,cc, */
5581	{0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},	/* 01,aa,24,cc, */
5582	{0xa0, 0x62, ZC3XX_R01D_HSYNC_0},		/* 00,1d,62,cc, */
5583	{0xa0, 0x90, ZC3XX_R01E_HSYNC_1},		/* 00,1e,90,cc, */
5584	{0xa0, 0xc8, ZC3XX_R01F_HSYNC_2},		/* 00,1f,c8,cc, */
5585	{0xa0, 0xff, ZC3XX_R020_HSYNC_3},		/* 00,20,ff,cc, */
5586	{0xa0, 0x58, ZC3XX_R11D_GLOBALGAIN},		/* 01,1d,58,cc, */
5587	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},	/* 01,80,42,cc, */
5588	{0xa0, 0x78, ZC3XX_R18D_YTARGET},		/* 01,8d,78,cc */
5589	{}
5590};
5591
5592static const struct usb_action tas5130c_vf0250_60HZScale[] = {
5593	{0xaa, 0x82, 0x0000},		/* 00,82,00,aa */
5594	{0xaa, 0x83, 0x0001},		/* 00,83,01,aa */
5595	{0xaa, 0x84, 0x0062},		/* 00,84,62,aa */
5596	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},	/* 01,90,00,cc, */
5597	{0xa0, 0x05, ZC3XX_R191_EXPOSURELIMITMID},	/* 01,91,05,cc, */
5598	{0xa0, 0x88, ZC3XX_R192_EXPOSURELIMITLOW},	/* 01,92,88,cc, */
5599	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},	/* 01,95,00,cc, */
5600	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},	/* 01,96,00,cc, */
5601	{0xa0, 0x3b, ZC3XX_R197_ANTIFLICKERLOW},	/* 01,97,3b,cc, */
5602	{0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},		/* 01,8c,0e,cc, */
5603	{0xa0, 0x15, ZC3XX_R18F_AEUNFREEZE},		/* 01,8f,15,cc, */
5604	{0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF},	/* 01,a9,10,cc, */
5605	{0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},	/* 01,aa,24,cc, */
5606	{0xa0, 0x62, ZC3XX_R01D_HSYNC_0},		/* 00,1d,62,cc, */
5607	{0xa0, 0x90, ZC3XX_R01E_HSYNC_1},		/* 00,1e,90,cc, */
5608	{0xa0, 0xc8, ZC3XX_R01F_HSYNC_2},		/* 00,1f,c8,cc, */
5609	{0xa0, 0xff, ZC3XX_R020_HSYNC_3},		/* 00,20,ff,cc, */
5610	{0xa0, 0x58, ZC3XX_R11D_GLOBALGAIN},		/* 01,1d,58,cc, */
5611	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},	/* 01,80,42,cc, */
5612	{0xa0, 0x78, ZC3XX_R18D_YTARGET},		/* 01,8d,78,cc */
5613	{}
5614};
5615
5616static const struct usb_action tas5130c_vf0250_60HZ[] = {
5617	{0xaa, 0x82, 0x0000},		/* 00,82,00,aa */
5618	{0xaa, 0x83, 0x0002},		/* 00,83,02,aa */
5619	{0xaa, 0x84, 0x00c4},		/* 00,84,c4,aa */
5620	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},	/* 01,90,00,cc, */
5621	{0xa0, 0x0b, ZC3XX_R191_EXPOSURELIMITMID},	/* 01,1,0b,cc, */
5622	{0xa0, 0x10, ZC3XX_R192_EXPOSURELIMITLOW},	/* 01,2,10,cc, */
5623	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},	/* 01,5,00,cc, */
5624	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},	/* 01,6,00,cc, */
5625	{0xa0, 0x76, ZC3XX_R197_ANTIFLICKERLOW},	/* 01,7,76,cc, */
5626	{0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},		/* 01,c,0e,cc, */
5627	{0xa0, 0x15, ZC3XX_R18F_AEUNFREEZE},		/* 01,f,15,cc, */
5628	{0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF},	/* 01,9,10,cc, */
5629	{0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},	/* 01,a,24,cc, */
5630	{0xa0, 0x62, ZC3XX_R01D_HSYNC_0},		/* 00,d,62,cc, */
5631	{0xa0, 0x90, ZC3XX_R01E_HSYNC_1},		/* 00,e,90,cc, */
5632	{0xa0, 0xc8, ZC3XX_R01F_HSYNC_2},		/* 00,f,c8,cc, */
5633	{0xa0, 0xff, ZC3XX_R020_HSYNC_3},		/* 00,0,ff,cc, */
5634	{0xa0, 0x58, ZC3XX_R11D_GLOBALGAIN},		/* 01,d,58,cc, */
5635	{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},	/* 01,80,42,cc, */
5636	{0xa0, 0x78, ZC3XX_R18D_YTARGET},		/* 01,d,78,cc */
5637	{}
5638};
5639
5640static const struct usb_action tas5130c_vf0250_NoFlikerScale[] = {
5641	{0xa0, 0x0c, ZC3XX_R100_OPERATIONMODE},		/* 01,00,0c,cc, */
5642	{0xaa, 0x82, 0x0000},		/* 00,82,00,aa */
5643	{0xaa, 0x83, 0x0000},		/* 00,83,00,aa */
5644	{0xaa, 0x84, 0x0020},		/* 00,84,20,aa */
5645	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},	/* 01,0,00,cc, */
5646	{0xa0, 0x05, ZC3XX_R191_EXPOSURELIMITMID},	/* 01,91,05,cc, */
5647	{0xa0, 0x88, ZC3XX_R192_EXPOSURELIMITLOW},	/* 01,92,88,cc, */
5648	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},	/* 01,95,00,cc, */
5649	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},	/* 01,96,00,cc, */
5650	{0xa0, 0x10, ZC3XX_R197_ANTIFLICKERLOW},	/* 01,97,10,cc, */
5651	{0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},		/* 01,8c,0e,cc, */
5652	{0xa0, 0x15, ZC3XX_R18F_AEUNFREEZE},		/* 01,8f,15,cc, */
5653	{0xa0, 0x62, ZC3XX_R01D_HSYNC_0},		/* 00,1d,62,cc, */
5654	{0xa0, 0x90, ZC3XX_R01E_HSYNC_1},		/* 00,1e,90,cc, */
5655	{0xa0, 0xc8, ZC3XX_R01F_HSYNC_2},		/* 00,1f,c8,cc, */
5656	{0xa0, 0xff, ZC3XX_R020_HSYNC_3},		/* 00,20,ff,cc, */
5657	{0xa0, 0x58, ZC3XX_R11D_GLOBALGAIN},		/* 01,1d,58,cc, */
5658	{0xa0, 0x03, ZC3XX_R180_AUTOCORRECTENABLE},	/* 01,80,03,cc */
5659	{}
5660};
5661
5662static const struct usb_action tas5130c_vf0250_NoFliker[] = {
5663	{0xa0, 0x0c, ZC3XX_R100_OPERATIONMODE},		/* 01,00,0c,cc, */
5664	{0xaa, 0x82, 0x0000},		/* 00,82,00,aa */
5665	{0xaa, 0x83, 0x0000},		/* 00,83,00,aa */
5666	{0xaa, 0x84, 0x0020},		/* 00,84,20,aa */
5667	{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},	/* 01,90,00,cc, */
5668	{0xa0, 0x0b, ZC3XX_R191_EXPOSURELIMITMID},	/* 01,91,0b,cc, */
5669	{0xa0, 0x10, ZC3XX_R192_EXPOSURELIMITLOW},	/* 01,92,10,cc, */
5670	{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},	/* 01,95,00,cc, */
5671	{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},	/* 01,96,00,cc, */
5672	{0xa0, 0x10, ZC3XX_R197_ANTIFLICKERLOW},	/* 01,97,10,cc, */
5673	{0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},		/* 01,8c,0e,cc, */
5674	{0xa0, 0x15, ZC3XX_R18F_AEUNFREEZE},		/* 01,8f,15,cc, */
5675	{0xa0, 0x62, ZC3XX_R01D_HSYNC_0},		/* 00,1d,62,cc, */
5676	{0xa0, 0x90, ZC3XX_R01E_HSYNC_1},		/* 00,1e,90,cc, */
5677	{0xa0, 0xc8, ZC3XX_R01F_HSYNC_2},		/* 00,1f,c8,cc, */
5678	{0xa0, 0xff, ZC3XX_R020_HSYNC_3},		/* 00,20,ff,cc, */
5679	{0xa0, 0x58, ZC3XX_R11D_GLOBALGAIN},		/* 01,1d,58,cc, */
5680	{0xa0, 0x03, ZC3XX_R180_AUTOCORRECTENABLE},	/* 01,80,03,cc */
5681	{}
5682};
5683
5684static u8 reg_r_i(struct gspca_dev *gspca_dev,
5685		u16 index)
5686{
5687	int ret;
5688
5689	if (gspca_dev->usb_err < 0)
5690		return 0;
5691	ret = usb_control_msg(gspca_dev->dev,
5692			usb_rcvctrlpipe(gspca_dev->dev, 0),
5693			0xa1,
5694			USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
5695			0x01,			/* value */
5696			index, gspca_dev->usb_buf, 1,
5697			500);
5698	if (ret < 0) {
5699		PDEBUG(D_ERR, "reg_r_i err %d", ret);
5700		gspca_dev->usb_err = ret;
5701		return 0;
5702	}
5703	return gspca_dev->usb_buf[0];
5704}
5705
5706static u8 reg_r(struct gspca_dev *gspca_dev,
5707		u16 index)
5708{
5709	u8 ret;
5710
5711	ret = reg_r_i(gspca_dev, index);
5712	PDEBUG(D_USBI, "reg r [%04x] -> %02x", index, ret);
5713	return ret;
5714}
5715
5716static void reg_w_i(struct gspca_dev *gspca_dev,
5717			u8 value,
5718			u16 index)
5719{
5720	int ret;
5721
5722	if (gspca_dev->usb_err < 0)
5723		return;
5724	ret = usb_control_msg(gspca_dev->dev,
5725			usb_sndctrlpipe(gspca_dev->dev, 0),
5726			0xa0,
5727			USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
5728			value, index, NULL, 0,
5729			500);
5730	if (ret < 0) {
5731		PDEBUG(D_ERR, "reg_w_i err %d", ret);
5732		gspca_dev->usb_err = ret;
5733	}
5734}
5735
5736static void reg_w(struct gspca_dev *gspca_dev,
5737			u8 value,
5738			u16 index)
5739{
5740	PDEBUG(D_USBO, "reg w [%04x] = %02x", index, value);
5741	reg_w_i(gspca_dev, value, index);
5742}
5743
5744static u16 i2c_read(struct gspca_dev *gspca_dev,
5745			u8 reg)
5746{
5747	u8 retbyte;
5748	u16 retval;
5749
5750	if (gspca_dev->usb_err < 0)
5751		return 0;
5752	reg_w_i(gspca_dev, reg, 0x0092);
5753	reg_w_i(gspca_dev, 0x02, 0x0090);		/* <- read command */
5754	msleep(20);
5755	retbyte = reg_r_i(gspca_dev, 0x0091);		/* read status */
5756	if (retbyte != 0x00)
5757		err("i2c_r status error %02x", retbyte);
5758	retval = reg_r_i(gspca_dev, 0x0095);		/* read Lowbyte */
5759	retval |= reg_r_i(gspca_dev, 0x0096) << 8;	/* read Hightbyte */
5760	PDEBUG(D_USBI, "i2c r [%02x] -> %04x (%02x)",
5761			reg, retval, retbyte);
5762	return retval;
5763}
5764
5765static u8 i2c_write(struct gspca_dev *gspca_dev,
5766			u8 reg,
5767			u8 valL,
5768			u8 valH)
5769{
5770	u8 retbyte;
5771
5772	if (gspca_dev->usb_err < 0)
5773		return 0;
5774	reg_w_i(gspca_dev, reg, 0x92);
5775	reg_w_i(gspca_dev, valL, 0x93);
5776	reg_w_i(gspca_dev, valH, 0x94);
5777	reg_w_i(gspca_dev, 0x01, 0x90);		/* <- write command */
5778	msleep(1);
5779	retbyte = reg_r_i(gspca_dev, 0x0091);		/* read status */
5780	if (retbyte != 0x00)
5781		err("i2c_w status error %02x", retbyte);
5782	PDEBUG(D_USBO, "i2c w [%02x] = %02x%02x (%02x)",
5783			reg, valH, valL, retbyte);
5784	return retbyte;
5785}
5786
5787static void usb_exchange(struct gspca_dev *gspca_dev,
5788			const struct usb_action *action)
5789{
5790	while (action->req) {
5791		switch (action->req) {
5792		case 0xa0:	/* write register */
5793			reg_w(gspca_dev, action->val, action->idx);
5794			break;
5795		case 0xa1:	/* read status */
5796			reg_r(gspca_dev, action->idx);
5797			break;
5798		case 0xaa:
5799			i2c_write(gspca_dev,
5800				  action->val,			/* reg */
5801				  action->idx & 0xff,		/* valL */
5802				  action->idx >> 8);		/* valH */
5803			break;
5804		case 0xbb:
5805			i2c_write(gspca_dev,
5806				  action->idx >> 8,		/* reg */
5807				  action->idx & 0xff,		/* valL */
5808				  action->val);			/* valH */
5809			break;
5810		default:
5811/*		case 0xdd:	 * delay */
5812			msleep(action->val / 64 + 10);
5813			break;
5814		}
5815		action++;
5816		msleep(1);
5817	}
5818}
5819
5820static void setmatrix(struct gspca_dev *gspca_dev)
5821{
5822	struct sd *sd = (struct sd *) gspca_dev;
5823	int i;
5824	const u8 *matrix;
5825	static const u8 adcm2700_matrix[9] =
5826/*		{0x66, 0xed, 0xed, 0xed, 0x66, 0xed, 0xed, 0xed, 0x66}; */
5827/*ms-win*/
5828		{0x74, 0xed, 0xed, 0xed, 0x74, 0xed, 0xed, 0xed, 0x74};
5829	static const u8 gc0305_matrix[9] =
5830		{0x50, 0xf8, 0xf8, 0xf8, 0x50, 0xf8, 0xf8, 0xf8, 0x50};
5831	static const u8 ov7620_matrix[9] =
5832		{0x58, 0xf4, 0xf4, 0xf4, 0x58, 0xf4, 0xf4, 0xf4, 0x58};
5833	static const u8 pas202b_matrix[9] =
5834		{0x4c, 0xf5, 0xff, 0xf9, 0x51, 0xf5, 0xfb, 0xed, 0x5f};
5835	static const u8 po2030_matrix[9] =
5836		{0x60, 0xf0, 0xf0, 0xf0, 0x60, 0xf0, 0xf0, 0xf0, 0x60};
5837	static const u8 tas5130c_matrix[9] =
5838		{0x68, 0xec, 0xec, 0xec, 0x68, 0xec, 0xec, 0xec, 0x68};
5839	static const u8 vf0250_matrix[9] =
5840		{0x7b, 0xea, 0xea, 0xea, 0x7b, 0xea, 0xea, 0xea, 0x7b};
5841	static const u8 *matrix_tb[SENSOR_MAX] = {
5842		[SENSOR_ADCM2700] =	adcm2700_matrix,
5843		[SENSOR_CS2102] =	ov7620_matrix,
5844		[SENSOR_CS2102K] =	NULL,
5845		[SENSOR_GC0305] =	gc0305_matrix,
5846		[SENSOR_HDCS2020b] =	NULL,
5847		[SENSOR_HV7131B] =	NULL,
5848		[SENSOR_HV7131R] =	NULL,
5849		[SENSOR_ICM105A] =	po2030_matrix,
5850		[SENSOR_MC501CB] =	NULL,
5851		[SENSOR_MT9V111_1] =	gc0305_matrix,
5852		[SENSOR_MT9V111_3] =	gc0305_matrix,
5853		[SENSOR_OV7620] =	ov7620_matrix,
5854		[SENSOR_OV7630C] =	NULL,
5855		[SENSOR_PAS106] =	NULL,
5856		[SENSOR_PAS202B] =	pas202b_matrix,
5857		[SENSOR_PB0330] =	gc0305_matrix,
5858		[SENSOR_PO2030] =	po2030_matrix,
5859		[SENSOR_TAS5130C] =	tas5130c_matrix,
5860		[SENSOR_TAS5130C_VF0250] = vf0250_matrix,
5861	};
5862
5863	matrix = matrix_tb[sd->sensor];
5864	if (matrix == NULL)
5865		return;		/* matrix already loaded */
5866	for (i = 0; i < ARRAY_SIZE(ov7620_matrix); i++)
5867		reg_w(gspca_dev, matrix[i], 0x010a + i);
5868}
5869
5870static void setsharpness(struct gspca_dev *gspca_dev)
5871{
5872	struct sd *sd = (struct sd *) gspca_dev;
5873	int sharpness;
5874	static const u8 sharpness_tb[][2] = {
5875		{0x02, 0x03},
5876		{0x04, 0x07},
5877		{0x08, 0x0f},
5878		{0x10, 0x1e}
5879	};
5880
5881	sharpness = sd->sharpness;
5882	reg_w(gspca_dev, sharpness_tb[sharpness][0], 0x01c6);
5883	reg_r(gspca_dev, 0x01c8);
5884	reg_r(gspca_dev, 0x01c9);
5885	reg_r(gspca_dev, 0x01ca);
5886	reg_w(gspca_dev, sharpness_tb[sharpness][1], 0x01cb);
5887}
5888
5889static void setcontrast(struct gspca_dev *gspca_dev)
5890{
5891	struct sd *sd = (struct sd *) gspca_dev;
5892	const u8 *Tgamma;
5893	int g, i, brightness, contrast, adj, gp1, gp2;
5894	u8 gr[16];
5895	static const u8 delta_b[16] =		/* delta for brightness */
5896		{0x50, 0x38, 0x2d, 0x28, 0x24, 0x21, 0x1e, 0x1d,
5897		 0x1d, 0x1b, 0x1b, 0x1b, 0x19, 0x18, 0x18, 0x18};
5898	static const u8 delta_c[16] =		/* delta for contrast */
5899		{0x2c, 0x1a, 0x12, 0x0c, 0x0a, 0x06, 0x06, 0x06,
5900		 0x04, 0x06, 0x04, 0x04, 0x03, 0x03, 0x02, 0x02};
5901	static const u8 gamma_tb[6][16] = {
5902		{0x00, 0x00, 0x03, 0x0d, 0x1b, 0x2e, 0x45, 0x5f,
5903		 0x79, 0x93, 0xab, 0xc1, 0xd4, 0xe5, 0xf3, 0xff},
5904		{0x01, 0x0c, 0x1f, 0x3a, 0x53, 0x6d, 0x85, 0x9c,
5905		 0xb0, 0xc2, 0xd1, 0xde, 0xe9, 0xf2, 0xf9, 0xff},
5906		{0x04, 0x16, 0x30, 0x4e, 0x68, 0x81, 0x98, 0xac,
5907		 0xbe, 0xcd, 0xda, 0xe4, 0xed, 0xf5, 0xfb, 0xff},
5908		{0x13, 0x38, 0x59, 0x79, 0x92, 0xa7, 0xb9, 0xc8,
5909		 0xd4, 0xdf, 0xe7, 0xee, 0xf4, 0xf9, 0xfc, 0xff},
5910		{0x20, 0x4b, 0x6e, 0x8d, 0xa3, 0xb5, 0xc5, 0xd2,
5911		 0xdc, 0xe5, 0xec, 0xf2, 0xf6, 0xfa, 0xfd, 0xff},
5912		{0x24, 0x44, 0x64, 0x84, 0x9d, 0xb2, 0xc4, 0xd3,
5913		 0xe0, 0xeb, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff},
5914	};
5915
5916	Tgamma = gamma_tb[sd->gamma - 1];
5917
5918	contrast = ((int) sd->contrast - 128);		/* -128 / 127 */
5919	brightness = ((int) sd->brightness - 128);	/* -128 / 92 */
5920	adj = 0;
5921	gp1 = gp2 = 0;
5922	for (i = 0; i < 16; i++) {
5923		g = Tgamma[i] + delta_b[i] * brightness / 256
5924				- delta_c[i] * contrast / 256 - adj / 2;
5925		if (g > 0xff)
5926			g = 0xff;
5927		else if (g < 0)
5928			g = 0;
5929		reg_w(gspca_dev, g, 0x0120 + i);	/* gamma */
5930		if (contrast > 0)
5931			adj--;
5932		else if (contrast < 0)
5933			adj++;
5934		if (i > 1)
5935			gr[i - 1] = (g - gp2) / 2;
5936		else if (i != 0)
5937			gr[0] = gp1 == 0 ? 0 : (g - gp1);
5938		gp2 = gp1;
5939		gp1 = g;
5940	}
5941	gr[15] = (0xff - gp2) / 2;
5942	for (i = 0; i < 16; i++)
5943		reg_w(gspca_dev, gr[i], 0x0130 + i);	/* gradient */
5944}
5945
5946static void setquality(struct gspca_dev *gspca_dev)
5947{
5948	struct sd *sd = (struct sd *) gspca_dev;
5949	u8 frxt;
5950
5951	switch (sd->sensor) {
5952	case SENSOR_ADCM2700:
5953	case SENSOR_GC0305:
5954	case SENSOR_HV7131B:
5955	case SENSOR_OV7620:
5956	case SENSOR_PAS202B:
5957	case SENSOR_PO2030:
5958		return;
5959	}
5960	reg_w(gspca_dev, QUANT_VAL, 0x0008);
5961	frxt = 0x30;
5962	reg_w(gspca_dev, frxt, 0x0007);
5963#if QUANT_VAL == QUANT_VAL == 1 == 2
5964	frxt = 0xff;
5965#elif QUANT_VAL == 3
5966	frxt = 0xf0;
5967#elif QUANT_VAL == 4
5968	frxt = 0xe0;
5969#else
5970	frxt = 0x20;
5971#endif
5972	reg_w(gspca_dev, frxt, 0x0018);
5973}
5974
5975/* Matches the sensor's internal frame rate to the lighting frequency.
5976 * Valid frequencies are:
5977 *	50Hz, for European and Asian lighting (default)
5978 *	60Hz, for American lighting
5979 *	0 = No Fliker (for outdoore usage)
5980 */
5981static void setlightfreq(struct gspca_dev *gspca_dev)
5982{
5983	struct sd *sd = (struct sd *) gspca_dev;
5984	int i, mode;
5985	const struct usb_action *zc3_freq;
5986	static const struct usb_action *freq_tb[SENSOR_MAX][6] = {
5987	[SENSOR_ADCM2700] =
5988		{adcm2700_NoFliker, adcm2700_NoFliker,
5989		 adcm2700_50HZ, adcm2700_50HZ,
5990		 adcm2700_60HZ, adcm2700_60HZ},
5991	[SENSOR_CS2102] =
5992		{cs2102_NoFliker, cs2102_NoFlikerScale,
5993		 cs2102_50HZ, cs2102_50HZScale,
5994		 cs2102_60HZ, cs2102_60HZScale},
5995	[SENSOR_CS2102K] =
5996		{cs2102_NoFliker, cs2102_NoFlikerScale,
5997		 NULL, NULL, /* currently disabled */
5998		 NULL, NULL},
5999	[SENSOR_GC0305] =
6000		{gc0305_NoFliker, gc0305_NoFliker,
6001		 gc0305_50HZ, gc0305_50HZ,
6002		 gc0305_60HZ, gc0305_60HZ},
6003	[SENSOR_HDCS2020b] =
6004		{hdcs2020b_NoFliker, hdcs2020b_NoFliker,
6005		 hdcs2020b_50HZ, hdcs2020b_50HZ,
6006		 hdcs2020b_60HZ, hdcs2020b_60HZ},
6007	[SENSOR_HV7131B] =
6008		{hv7131b_NoFliker, hv7131b_NoFlikerScale,
6009		 hv7131b_50HZ, hv7131b_50HZScale,
6010		 hv7131b_60HZ, hv7131b_60HZScale},
6011	[SENSOR_HV7131R] =
6012		{hv7131r_NoFliker, hv7131r_NoFlikerScale,
6013		 hv7131r_50HZ, hv7131r_50HZScale,
6014		 hv7131r_60HZ, hv7131r_60HZScale},
6015	[SENSOR_ICM105A] =
6016		{icm105a_NoFliker, icm105a_NoFlikerScale,
6017		 icm105a_50HZ, icm105a_50HZScale,
6018		 icm105a_60HZ, icm105a_60HZScale},
6019	[SENSOR_MC501CB] =
6020		{mc501cb_NoFliker, mc501cb_NoFlikerScale,
6021		 mc501cb_50HZ, mc501cb_50HZScale,
6022		 mc501cb_60HZ, mc501cb_60HZScale},
6023	[SENSOR_MT9V111_1] =
6024		{mt9v111_1_AENoFliker, mt9v111_1_AENoFlikerScale,
6025		 mt9v111_1_AE50HZ, mt9v111_1_AE50HZScale,
6026		 mt9v111_1_AE60HZ, mt9v111_1_AE60HZScale},
6027	[SENSOR_MT9V111_3] =
6028		{mt9v111_3_AENoFliker, mt9v111_3_AENoFlikerScale,
6029		 mt9v111_3_AE50HZ, mt9v111_3_AE50HZScale,
6030		 mt9v111_3_AE60HZ, mt9v111_3_AE60HZScale},
6031	[SENSOR_OV7620] =
6032		{ov7620_NoFliker, ov7620_NoFliker,
6033		 ov7620_50HZ, ov7620_50HZ,
6034		 ov7620_60HZ, ov7620_60HZ},
6035	[SENSOR_OV7630C] =
6036		{NULL, NULL,
6037		 NULL, NULL,
6038		 NULL, NULL},
6039	[SENSOR_PAS106] =
6040		{pas106b_NoFliker, pas106b_NoFliker,
6041		 pas106b_50HZ, pas106b_50HZ,
6042		 pas106b_60HZ, pas106b_60HZ},
6043	[SENSOR_PAS202B] =
6044		{pas202b_NoFliker, pas202b_NoFlikerScale,
6045		 pas202b_50HZ, pas202b_50HZScale,
6046		 pas202b_60HZ, pas202b_60HZScale},
6047	[SENSOR_PB0330] =
6048		{pb0330_NoFliker, pb0330_NoFlikerScale,
6049		 pb0330_50HZ, pb0330_50HZScale,
6050		 pb0330_60HZ, pb0330_60HZScale},
6051	[SENSOR_PO2030] =
6052		{po2030_NoFliker, po2030_NoFliker,
6053		 po2030_50HZ, po2030_50HZ,
6054		 po2030_60HZ, po2030_60HZ},
6055	[SENSOR_TAS5130C] =
6056		{tas5130c_NoFliker, tas5130c_NoFlikerScale,
6057		 tas5130c_50HZ, tas5130c_50HZScale,
6058		 tas5130c_60HZ, tas5130c_60HZScale},
6059	[SENSOR_TAS5130C_VF0250] =
6060		{tas5130c_vf0250_NoFliker, tas5130c_vf0250_NoFlikerScale,
6061		 tas5130c_vf0250_50HZ, tas5130c_vf0250_50HZScale,
6062		 tas5130c_vf0250_60HZ, tas5130c_vf0250_60HZScale},
6063	};
6064
6065	i = sd->lightfreq * 2;
6066	mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv;
6067	if (mode)
6068		i++;			/* 320x240 */
6069	zc3_freq = freq_tb[sd->sensor][i];
6070	if (zc3_freq == NULL)
6071		return;
6072	usb_exchange(gspca_dev, zc3_freq);
6073	switch (sd->sensor) {
6074	case SENSOR_GC0305:
6075		if (mode			/* if 320x240 */
6076		    && sd->lightfreq == 1)	/* and 50Hz */
6077			reg_w(gspca_dev, 0x85, 0x018d);
6078					/* win: 0x80, 0x018d */
6079		break;
6080	case SENSOR_OV7620:
6081		if (!mode) {			/* if 640x480 */
6082			if (sd->lightfreq != 0)	/* and 50 or 60 Hz */
6083				reg_w(gspca_dev, 0x40, 0x0002);
6084			else
6085				reg_w(gspca_dev, 0x44, 0x0002);
6086		}
6087		break;
6088	case SENSOR_PAS202B:
6089		reg_w(gspca_dev, 0x00, 0x01a7);
6090		break;
6091	}
6092}
6093
6094static void setautogain(struct gspca_dev *gspca_dev)
6095{
6096	struct sd *sd = (struct sd *) gspca_dev;
6097	u8 autoval;
6098
6099	if (sd->autogain)
6100		autoval = 0x42;
6101	else
6102		autoval = 0x02;
6103	reg_w(gspca_dev, autoval, 0x0180);
6104}
6105
6106static void send_unknown(struct gspca_dev *gspca_dev, int sensor)
6107{
6108	reg_w(gspca_dev, 0x01, 0x0000);		/* led off */
6109	switch (sensor) {
6110	case SENSOR_PAS106:
6111		reg_w(gspca_dev, 0x03, 0x003a);
6112		reg_w(gspca_dev, 0x0c, 0x003b);
6113		reg_w(gspca_dev, 0x08, 0x0038);
6114		break;
6115	case SENSOR_ADCM2700:
6116	case SENSOR_GC0305:
6117	case SENSOR_OV7620:
6118	case SENSOR_MT9V111_1:
6119	case SENSOR_MT9V111_3:
6120	case SENSOR_PB0330:
6121	case SENSOR_PO2030:
6122		reg_w(gspca_dev, 0x0d, 0x003a);
6123		reg_w(gspca_dev, 0x02, 0x003b);
6124		reg_w(gspca_dev, 0x00, 0x0038);
6125		break;
6126	case SENSOR_PAS202B:
6127		reg_w(gspca_dev, 0x03, 0x003b);
6128		reg_w(gspca_dev, 0x0c, 0x003a);
6129		reg_w(gspca_dev, 0x0b, 0x0039);
6130		reg_w(gspca_dev, 0x0b, 0x0038);
6131		break;
6132	}
6133}
6134
6135/* start probe 2 wires */
6136static void start_2wr_probe(struct gspca_dev *gspca_dev, int sensor)
6137{
6138	reg_w(gspca_dev, 0x01, 0x0000);
6139	reg_w(gspca_dev, sensor, 0x0010);
6140	reg_w(gspca_dev, 0x01, 0x0001);
6141	reg_w(gspca_dev, 0x03, 0x0012);
6142	reg_w(gspca_dev, 0x01, 0x0012);
6143/*	msleep(2); */
6144}
6145
6146static int sif_probe(struct gspca_dev *gspca_dev)
6147{
6148	u16 checkword;
6149
6150	start_2wr_probe(gspca_dev, 0x0f);		/* PAS106 */
6151	reg_w(gspca_dev, 0x08, 0x008d);
6152	msleep(150);
6153	checkword = ((i2c_read(gspca_dev, 0x00) & 0x0f) << 4)
6154			| ((i2c_read(gspca_dev, 0x01) & 0xf0) >> 4);
6155	PDEBUG(D_PROBE, "probe sif 0x%04x", checkword);
6156	if (checkword == 0x0007) {
6157		send_unknown(gspca_dev, SENSOR_PAS106);
6158		return 0x0f;			/* PAS106 */
6159	}
6160	return -1;
6161}
6162
6163static int vga_2wr_probe(struct gspca_dev *gspca_dev)
6164{
6165	u16 retword;
6166
6167	start_2wr_probe(gspca_dev, 0x00);	/* HV7131B */
6168	i2c_write(gspca_dev, 0x01, 0xaa, 0x00);
6169	retword = i2c_read(gspca_dev, 0x01);
6170	if (retword != 0)
6171		return 0x00;			/* HV7131B */
6172
6173	start_2wr_probe(gspca_dev, 0x04);	/* CS2102 */
6174	i2c_write(gspca_dev, 0x01, 0xaa, 0x00);
6175	retword = i2c_read(gspca_dev, 0x01);
6176	if (retword != 0)
6177		return 0x04;			/* CS2102 */
6178
6179	start_2wr_probe(gspca_dev, 0x06);	/* OmniVision */
6180	reg_w(gspca_dev, 0x08, 0x008d);
6181	i2c_write(gspca_dev, 0x11, 0xaa, 0x00);
6182	retword = i2c_read(gspca_dev, 0x11);
6183	if (retword != 0) {
6184		/* (should have returned 0xaa) --> Omnivision? */
6185		/* reg_r 0x10 -> 0x06 -->  */
6186		goto ov_check;
6187	}
6188
6189	start_2wr_probe(gspca_dev, 0x08);	/* HDCS2020 */
6190	i2c_write(gspca_dev, 0x1c, 0x00, 0x00);
6191	i2c_write(gspca_dev, 0x15, 0xaa, 0x00);
6192	retword = i2c_read(gspca_dev, 0x15);
6193	if (retword != 0)
6194		return 0x08;			/* HDCS2020 */
6195
6196	start_2wr_probe(gspca_dev, 0x0a);	/* PB0330 */
6197	i2c_write(gspca_dev, 0x07, 0xaa, 0xaa);
6198	retword = i2c_read(gspca_dev, 0x07);
6199	if (retword != 0)
6200		return 0x0a;			/* PB0330 */
6201	retword = i2c_read(gspca_dev, 0x03);
6202	if (retword != 0)
6203		return 0x0a;			/* PB0330 ?? */
6204	retword = i2c_read(gspca_dev, 0x04);
6205	if (retword != 0)
6206		return 0x0a;			/* PB0330 ?? */
6207
6208	start_2wr_probe(gspca_dev, 0x0c);	/* ICM105A */
6209	i2c_write(gspca_dev, 0x01, 0x11, 0x00);
6210	retword = i2c_read(gspca_dev, 0x01);
6211	if (retword != 0)
6212		return 0x0c;			/* ICM105A */
6213
6214	start_2wr_probe(gspca_dev, 0x0e);	/* PAS202BCB */
6215	reg_w(gspca_dev, 0x08, 0x008d);
6216	i2c_write(gspca_dev, 0x03, 0xaa, 0x00);
6217	msleep(50);
6218	retword = i2c_read(gspca_dev, 0x03);
6219	if (retword != 0) {
6220		send_unknown(gspca_dev, SENSOR_PAS202B);
6221		return 0x0e;			/* PAS202BCB */
6222	}
6223
6224	start_2wr_probe(gspca_dev, 0x02);	/* TAS5130C */
6225	i2c_write(gspca_dev, 0x01, 0xaa, 0x00);
6226	retword = i2c_read(gspca_dev, 0x01);
6227	if (retword != 0)
6228		return 0x02;			/* TAS5130C */
6229ov_check:
6230	reg_r(gspca_dev, 0x0010);		/* ?? */
6231	reg_r(gspca_dev, 0x0010);
6232
6233	reg_w(gspca_dev, 0x01, 0x0000);
6234	reg_w(gspca_dev, 0x01, 0x0001);
6235	reg_w(gspca_dev, 0x06, 0x0010);		/* OmniVision */
6236	reg_w(gspca_dev, 0xa1, 0x008b);
6237	reg_w(gspca_dev, 0x08, 0x008d);
6238	msleep(500);
6239	reg_w(gspca_dev, 0x01, 0x0012);
6240	i2c_write(gspca_dev, 0x12, 0x80, 0x00);	/* sensor reset */
6241	retword = i2c_read(gspca_dev, 0x0a) << 8;
6242	retword |= i2c_read(gspca_dev, 0x0b);
6243	PDEBUG(D_PROBE, "probe 2wr ov vga 0x%04x", retword);
6244	switch (retword) {
6245	case 0x7631:				/* OV7630C */
6246		reg_w(gspca_dev, 0x06, 0x0010);
6247		break;
6248	case 0x7620:				/* OV7620 */
6249	case 0x7648:				/* OV7648 */
6250		break;
6251	default:
6252		return -1;			/* not OmniVision */
6253	}
6254	return retword;
6255}
6256
6257struct sensor_by_chipset_revision {
6258	u16 revision;
6259	u8 internal_sensor_id;
6260};
6261static const struct sensor_by_chipset_revision chipset_revision_sensor[] = {
6262	{0xc000, 0x12},		/* TAS5130C */
6263	{0xc001, 0x13},		/* MT9V111 */
6264	{0xe001, 0x13},
6265	{0x8001, 0x13},
6266	{0x8000, 0x14},		/* CS2102K */
6267	{0x8400, 0x15},		/* MT9V111 */
6268	{0xe400, 0x15},
6269};
6270
6271static int vga_3wr_probe(struct gspca_dev *gspca_dev)
6272{
6273	struct sd *sd = (struct sd *) gspca_dev;
6274	int i;
6275	u8 retbyte;
6276	u16 retword;
6277
6278	reg_w(gspca_dev, 0x02, 0x0010);
6279	reg_r(gspca_dev, 0x0010);
6280	reg_w(gspca_dev, 0x01, 0x0000);
6281	reg_w(gspca_dev, 0x00, 0x0010);
6282	reg_w(gspca_dev, 0x01, 0x0001);
6283	reg_w(gspca_dev, 0x91, 0x008b);
6284	reg_w(gspca_dev, 0x03, 0x0012);
6285	reg_w(gspca_dev, 0x01, 0x0012);
6286	reg_w(gspca_dev, 0x05, 0x0012);
6287	retword = i2c_read(gspca_dev, 0x14);
6288	if (retword != 0)
6289		return 0x11;			/* HV7131R */
6290	retword = i2c_read(gspca_dev, 0x15);
6291	if (retword != 0)
6292		return 0x11;			/* HV7131R */
6293	retword = i2c_read(gspca_dev, 0x16);
6294	if (retword != 0)
6295		return 0x11;			/* HV7131R */
6296
6297	reg_w(gspca_dev, 0x02, 0x0010);
6298	retword = reg_r(gspca_dev, 0x000b) << 8;
6299	retword |= reg_r(gspca_dev, 0x000a);
6300	PDEBUG(D_PROBE, "probe 3wr vga 1 0x%04x", retword);
6301	reg_r(gspca_dev, 0x0010);
6302	if ((retword & 0xff00) == 0x6400)
6303		return 0x02;		/* TAS5130C */
6304	for (i = 0; i < ARRAY_SIZE(chipset_revision_sensor); i++) {
6305		if (chipset_revision_sensor[i].revision == retword) {
6306			sd->chip_revision = retword;
6307			send_unknown(gspca_dev, SENSOR_PB0330);
6308			return chipset_revision_sensor[i]
6309						.internal_sensor_id;
6310		}
6311	}
6312
6313	reg_w(gspca_dev, 0x01, 0x0000);	/* check PB0330 */
6314	reg_w(gspca_dev, 0x01, 0x0001);
6315	reg_w(gspca_dev, 0xdd, 0x008b);
6316	reg_w(gspca_dev, 0x0a, 0x0010);
6317	reg_w(gspca_dev, 0x03, 0x0012);
6318	reg_w(gspca_dev, 0x01, 0x0012);
6319	retword = i2c_read(gspca_dev, 0x00);
6320	if (retword != 0) {
6321		PDEBUG(D_PROBE, "probe 3wr vga type 0a");
6322		return 0x0a;			/* PB0330 */
6323	}
6324
6325	reg_w(gspca_dev, 0x01, 0x0000);
6326	reg_w(gspca_dev, 0x01, 0x0001);
6327	reg_w(gspca_dev, 0x98, 0x008b);
6328	reg_w(gspca_dev, 0x01, 0x0010);
6329	reg_w(gspca_dev, 0x03, 0x0012);
6330	msleep(2);
6331	reg_w(gspca_dev, 0x01, 0x0012);
6332	retword = i2c_read(gspca_dev, 0x00);
6333	if (retword != 0) {
6334		PDEBUG(D_PROBE, "probe 3wr vga type %02x", retword);
6335		if (retword == 0x0011)			/* VF0250 */
6336			return 0x0250;
6337		if (retword == 0x0029)			/* gc0305 */
6338			send_unknown(gspca_dev, SENSOR_GC0305);
6339		return retword;
6340	}
6341
6342	reg_w(gspca_dev, 0x01, 0x0000);	/* check OmniVision */
6343	reg_w(gspca_dev, 0x01, 0x0001);
6344	reg_w(gspca_dev, 0xa1, 0x008b);
6345	reg_w(gspca_dev, 0x08, 0x008d);
6346	reg_w(gspca_dev, 0x06, 0x0010);
6347	reg_w(gspca_dev, 0x01, 0x0012);
6348	reg_w(gspca_dev, 0x05, 0x0012);
6349	if (i2c_read(gspca_dev, 0x1c) == 0x007f	/* OV7610 - manufacturer ID */
6350	    && i2c_read(gspca_dev, 0x1d) == 0x00a2) {
6351		send_unknown(gspca_dev, SENSOR_OV7620);
6352		return 0x06;		/* OmniVision confirm ? */
6353	}
6354
6355	reg_w(gspca_dev, 0x01, 0x0000);
6356	reg_w(gspca_dev, 0x00, 0x0002);
6357	reg_w(gspca_dev, 0x01, 0x0010);
6358	reg_w(gspca_dev, 0x01, 0x0001);
6359	reg_w(gspca_dev, 0xee, 0x008b);
6360	reg_w(gspca_dev, 0x03, 0x0012);
6361	reg_w(gspca_dev, 0x01, 0x0012);
6362	reg_w(gspca_dev, 0x05, 0x0012);
6363	retword = i2c_read(gspca_dev, 0x00) << 8;	/* ID 0 */
6364	retword |= i2c_read(gspca_dev, 0x01);		/* ID 1 */
6365	PDEBUG(D_PROBE, "probe 3wr vga 2 0x%04x", retword);
6366	if (retword == 0x2030) {
6367		retbyte = i2c_read(gspca_dev, 0x02);	/* revision number */
6368		PDEBUG(D_PROBE, "sensor PO2030 rev 0x%02x", retbyte);
6369		send_unknown(gspca_dev, SENSOR_PO2030);
6370		return retword;
6371	}
6372
6373	reg_w(gspca_dev, 0x01, 0x0000);
6374	reg_w(gspca_dev, 0x0a, 0x0010);
6375	reg_w(gspca_dev, 0xd3, 0x008b);
6376	reg_w(gspca_dev, 0x01, 0x0001);
6377	reg_w(gspca_dev, 0x03, 0x0012);
6378	reg_w(gspca_dev, 0x01, 0x0012);
6379	reg_w(gspca_dev, 0x05, 0x0012);
6380	reg_w(gspca_dev, 0xd3, 0x008b);
6381	retword = i2c_read(gspca_dev, 0x01);
6382	if (retword != 0) {
6383		PDEBUG(D_PROBE, "probe 3wr vga type 0a ? ret: %04x", retword);
6384		return 0x16;			/* adcm2700 (6100/6200) */
6385	}
6386	return -1;
6387}
6388
6389static int zcxx_probeSensor(struct gspca_dev *gspca_dev)
6390{
6391	struct sd *sd = (struct sd *) gspca_dev;
6392	int sensor;
6393
6394	switch (sd->sensor) {
6395	case SENSOR_MC501CB:
6396		return -1;		/* don't probe */
6397	case SENSOR_TAS5130C_VF0250:
6398			/* may probe but with no write in reg 0x0010 */
6399		return -1;		/* don't probe */
6400	case SENSOR_PAS106:
6401		sensor =  sif_probe(gspca_dev);
6402		if (sensor >= 0)
6403			return sensor;
6404		break;
6405	}
6406	sensor = vga_2wr_probe(gspca_dev);
6407	if (sensor >= 0)
6408		return sensor;
6409	return vga_3wr_probe(gspca_dev);
6410}
6411
6412/* this function is called at probe time */
6413static int sd_config(struct gspca_dev *gspca_dev,
6414			const struct usb_device_id *id)
6415{
6416	struct sd *sd = (struct sd *) gspca_dev;
6417
6418	if (id->idProduct == 0x301b)
6419		sd->bridge = BRIDGE_ZC301;
6420	else
6421		sd->bridge = BRIDGE_ZC303;
6422
6423	/* define some sensors from the vendor/product */
6424	sd->sensor = id->driver_info;
6425
6426	sd->sharpness = SHARPNESS_DEF;
6427	sd->brightness = BRIGHTNESS_DEF;
6428	sd->contrast = CONTRAST_DEF;
6429	sd->autogain = AUTOGAIN_DEF;
6430	sd->lightfreq = FREQ_DEF;
6431	sd->quality = QUALITY_DEF;
6432
6433	return 0;
6434}
6435
6436/* this function is called at probe and resume time */
6437static int sd_init(struct gspca_dev *gspca_dev)
6438{
6439	struct sd *sd = (struct sd *) gspca_dev;
6440	struct cam *cam;
6441	int sensor;
6442	static const u8 gamma[SENSOR_MAX] = {
6443		[SENSOR_ADCM2700] =	4,
6444		[SENSOR_CS2102] =	4,
6445		[SENSOR_CS2102K] =	5,
6446		[SENSOR_GC0305] =	4,
6447		[SENSOR_HDCS2020b] =	4,
6448		[SENSOR_HV7131B] =	4,
6449		[SENSOR_HV7131R] =	4,
6450		[SENSOR_ICM105A] =	4,
6451		[SENSOR_MC501CB] =	4,
6452		[SENSOR_MT9V111_1] =	4,
6453		[SENSOR_MT9V111_3] =	4,
6454		[SENSOR_OV7620] =	3,
6455		[SENSOR_OV7630C] =	4,
6456		[SENSOR_PAS106] =	4,
6457		[SENSOR_PAS202B] =	4,
6458		[SENSOR_PB0330] =	4,
6459		[SENSOR_PO2030] =	4,
6460		[SENSOR_TAS5130C] =	3,
6461		[SENSOR_TAS5130C_VF0250] = 3,
6462	};
6463	static const u8 mode_tb[SENSOR_MAX] = {
6464		[SENSOR_ADCM2700] =	2,
6465		[SENSOR_CS2102] =	1,
6466		[SENSOR_CS2102K] =	1,
6467		[SENSOR_GC0305] =	1,
6468		[SENSOR_HDCS2020b] =	1,
6469		[SENSOR_HV7131B] =	1,
6470		[SENSOR_HV7131R] =	1,
6471		[SENSOR_ICM105A] =	1,
6472		[SENSOR_MC501CB] =	2,
6473		[SENSOR_MT9V111_1] =	1,
6474		[SENSOR_MT9V111_3] =	1,
6475		[SENSOR_OV7620] =	2,
6476		[SENSOR_OV7630C] =	1,
6477		[SENSOR_PAS106] =	0,
6478		[SENSOR_PAS202B] =	1,
6479		[SENSOR_PB0330] =	1,
6480		[SENSOR_PO2030] =	1,
6481		[SENSOR_TAS5130C] =	1,
6482		[SENSOR_TAS5130C_VF0250] = 1,
6483	};
6484
6485	sensor = zcxx_probeSensor(gspca_dev);
6486	if (sensor >= 0)
6487		PDEBUG(D_PROBE, "probe sensor -> %04x", sensor);
6488	if ((unsigned) force_sensor < SENSOR_MAX) {
6489		sd->sensor = force_sensor;
6490		PDEBUG(D_PROBE, "sensor forced to %d", force_sensor);
6491	} else {
6492		switch (sensor) {
6493		case -1:
6494			switch (sd->sensor) {
6495			case SENSOR_MC501CB:
6496				PDEBUG(D_PROBE, "Sensor MC501CB");
6497				break;
6498			case SENSOR_TAS5130C_VF0250:
6499				PDEBUG(D_PROBE, "Sensor Tas5130 (VF0250)");
6500				break;
6501			default:
6502				PDEBUG(D_PROBE,
6503					"Unknown sensor - set to TAS5130C");
6504				sd->sensor = SENSOR_TAS5130C;
6505			}
6506			break;
6507		case 0:
6508			/* check the sensor type */
6509			sensor = i2c_read(gspca_dev, 0x00);
6510			PDEBUG(D_PROBE, "Sensor hv7131 type %d", sensor);
6511			switch (sensor) {
6512			case 0:			/* hv7131b */
6513			case 1:			/* hv7131e */
6514				PDEBUG(D_PROBE, "Find Sensor HV7131B");
6515				sd->sensor = SENSOR_HV7131B;
6516				break;
6517			default:
6518/*			case 2:			 * hv7131r */
6519				PDEBUG(D_PROBE, "Find Sensor HV7131R");
6520				sd->sensor = SENSOR_HV7131R;
6521				break;
6522			}
6523			break;
6524		case 0x02:
6525			PDEBUG(D_PROBE, "Sensor TAS5130C");
6526			sd->sensor = SENSOR_TAS5130C;
6527			break;
6528		case 0x04:
6529			PDEBUG(D_PROBE, "Find Sensor CS2102");
6530			sd->sensor = SENSOR_CS2102;
6531			break;
6532		case 0x08:
6533			PDEBUG(D_PROBE, "Find Sensor HDCS2020(b)");
6534			sd->sensor = SENSOR_HDCS2020b;
6535			break;
6536		case 0x0a:
6537			PDEBUG(D_PROBE,
6538				"Find Sensor PB0330. Chip revision %x",
6539				sd->chip_revision);
6540			sd->sensor = SENSOR_PB0330;
6541			break;
6542		case 0x0c:
6543			PDEBUG(D_PROBE, "Find Sensor ICM105A");
6544			sd->sensor = SENSOR_ICM105A;
6545			break;
6546		case 0x0e:
6547			PDEBUG(D_PROBE, "Find Sensor PAS202B");
6548			sd->sensor = SENSOR_PAS202B;
6549/*			sd->sharpness = 1; */
6550			break;
6551		case 0x0f:
6552			PDEBUG(D_PROBE, "Find Sensor PAS106");
6553			sd->sensor = SENSOR_PAS106;
6554			break;
6555		case 0x10:
6556		case 0x12:
6557			PDEBUG(D_PROBE, "Find Sensor TAS5130C");
6558			sd->sensor = SENSOR_TAS5130C;
6559			break;
6560		case 0x11:
6561			PDEBUG(D_PROBE, "Find Sensor HV7131R");
6562			sd->sensor = SENSOR_HV7131R;
6563			break;
6564		case 0x13:
6565		case 0x15:
6566			PDEBUG(D_PROBE,
6567				"Sensor MT9V111. Chip revision %04x",
6568				sd->chip_revision);
6569			sd->sensor = sd->bridge == BRIDGE_ZC301
6570					? SENSOR_MT9V111_1
6571					: SENSOR_MT9V111_3;
6572			break;
6573		case 0x14:
6574			PDEBUG(D_PROBE,
6575				"Find Sensor CS2102K?. Chip revision %x",
6576				sd->chip_revision);
6577			sd->sensor = SENSOR_CS2102K;
6578			break;
6579		case 0x16:
6580			PDEBUG(D_PROBE, "Find Sensor ADCM2700");
6581			sd->sensor = SENSOR_ADCM2700;
6582			break;
6583		case 0x29:
6584			PDEBUG(D_PROBE, "Find Sensor GC0305");
6585			sd->sensor = SENSOR_GC0305;
6586			break;
6587		case 0x0250:
6588			PDEBUG(D_PROBE, "Sensor Tas5130 (VF0250)");
6589			sd->sensor =  SENSOR_TAS5130C_VF0250;
6590			break;
6591		case 0x2030:
6592			PDEBUG(D_PROBE, "Find Sensor PO2030");
6593			sd->sensor = SENSOR_PO2030;
6594			sd->sharpness = 0;		/* from win traces */
6595			break;
6596		case 0x7620:
6597			PDEBUG(D_PROBE, "Find Sensor OV7620");
6598			sd->sensor = SENSOR_OV7620;
6599			break;
6600		case 0x7631:
6601			PDEBUG(D_PROBE, "Find Sensor OV7630C");
6602			sd->sensor = SENSOR_OV7630C;
6603			break;
6604		case 0x7648:
6605			PDEBUG(D_PROBE, "Find Sensor OV7648");
6606			sd->sensor = SENSOR_OV7620;	/* same sensor (?) */
6607			break;
6608		default:
6609			PDEBUG(D_ERR|D_PROBE, "Unknown sensor %04x", sensor);
6610			return -EINVAL;
6611		}
6612	}
6613	if (sensor < 0x20) {
6614		if (sensor == -1 || sensor == 0x10 || sensor == 0x12)
6615			reg_w(gspca_dev, 0x02, 0x0010);
6616		reg_r(gspca_dev, 0x0010);
6617	}
6618
6619	cam = &gspca_dev->cam;
6620	switch (mode_tb[sd->sensor]) {
6621	case 0:
6622		cam->cam_mode = sif_mode;
6623		cam->nmodes = ARRAY_SIZE(sif_mode);
6624		break;
6625	case 1:
6626		cam->cam_mode = vga_mode;
6627		cam->nmodes = ARRAY_SIZE(vga_mode);
6628		break;
6629	default:
6630/*	case 2: */
6631		cam->cam_mode = broken_vga_mode;
6632		cam->nmodes = ARRAY_SIZE(broken_vga_mode);
6633		break;
6634	}
6635	sd->gamma = gamma[sd->sensor];
6636
6637	switch (sd->sensor) {
6638	case SENSOR_OV7630C:
6639		gspca_dev->ctrl_dis = (1 << LIGHTFREQ_IDX);
6640		break;
6641	}
6642
6643	/* switch off the led */
6644	reg_w(gspca_dev, 0x01, 0x0000);
6645	return gspca_dev->usb_err;
6646}
6647
6648static int sd_start(struct gspca_dev *gspca_dev)
6649{
6650	struct sd *sd = (struct sd *) gspca_dev;
6651	int mode;
6652	static const struct usb_action *init_tb[SENSOR_MAX][2] = {
6653	[SENSOR_ADCM2700] =
6654			{adcm2700_Initial, adcm2700_InitialScale},
6655	[SENSOR_CS2102]	=
6656			{cs2102_Initial, cs2102_InitialScale},
6657	[SENSOR_CS2102K] =
6658			{cs2102K_Initial, cs2102K_InitialScale},
6659	[SENSOR_GC0305] =
6660			{gc0305_Initial, gc0305_InitialScale},
6661	[SENSOR_HDCS2020b] =
6662			{hdcs2020b_Initial, hdcs2020b_InitialScale},
6663	[SENSOR_HV7131B] =
6664			{hv7131b_Initial, hv7131b_InitialScale},
6665	[SENSOR_HV7131R] =
6666			{hv7131r_Initial, hv7131r_InitialScale},
6667	[SENSOR_ICM105A] =
6668			{icm105a_Initial, icm105a_InitialScale},
6669	[SENSOR_MC501CB] =
6670			{mc501cb_Initial, mc501cb_InitialScale},
6671	[SENSOR_MT9V111_1] =
6672			{mt9v111_1_Initial, mt9v111_1_InitialScale},
6673	[SENSOR_MT9V111_3] =
6674			{mt9v111_3_Initial, mt9v111_3_InitialScale},
6675	[SENSOR_OV7620] =
6676			{ov7620_Initial, ov7620_InitialScale},
6677	[SENSOR_OV7630C] =
6678			{ov7630c_Initial, ov7630c_InitialScale},
6679	[SENSOR_PAS106] =
6680			{pas106b_Initial, pas106b_InitialScale},
6681	[SENSOR_PAS202B] =
6682			{pas202b_Initial, pas202b_InitialScale},
6683	[SENSOR_PB0330] =
6684			{pb0330_Initial, pb0330_InitialScale},
6685	[SENSOR_PO2030] =
6686			{po2030_Initial, po2030_InitialScale},
6687	[SENSOR_TAS5130C] =
6688			{tas5130c_Initial, tas5130c_InitialScale},
6689	[SENSOR_TAS5130C_VF0250] =
6690		{tas5130c_vf0250_Initial, tas5130c_vf0250_InitialScale},
6691	};
6692
6693	/* create the JPEG header */
6694	jpeg_define(sd->jpeg_hdr, gspca_dev->height, gspca_dev->width,
6695			0x21);		/* JPEG 422 */
6696	jpeg_set_qual(sd->jpeg_hdr, sd->quality);
6697
6698	mode = gspca_dev->cam.cam_mode[gspca_dev->curr_mode].priv;
6699	switch (sd->sensor) {
6700	case SENSOR_HV7131R:
6701		zcxx_probeSensor(gspca_dev);
6702		break;
6703	case SENSOR_PAS106:
6704		usb_exchange(gspca_dev, pas106b_Initial_com);
6705		break;
6706	}
6707	usb_exchange(gspca_dev, init_tb[sd->sensor][mode]);
6708
6709	switch (sd->sensor) {
6710	case SENSOR_ADCM2700:
6711	case SENSOR_GC0305:
6712	case SENSOR_OV7620:
6713	case SENSOR_PO2030:
6714	case SENSOR_TAS5130C:
6715	case SENSOR_TAS5130C_VF0250:
6716/*		msleep(100);			 * ?? */
6717		reg_r(gspca_dev, 0x0002);	/* --> 0x40 */
6718		reg_w(gspca_dev, 0x09, 0x01ad);	/* (from win traces) */
6719		reg_w(gspca_dev, 0x15, 0x01ae);
6720		if (sd->sensor == SENSOR_TAS5130C)
6721			break;
6722		reg_w(gspca_dev, 0x0d, 0x003a);
6723		reg_w(gspca_dev, 0x02, 0x003b);
6724		reg_w(gspca_dev, 0x00, 0x0038);
6725		break;
6726	case SENSOR_PAS202B:
6727		reg_w(gspca_dev, 0x03, 0x003b);
6728		reg_w(gspca_dev, 0x0c, 0x003a);
6729		reg_w(gspca_dev, 0x0b, 0x0039);
6730		break;
6731	}
6732
6733	setmatrix(gspca_dev);
6734	switch (sd->sensor) {
6735	case SENSOR_ADCM2700:
6736	case SENSOR_OV7620:
6737		reg_r(gspca_dev, 0x0008);
6738		reg_w(gspca_dev, 0x00, 0x0008);
6739		break;
6740	case SENSOR_PAS202B:
6741	case SENSOR_GC0305:
6742	case SENSOR_TAS5130C:
6743		reg_r(gspca_dev, 0x0008);
6744		/* fall thru */
6745	case SENSOR_PO2030:
6746		reg_w(gspca_dev, 0x03, 0x0008);
6747		break;
6748	}
6749	setsharpness(gspca_dev);
6750
6751	/* set the gamma tables when not set */
6752	switch (sd->sensor) {
6753	case SENSOR_CS2102K:		/* gamma set in xxx_Initial */
6754	case SENSOR_HDCS2020b:
6755	case SENSOR_OV7630C:
6756		break;
6757	default:
6758		setcontrast(gspca_dev);
6759		break;
6760	}
6761	setmatrix(gspca_dev);			/* one more time? */
6762	switch (sd->sensor) {
6763	case SENSOR_OV7620:
6764	case SENSOR_PAS202B:
6765		reg_r(gspca_dev, 0x0180);	/* from win */
6766		reg_w(gspca_dev, 0x00, 0x0180);
6767		break;
6768	default:
6769		setquality(gspca_dev);
6770		break;
6771	}
6772	setlightfreq(gspca_dev);
6773
6774	switch (sd->sensor) {
6775	case SENSOR_ADCM2700:
6776		reg_w(gspca_dev, 0x09, 0x01ad);	/* (from win traces) */
6777		reg_w(gspca_dev, 0x15, 0x01ae);
6778		reg_w(gspca_dev, 0x02, 0x0180);
6779						/* ms-win + */
6780		reg_w(gspca_dev, 0x40, 0x0117);
6781		break;
6782	case SENSOR_GC0305:
6783	case SENSOR_TAS5130C:
6784		reg_w(gspca_dev, 0x09, 0x01ad);	/* (from win traces) */
6785		reg_w(gspca_dev, 0x15, 0x01ae);
6786		/* fall thru */
6787	case SENSOR_PAS202B:
6788	case SENSOR_PO2030:
6789/*		reg_w(gspca_dev, 0x40, ZC3XX_R117_GGAIN);  * (from win traces) */
6790		reg_r(gspca_dev, 0x0180);
6791		break;
6792	case SENSOR_OV7620:
6793		reg_w(gspca_dev, 0x09, 0x01ad);
6794		reg_w(gspca_dev, 0x15, 0x01ae);
6795		i2c_read(gspca_dev, 0x13);
6796		i2c_write(gspca_dev, 0x13, 0xa3, 0x00);
6797		reg_w(gspca_dev, 0x40, 0x0117);
6798		reg_r(gspca_dev, 0x0180);
6799		break;
6800	}
6801
6802	setautogain(gspca_dev);
6803	switch (sd->sensor) {
6804	case SENSOR_PO2030:
6805		msleep(50);
6806		reg_w(gspca_dev, 0x00, 0x0007);	/* (from win traces) */
6807		reg_w(gspca_dev, 0x02, ZC3XX_R008_CLOCKSETTING);
6808		break;
6809	}
6810	return gspca_dev->usb_err;
6811}
6812
6813/* called on streamoff with alt 0 and on disconnect */
6814static void sd_stop0(struct gspca_dev *gspca_dev)
6815{
6816	struct sd *sd = (struct sd *) gspca_dev;
6817
6818	if (!gspca_dev->present)
6819		return;
6820	send_unknown(gspca_dev, sd->sensor);
6821}
6822
6823static void sd_pkt_scan(struct gspca_dev *gspca_dev,
6824			u8 *data,
6825			int len)
6826{
6827	struct sd *sd = (struct sd *) gspca_dev;
6828
6829	if (data[0] == 0xff && data[1] == 0xd8) {	/* start of frame */
6830		gspca_frame_add(gspca_dev, LAST_PACKET,
6831					NULL, 0);
6832		/* put the JPEG header in the new frame */
6833		gspca_frame_add(gspca_dev, FIRST_PACKET,
6834			sd->jpeg_hdr, JPEG_HDR_SZ);
6835
6836		/* remove the webcam's header:
6837		 * ff d8 ff fe 00 0e 00 00 ss ss 00 01 ww ww hh hh pp pp
6838		 *	- 'ss ss' is the frame sequence number (BE)
6839		 * 	- 'ww ww' and 'hh hh' are the window dimensions (BE)
6840		 *	- 'pp pp' is the packet sequence number (BE)
6841		 */
6842		data += 18;
6843		len -= 18;
6844	}
6845	gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
6846}
6847
6848static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val)
6849{
6850	struct sd *sd = (struct sd *) gspca_dev;
6851
6852	sd->brightness = val;
6853	if (gspca_dev->streaming)
6854		setcontrast(gspca_dev);
6855	return gspca_dev->usb_err;
6856}
6857
6858static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val)
6859{
6860	struct sd *sd = (struct sd *) gspca_dev;
6861
6862	*val = sd->brightness;
6863	return 0;
6864}
6865
6866static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val)
6867{
6868	struct sd *sd = (struct sd *) gspca_dev;
6869
6870	sd->contrast = val;
6871	if (gspca_dev->streaming)
6872		setcontrast(gspca_dev);
6873	return gspca_dev->usb_err;
6874}
6875
6876static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val)
6877{
6878	struct sd *sd = (struct sd *) gspca_dev;
6879
6880	*val = sd->contrast;
6881	return 0;
6882}
6883
6884static int sd_setautogain(struct gspca_dev *gspca_dev, __s32 val)
6885{
6886	struct sd *sd = (struct sd *) gspca_dev;
6887
6888	sd->autogain = val;
6889	if (gspca_dev->streaming)
6890		setautogain(gspca_dev);
6891	return gspca_dev->usb_err;
6892}
6893
6894static int sd_getautogain(struct gspca_dev *gspca_dev, __s32 *val)
6895{
6896	struct sd *sd = (struct sd *) gspca_dev;
6897
6898	*val = sd->autogain;
6899	return 0;
6900}
6901
6902static int sd_setgamma(struct gspca_dev *gspca_dev, __s32 val)
6903{
6904	struct sd *sd = (struct sd *) gspca_dev;
6905
6906	sd->gamma = val;
6907	if (gspca_dev->streaming)
6908		setcontrast(gspca_dev);
6909	return gspca_dev->usb_err;
6910}
6911
6912static int sd_getgamma(struct gspca_dev *gspca_dev, __s32 *val)
6913{
6914	struct sd *sd = (struct sd *) gspca_dev;
6915
6916	*val = sd->gamma;
6917	return 0;
6918}
6919
6920static int sd_setfreq(struct gspca_dev *gspca_dev, __s32 val)
6921{
6922	struct sd *sd = (struct sd *) gspca_dev;
6923
6924	sd->lightfreq = val;
6925	if (gspca_dev->streaming)
6926		setlightfreq(gspca_dev);
6927	return gspca_dev->usb_err;
6928}
6929
6930static int sd_getfreq(struct gspca_dev *gspca_dev, __s32 *val)
6931{
6932	struct sd *sd = (struct sd *) gspca_dev;
6933
6934	*val = sd->lightfreq;
6935	return 0;
6936}
6937
6938static int sd_setsharpness(struct gspca_dev *gspca_dev, __s32 val)
6939{
6940	struct sd *sd = (struct sd *) gspca_dev;
6941
6942	sd->sharpness = val;
6943	if (gspca_dev->streaming)
6944		setsharpness(gspca_dev);
6945	return gspca_dev->usb_err;
6946}
6947
6948static int sd_getsharpness(struct gspca_dev *gspca_dev, __s32 *val)
6949{
6950	struct sd *sd = (struct sd *) gspca_dev;
6951
6952	*val = sd->sharpness;
6953	return 0;
6954}
6955
6956static int sd_querymenu(struct gspca_dev *gspca_dev,
6957			struct v4l2_querymenu *menu)
6958{
6959	switch (menu->id) {
6960	case V4L2_CID_POWER_LINE_FREQUENCY:
6961		switch (menu->index) {
6962		case 0:		/* V4L2_CID_POWER_LINE_FREQUENCY_DISABLED */
6963			strcpy((char *) menu->name, "NoFliker");
6964			return 0;
6965		case 1:		/* V4L2_CID_POWER_LINE_FREQUENCY_50HZ */
6966			strcpy((char *) menu->name, "50 Hz");
6967			return 0;
6968		case 2:		/* V4L2_CID_POWER_LINE_FREQUENCY_60HZ */
6969			strcpy((char *) menu->name, "60 Hz");
6970			return 0;
6971		}
6972		break;
6973	}
6974	return -EINVAL;
6975}
6976
6977static int sd_set_jcomp(struct gspca_dev *gspca_dev,
6978			struct v4l2_jpegcompression *jcomp)
6979{
6980	struct sd *sd = (struct sd *) gspca_dev;
6981
6982	if (jcomp->quality < QUALITY_MIN)
6983		sd->quality = QUALITY_MIN;
6984	else if (jcomp->quality > QUALITY_MAX)
6985		sd->quality = QUALITY_MAX;
6986	else
6987		sd->quality = jcomp->quality;
6988	if (gspca_dev->streaming)
6989		jpeg_set_qual(sd->jpeg_hdr, sd->quality);
6990	return gspca_dev->usb_err;
6991}
6992
6993static int sd_get_jcomp(struct gspca_dev *gspca_dev,
6994			struct v4l2_jpegcompression *jcomp)
6995{
6996	struct sd *sd = (struct sd *) gspca_dev;
6997
6998	memset(jcomp, 0, sizeof *jcomp);
6999	jcomp->quality = sd->quality;
7000	jcomp->jpeg_markers = V4L2_JPEG_MARKER_DHT
7001			| V4L2_JPEG_MARKER_DQT;
7002	return 0;
7003}
7004
7005#ifdef CONFIG_INPUT
7006static int sd_int_pkt_scan(struct gspca_dev *gspca_dev,
7007			u8 *data,		/* interrupt packet data */
7008			int len)		/* interrput packet length */
7009{
7010	if (len == 8 && data[4] == 1) {
7011		input_report_key(gspca_dev->input_dev, KEY_CAMERA, 1);
7012		input_sync(gspca_dev->input_dev);
7013		input_report_key(gspca_dev->input_dev, KEY_CAMERA, 0);
7014		input_sync(gspca_dev->input_dev);
7015	}
7016
7017	return 0;
7018}
7019#endif
7020
7021static const struct sd_desc sd_desc = {
7022	.name = MODULE_NAME,
7023	.ctrls = sd_ctrls,
7024	.nctrls = ARRAY_SIZE(sd_ctrls),
7025	.config = sd_config,
7026	.init = sd_init,
7027	.start = sd_start,
7028	.stop0 = sd_stop0,
7029	.pkt_scan = sd_pkt_scan,
7030	.querymenu = sd_querymenu,
7031	.get_jcomp = sd_get_jcomp,
7032	.set_jcomp = sd_set_jcomp,
7033#ifdef CONFIG_INPUT
7034	.int_pkt_scan = sd_int_pkt_scan,
7035#endif
7036};
7037
7038static const __devinitdata struct usb_device_id device_table[] = {
7039	{USB_DEVICE(0x041e, 0x041e)},
7040	{USB_DEVICE(0x041e, 0x4017)},
7041	{USB_DEVICE(0x041e, 0x401c), .driver_info = SENSOR_PAS106},
7042	{USB_DEVICE(0x041e, 0x401e)},
7043	{USB_DEVICE(0x041e, 0x401f)},
7044	{USB_DEVICE(0x041e, 0x4022)},
7045	{USB_DEVICE(0x041e, 0x4029)},
7046	{USB_DEVICE(0x041e, 0x4034), .driver_info = SENSOR_PAS106},
7047	{USB_DEVICE(0x041e, 0x4035), .driver_info = SENSOR_PAS106},
7048	{USB_DEVICE(0x041e, 0x4036)},
7049	{USB_DEVICE(0x041e, 0x403a)},
7050	{USB_DEVICE(0x041e, 0x4051), .driver_info = SENSOR_TAS5130C_VF0250},
7051	{USB_DEVICE(0x041e, 0x4053), .driver_info = SENSOR_TAS5130C_VF0250},
7052	{USB_DEVICE(0x0458, 0x7007)},
7053	{USB_DEVICE(0x0458, 0x700c)},
7054	{USB_DEVICE(0x0458, 0x700f)},
7055	{USB_DEVICE(0x0461, 0x0a00)},
7056	{USB_DEVICE(0x046d, 0x089d), .driver_info = SENSOR_MC501CB},
7057	{USB_DEVICE(0x046d, 0x08a0)},
7058	{USB_DEVICE(0x046d, 0x08a1)},
7059	{USB_DEVICE(0x046d, 0x08a2)},
7060	{USB_DEVICE(0x046d, 0x08a3)},
7061	{USB_DEVICE(0x046d, 0x08a6)},
7062	{USB_DEVICE(0x046d, 0x08a7)},
7063	{USB_DEVICE(0x046d, 0x08a9)},
7064	{USB_DEVICE(0x046d, 0x08aa)},
7065	{USB_DEVICE(0x046d, 0x08ac)},
7066	{USB_DEVICE(0x046d, 0x08ad)},
7067	{USB_DEVICE(0x046d, 0x08ae)},
7068	{USB_DEVICE(0x046d, 0x08af)},
7069	{USB_DEVICE(0x046d, 0x08b9)},
7070	{USB_DEVICE(0x046d, 0x08d7)},
7071	{USB_DEVICE(0x046d, 0x08d9)},
7072	{USB_DEVICE(0x046d, 0x08d8)},
7073	{USB_DEVICE(0x046d, 0x08da)},
7074	{USB_DEVICE(0x046d, 0x08dd), .driver_info = SENSOR_MC501CB},
7075	{USB_DEVICE(0x0471, 0x0325), .driver_info = SENSOR_PAS106},
7076	{USB_DEVICE(0x0471, 0x0326), .driver_info = SENSOR_PAS106},
7077	{USB_DEVICE(0x0471, 0x032d), .driver_info = SENSOR_PAS106},
7078	{USB_DEVICE(0x0471, 0x032e), .driver_info = SENSOR_PAS106},
7079	{USB_DEVICE(0x055f, 0xc005)},
7080	{USB_DEVICE(0x055f, 0xd003)},
7081	{USB_DEVICE(0x055f, 0xd004)},
7082	{USB_DEVICE(0x0698, 0x2003)},
7083	{USB_DEVICE(0x0ac8, 0x0301), .driver_info = SENSOR_PAS106},
7084	{USB_DEVICE(0x0ac8, 0x0302), .driver_info = SENSOR_PAS106},
7085	{USB_DEVICE(0x0ac8, 0x301b)},
7086	{USB_DEVICE(0x0ac8, 0x303b)},
7087	{USB_DEVICE(0x0ac8, 0x305b)},
7088	{USB_DEVICE(0x0ac8, 0x307b)},
7089	{USB_DEVICE(0x10fd, 0x0128)},
7090	{USB_DEVICE(0x10fd, 0x804d)},
7091	{USB_DEVICE(0x10fd, 0x8050)},
7092	{}			/* end of entry */
7093};
7094MODULE_DEVICE_TABLE(usb, device_table);
7095
7096/* -- device connect -- */
7097static int sd_probe(struct usb_interface *intf,
7098			const struct usb_device_id *id)
7099{
7100	return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd),
7101				THIS_MODULE);
7102}
7103
7104/* USB driver */
7105static struct usb_driver sd_driver = {
7106	.name = MODULE_NAME,
7107	.id_table = device_table,
7108	.probe = sd_probe,
7109	.disconnect = gspca_disconnect,
7110#ifdef CONFIG_PM
7111	.suspend = gspca_suspend,
7112	.resume = gspca_resume,
7113#endif
7114};
7115
7116static int __init sd_mod_init(void)
7117{
7118	int ret;
7119	ret = usb_register(&sd_driver);
7120	if (ret < 0)
7121		return ret;
7122	PDEBUG(D_PROBE, "registered");
7123	return 0;
7124}
7125
7126static void __exit sd_mod_exit(void)
7127{
7128	usb_deregister(&sd_driver);
7129	PDEBUG(D_PROBE, "deregistered");
7130}
7131
7132module_init(sd_mod_init);
7133module_exit(sd_mod_exit);
7134
7135module_param(force_sensor, int, 0644);
7136MODULE_PARM_DESC(force_sensor,
7137	"Force sensor. Only for experts!!!");
7138