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