1/*
2 *		sonix sn9c102 (bayer) library
3 *
4 * Copyright (C) 2009-2011 Jean-François Moine <http://moinejf.free.fr>
5 * Copyright (C) 2003 2004 Michel Xhaard mxhaard@magic.fr
6 * Add Pas106 Stefano Mozzi (C) 2004
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 */
22
23/* Some documentation on known sonixb registers:
24
25Reg	Use
26sn9c101 / sn9c102:
270x10	high nibble red gain low nibble blue gain
280x11	low nibble green gain
29sn9c103:
300x05	red gain 0-127
310x06	blue gain 0-127
320x07	green gain 0-127
33all:
340x08-0x0f i2c / 3wire registers
350x12	hstart
360x13	vstart
370x15	hsize (hsize = register-value * 16)
380x16	vsize (vsize = register-value * 16)
390x17	bit 0 toggle compression quality (according to sn9c102 driver)
400x18	bit 7 enables compression, bit 4-5 set image down scaling:
41	00 scale 1, 01 scale 1/2, 10, scale 1/4
420x19	high-nibble is sensor clock divider, changes exposure on sensors which
43	use a clock generated by the bridge. Some sensors have their own clock.
440x1c	auto_exposure area (for avg_lum) startx (startx = register-value * 32)
450x1d	auto_exposure area (for avg_lum) starty (starty = register-value * 32)
460x1e	auto_exposure area (for avg_lum) stopx (hsize = (0x1e - 0x1c) * 32)
470x1f	auto_exposure area (for avg_lum) stopy (vsize = (0x1f - 0x1d) * 32)
48*/
49
50#define MODULE_NAME "sonixb"
51
52#include <linux/input.h>
53#include "gspca.h"
54
55MODULE_AUTHOR("Jean-François Moine <http://moinejf.free.fr>");
56MODULE_DESCRIPTION("GSPCA/SN9C102 USB Camera Driver");
57MODULE_LICENSE("GPL");
58
59/* specific webcam descriptor */
60struct sd {
61	struct gspca_dev gspca_dev;	/* !! must be the first item */
62
63	struct v4l2_ctrl *brightness;
64	struct v4l2_ctrl *plfreq;
65
66	atomic_t avg_lum;
67	int prev_avg_lum;
68	int exposure_knee;
69	int header_read;
70	u8 header[12]; /* Header without sof marker */
71
72	unsigned char autogain_ignore_frames;
73	unsigned char frames_to_drop;
74
75	__u8 bridge;			/* Type of bridge */
76#define BRIDGE_101 0
77#define BRIDGE_102 0 /* We make no difference between 101 and 102 */
78#define BRIDGE_103 1
79
80	__u8 sensor;			/* Type of image sensor chip */
81#define SENSOR_HV7131D 0
82#define SENSOR_HV7131R 1
83#define SENSOR_OV6650 2
84#define SENSOR_OV7630 3
85#define SENSOR_PAS106 4
86#define SENSOR_PAS202 5
87#define SENSOR_TAS5110C 6
88#define SENSOR_TAS5110D 7
89#define SENSOR_TAS5130CXX 8
90	__u8 reg11;
91};
92
93typedef const __u8 sensor_init_t[8];
94
95struct sensor_data {
96	const __u8 *bridge_init;
97	sensor_init_t *sensor_init;
98	int sensor_init_size;
99	int flags;
100	__u8 sensor_addr;
101};
102
103/* sensor_data flags */
104#define F_SIF		0x01	/* sif or vga */
105
106/* priv field of struct v4l2_pix_format flags (do not use low nibble!) */
107#define MODE_RAW 0x10		/* raw bayer mode */
108#define MODE_REDUCED_SIF 0x20	/* vga mode (320x240 / 160x120) on sif cam */
109
110#define COMP 0xc7		/* 0x87 //0x07 */
111#define COMP1 0xc9		/* 0x89 //0x09 */
112
113#define MCK_INIT 0x63
114#define MCK_INIT1 0x20		/*fixme: Bayer - 0x50 for JPEG ??*/
115
116#define SYS_CLK 0x04
117
118#define SENS(bridge, sensor, _flags, _sensor_addr) \
119{ \
120	.bridge_init = bridge, \
121	.sensor_init = sensor, \
122	.sensor_init_size = sizeof(sensor), \
123	.flags = _flags, .sensor_addr = _sensor_addr \
124}
125
126/* We calculate the autogain at the end of the transfer of a frame, at this
127   moment a frame with the old settings is being captured and transmitted. So
128   if we adjust the gain or exposure we must ignore atleast the next frame for
129   the new settings to come into effect before doing any other adjustments. */
130#define AUTOGAIN_IGNORE_FRAMES 1
131
132static const struct v4l2_pix_format vga_mode[] = {
133	{160, 120, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
134		.bytesperline = 160,
135		.sizeimage = 160 * 120,
136		.colorspace = V4L2_COLORSPACE_SRGB,
137		.priv = 2 | MODE_RAW},
138	{160, 120, V4L2_PIX_FMT_SN9C10X, V4L2_FIELD_NONE,
139		.bytesperline = 160,
140		.sizeimage = 160 * 120 * 5 / 4,
141		.colorspace = V4L2_COLORSPACE_SRGB,
142		.priv = 2},
143	{320, 240, V4L2_PIX_FMT_SN9C10X, V4L2_FIELD_NONE,
144		.bytesperline = 320,
145		.sizeimage = 320 * 240 * 5 / 4,
146		.colorspace = V4L2_COLORSPACE_SRGB,
147		.priv = 1},
148	{640, 480, V4L2_PIX_FMT_SN9C10X, V4L2_FIELD_NONE,
149		.bytesperline = 640,
150		.sizeimage = 640 * 480 * 5 / 4,
151		.colorspace = V4L2_COLORSPACE_SRGB,
152		.priv = 0},
153};
154static const struct v4l2_pix_format sif_mode[] = {
155	{160, 120, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
156		.bytesperline = 160,
157		.sizeimage = 160 * 120,
158		.colorspace = V4L2_COLORSPACE_SRGB,
159		.priv = 1 | MODE_RAW | MODE_REDUCED_SIF},
160	{160, 120, V4L2_PIX_FMT_SN9C10X, V4L2_FIELD_NONE,
161		.bytesperline = 160,
162		.sizeimage = 160 * 120 * 5 / 4,
163		.colorspace = V4L2_COLORSPACE_SRGB,
164		.priv = 1 | MODE_REDUCED_SIF},
165	{176, 144, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
166		.bytesperline = 176,
167		.sizeimage = 176 * 144,
168		.colorspace = V4L2_COLORSPACE_SRGB,
169		.priv = 1 | MODE_RAW},
170	{176, 144, V4L2_PIX_FMT_SN9C10X, V4L2_FIELD_NONE,
171		.bytesperline = 176,
172		.sizeimage = 176 * 144 * 5 / 4,
173		.colorspace = V4L2_COLORSPACE_SRGB,
174		.priv = 1},
175	{320, 240, V4L2_PIX_FMT_SN9C10X, V4L2_FIELD_NONE,
176		.bytesperline = 320,
177		.sizeimage = 320 * 240 * 5 / 4,
178		.colorspace = V4L2_COLORSPACE_SRGB,
179		.priv = 0 | MODE_REDUCED_SIF},
180	{352, 288, V4L2_PIX_FMT_SN9C10X, V4L2_FIELD_NONE,
181		.bytesperline = 352,
182		.sizeimage = 352 * 288 * 5 / 4,
183		.colorspace = V4L2_COLORSPACE_SRGB,
184		.priv = 0},
185};
186
187static const __u8 initHv7131d[] = {
188	0x04, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0x11, 0x00, 0x00, 0x00,
189	0x00, 0x00,
190	0x00, 0x00, 0x00, 0x02, 0x02, 0x00,
191	0x28, 0x1e, 0x60, 0x8e, 0x42,
192};
193static const __u8 hv7131d_sensor_init[][8] = {
194	{0xa0, 0x11, 0x01, 0x04, 0x00, 0x00, 0x00, 0x17},
195	{0xa0, 0x11, 0x02, 0x00, 0x00, 0x00, 0x00, 0x17},
196	{0xa0, 0x11, 0x28, 0x00, 0x00, 0x00, 0x00, 0x17},
197	{0xa0, 0x11, 0x30, 0x30, 0x00, 0x00, 0x00, 0x17}, /* reset level */
198	{0xa0, 0x11, 0x34, 0x02, 0x00, 0x00, 0x00, 0x17}, /* pixel bias volt */
199};
200
201static const __u8 initHv7131r[] = {
202	0x46, 0x77, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0x11, 0x00, 0x00, 0x00,
203	0x00, 0x00,
204	0x00, 0x00, 0x00, 0x02, 0x01, 0x00,
205	0x28, 0x1e, 0x60, 0x8a, 0x20,
206};
207static const __u8 hv7131r_sensor_init[][8] = {
208	{0xc0, 0x11, 0x31, 0x38, 0x2a, 0x2e, 0x00, 0x10},
209	{0xa0, 0x11, 0x01, 0x08, 0x2a, 0x2e, 0x00, 0x10},
210	{0xb0, 0x11, 0x20, 0x00, 0xd0, 0x2e, 0x00, 0x10},
211	{0xc0, 0x11, 0x25, 0x03, 0x0e, 0x28, 0x00, 0x16},
212	{0xa0, 0x11, 0x30, 0x10, 0x0e, 0x28, 0x00, 0x15},
213};
214static const __u8 initOv6650[] = {
215	0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
216	0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
217	0x00, 0x01, 0x01, 0x0a, 0x16, 0x12, 0x68, 0x8b,
218	0x10,
219};
220static const __u8 ov6650_sensor_init[][8] = {
221	/* Bright, contrast, etc are set through SCBB interface.
222	 * AVCAP on win2 do not send any data on this controls. */
223	/* Anyway, some registers appears to alter bright and constrat */
224
225	/* Reset sensor */
226	{0xa0, 0x60, 0x12, 0x80, 0x00, 0x00, 0x00, 0x10},
227	/* Set clock register 0x11 low nibble is clock divider */
228	{0xd0, 0x60, 0x11, 0xc0, 0x1b, 0x18, 0xc1, 0x10},
229	/* Next some unknown stuff */
230	{0xb0, 0x60, 0x15, 0x00, 0x02, 0x18, 0xc1, 0x10},
231/*	{0xa0, 0x60, 0x1b, 0x01, 0x02, 0x18, 0xc1, 0x10},
232		 * THIS SET GREEN SCREEN
233		 * (pixels could be innverted in decode kind of "brg",
234		 * but blue wont be there. Avoid this data ... */
235	{0xd0, 0x60, 0x26, 0x01, 0x14, 0xd8, 0xa4, 0x10}, /* format out? */
236	{0xd0, 0x60, 0x26, 0x01, 0x14, 0xd8, 0xa4, 0x10},
237	{0xa0, 0x60, 0x30, 0x3d, 0x0a, 0xd8, 0xa4, 0x10},
238	/* Enable rgb brightness control */
239	{0xa0, 0x60, 0x61, 0x08, 0x00, 0x00, 0x00, 0x10},
240	/* HDG: Note windows uses the line below, which sets both register 0x60
241	   and 0x61 I believe these registers of the ov6650 are identical as
242	   those of the ov7630, because if this is true the windows settings
243	   add a bit additional red gain and a lot additional blue gain, which
244	   matches my findings that the windows settings make blue much too
245	   blue and red a little too red.
246	{0xb0, 0x60, 0x60, 0x66, 0x68, 0xd8, 0xa4, 0x10}, */
247	/* Some more unknown stuff */
248	{0xa0, 0x60, 0x68, 0x04, 0x68, 0xd8, 0xa4, 0x10},
249	{0xd0, 0x60, 0x17, 0x24, 0xd6, 0x04, 0x94, 0x10}, /* Clipreg */
250};
251
252static const __u8 initOv7630[] = {
253	0x04, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,	/* r01 .. r08 */
254	0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	/* r09 .. r10 */
255	0x00, 0x01, 0x01, 0x0a,				/* r11 .. r14 */
256	0x28, 0x1e,			/* H & V sizes     r15 .. r16 */
257	0x68, 0x8f, MCK_INIT1,				/* r17 .. r19 */
258};
259static const __u8 ov7630_sensor_init[][8] = {
260	{0xa0, 0x21, 0x12, 0x80, 0x00, 0x00, 0x00, 0x10},
261	{0xb0, 0x21, 0x01, 0x77, 0x3a, 0x00, 0x00, 0x10},
262/*	{0xd0, 0x21, 0x12, 0x7c, 0x01, 0x80, 0x34, 0x10},	   jfm */
263	{0xd0, 0x21, 0x12, 0x5c, 0x00, 0x80, 0x34, 0x10},	/* jfm */
264	{0xa0, 0x21, 0x1b, 0x04, 0x00, 0x80, 0x34, 0x10},
265	{0xa0, 0x21, 0x20, 0x44, 0x00, 0x80, 0x34, 0x10},
266	{0xa0, 0x21, 0x23, 0xee, 0x00, 0x80, 0x34, 0x10},
267	{0xd0, 0x21, 0x26, 0xa0, 0x9a, 0xa0, 0x30, 0x10},
268	{0xb0, 0x21, 0x2a, 0x80, 0x00, 0xa0, 0x30, 0x10},
269	{0xb0, 0x21, 0x2f, 0x3d, 0x24, 0xa0, 0x30, 0x10},
270	{0xa0, 0x21, 0x32, 0x86, 0x24, 0xa0, 0x30, 0x10},
271	{0xb0, 0x21, 0x60, 0xa9, 0x4a, 0xa0, 0x30, 0x10},
272/*	{0xb0, 0x21, 0x60, 0xa9, 0x42, 0xa0, 0x30, 0x10},	 * jfm */
273	{0xa0, 0x21, 0x65, 0x00, 0x42, 0xa0, 0x30, 0x10},
274	{0xa0, 0x21, 0x69, 0x38, 0x42, 0xa0, 0x30, 0x10},
275	{0xc0, 0x21, 0x6f, 0x88, 0x0b, 0x00, 0x30, 0x10},
276	{0xc0, 0x21, 0x74, 0x21, 0x8e, 0x00, 0x30, 0x10},
277	{0xa0, 0x21, 0x7d, 0xf7, 0x8e, 0x00, 0x30, 0x10},
278	{0xd0, 0x21, 0x17, 0x1c, 0xbd, 0x06, 0xf6, 0x10},
279};
280
281static const __u8 initPas106[] = {
282	0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x40, 0x00, 0x00, 0x00,
283	0x00, 0x00,
284	0x00, 0x00, 0x00, 0x04, 0x01, 0x00,
285	0x16, 0x12, 0x24, COMP1, MCK_INIT1,
286};
287/* compression 0x86 mckinit1 0x2b */
288
289/* "Known" PAS106B registers:
290  0x02 clock divider
291  0x03 Variable framerate bits 4-11
292  0x04 Var framerate bits 0-3, one must leave the 4 msb's at 0 !!
293       The variable framerate control must never be set lower then 300,
294       which sets the framerate at 90 / reg02, otherwise vsync is lost.
295  0x05 Shutter Time Line Offset, this can be used as an exposure control:
296       0 = use full frame time, 255 = no exposure at all
297       Note this may never be larger then "var-framerate control" / 2 - 2.
298       When var-framerate control is < 514, no exposure is reached at the max
299       allowed value for the framerate control value, rather then at 255.
300  0x06 Shutter Time Pixel Offset, like reg05 this influences exposure, but
301       only a very little bit, leave at 0xcd
302  0x07 offset sign bit (bit0 1 > negative offset)
303  0x08 offset
304  0x09 Blue Gain
305  0x0a Green1 Gain
306  0x0b Green2 Gain
307  0x0c Red Gain
308  0x0e Global gain
309  0x13 Write 1 to commit settings to sensor
310*/
311
312static const __u8 pas106_sensor_init[][8] = {
313	/* Pixel Clock Divider 6 */
314	{ 0xa1, 0x40, 0x02, 0x04, 0x00, 0x00, 0x00, 0x14 },
315	/* Frame Time MSB (also seen as 0x12) */
316	{ 0xa1, 0x40, 0x03, 0x13, 0x00, 0x00, 0x00, 0x14 },
317	/* Frame Time LSB (also seen as 0x05) */
318	{ 0xa1, 0x40, 0x04, 0x06, 0x00, 0x00, 0x00, 0x14 },
319	/* Shutter Time Line Offset (also seen as 0x6d) */
320	{ 0xa1, 0x40, 0x05, 0x65, 0x00, 0x00, 0x00, 0x14 },
321	/* Shutter Time Pixel Offset (also seen as 0xb1) */
322	{ 0xa1, 0x40, 0x06, 0xcd, 0x00, 0x00, 0x00, 0x14 },
323	/* Black Level Subtract Sign (also seen 0x00) */
324	{ 0xa1, 0x40, 0x07, 0xc1, 0x00, 0x00, 0x00, 0x14 },
325	/* Black Level Subtract Level (also seen 0x01) */
326	{ 0xa1, 0x40, 0x08, 0x06, 0x00, 0x00, 0x00, 0x14 },
327	{ 0xa1, 0x40, 0x08, 0x06, 0x00, 0x00, 0x00, 0x14 },
328	/* Color Gain B Pixel 5 a */
329	{ 0xa1, 0x40, 0x09, 0x05, 0x00, 0x00, 0x00, 0x14 },
330	/* Color Gain G1 Pixel 1 5 */
331	{ 0xa1, 0x40, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x14 },
332	/* Color Gain G2 Pixel 1 0 5 */
333	{ 0xa1, 0x40, 0x0b, 0x04, 0x00, 0x00, 0x00, 0x14 },
334	/* Color Gain R Pixel 3 1 */
335	{ 0xa1, 0x40, 0x0c, 0x05, 0x00, 0x00, 0x00, 0x14 },
336	/* Color GainH  Pixel */
337	{ 0xa1, 0x40, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x14 },
338	/* Global Gain */
339	{ 0xa1, 0x40, 0x0e, 0x0e, 0x00, 0x00, 0x00, 0x14 },
340	/* Contrast */
341	{ 0xa1, 0x40, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x14 },
342	/* H&V synchro polarity */
343	{ 0xa1, 0x40, 0x10, 0x06, 0x00, 0x00, 0x00, 0x14 },
344	/* ?default */
345	{ 0xa1, 0x40, 0x11, 0x06, 0x00, 0x00, 0x00, 0x14 },
346	/* DAC scale */
347	{ 0xa1, 0x40, 0x12, 0x06, 0x00, 0x00, 0x00, 0x14 },
348	/* ?default */
349	{ 0xa1, 0x40, 0x14, 0x02, 0x00, 0x00, 0x00, 0x14 },
350	/* Validate Settings */
351	{ 0xa1, 0x40, 0x13, 0x01, 0x00, 0x00, 0x00, 0x14 },
352};
353
354static const __u8 initPas202[] = {
355	0x44, 0x44, 0x21, 0x30, 0x00, 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, 0x00,
356	0x00, 0x00,
357	0x00, 0x00, 0x00, 0x06, 0x03, 0x0a,
358	0x28, 0x1e, 0x20, 0x89, 0x20,
359};
360
361/* "Known" PAS202BCB registers:
362  0x02 clock divider
363  0x04 Variable framerate bits 6-11 (*)
364  0x05 Var framerate  bits 0-5, one must leave the 2 msb's at 0 !!
365  0x07 Blue Gain
366  0x08 Green Gain
367  0x09 Red Gain
368  0x0b offset sign bit (bit0 1 > negative offset)
369  0x0c offset
370  0x0e Unknown image is slightly brighter when bit 0 is 0, if reg0f is 0 too,
371       leave at 1 otherwise we get a jump in our exposure control
372  0x0f Exposure 0-255, 0 = use full frame time, 255 = no exposure at all
373  0x10 Master gain 0 - 31
374  0x11 write 1 to apply changes
375  (*) The variable framerate control must never be set lower then 500
376      which sets the framerate at 30 / reg02, otherwise vsync is lost.
377*/
378static const __u8 pas202_sensor_init[][8] = {
379	/* Set the clock divider to 4 -> 30 / 4 = 7.5 fps, we would like
380	   to set it lower, but for some reason the bridge starts missing
381	   vsync's then */
382	{0xa0, 0x40, 0x02, 0x04, 0x00, 0x00, 0x00, 0x10},
383	{0xd0, 0x40, 0x04, 0x07, 0x34, 0x00, 0x09, 0x10},
384	{0xd0, 0x40, 0x08, 0x01, 0x00, 0x00, 0x01, 0x10},
385	{0xd0, 0x40, 0x0c, 0x00, 0x0c, 0x01, 0x32, 0x10},
386	{0xd0, 0x40, 0x10, 0x00, 0x01, 0x00, 0x63, 0x10},
387	{0xa0, 0x40, 0x15, 0x70, 0x01, 0x00, 0x63, 0x10},
388	{0xa0, 0x40, 0x18, 0x00, 0x01, 0x00, 0x63, 0x10},
389	{0xa0, 0x40, 0x11, 0x01, 0x01, 0x00, 0x63, 0x10},
390	{0xa0, 0x40, 0x03, 0x56, 0x01, 0x00, 0x63, 0x10},
391	{0xa0, 0x40, 0x11, 0x01, 0x01, 0x00, 0x63, 0x10},
392};
393
394static const __u8 initTas5110c[] = {
395	0x44, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x11, 0x00, 0x00, 0x00,
396	0x00, 0x00,
397	0x00, 0x00, 0x00, 0x45, 0x09, 0x0a,
398	0x16, 0x12, 0x60, 0x86, 0x2b,
399};
400/* Same as above, except a different hstart */
401static const __u8 initTas5110d[] = {
402	0x44, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x11, 0x00, 0x00, 0x00,
403	0x00, 0x00,
404	0x00, 0x00, 0x00, 0x41, 0x09, 0x0a,
405	0x16, 0x12, 0x60, 0x86, 0x2b,
406};
407/* tas5110c is 3 wire, tas5110d is 2 wire (regular i2c) */
408static const __u8 tas5110c_sensor_init[][8] = {
409	{0x30, 0x11, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x10},
410	{0x30, 0x11, 0x02, 0x20, 0xa9, 0x00, 0x00, 0x10},
411};
412/* Known TAS5110D registers
413 * reg02: gain, bit order reversed!! 0 == max gain, 255 == min gain
414 * reg03: bit3: vflip, bit4: ~hflip, bit7: ~gainboost (~ == inverted)
415 *        Note: writing reg03 seems to only work when written together with 02
416 */
417static const __u8 tas5110d_sensor_init[][8] = {
418	{0xa0, 0x61, 0x9a, 0xca, 0x00, 0x00, 0x00, 0x17}, /* reset */
419};
420
421static const __u8 initTas5130[] = {
422	0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x11, 0x00, 0x00, 0x00,
423	0x00, 0x00,
424	0x00, 0x00, 0x00, 0x68, 0x0c, 0x0a,
425	0x28, 0x1e, 0x60, COMP, MCK_INIT,
426};
427static const __u8 tas5130_sensor_init[][8] = {
428/*	{0x30, 0x11, 0x00, 0x40, 0x47, 0x00, 0x00, 0x10},
429					* shutter 0x47 short exposure? */
430	{0x30, 0x11, 0x00, 0x40, 0x01, 0x00, 0x00, 0x10},
431					/* shutter 0x01 long exposure */
432	{0x30, 0x11, 0x02, 0x20, 0x70, 0x00, 0x00, 0x10},
433};
434
435static const struct sensor_data sensor_data[] = {
436	SENS(initHv7131d, hv7131d_sensor_init, 0, 0),
437	SENS(initHv7131r, hv7131r_sensor_init, 0, 0),
438	SENS(initOv6650, ov6650_sensor_init, F_SIF, 0x60),
439	SENS(initOv7630, ov7630_sensor_init, 0, 0x21),
440	SENS(initPas106, pas106_sensor_init, F_SIF, 0),
441	SENS(initPas202, pas202_sensor_init, 0, 0),
442	SENS(initTas5110c, tas5110c_sensor_init, F_SIF, 0),
443	SENS(initTas5110d, tas5110d_sensor_init, F_SIF, 0),
444	SENS(initTas5130, tas5130_sensor_init, 0, 0),
445};
446
447/* get one byte in gspca_dev->usb_buf */
448static void reg_r(struct gspca_dev *gspca_dev,
449		  __u16 value)
450{
451	int res;
452
453	if (gspca_dev->usb_err < 0)
454		return;
455
456	res = usb_control_msg(gspca_dev->dev,
457			usb_rcvctrlpipe(gspca_dev->dev, 0),
458			0,			/* request */
459			USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
460			value,
461			0,			/* index */
462			gspca_dev->usb_buf, 1,
463			500);
464
465	if (res < 0) {
466		dev_err(gspca_dev->v4l2_dev.dev,
467			"Error reading register %02x: %d\n", value, res);
468		gspca_dev->usb_err = res;
469	}
470}
471
472static void reg_w(struct gspca_dev *gspca_dev,
473		  __u16 value,
474		  const __u8 *buffer,
475		  int len)
476{
477	int res;
478
479	if (gspca_dev->usb_err < 0)
480		return;
481
482	memcpy(gspca_dev->usb_buf, buffer, len);
483	res = usb_control_msg(gspca_dev->dev,
484			usb_sndctrlpipe(gspca_dev->dev, 0),
485			0x08,			/* request */
486			USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
487			value,
488			0,			/* index */
489			gspca_dev->usb_buf, len,
490			500);
491
492	if (res < 0) {
493		dev_err(gspca_dev->v4l2_dev.dev,
494			"Error writing register %02x: %d\n", value, res);
495		gspca_dev->usb_err = res;
496	}
497}
498
499static void i2c_w(struct gspca_dev *gspca_dev, const u8 *buf)
500{
501	int retry = 60;
502
503	if (gspca_dev->usb_err < 0)
504		return;
505
506	/* is i2c ready */
507	reg_w(gspca_dev, 0x08, buf, 8);
508	while (retry--) {
509		if (gspca_dev->usb_err < 0)
510			return;
511		msleep(1);
512		reg_r(gspca_dev, 0x08);
513		if (gspca_dev->usb_buf[0] & 0x04) {
514			if (gspca_dev->usb_buf[0] & 0x08) {
515				dev_err(gspca_dev->v4l2_dev.dev,
516					"i2c error writing %8ph\n", buf);
517				gspca_dev->usb_err = -EIO;
518			}
519			return;
520		}
521	}
522
523	dev_err(gspca_dev->v4l2_dev.dev, "i2c write timeout\n");
524	gspca_dev->usb_err = -EIO;
525}
526
527static void i2c_w_vector(struct gspca_dev *gspca_dev,
528			const __u8 buffer[][8], int len)
529{
530	for (;;) {
531		if (gspca_dev->usb_err < 0)
532			return;
533		i2c_w(gspca_dev, *buffer);
534		len -= 8;
535		if (len <= 0)
536			break;
537		buffer++;
538	}
539}
540
541static void setbrightness(struct gspca_dev *gspca_dev)
542{
543	struct sd *sd = (struct sd *) gspca_dev;
544
545	switch (sd->sensor) {
546	case  SENSOR_OV6650:
547	case  SENSOR_OV7630: {
548		__u8 i2cOV[] =
549			{0xa0, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x10};
550
551		/* change reg 0x06 */
552		i2cOV[1] = sensor_data[sd->sensor].sensor_addr;
553		i2cOV[3] = sd->brightness->val;
554		i2c_w(gspca_dev, i2cOV);
555		break;
556	}
557	case SENSOR_PAS106:
558	case SENSOR_PAS202: {
559		__u8 i2cpbright[] =
560			{0xb0, 0x40, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x16};
561		__u8 i2cpdoit[] =
562			{0xa0, 0x40, 0x11, 0x01, 0x00, 0x00, 0x00, 0x16};
563
564		/* PAS106 uses reg 7 and 8 instead of b and c */
565		if (sd->sensor == SENSOR_PAS106) {
566			i2cpbright[2] = 7;
567			i2cpdoit[2] = 0x13;
568		}
569
570		if (sd->brightness->val < 127) {
571			/* change reg 0x0b, signreg */
572			i2cpbright[3] = 0x01;
573			/* set reg 0x0c, offset */
574			i2cpbright[4] = 127 - sd->brightness->val;
575		} else
576			i2cpbright[4] = sd->brightness->val - 127;
577
578		i2c_w(gspca_dev, i2cpbright);
579		i2c_w(gspca_dev, i2cpdoit);
580		break;
581	}
582	default:
583		break;
584	}
585}
586
587static void setgain(struct gspca_dev *gspca_dev)
588{
589	struct sd *sd = (struct sd *) gspca_dev;
590	u8 gain = gspca_dev->gain->val;
591
592	switch (sd->sensor) {
593	case SENSOR_HV7131D: {
594		__u8 i2c[] =
595			{0xc0, 0x11, 0x31, 0x00, 0x00, 0x00, 0x00, 0x17};
596
597		i2c[3] = 0x3f - gain;
598		i2c[4] = 0x3f - gain;
599		i2c[5] = 0x3f - gain;
600
601		i2c_w(gspca_dev, i2c);
602		break;
603	}
604	case SENSOR_TAS5110C:
605	case SENSOR_TAS5130CXX: {
606		__u8 i2c[] =
607			{0x30, 0x11, 0x02, 0x20, 0x70, 0x00, 0x00, 0x10};
608
609		i2c[4] = 255 - gain;
610		i2c_w(gspca_dev, i2c);
611		break;
612	}
613	case SENSOR_TAS5110D: {
614		__u8 i2c[] = {
615			0xb0, 0x61, 0x02, 0x00, 0x10, 0x00, 0x00, 0x17 };
616		gain = 255 - gain;
617		/* The bits in the register are the wrong way around!! */
618		i2c[3] |= (gain & 0x80) >> 7;
619		i2c[3] |= (gain & 0x40) >> 5;
620		i2c[3] |= (gain & 0x20) >> 3;
621		i2c[3] |= (gain & 0x10) >> 1;
622		i2c[3] |= (gain & 0x08) << 1;
623		i2c[3] |= (gain & 0x04) << 3;
624		i2c[3] |= (gain & 0x02) << 5;
625		i2c[3] |= (gain & 0x01) << 7;
626		i2c_w(gspca_dev, i2c);
627		break;
628	}
629	case SENSOR_OV6650:
630	case SENSOR_OV7630: {
631		__u8 i2c[] = {0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10};
632
633		/*
634		 * The ov7630's gain is weird, at 32 the gain drops to the
635		 * same level as at 16, so skip 32-47 (of the 0-63 scale).
636		 */
637		if (sd->sensor == SENSOR_OV7630 && gain >= 32)
638			gain += 16;
639
640		i2c[1] = sensor_data[sd->sensor].sensor_addr;
641		i2c[3] = gain;
642		i2c_w(gspca_dev, i2c);
643		break;
644	}
645	case SENSOR_PAS106:
646	case SENSOR_PAS202: {
647		__u8 i2cpgain[] =
648			{0xa0, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x15};
649		__u8 i2cpcolorgain[] =
650			{0xc0, 0x40, 0x07, 0x00, 0x00, 0x00, 0x00, 0x15};
651		__u8 i2cpdoit[] =
652			{0xa0, 0x40, 0x11, 0x01, 0x00, 0x00, 0x00, 0x16};
653
654		/* PAS106 uses different regs (and has split green gains) */
655		if (sd->sensor == SENSOR_PAS106) {
656			i2cpgain[2] = 0x0e;
657			i2cpcolorgain[0] = 0xd0;
658			i2cpcolorgain[2] = 0x09;
659			i2cpdoit[2] = 0x13;
660		}
661
662		i2cpgain[3] = gain;
663		i2cpcolorgain[3] = gain >> 1;
664		i2cpcolorgain[4] = gain >> 1;
665		i2cpcolorgain[5] = gain >> 1;
666		i2cpcolorgain[6] = gain >> 1;
667
668		i2c_w(gspca_dev, i2cpgain);
669		i2c_w(gspca_dev, i2cpcolorgain);
670		i2c_w(gspca_dev, i2cpdoit);
671		break;
672	}
673	default:
674		if (sd->bridge == BRIDGE_103) {
675			u8 buf[3] = { gain, gain, gain }; /* R, G, B */
676			reg_w(gspca_dev, 0x05, buf, 3);
677		} else {
678			u8 buf[2];
679			buf[0] = gain << 4 | gain; /* Red and blue */
680			buf[1] = gain; /* Green */
681			reg_w(gspca_dev, 0x10, buf, 2);
682		}
683	}
684}
685
686static void setexposure(struct gspca_dev *gspca_dev)
687{
688	struct sd *sd = (struct sd *) gspca_dev;
689
690	switch (sd->sensor) {
691	case SENSOR_HV7131D: {
692		/* Note the datasheet wrongly says line mode exposure uses reg
693		   0x26 and 0x27, testing has shown 0x25 + 0x26 */
694		__u8 i2c[] = {0xc0, 0x11, 0x25, 0x00, 0x00, 0x00, 0x00, 0x17};
695		u16 reg = gspca_dev->exposure->val;
696
697		i2c[3] = reg >> 8;
698		i2c[4] = reg & 0xff;
699		i2c_w(gspca_dev, i2c);
700		break;
701	}
702	case SENSOR_TAS5110C:
703	case SENSOR_TAS5110D: {
704		/* register 19's high nibble contains the sn9c10x clock divider
705		   The high nibble configures the no fps according to the
706		   formula: 60 / high_nibble. With a maximum of 30 fps */
707		u8 reg = gspca_dev->exposure->val;
708
709		reg = (reg << 4) | 0x0b;
710		reg_w(gspca_dev, 0x19, &reg, 1);
711		break;
712	}
713	case SENSOR_OV6650:
714	case SENSOR_OV7630: {
715		/* The ov6650 / ov7630 have 2 registers which both influence
716		   exposure, register 11, whose low nibble sets the nr off fps
717		   according to: fps = 30 / (low_nibble + 1)
718
719		   The fps configures the maximum exposure setting, but it is
720		   possible to use less exposure then what the fps maximum
721		   allows by setting register 10. register 10 configures the
722		   actual exposure as quotient of the full exposure, with 0
723		   being no exposure at all (not very useful) and reg10_max
724		   being max exposure possible at that framerate.
725
726		   The code maps our 0 - 510 ms exposure ctrl to these 2
727		   registers, trying to keep fps as high as possible.
728		*/
729		__u8 i2c[] = {0xb0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10};
730		int reg10, reg11, reg10_max;
731
732		/* ov6645 datasheet says reg10_max is 9a, but that uses
733		   tline * 2 * reg10 as formula for calculating texpo, the
734		   ov6650 probably uses the same formula as the 7730 which uses
735		   tline * 4 * reg10, which explains why the reg10max we've
736		   found experimentally for the ov6650 is exactly half that of
737		   the ov6645. The ov7630 datasheet says the max is 0x41. */
738		if (sd->sensor == SENSOR_OV6650) {
739			reg10_max = 0x4d;
740			i2c[4] = 0xc0; /* OV6650 needs non default vsync pol */
741		} else
742			reg10_max = 0x41;
743
744		reg11 = (15 * gspca_dev->exposure->val + 999) / 1000;
745		if (reg11 < 1)
746			reg11 = 1;
747		else if (reg11 > 16)
748			reg11 = 16;
749
750		/* In 640x480, if the reg11 has less than 4, the image is
751		   unstable (the bridge goes into a higher compression mode
752		   which we have not reverse engineered yet). */
753		if (gspca_dev->pixfmt.width == 640 && reg11 < 4)
754			reg11 = 4;
755
756		/* frame exposure time in ms = 1000 * reg11 / 30    ->
757		reg10 = (gspca_dev->exposure->val / 2) * reg10_max
758				/ (1000 * reg11 / 30) */
759		reg10 = (gspca_dev->exposure->val * 15 * reg10_max)
760				/ (1000 * reg11);
761
762		/* Don't allow this to get below 10 when using autogain, the
763		   steps become very large (relatively) when below 10 causing
764		   the image to oscilate from much too dark, to much too bright
765		   and back again. */
766		if (gspca_dev->autogain->val && reg10 < 10)
767			reg10 = 10;
768		else if (reg10 > reg10_max)
769			reg10 = reg10_max;
770
771		/* Write reg 10 and reg11 low nibble */
772		i2c[1] = sensor_data[sd->sensor].sensor_addr;
773		i2c[3] = reg10;
774		i2c[4] |= reg11 - 1;
775
776		/* If register 11 didn't change, don't change it */
777		if (sd->reg11 == reg11)
778			i2c[0] = 0xa0;
779
780		i2c_w(gspca_dev, i2c);
781		if (gspca_dev->usb_err == 0)
782			sd->reg11 = reg11;
783		break;
784	}
785	case SENSOR_PAS202: {
786		__u8 i2cpframerate[] =
787			{0xb0, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x16};
788		__u8 i2cpexpo[] =
789			{0xa0, 0x40, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x16};
790		const __u8 i2cpdoit[] =
791			{0xa0, 0x40, 0x11, 0x01, 0x00, 0x00, 0x00, 0x16};
792		int framerate_ctrl;
793
794		/* The exposure knee for the autogain algorithm is 200
795		   (100 ms / 10 fps on other sensors), for values below this
796		   use the control for setting the partial frame expose time,
797		   above that use variable framerate. This way we run at max
798		   framerate (640x480@7.5 fps, 320x240@10fps) until the knee
799		   is reached. Using the variable framerate control above 200
800		   is better then playing around with both clockdiv + partial
801		   frame exposure times (like we are doing with the ov chips),
802		   as that sometimes leads to jumps in the exposure control,
803		   which are bad for auto exposure. */
804		if (gspca_dev->exposure->val < 200) {
805			i2cpexpo[3] = 255 - (gspca_dev->exposure->val * 255)
806						/ 200;
807			framerate_ctrl = 500;
808		} else {
809			/* The PAS202's exposure control goes from 0 - 4095,
810			   but anything below 500 causes vsync issues, so scale
811			   our 200-1023 to 500-4095 */
812			framerate_ctrl = (gspca_dev->exposure->val - 200)
813							* 1000 / 229 +  500;
814		}
815
816		i2cpframerate[3] = framerate_ctrl >> 6;
817		i2cpframerate[4] = framerate_ctrl & 0x3f;
818		i2c_w(gspca_dev, i2cpframerate);
819		i2c_w(gspca_dev, i2cpexpo);
820		i2c_w(gspca_dev, i2cpdoit);
821		break;
822	}
823	case SENSOR_PAS106: {
824		__u8 i2cpframerate[] =
825			{0xb1, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x14};
826		__u8 i2cpexpo[] =
827			{0xa1, 0x40, 0x05, 0x00, 0x00, 0x00, 0x00, 0x14};
828		const __u8 i2cpdoit[] =
829			{0xa1, 0x40, 0x13, 0x01, 0x00, 0x00, 0x00, 0x14};
830		int framerate_ctrl;
831
832		/* For values below 150 use partial frame exposure, above
833		   that use framerate ctrl */
834		if (gspca_dev->exposure->val < 150) {
835			i2cpexpo[3] = 150 - gspca_dev->exposure->val;
836			framerate_ctrl = 300;
837		} else {
838			/* The PAS106's exposure control goes from 0 - 4095,
839			   but anything below 300 causes vsync issues, so scale
840			   our 150-1023 to 300-4095 */
841			framerate_ctrl = (gspca_dev->exposure->val - 150)
842						* 1000 / 230 + 300;
843		}
844
845		i2cpframerate[3] = framerate_ctrl >> 4;
846		i2cpframerate[4] = framerate_ctrl & 0x0f;
847		i2c_w(gspca_dev, i2cpframerate);
848		i2c_w(gspca_dev, i2cpexpo);
849		i2c_w(gspca_dev, i2cpdoit);
850		break;
851	}
852	default:
853		break;
854	}
855}
856
857static void setfreq(struct gspca_dev *gspca_dev)
858{
859	struct sd *sd = (struct sd *) gspca_dev;
860
861	if (sd->sensor == SENSOR_OV6650 || sd->sensor == SENSOR_OV7630) {
862		/* Framerate adjust register for artificial light 50 hz flicker
863		   compensation, for the ov6650 this is identical to ov6630
864		   0x2b register, see ov6630 datasheet.
865		   0x4f / 0x8a -> (30 fps -> 25 fps), 0x00 -> no adjustment */
866		__u8 i2c[] = {0xa0, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x10};
867		switch (sd->plfreq->val) {
868		default:
869/*		case 0:			 * no filter*/
870/*		case 2:			 * 60 hz */
871			i2c[3] = 0;
872			break;
873		case 1:			/* 50 hz */
874			i2c[3] = (sd->sensor == SENSOR_OV6650)
875					? 0x4f : 0x8a;
876			break;
877		}
878		i2c[1] = sensor_data[sd->sensor].sensor_addr;
879		i2c_w(gspca_dev, i2c);
880	}
881}
882
883static void do_autogain(struct gspca_dev *gspca_dev)
884{
885	struct sd *sd = (struct sd *) gspca_dev;
886	int deadzone, desired_avg_lum, avg_lum;
887
888	avg_lum = atomic_read(&sd->avg_lum);
889	if (avg_lum == -1)
890		return;
891
892	if (sd->autogain_ignore_frames > 0) {
893		sd->autogain_ignore_frames--;
894		return;
895	}
896
897	/* SIF / VGA sensors have a different autoexposure area and thus
898	   different avg_lum values for the same picture brightness */
899	if (sensor_data[sd->sensor].flags & F_SIF) {
900		deadzone = 500;
901		/* SIF sensors tend to overexpose, so keep this small */
902		desired_avg_lum = 5000;
903	} else {
904		deadzone = 1500;
905		desired_avg_lum = 13000;
906	}
907
908	if (sd->brightness)
909		desired_avg_lum = sd->brightness->val * desired_avg_lum / 127;
910
911	if (gspca_dev->exposure->maximum < 500) {
912		if (gspca_coarse_grained_expo_autogain(gspca_dev, avg_lum,
913				desired_avg_lum, deadzone))
914			sd->autogain_ignore_frames = AUTOGAIN_IGNORE_FRAMES;
915	} else {
916		int gain_knee = (s32)gspca_dev->gain->maximum * 9 / 10;
917		if (gspca_expo_autogain(gspca_dev, avg_lum, desired_avg_lum,
918				deadzone, gain_knee, sd->exposure_knee))
919			sd->autogain_ignore_frames = AUTOGAIN_IGNORE_FRAMES;
920	}
921}
922
923/* this function is called at probe time */
924static int sd_config(struct gspca_dev *gspca_dev,
925			const struct usb_device_id *id)
926{
927	struct sd *sd = (struct sd *) gspca_dev;
928	struct cam *cam;
929
930	reg_r(gspca_dev, 0x00);
931	if (gspca_dev->usb_buf[0] != 0x10)
932		return -ENODEV;
933
934	/* copy the webcam info from the device id */
935	sd->sensor = id->driver_info >> 8;
936	sd->bridge = id->driver_info & 0xff;
937
938	cam = &gspca_dev->cam;
939	if (!(sensor_data[sd->sensor].flags & F_SIF)) {
940		cam->cam_mode = vga_mode;
941		cam->nmodes = ARRAY_SIZE(vga_mode);
942	} else {
943		cam->cam_mode = sif_mode;
944		cam->nmodes = ARRAY_SIZE(sif_mode);
945	}
946	cam->npkt = 36;			/* 36 packets per ISOC message */
947
948	return 0;
949}
950
951/* this function is called at probe and resume time */
952static int sd_init(struct gspca_dev *gspca_dev)
953{
954	const __u8 stop = 0x09; /* Disable stream turn of LED */
955
956	reg_w(gspca_dev, 0x01, &stop, 1);
957
958	return gspca_dev->usb_err;
959}
960
961static int sd_s_ctrl(struct v4l2_ctrl *ctrl)
962{
963	struct gspca_dev *gspca_dev =
964		container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
965	struct sd *sd = (struct sd *)gspca_dev;
966
967	gspca_dev->usb_err = 0;
968
969	if (ctrl->id == V4L2_CID_AUTOGAIN && ctrl->is_new && ctrl->val) {
970		/* when switching to autogain set defaults to make sure
971		   we are on a valid point of the autogain gain /
972		   exposure knee graph, and give this change time to
973		   take effect before doing autogain. */
974		gspca_dev->gain->val = gspca_dev->gain->default_value;
975		gspca_dev->exposure->val = gspca_dev->exposure->default_value;
976		sd->autogain_ignore_frames = AUTOGAIN_IGNORE_FRAMES;
977	}
978
979	if (!gspca_dev->streaming)
980		return 0;
981
982	switch (ctrl->id) {
983	case V4L2_CID_BRIGHTNESS:
984		setbrightness(gspca_dev);
985		break;
986	case V4L2_CID_AUTOGAIN:
987		if (gspca_dev->exposure->is_new || (ctrl->is_new && ctrl->val))
988			setexposure(gspca_dev);
989		if (gspca_dev->gain->is_new || (ctrl->is_new && ctrl->val))
990			setgain(gspca_dev);
991		break;
992	case V4L2_CID_POWER_LINE_FREQUENCY:
993		setfreq(gspca_dev);
994		break;
995	default:
996		return -EINVAL;
997	}
998	return gspca_dev->usb_err;
999}
1000
1001static const struct v4l2_ctrl_ops sd_ctrl_ops = {
1002	.s_ctrl = sd_s_ctrl,
1003};
1004
1005/* this function is called at probe time */
1006static int sd_init_controls(struct gspca_dev *gspca_dev)
1007{
1008	struct sd *sd = (struct sd *) gspca_dev;
1009	struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler;
1010
1011	gspca_dev->vdev.ctrl_handler = hdl;
1012	v4l2_ctrl_handler_init(hdl, 5);
1013
1014	if (sd->sensor == SENSOR_OV6650 || sd->sensor == SENSOR_OV7630 ||
1015	    sd->sensor == SENSOR_PAS106 || sd->sensor == SENSOR_PAS202)
1016		sd->brightness = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1017					V4L2_CID_BRIGHTNESS, 0, 255, 1, 127);
1018
1019	/* Gain range is sensor dependent */
1020	switch (sd->sensor) {
1021	case SENSOR_OV6650:
1022	case SENSOR_PAS106:
1023	case SENSOR_PAS202:
1024		gspca_dev->gain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1025					V4L2_CID_GAIN, 0, 31, 1, 15);
1026		break;
1027	case SENSOR_OV7630:
1028		gspca_dev->gain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1029					V4L2_CID_GAIN, 0, 47, 1, 31);
1030		break;
1031	case SENSOR_HV7131D:
1032		gspca_dev->gain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1033					V4L2_CID_GAIN, 0, 63, 1, 31);
1034		break;
1035	case SENSOR_TAS5110C:
1036	case SENSOR_TAS5110D:
1037	case SENSOR_TAS5130CXX:
1038		gspca_dev->gain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1039					V4L2_CID_GAIN, 0, 255, 1, 127);
1040		break;
1041	default:
1042		if (sd->bridge == BRIDGE_103) {
1043			gspca_dev->gain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1044						V4L2_CID_GAIN, 0, 127, 1, 63);
1045		} else {
1046			gspca_dev->gain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1047						V4L2_CID_GAIN, 0, 15, 1, 7);
1048		}
1049	}
1050
1051	/* Exposure range is sensor dependent, and not all have exposure */
1052	switch (sd->sensor) {
1053	case SENSOR_HV7131D:
1054		gspca_dev->exposure = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1055					V4L2_CID_EXPOSURE, 0, 8191, 1, 482);
1056		sd->exposure_knee = 964;
1057		break;
1058	case SENSOR_OV6650:
1059	case SENSOR_OV7630:
1060	case SENSOR_PAS106:
1061	case SENSOR_PAS202:
1062		gspca_dev->exposure = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1063					V4L2_CID_EXPOSURE, 0, 1023, 1, 66);
1064		sd->exposure_knee = 200;
1065		break;
1066	case SENSOR_TAS5110C:
1067	case SENSOR_TAS5110D:
1068		gspca_dev->exposure = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1069					V4L2_CID_EXPOSURE, 2, 15, 1, 2);
1070		break;
1071	}
1072
1073	if (gspca_dev->exposure) {
1074		gspca_dev->autogain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1075						V4L2_CID_AUTOGAIN, 0, 1, 1, 1);
1076	}
1077
1078	if (sd->sensor == SENSOR_OV6650 || sd->sensor == SENSOR_OV7630)
1079		sd->plfreq = v4l2_ctrl_new_std_menu(hdl, &sd_ctrl_ops,
1080			V4L2_CID_POWER_LINE_FREQUENCY,
1081			V4L2_CID_POWER_LINE_FREQUENCY_60HZ, 0,
1082			V4L2_CID_POWER_LINE_FREQUENCY_DISABLED);
1083
1084	if (hdl->error) {
1085		pr_err("Could not initialize controls\n");
1086		return hdl->error;
1087	}
1088
1089	if (gspca_dev->autogain)
1090		v4l2_ctrl_auto_cluster(3, &gspca_dev->autogain, 0, false);
1091
1092	return 0;
1093}
1094
1095/* -- start the camera -- */
1096static int sd_start(struct gspca_dev *gspca_dev)
1097{
1098	struct sd *sd = (struct sd *) gspca_dev;
1099	struct cam *cam = &gspca_dev->cam;
1100	int i, mode;
1101	__u8 regs[0x31];
1102
1103	mode = cam->cam_mode[gspca_dev->curr_mode].priv & 0x07;
1104	/* Copy registers 0x01 - 0x19 from the template */
1105	memcpy(&regs[0x01], sensor_data[sd->sensor].bridge_init, 0x19);
1106	/* Set the mode */
1107	regs[0x18] |= mode << 4;
1108
1109	/* Set bridge gain to 1.0 */
1110	if (sd->bridge == BRIDGE_103) {
1111		regs[0x05] = 0x20; /* Red */
1112		regs[0x06] = 0x20; /* Green */
1113		regs[0x07] = 0x20; /* Blue */
1114	} else {
1115		regs[0x10] = 0x00; /* Red and blue */
1116		regs[0x11] = 0x00; /* Green */
1117	}
1118
1119	/* Setup pixel numbers and auto exposure window */
1120	if (sensor_data[sd->sensor].flags & F_SIF) {
1121		regs[0x1a] = 0x14; /* HO_SIZE 640, makes no sense */
1122		regs[0x1b] = 0x0a; /* VO_SIZE 320, makes no sense */
1123		regs[0x1c] = 0x02; /* AE H-start 64 */
1124		regs[0x1d] = 0x02; /* AE V-start 64 */
1125		regs[0x1e] = 0x09; /* AE H-end 288 */
1126		regs[0x1f] = 0x07; /* AE V-end 224 */
1127	} else {
1128		regs[0x1a] = 0x1d; /* HO_SIZE 960, makes no sense */
1129		regs[0x1b] = 0x10; /* VO_SIZE 512, makes no sense */
1130		regs[0x1c] = 0x05; /* AE H-start 160 */
1131		regs[0x1d] = 0x03; /* AE V-start 96 */
1132		regs[0x1e] = 0x0f; /* AE H-end 480 */
1133		regs[0x1f] = 0x0c; /* AE V-end 384 */
1134	}
1135
1136	/* Setup the gamma table (only used with the sn9c103 bridge) */
1137	for (i = 0; i < 16; i++)
1138		regs[0x20 + i] = i * 16;
1139	regs[0x20 + i] = 255;
1140
1141	/* Special cases where some regs depend on mode or bridge */
1142	switch (sd->sensor) {
1143	case SENSOR_TAS5130CXX:
1144		/* FIXME / TESTME
1145		   probably not mode specific at all most likely the upper
1146		   nibble of 0x19 is exposure (clock divider) just as with
1147		   the tas5110, we need someone to test this. */
1148		regs[0x19] = mode ? 0x23 : 0x43;
1149		break;
1150	case SENSOR_OV7630:
1151		/* FIXME / TESTME for some reason with the 101/102 bridge the
1152		   clock is set to 12 Mhz (reg1 == 0x04), rather then 24.
1153		   Also the hstart needs to go from 1 to 2 when using a 103,
1154		   which is likely related. This does not seem right. */
1155		if (sd->bridge == BRIDGE_103) {
1156			regs[0x01] = 0x44; /* Select 24 Mhz clock */
1157			regs[0x12] = 0x02; /* Set hstart to 2 */
1158		}
1159		break;
1160	case SENSOR_PAS202:
1161		/* For some unknown reason we need to increase hstart by 1 on
1162		   the sn9c103, otherwise we get wrong colors (bayer shift). */
1163		if (sd->bridge == BRIDGE_103)
1164			regs[0x12] += 1;
1165		break;
1166	}
1167	/* Disable compression when the raw bayer format has been selected */
1168	if (cam->cam_mode[gspca_dev->curr_mode].priv & MODE_RAW)
1169		regs[0x18] &= ~0x80;
1170
1171	/* Vga mode emulation on SIF sensor? */
1172	if (cam->cam_mode[gspca_dev->curr_mode].priv & MODE_REDUCED_SIF) {
1173		regs[0x12] += 16;	/* hstart adjust */
1174		regs[0x13] += 24;	/* vstart adjust */
1175		regs[0x15]  = 320 / 16; /* hsize */
1176		regs[0x16]  = 240 / 16; /* vsize */
1177	}
1178
1179	/* reg 0x01 bit 2 video transfert on */
1180	reg_w(gspca_dev, 0x01, &regs[0x01], 1);
1181	/* reg 0x17 SensorClk enable inv Clk 0x60 */
1182	reg_w(gspca_dev, 0x17, &regs[0x17], 1);
1183	/* Set the registers from the template */
1184	reg_w(gspca_dev, 0x01, &regs[0x01],
1185	      (sd->bridge == BRIDGE_103) ? 0x30 : 0x1f);
1186
1187	/* Init the sensor */
1188	i2c_w_vector(gspca_dev, sensor_data[sd->sensor].sensor_init,
1189			sensor_data[sd->sensor].sensor_init_size);
1190
1191	/* Mode / bridge specific sensor setup */
1192	switch (sd->sensor) {
1193	case SENSOR_PAS202: {
1194		const __u8 i2cpclockdiv[] =
1195			{0xa0, 0x40, 0x02, 0x03, 0x00, 0x00, 0x00, 0x10};
1196		/* clockdiv from 4 to 3 (7.5 -> 10 fps) when in low res mode */
1197		if (mode)
1198			i2c_w(gspca_dev, i2cpclockdiv);
1199		break;
1200	    }
1201	case SENSOR_OV7630:
1202		/* FIXME / TESTME We should be able to handle this identical
1203		   for the 101/102 and the 103 case */
1204		if (sd->bridge == BRIDGE_103) {
1205			const __u8 i2c[] = { 0xa0, 0x21, 0x13,
1206					     0x80, 0x00, 0x00, 0x00, 0x10 };
1207			i2c_w(gspca_dev, i2c);
1208		}
1209		break;
1210	}
1211	/* H_size V_size 0x28, 0x1e -> 640x480. 0x16, 0x12 -> 352x288 */
1212	reg_w(gspca_dev, 0x15, &regs[0x15], 2);
1213	/* compression register */
1214	reg_w(gspca_dev, 0x18, &regs[0x18], 1);
1215	/* H_start */
1216	reg_w(gspca_dev, 0x12, &regs[0x12], 1);
1217	/* V_START */
1218	reg_w(gspca_dev, 0x13, &regs[0x13], 1);
1219	/* reset 0x17 SensorClk enable inv Clk 0x60 */
1220				/*fixme: ov7630 [17]=68 8f (+20 if 102)*/
1221	reg_w(gspca_dev, 0x17, &regs[0x17], 1);
1222	/*MCKSIZE ->3 */	/*fixme: not ov7630*/
1223	reg_w(gspca_dev, 0x19, &regs[0x19], 1);
1224	/* AE_STRX AE_STRY AE_ENDX AE_ENDY */
1225	reg_w(gspca_dev, 0x1c, &regs[0x1c], 4);
1226	/* Enable video transfert */
1227	reg_w(gspca_dev, 0x01, &regs[0x01], 1);
1228	/* Compression */
1229	reg_w(gspca_dev, 0x18, &regs[0x18], 2);
1230	msleep(20);
1231
1232	sd->reg11 = -1;
1233
1234	setgain(gspca_dev);
1235	setbrightness(gspca_dev);
1236	setexposure(gspca_dev);
1237	setfreq(gspca_dev);
1238
1239	sd->frames_to_drop = 0;
1240	sd->autogain_ignore_frames = 0;
1241	gspca_dev->exp_too_high_cnt = 0;
1242	gspca_dev->exp_too_low_cnt = 0;
1243	atomic_set(&sd->avg_lum, -1);
1244	return gspca_dev->usb_err;
1245}
1246
1247static void sd_stopN(struct gspca_dev *gspca_dev)
1248{
1249	sd_init(gspca_dev);
1250}
1251
1252static u8* find_sof(struct gspca_dev *gspca_dev, u8 *data, int len)
1253{
1254	struct sd *sd = (struct sd *) gspca_dev;
1255	int i, header_size = (sd->bridge == BRIDGE_103) ? 18 : 12;
1256
1257	/* frames start with:
1258	 *	ff ff 00 c4 c4 96	synchro
1259	 *	00		(unknown)
1260	 *	xx		(frame sequence / size / compression)
1261	 *	(xx)		(idem - extra byte for sn9c103)
1262	 *	ll mm		brightness sum inside auto exposure
1263	 *	ll mm		brightness sum outside auto exposure
1264	 *	(xx xx xx xx xx)	audio values for snc103
1265	 */
1266	for (i = 0; i < len; i++) {
1267		switch (sd->header_read) {
1268		case 0:
1269			if (data[i] == 0xff)
1270				sd->header_read++;
1271			break;
1272		case 1:
1273			if (data[i] == 0xff)
1274				sd->header_read++;
1275			else
1276				sd->header_read = 0;
1277			break;
1278		case 2:
1279			if (data[i] == 0x00)
1280				sd->header_read++;
1281			else if (data[i] != 0xff)
1282				sd->header_read = 0;
1283			break;
1284		case 3:
1285			if (data[i] == 0xc4)
1286				sd->header_read++;
1287			else if (data[i] == 0xff)
1288				sd->header_read = 1;
1289			else
1290				sd->header_read = 0;
1291			break;
1292		case 4:
1293			if (data[i] == 0xc4)
1294				sd->header_read++;
1295			else if (data[i] == 0xff)
1296				sd->header_read = 1;
1297			else
1298				sd->header_read = 0;
1299			break;
1300		case 5:
1301			if (data[i] == 0x96)
1302				sd->header_read++;
1303			else if (data[i] == 0xff)
1304				sd->header_read = 1;
1305			else
1306				sd->header_read = 0;
1307			break;
1308		default:
1309			sd->header[sd->header_read - 6] = data[i];
1310			sd->header_read++;
1311			if (sd->header_read == header_size) {
1312				sd->header_read = 0;
1313				return data + i + 1;
1314			}
1315		}
1316	}
1317	return NULL;
1318}
1319
1320static void sd_pkt_scan(struct gspca_dev *gspca_dev,
1321			u8 *data,			/* isoc packet */
1322			int len)			/* iso packet length */
1323{
1324	int fr_h_sz = 0, lum_offset = 0, len_after_sof = 0;
1325	struct sd *sd = (struct sd *) gspca_dev;
1326	struct cam *cam = &gspca_dev->cam;
1327	u8 *sof;
1328
1329	sof = find_sof(gspca_dev, data, len);
1330	if (sof) {
1331		if (sd->bridge == BRIDGE_103) {
1332			fr_h_sz = 18;
1333			lum_offset = 3;
1334		} else {
1335			fr_h_sz = 12;
1336			lum_offset = 2;
1337		}
1338
1339		len_after_sof = len - (sof - data);
1340		len = (sof - data) - fr_h_sz;
1341		if (len < 0)
1342			len = 0;
1343	}
1344
1345	if (cam->cam_mode[gspca_dev->curr_mode].priv & MODE_RAW) {
1346		/* In raw mode we sometimes get some garbage after the frame
1347		   ignore this */
1348		int used;
1349		int size = cam->cam_mode[gspca_dev->curr_mode].sizeimage;
1350
1351		used = gspca_dev->image_len;
1352		if (used + len > size)
1353			len = size - used;
1354	}
1355
1356	gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
1357
1358	if (sof) {
1359		int  lum = sd->header[lum_offset] +
1360			  (sd->header[lum_offset + 1] << 8);
1361
1362		/* When exposure changes midway a frame we
1363		   get a lum of 0 in this case drop 2 frames
1364		   as the frames directly after an exposure
1365		   change have an unstable image. Sometimes lum
1366		   *really* is 0 (cam used in low light with
1367		   low exposure setting), so do not drop frames
1368		   if the previous lum was 0 too. */
1369		if (lum == 0 && sd->prev_avg_lum != 0) {
1370			lum = -1;
1371			sd->frames_to_drop = 2;
1372			sd->prev_avg_lum = 0;
1373		} else
1374			sd->prev_avg_lum = lum;
1375		atomic_set(&sd->avg_lum, lum);
1376
1377		if (sd->frames_to_drop)
1378			sd->frames_to_drop--;
1379		else
1380			gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
1381
1382		gspca_frame_add(gspca_dev, FIRST_PACKET, sof, len_after_sof);
1383	}
1384}
1385
1386#if IS_ENABLED(CONFIG_INPUT)
1387static int sd_int_pkt_scan(struct gspca_dev *gspca_dev,
1388			u8 *data,		/* interrupt packet data */
1389			int len)		/* interrupt packet length */
1390{
1391	int ret = -EINVAL;
1392
1393	if (len == 1 && data[0] == 1) {
1394		input_report_key(gspca_dev->input_dev, KEY_CAMERA, 1);
1395		input_sync(gspca_dev->input_dev);
1396		input_report_key(gspca_dev->input_dev, KEY_CAMERA, 0);
1397		input_sync(gspca_dev->input_dev);
1398		ret = 0;
1399	}
1400
1401	return ret;
1402}
1403#endif
1404
1405/* sub-driver description */
1406static const struct sd_desc sd_desc = {
1407	.name = MODULE_NAME,
1408	.config = sd_config,
1409	.init = sd_init,
1410	.init_controls = sd_init_controls,
1411	.start = sd_start,
1412	.stopN = sd_stopN,
1413	.pkt_scan = sd_pkt_scan,
1414	.dq_callback = do_autogain,
1415#if IS_ENABLED(CONFIG_INPUT)
1416	.int_pkt_scan = sd_int_pkt_scan,
1417#endif
1418};
1419
1420/* -- module initialisation -- */
1421#define SB(sensor, bridge) \
1422	.driver_info = (SENSOR_ ## sensor << 8) | BRIDGE_ ## bridge
1423
1424
1425static const struct usb_device_id device_table[] = {
1426	{USB_DEVICE(0x0c45, 0x6001), SB(TAS5110C, 102)}, /* TAS5110C1B */
1427	{USB_DEVICE(0x0c45, 0x6005), SB(TAS5110C, 101)}, /* TAS5110C1B */
1428	{USB_DEVICE(0x0c45, 0x6007), SB(TAS5110D, 101)}, /* TAS5110D */
1429	{USB_DEVICE(0x0c45, 0x6009), SB(PAS106, 101)},
1430	{USB_DEVICE(0x0c45, 0x600d), SB(PAS106, 101)},
1431	{USB_DEVICE(0x0c45, 0x6011), SB(OV6650, 101)},
1432	{USB_DEVICE(0x0c45, 0x6019), SB(OV7630, 101)},
1433	{USB_DEVICE(0x0c45, 0x6024), SB(TAS5130CXX, 102)},
1434	{USB_DEVICE(0x0c45, 0x6025), SB(TAS5130CXX, 102)},
1435	{USB_DEVICE(0x0c45, 0x6027), SB(OV7630, 101)}, /* Genius Eye 310 */
1436	{USB_DEVICE(0x0c45, 0x6028), SB(PAS202, 102)},
1437	{USB_DEVICE(0x0c45, 0x6029), SB(PAS106, 102)},
1438	{USB_DEVICE(0x0c45, 0x602a), SB(HV7131D, 102)},
1439	/* {USB_DEVICE(0x0c45, 0x602b), SB(MI0343, 102)}, */
1440	{USB_DEVICE(0x0c45, 0x602c), SB(OV7630, 102)},
1441	{USB_DEVICE(0x0c45, 0x602d), SB(HV7131R, 102)},
1442	{USB_DEVICE(0x0c45, 0x602e), SB(OV7630, 102)},
1443	/* {USB_DEVICE(0x0c45, 0x6030), SB(MI03XX, 102)}, */ /* MI0343 MI0360 MI0330 */
1444	/* {USB_DEVICE(0x0c45, 0x6082), SB(MI03XX, 103)}, */ /* MI0343 MI0360 */
1445	{USB_DEVICE(0x0c45, 0x6083), SB(HV7131D, 103)},
1446	{USB_DEVICE(0x0c45, 0x608c), SB(HV7131R, 103)},
1447	/* {USB_DEVICE(0x0c45, 0x608e), SB(CISVF10, 103)}, */
1448	{USB_DEVICE(0x0c45, 0x608f), SB(OV7630, 103)},
1449	{USB_DEVICE(0x0c45, 0x60a8), SB(PAS106, 103)},
1450	{USB_DEVICE(0x0c45, 0x60aa), SB(TAS5130CXX, 103)},
1451	{USB_DEVICE(0x0c45, 0x60af), SB(PAS202, 103)},
1452	{USB_DEVICE(0x0c45, 0x60b0), SB(OV7630, 103)},
1453	{}
1454};
1455MODULE_DEVICE_TABLE(usb, device_table);
1456
1457/* -- device connect -- */
1458static int sd_probe(struct usb_interface *intf,
1459			const struct usb_device_id *id)
1460{
1461	return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd),
1462				THIS_MODULE);
1463}
1464
1465static struct usb_driver sd_driver = {
1466	.name = MODULE_NAME,
1467	.id_table = device_table,
1468	.probe = sd_probe,
1469	.disconnect = gspca_disconnect,
1470#ifdef CONFIG_PM
1471	.suspend = gspca_suspend,
1472	.resume = gspca_resume,
1473	.reset_resume = gspca_resume,
1474#endif
1475};
1476
1477module_usb_driver(sd_driver);
1478