1fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite/*
2458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine * ov534-ov7xxx gspca driver
3189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine *
4fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite * Copyright (C) 2008 Antonio Ospite <ospite@studenti.unina.it>
50f7a50b29dd9c8603d5ce15c11fd1a1d731e1a6dJim Paris * Copyright (C) 2008 Jim Paris <jim@jtan.com>
62ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine * Copyright (C) 2009 Jean-Francois Moine http://moinejf.free.fr
7fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite *
8fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite * Based on a prototype written by Mark Ferrell <majortrips@gmail.com>
9fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite * USB protocol reverse engineered by Jim Paris <jim@jtan.com>
10fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite * https://jim.sh/svn/jim/devl/playstation/ps3/eye/test/
11fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite *
12189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine * PS3 Eye camera enhanced by Richard Kaswy http://kaswy.free.fr
136721b51ece65967fe628007fee3e16479c07afd1Max Thrun * PS3 Eye camera - brightness, contrast, awb, agc, aec controls
146721b51ece65967fe628007fee3e16479c07afd1Max Thrun *                  added by Max Thrun <bear24rw@gmail.com>
15189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine *
16fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite * This program is free software; you can redistribute it and/or modify
17fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite * it under the terms of the GNU General Public License as published by
18fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite * the Free Software Foundation; either version 2 of the License, or
19fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite * any later version.
20fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite *
21fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite * This program is distributed in the hope that it will be useful,
22fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite * but WITHOUT ANY WARRANTY; without even the implied warranty of
23fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite * GNU General Public License for more details.
25fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite *
26fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite * You should have received a copy of the GNU General Public License
27fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite * along with this program; if not, write to the Free Software
28fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
29fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite */
30fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite
31133a9fe949862d9ed8411fb423739f4cee08232dJoe Perches#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
32133a9fe949862d9ed8411fb423739f4cee08232dJoe Perches
33fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite#define MODULE_NAME "ov534"
34fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite
35fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite#include "gspca.h"
36fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite
372ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine#define OV534_REG_ADDRESS	0xf1	/* sensor address */
38fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite#define OV534_REG_SUBADDR	0xf2
39fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite#define OV534_REG_WRITE		0xf3
40fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite#define OV534_REG_READ		0xf4
41fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite#define OV534_REG_OPERATION	0xf5
42fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite#define OV534_REG_STATUS	0xf6
43fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite
44fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite#define OV534_OP_WRITE_3	0x37
45fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite#define OV534_OP_WRITE_2	0x33
46fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite#define OV534_OP_READ_2		0xf9
47fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite
48fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite#define CTRL_TIMEOUT 500
49fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite
50fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio OspiteMODULE_AUTHOR("Antonio Ospite <ospite@studenti.unina.it>");
51fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio OspiteMODULE_DESCRIPTION("GSPCA/OV534 USB Camera Driver");
52fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio OspiteMODULE_LICENSE("GPL");
53fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite
54228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine/* controls */
55228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moineenum e_ctrl {
56228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine	BRIGHTNESS,
57228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine	CONTRAST,
58228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine	GAIN,
59228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine	EXPOSURE,
60228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine	AGC,
61228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine	AWB,
62228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine	AEC,
63228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine	SHARPNESS,
64228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine	HFLIP,
65228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine	VFLIP,
66d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine	COLORS,
67228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine	LIGHTFREQ,
68228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine	NCTRLS		/* number of controls */
69228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine};
70228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine
71fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite/* specific webcam descriptor */
72fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospitestruct sd {
73fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite	struct gspca_dev gspca_dev;	/* !! must be the first item */
74228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine
75228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine	struct gspca_ctrl ctrls[NCTRLS];
76228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine
778c252050146fc6f54e9bf5ef8276b25f3dd67a1cJean-Francois Moine	__u32 last_pts;
7884fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine	u16 last_fid;
7984fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine	u8 frame_rate;
80b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine
81458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	u8 sensor;
82458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine};
83458efe2d558b51fff38026e8ede9374899340e60Jean-François Moineenum sensors {
84458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	SENSOR_OV767x,
85458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	SENSOR_OV772x,
86458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	NSENSORS
87fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite};
88fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite
89fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite/* V4L2 controls supported by the driver */
90228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moinestatic void setbrightness(struct gspca_dev *gspca_dev);
91228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moinestatic void setcontrast(struct gspca_dev *gspca_dev);
92228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moinestatic void setgain(struct gspca_dev *gspca_dev);
93228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moinestatic void setexposure(struct gspca_dev *gspca_dev);
948b7fbda484176b46a7760fd474d605ca5152c86dMax Thrunstatic int sd_setagc(struct gspca_dev *gspca_dev, __s32 val);
95228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moinestatic void setawb(struct gspca_dev *gspca_dev);
96228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moinestatic void setaec(struct gspca_dev *gspca_dev);
97228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moinestatic void setsharpness(struct gspca_dev *gspca_dev);
98228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moinestatic void sethvflip(struct gspca_dev *gspca_dev);
99d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moinestatic void setcolors(struct gspca_dev *gspca_dev);
100228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moinestatic void setlightfreq(struct gspca_dev *gspca_dev);
101228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine
102228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moinestatic int sd_start(struct gspca_dev *gspca_dev);
103228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moinestatic void sd_stopN(struct gspca_dev *gspca_dev);
104189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine
105c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic const struct ctrl sd_ctrls[] = {
106228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine[BRIGHTNESS] = {
1077f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite		{
1087f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.id      = V4L2_CID_BRIGHTNESS,
1097f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.type    = V4L2_CTRL_TYPE_INTEGER,
1107f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.name    = "Brightness",
1117f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.minimum = 0,
1127f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.maximum = 255,
1137f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.step    = 1,
114228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine			.default_value = 0,
1157f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite		},
116228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine		.set_control = setbrightness
117b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine	},
118228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine[CONTRAST] = {
1197f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite		{
1207f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.id      = V4L2_CID_CONTRAST,
1217f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.type    = V4L2_CTRL_TYPE_INTEGER,
1227f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.name    = "Contrast",
1237f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.minimum = 0,
1247f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.maximum = 255,
1257f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.step    = 1,
126228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine			.default_value = 32,
1277f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite		},
128228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine		.set_control = setcontrast
129b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine	},
130228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine[GAIN] = {
1317f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite		{
1327f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.id      = V4L2_CID_GAIN,
1337f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.type    = V4L2_CTRL_TYPE_INTEGER,
1347f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.name    = "Main Gain",
1357f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.minimum = 0,
1367f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.maximum = 63,
1377f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.step    = 1,
138228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine			.default_value = 20,
1397f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite		},
140228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine		.set_control = setgain
141189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	},
142228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine[EXPOSURE] = {
1437f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite		{
1447f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.id      = V4L2_CID_EXPOSURE,
1457f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.type    = V4L2_CTRL_TYPE_INTEGER,
1467f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.name    = "Exposure",
1477f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.minimum = 0,
1487f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.maximum = 255,
1497f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.step    = 1,
150228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine			.default_value = 120,
1517f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite		},
152228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine		.set_control = setexposure
153189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	},
154228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine[AGC] = {
1557f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite		{
1567f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.id      = V4L2_CID_AUTOGAIN,
1577f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.type    = V4L2_CTRL_TYPE_BOOLEAN,
1587f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.name    = "Auto Gain",
1597f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.minimum = 0,
1607f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.maximum = 1,
1617f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.step    = 1,
162228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine			.default_value = 1,
1637f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite		},
164228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine		.set = sd_setagc
165189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	},
166228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine[AWB] = {
1677f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite		{
1687f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.id      = V4L2_CID_AUTO_WHITE_BALANCE,
1697f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.type    = V4L2_CTRL_TYPE_BOOLEAN,
1707f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.name    = "Auto White Balance",
1717f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.minimum = 0,
1727f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.maximum = 1,
1737f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.step    = 1,
174228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine			.default_value = 1,
1757f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite		},
176228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine		.set_control = setawb
177b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine	},
178228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine[AEC] = {
1797f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite		{
1807f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.id      = V4L2_CID_EXPOSURE_AUTO,
1817f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.type    = V4L2_CTRL_TYPE_BOOLEAN,
1827f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.name    = "Auto Exposure",
1837f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.minimum = 0,
1847f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.maximum = 1,
1857f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.step    = 1,
186228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine			.default_value = 1,
1877f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite		},
188228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine		.set_control = setaec
189f2938822523739e99a39fd634943865a432e9c00Max Thrun	},
190228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine[SHARPNESS] = {
1917f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite		{
1927f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.id      = V4L2_CID_SHARPNESS,
1937f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.type    = V4L2_CTRL_TYPE_INTEGER,
1947f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.name    = "Sharpness",
1957f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.minimum = 0,
1967f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.maximum = 63,
1977f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.step    = 1,
198228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine			.default_value = 0,
1997f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite		},
200228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine		.set_control = setsharpness
201189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	},
202228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine[HFLIP] = {
2037f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite		{
2047f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.id      = V4L2_CID_HFLIP,
2057f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.type    = V4L2_CTRL_TYPE_BOOLEAN,
2067f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.name    = "HFlip",
2077f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.minimum = 0,
2087f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.maximum = 1,
2097f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.step    = 1,
210228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine			.default_value = 0,
2117f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite		},
212228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine		.set_control = sethvflip
213189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	},
214228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine[VFLIP] = {
2157f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite		{
2167f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.id      = V4L2_CID_VFLIP,
2177f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.type    = V4L2_CTRL_TYPE_BOOLEAN,
2187f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.name    = "VFlip",
2197f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.minimum = 0,
2207f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.maximum = 1,
2217f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite			.step    = 1,
222228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine			.default_value = 0,
2237f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite		},
224228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine		.set_control = sethvflip
225189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	},
226d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine[COLORS] = {
227d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine		{
228d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine			.id      = V4L2_CID_SATURATION,
229d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine			.type    = V4L2_CTRL_TYPE_INTEGER,
230d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine			.name    = "Saturation",
231d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine			.minimum = 0,
232d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine			.maximum = 6,
233d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine			.step    = 1,
234d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine			.default_value = 3,
235d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine		},
236d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine		.set_control = setcolors
237d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine	},
238228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine[LIGHTFREQ] = {
2394b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi		{
2404b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi			.id      = V4L2_CID_POWER_LINE_FREQUENCY,
2414b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi			.type    = V4L2_CTRL_TYPE_MENU,
2424b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi			.name    = "Light Frequency Filter",
2434b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi			.minimum = 0,
2444b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi			.maximum = 1,
2454b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi			.step    = 1,
246228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine			.default_value = 0,
2474b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi		},
248228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine		.set_control = setlightfreq
2494b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi	},
250189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine};
251fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite
252569691a5a0fe844e36890e49833130e665868136Jean-Francois Moinestatic const struct v4l2_pix_format ov772x_mode[] = {
253189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{320, 240, V4L2_PIX_FMT_YUYV, V4L2_FIELD_NONE,
254189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	 .bytesperline = 320 * 2,
255189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	 .sizeimage = 320 * 240 * 2,
256b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine	 .colorspace = V4L2_COLORSPACE_SRGB,
257189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	 .priv = 1},
258fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite	{640, 480, V4L2_PIX_FMT_YUYV, V4L2_FIELD_NONE,
259fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite	 .bytesperline = 640 * 2,
260fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite	 .sizeimage = 640 * 480 * 2,
261191d0e7fba43d79a73605adcf85441ebe0a2aff7Jean-Francois Moine	 .colorspace = V4L2_COLORSPACE_SRGB,
262191d0e7fba43d79a73605adcf85441ebe0a2aff7Jean-Francois Moine	 .priv = 0},
263191d0e7fba43d79a73605adcf85441ebe0a2aff7Jean-Francois Moine};
264458efe2d558b51fff38026e8ede9374899340e60Jean-François Moinestatic const struct v4l2_pix_format ov767x_mode[] = {
265458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{320, 240, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
266458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		.bytesperline = 320,
267458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		.sizeimage = 320 * 240 * 3 / 8 + 590,
268458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		.colorspace = V4L2_COLORSPACE_JPEG},
269458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{640, 480, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
270458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		.bytesperline = 640,
271458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		.sizeimage = 640 * 480 * 3 / 8 + 590,
272458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		.colorspace = V4L2_COLORSPACE_JPEG},
273458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine};
274191d0e7fba43d79a73605adcf85441ebe0a2aff7Jean-Francois Moine
27529b87f045552910f964972b7a45e9be054401a0bAntonio Ospitestatic const u8 qvga_rates[] = {125, 100, 75, 60, 50, 40, 30};
27629b87f045552910f964972b7a45e9be054401a0bAntonio Ospitestatic const u8 vga_rates[] = {60, 50, 40, 30, 15};
27729b87f045552910f964972b7a45e9be054401a0bAntonio Ospite
27829b87f045552910f964972b7a45e9be054401a0bAntonio Ospitestatic const struct framerates ov772x_framerates[] = {
27929b87f045552910f964972b7a45e9be054401a0bAntonio Ospite	{ /* 320x240 */
28029b87f045552910f964972b7a45e9be054401a0bAntonio Ospite		.rates = qvga_rates,
28129b87f045552910f964972b7a45e9be054401a0bAntonio Ospite		.nrates = ARRAY_SIZE(qvga_rates),
28229b87f045552910f964972b7a45e9be054401a0bAntonio Ospite	},
28329b87f045552910f964972b7a45e9be054401a0bAntonio Ospite	{ /* 640x480 */
28429b87f045552910f964972b7a45e9be054401a0bAntonio Ospite		.rates = vga_rates,
28529b87f045552910f964972b7a45e9be054401a0bAntonio Ospite		.nrates = ARRAY_SIZE(vga_rates),
28629b87f045552910f964972b7a45e9be054401a0bAntonio Ospite	},
28729b87f045552910f964972b7a45e9be054401a0bAntonio Ospite};
28829b87f045552910f964972b7a45e9be054401a0bAntonio Ospite
289458efe2d558b51fff38026e8ede9374899340e60Jean-François Moinestruct reg_array {
290458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	const u8 (*val)[2];
291458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	int len;
292458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine};
293458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine
294458efe2d558b51fff38026e8ede9374899340e60Jean-François Moinestatic const u8 bridge_init_767x[][2] = {
295458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine/* comments from the ms-win file apollo7670.set */
296458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine/* str1 */
297458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xf1, 0x42},
298458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x88, 0xf8},
299458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x89, 0xff},
300458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x76, 0x03},
301458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x92, 0x03},
302458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x95, 0x10},
303458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xe2, 0x00},
304458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xe7, 0x3e},
305458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x8d, 0x1c},
306458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x8e, 0x00},
307458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x8f, 0x00},
308458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x1f, 0x00},
309458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xc3, 0xf9},
310458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x89, 0xff},
311458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x88, 0xf8},
312458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x76, 0x03},
313458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x92, 0x01},
314458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x93, 0x18},
315458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x1c, 0x00},
316458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x1d, 0x48},
317458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x1d, 0x00},
318458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x1d, 0xff},
319458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x1d, 0x02},
320458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x1d, 0x58},
321458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x1d, 0x00},
322458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x1c, 0x0a},
323458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x1d, 0x0a},
324458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x1d, 0x0e},
325458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xc0, 0x50},	/* HSize 640 */
326458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xc1, 0x3c},	/* VSize 480 */
327458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x34, 0x05},	/* enable Audio Suspend mode */
328458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xc2, 0x0c},	/* Input YUV */
329458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xc3, 0xf9},	/* enable PRE */
330458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x34, 0x05},	/* enable Audio Suspend mode */
331458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xe7, 0x2e},	/* this solves failure of "SuspendResumeTest" */
332458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x31, 0xf9},	/* enable 1.8V Suspend */
333458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x35, 0x02},	/* turn on JPEG */
334458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xd9, 0x10},
335458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x25, 0x42},	/* GPIO[8]:Input */
336458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x94, 0x11},	/* If the default setting is loaded when
337458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine			 * system boots up, this flag is closed here */
338458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine};
339458efe2d558b51fff38026e8ede9374899340e60Jean-François Moinestatic const u8 sensor_init_767x[][2] = {
340458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x12, 0x80},
341458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x11, 0x03},
342458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x3a, 0x04},
343458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x12, 0x00},
344458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x17, 0x13},
345458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x18, 0x01},
346458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x32, 0xb6},
347458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x19, 0x02},
348458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x1a, 0x7a},
349458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x03, 0x0a},
350458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x0c, 0x00},
351458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x3e, 0x00},
352458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x70, 0x3a},
353458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x71, 0x35},
354458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x72, 0x11},
355458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x73, 0xf0},
356458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xa2, 0x02},
357458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x7a, 0x2a},	/* set Gamma=1.6 below */
358458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x7b, 0x12},
359458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x7c, 0x1d},
360458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x7d, 0x2d},
361458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x7e, 0x45},
362458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x7f, 0x50},
363458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x80, 0x59},
364458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x81, 0x62},
365458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x82, 0x6b},
366458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x83, 0x73},
367458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x84, 0x7b},
368458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x85, 0x8a},
369458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x86, 0x98},
370458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x87, 0xb2},
371458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x88, 0xca},
372458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x89, 0xe0},
373458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x13, 0xe0},
374458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x00, 0x00},
375458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x10, 0x00},
376458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x0d, 0x40},
377458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x14, 0x38},	/* gain max 16x */
378458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xa5, 0x05},
379458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xab, 0x07},
380458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x24, 0x95},
381458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x25, 0x33},
382458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x26, 0xe3},
383458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x9f, 0x78},
384458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xa0, 0x68},
385458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xa1, 0x03},
386458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xa6, 0xd8},
387458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xa7, 0xd8},
388458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xa8, 0xf0},
389458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xa9, 0x90},
390458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xaa, 0x94},
391458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x13, 0xe5},
392458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x0e, 0x61},
393458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x0f, 0x4b},
394458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x16, 0x02},
395458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x21, 0x02},
396458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x22, 0x91},
397458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x29, 0x07},
398458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x33, 0x0b},
399458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x35, 0x0b},
400458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x37, 0x1d},
401458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x38, 0x71},
402458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x39, 0x2a},
403458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x3c, 0x78},
404458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x4d, 0x40},
405458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x4e, 0x20},
406458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x69, 0x00},
407458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x6b, 0x4a},
408458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x74, 0x10},
409458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x8d, 0x4f},
410458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x8e, 0x00},
411458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x8f, 0x00},
412458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x90, 0x00},
413458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x91, 0x00},
414458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x96, 0x00},
415458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x9a, 0x80},
416458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xb0, 0x84},
417458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xb1, 0x0c},
418458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xb2, 0x0e},
419458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xb3, 0x82},
420458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xb8, 0x0a},
421458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x43, 0x0a},
422458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x44, 0xf0},
423458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x45, 0x34},
424458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x46, 0x58},
425458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x47, 0x28},
426458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x48, 0x3a},
427458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x59, 0x88},
428458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x5a, 0x88},
429458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x5b, 0x44},
430458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x5c, 0x67},
431458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x5d, 0x49},
432458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x5e, 0x0e},
433458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x6c, 0x0a},
434458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x6d, 0x55},
435458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x6e, 0x11},
436458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x6f, 0x9f},
437458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x6a, 0x40},
438458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x01, 0x40},
439458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x02, 0x40},
440458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x13, 0xe7},
441458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x4f, 0x80},
442458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x50, 0x80},
443458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x51, 0x00},
444458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x52, 0x22},
445458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x53, 0x5e},
446458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x54, 0x80},
447458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x58, 0x9e},
448458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x41, 0x08},
449458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x3f, 0x00},
450458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x75, 0x04},
451458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x76, 0xe1},
452458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x4c, 0x00},
453458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x77, 0x01},
454458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x3d, 0xc2},
455458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x4b, 0x09},
456458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xc9, 0x60},
457458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x41, 0x38},	/* jfm: auto sharpness + auto de-noise  */
458458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x56, 0x40},
459458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x34, 0x11},
460458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x3b, 0xc2},
461458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xa4, 0x8a},	/* Night mode trigger point */
462458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x96, 0x00},
463458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x97, 0x30},
464458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x98, 0x20},
465458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x99, 0x20},
466458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x9a, 0x84},
467458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x9b, 0x29},
468458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x9c, 0x03},
469458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x9d, 0x4c},
470458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x9e, 0x3f},
471458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x78, 0x04},
472458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x79, 0x01},
473458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xc8, 0xf0},
474458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x79, 0x0f},
475458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xc8, 0x00},
476458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x79, 0x10},
477458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xc8, 0x7e},
478458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x79, 0x0a},
479458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xc8, 0x80},
480458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x79, 0x0b},
481458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xc8, 0x01},
482458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x79, 0x0c},
483458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xc8, 0x0f},
484458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x79, 0x0d},
485458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xc8, 0x20},
486458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x79, 0x09},
487458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xc8, 0x80},
488458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x79, 0x02},
489458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xc8, 0xc0},
490458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x79, 0x03},
491458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xc8, 0x20},
492458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x79, 0x26},
493458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine};
494458efe2d558b51fff38026e8ede9374899340e60Jean-François Moinestatic const u8 bridge_start_vga_767x[][2] = {
495458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine/* str59 JPG */
496458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x94, 0xaa},
497458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xf1, 0x42},
498458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xe5, 0x04},
499458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xc0, 0x50},
500458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xc1, 0x3c},
501458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xc2, 0x0c},
502458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x35, 0x02},	/* turn on JPEG */
503458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xd9, 0x10},
504458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xda, 0x00},	/* for higher clock rate(30fps) */
505458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x34, 0x05},	/* enable Audio Suspend mode */
506458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xc3, 0xf9},	/* enable PRE */
507458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x8c, 0x00},	/* CIF VSize LSB[2:0] */
508458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x8d, 0x1c},	/* output YUV */
509458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine/*	{0x34, 0x05},	 * enable Audio Suspend mode (?) */
510458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x50, 0x00},	/* H/V divider=0 */
511458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x51, 0xa0},	/* input H=640/4 */
512458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x52, 0x3c},	/* input V=480/4 */
513458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x53, 0x00},	/* offset X=0 */
514458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x54, 0x00},	/* offset Y=0 */
515458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x55, 0x00},	/* H/V size[8]=0 */
516458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x57, 0x00},	/* H-size[9]=0 */
517458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x5c, 0x00},	/* output size[9:8]=0 */
518458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x5a, 0xa0},	/* output H=640/4 */
519458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x5b, 0x78},	/* output V=480/4 */
520458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x1c, 0x0a},
521458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x1d, 0x0a},
522458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x94, 0x11},
523458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine};
524458efe2d558b51fff38026e8ede9374899340e60Jean-François Moinestatic const u8 sensor_start_vga_767x[][2] = {
525458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x11, 0x01},
526458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x1e, 0x04},
527458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x19, 0x02},
528458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x1a, 0x7a},
529458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine};
530458efe2d558b51fff38026e8ede9374899340e60Jean-François Moinestatic const u8 bridge_start_qvga_767x[][2] = {
531458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine/* str86 JPG */
532458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x94, 0xaa},
533458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xf1, 0x42},
534458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xe5, 0x04},
535458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xc0, 0x80},
536458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xc1, 0x60},
537458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xc2, 0x0c},
538458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x35, 0x02},	/* turn on JPEG */
539458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xd9, 0x10},
540458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xc0, 0x50},	/* CIF HSize 640 */
541458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xc1, 0x3c},	/* CIF VSize 480 */
542458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x8c, 0x00},	/* CIF VSize LSB[2:0] */
543458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x8d, 0x1c},	/* output YUV */
544458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x34, 0x05},	/* enable Audio Suspend mode */
545458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xc2, 0x4c},	/* output YUV and Enable DCW */
546458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0xc3, 0xf9},	/* enable PRE */
547458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x1c, 0x00},	/* indirect addressing */
548458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x1d, 0x48},	/* output YUV422 */
549458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x50, 0x89},	/* H/V divider=/2; plus DCW AVG */
550458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x51, 0xa0},	/* DCW input H=640/4 */
551458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x52, 0x78},	/* DCW input V=480/4 */
552458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x53, 0x00},	/* offset X=0 */
553458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x54, 0x00},	/* offset Y=0 */
554458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x55, 0x00},	/* H/V size[8]=0 */
555458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x57, 0x00},	/* H-size[9]=0 */
556458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x5c, 0x00},	/* DCW output size[9:8]=0 */
557458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x5a, 0x50},	/* DCW output H=320/4 */
558458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x5b, 0x3c},	/* DCW output V=240/4 */
559458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x1c, 0x0a},
560458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x1d, 0x0a},
561458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x94, 0x11},
562458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine};
563458efe2d558b51fff38026e8ede9374899340e60Jean-François Moinestatic const u8 sensor_start_qvga_767x[][2] = {
564458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x11, 0x01},
565458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x1e, 0x04},
566458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x19, 0x02},
567458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{0x1a, 0x7a},
568458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine};
569458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine
570458efe2d558b51fff38026e8ede9374899340e60Jean-François Moinestatic const u8 bridge_init_772x[][2] = {
57147dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0xc2, 0x0c },
57247dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x88, 0xf8 },
57347dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0xc3, 0x69 },
57447dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x89, 0xff },
57547dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x76, 0x03 },
57647dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x92, 0x01 },
57747dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x93, 0x18 },
57847dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x94, 0x10 },
57947dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x95, 0x10 },
58047dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0xe2, 0x00 },
58147dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0xe7, 0x3e },
58247dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris
58347dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x96, 0x00 },
58447dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris
58547dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x97, 0x20 },
58647dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x97, 0x20 },
58747dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x97, 0x20 },
58847dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x97, 0x0a },
58947dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x97, 0x3f },
59047dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x97, 0x4a },
59147dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x97, 0x20 },
59247dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x97, 0x15 },
59347dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x97, 0x0b },
59447dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris
59547dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x8e, 0x40 },
59647dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x1f, 0x81 },
59747dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x34, 0x05 },
59847dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0xe3, 0x04 },
59947dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x88, 0x00 },
60047dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x89, 0x00 },
60147dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x76, 0x00 },
60247dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0xe7, 0x2e },
60347dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x31, 0xf9 },
60447dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x25, 0x42 },
60547dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x21, 0xf0 },
60647dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris
60747dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x1c, 0x00 },
60847dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x1d, 0x40 },
6090f7a50b29dd9c8603d5ce15c11fd1a1d731e1a6dJim Paris	{ 0x1d, 0x02 }, /* payload size 0x0200 * 4 = 2048 bytes */
6100f7a50b29dd9c8603d5ce15c11fd1a1d731e1a6dJim Paris	{ 0x1d, 0x00 }, /* payload size */
611189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine
6125ea9c4def8154a5be836dd31cbd97f49fd34ea8fJim Paris	{ 0x1d, 0x02 }, /* frame size 0x025800 * 4 = 614400 */
6135ea9c4def8154a5be836dd31cbd97f49fd34ea8fJim Paris	{ 0x1d, 0x58 }, /* frame size */
6145ea9c4def8154a5be836dd31cbd97f49fd34ea8fJim Paris	{ 0x1d, 0x00 }, /* frame size */
61547dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris
616c06eb61941459b1981817fb675d0104ac0cd6df8Jim Paris	{ 0x1c, 0x0a },
617c06eb61941459b1981817fb675d0104ac0cd6df8Jim Paris	{ 0x1d, 0x08 }, /* turn on UVC header */
618c06eb61941459b1981817fb675d0104ac0cd6df8Jim Paris	{ 0x1d, 0x0e }, /* .. */
619c06eb61941459b1981817fb675d0104ac0cd6df8Jim Paris
62047dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x8d, 0x1c },
62147dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x8e, 0x80 },
62247dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0xe5, 0x04 },
62347dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris
62447dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0xc0, 0x50 },
62547dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0xc1, 0x3c },
62647dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0xc2, 0x0c },
62747dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris};
628458efe2d558b51fff38026e8ede9374899340e60Jean-François Moinestatic const u8 sensor_init_772x[][2] = {
62947dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x12, 0x80 },
63047dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x11, 0x01 },
631189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine/*fixme: better have a delay?*/
632189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{ 0x11, 0x01 },
633189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{ 0x11, 0x01 },
634189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{ 0x11, 0x01 },
635189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{ 0x11, 0x01 },
636189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{ 0x11, 0x01 },
637189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{ 0x11, 0x01 },
638189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{ 0x11, 0x01 },
639189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{ 0x11, 0x01 },
640189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{ 0x11, 0x01 },
641189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{ 0x11, 0x01 },
64247dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris
64347dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x3d, 0x03 },
64447dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x17, 0x26 },
64547dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x18, 0xa0 },
64647dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x19, 0x07 },
64747dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x1a, 0xf0 },
64847dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x32, 0x00 },
64947dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x29, 0xa0 },
65047dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x2c, 0xf0 },
65147dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x65, 0x20 },
65247dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x11, 0x01 },
65347dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x42, 0x7f },
654b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine	{ 0x63, 0xaa },		/* AWB - was e0 */
65547dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x64, 0xff },
65647dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x66, 0x00 },
657b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine	{ 0x13, 0xf0 },		/* com8 */
65847dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x0d, 0x41 },
65947dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x0f, 0xc5 },
66047dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x14, 0x11 },
66147dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris
66247dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x22, 0x7f },
66347dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x23, 0x03 },
66447dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x24, 0x40 },
66547dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x25, 0x30 },
66647dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x26, 0xa1 },
66747dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x2a, 0x00 },
66847dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x2b, 0x00 },
66947dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x6b, 0xaa },
670b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine	{ 0x13, 0xff },		/* AWB */
67147dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris
67247dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x90, 0x05 },
67347dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x91, 0x01 },
67447dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x92, 0x03 },
67547dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x93, 0x00 },
67647dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x94, 0x60 },
67747dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x95, 0x3c },
67847dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x96, 0x24 },
67947dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x97, 0x1e },
68047dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x98, 0x62 },
68147dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x99, 0x80 },
68247dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x9a, 0x1e },
68347dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x9b, 0x08 },
68447dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x9c, 0x20 },
68547dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x9e, 0x81 },
68647dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris
68747dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0xa6, 0x04 },
68847dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x7e, 0x0c },
68947dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x7f, 0x16 },
69047dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x80, 0x2a },
69147dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x81, 0x4e },
69247dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x82, 0x61 },
69347dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x83, 0x6f },
69447dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x84, 0x7b },
69547dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x85, 0x86 },
69647dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x86, 0x8e },
69747dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x87, 0x97 },
69847dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x88, 0xa4 },
69947dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x89, 0xaf },
70047dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x8a, 0xc5 },
70147dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x8b, 0xd7 },
70247dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x8c, 0xe8 },
70347dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x8d, 0x20 },
70447dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris
70547dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x0c, 0x90 },
70647dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris
70747dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x2b, 0x00 },
70847dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x22, 0x7f },
70947dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x23, 0x03 },
71047dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x11, 0x01 },
71147dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x0c, 0xd0 },
71247dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x64, 0xff },
71347dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x0d, 0x41 },
71447dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris
71547dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x14, 0x41 },
71647dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x0e, 0xcd },
71747dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0xac, 0xbf },
718b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine	{ 0x8e, 0x00 },		/* De-noise threshold */
71947dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris	{ 0x0c, 0xd0 }
72047dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris};
721458efe2d558b51fff38026e8ede9374899340e60Jean-François Moinestatic const u8 bridge_start_vga_772x[][2] = {
722189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{0x1c, 0x00},
723189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{0x1d, 0x40},
724189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{0x1d, 0x02},
725189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{0x1d, 0x00},
726189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{0x1d, 0x02},
727189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{0x1d, 0x58},
728189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{0x1d, 0x00},
729189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{0xc0, 0x50},
730189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{0xc1, 0x3c},
731189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine};
732458efe2d558b51fff38026e8ede9374899340e60Jean-François Moinestatic const u8 sensor_start_vga_772x[][2] = {
733189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{0x12, 0x00},
734189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{0x17, 0x26},
735189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{0x18, 0xa0},
736189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{0x19, 0x07},
737189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{0x1a, 0xf0},
738189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{0x29, 0xa0},
739189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{0x2c, 0xf0},
740b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine	{0x65, 0x20},
741189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine};
742458efe2d558b51fff38026e8ede9374899340e60Jean-François Moinestatic const u8 bridge_start_qvga_772x[][2] = {
743189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{0x1c, 0x00},
744189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{0x1d, 0x40},
745189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{0x1d, 0x02},
746189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{0x1d, 0x00},
747189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{0x1d, 0x01},
748189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{0x1d, 0x4b},
749189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{0x1d, 0x00},
750189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{0xc0, 0x28},
751189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{0xc1, 0x1e},
752189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine};
753458efe2d558b51fff38026e8ede9374899340e60Jean-François Moinestatic const u8 sensor_start_qvga_772x[][2] = {
754189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{0x12, 0x40},
755189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{0x17, 0x3f},
756189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{0x18, 0x50},
757189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{0x19, 0x03},
758189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{0x1a, 0x78},
759189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{0x29, 0x50},
760189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	{0x2c, 0x78},
761b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine	{0x65, 0x2f},
762189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine};
763fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite
7642ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moinestatic void ov534_reg_write(struct gspca_dev *gspca_dev, u16 reg, u8 val)
7652ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine{
7662ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	struct usb_device *udev = gspca_dev->dev;
7672ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	int ret;
7682ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine
76914b67c2969ebf50bd5534b2a0c441f8569a9361eJean-François Moine	if (gspca_dev->usb_err < 0)
77014b67c2969ebf50bd5534b2a0c441f8569a9361eJean-François Moine		return;
77114b67c2969ebf50bd5534b2a0c441f8569a9361eJean-François Moine
772ddffa49e257e2b28e23f1e2729c0560bcad89937Jean-François Moine	PDEBUG(D_USBO, "SET 01 0000 %04x %02x", reg, val);
7732ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	gspca_dev->usb_buf[0] = val;
7742ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	ret = usb_control_msg(udev,
7752ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine			      usb_sndctrlpipe(udev, 0),
7762ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine			      0x01,
7772ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine			      USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
7782ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine			      0x00, reg, gspca_dev->usb_buf, 1, CTRL_TIMEOUT);
77914b67c2969ebf50bd5534b2a0c441f8569a9361eJean-François Moine	if (ret < 0) {
780133a9fe949862d9ed8411fb423739f4cee08232dJoe Perches		pr_err("write failed %d\n", ret);
78114b67c2969ebf50bd5534b2a0c441f8569a9361eJean-François Moine		gspca_dev->usb_err = ret;
78214b67c2969ebf50bd5534b2a0c441f8569a9361eJean-François Moine	}
7832ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine}
7842ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine
7852ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moinestatic u8 ov534_reg_read(struct gspca_dev *gspca_dev, u16 reg)
7862ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine{
7872ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	struct usb_device *udev = gspca_dev->dev;
7882ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	int ret;
7892ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine
79014b67c2969ebf50bd5534b2a0c441f8569a9361eJean-François Moine	if (gspca_dev->usb_err < 0)
79114b67c2969ebf50bd5534b2a0c441f8569a9361eJean-François Moine		return 0;
7922ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	ret = usb_control_msg(udev,
7932ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine			      usb_rcvctrlpipe(udev, 0),
7942ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine			      0x01,
7952ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine			      USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
7962ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine			      0x00, reg, gspca_dev->usb_buf, 1, CTRL_TIMEOUT);
797ddffa49e257e2b28e23f1e2729c0560bcad89937Jean-François Moine	PDEBUG(D_USBI, "GET 01 0000 %04x %02x", reg, gspca_dev->usb_buf[0]);
79814b67c2969ebf50bd5534b2a0c441f8569a9361eJean-François Moine	if (ret < 0) {
799133a9fe949862d9ed8411fb423739f4cee08232dJoe Perches		pr_err("read failed %d\n", ret);
80014b67c2969ebf50bd5534b2a0c441f8569a9361eJean-François Moine		gspca_dev->usb_err = ret;
80114b67c2969ebf50bd5534b2a0c441f8569a9361eJean-François Moine	}
8022ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	return gspca_dev->usb_buf[0];
8032ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine}
8042ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine
8052ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine/* Two bits control LED: 0x21 bit 7 and 0x23 bit 7.
8062ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine * (direction and output)? */
8072ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moinestatic void ov534_set_led(struct gspca_dev *gspca_dev, int status)
8082ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine{
8092ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	u8 data;
8102ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine
8112ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	PDEBUG(D_CONF, "led status: %d", status);
8122ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine
8132ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	data = ov534_reg_read(gspca_dev, 0x21);
8142ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	data |= 0x80;
8152ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	ov534_reg_write(gspca_dev, 0x21, data);
8162ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine
8172ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	data = ov534_reg_read(gspca_dev, 0x23);
8182ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	if (status)
8192ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine		data |= 0x80;
8202ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	else
8212ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine		data &= ~0x80;
8222ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine
8232ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	ov534_reg_write(gspca_dev, 0x23, data);
8242ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine
8252ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	if (!status) {
8262ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine		data = ov534_reg_read(gspca_dev, 0x21);
8272ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine		data &= ~0x80;
8282ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine		ov534_reg_write(gspca_dev, 0x21, data);
8292ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	}
8302ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine}
8312ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine
8322ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moinestatic int sccb_check_status(struct gspca_dev *gspca_dev)
8332ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine{
8342ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	u8 data;
8352ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	int i;
8362ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine
8372ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	for (i = 0; i < 5; i++) {
8382ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine		data = ov534_reg_read(gspca_dev, OV534_REG_STATUS);
8392ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine
8402ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine		switch (data) {
8412ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine		case 0x00:
8422ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine			return 1;
8432ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine		case 0x04:
8442ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine			return 0;
8452ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine		case 0x03:
8462ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine			break;
8472ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine		default:
8482ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine			PDEBUG(D_ERR, "sccb status 0x%02x, attempt %d/5",
8492ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine			       data, i + 1);
8502ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine		}
8512ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	}
8522ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	return 0;
8532ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine}
8542ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine
8552ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moinestatic void sccb_reg_write(struct gspca_dev *gspca_dev, u8 reg, u8 val)
8562ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine{
857ddffa49e257e2b28e23f1e2729c0560bcad89937Jean-François Moine	PDEBUG(D_USBO, "sccb write: %02x %02x", reg, val);
8582ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	ov534_reg_write(gspca_dev, OV534_REG_SUBADDR, reg);
8592ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	ov534_reg_write(gspca_dev, OV534_REG_WRITE, val);
8602ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	ov534_reg_write(gspca_dev, OV534_REG_OPERATION, OV534_OP_WRITE_3);
8612ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine
86214b67c2969ebf50bd5534b2a0c441f8569a9361eJean-François Moine	if (!sccb_check_status(gspca_dev)) {
863133a9fe949862d9ed8411fb423739f4cee08232dJoe Perches		pr_err("sccb_reg_write failed\n");
86414b67c2969ebf50bd5534b2a0c441f8569a9361eJean-François Moine		gspca_dev->usb_err = -EIO;
86514b67c2969ebf50bd5534b2a0c441f8569a9361eJean-François Moine	}
8662ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine}
8672ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine
8682ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moinestatic u8 sccb_reg_read(struct gspca_dev *gspca_dev, u16 reg)
8692ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine{
8702ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	ov534_reg_write(gspca_dev, OV534_REG_SUBADDR, reg);
8712ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	ov534_reg_write(gspca_dev, OV534_REG_OPERATION, OV534_OP_WRITE_2);
8722ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	if (!sccb_check_status(gspca_dev))
873133a9fe949862d9ed8411fb423739f4cee08232dJoe Perches		pr_err("sccb_reg_read failed 1\n");
8742ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine
8752ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	ov534_reg_write(gspca_dev, OV534_REG_OPERATION, OV534_OP_READ_2);
8762ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	if (!sccb_check_status(gspca_dev))
877133a9fe949862d9ed8411fb423739f4cee08232dJoe Perches		pr_err("sccb_reg_read failed 2\n");
8782ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine
8792ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	return ov534_reg_read(gspca_dev, OV534_REG_READ);
8802ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine}
8812ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine
8822ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine/* output a bridge sequence (reg - val) */
8832ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moinestatic void reg_w_array(struct gspca_dev *gspca_dev,
8842ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine			const u8 (*data)[2], int len)
8852ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine{
8862ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	while (--len >= 0) {
8872ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine		ov534_reg_write(gspca_dev, (*data)[0], (*data)[1]);
8882ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine		data++;
8892ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	}
8902ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine}
8912ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine
8922ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine/* output a sensor sequence (reg - val) */
8932ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moinestatic void sccb_w_array(struct gspca_dev *gspca_dev,
8942ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine			const u8 (*data)[2], int len)
8952ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine{
8962ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	while (--len >= 0) {
8972ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine		if ((*data)[0] != 0xff) {
8982ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine			sccb_reg_write(gspca_dev, (*data)[0], (*data)[1]);
8992ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine		} else {
9002ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine			sccb_reg_read(gspca_dev, (*data)[1]);
9012ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine			sccb_reg_write(gspca_dev, 0xff, 0x00);
9022ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine		}
9032ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine		data++;
9042ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	}
9052ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine}
9062ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine
90769f1fe28f08000a123b3d71fac88564109da09fdJean-Francois Moine/* ov772x specific controls */
90869f1fe28f08000a123b3d71fac88564109da09fdJean-Francois Moinestatic void set_frame_rate(struct gspca_dev *gspca_dev)
90911d9f25da89523d19dba3608d51a86af2954fc0dJim Paris{
91011d9f25da89523d19dba3608d51a86af2954fc0dJim Paris	struct sd *sd = (struct sd *) gspca_dev;
911189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	int i;
912189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	struct rate_s {
913189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine		u8 fps;
914189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine		u8 r11;
915189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine		u8 r0d;
916189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine		u8 re5;
917189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	};
918189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	const struct rate_s *r;
919189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	static const struct rate_s rate_0[] = {	/* 640x480 */
920189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine		{60, 0x01, 0xc1, 0x04},
921189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine		{50, 0x01, 0x41, 0x02},
922189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine		{40, 0x02, 0xc1, 0x04},
923189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine		{30, 0x04, 0x81, 0x02},
924189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine		{15, 0x03, 0x41, 0x04},
925189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	};
926189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	static const struct rate_s rate_1[] = {	/* 320x240 */
927189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine		{125, 0x02, 0x81, 0x02},
928189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine		{100, 0x02, 0xc1, 0x04},
929189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine		{75, 0x03, 0xc1, 0x04},
930189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine		{60, 0x04, 0xc1, 0x04},
931189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine		{50, 0x02, 0x41, 0x04},
932189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine		{40, 0x03, 0x41, 0x04},
933189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine		{30, 0x04, 0x41, 0x04},
934189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	};
935189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine
936458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	if (sd->sensor != SENSOR_OV772x)
937458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		return;
938189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	if (gspca_dev->cam.cam_mode[gspca_dev->curr_mode].priv == 0) {
939189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine		r = rate_0;
940189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine		i = ARRAY_SIZE(rate_0);
941189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	} else {
942189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine		r = rate_1;
943189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine		i = ARRAY_SIZE(rate_1);
944189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	}
945189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	while (--i > 0) {
946189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine		if (sd->frame_rate >= r->fps)
947189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine			break;
948189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine		r++;
949189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	}
950189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine
951189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	sccb_reg_write(gspca_dev, 0x11, r->r11);
952189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	sccb_reg_write(gspca_dev, 0x0d, r->r0d);
953189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	ov534_reg_write(gspca_dev, 0xe5, r->re5);
954189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine
955189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	PDEBUG(D_PROBE, "frame_rate: %d", r->fps);
956189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine}
957189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine
958c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void setbrightness(struct gspca_dev *gspca_dev)
959b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine{
960b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine	struct sd *sd = (struct sd *) gspca_dev;
961458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	int val;
962b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine
963458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	val = sd->ctrls[BRIGHTNESS].val;
964458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	if (sd->sensor == SENSOR_OV767x) {
965458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		if (val < 0)
966458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine			val = 0x80 - val;
967458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		sccb_reg_write(gspca_dev, 0x55, val);	/* bright */
968458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	} else {
969458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		sccb_reg_write(gspca_dev, 0x9b, val);
970458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	}
971b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine}
972b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine
973c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void setcontrast(struct gspca_dev *gspca_dev)
974b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine{
975b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine	struct sd *sd = (struct sd *) gspca_dev;
976458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	u8 val;
977b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine
978458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	val = sd->ctrls[CONTRAST].val;
979458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	if (sd->sensor == SENSOR_OV767x)
980458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		sccb_reg_write(gspca_dev, 0x56, val);	/* contras */
981458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	else
982458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		sccb_reg_write(gspca_dev, 0x9c, val);
983b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine}
984b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine
985189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moinestatic void setgain(struct gspca_dev *gspca_dev)
986189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine{
987189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	struct sd *sd = (struct sd *) gspca_dev;
988189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	u8 val;
98911d9f25da89523d19dba3608d51a86af2954fc0dJim Paris
990228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine	if (sd->ctrls[AGC].val)
9918b7fbda484176b46a7760fd474d605ca5152c86dMax Thrun		return;
9928b7fbda484176b46a7760fd474d605ca5152c86dMax Thrun
993228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine	val = sd->ctrls[GAIN].val;
994189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	switch (val & 0x30) {
995189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	case 0x00:
996189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine		val &= 0x0f;
99711d9f25da89523d19dba3608d51a86af2954fc0dJim Paris		break;
998189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	case 0x10:
999189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine		val &= 0x0f;
1000189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine		val |= 0x30;
100111d9f25da89523d19dba3608d51a86af2954fc0dJim Paris		break;
1002189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	case 0x20:
1003189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine		val &= 0x0f;
1004189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine		val |= 0x70;
100511d9f25da89523d19dba3608d51a86af2954fc0dJim Paris		break;
1006189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	default:
1007189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine/*	case 0x30: */
1008189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine		val &= 0x0f;
1009189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine		val |= 0xf0;
101011d9f25da89523d19dba3608d51a86af2954fc0dJim Paris		break;
101111d9f25da89523d19dba3608d51a86af2954fc0dJim Paris	}
1012189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	sccb_reg_write(gspca_dev, 0x00, val);
1013189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine}
1014189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine
1015c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void setexposure(struct gspca_dev *gspca_dev)
1016189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine{
1017189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	struct sd *sd = (struct sd *) gspca_dev;
1018189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	u8 val;
1019189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine
1020228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine	if (sd->ctrls[AEC].val)
102118cf8c91ad558f8d2d0177656df493f81949cfe6Antonio Ospite		return;
102218cf8c91ad558f8d2d0177656df493f81949cfe6Antonio Ospite
1023228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine	val = sd->ctrls[EXPOSURE].val;
1024458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	if (sd->sensor == SENSOR_OV767x) {
1025458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine
1026458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		/* set only aec[9:2] */
1027458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		sccb_reg_write(gspca_dev, 0x10, val);	/* aech */
1028458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	} else {
1029458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine
1030458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		/* 'val' is one byte and represents half of the exposure value
1031458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		 * we are going to set into registers, a two bytes value:
1032458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		 *
1033458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		 *    MSB: ((u16) val << 1) >> 8   == val >> 7
1034458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		 *    LSB: ((u16) val << 1) & 0xff == val << 1
1035458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		 */
1036458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		sccb_reg_write(gspca_dev, 0x08, val >> 7);
1037458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		sccb_reg_write(gspca_dev, 0x10, val << 1);
1038458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	}
1039189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine}
1040189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine
10418b7fbda484176b46a7760fd474d605ca5152c86dMax Thrunstatic void setagc(struct gspca_dev *gspca_dev)
1042189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine{
1043189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	struct sd *sd = (struct sd *) gspca_dev;
1044189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine
1045228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine	if (sd->ctrls[AGC].val) {
10468b7fbda484176b46a7760fd474d605ca5152c86dMax Thrun		sccb_reg_write(gspca_dev, 0x13,
10478b7fbda484176b46a7760fd474d605ca5152c86dMax Thrun				sccb_reg_read(gspca_dev, 0x13) | 0x04);
1048189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine		sccb_reg_write(gspca_dev, 0x64,
1049189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine				sccb_reg_read(gspca_dev, 0x64) | 0x03);
1050189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	} else {
10518b7fbda484176b46a7760fd474d605ca5152c86dMax Thrun		sccb_reg_write(gspca_dev, 0x13,
10528b7fbda484176b46a7760fd474d605ca5152c86dMax Thrun				sccb_reg_read(gspca_dev, 0x13) & ~0x04);
1053189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine		sccb_reg_write(gspca_dev, 0x64,
10548b7fbda484176b46a7760fd474d605ca5152c86dMax Thrun				sccb_reg_read(gspca_dev, 0x64) & ~0x03);
10558b7fbda484176b46a7760fd474d605ca5152c86dMax Thrun
10568b7fbda484176b46a7760fd474d605ca5152c86dMax Thrun		setgain(gspca_dev);
1057189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	}
1058189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine}
1059189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine
1060b014f94b28713e169a438131a5ce2752068068adJean-Francois Moinestatic void setawb(struct gspca_dev *gspca_dev)
1061b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine{
1062b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine	struct sd *sd = (struct sd *) gspca_dev;
1063b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine
1064228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine	if (sd->ctrls[AWB].val) {
10658fef9d962237e29b3d84243387b1f3487b3caaf4Max Thrun		sccb_reg_write(gspca_dev, 0x13,
10668fef9d962237e29b3d84243387b1f3487b3caaf4Max Thrun				sccb_reg_read(gspca_dev, 0x13) | 0x02);
1067458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		if (sd->sensor == SENSOR_OV772x)
1068458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine			sccb_reg_write(gspca_dev, 0x63,
10698fef9d962237e29b3d84243387b1f3487b3caaf4Max Thrun				sccb_reg_read(gspca_dev, 0x63) | 0xc0);
10708fef9d962237e29b3d84243387b1f3487b3caaf4Max Thrun	} else {
10718fef9d962237e29b3d84243387b1f3487b3caaf4Max Thrun		sccb_reg_write(gspca_dev, 0x13,
10728fef9d962237e29b3d84243387b1f3487b3caaf4Max Thrun				sccb_reg_read(gspca_dev, 0x13) & ~0x02);
1073458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		if (sd->sensor == SENSOR_OV772x)
1074458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine			sccb_reg_write(gspca_dev, 0x63,
10758fef9d962237e29b3d84243387b1f3487b3caaf4Max Thrun				sccb_reg_read(gspca_dev, 0x63) & ~0xc0);
10768fef9d962237e29b3d84243387b1f3487b3caaf4Max Thrun	}
1077b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine}
1078b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine
1079f2938822523739e99a39fd634943865a432e9c00Max Thrunstatic void setaec(struct gspca_dev *gspca_dev)
1080f2938822523739e99a39fd634943865a432e9c00Max Thrun{
1081f2938822523739e99a39fd634943865a432e9c00Max Thrun	struct sd *sd = (struct sd *) gspca_dev;
1082458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	u8 data;
1083f2938822523739e99a39fd634943865a432e9c00Max Thrun
1084458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	data = sd->sensor == SENSOR_OV767x ?
1085458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine			0x05 :		/* agc + aec */
1086458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine			0x01;		/* agc */
1087228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine	if (sd->ctrls[AEC].val)
1088f2938822523739e99a39fd634943865a432e9c00Max Thrun		sccb_reg_write(gspca_dev, 0x13,
1089458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine				sccb_reg_read(gspca_dev, 0x13) | data);
1090f2938822523739e99a39fd634943865a432e9c00Max Thrun	else {
1091f2938822523739e99a39fd634943865a432e9c00Max Thrun		sccb_reg_write(gspca_dev, 0x13,
1092458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine				sccb_reg_read(gspca_dev, 0x13) & ~data);
1093458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		if (sd->sensor == SENSOR_OV767x)
1094458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine			sd->ctrls[EXPOSURE].val =
1095458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine				sccb_reg_read(gspca_dev, 10);	/* aech */
1096458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		else
1097458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine			setexposure(gspca_dev);
1098f2938822523739e99a39fd634943865a432e9c00Max Thrun	}
1099f2938822523739e99a39fd634943865a432e9c00Max Thrun}
1100f2938822523739e99a39fd634943865a432e9c00Max Thrun
1101c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void setsharpness(struct gspca_dev *gspca_dev)
1102189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine{
1103189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	struct sd *sd = (struct sd *) gspca_dev;
1104189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	u8 val;
1105189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine
1106228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine	val = sd->ctrls[SHARPNESS].val;
11073149cfbfaca7912995a32d72ddd2381e66ca845eMax Thrun	sccb_reg_write(gspca_dev, 0x91, val);	/* Auto de-noise threshold */
11083149cfbfaca7912995a32d72ddd2381e66ca845eMax Thrun	sccb_reg_write(gspca_dev, 0x8e, val);	/* De-noise threshold */
1109189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine}
1110189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine
1111228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moinestatic void sethvflip(struct gspca_dev *gspca_dev)
1112189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine{
1113189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	struct sd *sd = (struct sd *) gspca_dev;
1114228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine	u8 val;
1115189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine
1116458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	if (sd->sensor == SENSOR_OV767x) {
1117458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		val = sccb_reg_read(gspca_dev, 0x1e);	/* mvfp */
1118458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		val &= ~0x30;
1119458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		if (sd->ctrls[HFLIP].val)
1120458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine			val |= 0x20;
1121458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		if (sd->ctrls[VFLIP].val)
1122458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine			val |= 0x10;
1123458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		sccb_reg_write(gspca_dev, 0x1e, val);
1124458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	} else {
1125458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		val = sccb_reg_read(gspca_dev, 0x0c);
1126458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		val &= ~0xc0;
1127458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		if (sd->ctrls[HFLIP].val == 0)
1128458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine			val |= 0x40;
1129458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		if (sd->ctrls[VFLIP].val == 0)
1130458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine			val |= 0x80;
1131458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		sccb_reg_write(gspca_dev, 0x0c, val);
1132458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	}
113311d9f25da89523d19dba3608d51a86af2954fc0dJim Paris}
1134fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite
1135d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moinestatic void setcolors(struct gspca_dev *gspca_dev)
1136d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine{
1137d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine	struct sd *sd = (struct sd *) gspca_dev;
1138d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine	u8 val;
1139d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine	int i;
1140d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine	static u8 color_tb[][6] = {
1141d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine		{0x42, 0x42, 0x00, 0x11, 0x30, 0x41},
1142d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine		{0x52, 0x52, 0x00, 0x16, 0x3c, 0x52},
1143d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine		{0x66, 0x66, 0x00, 0x1b, 0x4b, 0x66},
1144d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine		{0x80, 0x80, 0x00, 0x22, 0x5e, 0x80},
1145d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine		{0x9a, 0x9a, 0x00, 0x29, 0x71, 0x9a},
1146d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine		{0xb8, 0xb8, 0x00, 0x31, 0x87, 0xb8},
1147d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine		{0xdd, 0xdd, 0x00, 0x3b, 0xa2, 0xdd},
1148d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine	};
1149d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine
1150d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine	val = sd->ctrls[COLORS].val;
1151d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine	for (i = 0; i < ARRAY_SIZE(color_tb[0]); i++)
1152d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine		sccb_reg_write(gspca_dev, 0x4f + i, color_tb[val][i]);
1153d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine}
1154d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine
1155228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moinestatic void setlightfreq(struct gspca_dev *gspca_dev)
11564b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi{
11574b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi	struct sd *sd = (struct sd *) gspca_dev;
1158458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	u8 val;
11594b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi
1160458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	val = sd->ctrls[LIGHTFREQ].val ? 0x9e : 0x00;
1161458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	if (sd->sensor == SENSOR_OV767x) {
1162458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		sccb_reg_write(gspca_dev, 0x2a, 0x00);
1163458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		if (val)
1164458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine			val = 0x9d;	/* insert dummy to 25fps for 50Hz */
1165458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	}
1166458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	sccb_reg_write(gspca_dev, 0x2b, val);
11674b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi}
11684b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi
11694b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi
1170fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite/* this function is called at probe time */
1171fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospitestatic int sd_config(struct gspca_dev *gspca_dev,
1172fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite		     const struct usb_device_id *id)
1173fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite{
11742ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	struct sd *sd = (struct sd *) gspca_dev;
1175fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite	struct cam *cam;
1176fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite
1177fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite	cam = &gspca_dev->cam;
1178fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite
1179228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine	cam->ctrls = sd->ctrls;
1180228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine
1181228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine	/* the auto white balance control works only when auto gain is set */
1182228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine	if (sd_ctrls[AGC].qctrl.default_value == 0)
1183228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine		gspca_dev->ctrl_inac |= (1 << AWB);
1184228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine
1185c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	cam->cam_mode = ov772x_mode;
1186c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	cam->nmodes = ARRAY_SIZE(ov772x_mode);
1187fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite
1188189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	sd->frame_rate = 30;
1189b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine
1190fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite	return 0;
1191fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite}
1192fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite
1193fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite/* this function is called at probe and resume time */
1194fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospitestatic int sd_init(struct gspca_dev *gspca_dev)
1195fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite{
1196458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	struct sd *sd = (struct sd *) gspca_dev;
11972ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	u16 sensor_id;
1198458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	static const struct reg_array bridge_init[NSENSORS] = {
1199458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	[SENSOR_OV767x] = {bridge_init_767x, ARRAY_SIZE(bridge_init_767x)},
1200458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	[SENSOR_OV772x] = {bridge_init_772x, ARRAY_SIZE(bridge_init_772x)},
1201458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	};
1202458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	static const struct reg_array sensor_init[NSENSORS] = {
1203458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	[SENSOR_OV767x] = {sensor_init_767x, ARRAY_SIZE(sensor_init_767x)},
1204458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	[SENSOR_OV772x] = {sensor_init_772x, ARRAY_SIZE(sensor_init_772x)},
1205458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	};
12062ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine
12072ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	/* reset bridge */
12082ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	ov534_reg_write(gspca_dev, 0xe7, 0x3a);
12092ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	ov534_reg_write(gspca_dev, 0xe0, 0x08);
12102ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	msleep(100);
12112ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine
12122ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	/* initialize the sensor address */
1213c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	ov534_reg_write(gspca_dev, OV534_REG_ADDRESS, 0x42);
12142ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine
12152ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	/* reset sensor */
12162ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	sccb_reg_write(gspca_dev, 0x12, 0x80);
12172ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	msleep(10);
12182ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine
12192ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	/* probe the sensor */
12202ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	sccb_reg_read(gspca_dev, 0x0a);
12212ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	sensor_id = sccb_reg_read(gspca_dev, 0x0a) << 8;
12222ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	sccb_reg_read(gspca_dev, 0x0b);
12232ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	sensor_id |= sccb_reg_read(gspca_dev, 0x0b);
12242ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	PDEBUG(D_PROBE, "Sensor ID: %04x", sensor_id);
12252ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine
1226458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	if ((sensor_id & 0xfff0) == 0x7670) {
1227458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		sd->sensor = SENSOR_OV767x;
1228458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		gspca_dev->ctrl_dis = (1 << GAIN) |
1229458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine					(1 << AGC) |
1230458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine					(1 << SHARPNESS);	/* auto */
1231458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		sd->ctrls[BRIGHTNESS].min = -127;
1232458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		sd->ctrls[BRIGHTNESS].max = 127;
1233458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		sd->ctrls[BRIGHTNESS].def = 0;
1234458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		sd->ctrls[CONTRAST].max = 0x80;
1235458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		sd->ctrls[CONTRAST].def = 0x40;
1236458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		sd->ctrls[EXPOSURE].min = 0x08;
1237458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		sd->ctrls[EXPOSURE].max = 0x60;
1238458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		sd->ctrls[EXPOSURE].def = 0x13;
1239458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		sd->ctrls[SHARPNESS].max = 9;
1240458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		sd->ctrls[SHARPNESS].def = 4;
1241458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		sd->ctrls[HFLIP].def = 1;
1242458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		gspca_dev->cam.cam_mode = ov767x_mode;
1243458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		gspca_dev->cam.nmodes = ARRAY_SIZE(ov767x_mode);
1244458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	} else {
1245458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		sd->sensor = SENSOR_OV772x;
1246d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine		gspca_dev->ctrl_dis = (1 << COLORS);
1247458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		gspca_dev->cam.bulk = 1;
1248458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		gspca_dev->cam.bulk_size = 16384;
1249458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		gspca_dev->cam.bulk_nurbs = 2;
1250458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		gspca_dev->cam.mode_framerates = ov772x_framerates;
1251458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	}
1252458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine
12532ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine	/* initialize */
1254458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	reg_w_array(gspca_dev, bridge_init[sd->sensor].val,
1255458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine			bridge_init[sd->sensor].len);
1256c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	ov534_set_led(gspca_dev, 1);
1257458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	sccb_w_array(gspca_dev, sensor_init[sd->sensor].val,
1258458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine			sensor_init[sd->sensor].len);
1259458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	if (sd->sensor == SENSOR_OV767x)
1260458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		sd_start(gspca_dev);
1261458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	sd_stopN(gspca_dev);
1262458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine/*	set_frame_rate(gspca_dev);	*/
1263fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite
126414b67c2969ebf50bd5534b2a0c441f8569a9361eJean-François Moine	return gspca_dev->usb_err;
1265fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite}
1266fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite
1267c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic int sd_start(struct gspca_dev *gspca_dev)
1268fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite{
1269458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	struct sd *sd = (struct sd *) gspca_dev;
1270191d0e7fba43d79a73605adcf85441ebe0a2aff7Jean-Francois Moine	int mode;
1271458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	static const struct reg_array bridge_start[NSENSORS][2] = {
1272458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	[SENSOR_OV767x] = {{bridge_start_qvga_767x,
1273458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine					ARRAY_SIZE(bridge_start_qvga_767x)},
1274458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine			{bridge_start_vga_767x,
1275458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine					ARRAY_SIZE(bridge_start_vga_767x)}},
1276458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	[SENSOR_OV772x] = {{bridge_start_qvga_772x,
1277458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine					ARRAY_SIZE(bridge_start_qvga_772x)},
1278458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine			{bridge_start_vga_772x,
1279458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine					ARRAY_SIZE(bridge_start_vga_772x)}},
1280458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	};
1281458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	static const struct reg_array sensor_start[NSENSORS][2] = {
1282458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	[SENSOR_OV767x] = {{sensor_start_qvga_767x,
1283458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine					ARRAY_SIZE(sensor_start_qvga_767x)},
1284458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine			{sensor_start_vga_767x,
1285458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine					ARRAY_SIZE(sensor_start_vga_767x)}},
1286458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	[SENSOR_OV772x] = {{sensor_start_qvga_772x,
1287458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine					ARRAY_SIZE(sensor_start_qvga_772x)},
1288458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine			{sensor_start_vga_772x,
1289458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine					ARRAY_SIZE(sensor_start_vga_772x)}},
1290458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	};
1291458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine
1292458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	/* (from ms-win trace) */
1293458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	if (sd->sensor == SENSOR_OV767x)
1294458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		sccb_reg_write(gspca_dev, 0x1e, 0x04);
1295458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine					/* black sun enable ? */
1296458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine
1297458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	mode = gspca_dev->curr_mode;	/* 0: 320x240, 1: 640x480 */
1298458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	reg_w_array(gspca_dev, bridge_start[sd->sensor][mode].val,
1299458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine				bridge_start[sd->sensor][mode].len);
1300458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	sccb_w_array(gspca_dev, sensor_start[sd->sensor][mode].val,
1301458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine				sensor_start[sd->sensor][mode].len);
1302fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite
130369f1fe28f08000a123b3d71fac88564109da09fdJean-Francois Moine	set_frame_rate(gspca_dev);
1304189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine
1305228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine	if (!(gspca_dev->ctrl_dis & (1 << AGC)))
1306228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine		setagc(gspca_dev);
1307b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine	setawb(gspca_dev);
1308f2938822523739e99a39fd634943865a432e9c00Max Thrun	setaec(gspca_dev);
1309228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine	if (!(gspca_dev->ctrl_dis & (1 << GAIN)))
1310228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine		setgain(gspca_dev);
1311c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	setexposure(gspca_dev);
1312c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	setbrightness(gspca_dev);
1313c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	setcontrast(gspca_dev);
1314228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine	if (!(gspca_dev->ctrl_dis & (1 << SHARPNESS)))
1315228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine		setsharpness(gspca_dev);
1316228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine	sethvflip(gspca_dev);
1317d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine	if (!(gspca_dev->ctrl_dis & (1 << COLORS)))
1318d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine		setcolors(gspca_dev);
1319228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine	setlightfreq(gspca_dev);
1320189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine
1321189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	ov534_set_led(gspca_dev, 1);
1322189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	ov534_reg_write(gspca_dev, 0xe0, 0x00);
132314b67c2969ebf50bd5534b2a0c441f8569a9361eJean-François Moine	return gspca_dev->usb_err;
1324fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite}
1325fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite
1326c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void sd_stopN(struct gspca_dev *gspca_dev)
1327189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine{
1328189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	ov534_reg_write(gspca_dev, 0xe0, 0x09);
1329189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	ov534_set_led(gspca_dev, 0);
1330189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine}
1331189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine
1332fb139224aea3b56237542690516eb9d6d671b135Jim Paris/* Values for bmHeaderInfo (Video and Still Image Payload Headers, 2.4.3.3) */
1333fb139224aea3b56237542690516eb9d6d671b135Jim Paris#define UVC_STREAM_EOH	(1 << 7)
1334fb139224aea3b56237542690516eb9d6d671b135Jim Paris#define UVC_STREAM_ERR	(1 << 6)
1335fb139224aea3b56237542690516eb9d6d671b135Jim Paris#define UVC_STREAM_STI	(1 << 5)
1336fb139224aea3b56237542690516eb9d6d671b135Jim Paris#define UVC_STREAM_RES	(1 << 4)
1337fb139224aea3b56237542690516eb9d6d671b135Jim Paris#define UVC_STREAM_SCR	(1 << 3)
1338fb139224aea3b56237542690516eb9d6d671b135Jim Paris#define UVC_STREAM_PTS	(1 << 2)
1339fb139224aea3b56237542690516eb9d6d671b135Jim Paris#define UVC_STREAM_EOF	(1 << 1)
1340fb139224aea3b56237542690516eb9d6d671b135Jim Paris#define UVC_STREAM_FID	(1 << 0)
1341fb139224aea3b56237542690516eb9d6d671b135Jim Paris
134276dd272b56cd1c7fa013ef5d7eb28c4d319e322bJean-Francois Moinestatic void sd_pkt_scan(struct gspca_dev *gspca_dev,
134376dd272b56cd1c7fa013ef5d7eb28c4d319e322bJean-Francois Moine			u8 *data, int len)
1344fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite{
13458c252050146fc6f54e9bf5ef8276b25f3dd67a1cJean-Francois Moine	struct sd *sd = (struct sd *) gspca_dev;
1346fb139224aea3b56237542690516eb9d6d671b135Jim Paris	__u32 this_pts;
134784fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine	u16 this_fid;
13480f7a50b29dd9c8603d5ce15c11fd1a1d731e1a6dJim Paris	int remaining_len = len;
1349458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	int payload_len;
13500f7a50b29dd9c8603d5ce15c11fd1a1d731e1a6dJim Paris
1351458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	payload_len = gspca_dev->cam.bulk ? 2048 : 2040;
135284fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine	do {
1353458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine		len = min(remaining_len, payload_len);
1354fb139224aea3b56237542690516eb9d6d671b135Jim Paris
135584fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine		/* Payloads are prefixed with a UVC-style header.  We
135684fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine		   consider a frame to start when the FID toggles, or the PTS
135784fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine		   changes.  A frame ends when EOF is set, and we've received
135884fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine		   the correct number of bytes. */
1359fb139224aea3b56237542690516eb9d6d671b135Jim Paris
136084fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine		/* Verify UVC header.  Header length is always 12 */
136184fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine		if (data[0] != 12 || len < 12) {
136284fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine			PDEBUG(D_PACK, "bad header");
136384fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine			goto discard;
136484fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine		}
1365fb139224aea3b56237542690516eb9d6d671b135Jim Paris
136684fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine		/* Check errors */
136784fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine		if (data[1] & UVC_STREAM_ERR) {
136884fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine			PDEBUG(D_PACK, "payload error");
136984fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine			goto discard;
137084fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine		}
1371fb139224aea3b56237542690516eb9d6d671b135Jim Paris
137284fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine		/* Extract PTS and FID */
137384fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine		if (!(data[1] & UVC_STREAM_PTS)) {
137484fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine			PDEBUG(D_PACK, "PTS not present");
1375fb139224aea3b56237542690516eb9d6d671b135Jim Paris			goto discard;
1376fb139224aea3b56237542690516eb9d6d671b135Jim Paris		}
137784fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine		this_pts = (data[5] << 24) | (data[4] << 16)
137884fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine						| (data[3] << 8) | data[2];
137984fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine		this_fid = (data[1] & UVC_STREAM_FID) ? 1 : 0;
1380fb139224aea3b56237542690516eb9d6d671b135Jim Paris
138184fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine		/* If PTS or FID has changed, start a new frame. */
138284fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine		if (this_pts != sd->last_pts || this_fid != sd->last_fid) {
1383ed47119fb7c7890605379b23180d1b09717b6b5dJean-Francois Moine			if (gspca_dev->last_packet_type == INTER_PACKET)
138476dd272b56cd1c7fa013ef5d7eb28c4d319e322bJean-Francois Moine				gspca_frame_add(gspca_dev, LAST_PACKET,
138576dd272b56cd1c7fa013ef5d7eb28c4d319e322bJean-Francois Moine						NULL, 0);
138684fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine			sd->last_pts = this_pts;
138784fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine			sd->last_fid = this_fid;
138876dd272b56cd1c7fa013ef5d7eb28c4d319e322bJean-Francois Moine			gspca_frame_add(gspca_dev, FIRST_PACKET,
138984fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine					data + 12, len - 12);
139084fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine		/* If this packet is marked as EOF, end the frame */
1391ed47119fb7c7890605379b23180d1b09717b6b5dJean-Francois Moine		} else if (data[1] & UVC_STREAM_EOF) {
139284fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine			sd->last_pts = 0;
1393458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine			if (gspca_dev->pixfmt == V4L2_PIX_FMT_YUYV
1394458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine			 && gspca_dev->image_len + len - 12 !=
1395458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine				   gspca_dev->width * gspca_dev->height * 2) {
139611edebc264f14d3f9e05525f238b91da7f5fa81fAntonio Ospite				PDEBUG(D_PACK, "wrong sized frame");
1397c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine				goto discard;
1398c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine			}
139976dd272b56cd1c7fa013ef5d7eb28c4d319e322bJean-Francois Moine			gspca_frame_add(gspca_dev, LAST_PACKET,
140076dd272b56cd1c7fa013ef5d7eb28c4d319e322bJean-Francois Moine					data + 12, len - 12);
1401ed47119fb7c7890605379b23180d1b09717b6b5dJean-Francois Moine		} else {
1402ed47119fb7c7890605379b23180d1b09717b6b5dJean-Francois Moine
1403ed47119fb7c7890605379b23180d1b09717b6b5dJean-Francois Moine			/* Add the data from this payload */
140476dd272b56cd1c7fa013ef5d7eb28c4d319e322bJean-Francois Moine			gspca_frame_add(gspca_dev, INTER_PACKET,
140576dd272b56cd1c7fa013ef5d7eb28c4d319e322bJean-Francois Moine					data + 12, len - 12);
14063481c19854cdb1de1842c6ea6d558006ac0b3b7dJean-Francois Moine		}
1407fb139224aea3b56237542690516eb9d6d671b135Jim Paris
140884fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine		/* Done this payload */
140984fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine		goto scan_next;
1410fb139224aea3b56237542690516eb9d6d671b135Jim Paris
1411fb139224aea3b56237542690516eb9d6d671b135Jim Parisdiscard:
141284fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine		/* Discard data until a new frame starts. */
141376dd272b56cd1c7fa013ef5d7eb28c4d319e322bJean-Francois Moine		gspca_dev->last_packet_type = DISCARD_PACKET;
141484fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine
141584fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moinescan_next:
141684fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine		remaining_len -= len;
141784fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine		data += len;
141884fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine	} while (remaining_len > 0);
1419fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite}
1420fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite
14218b7fbda484176b46a7760fd474d605ca5152c86dMax Thrunstatic int sd_setagc(struct gspca_dev *gspca_dev, __s32 val)
1422189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine{
1423189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	struct sd *sd = (struct sd *) gspca_dev;
1424189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine
1425228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine	sd->ctrls[AGC].val = val;
1426c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine
1427228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine	/* the auto white balance control works only
1428228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine	 * when auto gain is set */
1429228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine	if (val) {
1430228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine		gspca_dev->ctrl_inac &= ~(1 << AWB);
1431228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine	} else {
1432228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine		gspca_dev->ctrl_inac |= (1 << AWB);
1433228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine		if (sd->ctrls[AWB].val) {
1434228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine			sd->ctrls[AWB].val = 0;
1435228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine			if (gspca_dev->streaming)
1436228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine				setawb(gspca_dev);
1437228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine		}
1438c22c4a20a6ac7b10e43eab6963f941795c5e92aaJean-Francois Moine	}
1439f2938822523739e99a39fd634943865a432e9c00Max Thrun	if (gspca_dev->streaming)
1440228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine		setagc(gspca_dev);
1441228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine	return gspca_dev->usb_err;
14424b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi}
14434b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi
14444b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimistatic int sd_querymenu(struct gspca_dev *gspca_dev,
14454b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi		struct v4l2_querymenu *menu)
14464b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi{
14474b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi	switch (menu->id) {
14484b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi	case V4L2_CID_POWER_LINE_FREQUENCY:
14494b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi		switch (menu->index) {
14504b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi		case 0:         /* V4L2_CID_POWER_LINE_FREQUENCY_DISABLED */
14514b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi			strcpy((char *) menu->name, "Disabled");
14524b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi			return 0;
14534b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi		case 1:         /* V4L2_CID_POWER_LINE_FREQUENCY_50HZ */
14544b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi			strcpy((char *) menu->name, "50 Hz");
14554b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi			return 0;
14564b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi		}
14574b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi		break;
14584b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi	}
14594b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi
14604b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi	return -EINVAL;
14614b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi}
14624b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi
146311d9f25da89523d19dba3608d51a86af2954fc0dJim Paris/* get stream parameters (framerate) */
1464668f44a603dd4b3468cecd7d8d6dc525207db94eJean-François Moinestatic void sd_get_streamparm(struct gspca_dev *gspca_dev,
14655c1a15a149504496b25ee3f681893cbe1647ba39Jean-Francois Moine			     struct v4l2_streamparm *parm)
146611d9f25da89523d19dba3608d51a86af2954fc0dJim Paris{
146711d9f25da89523d19dba3608d51a86af2954fc0dJim Paris	struct v4l2_captureparm *cp = &parm->parm.capture;
146811d9f25da89523d19dba3608d51a86af2954fc0dJim Paris	struct v4l2_fract *tpf = &cp->timeperframe;
146911d9f25da89523d19dba3608d51a86af2954fc0dJim Paris	struct sd *sd = (struct sd *) gspca_dev;
147011d9f25da89523d19dba3608d51a86af2954fc0dJim Paris
147111d9f25da89523d19dba3608d51a86af2954fc0dJim Paris	cp->capability |= V4L2_CAP_TIMEPERFRAME;
147211d9f25da89523d19dba3608d51a86af2954fc0dJim Paris	tpf->numerator = 1;
147311d9f25da89523d19dba3608d51a86af2954fc0dJim Paris	tpf->denominator = sd->frame_rate;
147411d9f25da89523d19dba3608d51a86af2954fc0dJim Paris}
147511d9f25da89523d19dba3608d51a86af2954fc0dJim Paris
147611d9f25da89523d19dba3608d51a86af2954fc0dJim Paris/* set stream parameters (framerate) */
1477668f44a603dd4b3468cecd7d8d6dc525207db94eJean-François Moinestatic void sd_set_streamparm(struct gspca_dev *gspca_dev,
14785c1a15a149504496b25ee3f681893cbe1647ba39Jean-Francois Moine			     struct v4l2_streamparm *parm)
147911d9f25da89523d19dba3608d51a86af2954fc0dJim Paris{
148011d9f25da89523d19dba3608d51a86af2954fc0dJim Paris	struct v4l2_captureparm *cp = &parm->parm.capture;
148111d9f25da89523d19dba3608d51a86af2954fc0dJim Paris	struct v4l2_fract *tpf = &cp->timeperframe;
148211d9f25da89523d19dba3608d51a86af2954fc0dJim Paris	struct sd *sd = (struct sd *) gspca_dev;
148311d9f25da89523d19dba3608d51a86af2954fc0dJim Paris
148411d9f25da89523d19dba3608d51a86af2954fc0dJim Paris	/* Set requested framerate */
148511d9f25da89523d19dba3608d51a86af2954fc0dJim Paris	sd->frame_rate = tpf->denominator / tpf->numerator;
1486c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	if (gspca_dev->streaming)
148769f1fe28f08000a123b3d71fac88564109da09fdJean-Francois Moine		set_frame_rate(gspca_dev);
148811d9f25da89523d19dba3608d51a86af2954fc0dJim Paris
148911d9f25da89523d19dba3608d51a86af2954fc0dJim Paris	/* Return the actual framerate */
149011d9f25da89523d19dba3608d51a86af2954fc0dJim Paris	tpf->numerator = 1;
149111d9f25da89523d19dba3608d51a86af2954fc0dJim Paris	tpf->denominator = sd->frame_rate;
149211d9f25da89523d19dba3608d51a86af2954fc0dJim Paris}
149311d9f25da89523d19dba3608d51a86af2954fc0dJim Paris
1494fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite/* sub-driver description */
1495c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic const struct sd_desc sd_desc = {
1496fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite	.name     = MODULE_NAME,
1497c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	.ctrls    = sd_ctrls,
1498c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	.nctrls   = ARRAY_SIZE(sd_ctrls),
1499fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite	.config   = sd_config,
1500fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite	.init     = sd_init,
1501c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	.start    = sd_start,
1502c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	.stopN    = sd_stopN,
1503189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	.pkt_scan = sd_pkt_scan,
15044b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi	.querymenu = sd_querymenu,
1505189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	.get_streamparm = sd_get_streamparm,
1506189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine	.set_streamparm = sd_set_streamparm,
1507189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine};
1508189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine
1509fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite/* -- module initialisation -- */
151095c967c167785eb991cf6b22fb854dd8d61d0ff8Jean-François Moinestatic const struct usb_device_id device_table[] = {
1511c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	{USB_DEVICE(0x1415, 0x2000)},
1512458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine	{USB_DEVICE(0x06f8, 0x3002)},
1513fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite	{}
1514fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite};
1515fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite
1516fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio OspiteMODULE_DEVICE_TABLE(usb, device_table);
1517fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite
1518fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite/* -- device connect -- */
1519fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospitestatic int sd_probe(struct usb_interface *intf, const struct usb_device_id *id)
1520fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite{
1521c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine	return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd),
1522189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine				THIS_MODULE);
1523fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite}
1524fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite
1525fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospitestatic struct usb_driver sd_driver = {
1526fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite	.name       = MODULE_NAME,
1527fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite	.id_table   = device_table,
1528fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite	.probe      = sd_probe,
1529fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite	.disconnect = gspca_disconnect,
1530fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite#ifdef CONFIG_PM
1531fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite	.suspend    = gspca_suspend,
1532fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite	.resume     = gspca_resume,
1533fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite#endif
1534fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite};
1535fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite
1536ecb3b2b35db49778b6d89e3ffd0c400776c20735Greg Kroah-Hartmanmodule_usb_driver(sd_driver);
1537