1c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/*
28d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine * ov534-ov9xxx gspca driver
3c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine *
48d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine * Copyright (C) 2009-2011 Jean-Francois Moine http://moinejf.free.fr
5c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * Copyright (C) 2008 Antonio Ospite <ospite@studenti.unina.it>
6c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * Copyright (C) 2008 Jim Paris <jim@jtan.com>
7c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine *
8c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * Based on a prototype written by Mark Ferrell <majortrips@gmail.com>
9c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * USB protocol reverse engineered by Jim Paris <jim@jtan.com>
10c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * https://jim.sh/svn/jim/devl/playstation/ps3/eye/test/
11c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine *
12c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * This program is free software; you can redistribute it and/or modify
13c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * it under the terms of the GNU General Public License as published by
14c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * the Free Software Foundation; either version 2 of the License, or
15c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * any later version.
16c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine *
17c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * This program is distributed in the hope that it will be useful,
18c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * but WITHOUT ANY WARRANTY; without even the implied warranty of
19c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * GNU General Public License for more details.
21c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine *
22c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * You should have received a copy of the GNU General Public License
23c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * along with this program; if not, write to the Free Software
24c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine */
26c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
27133a9fe949862d9ed8411fb423739f4cee08232dJoe Perches#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
28133a9fe949862d9ed8411fb423739f4cee08232dJoe Perches
29c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define MODULE_NAME "ov534_9"
30c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
31c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#include "gspca.h"
32c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
33c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define OV534_REG_ADDRESS	0xf1	/* sensor address */
34c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define OV534_REG_SUBADDR	0xf2
35c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define OV534_REG_WRITE		0xf3
36c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define OV534_REG_READ		0xf4
37c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define OV534_REG_OPERATION	0xf5
38c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define OV534_REG_STATUS	0xf6
39c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
40c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define OV534_OP_WRITE_3	0x37
41c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define OV534_OP_WRITE_2	0x33
42c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define OV534_OP_READ_2		0xf9
43c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
44c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define CTRL_TIMEOUT 500
45c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
46c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois MoineMODULE_AUTHOR("Jean-Francois Moine <moinejf@free.fr>");
47c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois MoineMODULE_DESCRIPTION("GSPCA/OV534_9 USB Camera Driver");
48c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois MoineMODULE_LICENSE("GPL");
49c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
507592e0377636963eade33810fcad06487b8b153fJean-François Moine/* controls */
517592e0377636963eade33810fcad06487b8b153fJean-François Moineenum e_ctrl {
527592e0377636963eade33810fcad06487b8b153fJean-François Moine	BRIGHTNESS,
537592e0377636963eade33810fcad06487b8b153fJean-François Moine	CONTRAST,
547592e0377636963eade33810fcad06487b8b153fJean-François Moine	AUTOGAIN,
557592e0377636963eade33810fcad06487b8b153fJean-François Moine	EXPOSURE,
567592e0377636963eade33810fcad06487b8b153fJean-François Moine	SHARPNESS,
577592e0377636963eade33810fcad06487b8b153fJean-François Moine	SATUR,
587592e0377636963eade33810fcad06487b8b153fJean-François Moine	LIGHTFREQ,
597592e0377636963eade33810fcad06487b8b153fJean-François Moine	NCTRLS		/* number of controls */
607592e0377636963eade33810fcad06487b8b153fJean-François Moine};
617592e0377636963eade33810fcad06487b8b153fJean-François Moine
62c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/* specific webcam descriptor */
63c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestruct sd {
64c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	struct gspca_dev gspca_dev;	/* !! must be the first item */
657592e0377636963eade33810fcad06487b8b153fJean-François Moine	struct gspca_ctrl ctrls[NCTRLS];
66c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	__u32 last_pts;
67c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	u8 last_fid;
688d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine
698d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	u8 sensor;
708d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine};
718d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moineenum sensors {
728d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	SENSOR_OV965x,		/* ov9657 */
738d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	SENSOR_OV971x,		/* ov9712 */
74965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	SENSOR_OV562x,		/* ov5621 */
758d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	NSENSORS
76c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine};
77c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
78c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/* V4L2 controls supported by the driver */
797592e0377636963eade33810fcad06487b8b153fJean-François Moinestatic void setbrightness(struct gspca_dev *gspca_dev);
807592e0377636963eade33810fcad06487b8b153fJean-François Moinestatic void setcontrast(struct gspca_dev *gspca_dev);
817592e0377636963eade33810fcad06487b8b153fJean-François Moinestatic void setautogain(struct gspca_dev *gspca_dev);
827592e0377636963eade33810fcad06487b8b153fJean-François Moinestatic void setexposure(struct gspca_dev *gspca_dev);
837592e0377636963eade33810fcad06487b8b153fJean-François Moinestatic void setsharpness(struct gspca_dev *gspca_dev);
847592e0377636963eade33810fcad06487b8b153fJean-François Moinestatic void setsatur(struct gspca_dev *gspca_dev);
857592e0377636963eade33810fcad06487b8b153fJean-François Moinestatic void setlightfreq(struct gspca_dev *gspca_dev);
867592e0377636963eade33810fcad06487b8b153fJean-François Moine
877592e0377636963eade33810fcad06487b8b153fJean-François Moinestatic const struct ctrl sd_ctrls[NCTRLS] = {
887592e0377636963eade33810fcad06487b8b153fJean-François Moine[BRIGHTNESS] = {
89c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{
90c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.id      = V4L2_CID_BRIGHTNESS,
91c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.type    = V4L2_CTRL_TYPE_INTEGER,
92c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.name    = "Brightness",
93c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.minimum = 0,
94c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.maximum = 15,
95c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.step    = 1,
967592e0377636963eade33810fcad06487b8b153fJean-François Moine		.default_value = 7
97c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	},
987592e0377636963eade33810fcad06487b8b153fJean-François Moine	.set_control = setbrightness
99c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine    },
1007592e0377636963eade33810fcad06487b8b153fJean-François Moine[CONTRAST] = {
101c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{
102c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.id      = V4L2_CID_CONTRAST,
103c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.type    = V4L2_CTRL_TYPE_INTEGER,
104c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.name    = "Contrast",
105c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.minimum = 0,
106c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.maximum = 15,
107c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.step    = 1,
1087592e0377636963eade33810fcad06487b8b153fJean-François Moine		.default_value = 3
109c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	},
1107592e0377636963eade33810fcad06487b8b153fJean-François Moine	.set_control = setcontrast
111c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine    },
1127592e0377636963eade33810fcad06487b8b153fJean-François Moine[AUTOGAIN] = {
113c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{
114c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.id      = V4L2_CID_AUTOGAIN,
115c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.type    = V4L2_CTRL_TYPE_BOOLEAN,
116c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.name    = "Autogain",
117c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.minimum = 0,
118c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.maximum = 1,
119c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.step    = 1,
120c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define AUTOGAIN_DEF 1
121c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.default_value = AUTOGAIN_DEF,
122c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	},
1237592e0377636963eade33810fcad06487b8b153fJean-François Moine	.set_control = setautogain
124c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine    },
1257592e0377636963eade33810fcad06487b8b153fJean-François Moine[EXPOSURE] = {
126c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{
127c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.id      = V4L2_CID_EXPOSURE,
128c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.type    = V4L2_CTRL_TYPE_INTEGER,
129c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.name    = "Exposure",
130c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.minimum = 0,
131c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.maximum = 3,
132c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.step    = 1,
1337592e0377636963eade33810fcad06487b8b153fJean-François Moine		.default_value = 0
134c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	},
1357592e0377636963eade33810fcad06487b8b153fJean-François Moine	.set_control = setexposure
136c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine    },
1377592e0377636963eade33810fcad06487b8b153fJean-François Moine[SHARPNESS] = {
138c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{
139c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.id      = V4L2_CID_SHARPNESS,
140c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.type    = V4L2_CTRL_TYPE_INTEGER,
141c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.name    = "Sharpness",
142c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.minimum = -1,		/* -1 = auto */
143c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.maximum = 4,
144c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.step    = 1,
1457592e0377636963eade33810fcad06487b8b153fJean-François Moine		.default_value = -1
146c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	},
1477592e0377636963eade33810fcad06487b8b153fJean-François Moine	.set_control = setsharpness
148c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine    },
1497592e0377636963eade33810fcad06487b8b153fJean-François Moine[SATUR] = {
150c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{
151c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.id      = V4L2_CID_SATURATION,
152c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.type    = V4L2_CTRL_TYPE_INTEGER,
153c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.name    = "Saturation",
154c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.minimum = 0,
155c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.maximum = 4,
156c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.step    = 1,
1577592e0377636963eade33810fcad06487b8b153fJean-François Moine		.default_value = 2
158c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	},
1597592e0377636963eade33810fcad06487b8b153fJean-François Moine	.set_control = setsatur
160c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine    },
1617592e0377636963eade33810fcad06487b8b153fJean-François Moine[LIGHTFREQ] = {
162c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{
163c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.id	 = V4L2_CID_POWER_LINE_FREQUENCY,
164c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.type    = V4L2_CTRL_TYPE_MENU,
165c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.name    = "Light frequency filter",
166c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.minimum = 0,
167c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.maximum = 2,	/* 0: 0, 1: 50Hz, 2:60Hz */
168c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.step    = 1,
1697592e0377636963eade33810fcad06487b8b153fJean-François Moine		.default_value = 0
170c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	},
1717592e0377636963eade33810fcad06487b8b153fJean-François Moine	.set_control = setlightfreq
172c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine    },
173c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine};
174c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
175c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic const struct v4l2_pix_format ov965x_mode[] = {
176c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define QVGA_MODE 0
177c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{320, 240, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
178c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.bytesperline = 320,
179c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.sizeimage = 320 * 240 * 3 / 8 + 590,
180c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.colorspace = V4L2_COLORSPACE_JPEG},
181c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define VGA_MODE 1
182c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{640, 480, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
183c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.bytesperline = 640,
184c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.sizeimage = 640 * 480 * 3 / 8 + 590,
185c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.colorspace = V4L2_COLORSPACE_JPEG},
186c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define SVGA_MODE 2
187c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{800, 600, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
188c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.bytesperline = 800,
189c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.sizeimage = 800 * 600 * 3 / 8 + 590,
190c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.colorspace = V4L2_COLORSPACE_JPEG},
191c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define XGA_MODE 3
192c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{1024, 768, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
193c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.bytesperline = 1024,
194c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.sizeimage = 1024 * 768 * 3 / 8 + 590,
195c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.colorspace = V4L2_COLORSPACE_JPEG},
196c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define SXGA_MODE 4
197c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{1280, 1024, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
198c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.bytesperline = 1280,
199c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.sizeimage = 1280 * 1024 * 3 / 8 + 590,
200c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		.colorspace = V4L2_COLORSPACE_JPEG},
201c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine};
202c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
2038d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moinestatic const struct v4l2_pix_format ov971x_mode[] = {
2048d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{640, 480, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
2058d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		.bytesperline = 640,
2068d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		.sizeimage = 640 * 480,
2078d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		.colorspace = V4L2_COLORSPACE_SRGB
2088d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	}
2098d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine};
2108d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine
211965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguerostatic const struct v4l2_pix_format ov562x_mode[] = {
212965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{2592, 1680, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
213965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero		.bytesperline = 2592,
214965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero		.sizeimage = 2592 * 1680,
215965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero		.colorspace = V4L2_COLORSPACE_SRGB
216965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	}
217965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero};
218965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero
219c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic const u8 bridge_init[][2] = {
220c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x88, 0xf8},
221c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x89, 0xff},
222c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x76, 0x03},
223c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x92, 0x03},
224c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x95, 0x10},
225c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xe2, 0x00},
226c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xe7, 0x3e},
227c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x8d, 0x1c},
228c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x8e, 0x00},
229c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x8f, 0x00},
230c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x1f, 0x00},
231c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc3, 0xf9},
232c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x89, 0xff},
233c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x88, 0xf8},
234c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x76, 0x03},
235c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x92, 0x01},
236c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x93, 0x18},
237c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x1c, 0x0a},
238c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x1d, 0x48},
239c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc0, 0x50},
240c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc1, 0x3c},
241c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x34, 0x05},
242c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc2, 0x0c},
243c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc3, 0xf9},
244c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x34, 0x05},
245c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xe7, 0x2e},
246c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x31, 0xf9},
247c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x35, 0x02},
248c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xd9, 0x10},
249c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x25, 0x42},
250c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x94, 0x11},
251c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine};
252c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
2538d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moinestatic const u8 ov965x_init[][2] = {
254c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x12, 0x80},	/* com7 - SSCB reset */
255c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x00, 0x00},	/* gain */
256c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x01, 0x80},	/* blue */
257c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x02, 0x80},	/* red */
258c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x03, 0x1b},	/* vref */
259c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x04, 0x03},	/* com1 - exposure low bits */
260c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x0b, 0x57},	/* ver */
261c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x0e, 0x61},	/* com5 */
262c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x0f, 0x42},	/* com6 */
263c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x11, 0x00},	/* clkrc */
264c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x12, 0x02},	/* com7 - 15fps VGA YUYV */
265c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x13, 0xe7},	/* com8 - everything (AGC, AWB and AEC) */
266c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x14, 0x28},	/* com9 */
267c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x16, 0x24},	/* reg16 */
268c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x17, 0x1d},	/* hstart*/
269c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x18, 0xbd},	/* hstop */
270c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x19, 0x01},	/* vstrt */
271c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x1a, 0x81},	/* vstop*/
272c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x1e, 0x04},	/* mvfp */
273c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x24, 0x3c},	/* aew */
274c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x25, 0x36},	/* aeb */
275c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x26, 0x71},	/* vpt */
276c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x27, 0x08},	/* bbias */
277c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x28, 0x08},	/* gbbias */
278c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x29, 0x15},	/* gr com */
279c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x2a, 0x00},	/* exhch */
280c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x2b, 0x00},	/* exhcl */
281c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x2c, 0x08},	/* rbias */
282c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x32, 0xff},	/* href */
283c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x33, 0x00},	/* chlf */
284c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x34, 0x3f},	/* aref1 */
285c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x35, 0x00},	/* aref2 */
286c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x36, 0xf8},	/* aref3 */
287c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x38, 0x72},	/* adc2 */
288c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x39, 0x57},	/* aref4 */
289c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x3a, 0x80},	/* tslb - yuyv */
290c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x3b, 0xc4},	/* com11 - night mode 1/4 frame rate */
291c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x3d, 0x99},	/* com13 */
292c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x3f, 0xc1},	/* edge */
293c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x40, 0xc0},	/* com15 */
294c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x41, 0x40},	/* com16 */
295c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x42, 0xc0},	/* com17 */
296c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x43, 0x0a},	/* rsvd */
297c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x44, 0xf0},
298c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x45, 0x46},
299c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x46, 0x62},
300c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x47, 0x2a},
301c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x48, 0x3c},
302c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x4a, 0xfc},
303c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x4b, 0xfc},
304c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x4c, 0x7f},
305c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x4d, 0x7f},
306c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x4e, 0x7f},
307c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x4f, 0x98},	/* matrix */
308c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x50, 0x98},
309c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x51, 0x00},
310c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x52, 0x28},
311c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x53, 0x70},
312c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x54, 0x98},
313c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x58, 0x1a},	/* matrix coef sign */
314c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x59, 0x85},	/* AWB control */
315c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x5a, 0xa9},
316c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x5b, 0x64},
317c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x5c, 0x84},
318c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x5d, 0x53},
319c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x5e, 0x0e},
320c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x5f, 0xf0},	/* AWB blue limit */
321c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x60, 0xf0},	/* AWB red limit */
322c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x61, 0xf0},	/* AWB green limit */
323c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x62, 0x00},	/* lcc1 */
324c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x63, 0x00},	/* lcc2 */
325c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x64, 0x02},	/* lcc3 */
326c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x65, 0x16},	/* lcc4 */
327c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x66, 0x01},	/* lcc5 */
328c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x69, 0x02},	/* hv */
329c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x6b, 0x5a},	/* dbvl */
330c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x6c, 0x04},
331c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x6d, 0x55},
332c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x6e, 0x00},
333c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x6f, 0x9d},
334c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x70, 0x21},	/* dnsth */
335c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x71, 0x78},
336c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x72, 0x00},	/* poidx */
337c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x73, 0x01},	/* pckdv */
338c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x74, 0x3a},	/* xindx */
339c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x75, 0x35},	/* yindx */
340c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x76, 0x01},
341c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x77, 0x02},
342c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x7a, 0x12},	/* gamma curve */
343c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x7b, 0x08},
344c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x7c, 0x16},
345c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x7d, 0x30},
346c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x7e, 0x5e},
347c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x7f, 0x72},
348c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x80, 0x82},
349c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x81, 0x8e},
350c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x82, 0x9a},
351c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x83, 0xa4},
352c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x84, 0xac},
353c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x85, 0xb8},
354c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x86, 0xc3},
355c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x87, 0xd6},
356c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x88, 0xe6},
357c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x89, 0xf2},
358c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x8a, 0x03},
359c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x8c, 0x89},	/* com19 */
360c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x14, 0x28},	/* com9 */
361c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x90, 0x7d},
362c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x91, 0x7b},
363c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x9d, 0x03},	/* lcc6 */
364c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x9e, 0x04},	/* lcc7 */
365c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x9f, 0x7a},
366c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xa0, 0x79},
367c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xa1, 0x40},	/* aechm */
368c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xa4, 0x50},	/* com21 */
369c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xa5, 0x68},	/* com26 */
370c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xa6, 0x4a},	/* AWB green */
371c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xa8, 0xc1},	/* refa8 */
372c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xa9, 0xef},	/* refa9 */
373c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xaa, 0x92},
374c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xab, 0x04},
375c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xac, 0x80},	/* black level control */
376c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xad, 0x80},
377c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xae, 0x80},
378c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xaf, 0x80},
379c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xb2, 0xf2},
380c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xb3, 0x20},
381c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xb4, 0x20},	/* ctrlb4 */
382c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xb5, 0x00},
383c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xb6, 0xaf},
384c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xbb, 0xae},
385c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xbc, 0x7f},	/* ADC channel offsets */
386c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xdb, 0x7f},
387c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xbe, 0x7f},
388c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xbf, 0x7f},
389c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc0, 0xe2},
390c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc1, 0xc0},
391c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc2, 0x01},
392c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc3, 0x4e},
393c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc6, 0x85},
394c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc7, 0x80},	/* com24 */
395c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc9, 0xe0},
396c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xca, 0xe8},
397c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xcb, 0xf0},
398c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xcc, 0xd8},
399c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xcd, 0xf1},
400c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x4f, 0x98},	/* matrix */
401c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x50, 0x98},
402c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x51, 0x00},
403c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x52, 0x28},
404c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x53, 0x70},
405c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x54, 0x98},
406c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x58, 0x1a},
407c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xff, 0x41},	/* read 41, write ff 00 */
408c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x41, 0x40},	/* com16 */
409c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
410c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc5, 0x03},	/* 60 Hz banding filter */
411c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x6a, 0x02},	/* 50 Hz banding filter */
412c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
413c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x12, 0x62},	/* com7 - 30fps VGA YUV */
414c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x36, 0xfa},	/* aref3 */
415c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x69, 0x0a},	/* hv */
416c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x8c, 0x89},	/* com22 */
417c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x14, 0x28},	/* com9 */
418c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x3e, 0x0c},
419c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x41, 0x40},	/* com16 */
420c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x72, 0x00},
421c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x73, 0x00},
422c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x74, 0x3a},
423c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x75, 0x35},
424c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x76, 0x01},
425c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc7, 0x80},
426c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x03, 0x12},	/* vref */
427c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x17, 0x16},	/* hstart */
428c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x18, 0x02},	/* hstop */
429c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x19, 0x01},	/* vstrt */
430c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x1a, 0x3d},	/* vstop */
431c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x32, 0xff},	/* href */
432c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc0, 0xaa},
433c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine};
434c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
435c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic const u8 bridge_init_2[][2] = {
436c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x94, 0xaa},
437c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xf1, 0x60},
438c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xe5, 0x04},
439c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc0, 0x50},
440c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc1, 0x3c},
441c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x8c, 0x00},
442c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x8d, 0x1c},
443c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x34, 0x05},
444c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
445c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc2, 0x0c},
446c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc3, 0xf9},
447c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xda, 0x01},
448c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x50, 0x00},
449c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x51, 0xa0},
450c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x52, 0x3c},
451c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x53, 0x00},
452c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x54, 0x00},
453c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x55, 0x00},
454c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x57, 0x00},
455c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x5c, 0x00},
456c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x5a, 0xa0},
457c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x5b, 0x78},
458c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x35, 0x02},
459c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xd9, 0x10},
460c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x94, 0x11},
461c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine};
462c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
4638d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moinestatic const u8 ov965x_init_2[][2] = {
464c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x3b, 0xc4},
465c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x1e, 0x04},	/* mvfp */
466c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x13, 0xe0},	/* com8 */
467c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x00, 0x00},	/* gain */
468c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x13, 0xe7},	/* com8 - everything (AGC, AWB and AEC) */
469c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x11, 0x03},	/* clkrc */
470c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x6b, 0x5a},	/* dblv */
471c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x6a, 0x05},
472c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc5, 0x07},
473c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xa2, 0x4b},
474c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xa3, 0x3e},
475c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x2d, 0x00},
476c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xff, 0x42},	/* read 42, write ff 00 */
477c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x42, 0xc0},	/* com17 */
478c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x2d, 0x00},
479c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xff, 0x42},	/* read 42, write ff 00 */
480c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x42, 0xc1},	/* com17 */
481c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/* sharpness */
482c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x3f, 0x01},
483c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xff, 0x42},	/* read 42, write ff 00 */
484c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x42, 0xc1},	/* com17 */
485c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/* saturation */
486c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x4f, 0x98},	/* matrix */
487c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x50, 0x98},
488c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x51, 0x00},
489c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x52, 0x28},
490c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x53, 0x70},
491c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x54, 0x98},
492c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x58, 0x1a},
493c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xff, 0x41},	/* read 41, write ff 00 */
494c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x41, 0x40},	/* com16 */
495c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/* contrast */
496c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x56, 0x40},
497c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/* brightness */
498c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x55, 0x8f},
499c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/* expo */
500c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x10, 0x25},	/* aech - exposure high bits */
501c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xff, 0x13},	/* read 13, write ff 00 */
502c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x13, 0xe7},	/* com8 - everything (AGC, AWB and AEC) */
503c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine};
504c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
5058d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moinestatic const u8 ov971x_init[][2] = {
5068d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x12, 0x80},
5078d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x09, 0x10},
5088d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x1e, 0x07},
5098d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x5f, 0x18},
5108d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x69, 0x04},
5118d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x65, 0x2a},
5128d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x68, 0x0a},
5138d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x39, 0x28},
5148d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x4d, 0x90},
5158d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0xc1, 0x80},
5168d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x0c, 0x30},
5178d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x6d, 0x02},
5188d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x96, 0xf1},
5198d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0xbc, 0x68},
5208d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x12, 0x00},
5218d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x3b, 0x00},
5228d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x97, 0x80},
5238d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x17, 0x25},
5248d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x18, 0xa2},
5258d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x19, 0x01},
5268d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x1a, 0xca},
5278d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x03, 0x0a},
5288d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x32, 0x07},
5298d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x98, 0x40},	/*{0x98, 0x00},*/
5308d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x99, 0xA0},	/*{0x99, 0x00},*/
5318d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x9a, 0x01},	/*{0x9a, 0x00},*/
5328d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x57, 0x00},
5338d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x58, 0x78},	/*{0x58, 0xc8},*/
5348d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x59, 0x50},	/*{0x59, 0xa0},*/
5358d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x4c, 0x13},
5368d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x4b, 0x36},
5378d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x3d, 0x3c},
5388d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x3e, 0x03},
5398d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0xbd, 0x50},	/*{0xbd, 0xa0},*/
5408d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0xbe, 0x78},	/*{0xbe, 0xc8},*/
5418d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x4e, 0x55},
5428d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x4f, 0x55},
5438d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x50, 0x55},
5448d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x51, 0x55},
5458d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x24, 0x55},
5468d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x25, 0x40},
5478d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x26, 0xa1},
5488d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x5c, 0x59},
5498d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x5d, 0x00},
5508d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x11, 0x00},
5518d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x2a, 0x98},
5528d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x2b, 0x06},
5538d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x2d, 0x00},
5548d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x2e, 0x00},
5558d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x13, 0xa5},
5568d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x14, 0x40},
5578d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x4a, 0x00},
5588d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x49, 0xce},
5598d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x22, 0x03},
5608d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{0x09, 0x00}
5618d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine};
5628d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine
5638d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moinestatic const u8 ov965x_start_1_vga[][2] = {	/* same for qvga */
564c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x12, 0x62},	/* com7 - 30fps VGA YUV */
565c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x36, 0xfa},	/* aref3 */
566c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x69, 0x0a},	/* hv */
567c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x8c, 0x89},	/* com22 */
568c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x14, 0x28},	/* com9 */
569c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x3e, 0x0c},	/* com14 */
570c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x41, 0x40},	/* com16 */
571c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x72, 0x00},
572c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x73, 0x00},
573c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x74, 0x3a},
574c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x75, 0x35},
575c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x76, 0x01},
576c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc7, 0x80},	/* com24 */
577c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x03, 0x12},	/* vref */
578c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x17, 0x16},	/* hstart */
579c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x18, 0x02},	/* hstop */
580c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x19, 0x01},	/* vstrt */
581c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x1a, 0x3d},	/* vstop */
582c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x32, 0xff},	/* href */
583c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc0, 0xaa},
584c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine};
585c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
5868d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moinestatic const u8 ov965x_start_1_svga[][2] = {
587c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x12, 0x02},	/* com7 - YUYV - VGA 15 full resolution */
588c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x36, 0xf8},	/* aref3 */
589c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x69, 0x02},	/* hv */
590c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x8c, 0x0d},	/* com22 */
591c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x3e, 0x0c},	/* com14 */
592c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x41, 0x40},	/* com16 */
593c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x72, 0x00},
594c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x73, 0x01},
595c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x74, 0x3a},
596c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x75, 0x35},
597c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x76, 0x01},
598c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc7, 0x80},	/* com24 */
599c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x03, 0x1b},	/* vref */
600c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x17, 0x1d},	/* hstart */
601c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x18, 0xbd},	/* hstop */
602c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x19, 0x01},	/* vstrt */
603c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x1a, 0x81},	/* vstop */
604c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x32, 0xff},	/* href */
605c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc0, 0xe2},
606c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine};
607c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
6088d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moinestatic const u8 ov965x_start_1_xga[][2] = {
609c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x12, 0x02},	/* com7 */
610c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x36, 0xf8},	/* aref3 */
611c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x69, 0x02},	/* hv */
612c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x8c, 0x89},	/* com22 */
613c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x14, 0x28},	/* com9 */
614c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x3e, 0x0c},	/* com14 */
615c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x41, 0x40},	/* com16 */
616c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x72, 0x00},
617c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x73, 0x01},
618c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x74, 0x3a},
619c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x75, 0x35},
620c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x76, 0x01},
621c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc7, 0x80},	/* com24 */
622c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x03, 0x1b},	/* vref */
623c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x17, 0x1d},	/* hstart */
624c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x18, 0xbd},	/* hstop */
625c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x19, 0x01},	/* vstrt */
626c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x1a, 0x81},	/* vstop */
627c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x32, 0xff},	/* href */
628c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc0, 0xe2},
629c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine};
630c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
6318d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moinestatic const u8 ov965x_start_1_sxga[][2] = {
632c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x12, 0x02},	/* com7 */
633c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x36, 0xf8},	/* aref3 */
634c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x69, 0x02},	/* hv */
635c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x8c, 0x89},	/* com22 */
636c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x14, 0x28},	/* com9 */
637c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x3e, 0x0c},	/* com14 */
638c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x41, 0x40},	/* com16 */
639c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x72, 0x00},
640c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x73, 0x01},
641c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x74, 0x3a},
642c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x75, 0x35},
643c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x76, 0x01},
644c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc7, 0x80},	/* com24 */
645c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x03, 0x1b},	/* vref */
646c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x17, 0x1d},	/* hstart */
647c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x18, 0x02},	/* hstop */
648c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x19, 0x01},	/* vstrt */
649c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x1a, 0x81},	/* vstop */
650c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x32, 0xff},	/* href */
651c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc0, 0xe2},
652c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine};
653c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
654c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic const u8 bridge_start_qvga[][2] = {
655c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x94, 0xaa},
656c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xf1, 0x60},
657c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xe5, 0x04},
658c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc0, 0x50},
659c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc1, 0x3c},
660c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x8c, 0x00},
661c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x8d, 0x1c},
662c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x34, 0x05},
663c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
664c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc2, 0x4c},
665c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc3, 0xf9},
666c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xda, 0x00},
667c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x50, 0x00},
668c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x51, 0xa0},
669c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x52, 0x78},
670c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x53, 0x00},
671c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x54, 0x00},
672c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x55, 0x00},
673c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x57, 0x00},
674c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x5c, 0x00},
675c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x5a, 0x50},
676c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x5b, 0x3c},
677c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x35, 0x02},
678c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xd9, 0x10},
679c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x94, 0x11},
680c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine};
681c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
682c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic const u8 bridge_start_vga[][2] = {
683c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x94, 0xaa},
684c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xf1, 0x60},
685c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xe5, 0x04},
686c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc0, 0x50},
687c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc1, 0x3c},
688c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x8c, 0x00},
689c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x8d, 0x1c},
690c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x34, 0x05},
691c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc2, 0x0c},
692c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc3, 0xf9},
693c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xda, 0x01},
694c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x50, 0x00},
695c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x51, 0xa0},
696c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x52, 0x3c},
697c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x53, 0x00},
698c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x54, 0x00},
699c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x55, 0x00},
700c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x57, 0x00},
701c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x5c, 0x00},
702c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x5a, 0xa0},
703c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x5b, 0x78},
704c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x35, 0x02},
705c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xd9, 0x10},
706c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x94, 0x11},
707c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine};
708c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
709c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic const u8 bridge_start_svga[][2] = {
710c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x94, 0xaa},
711c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xf1, 0x60},
712c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xe5, 0x04},
713c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc0, 0xa0},
714c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc1, 0x80},
715c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x8c, 0x00},
716c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x8d, 0x1c},
717c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x34, 0x05},
718c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc2, 0x4c},
719c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc3, 0xf9},
720c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x50, 0x00},
721c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x51, 0x40},
722c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x52, 0x00},
723c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x53, 0x00},
724c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x54, 0x00},
725c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x55, 0x88},
726c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x57, 0x00},
727c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x5c, 0x00},
728c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x5a, 0xc8},
729c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x5b, 0x96},
730c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x35, 0x02},
731c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xd9, 0x10},
732c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xda, 0x00},
733c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x94, 0x11},
734c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine};
735c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
736c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic const u8 bridge_start_xga[][2] = {
737c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x94, 0xaa},
738c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xf1, 0x60},
739c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xe5, 0x04},
740c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc0, 0xa0},
741c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc1, 0x80},
742c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x8c, 0x00},
743c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x8d, 0x1c},
744c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x34, 0x05},
745c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc2, 0x4c},
746c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc3, 0xf9},
747c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x50, 0x00},
748c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x51, 0x40},
749c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x52, 0x00},
750c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x53, 0x00},
751c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x54, 0x00},
752c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x55, 0x88},
753c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x57, 0x00},
754c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x5c, 0x01},
755c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x5a, 0x00},
756c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x5b, 0xc0},
757c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x35, 0x02},
758c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xd9, 0x10},
759c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xda, 0x01},
760c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x94, 0x11},
761c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine};
762c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
763c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic const u8 bridge_start_sxga[][2] = {
764c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x94, 0xaa},
765c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xf1, 0x60},
766c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xe5, 0x04},
767c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc0, 0xa0},
768c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc1, 0x80},
769c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x8c, 0x00},
770c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x8d, 0x1c},
771c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x34, 0x05},
772c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc2, 0x0c},
773c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc3, 0xf9},
774c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xda, 0x00},
775c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x35, 0x02},
776c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xd9, 0x10},
777c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x94, 0x11},
778c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine};
779c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
7808d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moinestatic const u8 ov965x_start_2_qvga[][2] = {
781c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x3b, 0xe4},	/* com11 - night mode 1/4 frame rate */
782c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x1e, 0x04},	/* mvfp */
783c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x13, 0xe0},	/* com8 */
784c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x00, 0x00},
785c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x13, 0xe7},	/* com8 - everything (AGC, AWB and AEC) */
786c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x11, 0x01},	/* clkrc */
787c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x6b, 0x5a},	/* dblv */
788c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x6a, 0x02},	/* 50 Hz banding filter */
789c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc5, 0x03},	/* 60 Hz banding filter */
790c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xa2, 0x96},	/* bd50 */
791c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xa3, 0x7d},	/* bd60 */
792c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
793c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xff, 0x13},	/* read 13, write ff 00 */
794c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x13, 0xe7},
795c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x3a, 0x80},	/* tslb - yuyv */
796c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine};
797c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
7988d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moinestatic const u8 ov965x_start_2_vga[][2] = {
799c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x3b, 0xc4},	/* com11 - night mode 1/4 frame rate */
800c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x1e, 0x04},	/* mvfp */
801c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x13, 0xe0},	/* com8 */
802c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x00, 0x00},
803c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x13, 0xe7},	/* com8 - everything (AGC, AWB and AEC) */
804c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x11, 0x03},	/* clkrc */
805c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x6b, 0x5a},	/* dblv */
806c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x6a, 0x05},	/* 50 Hz banding filter */
807c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc5, 0x07},	/* 60 Hz banding filter */
808c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xa2, 0x4b},	/* bd50 */
809c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xa3, 0x3e},	/* bd60 */
810c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
811c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x2d, 0x00},	/* advfl */
812c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine};
813c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
8148d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moinestatic const u8 ov965x_start_2_svga[][2] = {	/* same for xga */
815c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x3b, 0xc4},	/* com11 - night mode 1/4 frame rate */
816c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x1e, 0x04},	/* mvfp */
817c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x13, 0xe0},	/* com8 */
818c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x00, 0x00},
819c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x13, 0xe7},	/* com8 - everything (AGC, AWB and AEC) */
820c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x11, 0x01},	/* clkrc */
821c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x6b, 0x5a},	/* dblv */
822c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x6a, 0x0c},	/* 50 Hz banding filter */
823c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc5, 0x0f},	/* 60 Hz banding filter */
824c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xa2, 0x4e},	/* bd50 */
825c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xa3, 0x41},	/* bd60 */
826c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine};
827c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
8288d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moinestatic const u8 ov965x_start_2_sxga[][2] = {
829c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x13, 0xe0},	/* com8 */
830c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x00, 0x00},
831c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x13, 0xe7},	/* com8 - everything (AGC, AWB and AEC) */
832c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x3b, 0xc4},	/* com11 - night mode 1/4 frame rate */
833c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x1e, 0x04},	/* mvfp */
834c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x11, 0x01},	/* clkrc */
835c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x6b, 0x5a},	/* dblv */
836c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0x6a, 0x0c},	/* 50 Hz banding filter */
837c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xc5, 0x0f},	/* 60 Hz banding filter */
838c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xa2, 0x4e},	/* bd50 */
839c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{0xa3, 0x41},	/* bd60 */
840c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine};
841c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
842965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguerostatic const u8 ov562x_init[][2] = {
843965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x88, 0x20},
844965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x89, 0x0a},
845965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x8a, 0x90},
846965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x8b, 0x06},
847965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x8c, 0x01},
848965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x8d, 0x10},
849965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x1c, 0x00},
850965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x1d, 0x48},
851965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x1d, 0x00},
852965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x1d, 0xff},
853965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x1c, 0x0a},
854965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x1d, 0x2e},
855965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x1d, 0x1e},
856965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero};
857965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero
858965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguerostatic const u8 ov562x_init_2[][2] = {
859965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x12, 0x80},
860965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x11, 0x41},
861965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x13, 0x00},
862965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x10, 0x1e},
863965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x3b, 0x07},
864965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x5b, 0x40},
865965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x39, 0x07},
866965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x53, 0x02},
867965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x54, 0x60},
868965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x04, 0x20},
869965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x27, 0x04},
870965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x3d, 0x40},
871965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x36, 0x00},
872965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0xc5, 0x04},
873965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x4e, 0x00},
874965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x4f, 0x93},
875965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x50, 0x7b},
876965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0xca, 0x0c},
877965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0xcb, 0x0f},
878965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x39, 0x07},
879965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x4a, 0x10},
880965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x3e, 0x0a},
881965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x3d, 0x00},
882965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x0c, 0x38},
883965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x38, 0x90},
884965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x46, 0x30},
885965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x4f, 0x93},
886965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x50, 0x7b},
887965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0xab, 0x00},
888965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0xca, 0x0c},
889965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0xcb, 0x0f},
890965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x37, 0x02},
891965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x44, 0x48},
892965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x8d, 0x44},
893965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x2a, 0x00},
894965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x2b, 0x00},
895965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x32, 0x00},
896965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x38, 0x90},
897965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x53, 0x02},
898965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x54, 0x60},
899965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x12, 0x00},
900965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x17, 0x12},
901965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x18, 0xb4},
902965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x19, 0x0c},
903965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x1a, 0xf4},
904965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x03, 0x4a},
905965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x89, 0x20},
906965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x83, 0x80},
907965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0xb7, 0x9d},
908965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0xb6, 0x11},
909965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0xb5, 0x55},
910965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0xb4, 0x00},
911965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0xa9, 0xf0},
912965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0xa8, 0x0a},
913965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0xb8, 0xf0},
914965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0xb9, 0xf0},
915965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0xba, 0xf0},
916965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x81, 0x07},
917965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x63, 0x44},
918965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x13, 0xc7},
919965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x14, 0x60},
920965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x33, 0x75},
921965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x2c, 0x00},
922965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x09, 0x00},
923965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x35, 0x30},
924965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x27, 0x04},
925965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x3c, 0x07},
926965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x3a, 0x0a},
927965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x3b, 0x07},
928965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x01, 0x40},
929965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x02, 0x40},
930965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x16, 0x40},
931965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x52, 0xb0},
932965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x51, 0x83},
933965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x21, 0xbb},
934965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x22, 0x10},
935965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x23, 0x03},
936965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x35, 0x38},
937965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x20, 0x90},
938965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x28, 0x30},
939965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x73, 0xe1},
940965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x6c, 0x00},
941965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x6d, 0x80},
942965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x6e, 0x00},
943965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x70, 0x04},
944965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x71, 0x00},
945965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x8d, 0x04},
946965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x64, 0x00},
947965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x65, 0x00},
948965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x66, 0x00},
949965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x67, 0x00},
950965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x68, 0x00},
951965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x69, 0x00},
952965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x6a, 0x00},
953965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x6b, 0x00},
954965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x71, 0x94},
955965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x74, 0x20},
956965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x80, 0x09},
957965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{0x85, 0xc0},
958965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero};
959965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero
960c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void reg_w_i(struct gspca_dev *gspca_dev, u16 reg, u8 val)
961c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{
962c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	struct usb_device *udev = gspca_dev->dev;
963c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	int ret;
964c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
965c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	if (gspca_dev->usb_err < 0)
966c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		return;
967c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	gspca_dev->usb_buf[0] = val;
968c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	ret = usb_control_msg(udev,
969c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			      usb_sndctrlpipe(udev, 0),
970c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			      0x01,
971c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			      USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
972c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			      0x00, reg, gspca_dev->usb_buf, 1, CTRL_TIMEOUT);
973c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	if (ret < 0) {
974133a9fe949862d9ed8411fb423739f4cee08232dJoe Perches		pr_err("reg_w failed %d\n", ret);
975c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		gspca_dev->usb_err = ret;
976c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	}
977c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}
978c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
979c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void reg_w(struct gspca_dev *gspca_dev, u16 reg, u8 val)
980c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{
981c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	PDEBUG(D_USBO, "reg_w [%04x] = %02x", reg, val);
982c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	reg_w_i(gspca_dev, reg, val);
983c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}
984c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
985c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic u8 reg_r(struct gspca_dev *gspca_dev, u16 reg)
986c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{
987c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	struct usb_device *udev = gspca_dev->dev;
988c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	int ret;
989c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
990c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	if (gspca_dev->usb_err < 0)
991c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		return 0;
992c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	ret = usb_control_msg(udev,
993c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			      usb_rcvctrlpipe(udev, 0),
994c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			      0x01,
995c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			      USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
996c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			      0x00, reg, gspca_dev->usb_buf, 1, CTRL_TIMEOUT);
997c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	PDEBUG(D_USBI, "reg_r [%04x] -> %02x", reg, gspca_dev->usb_buf[0]);
998c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	if (ret < 0) {
999133a9fe949862d9ed8411fb423739f4cee08232dJoe Perches		pr_err("reg_r err %d\n", ret);
1000c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		gspca_dev->usb_err = ret;
1001c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	}
1002c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	return gspca_dev->usb_buf[0];
1003c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}
1004c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1005c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic int sccb_check_status(struct gspca_dev *gspca_dev)
1006c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{
1007c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	u8 data;
1008c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	int i;
1009c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1010c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	for (i = 0; i < 5; i++) {
1011c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		data = reg_r(gspca_dev, OV534_REG_STATUS);
1012c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1013c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		switch (data) {
1014c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		case 0x00:
1015c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			return 1;
1016c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		case 0x04:
1017c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			return 0;
1018c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		case 0x03:
1019c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			break;
1020c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		default:
1021c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			PDEBUG(D_USBI|D_USBO,
1022c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine				"sccb status 0x%02x, attempt %d/5",
1023c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine				data, i + 1);
1024c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		}
1025c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	}
1026c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	return 0;
1027c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}
1028c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1029c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void sccb_write(struct gspca_dev *gspca_dev, u8 reg, u8 val)
1030c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{
1031c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	PDEBUG(D_USBO, "sccb_write [%02x] = %02x", reg, val);
1032c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	reg_w_i(gspca_dev, OV534_REG_SUBADDR, reg);
1033c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	reg_w_i(gspca_dev, OV534_REG_WRITE, val);
1034c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	reg_w_i(gspca_dev, OV534_REG_OPERATION, OV534_OP_WRITE_3);
1035c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1036c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	if (!sccb_check_status(gspca_dev))
1037133a9fe949862d9ed8411fb423739f4cee08232dJoe Perches		pr_err("sccb_write failed\n");
1038c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}
1039c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1040c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic u8 sccb_read(struct gspca_dev *gspca_dev, u16 reg)
1041c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{
1042c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	reg_w(gspca_dev, OV534_REG_SUBADDR, reg);
1043c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	reg_w(gspca_dev, OV534_REG_OPERATION, OV534_OP_WRITE_2);
1044c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	if (!sccb_check_status(gspca_dev))
1045133a9fe949862d9ed8411fb423739f4cee08232dJoe Perches		pr_err("sccb_read failed 1\n");
1046c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1047c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	reg_w(gspca_dev, OV534_REG_OPERATION, OV534_OP_READ_2);
1048c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	if (!sccb_check_status(gspca_dev))
1049133a9fe949862d9ed8411fb423739f4cee08232dJoe Perches		pr_err("sccb_read failed 2\n");
1050c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1051c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	return reg_r(gspca_dev, OV534_REG_READ);
1052c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}
1053c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1054c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/* output a bridge sequence (reg - val) */
1055c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void reg_w_array(struct gspca_dev *gspca_dev,
1056c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			const u8 (*data)[2], int len)
1057c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{
1058c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	while (--len >= 0) {
1059c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		reg_w(gspca_dev, (*data)[0], (*data)[1]);
1060c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		data++;
1061c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	}
1062c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}
1063c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1064c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/* output a sensor sequence (reg - val) */
1065c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void sccb_w_array(struct gspca_dev *gspca_dev,
1066c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			const u8 (*data)[2], int len)
1067c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{
1068c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	while (--len >= 0) {
1069c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		if ((*data)[0] != 0xff) {
1070c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			sccb_write(gspca_dev, (*data)[0], (*data)[1]);
1071c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		} else {
1072c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			sccb_read(gspca_dev, (*data)[1]);
1073c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			sccb_write(gspca_dev, 0xff, 0x00);
1074c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		}
1075c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		data++;
1076c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	}
1077c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}
1078c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1079c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/* Two bits control LED: 0x21 bit 7 and 0x23 bit 7.
1080c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * (direction and output)? */
1081c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void set_led(struct gspca_dev *gspca_dev, int status)
1082c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{
1083c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	u8 data;
1084c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1085c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	PDEBUG(D_CONF, "led status: %d", status);
1086c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1087c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	data = reg_r(gspca_dev, 0x21);
1088c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	data |= 0x80;
1089c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	reg_w(gspca_dev, 0x21, data);
1090c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1091c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	data = reg_r(gspca_dev, 0x23);
1092c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	if (status)
1093c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		data |= 0x80;
1094c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	else
1095c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		data &= ~0x80;
1096c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1097c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	reg_w(gspca_dev, 0x23, data);
1098c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1099c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	if (!status) {
1100c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		data = reg_r(gspca_dev, 0x21);
1101c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		data &= ~0x80;
1102c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		reg_w(gspca_dev, 0x21, data);
1103c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	}
1104c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}
1105c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1106c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void setbrightness(struct gspca_dev *gspca_dev)
1107c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{
1108c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	struct sd *sd = (struct sd *) gspca_dev;
1109c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	u8 val;
1110d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero	s8 sval;
1111c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
11127592e0377636963eade33810fcad06487b8b153fJean-François Moine	if (gspca_dev->ctrl_dis & (1 << BRIGHTNESS))
11137592e0377636963eade33810fcad06487b8b153fJean-François Moine		return;
1114d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero	if (sd->sensor == SENSOR_OV562x) {
1115d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero		sval = sd->ctrls[BRIGHTNESS].val;
1116d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero		val = 0x76;
1117d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero		val += sval;
1118d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero		sccb_write(gspca_dev, 0x24, val);
1119d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero		val = 0x6a;
1120d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero		val += sval;
1121d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero		sccb_write(gspca_dev, 0x25, val);
1122d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero		if (sval < -40)
1123d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero			val = 0x71;
1124d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero		else if (sval < 20)
1125d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero			val = 0x94;
1126d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero		else
1127d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero			val = 0xe6;
1128d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero		sccb_write(gspca_dev, 0x26, val);
1129d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero	} else {
1130d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero		val = sd->ctrls[BRIGHTNESS].val;
1131d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero		if (val < 8)
1132d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero			val = 15 - val;		/* f .. 8 */
1133d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero		else
1134d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero			val = val - 8;		/* 0 .. 7 */
1135d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero		sccb_write(gspca_dev, 0x55,	/* brtn - brightness adjustment */
1136d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero				0x0f | (val << 4));
1137d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero	}
1138c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}
1139c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1140c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void setcontrast(struct gspca_dev *gspca_dev)
1141c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{
1142c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	struct sd *sd = (struct sd *) gspca_dev;
1143c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
11448d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	if (gspca_dev->ctrl_dis & (1 << CONTRAST))
11458d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		return;
1146c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	sccb_write(gspca_dev, 0x56,	/* cnst1 - contrast 1 ctrl coeff */
11477592e0377636963eade33810fcad06487b8b153fJean-François Moine			sd->ctrls[CONTRAST].val << 4);
1148c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}
1149c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1150c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void setautogain(struct gspca_dev *gspca_dev)
1151c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{
1152c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	struct sd *sd = (struct sd *) gspca_dev;
1153c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	u8 val;
1154c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
11558d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	if (gspca_dev->ctrl_dis & (1 << AUTOGAIN))
11568d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		return;
1157c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/*fixme: should adjust agc/awb/aec by different controls */
1158c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	val = sccb_read(gspca_dev, 0x13);		/* com8 */
1159c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	sccb_write(gspca_dev, 0xff, 0x00);
11607592e0377636963eade33810fcad06487b8b153fJean-François Moine	if (sd->ctrls[AUTOGAIN].val)
1161c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		val |= 0x05;		/* agc & aec */
1162c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	else
1163c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		val &= 0xfa;
1164c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	sccb_write(gspca_dev, 0x13, val);
1165c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}
1166c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1167c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void setexposure(struct gspca_dev *gspca_dev)
1168c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{
1169c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	struct sd *sd = (struct sd *) gspca_dev;
1170c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	u8 val;
1171c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	static const u8 expo[4] = {0x00, 0x25, 0x38, 0x5e};
1172c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
11738d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	if (gspca_dev->ctrl_dis & (1 << EXPOSURE))
11748d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		return;
1175c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	sccb_write(gspca_dev, 0x10,			/* aec[9:2] */
11767592e0377636963eade33810fcad06487b8b153fJean-François Moine			expo[sd->ctrls[EXPOSURE].val]);
1177c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1178c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	val = sccb_read(gspca_dev, 0x13);		/* com8 */
1179c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	sccb_write(gspca_dev, 0xff, 0x00);
1180c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	sccb_write(gspca_dev, 0x13, val);
1181c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1182c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	val = sccb_read(gspca_dev, 0xa1);		/* aech */
1183c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	sccb_write(gspca_dev, 0xff, 0x00);
1184c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	sccb_write(gspca_dev, 0xa1, val & 0xe0);	/* aec[15:10] = 0 */
1185c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}
1186c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1187c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void setsharpness(struct gspca_dev *gspca_dev)
1188c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{
1189c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	struct sd *sd = (struct sd *) gspca_dev;
1190c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	s8 val;
1191c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
11928d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	if (gspca_dev->ctrl_dis & (1 << SHARPNESS))
11938d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		return;
11947592e0377636963eade33810fcad06487b8b153fJean-François Moine	val = sd->ctrls[SHARPNESS].val;
1195c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	if (val < 0) {				/* auto */
1196c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		val = sccb_read(gspca_dev, 0x42);	/* com17 */
1197c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		sccb_write(gspca_dev, 0xff, 0x00);
1198c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		sccb_write(gspca_dev, 0x42, val | 0x40);
1199c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine				/* Edge enhancement strength auto adjust */
1200c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		return;
1201c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	}
1202c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	if (val != 0)
1203c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		val = 1 << (val - 1);
1204c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	sccb_write(gspca_dev, 0x3f,	/* edge - edge enhance. factor */
1205c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			val);
1206c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	val = sccb_read(gspca_dev, 0x42);		/* com17 */
1207c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	sccb_write(gspca_dev, 0xff, 0x00);
1208c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	sccb_write(gspca_dev, 0x42, val & 0xbf);
1209c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}
1210c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1211c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void setsatur(struct gspca_dev *gspca_dev)
1212c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{
1213c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	struct sd *sd = (struct sd *) gspca_dev;
1214c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	u8 val1, val2, val3;
1215c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	static const u8 matrix[5][2] = {
1216c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		{0x14, 0x38},
1217c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		{0x1e, 0x54},
1218c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		{0x28, 0x70},
1219c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		{0x32, 0x8c},
1220c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		{0x48, 0x90}
1221c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	};
1222c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
12238d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	if (gspca_dev->ctrl_dis & (1 << SATUR))
12248d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		return;
12257592e0377636963eade33810fcad06487b8b153fJean-François Moine	val1 = matrix[sd->ctrls[SATUR].val][0];
12267592e0377636963eade33810fcad06487b8b153fJean-François Moine	val2 = matrix[sd->ctrls[SATUR].val][1];
1227c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	val3 = val1 + val2;
1228c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	sccb_write(gspca_dev, 0x4f, val3);	/* matrix coeff */
1229c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	sccb_write(gspca_dev, 0x50, val3);
1230c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	sccb_write(gspca_dev, 0x51, 0x00);
1231c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	sccb_write(gspca_dev, 0x52, val1);
1232c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	sccb_write(gspca_dev, 0x53, val2);
1233c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	sccb_write(gspca_dev, 0x54, val3);
1234c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	sccb_write(gspca_dev, 0x58, 0x1a);	/* mtxs - coeff signs */
1235c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1236c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	val1 = sccb_read(gspca_dev, 0x41);	/* com16 */
1237c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	sccb_write(gspca_dev, 0xff, 0x00);
1238c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	sccb_write(gspca_dev, 0x41, val1);
1239c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}
1240c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
12417592e0377636963eade33810fcad06487b8b153fJean-François Moinestatic void setlightfreq(struct gspca_dev *gspca_dev)
1242c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{
1243c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	struct sd *sd = (struct sd *) gspca_dev;
1244c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	u8 val;
1245c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
12468d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	if (gspca_dev->ctrl_dis & (1 << LIGHTFREQ))
12478d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		return;
1248c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	val = sccb_read(gspca_dev, 0x13);		/* com8 */
1249c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	sccb_write(gspca_dev, 0xff, 0x00);
12507592e0377636963eade33810fcad06487b8b153fJean-François Moine	if (sd->ctrls[LIGHTFREQ].val == 0) {
1251c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		sccb_write(gspca_dev, 0x13, val & 0xdf);
1252c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		return;
1253c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	}
1254c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	sccb_write(gspca_dev, 0x13, val | 0x20);
1255c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1256c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	val = sccb_read(gspca_dev, 0x42);		/* com17 */
1257c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	sccb_write(gspca_dev, 0xff, 0x00);
12587592e0377636963eade33810fcad06487b8b153fJean-François Moine	if (sd->ctrls[LIGHTFREQ].val == 1)
1259c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		val |= 0x01;
1260c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	else
1261c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		val &= 0xfe;
1262c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	sccb_write(gspca_dev, 0x42, val);
1263c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}
1264c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1265c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/* this function is called at probe time */
1266c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic int sd_config(struct gspca_dev *gspca_dev,
1267c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		     const struct usb_device_id *id)
1268c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{
1269c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	struct sd *sd = (struct sd *) gspca_dev;
1270c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
12717592e0377636963eade33810fcad06487b8b153fJean-François Moine	gspca_dev->cam.ctrls = sd->ctrls;
1272c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1273c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#if AUTOGAIN_DEF != 0
12747592e0377636963eade33810fcad06487b8b153fJean-François Moine	gspca_dev->ctrl_inac |= (1 << EXPOSURE);
1275c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#endif
1276c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	return 0;
1277c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}
1278c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1279c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/* this function is called at probe and resume time */
1280c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic int sd_init(struct gspca_dev *gspca_dev)
1281c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{
12828d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	struct sd *sd = (struct sd *) gspca_dev;
1283c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	u16 sensor_id;
1284c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1285c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	/* reset bridge */
1286c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	reg_w(gspca_dev, 0xe7, 0x3a);
1287c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	reg_w(gspca_dev, 0xe0, 0x08);
1288c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	msleep(100);
1289c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1290c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	/* initialize the sensor address */
1291c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	reg_w(gspca_dev, OV534_REG_ADDRESS, 0x60);
1292c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1293c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	/* reset sensor */
1294c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	sccb_write(gspca_dev, 0x12, 0x80);
1295c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	msleep(10);
1296c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1297c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	/* probe the sensor */
1298c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	sccb_read(gspca_dev, 0x0a);
1299c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	sensor_id = sccb_read(gspca_dev, 0x0a) << 8;
1300c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	sccb_read(gspca_dev, 0x0b);
1301c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	sensor_id |= sccb_read(gspca_dev, 0x0b);
1302c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	PDEBUG(D_PROBE, "Sensor ID: %04x", sensor_id);
1303c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1304c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	/* initialize */
13058d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	if ((sensor_id & 0xfff0) == 0x9650) {
13068d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		sd->sensor = SENSOR_OV965x;
13078d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine
13088d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		gspca_dev->cam.cam_mode = ov965x_mode;
13098d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		gspca_dev->cam.nmodes = ARRAY_SIZE(ov965x_mode);
13108d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine
13118d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		reg_w_array(gspca_dev, bridge_init,
13128d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine				ARRAY_SIZE(bridge_init));
13138d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		sccb_w_array(gspca_dev, ov965x_init,
13148d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine				ARRAY_SIZE(ov965x_init));
13158d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		reg_w_array(gspca_dev, bridge_init_2,
13168d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine				ARRAY_SIZE(bridge_init_2));
13178d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		sccb_w_array(gspca_dev, ov965x_init_2,
13188d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine				ARRAY_SIZE(ov965x_init_2));
13198d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		reg_w(gspca_dev, 0xe0, 0x00);
13208d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		reg_w(gspca_dev, 0xe0, 0x01);
13218d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		set_led(gspca_dev, 0);
13228d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		reg_w(gspca_dev, 0xe0, 0x00);
13238d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	} else if ((sensor_id & 0xfff0) == 0x9710) {
13248d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		const char *p;
13258d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		int l;
13268d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine
13278d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		sd->sensor = SENSOR_OV971x;
13288d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine
13298d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		gspca_dev->cam.cam_mode = ov971x_mode;
13308d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		gspca_dev->cam.nmodes = ARRAY_SIZE(ov971x_mode);
13318d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine
13328d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		/* no control yet */
13338d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		gspca_dev->ctrl_dis = (1 << NCTRLS) - 1;
13348d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine
13358d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		gspca_dev->cam.bulk = 1;
13368d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		gspca_dev->cam.bulk_size = 16384;
13378d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		gspca_dev->cam.bulk_nurbs = 2;
13388d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine
13398d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		sccb_w_array(gspca_dev, ov971x_init,
13408d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine				ARRAY_SIZE(ov971x_init));
13418d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine
13428d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		/* set video format on bridge processor */
13438d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		/* access bridge processor's video format registers at: 0x00 */
13448d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		reg_w(gspca_dev, 0x1c, 0x00);
13458d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		/*set register: 0x00 is 'RAW8', 0x40 is 'YUV422' (YUYV?)*/
13468d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		reg_w(gspca_dev, 0x1d, 0x00);
13478d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine
13488d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		/* Will W. specific stuff
13498d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		 * set VSYNC to
13508d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		 *	output (0x1f) if first webcam
13518d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		 *	input (0x17) if 2nd or 3rd webcam */
13528d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		p = video_device_node_name(&gspca_dev->vdev);
13538d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		l = strlen(p) - 1;
13548d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		if (p[l] == '0')
13558d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine			reg_w(gspca_dev, 0x56, 0x1f);
13568d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		else
13578d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine			reg_w(gspca_dev, 0x56, 0x17);
1358965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	} else if ((sensor_id & 0xfff0) == 0x5620) {
1359965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero		sd->sensor = SENSOR_OV562x;
1360d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero		gspca_dev->ctrl_dis = (1 << CONTRAST) |
1361d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero					(1 << AUTOGAIN) |
1362d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero					(1 << EXPOSURE) |
1363d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero					(1 << SHARPNESS) |
1364d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero					(1 << SATUR) |
1365d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero					(1 << LIGHTFREQ);
1366d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero
1367d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero		sd->ctrls[BRIGHTNESS].min = -90;
1368d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero		sd->ctrls[BRIGHTNESS].max = 90;
1369d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero		sd->ctrls[BRIGHTNESS].def = 0;
1370965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero		gspca_dev->cam.cam_mode = ov562x_mode;
1371965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero		gspca_dev->cam.nmodes = ARRAY_SIZE(ov562x_mode);
1372965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero
1373965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero		reg_w_array(gspca_dev, ov562x_init,
1374965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero				ARRAY_SIZE(ov562x_init));
1375965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero		sccb_w_array(gspca_dev, ov562x_init_2,
1376965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero				ARRAY_SIZE(ov562x_init_2));
1377965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero		reg_w(gspca_dev, 0xe0, 0x00);
13788d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	} else {
13798d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		err("Unknown sensor %04x", sensor_id);
13808d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		return -EINVAL;
13818d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	}
1382c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
13834b27d074748553916ebbdeed9630a6959c85e7deJean-Francois Moine	return gspca_dev->usb_err;
1384c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}
1385c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1386c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic int sd_start(struct gspca_dev *gspca_dev)
1387c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{
13888d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	struct sd *sd = (struct sd *) gspca_dev;
13898d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine
1390d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero	if (sd->sensor == SENSOR_OV971x)
13918d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		return gspca_dev->usb_err;
1392d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero	else if (sd->sensor == SENSOR_OV562x) {
1393d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero		setbrightness(gspca_dev);
1394d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero		return gspca_dev->usb_err;
1395d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero	}
1396c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	switch (gspca_dev->curr_mode) {
1397c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	case QVGA_MODE:			/* 320x240 */
13988d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		sccb_w_array(gspca_dev, ov965x_start_1_vga,
13998d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine				ARRAY_SIZE(ov965x_start_1_vga));
1400c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		reg_w_array(gspca_dev, bridge_start_qvga,
1401c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine				ARRAY_SIZE(bridge_start_qvga));
14028d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		sccb_w_array(gspca_dev, ov965x_start_2_qvga,
14038d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine				ARRAY_SIZE(ov965x_start_2_qvga));
1404c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		break;
1405c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	case VGA_MODE:			/* 640x480 */
14068d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		sccb_w_array(gspca_dev, ov965x_start_1_vga,
14078d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine				ARRAY_SIZE(ov965x_start_1_vga));
1408c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		reg_w_array(gspca_dev, bridge_start_vga,
1409c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine				ARRAY_SIZE(bridge_start_vga));
14108d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		sccb_w_array(gspca_dev, ov965x_start_2_vga,
14118d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine				ARRAY_SIZE(ov965x_start_2_vga));
1412c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		break;
1413c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	case SVGA_MODE:			/* 800x600 */
14148d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		sccb_w_array(gspca_dev, ov965x_start_1_svga,
14158d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine				ARRAY_SIZE(ov965x_start_1_svga));
1416c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		reg_w_array(gspca_dev, bridge_start_svga,
1417c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine				ARRAY_SIZE(bridge_start_svga));
14188d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		sccb_w_array(gspca_dev, ov965x_start_2_svga,
14198d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine				ARRAY_SIZE(ov965x_start_2_svga));
1420c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		break;
1421c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	case XGA_MODE:			/* 1024x768 */
14228d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		sccb_w_array(gspca_dev, ov965x_start_1_xga,
14238d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine				ARRAY_SIZE(ov965x_start_1_xga));
1424c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		reg_w_array(gspca_dev, bridge_start_xga,
1425c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine				ARRAY_SIZE(bridge_start_xga));
14268d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		sccb_w_array(gspca_dev, ov965x_start_2_svga,
14278d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine				ARRAY_SIZE(ov965x_start_2_svga));
1428c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		break;
1429c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	default:
1430c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/*	case SXGA_MODE:			 * 1280x1024 */
14318d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		sccb_w_array(gspca_dev, ov965x_start_1_sxga,
14328d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine				ARRAY_SIZE(ov965x_start_1_sxga));
1433c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		reg_w_array(gspca_dev, bridge_start_sxga,
1434c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine				ARRAY_SIZE(bridge_start_sxga));
14358d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		sccb_w_array(gspca_dev, ov965x_start_2_sxga,
14368d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine				ARRAY_SIZE(ov965x_start_2_sxga));
1437c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		break;
1438c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	}
14397592e0377636963eade33810fcad06487b8b153fJean-François Moine	setlightfreq(gspca_dev);
1440c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	setautogain(gspca_dev);
1441c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	setbrightness(gspca_dev);
1442c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	setcontrast(gspca_dev);
1443c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	setexposure(gspca_dev);
1444c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	setsharpness(gspca_dev);
1445c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	setsatur(gspca_dev);
1446c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1447c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	reg_w(gspca_dev, 0xe0, 0x00);
1448c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	reg_w(gspca_dev, 0xe0, 0x00);
1449c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	set_led(gspca_dev, 1);
14504b27d074748553916ebbdeed9630a6959c85e7deJean-Francois Moine	return gspca_dev->usb_err;
1451c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}
1452c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1453c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void sd_stopN(struct gspca_dev *gspca_dev)
1454c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{
1455c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	reg_w(gspca_dev, 0xe0, 0x01);
1456c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	set_led(gspca_dev, 0);
1457c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	reg_w(gspca_dev, 0xe0, 0x00);
1458c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}
1459c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1460c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/* Values for bmHeaderInfo (Video and Still Image Payload Headers, 2.4.3.3) */
1461c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define UVC_STREAM_EOH	(1 << 7)
1462c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define UVC_STREAM_ERR	(1 << 6)
1463c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define UVC_STREAM_STI	(1 << 5)
1464c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define UVC_STREAM_RES	(1 << 4)
1465c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define UVC_STREAM_SCR	(1 << 3)
1466c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define UVC_STREAM_PTS	(1 << 2)
1467c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define UVC_STREAM_EOF	(1 << 1)
1468c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define UVC_STREAM_FID	(1 << 0)
1469c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1470c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void sd_pkt_scan(struct gspca_dev *gspca_dev,
1471c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			u8 *data, int len)
1472c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{
1473c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	struct sd *sd = (struct sd *) gspca_dev;
1474c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	__u32 this_pts;
1475c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	u8 this_fid;
1476c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	int remaining_len = len;
14778d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	int payload_len;
1478c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
14798d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	payload_len = gspca_dev->cam.bulk ? 2048 : 2040;
1480c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	do {
14818d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine		len = min(remaining_len, payload_len);
1482c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1483c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		/* Payloads are prefixed with a UVC-style header.  We
1484c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		   consider a frame to start when the FID toggles, or the PTS
1485c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		   changes.  A frame ends when EOF is set, and we've received
1486c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		   the correct number of bytes. */
1487c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1488c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		/* Verify UVC header.  Header length is always 12 */
1489c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		if (data[0] != 12 || len < 12) {
1490c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			PDEBUG(D_PACK, "bad header");
1491c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			goto discard;
1492c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		}
1493c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1494c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		/* Check errors */
1495c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		if (data[1] & UVC_STREAM_ERR) {
1496c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			PDEBUG(D_PACK, "payload error");
1497c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			goto discard;
1498c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		}
1499c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1500c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		/* Extract PTS and FID */
1501c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		if (!(data[1] & UVC_STREAM_PTS)) {
1502c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			PDEBUG(D_PACK, "PTS not present");
1503c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			goto discard;
1504c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		}
1505c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		this_pts = (data[5] << 24) | (data[4] << 16)
1506c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine						| (data[3] << 8) | data[2];
1507c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		this_fid = data[1] & UVC_STREAM_FID;
1508c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1509c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		/* If PTS or FID has changed, start a new frame. */
1510c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		if (this_pts != sd->last_pts || this_fid != sd->last_fid) {
1511c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			if (gspca_dev->last_packet_type == INTER_PACKET)
1512c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine				gspca_frame_add(gspca_dev, LAST_PACKET,
1513c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine						NULL, 0);
1514c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			sd->last_pts = this_pts;
1515c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			sd->last_fid = this_fid;
1516c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			gspca_frame_add(gspca_dev, FIRST_PACKET,
1517c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine					data + 12, len - 12);
1518c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		/* If this packet is marked as EOF, end the frame */
1519c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		} else if (data[1] & UVC_STREAM_EOF) {
1520c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			sd->last_pts = 0;
1521c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			gspca_frame_add(gspca_dev, LAST_PACKET,
1522c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine					data + 12, len - 12);
1523c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		} else {
1524c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1525c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			/* Add the data from this payload */
1526c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			gspca_frame_add(gspca_dev, INTER_PACKET,
1527c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine					data + 12, len - 12);
1528c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		}
1529c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1530c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		/* Done this payload */
1531c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		goto scan_next;
1532c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1533c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinediscard:
1534c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		/* Discard data until a new frame starts. */
1535c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		gspca_dev->last_packet_type = DISCARD_PACKET;
1536c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1537c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinescan_next:
1538c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		remaining_len -= len;
1539c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		data += len;
1540c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	} while (remaining_len > 0);
1541c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}
1542c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1543c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic int sd_querymenu(struct gspca_dev *gspca_dev,
1544c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			struct v4l2_querymenu *menu)
1545c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{
1546c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	switch (menu->id) {
1547c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	case V4L2_CID_POWER_LINE_FREQUENCY:
1548c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		switch (menu->index) {
1549c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		case 0:		/* V4L2_CID_POWER_LINE_FREQUENCY_DISABLED */
1550c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			strcpy((char *) menu->name, "NoFliker");
1551c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			return 0;
1552c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		case 1:		/* V4L2_CID_POWER_LINE_FREQUENCY_50HZ */
1553c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			strcpy((char *) menu->name, "50 Hz");
1554c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			return 0;
1555c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		case 2:		/* V4L2_CID_POWER_LINE_FREQUENCY_60HZ */
1556c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			strcpy((char *) menu->name, "60 Hz");
1557c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			return 0;
1558c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		}
1559c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine		break;
1560c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	}
1561c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	return -EINVAL;
1562c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}
1563c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1564c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/* sub-driver description */
1565c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic const struct sd_desc sd_desc = {
1566c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	.name     = MODULE_NAME,
1567c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	.ctrls    = sd_ctrls,
15687592e0377636963eade33810fcad06487b8b153fJean-François Moine	.nctrls   = NCTRLS,
1569c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	.config   = sd_config,
1570c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	.init     = sd_init,
1571c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	.start    = sd_start,
1572c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	.stopN    = sd_stopN,
1573c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	.pkt_scan = sd_pkt_scan,
1574c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	.querymenu = sd_querymenu,
1575c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine};
1576c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1577c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/* -- module initialisation -- */
157895c967c167785eb991cf6b22fb854dd8d61d0ff8Jean-François Moinestatic const struct usb_device_id device_table[] = {
15798d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine	{USB_DEVICE(0x05a9, 0x8065)},
1580c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{USB_DEVICE(0x06f8, 0x3003)},
1581965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero	{USB_DEVICE(0x05a9, 0x1550)},
1582c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{}
1583c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine};
1584c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1585c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois MoineMODULE_DEVICE_TABLE(usb, device_table);
1586c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1587c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/* -- device connect -- */
1588c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic int sd_probe(struct usb_interface *intf, const struct usb_device_id *id)
1589c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{
1590c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd),
1591c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine				THIS_MODULE);
1592c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}
1593c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1594c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic struct usb_driver sd_driver = {
1595c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	.name       = MODULE_NAME,
1596c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	.id_table   = device_table,
1597c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	.probe      = sd_probe,
1598c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	.disconnect = gspca_disconnect,
1599c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#ifdef CONFIG_PM
1600c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	.suspend    = gspca_suspend,
1601c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	.resume     = gspca_resume,
1602c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#endif
1603c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine};
1604c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1605ecb3b2b35db49778b6d89e3ffd0c400776c20735Greg Kroah-Hartmanmodule_usb_driver(sd_driver);
1606