1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * OV519 driver
4 *
5 * Copyright (C) 2008-2011 Jean-Fran��ois Moine <moinejf@free.fr>
6 * Copyright (C) 2009 Hans de Goede <hdegoede@redhat.com>
7 *
8 * This module is adapted from the ov51x-jpeg package, which itself
9 * was adapted from the ov511 driver.
10 *
11 * Original copyright for the ov511 driver is:
12 *
13 * Copyright (c) 1999-2006 Mark W. McClelland
14 * Support for OV519, OV8610 Copyright (c) 2003 Joerg Heckenbach
15 * Many improvements by Bret Wallach <bwallac1@san.rr.com>
16 * Color fixes by by Orion Sky Lawlor <olawlor@acm.org> (2/26/2000)
17 * OV7620 fixes by Charl P. Botha <cpbotha@ieee.org>
18 * Changes by Claudio Matsuoka <claudio@conectiva.com>
19 *
20 * ov51x-jpeg original copyright is:
21 *
22 * Copyright (c) 2004-2007 Romain Beauxis <toots@rastageeks.org>
23 * Support for OV7670 sensors was contributed by Sam Skipsey <aoanla@yahoo.com>
24 */
25
26#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
27
28#define MODULE_NAME "ov519"
29
30#include <linux/input.h>
31#include "gspca.h"
32
33/* The jpeg_hdr is used by w996Xcf only */
34/* The CONEX_CAM define for jpeg.h needs renaming, now its used here too */
35#define CONEX_CAM
36#include "jpeg.h"
37
38MODULE_AUTHOR("Jean-Francois Moine <http://moinejf.free.fr>");
39MODULE_DESCRIPTION("OV519 USB Camera Driver");
40MODULE_LICENSE("GPL");
41
42/* global parameters */
43static int frame_rate;
44
45/* Number of times to retry a failed I2C transaction. Increase this if you
46 * are getting "Failed to read sensor ID..." */
47static int i2c_detect_tries = 10;
48
49/* ov519 device descriptor */
50struct sd {
51	struct gspca_dev gspca_dev;		/* !! must be the first item */
52
53	struct v4l2_ctrl *jpegqual;
54	struct v4l2_ctrl *freq;
55	struct { /* h/vflip control cluster */
56		struct v4l2_ctrl *hflip;
57		struct v4l2_ctrl *vflip;
58	};
59	struct { /* autobrightness/brightness control cluster */
60		struct v4l2_ctrl *autobright;
61		struct v4l2_ctrl *brightness;
62	};
63
64	u8 revision;
65
66	u8 packet_nr;
67
68	char bridge;
69#define BRIDGE_OV511		0
70#define BRIDGE_OV511PLUS	1
71#define BRIDGE_OV518		2
72#define BRIDGE_OV518PLUS	3
73#define BRIDGE_OV519		4		/* = ov530 */
74#define BRIDGE_OVFX2		5
75#define BRIDGE_W9968CF		6
76#define BRIDGE_MASK		7
77
78	char invert_led;
79#define BRIDGE_INVERT_LED	8
80
81	char snapshot_pressed;
82	char snapshot_needs_reset;
83
84	/* Determined by sensor type */
85	u8 sif;
86
87#define QUALITY_MIN 50
88#define QUALITY_MAX 70
89#define QUALITY_DEF 50
90
91	u8 stopped;		/* Streaming is temporarily paused */
92	u8 first_frame;
93
94	u8 frame_rate;		/* current Framerate */
95	u8 clockdiv;		/* clockdiv override */
96
97	s8 sensor;		/* Type of image sensor chip (SEN_*) */
98
99	u8 sensor_addr;
100	u16 sensor_width;
101	u16 sensor_height;
102	s16 sensor_reg_cache[256];
103
104	u8 jpeg_hdr[JPEG_HDR_SZ];
105};
106enum sensors {
107	SEN_OV2610,
108	SEN_OV2610AE,
109	SEN_OV3610,
110	SEN_OV6620,
111	SEN_OV6630,
112	SEN_OV66308AF,
113	SEN_OV7610,
114	SEN_OV7620,
115	SEN_OV7620AE,
116	SEN_OV7640,
117	SEN_OV7648,
118	SEN_OV7660,
119	SEN_OV7670,
120	SEN_OV76BE,
121	SEN_OV8610,
122	SEN_OV9600,
123};
124
125/* Note this is a bit of a hack, but the w9968cf driver needs the code for all
126   the ov sensors which is already present here. When we have the time we
127   really should move the sensor drivers to v4l2 sub drivers. */
128#include "w996Xcf.c"
129
130/* table of the disabled controls */
131struct ctrl_valid {
132	unsigned int has_brightness:1;
133	unsigned int has_contrast:1;
134	unsigned int has_exposure:1;
135	unsigned int has_autogain:1;
136	unsigned int has_sat:1;
137	unsigned int has_hvflip:1;
138	unsigned int has_autobright:1;
139	unsigned int has_freq:1;
140};
141
142static const struct ctrl_valid valid_controls[] = {
143	[SEN_OV2610] = {
144		.has_exposure = 1,
145		.has_autogain = 1,
146	},
147	[SEN_OV2610AE] = {
148		.has_exposure = 1,
149		.has_autogain = 1,
150	},
151	[SEN_OV3610] = {
152		/* No controls */
153	},
154	[SEN_OV6620] = {
155		.has_brightness = 1,
156		.has_contrast = 1,
157		.has_sat = 1,
158		.has_autobright = 1,
159		.has_freq = 1,
160	},
161	[SEN_OV6630] = {
162		.has_brightness = 1,
163		.has_contrast = 1,
164		.has_sat = 1,
165		.has_autobright = 1,
166		.has_freq = 1,
167	},
168	[SEN_OV66308AF] = {
169		.has_brightness = 1,
170		.has_contrast = 1,
171		.has_sat = 1,
172		.has_autobright = 1,
173		.has_freq = 1,
174	},
175	[SEN_OV7610] = {
176		.has_brightness = 1,
177		.has_contrast = 1,
178		.has_sat = 1,
179		.has_autobright = 1,
180		.has_freq = 1,
181	},
182	[SEN_OV7620] = {
183		.has_brightness = 1,
184		.has_contrast = 1,
185		.has_sat = 1,
186		.has_autobright = 1,
187		.has_freq = 1,
188	},
189	[SEN_OV7620AE] = {
190		.has_brightness = 1,
191		.has_contrast = 1,
192		.has_sat = 1,
193		.has_autobright = 1,
194		.has_freq = 1,
195	},
196	[SEN_OV7640] = {
197		.has_brightness = 1,
198		.has_sat = 1,
199		.has_freq = 1,
200	},
201	[SEN_OV7648] = {
202		.has_brightness = 1,
203		.has_sat = 1,
204		.has_freq = 1,
205	},
206	[SEN_OV7660] = {
207		.has_brightness = 1,
208		.has_contrast = 1,
209		.has_sat = 1,
210		.has_hvflip = 1,
211		.has_freq = 1,
212	},
213	[SEN_OV7670] = {
214		.has_brightness = 1,
215		.has_contrast = 1,
216		.has_hvflip = 1,
217		.has_freq = 1,
218	},
219	[SEN_OV76BE] = {
220		.has_brightness = 1,
221		.has_contrast = 1,
222		.has_sat = 1,
223		.has_autobright = 1,
224		.has_freq = 1,
225	},
226	[SEN_OV8610] = {
227		.has_brightness = 1,
228		.has_contrast = 1,
229		.has_sat = 1,
230		.has_autobright = 1,
231	},
232	[SEN_OV9600] = {
233		.has_exposure = 1,
234		.has_autogain = 1,
235	},
236};
237
238static const struct v4l2_pix_format ov519_vga_mode[] = {
239	{320, 240, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
240		.bytesperline = 320,
241		.sizeimage = 320 * 240 * 3 / 8 + 590,
242		.colorspace = V4L2_COLORSPACE_JPEG,
243		.priv = 1},
244	{640, 480, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
245		.bytesperline = 640,
246		.sizeimage = 640 * 480 * 3 / 8 + 590,
247		.colorspace = V4L2_COLORSPACE_JPEG,
248		.priv = 0},
249};
250static const struct v4l2_pix_format ov519_sif_mode[] = {
251	{160, 120, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
252		.bytesperline = 160,
253		.sizeimage = 160 * 120 * 3 / 8 + 590,
254		.colorspace = V4L2_COLORSPACE_JPEG,
255		.priv = 3},
256	{176, 144, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
257		.bytesperline = 176,
258		.sizeimage = 176 * 144 * 3 / 8 + 590,
259		.colorspace = V4L2_COLORSPACE_JPEG,
260		.priv = 1},
261	{320, 240, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
262		.bytesperline = 320,
263		.sizeimage = 320 * 240 * 3 / 8 + 590,
264		.colorspace = V4L2_COLORSPACE_JPEG,
265		.priv = 2},
266	{352, 288, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
267		.bytesperline = 352,
268		.sizeimage = 352 * 288 * 3 / 8 + 590,
269		.colorspace = V4L2_COLORSPACE_JPEG,
270		.priv = 0},
271};
272
273/* Note some of the sizeimage values for the ov511 / ov518 may seem
274   larger then necessary, however they need to be this big as the ov511 /
275   ov518 always fills the entire isoc frame, using 0 padding bytes when
276   it doesn't have any data. So with low framerates the amount of data
277   transferred can become quite large (libv4l will remove all the 0 padding
278   in userspace). */
279static const struct v4l2_pix_format ov518_vga_mode[] = {
280	{320, 240, V4L2_PIX_FMT_OV518, V4L2_FIELD_NONE,
281		.bytesperline = 320,
282		.sizeimage = 320 * 240 * 3,
283		.colorspace = V4L2_COLORSPACE_JPEG,
284		.priv = 1},
285	{640, 480, V4L2_PIX_FMT_OV518, V4L2_FIELD_NONE,
286		.bytesperline = 640,
287		.sizeimage = 640 * 480 * 2,
288		.colorspace = V4L2_COLORSPACE_JPEG,
289		.priv = 0},
290};
291static const struct v4l2_pix_format ov518_sif_mode[] = {
292	{160, 120, V4L2_PIX_FMT_OV518, V4L2_FIELD_NONE,
293		.bytesperline = 160,
294		.sizeimage = 70000,
295		.colorspace = V4L2_COLORSPACE_JPEG,
296		.priv = 3},
297	{176, 144, V4L2_PIX_FMT_OV518, V4L2_FIELD_NONE,
298		.bytesperline = 176,
299		.sizeimage = 70000,
300		.colorspace = V4L2_COLORSPACE_JPEG,
301		.priv = 1},
302	{320, 240, V4L2_PIX_FMT_OV518, V4L2_FIELD_NONE,
303		.bytesperline = 320,
304		.sizeimage = 320 * 240 * 3,
305		.colorspace = V4L2_COLORSPACE_JPEG,
306		.priv = 2},
307	{352, 288, V4L2_PIX_FMT_OV518, V4L2_FIELD_NONE,
308		.bytesperline = 352,
309		.sizeimage = 352 * 288 * 3,
310		.colorspace = V4L2_COLORSPACE_JPEG,
311		.priv = 0},
312};
313
314static const struct v4l2_pix_format ov511_vga_mode[] = {
315	{320, 240, V4L2_PIX_FMT_OV511, V4L2_FIELD_NONE,
316		.bytesperline = 320,
317		.sizeimage = 320 * 240 * 3,
318		.colorspace = V4L2_COLORSPACE_JPEG,
319		.priv = 1},
320	{640, 480, V4L2_PIX_FMT_OV511, V4L2_FIELD_NONE,
321		.bytesperline = 640,
322		.sizeimage = 640 * 480 * 2,
323		.colorspace = V4L2_COLORSPACE_JPEG,
324		.priv = 0},
325};
326static const struct v4l2_pix_format ov511_sif_mode[] = {
327	{160, 120, V4L2_PIX_FMT_OV511, V4L2_FIELD_NONE,
328		.bytesperline = 160,
329		.sizeimage = 70000,
330		.colorspace = V4L2_COLORSPACE_JPEG,
331		.priv = 3},
332	{176, 144, V4L2_PIX_FMT_OV511, V4L2_FIELD_NONE,
333		.bytesperline = 176,
334		.sizeimage = 70000,
335		.colorspace = V4L2_COLORSPACE_JPEG,
336		.priv = 1},
337	{320, 240, V4L2_PIX_FMT_OV511, V4L2_FIELD_NONE,
338		.bytesperline = 320,
339		.sizeimage = 320 * 240 * 3,
340		.colorspace = V4L2_COLORSPACE_JPEG,
341		.priv = 2},
342	{352, 288, V4L2_PIX_FMT_OV511, V4L2_FIELD_NONE,
343		.bytesperline = 352,
344		.sizeimage = 352 * 288 * 3,
345		.colorspace = V4L2_COLORSPACE_JPEG,
346		.priv = 0},
347};
348
349static const struct v4l2_pix_format ovfx2_ov2610_mode[] = {
350	{800, 600, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
351		.bytesperline = 800,
352		.sizeimage = 800 * 600,
353		.colorspace = V4L2_COLORSPACE_SRGB,
354		.priv = 1},
355	{1600, 1200, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
356		.bytesperline = 1600,
357		.sizeimage = 1600 * 1200,
358		.colorspace = V4L2_COLORSPACE_SRGB},
359};
360static const struct v4l2_pix_format ovfx2_ov3610_mode[] = {
361	{640, 480, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
362		.bytesperline = 640,
363		.sizeimage = 640 * 480,
364		.colorspace = V4L2_COLORSPACE_SRGB,
365		.priv = 1},
366	{800, 600, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
367		.bytesperline = 800,
368		.sizeimage = 800 * 600,
369		.colorspace = V4L2_COLORSPACE_SRGB,
370		.priv = 1},
371	{1024, 768, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
372		.bytesperline = 1024,
373		.sizeimage = 1024 * 768,
374		.colorspace = V4L2_COLORSPACE_SRGB,
375		.priv = 1},
376	{1600, 1200, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
377		.bytesperline = 1600,
378		.sizeimage = 1600 * 1200,
379		.colorspace = V4L2_COLORSPACE_SRGB,
380		.priv = 0},
381	{2048, 1536, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
382		.bytesperline = 2048,
383		.sizeimage = 2048 * 1536,
384		.colorspace = V4L2_COLORSPACE_SRGB,
385		.priv = 0},
386};
387static const struct v4l2_pix_format ovfx2_ov9600_mode[] = {
388	{640, 480, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
389		.bytesperline = 640,
390		.sizeimage = 640 * 480,
391		.colorspace = V4L2_COLORSPACE_SRGB,
392		.priv = 1},
393	{1280, 1024, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
394		.bytesperline = 1280,
395		.sizeimage = 1280 * 1024,
396		.colorspace = V4L2_COLORSPACE_SRGB},
397};
398
399/* Registers common to OV511 / OV518 */
400#define R51x_FIFO_PSIZE			0x30	/* 2 bytes wide w/ OV518(+) */
401#define R51x_SYS_RESET			0x50
402	/* Reset type flags */
403	#define	OV511_RESET_OMNICE	0x08
404#define R51x_SYS_INIT			0x53
405#define R51x_SYS_SNAP			0x52
406#define R51x_SYS_CUST_ID		0x5f
407#define R51x_COMP_LUT_BEGIN		0x80
408
409/* OV511 Camera interface register numbers */
410#define R511_CAM_DELAY			0x10
411#define R511_CAM_EDGE			0x11
412#define R511_CAM_PXCNT			0x12
413#define R511_CAM_LNCNT			0x13
414#define R511_CAM_PXDIV			0x14
415#define R511_CAM_LNDIV			0x15
416#define R511_CAM_UV_EN			0x16
417#define R511_CAM_LINE_MODE		0x17
418#define R511_CAM_OPTS			0x18
419
420#define R511_SNAP_FRAME			0x19
421#define R511_SNAP_PXCNT			0x1a
422#define R511_SNAP_LNCNT			0x1b
423#define R511_SNAP_PXDIV			0x1c
424#define R511_SNAP_LNDIV			0x1d
425#define R511_SNAP_UV_EN			0x1e
426#define R511_SNAP_OPTS			0x1f
427
428#define R511_DRAM_FLOW_CTL		0x20
429#define R511_FIFO_OPTS			0x31
430#define R511_I2C_CTL			0x40
431#define R511_SYS_LED_CTL		0x55	/* OV511+ only */
432#define R511_COMP_EN			0x78
433#define R511_COMP_LUT_EN		0x79
434
435/* OV518 Camera interface register numbers */
436#define R518_GPIO_OUT			0x56	/* OV518(+) only */
437#define R518_GPIO_CTL			0x57	/* OV518(+) only */
438
439/* OV519 Camera interface register numbers */
440#define OV519_R10_H_SIZE		0x10
441#define OV519_R11_V_SIZE		0x11
442#define OV519_R12_X_OFFSETL		0x12
443#define OV519_R13_X_OFFSETH		0x13
444#define OV519_R14_Y_OFFSETL		0x14
445#define OV519_R15_Y_OFFSETH		0x15
446#define OV519_R16_DIVIDER		0x16
447#define OV519_R20_DFR			0x20
448#define OV519_R25_FORMAT		0x25
449
450/* OV519 System Controller register numbers */
451#define OV519_R51_RESET1		0x51
452#define OV519_R54_EN_CLK1		0x54
453#define OV519_R57_SNAPSHOT		0x57
454
455#define OV519_GPIO_DATA_OUT0		0x71
456#define OV519_GPIO_IO_CTRL0		0x72
457
458/*#define OV511_ENDPOINT_ADDRESS 1	 * Isoc endpoint number */
459
460/*
461 * The FX2 chip does not give us a zero length read at end of frame.
462 * It does, however, give a short read at the end of a frame, if
463 * necessary, rather than run two frames together.
464 *
465 * By choosing the right bulk transfer size, we are guaranteed to always
466 * get a short read for the last read of each frame.  Frame sizes are
467 * always a composite number (width * height, or a multiple) so if we
468 * choose a prime number, we are guaranteed that the last read of a
469 * frame will be short.
470 *
471 * But it isn't that easy: the 2.6 kernel requires a multiple of 4KB,
472 * otherwise EOVERFLOW "babbling" errors occur.  I have not been able
473 * to figure out why.  [PMiller]
474 *
475 * The constant (13 * 4096) is the largest "prime enough" number less than 64KB.
476 *
477 * It isn't enough to know the number of bytes per frame, in case we
478 * have data dropouts or buffer overruns (even though the FX2 double
479 * buffers, there are some pretty strict real time constraints for
480 * isochronous transfer for larger frame sizes).
481 */
482/*jfm: this value does not work for 800x600 - see isoc_init */
483#define OVFX2_BULK_SIZE (13 * 4096)
484
485/* I2C registers */
486#define R51x_I2C_W_SID		0x41
487#define R51x_I2C_SADDR_3	0x42
488#define R51x_I2C_SADDR_2	0x43
489#define R51x_I2C_R_SID		0x44
490#define R51x_I2C_DATA		0x45
491#define R518_I2C_CTL		0x47	/* OV518(+) only */
492#define OVFX2_I2C_ADDR		0x00
493
494/* I2C ADDRESSES */
495#define OV7xx0_SID   0x42
496#define OV_HIRES_SID 0x60		/* OV9xxx / OV2xxx / OV3xxx */
497#define OV8xx0_SID   0xa0
498#define OV6xx0_SID   0xc0
499
500/* OV7610 registers */
501#define OV7610_REG_GAIN		0x00	/* gain setting (5:0) */
502#define OV7610_REG_BLUE		0x01	/* blue channel balance */
503#define OV7610_REG_RED		0x02	/* red channel balance */
504#define OV7610_REG_SAT		0x03	/* saturation */
505#define OV8610_REG_HUE		0x04	/* 04 reserved */
506#define OV7610_REG_CNT		0x05	/* Y contrast */
507#define OV7610_REG_BRT		0x06	/* Y brightness */
508#define OV7610_REG_COM_C	0x14	/* misc common regs */
509#define OV7610_REG_ID_HIGH	0x1c	/* manufacturer ID MSB */
510#define OV7610_REG_ID_LOW	0x1d	/* manufacturer ID LSB */
511#define OV7610_REG_COM_I	0x29	/* misc settings */
512
513/* OV7660 and OV7670 registers */
514#define OV7670_R00_GAIN		0x00	/* Gain lower 8 bits (rest in vref) */
515#define OV7670_R01_BLUE		0x01	/* blue gain */
516#define OV7670_R02_RED		0x02	/* red gain */
517#define OV7670_R03_VREF		0x03	/* Pieces of GAIN, VSTART, VSTOP */
518#define OV7670_R04_COM1		0x04	/* Control 1 */
519/*#define OV7670_R07_AECHH	0x07	 * AEC MS 5 bits */
520#define OV7670_R0C_COM3		0x0c	/* Control 3 */
521#define OV7670_R0D_COM4		0x0d	/* Control 4 */
522#define OV7670_R0E_COM5		0x0e	/* All "reserved" */
523#define OV7670_R0F_COM6		0x0f	/* Control 6 */
524#define OV7670_R10_AECH		0x10	/* More bits of AEC value */
525#define OV7670_R11_CLKRC	0x11	/* Clock control */
526#define OV7670_R12_COM7		0x12	/* Control 7 */
527#define   OV7670_COM7_FMT_VGA	 0x00
528/*#define   OV7670_COM7_YUV	 0x00	 * YUV */
529#define   OV7670_COM7_FMT_QVGA	 0x10	/* QVGA format */
530#define   OV7670_COM7_FMT_MASK	 0x38
531#define   OV7670_COM7_RESET	 0x80	/* Register reset */
532#define OV7670_R13_COM8		0x13	/* Control 8 */
533#define   OV7670_COM8_AEC	 0x01	/* Auto exposure enable */
534#define   OV7670_COM8_AWB	 0x02	/* White balance enable */
535#define   OV7670_COM8_AGC	 0x04	/* Auto gain enable */
536#define   OV7670_COM8_BFILT	 0x20	/* Band filter enable */
537#define   OV7670_COM8_AECSTEP	 0x40	/* Unlimited AEC step size */
538#define   OV7670_COM8_FASTAEC	 0x80	/* Enable fast AGC/AEC */
539#define OV7670_R14_COM9		0x14	/* Control 9 - gain ceiling */
540#define OV7670_R15_COM10	0x15	/* Control 10 */
541#define OV7670_R17_HSTART	0x17	/* Horiz start high bits */
542#define OV7670_R18_HSTOP	0x18	/* Horiz stop high bits */
543#define OV7670_R19_VSTART	0x19	/* Vert start high bits */
544#define OV7670_R1A_VSTOP	0x1a	/* Vert stop high bits */
545#define OV7670_R1E_MVFP		0x1e	/* Mirror / vflip */
546#define   OV7670_MVFP_VFLIP	 0x10	/* vertical flip */
547#define   OV7670_MVFP_MIRROR	 0x20	/* Mirror image */
548#define OV7670_R24_AEW		0x24	/* AGC upper limit */
549#define OV7670_R25_AEB		0x25	/* AGC lower limit */
550#define OV7670_R26_VPT		0x26	/* AGC/AEC fast mode op region */
551#define OV7670_R32_HREF		0x32	/* HREF pieces */
552#define OV7670_R3A_TSLB		0x3a	/* lots of stuff */
553#define OV7670_R3B_COM11	0x3b	/* Control 11 */
554#define   OV7670_COM11_EXP	 0x02
555#define   OV7670_COM11_HZAUTO	 0x10	/* Auto detect 50/60 Hz */
556#define OV7670_R3C_COM12	0x3c	/* Control 12 */
557#define OV7670_R3D_COM13	0x3d	/* Control 13 */
558#define   OV7670_COM13_GAMMA	 0x80	/* Gamma enable */
559#define   OV7670_COM13_UVSAT	 0x40	/* UV saturation auto adjustment */
560#define OV7670_R3E_COM14	0x3e	/* Control 14 */
561#define OV7670_R3F_EDGE		0x3f	/* Edge enhancement factor */
562#define OV7670_R40_COM15	0x40	/* Control 15 */
563/*#define   OV7670_COM15_R00FF	 0xc0	 *	00 to FF */
564#define OV7670_R41_COM16	0x41	/* Control 16 */
565#define   OV7670_COM16_AWBGAIN	 0x08	/* AWB gain enable */
566/* end of ov7660 common registers */
567#define OV7670_R55_BRIGHT	0x55	/* Brightness */
568#define OV7670_R56_CONTRAS	0x56	/* Contrast control */
569#define OV7670_R69_GFIX		0x69	/* Fix gain control */
570/*#define OV7670_R8C_RGB444	0x8c	 * RGB 444 control */
571#define OV7670_R9F_HAECC1	0x9f	/* Hist AEC/AGC control 1 */
572#define OV7670_RA0_HAECC2	0xa0	/* Hist AEC/AGC control 2 */
573#define OV7670_RA5_BD50MAX	0xa5	/* 50hz banding step limit */
574#define OV7670_RA6_HAECC3	0xa6	/* Hist AEC/AGC control 3 */
575#define OV7670_RA7_HAECC4	0xa7	/* Hist AEC/AGC control 4 */
576#define OV7670_RA8_HAECC5	0xa8	/* Hist AEC/AGC control 5 */
577#define OV7670_RA9_HAECC6	0xa9	/* Hist AEC/AGC control 6 */
578#define OV7670_RAA_HAECC7	0xaa	/* Hist AEC/AGC control 7 */
579#define OV7670_RAB_BD60MAX	0xab	/* 60hz banding step limit */
580
581struct ov_regvals {
582	u8 reg;
583	u8 val;
584};
585struct ov_i2c_regvals {
586	u8 reg;
587	u8 val;
588};
589
590/* Settings for OV2610 camera chip */
591static const struct ov_i2c_regvals norm_2610[] = {
592	{ 0x12, 0x80 },	/* reset */
593};
594
595static const struct ov_i2c_regvals norm_2610ae[] = {
596	{0x12, 0x80},	/* reset */
597	{0x13, 0xcd},
598	{0x09, 0x01},
599	{0x0d, 0x00},
600	{0x11, 0x80},
601	{0x12, 0x20},	/* 1600x1200 */
602	{0x33, 0x0c},
603	{0x35, 0x90},
604	{0x36, 0x37},
605/* ms-win traces */
606	{0x11, 0x83},	/* clock / 3 ? */
607	{0x2d, 0x00},	/* 60 Hz filter */
608	{0x24, 0xb0},	/* normal colors */
609	{0x25, 0x90},
610	{0x10, 0x43},
611};
612
613static const struct ov_i2c_regvals norm_3620b[] = {
614	/*
615	 * From the datasheet: "Note that after writing to register COMH
616	 * (0x12) to change the sensor mode, registers related to the
617	 * sensor's cropping window will be reset back to their default
618	 * values."
619	 *
620	 * "wait 4096 external clock ... to make sure the sensor is
621	 * stable and ready to access registers" i.e. 160us at 24MHz
622	 */
623	{ 0x12, 0x80 }, /* COMH reset */
624	{ 0x12, 0x00 }, /* QXGA, master */
625
626	/*
627	 * 11 CLKRC "Clock Rate Control"
628	 * [7] internal frequency doublers: on
629	 * [6] video port mode: master
630	 * [5:0] clock divider: 1
631	 */
632	{ 0x11, 0x80 },
633
634	/*
635	 * 13 COMI "Common Control I"
636	 *                  = 192 (0xC0) 11000000
637	 *    COMI[7] "AEC speed selection"
638	 *                  =   1 (0x01) 1....... "Faster AEC correction"
639	 *    COMI[6] "AEC speed step selection"
640	 *                  =   1 (0x01) .1...... "Big steps, fast"
641	 *    COMI[5] "Banding filter on off"
642	 *                  =   0 (0x00) ..0..... "Off"
643	 *    COMI[4] "Banding filter option"
644	 *                  =   0 (0x00) ...0.... "Main clock is 48 MHz and
645	 *                                         the PLL is ON"
646	 *    COMI[3] "Reserved"
647	 *                  =   0 (0x00) ....0...
648	 *    COMI[2] "AGC auto manual control selection"
649	 *                  =   0 (0x00) .....0.. "Manual"
650	 *    COMI[1] "AWB auto manual control selection"
651	 *                  =   0 (0x00) ......0. "Manual"
652	 *    COMI[0] "Exposure control"
653	 *                  =   0 (0x00) .......0 "Manual"
654	 */
655	{ 0x13, 0xc0 },
656
657	/*
658	 * 09 COMC "Common Control C"
659	 *                  =   8 (0x08) 00001000
660	 *    COMC[7:5] "Reserved"
661	 *                  =   0 (0x00) 000.....
662	 *    COMC[4] "Sleep Mode Enable"
663	 *                  =   0 (0x00) ...0.... "Normal mode"
664	 *    COMC[3:2] "Sensor sampling reset timing selection"
665	 *                  =   2 (0x02) ....10.. "Longer reset time"
666	 *    COMC[1:0] "Output drive current select"
667	 *                  =   0 (0x00) ......00 "Weakest"
668	 */
669	{ 0x09, 0x08 },
670
671	/*
672	 * 0C COMD "Common Control D"
673	 *                  =   8 (0x08) 00001000
674	 *    COMD[7] "Reserved"
675	 *                  =   0 (0x00) 0.......
676	 *    COMD[6] "Swap MSB and LSB at the output port"
677	 *                  =   0 (0x00) .0...... "False"
678	 *    COMD[5:3] "Reserved"
679	 *                  =   1 (0x01) ..001...
680	 *    COMD[2] "Output Average On Off"
681	 *                  =   0 (0x00) .....0.. "Output Normal"
682	 *    COMD[1] "Sensor precharge voltage selection"
683	 *                  =   0 (0x00) ......0. "Selects internal
684	 *                                         reference precharge
685	 *                                         voltage"
686	 *    COMD[0] "Snapshot option"
687	 *                  =   0 (0x00) .......0 "Enable live video output
688	 *                                         after snapshot sequence"
689	 */
690	{ 0x0c, 0x08 },
691
692	/*
693	 * 0D COME "Common Control E"
694	 *                  = 161 (0xA1) 10100001
695	 *    COME[7] "Output average option"
696	 *                  =   1 (0x01) 1....... "Output average of 4 pixels"
697	 *    COME[6] "Anti-blooming control"
698	 *                  =   0 (0x00) .0...... "Off"
699	 *    COME[5:3] "Reserved"
700	 *                  =   4 (0x04) ..100...
701	 *    COME[2] "Clock output power down pin status"
702	 *                  =   0 (0x00) .....0.. "Tri-state data output pin
703	 *                                         on power down"
704	 *    COME[1] "Data output pin status selection at power down"
705	 *                  =   0 (0x00) ......0. "Tri-state VSYNC, PCLK,
706	 *                                         HREF, and CHSYNC pins on
707	 *                                         power down"
708	 *    COME[0] "Auto zero circuit select"
709	 *                  =   1 (0x01) .......1 "On"
710	 */
711	{ 0x0d, 0xa1 },
712
713	/*
714	 * 0E COMF "Common Control F"
715	 *                  = 112 (0x70) 01110000
716	 *    COMF[7] "System clock selection"
717	 *                  =   0 (0x00) 0....... "Use 24 MHz system clock"
718	 *    COMF[6:4] "Reserved"
719	 *                  =   7 (0x07) .111....
720	 *    COMF[3] "Manual auto negative offset canceling selection"
721	 *                  =   0 (0x00) ....0... "Auto detect negative
722	 *                                         offset and cancel it"
723	 *    COMF[2:0] "Reserved"
724	 *                  =   0 (0x00) .....000
725	 */
726	{ 0x0e, 0x70 },
727
728	/*
729	 * 0F COMG "Common Control G"
730	 *                  =  66 (0x42) 01000010
731	 *    COMG[7] "Optical black output selection"
732	 *                  =   0 (0x00) 0....... "Disable"
733	 *    COMG[6] "Black level calibrate selection"
734	 *                  =   1 (0x01) .1...... "Use optical black pixels
735	 *                                         to calibrate"
736	 *    COMG[5:4] "Reserved"
737	 *                  =   0 (0x00) ..00....
738	 *    COMG[3] "Channel offset adjustment"
739	 *                  =   0 (0x00) ....0... "Disable offset adjustment"
740	 *    COMG[2] "ADC black level calibration option"
741	 *                  =   0 (0x00) .....0.. "Use B/G line and G/R
742	 *                                         line to calibrate each
743	 *                                         channel's black level"
744	 *    COMG[1] "Reserved"
745	 *                  =   1 (0x01) ......1.
746	 *    COMG[0] "ADC black level calibration enable"
747	 *                  =   0 (0x00) .......0 "Disable"
748	 */
749	{ 0x0f, 0x42 },
750
751	/*
752	 * 14 COMJ "Common Control J"
753	 *                  = 198 (0xC6) 11000110
754	 *    COMJ[7:6] "AGC gain ceiling"
755	 *                  =   3 (0x03) 11...... "8x"
756	 *    COMJ[5:4] "Reserved"
757	 *                  =   0 (0x00) ..00....
758	 *    COMJ[3] "Auto banding filter"
759	 *                  =   0 (0x00) ....0... "Banding filter is always
760	 *                                         on off depending on
761	 *                                         COMI[5] setting"
762	 *    COMJ[2] "VSYNC drop option"
763	 *                  =   1 (0x01) .....1.. "SYNC is dropped if frame
764	 *                                         data is dropped"
765	 *    COMJ[1] "Frame data drop"
766	 *                  =   1 (0x01) ......1. "Drop frame data if
767	 *                                         exposure is not within
768	 *                                         tolerance.  In AEC mode,
769	 *                                         data is normally dropped
770	 *                                         when data is out of
771	 *                                         range."
772	 *    COMJ[0] "Reserved"
773	 *                  =   0 (0x00) .......0
774	 */
775	{ 0x14, 0xc6 },
776
777	/*
778	 * 15 COMK "Common Control K"
779	 *                  =   2 (0x02) 00000010
780	 *    COMK[7] "CHSYNC pin output swap"
781	 *                  =   0 (0x00) 0....... "CHSYNC"
782	 *    COMK[6] "HREF pin output swap"
783	 *                  =   0 (0x00) .0...... "HREF"
784	 *    COMK[5] "PCLK output selection"
785	 *                  =   0 (0x00) ..0..... "PCLK always output"
786	 *    COMK[4] "PCLK edge selection"
787	 *                  =   0 (0x00) ...0.... "Data valid on falling edge"
788	 *    COMK[3] "HREF output polarity"
789	 *                  =   0 (0x00) ....0... "positive"
790	 *    COMK[2] "Reserved"
791	 *                  =   0 (0x00) .....0..
792	 *    COMK[1] "VSYNC polarity"
793	 *                  =   1 (0x01) ......1. "negative"
794	 *    COMK[0] "HSYNC polarity"
795	 *                  =   0 (0x00) .......0 "positive"
796	 */
797	{ 0x15, 0x02 },
798
799	/*
800	 * 33 CHLF "Current Control"
801	 *                  =   9 (0x09) 00001001
802	 *    CHLF[7:6] "Sensor current control"
803	 *                  =   0 (0x00) 00......
804	 *    CHLF[5] "Sensor current range control"
805	 *                  =   0 (0x00) ..0..... "normal range"
806	 *    CHLF[4] "Sensor current"
807	 *                  =   0 (0x00) ...0.... "normal current"
808	 *    CHLF[3] "Sensor buffer current control"
809	 *                  =   1 (0x01) ....1... "half current"
810	 *    CHLF[2] "Column buffer current control"
811	 *                  =   0 (0x00) .....0.. "normal current"
812	 *    CHLF[1] "Analog DSP current control"
813	 *                  =   0 (0x00) ......0. "normal current"
814	 *    CHLF[1] "ADC current control"
815	 *                  =   0 (0x00) ......0. "normal current"
816	 */
817	{ 0x33, 0x09 },
818
819	/*
820	 * 34 VBLM "Blooming Control"
821	 *                  =  80 (0x50) 01010000
822	 *    VBLM[7] "Hard soft reset switch"
823	 *                  =   0 (0x00) 0....... "Hard reset"
824	 *    VBLM[6:4] "Blooming voltage selection"
825	 *                  =   5 (0x05) .101....
826	 *    VBLM[3:0] "Sensor current control"
827	 *                  =   0 (0x00) ....0000
828	 */
829	{ 0x34, 0x50 },
830
831	/*
832	 * 36 VCHG "Sensor Precharge Voltage Control"
833	 *                  =   0 (0x00) 00000000
834	 *    VCHG[7] "Reserved"
835	 *                  =   0 (0x00) 0.......
836	 *    VCHG[6:4] "Sensor precharge voltage control"
837	 *                  =   0 (0x00) .000....
838	 *    VCHG[3:0] "Sensor array common reference"
839	 *                  =   0 (0x00) ....0000
840	 */
841	{ 0x36, 0x00 },
842
843	/*
844	 * 37 ADC "ADC Reference Control"
845	 *                  =   4 (0x04) 00000100
846	 *    ADC[7:4] "Reserved"
847	 *                  =   0 (0x00) 0000....
848	 *    ADC[3] "ADC input signal range"
849	 *                  =   0 (0x00) ....0... "Input signal 1.0x"
850	 *    ADC[2:0] "ADC range control"
851	 *                  =   4 (0x04) .....100
852	 */
853	{ 0x37, 0x04 },
854
855	/*
856	 * 38 ACOM "Analog Common Ground"
857	 *                  =  82 (0x52) 01010010
858	 *    ACOM[7] "Analog gain control"
859	 *                  =   0 (0x00) 0....... "Gain 1x"
860	 *    ACOM[6] "Analog black level calibration"
861	 *                  =   1 (0x01) .1...... "On"
862	 *    ACOM[5:0] "Reserved"
863	 *                  =  18 (0x12) ..010010
864	 */
865	{ 0x38, 0x52 },
866
867	/*
868	 * 3A FREFA "Internal Reference Adjustment"
869	 *                  =   0 (0x00) 00000000
870	 *    FREFA[7:0] "Range"
871	 *                  =   0 (0x00) 00000000
872	 */
873	{ 0x3a, 0x00 },
874
875	/*
876	 * 3C FVOPT "Internal Reference Adjustment"
877	 *                  =  31 (0x1F) 00011111
878	 *    FVOPT[7:0] "Range"
879	 *                  =  31 (0x1F) 00011111
880	 */
881	{ 0x3c, 0x1f },
882
883	/*
884	 * 44 Undocumented  =   0 (0x00) 00000000
885	 *    44[7:0] "It's a secret"
886	 *                  =   0 (0x00) 00000000
887	 */
888	{ 0x44, 0x00 },
889
890	/*
891	 * 40 Undocumented  =   0 (0x00) 00000000
892	 *    40[7:0] "It's a secret"
893	 *                  =   0 (0x00) 00000000
894	 */
895	{ 0x40, 0x00 },
896
897	/*
898	 * 41 Undocumented  =   0 (0x00) 00000000
899	 *    41[7:0] "It's a secret"
900	 *                  =   0 (0x00) 00000000
901	 */
902	{ 0x41, 0x00 },
903
904	/*
905	 * 42 Undocumented  =   0 (0x00) 00000000
906	 *    42[7:0] "It's a secret"
907	 *                  =   0 (0x00) 00000000
908	 */
909	{ 0x42, 0x00 },
910
911	/*
912	 * 43 Undocumented  =   0 (0x00) 00000000
913	 *    43[7:0] "It's a secret"
914	 *                  =   0 (0x00) 00000000
915	 */
916	{ 0x43, 0x00 },
917
918	/*
919	 * 45 Undocumented  = 128 (0x80) 10000000
920	 *    45[7:0] "It's a secret"
921	 *                  = 128 (0x80) 10000000
922	 */
923	{ 0x45, 0x80 },
924
925	/*
926	 * 48 Undocumented  = 192 (0xC0) 11000000
927	 *    48[7:0] "It's a secret"
928	 *                  = 192 (0xC0) 11000000
929	 */
930	{ 0x48, 0xc0 },
931
932	/*
933	 * 49 Undocumented  =  25 (0x19) 00011001
934	 *    49[7:0] "It's a secret"
935	 *                  =  25 (0x19) 00011001
936	 */
937	{ 0x49, 0x19 },
938
939	/*
940	 * 4B Undocumented  = 128 (0x80) 10000000
941	 *    4B[7:0] "It's a secret"
942	 *                  = 128 (0x80) 10000000
943	 */
944	{ 0x4b, 0x80 },
945
946	/*
947	 * 4D Undocumented  = 196 (0xC4) 11000100
948	 *    4D[7:0] "It's a secret"
949	 *                  = 196 (0xC4) 11000100
950	 */
951	{ 0x4d, 0xc4 },
952
953	/*
954	 * 35 VREF "Reference Voltage Control"
955	 *                  =  76 (0x4c) 01001100
956	 *    VREF[7:5] "Column high reference control"
957	 *                  =   2 (0x02) 010..... "higher voltage"
958	 *    VREF[4:2] "Column low reference control"
959	 *                  =   3 (0x03) ...011.. "Highest voltage"
960	 *    VREF[1:0] "Reserved"
961	 *                  =   0 (0x00) ......00
962	 */
963	{ 0x35, 0x4c },
964
965	/*
966	 * 3D Undocumented  =   0 (0x00) 00000000
967	 *    3D[7:0] "It's a secret"
968	 *                  =   0 (0x00) 00000000
969	 */
970	{ 0x3d, 0x00 },
971
972	/*
973	 * 3E Undocumented  =   0 (0x00) 00000000
974	 *    3E[7:0] "It's a secret"
975	 *                  =   0 (0x00) 00000000
976	 */
977	{ 0x3e, 0x00 },
978
979	/*
980	 * 3B FREFB "Internal Reference Adjustment"
981	 *                  =  24 (0x18) 00011000
982	 *    FREFB[7:0] "Range"
983	 *                  =  24 (0x18) 00011000
984	 */
985	{ 0x3b, 0x18 },
986
987	/*
988	 * 33 CHLF "Current Control"
989	 *                  =  25 (0x19) 00011001
990	 *    CHLF[7:6] "Sensor current control"
991	 *                  =   0 (0x00) 00......
992	 *    CHLF[5] "Sensor current range control"
993	 *                  =   0 (0x00) ..0..... "normal range"
994	 *    CHLF[4] "Sensor current"
995	 *                  =   1 (0x01) ...1.... "double current"
996	 *    CHLF[3] "Sensor buffer current control"
997	 *                  =   1 (0x01) ....1... "half current"
998	 *    CHLF[2] "Column buffer current control"
999	 *                  =   0 (0x00) .....0.. "normal current"
1000	 *    CHLF[1] "Analog DSP current control"
1001	 *                  =   0 (0x00) ......0. "normal current"
1002	 *    CHLF[1] "ADC current control"
1003	 *                  =   0 (0x00) ......0. "normal current"
1004	 */
1005	{ 0x33, 0x19 },
1006
1007	/*
1008	 * 34 VBLM "Blooming Control"
1009	 *                  =  90 (0x5A) 01011010
1010	 *    VBLM[7] "Hard soft reset switch"
1011	 *                  =   0 (0x00) 0....... "Hard reset"
1012	 *    VBLM[6:4] "Blooming voltage selection"
1013	 *                  =   5 (0x05) .101....
1014	 *    VBLM[3:0] "Sensor current control"
1015	 *                  =  10 (0x0A) ....1010
1016	 */
1017	{ 0x34, 0x5a },
1018
1019	/*
1020	 * 3B FREFB "Internal Reference Adjustment"
1021	 *                  =   0 (0x00) 00000000
1022	 *    FREFB[7:0] "Range"
1023	 *                  =   0 (0x00) 00000000
1024	 */
1025	{ 0x3b, 0x00 },
1026
1027	/*
1028	 * 33 CHLF "Current Control"
1029	 *                  =   9 (0x09) 00001001
1030	 *    CHLF[7:6] "Sensor current control"
1031	 *                  =   0 (0x00) 00......
1032	 *    CHLF[5] "Sensor current range control"
1033	 *                  =   0 (0x00) ..0..... "normal range"
1034	 *    CHLF[4] "Sensor current"
1035	 *                  =   0 (0x00) ...0.... "normal current"
1036	 *    CHLF[3] "Sensor buffer current control"
1037	 *                  =   1 (0x01) ....1... "half current"
1038	 *    CHLF[2] "Column buffer current control"
1039	 *                  =   0 (0x00) .....0.. "normal current"
1040	 *    CHLF[1] "Analog DSP current control"
1041	 *                  =   0 (0x00) ......0. "normal current"
1042	 *    CHLF[1] "ADC current control"
1043	 *                  =   0 (0x00) ......0. "normal current"
1044	 */
1045	{ 0x33, 0x09 },
1046
1047	/*
1048	 * 34 VBLM "Blooming Control"
1049	 *                  =  80 (0x50) 01010000
1050	 *    VBLM[7] "Hard soft reset switch"
1051	 *                  =   0 (0x00) 0....... "Hard reset"
1052	 *    VBLM[6:4] "Blooming voltage selection"
1053	 *                  =   5 (0x05) .101....
1054	 *    VBLM[3:0] "Sensor current control"
1055	 *                  =   0 (0x00) ....0000
1056	 */
1057	{ 0x34, 0x50 },
1058
1059	/*
1060	 * 12 COMH "Common Control H"
1061	 *                  =  64 (0x40) 01000000
1062	 *    COMH[7] "SRST"
1063	 *                  =   0 (0x00) 0....... "No-op"
1064	 *    COMH[6:4] "Resolution selection"
1065	 *                  =   4 (0x04) .100.... "XGA"
1066	 *    COMH[3] "Master slave selection"
1067	 *                  =   0 (0x00) ....0... "Master mode"
1068	 *    COMH[2] "Internal B/R channel option"
1069	 *                  =   0 (0x00) .....0.. "B/R use same channel"
1070	 *    COMH[1] "Color bar test pattern"
1071	 *                  =   0 (0x00) ......0. "Off"
1072	 *    COMH[0] "Reserved"
1073	 *                  =   0 (0x00) .......0
1074	 */
1075	{ 0x12, 0x40 },
1076
1077	/*
1078	 * 17 HREFST "Horizontal window start"
1079	 *                  =  31 (0x1F) 00011111
1080	 *    HREFST[7:0] "Horizontal window start, 8 MSBs"
1081	 *                  =  31 (0x1F) 00011111
1082	 */
1083	{ 0x17, 0x1f },
1084
1085	/*
1086	 * 18 HREFEND "Horizontal window end"
1087	 *                  =  95 (0x5F) 01011111
1088	 *    HREFEND[7:0] "Horizontal Window End, 8 MSBs"
1089	 *                  =  95 (0x5F) 01011111
1090	 */
1091	{ 0x18, 0x5f },
1092
1093	/*
1094	 * 19 VSTRT "Vertical window start"
1095	 *                  =   0 (0x00) 00000000
1096	 *    VSTRT[7:0] "Vertical Window Start, 8 MSBs"
1097	 *                  =   0 (0x00) 00000000
1098	 */
1099	{ 0x19, 0x00 },
1100
1101	/*
1102	 * 1A VEND "Vertical window end"
1103	 *                  =  96 (0x60) 01100000
1104	 *    VEND[7:0] "Vertical Window End, 8 MSBs"
1105	 *                  =  96 (0x60) 01100000
1106	 */
1107	{ 0x1a, 0x60 },
1108
1109	/*
1110	 * 32 COMM "Common Control M"
1111	 *                  =  18 (0x12) 00010010
1112	 *    COMM[7:6] "Pixel clock divide option"
1113	 *                  =   0 (0x00) 00...... "/1"
1114	 *    COMM[5:3] "Horizontal window end position, 3 LSBs"
1115	 *                  =   2 (0x02) ..010...
1116	 *    COMM[2:0] "Horizontal window start position, 3 LSBs"
1117	 *                  =   2 (0x02) .....010
1118	 */
1119	{ 0x32, 0x12 },
1120
1121	/*
1122	 * 03 COMA "Common Control A"
1123	 *                  =  74 (0x4A) 01001010
1124	 *    COMA[7:4] "AWB Update Threshold"
1125	 *                  =   4 (0x04) 0100....
1126	 *    COMA[3:2] "Vertical window end line control 2 LSBs"
1127	 *                  =   2 (0x02) ....10..
1128	 *    COMA[1:0] "Vertical window start line control 2 LSBs"
1129	 *                  =   2 (0x02) ......10
1130	 */
1131	{ 0x03, 0x4a },
1132
1133	/*
1134	 * 11 CLKRC "Clock Rate Control"
1135	 *                  = 128 (0x80) 10000000
1136	 *    CLKRC[7] "Internal frequency doublers on off seclection"
1137	 *                  =   1 (0x01) 1....... "On"
1138	 *    CLKRC[6] "Digital video master slave selection"
1139	 *                  =   0 (0x00) .0...... "Master mode, sensor
1140	 *                                         provides PCLK"
1141	 *    CLKRC[5:0] "Clock divider { CLK = PCLK/(1+CLKRC[5:0]) }"
1142	 *                  =   0 (0x00) ..000000
1143	 */
1144	{ 0x11, 0x80 },
1145
1146	/*
1147	 * 12 COMH "Common Control H"
1148	 *                  =   0 (0x00) 00000000
1149	 *    COMH[7] "SRST"
1150	 *                  =   0 (0x00) 0....... "No-op"
1151	 *    COMH[6:4] "Resolution selection"
1152	 *                  =   0 (0x00) .000.... "QXGA"
1153	 *    COMH[3] "Master slave selection"
1154	 *                  =   0 (0x00) ....0... "Master mode"
1155	 *    COMH[2] "Internal B/R channel option"
1156	 *                  =   0 (0x00) .....0.. "B/R use same channel"
1157	 *    COMH[1] "Color bar test pattern"
1158	 *                  =   0 (0x00) ......0. "Off"
1159	 *    COMH[0] "Reserved"
1160	 *                  =   0 (0x00) .......0
1161	 */
1162	{ 0x12, 0x00 },
1163
1164	/*
1165	 * 12 COMH "Common Control H"
1166	 *                  =  64 (0x40) 01000000
1167	 *    COMH[7] "SRST"
1168	 *                  =   0 (0x00) 0....... "No-op"
1169	 *    COMH[6:4] "Resolution selection"
1170	 *                  =   4 (0x04) .100.... "XGA"
1171	 *    COMH[3] "Master slave selection"
1172	 *                  =   0 (0x00) ....0... "Master mode"
1173	 *    COMH[2] "Internal B/R channel option"
1174	 *                  =   0 (0x00) .....0.. "B/R use same channel"
1175	 *    COMH[1] "Color bar test pattern"
1176	 *                  =   0 (0x00) ......0. "Off"
1177	 *    COMH[0] "Reserved"
1178	 *                  =   0 (0x00) .......0
1179	 */
1180	{ 0x12, 0x40 },
1181
1182	/*
1183	 * 17 HREFST "Horizontal window start"
1184	 *                  =  31 (0x1F) 00011111
1185	 *    HREFST[7:0] "Horizontal window start, 8 MSBs"
1186	 *                  =  31 (0x1F) 00011111
1187	 */
1188	{ 0x17, 0x1f },
1189
1190	/*
1191	 * 18 HREFEND "Horizontal window end"
1192	 *                  =  95 (0x5F) 01011111
1193	 *    HREFEND[7:0] "Horizontal Window End, 8 MSBs"
1194	 *                  =  95 (0x5F) 01011111
1195	 */
1196	{ 0x18, 0x5f },
1197
1198	/*
1199	 * 19 VSTRT "Vertical window start"
1200	 *                  =   0 (0x00) 00000000
1201	 *    VSTRT[7:0] "Vertical Window Start, 8 MSBs"
1202	 *                  =   0 (0x00) 00000000
1203	 */
1204	{ 0x19, 0x00 },
1205
1206	/*
1207	 * 1A VEND "Vertical window end"
1208	 *                  =  96 (0x60) 01100000
1209	 *    VEND[7:0] "Vertical Window End, 8 MSBs"
1210	 *                  =  96 (0x60) 01100000
1211	 */
1212	{ 0x1a, 0x60 },
1213
1214	/*
1215	 * 32 COMM "Common Control M"
1216	 *                  =  18 (0x12) 00010010
1217	 *    COMM[7:6] "Pixel clock divide option"
1218	 *                  =   0 (0x00) 00...... "/1"
1219	 *    COMM[5:3] "Horizontal window end position, 3 LSBs"
1220	 *                  =   2 (0x02) ..010...
1221	 *    COMM[2:0] "Horizontal window start position, 3 LSBs"
1222	 *                  =   2 (0x02) .....010
1223	 */
1224	{ 0x32, 0x12 },
1225
1226	/*
1227	 * 03 COMA "Common Control A"
1228	 *                  =  74 (0x4A) 01001010
1229	 *    COMA[7:4] "AWB Update Threshold"
1230	 *                  =   4 (0x04) 0100....
1231	 *    COMA[3:2] "Vertical window end line control 2 LSBs"
1232	 *                  =   2 (0x02) ....10..
1233	 *    COMA[1:0] "Vertical window start line control 2 LSBs"
1234	 *                  =   2 (0x02) ......10
1235	 */
1236	{ 0x03, 0x4a },
1237
1238	/*
1239	 * 02 RED "Red Gain Control"
1240	 *                  = 175 (0xAF) 10101111
1241	 *    RED[7] "Action"
1242	 *                  =   1 (0x01) 1....... "gain = 1/(1+bitrev([6:0]))"
1243	 *    RED[6:0] "Value"
1244	 *                  =  47 (0x2F) .0101111
1245	 */
1246	{ 0x02, 0xaf },
1247
1248	/*
1249	 * 2D ADDVSL "VSYNC Pulse Width"
1250	 *                  = 210 (0xD2) 11010010
1251	 *    ADDVSL[7:0] "VSYNC pulse width, LSB"
1252	 *                  = 210 (0xD2) 11010010
1253	 */
1254	{ 0x2d, 0xd2 },
1255
1256	/*
1257	 * 00 GAIN          =  24 (0x18) 00011000
1258	 *    GAIN[7:6] "Reserved"
1259	 *                  =   0 (0x00) 00......
1260	 *    GAIN[5] "Double"
1261	 *                  =   0 (0x00) ..0..... "False"
1262	 *    GAIN[4] "Double"
1263	 *                  =   1 (0x01) ...1.... "True"
1264	 *    GAIN[3:0] "Range"
1265	 *                  =   8 (0x08) ....1000
1266	 */
1267	{ 0x00, 0x18 },
1268
1269	/*
1270	 * 01 BLUE "Blue Gain Control"
1271	 *                  = 240 (0xF0) 11110000
1272	 *    BLUE[7] "Action"
1273	 *                  =   1 (0x01) 1....... "gain = 1/(1+bitrev([6:0]))"
1274	 *    BLUE[6:0] "Value"
1275	 *                  = 112 (0x70) .1110000
1276	 */
1277	{ 0x01, 0xf0 },
1278
1279	/*
1280	 * 10 AEC "Automatic Exposure Control"
1281	 *                  =  10 (0x0A) 00001010
1282	 *    AEC[7:0] "Automatic Exposure Control, 8 MSBs"
1283	 *                  =  10 (0x0A) 00001010
1284	 */
1285	{ 0x10, 0x0a },
1286
1287	{ 0xe1, 0x67 },
1288	{ 0xe3, 0x03 },
1289	{ 0xe4, 0x26 },
1290	{ 0xe5, 0x3e },
1291	{ 0xf8, 0x01 },
1292	{ 0xff, 0x01 },
1293};
1294
1295static const struct ov_i2c_regvals norm_6x20[] = {
1296	{ 0x12, 0x80 }, /* reset */
1297	{ 0x11, 0x01 },
1298	{ 0x03, 0x60 },
1299	{ 0x05, 0x7f }, /* For when autoadjust is off */
1300	{ 0x07, 0xa8 },
1301	/* The ratio of 0x0c and 0x0d controls the white point */
1302	{ 0x0c, 0x24 },
1303	{ 0x0d, 0x24 },
1304	{ 0x0f, 0x15 }, /* COMS */
1305	{ 0x10, 0x75 }, /* AEC Exposure time */
1306	{ 0x12, 0x24 }, /* Enable AGC */
1307	{ 0x14, 0x04 },
1308	/* 0x16: 0x06 helps frame stability with moving objects */
1309	{ 0x16, 0x06 },
1310/*	{ 0x20, 0x30 },  * Aperture correction enable */
1311	{ 0x26, 0xb2 }, /* BLC enable */
1312	/* 0x28: 0x05 Selects RGB format if RGB on */
1313	{ 0x28, 0x05 },
1314	{ 0x2a, 0x04 }, /* Disable framerate adjust */
1315/*	{ 0x2b, 0xac },  * Framerate; Set 2a[7] first */
1316	{ 0x2d, 0x85 },
1317	{ 0x33, 0xa0 }, /* Color Processing Parameter */
1318	{ 0x34, 0xd2 }, /* Max A/D range */
1319	{ 0x38, 0x8b },
1320	{ 0x39, 0x40 },
1321
1322	{ 0x3c, 0x39 }, /* Enable AEC mode changing */
1323	{ 0x3c, 0x3c }, /* Change AEC mode */
1324	{ 0x3c, 0x24 }, /* Disable AEC mode changing */
1325
1326	{ 0x3d, 0x80 },
1327	/* These next two registers (0x4a, 0x4b) are undocumented.
1328	 * They control the color balance */
1329	{ 0x4a, 0x80 },
1330	{ 0x4b, 0x80 },
1331	{ 0x4d, 0xd2 }, /* This reduces noise a bit */
1332	{ 0x4e, 0xc1 },
1333	{ 0x4f, 0x04 },
1334/* Do 50-53 have any effect? */
1335/* Toggle 0x12[2] off and on here? */
1336};
1337
1338static const struct ov_i2c_regvals norm_6x30[] = {
1339	{ 0x12, 0x80 }, /* Reset */
1340	{ 0x00, 0x1f }, /* Gain */
1341	{ 0x01, 0x99 }, /* Blue gain */
1342	{ 0x02, 0x7c }, /* Red gain */
1343	{ 0x03, 0xc0 }, /* Saturation */
1344	{ 0x05, 0x0a }, /* Contrast */
1345	{ 0x06, 0x95 }, /* Brightness */
1346	{ 0x07, 0x2d }, /* Sharpness */
1347	{ 0x0c, 0x20 },
1348	{ 0x0d, 0x20 },
1349	{ 0x0e, 0xa0 }, /* Was 0x20, bit7 enables a 2x gain which we need */
1350	{ 0x0f, 0x05 },
1351	{ 0x10, 0x9a },
1352	{ 0x11, 0x00 }, /* Pixel clock = fastest */
1353	{ 0x12, 0x24 }, /* Enable AGC and AWB */
1354	{ 0x13, 0x21 },
1355	{ 0x14, 0x80 },
1356	{ 0x15, 0x01 },
1357	{ 0x16, 0x03 },
1358	{ 0x17, 0x38 },
1359	{ 0x18, 0xea },
1360	{ 0x19, 0x04 },
1361	{ 0x1a, 0x93 },
1362	{ 0x1b, 0x00 },
1363	{ 0x1e, 0xc4 },
1364	{ 0x1f, 0x04 },
1365	{ 0x20, 0x20 },
1366	{ 0x21, 0x10 },
1367	{ 0x22, 0x88 },
1368	{ 0x23, 0xc0 }, /* Crystal circuit power level */
1369	{ 0x25, 0x9a }, /* Increase AEC black ratio */
1370	{ 0x26, 0xb2 }, /* BLC enable */
1371	{ 0x27, 0xa2 },
1372	{ 0x28, 0x00 },
1373	{ 0x29, 0x00 },
1374	{ 0x2a, 0x84 }, /* 60 Hz power */
1375	{ 0x2b, 0xa8 }, /* 60 Hz power */
1376	{ 0x2c, 0xa0 },
1377	{ 0x2d, 0x95 }, /* Enable auto-brightness */
1378	{ 0x2e, 0x88 },
1379	{ 0x33, 0x26 },
1380	{ 0x34, 0x03 },
1381	{ 0x36, 0x8f },
1382	{ 0x37, 0x80 },
1383	{ 0x38, 0x83 },
1384	{ 0x39, 0x80 },
1385	{ 0x3a, 0x0f },
1386	{ 0x3b, 0x3c },
1387	{ 0x3c, 0x1a },
1388	{ 0x3d, 0x80 },
1389	{ 0x3e, 0x80 },
1390	{ 0x3f, 0x0e },
1391	{ 0x40, 0x00 }, /* White bal */
1392	{ 0x41, 0x00 }, /* White bal */
1393	{ 0x42, 0x80 },
1394	{ 0x43, 0x3f }, /* White bal */
1395	{ 0x44, 0x80 },
1396	{ 0x45, 0x20 },
1397	{ 0x46, 0x20 },
1398	{ 0x47, 0x80 },
1399	{ 0x48, 0x7f },
1400	{ 0x49, 0x00 },
1401	{ 0x4a, 0x00 },
1402	{ 0x4b, 0x80 },
1403	{ 0x4c, 0xd0 },
1404	{ 0x4d, 0x10 }, /* U = 0.563u, V = 0.714v */
1405	{ 0x4e, 0x40 },
1406	{ 0x4f, 0x07 }, /* UV avg., col. killer: max */
1407	{ 0x50, 0xff },
1408	{ 0x54, 0x23 }, /* Max AGC gain: 18dB */
1409	{ 0x55, 0xff },
1410	{ 0x56, 0x12 },
1411	{ 0x57, 0x81 },
1412	{ 0x58, 0x75 },
1413	{ 0x59, 0x01 }, /* AGC dark current comp.: +1 */
1414	{ 0x5a, 0x2c },
1415	{ 0x5b, 0x0f }, /* AWB chrominance levels */
1416	{ 0x5c, 0x10 },
1417	{ 0x3d, 0x80 },
1418	{ 0x27, 0xa6 },
1419	{ 0x12, 0x20 }, /* Toggle AWB */
1420	{ 0x12, 0x24 },
1421};
1422
1423/* Lawrence Glaister <lg@jfm.bc.ca> reports:
1424 *
1425 * Register 0x0f in the 7610 has the following effects:
1426 *
1427 * 0x85 (AEC method 1): Best overall, good contrast range
1428 * 0x45 (AEC method 2): Very overexposed
1429 * 0xa5 (spec sheet default): Ok, but the black level is
1430 *	shifted resulting in loss of contrast
1431 * 0x05 (old driver setting): very overexposed, too much
1432 *	contrast
1433 */
1434static const struct ov_i2c_regvals norm_7610[] = {
1435	{ 0x10, 0xff },
1436	{ 0x16, 0x06 },
1437	{ 0x28, 0x24 },
1438	{ 0x2b, 0xac },
1439	{ 0x12, 0x00 },
1440	{ 0x38, 0x81 },
1441	{ 0x28, 0x24 },	/* 0c */
1442	{ 0x0f, 0x85 },	/* lg's setting */
1443	{ 0x15, 0x01 },
1444	{ 0x20, 0x1c },
1445	{ 0x23, 0x2a },
1446	{ 0x24, 0x10 },
1447	{ 0x25, 0x8a },
1448	{ 0x26, 0xa2 },
1449	{ 0x27, 0xc2 },
1450	{ 0x2a, 0x04 },
1451	{ 0x2c, 0xfe },
1452	{ 0x2d, 0x93 },
1453	{ 0x30, 0x71 },
1454	{ 0x31, 0x60 },
1455	{ 0x32, 0x26 },
1456	{ 0x33, 0x20 },
1457	{ 0x34, 0x48 },
1458	{ 0x12, 0x24 },
1459	{ 0x11, 0x01 },
1460	{ 0x0c, 0x24 },
1461	{ 0x0d, 0x24 },
1462};
1463
1464static const struct ov_i2c_regvals norm_7620[] = {
1465	{ 0x12, 0x80 },		/* reset */
1466	{ 0x00, 0x00 },		/* gain */
1467	{ 0x01, 0x80 },		/* blue gain */
1468	{ 0x02, 0x80 },		/* red gain */
1469	{ 0x03, 0xc0 },		/* OV7670_R03_VREF */
1470	{ 0x06, 0x60 },
1471	{ 0x07, 0x00 },
1472	{ 0x0c, 0x24 },
1473	{ 0x0c, 0x24 },
1474	{ 0x0d, 0x24 },
1475	{ 0x11, 0x01 },
1476	{ 0x12, 0x24 },
1477	{ 0x13, 0x01 },
1478	{ 0x14, 0x84 },
1479	{ 0x15, 0x01 },
1480	{ 0x16, 0x03 },
1481	{ 0x17, 0x2f },
1482	{ 0x18, 0xcf },
1483	{ 0x19, 0x06 },
1484	{ 0x1a, 0xf5 },
1485	{ 0x1b, 0x00 },
1486	{ 0x20, 0x18 },
1487	{ 0x21, 0x80 },
1488	{ 0x22, 0x80 },
1489	{ 0x23, 0x00 },
1490	{ 0x26, 0xa2 },
1491	{ 0x27, 0xea },
1492	{ 0x28, 0x22 }, /* Was 0x20, bit1 enables a 2x gain which we need */
1493	{ 0x29, 0x00 },
1494	{ 0x2a, 0x10 },
1495	{ 0x2b, 0x00 },
1496	{ 0x2c, 0x88 },
1497	{ 0x2d, 0x91 },
1498	{ 0x2e, 0x80 },
1499	{ 0x2f, 0x44 },
1500	{ 0x60, 0x27 },
1501	{ 0x61, 0x02 },
1502	{ 0x62, 0x5f },
1503	{ 0x63, 0xd5 },
1504	{ 0x64, 0x57 },
1505	{ 0x65, 0x83 },
1506	{ 0x66, 0x55 },
1507	{ 0x67, 0x92 },
1508	{ 0x68, 0xcf },
1509	{ 0x69, 0x76 },
1510	{ 0x6a, 0x22 },
1511	{ 0x6b, 0x00 },
1512	{ 0x6c, 0x02 },
1513	{ 0x6d, 0x44 },
1514	{ 0x6e, 0x80 },
1515	{ 0x6f, 0x1d },
1516	{ 0x70, 0x8b },
1517	{ 0x71, 0x00 },
1518	{ 0x72, 0x14 },
1519	{ 0x73, 0x54 },
1520	{ 0x74, 0x00 },
1521	{ 0x75, 0x8e },
1522	{ 0x76, 0x00 },
1523	{ 0x77, 0xff },
1524	{ 0x78, 0x80 },
1525	{ 0x79, 0x80 },
1526	{ 0x7a, 0x80 },
1527	{ 0x7b, 0xe2 },
1528	{ 0x7c, 0x00 },
1529};
1530
1531/* 7640 and 7648. The defaults should be OK for most registers. */
1532static const struct ov_i2c_regvals norm_7640[] = {
1533	{ 0x12, 0x80 },
1534	{ 0x12, 0x14 },
1535};
1536
1537static const struct ov_regvals init_519_ov7660[] = {
1538	{ 0x5d,	0x03 }, /* Turn off suspend mode */
1539	{ 0x53,	0x9b }, /* 0x9f enables the (unused) microcontroller */
1540	{ 0x54,	0x0f }, /* bit2 (jpeg enable) */
1541	{ 0xa2,	0x20 }, /* a2-a5 are undocumented */
1542	{ 0xa3,	0x18 },
1543	{ 0xa4,	0x04 },
1544	{ 0xa5,	0x28 },
1545	{ 0x37,	0x00 },	/* SetUsbInit */
1546	{ 0x55,	0x02 }, /* 4.096 Mhz audio clock */
1547	/* Enable both fields, YUV Input, disable defect comp (why?) */
1548	{ 0x20,	0x0c },	/* 0x0d does U <-> V swap */
1549	{ 0x21,	0x38 },
1550	{ 0x22,	0x1d },
1551	{ 0x17,	0x50 }, /* undocumented */
1552	{ 0x37,	0x00 }, /* undocumented */
1553	{ 0x40,	0xff }, /* I2C timeout counter */
1554	{ 0x46,	0x00 }, /* I2C clock prescaler */
1555};
1556static const struct ov_i2c_regvals norm_7660[] = {
1557	{OV7670_R12_COM7, OV7670_COM7_RESET},
1558	{OV7670_R11_CLKRC, 0x81},
1559	{0x92, 0x00},			/* DM_LNL */
1560	{0x93, 0x00},			/* DM_LNH */
1561	{0x9d, 0x4c},			/* BD50ST */
1562	{0x9e, 0x3f},			/* BD60ST */
1563	{OV7670_R3B_COM11, 0x02},
1564	{OV7670_R13_COM8, 0xf5},
1565	{OV7670_R10_AECH, 0x00},
1566	{OV7670_R00_GAIN, 0x00},
1567	{OV7670_R01_BLUE, 0x7c},
1568	{OV7670_R02_RED, 0x9d},
1569	{OV7670_R12_COM7, 0x00},
1570	{OV7670_R04_COM1, 00},
1571	{OV7670_R18_HSTOP, 0x01},
1572	{OV7670_R17_HSTART, 0x13},
1573	{OV7670_R32_HREF, 0x92},
1574	{OV7670_R19_VSTART, 0x02},
1575	{OV7670_R1A_VSTOP, 0x7a},
1576	{OV7670_R03_VREF, 0x00},
1577	{OV7670_R0E_COM5, 0x04},
1578	{OV7670_R0F_COM6, 0x62},
1579	{OV7670_R15_COM10, 0x00},
1580	{0x16, 0x02},			/* RSVD */
1581	{0x1b, 0x00},			/* PSHFT */
1582	{OV7670_R1E_MVFP, 0x01},
1583	{0x29, 0x3c},			/* RSVD */
1584	{0x33, 0x00},			/* CHLF */
1585	{0x34, 0x07},			/* ARBLM */
1586	{0x35, 0x84},			/* RSVD */
1587	{0x36, 0x00},			/* RSVD */
1588	{0x37, 0x04},			/* ADC */
1589	{0x39, 0x43},			/* OFON */
1590	{OV7670_R3A_TSLB, 0x00},
1591	{OV7670_R3C_COM12, 0x6c},
1592	{OV7670_R3D_COM13, 0x98},
1593	{OV7670_R3F_EDGE, 0x23},
1594	{OV7670_R40_COM15, 0xc1},
1595	{OV7670_R41_COM16, 0x22},
1596	{0x6b, 0x0a},			/* DBLV */
1597	{0xa1, 0x08},			/* RSVD */
1598	{0x69, 0x80},			/* HV */
1599	{0x43, 0xf0},			/* RSVD.. */
1600	{0x44, 0x10},
1601	{0x45, 0x78},
1602	{0x46, 0xa8},
1603	{0x47, 0x60},
1604	{0x48, 0x80},
1605	{0x59, 0xba},
1606	{0x5a, 0x9a},
1607	{0x5b, 0x22},
1608	{0x5c, 0xb9},
1609	{0x5d, 0x9b},
1610	{0x5e, 0x10},
1611	{0x5f, 0xe0},
1612	{0x60, 0x85},
1613	{0x61, 0x60},
1614	{0x9f, 0x9d},			/* RSVD */
1615	{0xa0, 0xa0},			/* DSPC2 */
1616	{0x4f, 0x60},			/* matrix */
1617	{0x50, 0x64},
1618	{0x51, 0x04},
1619	{0x52, 0x18},
1620	{0x53, 0x3c},
1621	{0x54, 0x54},
1622	{0x55, 0x40},
1623	{0x56, 0x40},
1624	{0x57, 0x40},
1625	{0x58, 0x0d},			/* matrix sign */
1626	{0x8b, 0xcc},			/* RSVD */
1627	{0x8c, 0xcc},
1628	{0x8d, 0xcf},
1629	{0x6c, 0x40},			/* gamma curve */
1630	{0x6d, 0xe0},
1631	{0x6e, 0xa0},
1632	{0x6f, 0x80},
1633	{0x70, 0x70},
1634	{0x71, 0x80},
1635	{0x72, 0x60},
1636	{0x73, 0x60},
1637	{0x74, 0x50},
1638	{0x75, 0x40},
1639	{0x76, 0x38},
1640	{0x77, 0x3c},
1641	{0x78, 0x32},
1642	{0x79, 0x1a},
1643	{0x7a, 0x28},
1644	{0x7b, 0x24},
1645	{0x7c, 0x04},			/* gamma curve */
1646	{0x7d, 0x12},
1647	{0x7e, 0x26},
1648	{0x7f, 0x46},
1649	{0x80, 0x54},
1650	{0x81, 0x64},
1651	{0x82, 0x70},
1652	{0x83, 0x7c},
1653	{0x84, 0x86},
1654	{0x85, 0x8e},
1655	{0x86, 0x9c},
1656	{0x87, 0xab},
1657	{0x88, 0xc4},
1658	{0x89, 0xd1},
1659	{0x8a, 0xe5},
1660	{OV7670_R14_COM9, 0x1e},
1661	{OV7670_R24_AEW, 0x80},
1662	{OV7670_R25_AEB, 0x72},
1663	{OV7670_R26_VPT, 0xb3},
1664	{0x62, 0x80},			/* LCC1 */
1665	{0x63, 0x80},			/* LCC2 */
1666	{0x64, 0x06},			/* LCC3 */
1667	{0x65, 0x00},			/* LCC4 */
1668	{0x66, 0x01},			/* LCC5 */
1669	{0x94, 0x0e},			/* RSVD.. */
1670	{0x95, 0x14},
1671	{OV7670_R13_COM8, OV7670_COM8_FASTAEC
1672			| OV7670_COM8_AECSTEP
1673			| OV7670_COM8_BFILT
1674			| 0x10
1675			| OV7670_COM8_AGC
1676			| OV7670_COM8_AWB
1677			| OV7670_COM8_AEC},
1678	{0xa1, 0xc8}
1679};
1680static const struct ov_i2c_regvals norm_9600[] = {
1681	{0x12, 0x80},
1682	{0x0c, 0x28},
1683	{0x11, 0x80},
1684	{0x13, 0xb5},
1685	{0x14, 0x3e},
1686	{0x1b, 0x04},
1687	{0x24, 0xb0},
1688	{0x25, 0x90},
1689	{0x26, 0x94},
1690	{0x35, 0x90},
1691	{0x37, 0x07},
1692	{0x38, 0x08},
1693	{0x01, 0x8e},
1694	{0x02, 0x85}
1695};
1696
1697/* 7670. Defaults taken from OmniVision provided data,
1698*  as provided by Jonathan Corbet of OLPC		*/
1699static const struct ov_i2c_regvals norm_7670[] = {
1700	{ OV7670_R12_COM7, OV7670_COM7_RESET },
1701	{ OV7670_R3A_TSLB, 0x04 },		/* OV */
1702	{ OV7670_R12_COM7, OV7670_COM7_FMT_VGA }, /* VGA */
1703	{ OV7670_R11_CLKRC, 0x01 },
1704/*
1705 * Set the hardware window.  These values from OV don't entirely
1706 * make sense - hstop is less than hstart.  But they work...
1707 */
1708	{ OV7670_R17_HSTART, 0x13 },
1709	{ OV7670_R18_HSTOP, 0x01 },
1710	{ OV7670_R32_HREF, 0xb6 },
1711	{ OV7670_R19_VSTART, 0x02 },
1712	{ OV7670_R1A_VSTOP, 0x7a },
1713	{ OV7670_R03_VREF, 0x0a },
1714
1715	{ OV7670_R0C_COM3, 0x00 },
1716	{ OV7670_R3E_COM14, 0x00 },
1717/* Mystery scaling numbers */
1718	{ 0x70, 0x3a },
1719	{ 0x71, 0x35 },
1720	{ 0x72, 0x11 },
1721	{ 0x73, 0xf0 },
1722	{ 0xa2, 0x02 },
1723/*	{ OV7670_R15_COM10, 0x0 }, */
1724
1725/* Gamma curve values */
1726	{ 0x7a, 0x20 },
1727	{ 0x7b, 0x10 },
1728	{ 0x7c, 0x1e },
1729	{ 0x7d, 0x35 },
1730	{ 0x7e, 0x5a },
1731	{ 0x7f, 0x69 },
1732	{ 0x80, 0x76 },
1733	{ 0x81, 0x80 },
1734	{ 0x82, 0x88 },
1735	{ 0x83, 0x8f },
1736	{ 0x84, 0x96 },
1737	{ 0x85, 0xa3 },
1738	{ 0x86, 0xaf },
1739	{ 0x87, 0xc4 },
1740	{ 0x88, 0xd7 },
1741	{ 0x89, 0xe8 },
1742
1743/* AGC and AEC parameters.  Note we start by disabling those features,
1744   then turn them only after tweaking the values. */
1745	{ OV7670_R13_COM8, OV7670_COM8_FASTAEC
1746			 | OV7670_COM8_AECSTEP
1747			 | OV7670_COM8_BFILT },
1748	{ OV7670_R00_GAIN, 0x00 },
1749	{ OV7670_R10_AECH, 0x00 },
1750	{ OV7670_R0D_COM4, 0x40 }, /* magic reserved bit */
1751	{ OV7670_R14_COM9, 0x18 }, /* 4x gain + magic rsvd bit */
1752	{ OV7670_RA5_BD50MAX, 0x05 },
1753	{ OV7670_RAB_BD60MAX, 0x07 },
1754	{ OV7670_R24_AEW, 0x95 },
1755	{ OV7670_R25_AEB, 0x33 },
1756	{ OV7670_R26_VPT, 0xe3 },
1757	{ OV7670_R9F_HAECC1, 0x78 },
1758	{ OV7670_RA0_HAECC2, 0x68 },
1759	{ 0xa1, 0x03 }, /* magic */
1760	{ OV7670_RA6_HAECC3, 0xd8 },
1761	{ OV7670_RA7_HAECC4, 0xd8 },
1762	{ OV7670_RA8_HAECC5, 0xf0 },
1763	{ OV7670_RA9_HAECC6, 0x90 },
1764	{ OV7670_RAA_HAECC7, 0x94 },
1765	{ OV7670_R13_COM8, OV7670_COM8_FASTAEC
1766			| OV7670_COM8_AECSTEP
1767			| OV7670_COM8_BFILT
1768			| OV7670_COM8_AGC
1769			| OV7670_COM8_AEC },
1770
1771/* Almost all of these are magic "reserved" values.  */
1772	{ OV7670_R0E_COM5, 0x61 },
1773	{ OV7670_R0F_COM6, 0x4b },
1774	{ 0x16, 0x02 },
1775	{ OV7670_R1E_MVFP, 0x07 },
1776	{ 0x21, 0x02 },
1777	{ 0x22, 0x91 },
1778	{ 0x29, 0x07 },
1779	{ 0x33, 0x0b },
1780	{ 0x35, 0x0b },
1781	{ 0x37, 0x1d },
1782	{ 0x38, 0x71 },
1783	{ 0x39, 0x2a },
1784	{ OV7670_R3C_COM12, 0x78 },
1785	{ 0x4d, 0x40 },
1786	{ 0x4e, 0x20 },
1787	{ OV7670_R69_GFIX, 0x00 },
1788	{ 0x6b, 0x4a },
1789	{ 0x74, 0x10 },
1790	{ 0x8d, 0x4f },
1791	{ 0x8e, 0x00 },
1792	{ 0x8f, 0x00 },
1793	{ 0x90, 0x00 },
1794	{ 0x91, 0x00 },
1795	{ 0x96, 0x00 },
1796	{ 0x9a, 0x00 },
1797	{ 0xb0, 0x84 },
1798	{ 0xb1, 0x0c },
1799	{ 0xb2, 0x0e },
1800	{ 0xb3, 0x82 },
1801	{ 0xb8, 0x0a },
1802
1803/* More reserved magic, some of which tweaks white balance */
1804	{ 0x43, 0x0a },
1805	{ 0x44, 0xf0 },
1806	{ 0x45, 0x34 },
1807	{ 0x46, 0x58 },
1808	{ 0x47, 0x28 },
1809	{ 0x48, 0x3a },
1810	{ 0x59, 0x88 },
1811	{ 0x5a, 0x88 },
1812	{ 0x5b, 0x44 },
1813	{ 0x5c, 0x67 },
1814	{ 0x5d, 0x49 },
1815	{ 0x5e, 0x0e },
1816	{ 0x6c, 0x0a },
1817	{ 0x6d, 0x55 },
1818	{ 0x6e, 0x11 },
1819	{ 0x6f, 0x9f },			/* "9e for advance AWB" */
1820	{ 0x6a, 0x40 },
1821	{ OV7670_R01_BLUE, 0x40 },
1822	{ OV7670_R02_RED, 0x60 },
1823	{ OV7670_R13_COM8, OV7670_COM8_FASTAEC
1824			| OV7670_COM8_AECSTEP
1825			| OV7670_COM8_BFILT
1826			| OV7670_COM8_AGC
1827			| OV7670_COM8_AEC
1828			| OV7670_COM8_AWB },
1829
1830/* Matrix coefficients */
1831	{ 0x4f, 0x80 },
1832	{ 0x50, 0x80 },
1833	{ 0x51, 0x00 },
1834	{ 0x52, 0x22 },
1835	{ 0x53, 0x5e },
1836	{ 0x54, 0x80 },
1837	{ 0x58, 0x9e },
1838
1839	{ OV7670_R41_COM16, OV7670_COM16_AWBGAIN },
1840	{ OV7670_R3F_EDGE, 0x00 },
1841	{ 0x75, 0x05 },
1842	{ 0x76, 0xe1 },
1843	{ 0x4c, 0x00 },
1844	{ 0x77, 0x01 },
1845	{ OV7670_R3D_COM13, OV7670_COM13_GAMMA
1846			  | OV7670_COM13_UVSAT
1847			  | 2},		/* was 3 */
1848	{ 0x4b, 0x09 },
1849	{ 0xc9, 0x60 },
1850	{ OV7670_R41_COM16, 0x38 },
1851	{ 0x56, 0x40 },
1852
1853	{ 0x34, 0x11 },
1854	{ OV7670_R3B_COM11, OV7670_COM11_EXP|OV7670_COM11_HZAUTO },
1855	{ 0xa4, 0x88 },
1856	{ 0x96, 0x00 },
1857	{ 0x97, 0x30 },
1858	{ 0x98, 0x20 },
1859	{ 0x99, 0x30 },
1860	{ 0x9a, 0x84 },
1861	{ 0x9b, 0x29 },
1862	{ 0x9c, 0x03 },
1863	{ 0x9d, 0x4c },
1864	{ 0x9e, 0x3f },
1865	{ 0x78, 0x04 },
1866
1867/* Extra-weird stuff.  Some sort of multiplexor register */
1868	{ 0x79, 0x01 },
1869	{ 0xc8, 0xf0 },
1870	{ 0x79, 0x0f },
1871	{ 0xc8, 0x00 },
1872	{ 0x79, 0x10 },
1873	{ 0xc8, 0x7e },
1874	{ 0x79, 0x0a },
1875	{ 0xc8, 0x80 },
1876	{ 0x79, 0x0b },
1877	{ 0xc8, 0x01 },
1878	{ 0x79, 0x0c },
1879	{ 0xc8, 0x0f },
1880	{ 0x79, 0x0d },
1881	{ 0xc8, 0x20 },
1882	{ 0x79, 0x09 },
1883	{ 0xc8, 0x80 },
1884	{ 0x79, 0x02 },
1885	{ 0xc8, 0xc0 },
1886	{ 0x79, 0x03 },
1887	{ 0xc8, 0x40 },
1888	{ 0x79, 0x05 },
1889	{ 0xc8, 0x30 },
1890	{ 0x79, 0x26 },
1891};
1892
1893static const struct ov_i2c_regvals norm_8610[] = {
1894	{ 0x12, 0x80 },
1895	{ 0x00, 0x00 },
1896	{ 0x01, 0x80 },
1897	{ 0x02, 0x80 },
1898	{ 0x03, 0xc0 },
1899	{ 0x04, 0x30 },
1900	{ 0x05, 0x30 }, /* was 0x10, new from windrv 090403 */
1901	{ 0x06, 0x70 }, /* was 0x80, new from windrv 090403 */
1902	{ 0x0a, 0x86 },
1903	{ 0x0b, 0xb0 },
1904	{ 0x0c, 0x20 },
1905	{ 0x0d, 0x20 },
1906	{ 0x11, 0x01 },
1907	{ 0x12, 0x25 },
1908	{ 0x13, 0x01 },
1909	{ 0x14, 0x04 },
1910	{ 0x15, 0x01 }, /* Lin and Win think different about UV order */
1911	{ 0x16, 0x03 },
1912	{ 0x17, 0x38 }, /* was 0x2f, new from windrv 090403 */
1913	{ 0x18, 0xea }, /* was 0xcf, new from windrv 090403 */
1914	{ 0x19, 0x02 }, /* was 0x06, new from windrv 090403 */
1915	{ 0x1a, 0xf5 },
1916	{ 0x1b, 0x00 },
1917	{ 0x20, 0xd0 }, /* was 0x90, new from windrv 090403 */
1918	{ 0x23, 0xc0 }, /* was 0x00, new from windrv 090403 */
1919	{ 0x24, 0x30 }, /* was 0x1d, new from windrv 090403 */
1920	{ 0x25, 0x50 }, /* was 0x57, new from windrv 090403 */
1921	{ 0x26, 0xa2 },
1922	{ 0x27, 0xea },
1923	{ 0x28, 0x00 },
1924	{ 0x29, 0x00 },
1925	{ 0x2a, 0x80 },
1926	{ 0x2b, 0xc8 }, /* was 0xcc, new from windrv 090403 */
1927	{ 0x2c, 0xac },
1928	{ 0x2d, 0x45 }, /* was 0xd5, new from windrv 090403 */
1929	{ 0x2e, 0x80 },
1930	{ 0x2f, 0x14 }, /* was 0x01, new from windrv 090403 */
1931	{ 0x4c, 0x00 },
1932	{ 0x4d, 0x30 }, /* was 0x10, new from windrv 090403 */
1933	{ 0x60, 0x02 }, /* was 0x01, new from windrv 090403 */
1934	{ 0x61, 0x00 }, /* was 0x09, new from windrv 090403 */
1935	{ 0x62, 0x5f }, /* was 0xd7, new from windrv 090403 */
1936	{ 0x63, 0xff },
1937	{ 0x64, 0x53 }, /* new windrv 090403 says 0x57,
1938			 * maybe that's wrong */
1939	{ 0x65, 0x00 },
1940	{ 0x66, 0x55 },
1941	{ 0x67, 0xb0 },
1942	{ 0x68, 0xc0 }, /* was 0xaf, new from windrv 090403 */
1943	{ 0x69, 0x02 },
1944	{ 0x6a, 0x22 },
1945	{ 0x6b, 0x00 },
1946	{ 0x6c, 0x99 }, /* was 0x80, old windrv says 0x00, but
1947			 * deleting bit7 colors the first images red */
1948	{ 0x6d, 0x11 }, /* was 0x00, new from windrv 090403 */
1949	{ 0x6e, 0x11 }, /* was 0x00, new from windrv 090403 */
1950	{ 0x6f, 0x01 },
1951	{ 0x70, 0x8b },
1952	{ 0x71, 0x00 },
1953	{ 0x72, 0x14 },
1954	{ 0x73, 0x54 },
1955	{ 0x74, 0x00 },/* 0x60? - was 0x00, new from windrv 090403 */
1956	{ 0x75, 0x0e },
1957	{ 0x76, 0x02 }, /* was 0x02, new from windrv 090403 */
1958	{ 0x77, 0xff },
1959	{ 0x78, 0x80 },
1960	{ 0x79, 0x80 },
1961	{ 0x7a, 0x80 },
1962	{ 0x7b, 0x10 }, /* was 0x13, new from windrv 090403 */
1963	{ 0x7c, 0x00 },
1964	{ 0x7d, 0x08 }, /* was 0x09, new from windrv 090403 */
1965	{ 0x7e, 0x08 }, /* was 0xc0, new from windrv 090403 */
1966	{ 0x7f, 0xfb },
1967	{ 0x80, 0x28 },
1968	{ 0x81, 0x00 },
1969	{ 0x82, 0x23 },
1970	{ 0x83, 0x0b },
1971	{ 0x84, 0x00 },
1972	{ 0x85, 0x62 }, /* was 0x61, new from windrv 090403 */
1973	{ 0x86, 0xc9 },
1974	{ 0x87, 0x00 },
1975	{ 0x88, 0x00 },
1976	{ 0x89, 0x01 },
1977	{ 0x12, 0x20 },
1978	{ 0x12, 0x25 }, /* was 0x24, new from windrv 090403 */
1979};
1980
1981static unsigned char ov7670_abs_to_sm(unsigned char v)
1982{
1983	if (v > 127)
1984		return v & 0x7f;
1985	return (128 - v) | 0x80;
1986}
1987
1988/* Write a OV519 register */
1989static void reg_w(struct sd *sd, u16 index, u16 value)
1990{
1991	struct gspca_dev *gspca_dev = (struct gspca_dev *)sd;
1992	int ret, req = 0;
1993
1994	if (sd->gspca_dev.usb_err < 0)
1995		return;
1996
1997	/* Avoid things going to fast for the bridge with a xhci host */
1998	udelay(150);
1999
2000	switch (sd->bridge) {
2001	case BRIDGE_OV511:
2002	case BRIDGE_OV511PLUS:
2003		req = 2;
2004		break;
2005	case BRIDGE_OVFX2:
2006		req = 0x0a;
2007		fallthrough;
2008	case BRIDGE_W9968CF:
2009		gspca_dbg(gspca_dev, D_USBO, "SET %02x %04x %04x\n",
2010			  req, value, index);
2011		ret = usb_control_msg(sd->gspca_dev.dev,
2012			usb_sndctrlpipe(sd->gspca_dev.dev, 0),
2013			req,
2014			USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
2015			value, index, NULL, 0, 500);
2016		goto leave;
2017	default:
2018		req = 1;
2019	}
2020
2021	gspca_dbg(gspca_dev, D_USBO, "SET %02x 0000 %04x %02x\n",
2022		  req, index, value);
2023	sd->gspca_dev.usb_buf[0] = value;
2024	ret = usb_control_msg(sd->gspca_dev.dev,
2025			usb_sndctrlpipe(sd->gspca_dev.dev, 0),
2026			req,
2027			USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
2028			0, index,
2029			sd->gspca_dev.usb_buf, 1, 500);
2030leave:
2031	if (ret < 0) {
2032		gspca_err(gspca_dev, "reg_w %02x failed %d\n", index, ret);
2033		sd->gspca_dev.usb_err = ret;
2034		return;
2035	}
2036}
2037
2038/* Read from a OV519 register, note not valid for the w9968cf!! */
2039/* returns: negative is error, pos or zero is data */
2040static int reg_r(struct sd *sd, u16 index)
2041{
2042	struct gspca_dev *gspca_dev = (struct gspca_dev *)sd;
2043	int ret;
2044	int req;
2045
2046	if (sd->gspca_dev.usb_err < 0)
2047		return -1;
2048
2049	switch (sd->bridge) {
2050	case BRIDGE_OV511:
2051	case BRIDGE_OV511PLUS:
2052		req = 3;
2053		break;
2054	case BRIDGE_OVFX2:
2055		req = 0x0b;
2056		break;
2057	default:
2058		req = 1;
2059	}
2060
2061	/* Avoid things going to fast for the bridge with a xhci host */
2062	udelay(150);
2063	ret = usb_control_msg(sd->gspca_dev.dev,
2064			usb_rcvctrlpipe(sd->gspca_dev.dev, 0),
2065			req,
2066			USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
2067			0, index, sd->gspca_dev.usb_buf, 1, 500);
2068
2069	if (ret >= 0) {
2070		ret = sd->gspca_dev.usb_buf[0];
2071		gspca_dbg(gspca_dev, D_USBI, "GET %02x 0000 %04x %02x\n",
2072			  req, index, ret);
2073	} else {
2074		gspca_err(gspca_dev, "reg_r %02x failed %d\n", index, ret);
2075		sd->gspca_dev.usb_err = ret;
2076		/*
2077		 * Make sure the result is zeroed to avoid uninitialized
2078		 * values.
2079		 */
2080		gspca_dev->usb_buf[0] = 0;
2081	}
2082
2083	return ret;
2084}
2085
2086/* Read 8 values from a OV519 register */
2087static int reg_r8(struct sd *sd,
2088		  u16 index)
2089{
2090	struct gspca_dev *gspca_dev = (struct gspca_dev *)sd;
2091	int ret;
2092
2093	if (sd->gspca_dev.usb_err < 0)
2094		return -1;
2095
2096	/* Avoid things going to fast for the bridge with a xhci host */
2097	udelay(150);
2098	ret = usb_control_msg(sd->gspca_dev.dev,
2099			usb_rcvctrlpipe(sd->gspca_dev.dev, 0),
2100			1,			/* REQ_IO */
2101			USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
2102			0, index, sd->gspca_dev.usb_buf, 8, 500);
2103
2104	if (ret >= 0) {
2105		ret = sd->gspca_dev.usb_buf[0];
2106	} else {
2107		gspca_err(gspca_dev, "reg_r8 %02x failed %d\n", index, ret);
2108		sd->gspca_dev.usb_err = ret;
2109		/*
2110		 * Make sure the buffer is zeroed to avoid uninitialized
2111		 * values.
2112		 */
2113		memset(gspca_dev->usb_buf, 0, 8);
2114	}
2115
2116	return ret;
2117}
2118
2119/*
2120 * Writes bits at positions specified by mask to an OV51x reg. Bits that are in
2121 * the same position as 1's in "mask" are cleared and set to "value". Bits
2122 * that are in the same position as 0's in "mask" are preserved, regardless
2123 * of their respective state in "value".
2124 */
2125static void reg_w_mask(struct sd *sd,
2126			u16 index,
2127			u8 value,
2128			u8 mask)
2129{
2130	int ret;
2131	u8 oldval;
2132
2133	if (mask != 0xff) {
2134		value &= mask;			/* Enforce mask on value */
2135		ret = reg_r(sd, index);
2136		if (ret < 0)
2137			return;
2138
2139		oldval = ret & ~mask;		/* Clear the masked bits */
2140		value |= oldval;		/* Set the desired bits */
2141	}
2142	reg_w(sd, index, value);
2143}
2144
2145/*
2146 * Writes multiple (n) byte value to a single register. Only valid with certain
2147 * registers (0x30 and 0xc4 - 0xce).
2148 */
2149static void ov518_reg_w32(struct sd *sd, u16 index, u32 value, int n)
2150{
2151	struct gspca_dev *gspca_dev = (struct gspca_dev *)sd;
2152	int ret;
2153
2154	if (sd->gspca_dev.usb_err < 0)
2155		return;
2156
2157	*((__le32 *) sd->gspca_dev.usb_buf) = __cpu_to_le32(value);
2158
2159	/* Avoid things going to fast for the bridge with a xhci host */
2160	udelay(150);
2161	ret = usb_control_msg(sd->gspca_dev.dev,
2162			usb_sndctrlpipe(sd->gspca_dev.dev, 0),
2163			1 /* REG_IO */,
2164			USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
2165			0, index,
2166			sd->gspca_dev.usb_buf, n, 500);
2167	if (ret < 0) {
2168		gspca_err(gspca_dev, "reg_w32 %02x failed %d\n", index, ret);
2169		sd->gspca_dev.usb_err = ret;
2170	}
2171}
2172
2173static void ov511_i2c_w(struct sd *sd, u8 reg, u8 value)
2174{
2175	struct gspca_dev *gspca_dev = (struct gspca_dev *)sd;
2176	int rc, retries;
2177
2178	gspca_dbg(gspca_dev, D_USBO, "ov511_i2c_w %02x %02x\n", reg, value);
2179
2180	/* Three byte write cycle */
2181	for (retries = 6; ; ) {
2182		/* Select camera register */
2183		reg_w(sd, R51x_I2C_SADDR_3, reg);
2184
2185		/* Write "value" to I2C data port of OV511 */
2186		reg_w(sd, R51x_I2C_DATA, value);
2187
2188		/* Initiate 3-byte write cycle */
2189		reg_w(sd, R511_I2C_CTL, 0x01);
2190
2191		do {
2192			rc = reg_r(sd, R511_I2C_CTL);
2193		} while (rc > 0 && ((rc & 1) == 0)); /* Retry until idle */
2194
2195		if (rc < 0)
2196			return;
2197
2198		if ((rc & 2) == 0) /* Ack? */
2199			break;
2200		if (--retries < 0) {
2201			gspca_dbg(gspca_dev, D_USBO, "i2c write retries exhausted\n");
2202			return;
2203		}
2204	}
2205}
2206
2207static int ov511_i2c_r(struct sd *sd, u8 reg)
2208{
2209	struct gspca_dev *gspca_dev = (struct gspca_dev *)sd;
2210	int rc, value, retries;
2211
2212	/* Two byte write cycle */
2213	for (retries = 6; ; ) {
2214		/* Select camera register */
2215		reg_w(sd, R51x_I2C_SADDR_2, reg);
2216
2217		/* Initiate 2-byte write cycle */
2218		reg_w(sd, R511_I2C_CTL, 0x03);
2219
2220		do {
2221			rc = reg_r(sd, R511_I2C_CTL);
2222		} while (rc > 0 && ((rc & 1) == 0)); /* Retry until idle */
2223
2224		if (rc < 0)
2225			return rc;
2226
2227		if ((rc & 2) == 0) /* Ack? */
2228			break;
2229
2230		/* I2C abort */
2231		reg_w(sd, R511_I2C_CTL, 0x10);
2232
2233		if (--retries < 0) {
2234			gspca_dbg(gspca_dev, D_USBI, "i2c write retries exhausted\n");
2235			return -1;
2236		}
2237	}
2238
2239	/* Two byte read cycle */
2240	for (retries = 6; ; ) {
2241		/* Initiate 2-byte read cycle */
2242		reg_w(sd, R511_I2C_CTL, 0x05);
2243
2244		do {
2245			rc = reg_r(sd, R511_I2C_CTL);
2246		} while (rc > 0 && ((rc & 1) == 0)); /* Retry until idle */
2247
2248		if (rc < 0)
2249			return rc;
2250
2251		if ((rc & 2) == 0) /* Ack? */
2252			break;
2253
2254		/* I2C abort */
2255		reg_w(sd, R511_I2C_CTL, 0x10);
2256
2257		if (--retries < 0) {
2258			gspca_dbg(gspca_dev, D_USBI, "i2c read retries exhausted\n");
2259			return -1;
2260		}
2261	}
2262
2263	value = reg_r(sd, R51x_I2C_DATA);
2264
2265	gspca_dbg(gspca_dev, D_USBI, "ov511_i2c_r %02x %02x\n", reg, value);
2266
2267	/* This is needed to make i2c_w() work */
2268	reg_w(sd, R511_I2C_CTL, 0x05);
2269
2270	return value;
2271}
2272
2273/*
2274 * The OV518 I2C I/O procedure is different, hence, this function.
2275 * This is normally only called from i2c_w(). Note that this function
2276 * always succeeds regardless of whether the sensor is present and working.
2277 */
2278static void ov518_i2c_w(struct sd *sd,
2279		u8 reg,
2280		u8 value)
2281{
2282	struct gspca_dev *gspca_dev = (struct gspca_dev *)sd;
2283
2284	gspca_dbg(gspca_dev, D_USBO, "ov518_i2c_w %02x %02x\n", reg, value);
2285
2286	/* Select camera register */
2287	reg_w(sd, R51x_I2C_SADDR_3, reg);
2288
2289	/* Write "value" to I2C data port of OV511 */
2290	reg_w(sd, R51x_I2C_DATA, value);
2291
2292	/* Initiate 3-byte write cycle */
2293	reg_w(sd, R518_I2C_CTL, 0x01);
2294
2295	/* wait for write complete */
2296	msleep(4);
2297	reg_r8(sd, R518_I2C_CTL);
2298}
2299
2300/*
2301 * returns: negative is error, pos or zero is data
2302 *
2303 * The OV518 I2C I/O procedure is different, hence, this function.
2304 * This is normally only called from i2c_r(). Note that this function
2305 * always succeeds regardless of whether the sensor is present and working.
2306 */
2307static int ov518_i2c_r(struct sd *sd, u8 reg)
2308{
2309	struct gspca_dev *gspca_dev = (struct gspca_dev *)sd;
2310	int value;
2311
2312	/* Select camera register */
2313	reg_w(sd, R51x_I2C_SADDR_2, reg);
2314
2315	/* Initiate 2-byte write cycle */
2316	reg_w(sd, R518_I2C_CTL, 0x03);
2317	reg_r8(sd, R518_I2C_CTL);
2318
2319	/* Initiate 2-byte read cycle */
2320	reg_w(sd, R518_I2C_CTL, 0x05);
2321	reg_r8(sd, R518_I2C_CTL);
2322
2323	value = reg_r(sd, R51x_I2C_DATA);
2324	gspca_dbg(gspca_dev, D_USBI, "ov518_i2c_r %02x %02x\n", reg, value);
2325	return value;
2326}
2327
2328static void ovfx2_i2c_w(struct sd *sd, u8 reg, u8 value)
2329{
2330	struct gspca_dev *gspca_dev = (struct gspca_dev *)sd;
2331	int ret;
2332
2333	if (sd->gspca_dev.usb_err < 0)
2334		return;
2335
2336	ret = usb_control_msg(sd->gspca_dev.dev,
2337			usb_sndctrlpipe(sd->gspca_dev.dev, 0),
2338			0x02,
2339			USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
2340			(u16) value, (u16) reg, NULL, 0, 500);
2341
2342	if (ret < 0) {
2343		gspca_err(gspca_dev, "ovfx2_i2c_w %02x failed %d\n", reg, ret);
2344		sd->gspca_dev.usb_err = ret;
2345	}
2346
2347	gspca_dbg(gspca_dev, D_USBO, "ovfx2_i2c_w %02x %02x\n", reg, value);
2348}
2349
2350static int ovfx2_i2c_r(struct sd *sd, u8 reg)
2351{
2352	struct gspca_dev *gspca_dev = (struct gspca_dev *)sd;
2353	int ret;
2354
2355	if (sd->gspca_dev.usb_err < 0)
2356		return -1;
2357
2358	ret = usb_control_msg(sd->gspca_dev.dev,
2359			usb_rcvctrlpipe(sd->gspca_dev.dev, 0),
2360			0x03,
2361			USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
2362			0, (u16) reg, sd->gspca_dev.usb_buf, 1, 500);
2363
2364	if (ret >= 0) {
2365		ret = sd->gspca_dev.usb_buf[0];
2366		gspca_dbg(gspca_dev, D_USBI, "ovfx2_i2c_r %02x %02x\n",
2367			  reg, ret);
2368	} else {
2369		gspca_err(gspca_dev, "ovfx2_i2c_r %02x failed %d\n", reg, ret);
2370		sd->gspca_dev.usb_err = ret;
2371	}
2372
2373	return ret;
2374}
2375
2376static void i2c_w(struct sd *sd, u8 reg, u8 value)
2377{
2378	if (sd->sensor_reg_cache[reg] == value)
2379		return;
2380
2381	switch (sd->bridge) {
2382	case BRIDGE_OV511:
2383	case BRIDGE_OV511PLUS:
2384		ov511_i2c_w(sd, reg, value);
2385		break;
2386	case BRIDGE_OV518:
2387	case BRIDGE_OV518PLUS:
2388	case BRIDGE_OV519:
2389		ov518_i2c_w(sd, reg, value);
2390		break;
2391	case BRIDGE_OVFX2:
2392		ovfx2_i2c_w(sd, reg, value);
2393		break;
2394	case BRIDGE_W9968CF:
2395		w9968cf_i2c_w(sd, reg, value);
2396		break;
2397	}
2398
2399	if (sd->gspca_dev.usb_err >= 0) {
2400		/* Up on sensor reset empty the register cache */
2401		if (reg == 0x12 && (value & 0x80))
2402			memset(sd->sensor_reg_cache, -1,
2403				sizeof(sd->sensor_reg_cache));
2404		else
2405			sd->sensor_reg_cache[reg] = value;
2406	}
2407}
2408
2409static int i2c_r(struct sd *sd, u8 reg)
2410{
2411	int ret = -1;
2412
2413	if (sd->sensor_reg_cache[reg] != -1)
2414		return sd->sensor_reg_cache[reg];
2415
2416	switch (sd->bridge) {
2417	case BRIDGE_OV511:
2418	case BRIDGE_OV511PLUS:
2419		ret = ov511_i2c_r(sd, reg);
2420		break;
2421	case BRIDGE_OV518:
2422	case BRIDGE_OV518PLUS:
2423	case BRIDGE_OV519:
2424		ret = ov518_i2c_r(sd, reg);
2425		break;
2426	case BRIDGE_OVFX2:
2427		ret = ovfx2_i2c_r(sd, reg);
2428		break;
2429	case BRIDGE_W9968CF:
2430		ret = w9968cf_i2c_r(sd, reg);
2431		break;
2432	}
2433
2434	if (ret >= 0)
2435		sd->sensor_reg_cache[reg] = ret;
2436
2437	return ret;
2438}
2439
2440/* Writes bits at positions specified by mask to an I2C reg. Bits that are in
2441 * the same position as 1's in "mask" are cleared and set to "value". Bits
2442 * that are in the same position as 0's in "mask" are preserved, regardless
2443 * of their respective state in "value".
2444 */
2445static void i2c_w_mask(struct sd *sd,
2446			u8 reg,
2447			u8 value,
2448			u8 mask)
2449{
2450	int rc;
2451	u8 oldval;
2452
2453	value &= mask;			/* Enforce mask on value */
2454	rc = i2c_r(sd, reg);
2455	if (rc < 0)
2456		return;
2457	oldval = rc & ~mask;		/* Clear the masked bits */
2458	value |= oldval;		/* Set the desired bits */
2459	i2c_w(sd, reg, value);
2460}
2461
2462/* Temporarily stops OV511 from functioning. Must do this before changing
2463 * registers while the camera is streaming */
2464static inline void ov51x_stop(struct sd *sd)
2465{
2466	struct gspca_dev *gspca_dev = (struct gspca_dev *)sd;
2467
2468	gspca_dbg(gspca_dev, D_STREAM, "stopping\n");
2469	sd->stopped = 1;
2470	switch (sd->bridge) {
2471	case BRIDGE_OV511:
2472	case BRIDGE_OV511PLUS:
2473		reg_w(sd, R51x_SYS_RESET, 0x3d);
2474		break;
2475	case BRIDGE_OV518:
2476	case BRIDGE_OV518PLUS:
2477		reg_w_mask(sd, R51x_SYS_RESET, 0x3a, 0x3a);
2478		break;
2479	case BRIDGE_OV519:
2480		reg_w(sd, OV519_R51_RESET1, 0x0f);
2481		reg_w(sd, OV519_R51_RESET1, 0x00);
2482		reg_w(sd, 0x22, 0x00);		/* FRAR */
2483		break;
2484	case BRIDGE_OVFX2:
2485		reg_w_mask(sd, 0x0f, 0x00, 0x02);
2486		break;
2487	case BRIDGE_W9968CF:
2488		reg_w(sd, 0x3c, 0x0a05); /* stop USB transfer */
2489		break;
2490	}
2491}
2492
2493/* Restarts OV511 after ov511_stop() is called. Has no effect if it is not
2494 * actually stopped (for performance). */
2495static inline void ov51x_restart(struct sd *sd)
2496{
2497	struct gspca_dev *gspca_dev = (struct gspca_dev *)sd;
2498
2499	gspca_dbg(gspca_dev, D_STREAM, "restarting\n");
2500	if (!sd->stopped)
2501		return;
2502	sd->stopped = 0;
2503
2504	/* Reinitialize the stream */
2505	switch (sd->bridge) {
2506	case BRIDGE_OV511:
2507	case BRIDGE_OV511PLUS:
2508		reg_w(sd, R51x_SYS_RESET, 0x00);
2509		break;
2510	case BRIDGE_OV518:
2511	case BRIDGE_OV518PLUS:
2512		reg_w(sd, 0x2f, 0x80);
2513		reg_w(sd, R51x_SYS_RESET, 0x00);
2514		break;
2515	case BRIDGE_OV519:
2516		reg_w(sd, OV519_R51_RESET1, 0x0f);
2517		reg_w(sd, OV519_R51_RESET1, 0x00);
2518		reg_w(sd, 0x22, 0x1d);		/* FRAR */
2519		break;
2520	case BRIDGE_OVFX2:
2521		reg_w_mask(sd, 0x0f, 0x02, 0x02);
2522		break;
2523	case BRIDGE_W9968CF:
2524		reg_w(sd, 0x3c, 0x8a05); /* USB FIFO enable */
2525		break;
2526	}
2527}
2528
2529static void ov51x_set_slave_ids(struct sd *sd, u8 slave);
2530
2531/* This does an initial reset of an OmniVision sensor and ensures that I2C
2532 * is synchronized. Returns <0 on failure.
2533 */
2534static int init_ov_sensor(struct sd *sd, u8 slave)
2535{
2536	int i;
2537	struct gspca_dev *gspca_dev = (struct gspca_dev *)sd;
2538
2539	ov51x_set_slave_ids(sd, slave);
2540
2541	/* Reset the sensor */
2542	i2c_w(sd, 0x12, 0x80);
2543
2544	/* Wait for it to initialize */
2545	msleep(150);
2546
2547	for (i = 0; i < i2c_detect_tries; i++) {
2548		if (i2c_r(sd, OV7610_REG_ID_HIGH) == 0x7f &&
2549		    i2c_r(sd, OV7610_REG_ID_LOW) == 0xa2) {
2550			gspca_dbg(gspca_dev, D_PROBE, "I2C synced in %d attempt(s)\n",
2551				  i);
2552			return 0;
2553		}
2554
2555		/* Reset the sensor */
2556		i2c_w(sd, 0x12, 0x80);
2557
2558		/* Wait for it to initialize */
2559		msleep(150);
2560
2561		/* Dummy read to sync I2C */
2562		if (i2c_r(sd, 0x00) < 0)
2563			return -1;
2564	}
2565	return -1;
2566}
2567
2568/* Set the read and write slave IDs. The "slave" argument is the write slave,
2569 * and the read slave will be set to (slave + 1).
2570 * This should not be called from outside the i2c I/O functions.
2571 * Sets I2C read and write slave IDs. Returns <0 for error
2572 */
2573static void ov51x_set_slave_ids(struct sd *sd,
2574				u8 slave)
2575{
2576	switch (sd->bridge) {
2577	case BRIDGE_OVFX2:
2578		reg_w(sd, OVFX2_I2C_ADDR, slave);
2579		return;
2580	case BRIDGE_W9968CF:
2581		sd->sensor_addr = slave;
2582		return;
2583	}
2584
2585	reg_w(sd, R51x_I2C_W_SID, slave);
2586	reg_w(sd, R51x_I2C_R_SID, slave + 1);
2587}
2588
2589static void write_regvals(struct sd *sd,
2590			 const struct ov_regvals *regvals,
2591			 int n)
2592{
2593	while (--n >= 0) {
2594		reg_w(sd, regvals->reg, regvals->val);
2595		regvals++;
2596	}
2597}
2598
2599static void write_i2c_regvals(struct sd *sd,
2600			const struct ov_i2c_regvals *regvals,
2601			int n)
2602{
2603	while (--n >= 0) {
2604		i2c_w(sd, regvals->reg, regvals->val);
2605		regvals++;
2606	}
2607}
2608
2609/****************************************************************************
2610 *
2611 * OV511 and sensor configuration
2612 *
2613 ***************************************************************************/
2614
2615/* This initializes the OV2x10 / OV3610 / OV3620 / OV9600 */
2616static void ov_hires_configure(struct sd *sd)
2617{
2618	struct gspca_dev *gspca_dev = (struct gspca_dev *)sd;
2619	int high, low;
2620
2621	if (sd->bridge != BRIDGE_OVFX2) {
2622		gspca_err(gspca_dev, "error hires sensors only supported with ovfx2\n");
2623		return;
2624	}
2625
2626	gspca_dbg(gspca_dev, D_PROBE, "starting ov hires configuration\n");
2627
2628	/* Detect sensor (sub)type */
2629	high = i2c_r(sd, 0x0a);
2630	low = i2c_r(sd, 0x0b);
2631	/* info("%x, %x", high, low); */
2632	switch (high) {
2633	case 0x96:
2634		switch (low) {
2635		case 0x40:
2636			gspca_dbg(gspca_dev, D_PROBE, "Sensor is a OV2610\n");
2637			sd->sensor = SEN_OV2610;
2638			return;
2639		case 0x41:
2640			gspca_dbg(gspca_dev, D_PROBE, "Sensor is a OV2610AE\n");
2641			sd->sensor = SEN_OV2610AE;
2642			return;
2643		case 0xb1:
2644			gspca_dbg(gspca_dev, D_PROBE, "Sensor is a OV9600\n");
2645			sd->sensor = SEN_OV9600;
2646			return;
2647		}
2648		break;
2649	case 0x36:
2650		if ((low & 0x0f) == 0x00) {
2651			gspca_dbg(gspca_dev, D_PROBE, "Sensor is a OV3610\n");
2652			sd->sensor = SEN_OV3610;
2653			return;
2654		}
2655		break;
2656	}
2657	gspca_err(gspca_dev, "Error unknown sensor type: %02x%02x\n",
2658		  high, low);
2659}
2660
2661/* This initializes the OV8110, OV8610 sensor. The OV8110 uses
2662 * the same register settings as the OV8610, since they are very similar.
2663 */
2664static void ov8xx0_configure(struct sd *sd)
2665{
2666	struct gspca_dev *gspca_dev = (struct gspca_dev *)sd;
2667	int rc;
2668
2669	gspca_dbg(gspca_dev, D_PROBE, "starting ov8xx0 configuration\n");
2670
2671	/* Detect sensor (sub)type */
2672	rc = i2c_r(sd, OV7610_REG_COM_I);
2673	if (rc < 0) {
2674		gspca_err(gspca_dev, "Error detecting sensor type\n");
2675		return;
2676	}
2677	if ((rc & 3) == 1)
2678		sd->sensor = SEN_OV8610;
2679	else
2680		gspca_err(gspca_dev, "Unknown image sensor version: %d\n",
2681			  rc & 3);
2682}
2683
2684/* This initializes the OV7610, OV7620, or OV76BE sensor. The OV76BE uses
2685 * the same register settings as the OV7610, since they are very similar.
2686 */
2687static void ov7xx0_configure(struct sd *sd)
2688{
2689	struct gspca_dev *gspca_dev = (struct gspca_dev *)sd;
2690	int rc, high, low;
2691
2692	gspca_dbg(gspca_dev, D_PROBE, "starting OV7xx0 configuration\n");
2693
2694	/* Detect sensor (sub)type */
2695	rc = i2c_r(sd, OV7610_REG_COM_I);
2696
2697	/* add OV7670 here
2698	 * it appears to be wrongly detected as a 7610 by default */
2699	if (rc < 0) {
2700		gspca_err(gspca_dev, "Error detecting sensor type\n");
2701		return;
2702	}
2703	if ((rc & 3) == 3) {
2704		/* quick hack to make OV7670s work */
2705		high = i2c_r(sd, 0x0a);
2706		low = i2c_r(sd, 0x0b);
2707		/* info("%x, %x", high, low); */
2708		if (high == 0x76 && (low & 0xf0) == 0x70) {
2709			gspca_dbg(gspca_dev, D_PROBE, "Sensor is an OV76%02x\n",
2710				  low);
2711			sd->sensor = SEN_OV7670;
2712		} else {
2713			gspca_dbg(gspca_dev, D_PROBE, "Sensor is an OV7610\n");
2714			sd->sensor = SEN_OV7610;
2715		}
2716	} else if ((rc & 3) == 1) {
2717		/* I don't know what's different about the 76BE yet. */
2718		if (i2c_r(sd, 0x15) & 1) {
2719			gspca_dbg(gspca_dev, D_PROBE, "Sensor is an OV7620AE\n");
2720			sd->sensor = SEN_OV7620AE;
2721		} else {
2722			gspca_dbg(gspca_dev, D_PROBE, "Sensor is an OV76BE\n");
2723			sd->sensor = SEN_OV76BE;
2724		}
2725	} else if ((rc & 3) == 0) {
2726		/* try to read product id registers */
2727		high = i2c_r(sd, 0x0a);
2728		if (high < 0) {
2729			gspca_err(gspca_dev, "Error detecting camera chip PID\n");
2730			return;
2731		}
2732		low = i2c_r(sd, 0x0b);
2733		if (low < 0) {
2734			gspca_err(gspca_dev, "Error detecting camera chip VER\n");
2735			return;
2736		}
2737		if (high == 0x76) {
2738			switch (low) {
2739			case 0x30:
2740				gspca_err(gspca_dev, "Sensor is an OV7630/OV7635\n");
2741				gspca_err(gspca_dev, "7630 is not supported by this driver\n");
2742				return;
2743			case 0x40:
2744				gspca_dbg(gspca_dev, D_PROBE, "Sensor is an OV7645\n");
2745				sd->sensor = SEN_OV7640; /* FIXME */
2746				break;
2747			case 0x45:
2748				gspca_dbg(gspca_dev, D_PROBE, "Sensor is an OV7645B\n");
2749				sd->sensor = SEN_OV7640; /* FIXME */
2750				break;
2751			case 0x48:
2752				gspca_dbg(gspca_dev, D_PROBE, "Sensor is an OV7648\n");
2753				sd->sensor = SEN_OV7648;
2754				break;
2755			case 0x60:
2756				gspca_dbg(gspca_dev, D_PROBE, "Sensor is a OV7660\n");
2757				sd->sensor = SEN_OV7660;
2758				break;
2759			default:
2760				gspca_err(gspca_dev, "Unknown sensor: 0x76%02x\n",
2761					  low);
2762				return;
2763			}
2764		} else {
2765			gspca_dbg(gspca_dev, D_PROBE, "Sensor is an OV7620\n");
2766			sd->sensor = SEN_OV7620;
2767		}
2768	} else {
2769		gspca_err(gspca_dev, "Unknown image sensor version: %d\n",
2770			  rc & 3);
2771	}
2772}
2773
2774/* This initializes the OV6620, OV6630, OV6630AE, or OV6630AF sensor. */
2775static void ov6xx0_configure(struct sd *sd)
2776{
2777	struct gspca_dev *gspca_dev = (struct gspca_dev *)sd;
2778	int rc;
2779
2780	gspca_dbg(gspca_dev, D_PROBE, "starting OV6xx0 configuration\n");
2781
2782	/* Detect sensor (sub)type */
2783	rc = i2c_r(sd, OV7610_REG_COM_I);
2784	if (rc < 0) {
2785		gspca_err(gspca_dev, "Error detecting sensor type\n");
2786		return;
2787	}
2788
2789	/* Ugh. The first two bits are the version bits, but
2790	 * the entire register value must be used. I guess OVT
2791	 * underestimated how many variants they would make. */
2792	switch (rc) {
2793	case 0x00:
2794		sd->sensor = SEN_OV6630;
2795		pr_warn("WARNING: Sensor is an OV66308. Your camera may have been misdetected in previous driver versions.\n");
2796		break;
2797	case 0x01:
2798		sd->sensor = SEN_OV6620;
2799		gspca_dbg(gspca_dev, D_PROBE, "Sensor is an OV6620\n");
2800		break;
2801	case 0x02:
2802		sd->sensor = SEN_OV6630;
2803		gspca_dbg(gspca_dev, D_PROBE, "Sensor is an OV66308AE\n");
2804		break;
2805	case 0x03:
2806		sd->sensor = SEN_OV66308AF;
2807		gspca_dbg(gspca_dev, D_PROBE, "Sensor is an OV66308AF\n");
2808		break;
2809	case 0x90:
2810		sd->sensor = SEN_OV6630;
2811		pr_warn("WARNING: Sensor is an OV66307. Your camera may have been misdetected in previous driver versions.\n");
2812		break;
2813	default:
2814		gspca_err(gspca_dev, "FATAL: Unknown sensor version: 0x%02x\n",
2815			  rc);
2816		return;
2817	}
2818
2819	/* Set sensor-specific vars */
2820	sd->sif = 1;
2821}
2822
2823/* Turns on or off the LED. Only has an effect with OV511+/OV518(+)/OV519 */
2824static void ov51x_led_control(struct sd *sd, int on)
2825{
2826	if (sd->invert_led)
2827		on = !on;
2828
2829	switch (sd->bridge) {
2830	/* OV511 has no LED control */
2831	case BRIDGE_OV511PLUS:
2832		reg_w(sd, R511_SYS_LED_CTL, on);
2833		break;
2834	case BRIDGE_OV518:
2835	case BRIDGE_OV518PLUS:
2836		reg_w_mask(sd, R518_GPIO_OUT, 0x02 * on, 0x02);
2837		break;
2838	case BRIDGE_OV519:
2839		reg_w_mask(sd, OV519_GPIO_DATA_OUT0, on, 1);
2840		break;
2841	}
2842}
2843
2844static void sd_reset_snapshot(struct gspca_dev *gspca_dev)
2845{
2846	struct sd *sd = (struct sd *) gspca_dev;
2847
2848	if (!sd->snapshot_needs_reset)
2849		return;
2850
2851	/* Note it is important that we clear sd->snapshot_needs_reset,
2852	   before actually clearing the snapshot state in the bridge
2853	   otherwise we might race with the pkt_scan interrupt handler */
2854	sd->snapshot_needs_reset = 0;
2855
2856	switch (sd->bridge) {
2857	case BRIDGE_OV511:
2858	case BRIDGE_OV511PLUS:
2859		reg_w(sd, R51x_SYS_SNAP, 0x02);
2860		reg_w(sd, R51x_SYS_SNAP, 0x00);
2861		break;
2862	case BRIDGE_OV518:
2863	case BRIDGE_OV518PLUS:
2864		reg_w(sd, R51x_SYS_SNAP, 0x02); /* Reset */
2865		reg_w(sd, R51x_SYS_SNAP, 0x01); /* Enable */
2866		break;
2867	case BRIDGE_OV519:
2868		reg_w(sd, R51x_SYS_RESET, 0x40);
2869		reg_w(sd, R51x_SYS_RESET, 0x00);
2870		break;
2871	}
2872}
2873
2874static void ov51x_upload_quan_tables(struct sd *sd)
2875{
2876	static const unsigned char yQuanTable511[] = {
2877		0, 1, 1, 2, 2, 3, 3, 4,
2878		1, 1, 1, 2, 2, 3, 4, 4,
2879		1, 1, 2, 2, 3, 4, 4, 4,
2880		2, 2, 2, 3, 4, 4, 4, 4,
2881		2, 2, 3, 4, 4, 5, 5, 5,
2882		3, 3, 4, 4, 5, 5, 5, 5,
2883		3, 4, 4, 4, 5, 5, 5, 5,
2884		4, 4, 4, 4, 5, 5, 5, 5
2885	};
2886
2887	static const unsigned char uvQuanTable511[] = {
2888		0, 2, 2, 3, 4, 4, 4, 4,
2889		2, 2, 2, 4, 4, 4, 4, 4,
2890		2, 2, 3, 4, 4, 4, 4, 4,
2891		3, 4, 4, 4, 4, 4, 4, 4,
2892		4, 4, 4, 4, 4, 4, 4, 4,
2893		4, 4, 4, 4, 4, 4, 4, 4,
2894		4, 4, 4, 4, 4, 4, 4, 4,
2895		4, 4, 4, 4, 4, 4, 4, 4
2896	};
2897
2898	/* OV518 quantization tables are 8x4 (instead of 8x8) */
2899	static const unsigned char yQuanTable518[] = {
2900		5, 4, 5, 6, 6, 7, 7, 7,
2901		5, 5, 5, 5, 6, 7, 7, 7,
2902		6, 6, 6, 6, 7, 7, 7, 8,
2903		7, 7, 6, 7, 7, 7, 8, 8
2904	};
2905	static const unsigned char uvQuanTable518[] = {
2906		6, 6, 6, 7, 7, 7, 7, 7,
2907		6, 6, 6, 7, 7, 7, 7, 7,
2908		6, 6, 6, 7, 7, 7, 7, 8,
2909		7, 7, 7, 7, 7, 7, 8, 8
2910	};
2911
2912	struct gspca_dev *gspca_dev = (struct gspca_dev *)sd;
2913	const unsigned char *pYTable, *pUVTable;
2914	unsigned char val0, val1;
2915	int i, size, reg = R51x_COMP_LUT_BEGIN;
2916
2917	gspca_dbg(gspca_dev, D_PROBE, "Uploading quantization tables\n");
2918
2919	if (sd->bridge == BRIDGE_OV511 || sd->bridge == BRIDGE_OV511PLUS) {
2920		pYTable = yQuanTable511;
2921		pUVTable = uvQuanTable511;
2922		size = 32;
2923	} else {
2924		pYTable = yQuanTable518;
2925		pUVTable = uvQuanTable518;
2926		size = 16;
2927	}
2928
2929	for (i = 0; i < size; i++) {
2930		val0 = *pYTable++;
2931		val1 = *pYTable++;
2932		val0 &= 0x0f;
2933		val1 &= 0x0f;
2934		val0 |= val1 << 4;
2935		reg_w(sd, reg, val0);
2936
2937		val0 = *pUVTable++;
2938		val1 = *pUVTable++;
2939		val0 &= 0x0f;
2940		val1 &= 0x0f;
2941		val0 |= val1 << 4;
2942		reg_w(sd, reg + size, val0);
2943
2944		reg++;
2945	}
2946}
2947
2948/* This initializes the OV511/OV511+ and the sensor */
2949static void ov511_configure(struct gspca_dev *gspca_dev)
2950{
2951	struct sd *sd = (struct sd *) gspca_dev;
2952
2953	/* For 511 and 511+ */
2954	static const struct ov_regvals init_511[] = {
2955		{ R51x_SYS_RESET,	0x7f },
2956		{ R51x_SYS_INIT,	0x01 },
2957		{ R51x_SYS_RESET,	0x7f },
2958		{ R51x_SYS_INIT,	0x01 },
2959		{ R51x_SYS_RESET,	0x3f },
2960		{ R51x_SYS_INIT,	0x01 },
2961		{ R51x_SYS_RESET,	0x3d },
2962	};
2963
2964	static const struct ov_regvals norm_511[] = {
2965		{ R511_DRAM_FLOW_CTL,	0x01 },
2966		{ R51x_SYS_SNAP,	0x00 },
2967		{ R51x_SYS_SNAP,	0x02 },
2968		{ R51x_SYS_SNAP,	0x00 },
2969		{ R511_FIFO_OPTS,	0x1f },
2970		{ R511_COMP_EN,		0x00 },
2971		{ R511_COMP_LUT_EN,	0x03 },
2972	};
2973
2974	static const struct ov_regvals norm_511_p[] = {
2975		{ R511_DRAM_FLOW_CTL,	0xff },
2976		{ R51x_SYS_SNAP,	0x00 },
2977		{ R51x_SYS_SNAP,	0x02 },
2978		{ R51x_SYS_SNAP,	0x00 },
2979		{ R511_FIFO_OPTS,	0xff },
2980		{ R511_COMP_EN,		0x00 },
2981		{ R511_COMP_LUT_EN,	0x03 },
2982	};
2983
2984	static const struct ov_regvals compress_511[] = {
2985		{ 0x70, 0x1f },
2986		{ 0x71, 0x05 },
2987		{ 0x72, 0x06 },
2988		{ 0x73, 0x06 },
2989		{ 0x74, 0x14 },
2990		{ 0x75, 0x03 },
2991		{ 0x76, 0x04 },
2992		{ 0x77, 0x04 },
2993	};
2994
2995	gspca_dbg(gspca_dev, D_PROBE, "Device custom id %x\n",
2996		  reg_r(sd, R51x_SYS_CUST_ID));
2997
2998	write_regvals(sd, init_511, ARRAY_SIZE(init_511));
2999
3000	switch (sd->bridge) {
3001	case BRIDGE_OV511:
3002		write_regvals(sd, norm_511, ARRAY_SIZE(norm_511));
3003		break;
3004	case BRIDGE_OV511PLUS:
3005		write_regvals(sd, norm_511_p, ARRAY_SIZE(norm_511_p));
3006		break;
3007	}
3008
3009	/* Init compression */
3010	write_regvals(sd, compress_511, ARRAY_SIZE(compress_511));
3011
3012	ov51x_upload_quan_tables(sd);
3013}
3014
3015/* This initializes the OV518/OV518+ and the sensor */
3016static void ov518_configure(struct gspca_dev *gspca_dev)
3017{
3018	struct sd *sd = (struct sd *) gspca_dev;
3019
3020	/* For 518 and 518+ */
3021	static const struct ov_regvals init_518[] = {
3022		{ R51x_SYS_RESET,	0x40 },
3023		{ R51x_SYS_INIT,	0xe1 },
3024		{ R51x_SYS_RESET,	0x3e },
3025		{ R51x_SYS_INIT,	0xe1 },
3026		{ R51x_SYS_RESET,	0x00 },
3027		{ R51x_SYS_INIT,	0xe1 },
3028		{ 0x46,			0x00 },
3029		{ 0x5d,			0x03 },
3030	};
3031
3032	static const struct ov_regvals norm_518[] = {
3033		{ R51x_SYS_SNAP,	0x02 }, /* Reset */
3034		{ R51x_SYS_SNAP,	0x01 }, /* Enable */
3035		{ 0x31,			0x0f },
3036		{ 0x5d,			0x03 },
3037		{ 0x24,			0x9f },
3038		{ 0x25,			0x90 },
3039		{ 0x20,			0x00 },
3040		{ 0x51,			0x04 },
3041		{ 0x71,			0x19 },
3042		{ 0x2f,			0x80 },
3043	};
3044
3045	static const struct ov_regvals norm_518_p[] = {
3046		{ R51x_SYS_SNAP,	0x02 }, /* Reset */
3047		{ R51x_SYS_SNAP,	0x01 }, /* Enable */
3048		{ 0x31,			0x0f },
3049		{ 0x5d,			0x03 },
3050		{ 0x24,			0x9f },
3051		{ 0x25,			0x90 },
3052		{ 0x20,			0x60 },
3053		{ 0x51,			0x02 },
3054		{ 0x71,			0x19 },
3055		{ 0x40,			0xff },
3056		{ 0x41,			0x42 },
3057		{ 0x46,			0x00 },
3058		{ 0x33,			0x04 },
3059		{ 0x21,			0x19 },
3060		{ 0x3f,			0x10 },
3061		{ 0x2f,			0x80 },
3062	};
3063
3064	/* First 5 bits of custom ID reg are a revision ID on OV518 */
3065	sd->revision = reg_r(sd, R51x_SYS_CUST_ID) & 0x1f;
3066	gspca_dbg(gspca_dev, D_PROBE, "Device revision %d\n", sd->revision);
3067
3068	write_regvals(sd, init_518, ARRAY_SIZE(init_518));
3069
3070	/* Set LED GPIO pin to output mode */
3071	reg_w_mask(sd, R518_GPIO_CTL, 0x00, 0x02);
3072
3073	switch (sd->bridge) {
3074	case BRIDGE_OV518:
3075		write_regvals(sd, norm_518, ARRAY_SIZE(norm_518));
3076		break;
3077	case BRIDGE_OV518PLUS:
3078		write_regvals(sd, norm_518_p, ARRAY_SIZE(norm_518_p));
3079		break;
3080	}
3081
3082	ov51x_upload_quan_tables(sd);
3083
3084	reg_w(sd, 0x2f, 0x80);
3085}
3086
3087static void ov519_configure(struct sd *sd)
3088{
3089	static const struct ov_regvals init_519[] = {
3090		{ 0x5a, 0x6d }, /* EnableSystem */
3091		{ 0x53, 0x9b }, /* don't enable the microcontroller */
3092		{ OV519_R54_EN_CLK1, 0xff }, /* set bit2 to enable jpeg */
3093		{ 0x5d, 0x03 },
3094		{ 0x49, 0x01 },
3095		{ 0x48, 0x00 },
3096		/* Set LED pin to output mode. Bit 4 must be cleared or sensor
3097		 * detection will fail. This deserves further investigation. */
3098		{ OV519_GPIO_IO_CTRL0,   0xee },
3099		{ OV519_R51_RESET1, 0x0f },
3100		{ OV519_R51_RESET1, 0x00 },
3101		{ 0x22, 0x00 },
3102		/* windows reads 0x55 at this point*/
3103	};
3104
3105	write_regvals(sd, init_519, ARRAY_SIZE(init_519));
3106}
3107
3108static void ovfx2_configure(struct sd *sd)
3109{
3110	static const struct ov_regvals init_fx2[] = {
3111		{ 0x00, 0x60 },
3112		{ 0x02, 0x01 },
3113		{ 0x0f, 0x1d },
3114		{ 0xe9, 0x82 },
3115		{ 0xea, 0xc7 },
3116		{ 0xeb, 0x10 },
3117		{ 0xec, 0xf6 },
3118	};
3119
3120	sd->stopped = 1;
3121
3122	write_regvals(sd, init_fx2, ARRAY_SIZE(init_fx2));
3123}
3124
3125/* set the mode */
3126/* This function works for ov7660 only */
3127static void ov519_set_mode(struct sd *sd)
3128{
3129	static const struct ov_regvals bridge_ov7660[2][10] = {
3130		{{0x10, 0x14}, {0x11, 0x1e}, {0x12, 0x00}, {0x13, 0x00},
3131		 {0x14, 0x00}, {0x15, 0x00}, {0x16, 0x00}, {0x20, 0x0c},
3132		 {0x25, 0x01}, {0x26, 0x00}},
3133		{{0x10, 0x28}, {0x11, 0x3c}, {0x12, 0x00}, {0x13, 0x00},
3134		 {0x14, 0x00}, {0x15, 0x00}, {0x16, 0x00}, {0x20, 0x0c},
3135		 {0x25, 0x03}, {0x26, 0x00}}
3136	};
3137	static const struct ov_i2c_regvals sensor_ov7660[2][3] = {
3138		{{0x12, 0x00}, {0x24, 0x00}, {0x0c, 0x0c}},
3139		{{0x12, 0x00}, {0x04, 0x00}, {0x0c, 0x00}}
3140	};
3141	static const struct ov_i2c_regvals sensor_ov7660_2[] = {
3142		{OV7670_R17_HSTART, 0x13},
3143		{OV7670_R18_HSTOP, 0x01},
3144		{OV7670_R32_HREF, 0x92},
3145		{OV7670_R19_VSTART, 0x02},
3146		{OV7670_R1A_VSTOP, 0x7a},
3147		{OV7670_R03_VREF, 0x00},
3148/*		{0x33, 0x00}, */
3149/*		{0x34, 0x07}, */
3150/*		{0x36, 0x00}, */
3151/*		{0x6b, 0x0a}, */
3152	};
3153
3154	write_regvals(sd, bridge_ov7660[sd->gspca_dev.curr_mode],
3155			ARRAY_SIZE(bridge_ov7660[0]));
3156	write_i2c_regvals(sd, sensor_ov7660[sd->gspca_dev.curr_mode],
3157			ARRAY_SIZE(sensor_ov7660[0]));
3158	write_i2c_regvals(sd, sensor_ov7660_2,
3159			ARRAY_SIZE(sensor_ov7660_2));
3160}
3161
3162/* set the frame rate */
3163/* This function works for sensors ov7640, ov7648 ov7660 and ov7670 only */
3164static void ov519_set_fr(struct sd *sd)
3165{
3166	int fr;
3167	u8 clock;
3168	/* frame rate table with indices:
3169	 *	- mode = 0: 320x240, 1: 640x480
3170	 *	- fr rate = 0: 30, 1: 25, 2: 20, 3: 15, 4: 10, 5: 5
3171	 *	- reg = 0: bridge a4, 1: bridge 23, 2: sensor 11 (clock)
3172	 */
3173	static const u8 fr_tb[2][6][3] = {
3174		{{0x04, 0xff, 0x00},
3175		 {0x04, 0x1f, 0x00},
3176		 {0x04, 0x1b, 0x00},
3177		 {0x04, 0x15, 0x00},
3178		 {0x04, 0x09, 0x00},
3179		 {0x04, 0x01, 0x00}},
3180		{{0x0c, 0xff, 0x00},
3181		 {0x0c, 0x1f, 0x00},
3182		 {0x0c, 0x1b, 0x00},
3183		 {0x04, 0xff, 0x01},
3184		 {0x04, 0x1f, 0x01},
3185		 {0x04, 0x1b, 0x01}},
3186	};
3187
3188	if (frame_rate > 0)
3189		sd->frame_rate = frame_rate;
3190	if (sd->frame_rate >= 30)
3191		fr = 0;
3192	else if (sd->frame_rate >= 25)
3193		fr = 1;
3194	else if (sd->frame_rate >= 20)
3195		fr = 2;
3196	else if (sd->frame_rate >= 15)
3197		fr = 3;
3198	else if (sd->frame_rate >= 10)
3199		fr = 4;
3200	else
3201		fr = 5;
3202	reg_w(sd, 0xa4, fr_tb[sd->gspca_dev.curr_mode][fr][0]);
3203	reg_w(sd, 0x23, fr_tb[sd->gspca_dev.curr_mode][fr][1]);
3204	clock = fr_tb[sd->gspca_dev.curr_mode][fr][2];
3205	if (sd->sensor == SEN_OV7660)
3206		clock |= 0x80;		/* enable double clock */
3207	ov518_i2c_w(sd, OV7670_R11_CLKRC, clock);
3208}
3209
3210static void setautogain(struct gspca_dev *gspca_dev, s32 val)
3211{
3212	struct sd *sd = (struct sd *) gspca_dev;
3213
3214	i2c_w_mask(sd, 0x13, val ? 0x05 : 0x00, 0x05);
3215}
3216
3217/* this function is called at probe time */
3218static int sd_config(struct gspca_dev *gspca_dev,
3219			const struct usb_device_id *id)
3220{
3221	struct sd *sd = (struct sd *) gspca_dev;
3222	struct cam *cam = &gspca_dev->cam;
3223
3224	sd->bridge = id->driver_info & BRIDGE_MASK;
3225	sd->invert_led = (id->driver_info & BRIDGE_INVERT_LED) != 0;
3226
3227	switch (sd->bridge) {
3228	case BRIDGE_OV511:
3229	case BRIDGE_OV511PLUS:
3230		cam->cam_mode = ov511_vga_mode;
3231		cam->nmodes = ARRAY_SIZE(ov511_vga_mode);
3232		break;
3233	case BRIDGE_OV518:
3234	case BRIDGE_OV518PLUS:
3235		cam->cam_mode = ov518_vga_mode;
3236		cam->nmodes = ARRAY_SIZE(ov518_vga_mode);
3237		break;
3238	case BRIDGE_OV519:
3239		cam->cam_mode = ov519_vga_mode;
3240		cam->nmodes = ARRAY_SIZE(ov519_vga_mode);
3241		break;
3242	case BRIDGE_OVFX2:
3243		cam->cam_mode = ov519_vga_mode;
3244		cam->nmodes = ARRAY_SIZE(ov519_vga_mode);
3245		cam->bulk_size = OVFX2_BULK_SIZE;
3246		cam->bulk_nurbs = MAX_NURBS;
3247		cam->bulk = 1;
3248		break;
3249	case BRIDGE_W9968CF:
3250		cam->cam_mode = w9968cf_vga_mode;
3251		cam->nmodes = ARRAY_SIZE(w9968cf_vga_mode);
3252		break;
3253	}
3254
3255	sd->frame_rate = 15;
3256
3257	return 0;
3258}
3259
3260/* this function is called at probe and resume time */
3261static int sd_init(struct gspca_dev *gspca_dev)
3262{
3263	struct sd *sd = (struct sd *) gspca_dev;
3264	struct cam *cam = &gspca_dev->cam;
3265
3266	switch (sd->bridge) {
3267	case BRIDGE_OV511:
3268	case BRIDGE_OV511PLUS:
3269		ov511_configure(gspca_dev);
3270		break;
3271	case BRIDGE_OV518:
3272	case BRIDGE_OV518PLUS:
3273		ov518_configure(gspca_dev);
3274		break;
3275	case BRIDGE_OV519:
3276		ov519_configure(sd);
3277		break;
3278	case BRIDGE_OVFX2:
3279		ovfx2_configure(sd);
3280		break;
3281	case BRIDGE_W9968CF:
3282		w9968cf_configure(sd);
3283		break;
3284	}
3285
3286	/* The OV519 must be more aggressive about sensor detection since
3287	 * I2C write will never fail if the sensor is not present. We have
3288	 * to try to initialize the sensor to detect its presence */
3289	sd->sensor = -1;
3290
3291	/* Test for 76xx */
3292	if (init_ov_sensor(sd, OV7xx0_SID) >= 0) {
3293		ov7xx0_configure(sd);
3294
3295	/* Test for 6xx0 */
3296	} else if (init_ov_sensor(sd, OV6xx0_SID) >= 0) {
3297		ov6xx0_configure(sd);
3298
3299	/* Test for 8xx0 */
3300	} else if (init_ov_sensor(sd, OV8xx0_SID) >= 0) {
3301		ov8xx0_configure(sd);
3302
3303	/* Test for 3xxx / 2xxx */
3304	} else if (init_ov_sensor(sd, OV_HIRES_SID) >= 0) {
3305		ov_hires_configure(sd);
3306	} else {
3307		gspca_err(gspca_dev, "Can't determine sensor slave IDs\n");
3308		goto error;
3309	}
3310
3311	if (sd->sensor < 0)
3312		goto error;
3313
3314	ov51x_led_control(sd, 0);	/* turn LED off */
3315
3316	switch (sd->bridge) {
3317	case BRIDGE_OV511:
3318	case BRIDGE_OV511PLUS:
3319		if (sd->sif) {
3320			cam->cam_mode = ov511_sif_mode;
3321			cam->nmodes = ARRAY_SIZE(ov511_sif_mode);
3322		}
3323		break;
3324	case BRIDGE_OV518:
3325	case BRIDGE_OV518PLUS:
3326		if (sd->sif) {
3327			cam->cam_mode = ov518_sif_mode;
3328			cam->nmodes = ARRAY_SIZE(ov518_sif_mode);
3329		}
3330		break;
3331	case BRIDGE_OV519:
3332		if (sd->sif) {
3333			cam->cam_mode = ov519_sif_mode;
3334			cam->nmodes = ARRAY_SIZE(ov519_sif_mode);
3335		}
3336		break;
3337	case BRIDGE_OVFX2:
3338		switch (sd->sensor) {
3339		case SEN_OV2610:
3340		case SEN_OV2610AE:
3341			cam->cam_mode = ovfx2_ov2610_mode;
3342			cam->nmodes = ARRAY_SIZE(ovfx2_ov2610_mode);
3343			break;
3344		case SEN_OV3610:
3345			cam->cam_mode = ovfx2_ov3610_mode;
3346			cam->nmodes = ARRAY_SIZE(ovfx2_ov3610_mode);
3347			break;
3348		case SEN_OV9600:
3349			cam->cam_mode = ovfx2_ov9600_mode;
3350			cam->nmodes = ARRAY_SIZE(ovfx2_ov9600_mode);
3351			break;
3352		default:
3353			if (sd->sif) {
3354				cam->cam_mode = ov519_sif_mode;
3355				cam->nmodes = ARRAY_SIZE(ov519_sif_mode);
3356			}
3357			break;
3358		}
3359		break;
3360	case BRIDGE_W9968CF:
3361		if (sd->sif)
3362			cam->nmodes = ARRAY_SIZE(w9968cf_vga_mode) - 1;
3363
3364		/* w9968cf needs initialisation once the sensor is known */
3365		w9968cf_init(sd);
3366		break;
3367	}
3368
3369	/* initialize the sensor */
3370	switch (sd->sensor) {
3371	case SEN_OV2610:
3372		write_i2c_regvals(sd, norm_2610, ARRAY_SIZE(norm_2610));
3373
3374		/* Enable autogain, autoexpo, awb, bandfilter */
3375		i2c_w_mask(sd, 0x13, 0x27, 0x27);
3376		break;
3377	case SEN_OV2610AE:
3378		write_i2c_regvals(sd, norm_2610ae, ARRAY_SIZE(norm_2610ae));
3379
3380		/* enable autoexpo */
3381		i2c_w_mask(sd, 0x13, 0x05, 0x05);
3382		break;
3383	case SEN_OV3610:
3384		write_i2c_regvals(sd, norm_3620b, ARRAY_SIZE(norm_3620b));
3385
3386		/* Enable autogain, autoexpo, awb, bandfilter */
3387		i2c_w_mask(sd, 0x13, 0x27, 0x27);
3388		break;
3389	case SEN_OV6620:
3390		write_i2c_regvals(sd, norm_6x20, ARRAY_SIZE(norm_6x20));
3391		break;
3392	case SEN_OV6630:
3393	case SEN_OV66308AF:
3394		write_i2c_regvals(sd, norm_6x30, ARRAY_SIZE(norm_6x30));
3395		break;
3396	default:
3397/*	case SEN_OV7610: */
3398/*	case SEN_OV76BE: */
3399		write_i2c_regvals(sd, norm_7610, ARRAY_SIZE(norm_7610));
3400		i2c_w_mask(sd, 0x0e, 0x00, 0x40);
3401		break;
3402	case SEN_OV7620:
3403	case SEN_OV7620AE:
3404		write_i2c_regvals(sd, norm_7620, ARRAY_SIZE(norm_7620));
3405		break;
3406	case SEN_OV7640:
3407	case SEN_OV7648:
3408		write_i2c_regvals(sd, norm_7640, ARRAY_SIZE(norm_7640));
3409		break;
3410	case SEN_OV7660:
3411		i2c_w(sd, OV7670_R12_COM7, OV7670_COM7_RESET);
3412		msleep(14);
3413		reg_w(sd, OV519_R57_SNAPSHOT, 0x23);
3414		write_regvals(sd, init_519_ov7660,
3415				ARRAY_SIZE(init_519_ov7660));
3416		write_i2c_regvals(sd, norm_7660, ARRAY_SIZE(norm_7660));
3417		sd->gspca_dev.curr_mode = 1;	/* 640x480 */
3418		ov519_set_mode(sd);
3419		ov519_set_fr(sd);
3420		sd_reset_snapshot(gspca_dev);
3421		ov51x_restart(sd);
3422		ov51x_stop(sd);			/* not in win traces */
3423		ov51x_led_control(sd, 0);
3424		break;
3425	case SEN_OV7670:
3426		write_i2c_regvals(sd, norm_7670, ARRAY_SIZE(norm_7670));
3427		break;
3428	case SEN_OV8610:
3429		write_i2c_regvals(sd, norm_8610, ARRAY_SIZE(norm_8610));
3430		break;
3431	case SEN_OV9600:
3432		write_i2c_regvals(sd, norm_9600, ARRAY_SIZE(norm_9600));
3433
3434		/* enable autoexpo */
3435/*		i2c_w_mask(sd, 0x13, 0x05, 0x05); */
3436		break;
3437	}
3438	return gspca_dev->usb_err;
3439error:
3440	gspca_err(gspca_dev, "OV519 Config failed\n");
3441	return -EINVAL;
3442}
3443
3444/* function called at start time before URB creation */
3445static int sd_isoc_init(struct gspca_dev *gspca_dev)
3446{
3447	struct sd *sd = (struct sd *) gspca_dev;
3448
3449	switch (sd->bridge) {
3450	case BRIDGE_OVFX2:
3451		if (gspca_dev->pixfmt.width != 800)
3452			gspca_dev->cam.bulk_size = OVFX2_BULK_SIZE;
3453		else
3454			gspca_dev->cam.bulk_size = 7 * 4096;
3455		break;
3456	}
3457	return 0;
3458}
3459
3460/* Set up the OV511/OV511+ with the given image parameters.
3461 *
3462 * Do not put any sensor-specific code in here (including I2C I/O functions)
3463 */
3464static void ov511_mode_init_regs(struct sd *sd)
3465{
3466	struct gspca_dev *gspca_dev = (struct gspca_dev *)sd;
3467	int hsegs, vsegs, packet_size, fps, needed;
3468	int interlaced = 0;
3469	struct usb_host_interface *alt;
3470	struct usb_interface *intf;
3471
3472	intf = usb_ifnum_to_if(sd->gspca_dev.dev, sd->gspca_dev.iface);
3473	alt = usb_altnum_to_altsetting(intf, sd->gspca_dev.alt);
3474	if (!alt) {
3475		gspca_err(gspca_dev, "Couldn't get altsetting\n");
3476		sd->gspca_dev.usb_err = -EIO;
3477		return;
3478	}
3479
3480	if (alt->desc.bNumEndpoints < 1) {
3481		sd->gspca_dev.usb_err = -ENODEV;
3482		return;
3483	}
3484
3485	packet_size = le16_to_cpu(alt->endpoint[0].desc.wMaxPacketSize);
3486	reg_w(sd, R51x_FIFO_PSIZE, packet_size >> 5);
3487
3488	reg_w(sd, R511_CAM_UV_EN, 0x01);
3489	reg_w(sd, R511_SNAP_UV_EN, 0x01);
3490	reg_w(sd, R511_SNAP_OPTS, 0x03);
3491
3492	/* Here I'm assuming that snapshot size == image size.
3493	 * I hope that's always true. --claudio
3494	 */
3495	hsegs = (sd->gspca_dev.pixfmt.width >> 3) - 1;
3496	vsegs = (sd->gspca_dev.pixfmt.height >> 3) - 1;
3497
3498	reg_w(sd, R511_CAM_PXCNT, hsegs);
3499	reg_w(sd, R511_CAM_LNCNT, vsegs);
3500	reg_w(sd, R511_CAM_PXDIV, 0x00);
3501	reg_w(sd, R511_CAM_LNDIV, 0x00);
3502
3503	/* YUV420, low pass filter on */
3504	reg_w(sd, R511_CAM_OPTS, 0x03);
3505
3506	/* Snapshot additions */
3507	reg_w(sd, R511_SNAP_PXCNT, hsegs);
3508	reg_w(sd, R511_SNAP_LNCNT, vsegs);
3509	reg_w(sd, R511_SNAP_PXDIV, 0x00);
3510	reg_w(sd, R511_SNAP_LNDIV, 0x00);
3511
3512	/******** Set the framerate ********/
3513	if (frame_rate > 0)
3514		sd->frame_rate = frame_rate;
3515
3516	switch (sd->sensor) {
3517	case SEN_OV6620:
3518		/* No framerate control, doesn't like higher rates yet */
3519		sd->clockdiv = 3;
3520		break;
3521
3522	/* Note once the FIXME's in mode_init_ov_sensor_regs() are fixed
3523	   for more sensors we need to do this for them too */
3524	case SEN_OV7620:
3525	case SEN_OV7620AE:
3526	case SEN_OV7640:
3527	case SEN_OV7648:
3528	case SEN_OV76BE:
3529		if (sd->gspca_dev.pixfmt.width == 320)
3530			interlaced = 1;
3531		fallthrough;
3532	case SEN_OV6630:
3533	case SEN_OV7610:
3534	case SEN_OV7670:
3535		switch (sd->frame_rate) {
3536		case 30:
3537		case 25:
3538			/* Not enough bandwidth to do 640x480 @ 30 fps */
3539			if (sd->gspca_dev.pixfmt.width != 640) {
3540				sd->clockdiv = 0;
3541				break;
3542			}
3543			/* For 640x480 case */
3544			fallthrough;
3545		default:
3546/*		case 20: */
3547/*		case 15: */
3548			sd->clockdiv = 1;
3549			break;
3550		case 10:
3551			sd->clockdiv = 2;
3552			break;
3553		case 5:
3554			sd->clockdiv = 5;
3555			break;
3556		}
3557		if (interlaced) {
3558			sd->clockdiv = (sd->clockdiv + 1) * 2 - 1;
3559			/* Higher then 10 does not work */
3560			if (sd->clockdiv > 10)
3561				sd->clockdiv = 10;
3562		}
3563		break;
3564
3565	case SEN_OV8610:
3566		/* No framerate control ?? */
3567		sd->clockdiv = 0;
3568		break;
3569	}
3570
3571	/* Check if we have enough bandwidth to disable compression */
3572	fps = (interlaced ? 60 : 30) / (sd->clockdiv + 1) + 1;
3573	needed = fps * sd->gspca_dev.pixfmt.width *
3574			sd->gspca_dev.pixfmt.height * 3 / 2;
3575	/* 1000 isoc packets/sec */
3576	if (needed > 1000 * packet_size) {
3577		/* Enable Y and UV quantization and compression */
3578		reg_w(sd, R511_COMP_EN, 0x07);
3579		reg_w(sd, R511_COMP_LUT_EN, 0x03);
3580	} else {
3581		reg_w(sd, R511_COMP_EN, 0x06);
3582		reg_w(sd, R511_COMP_LUT_EN, 0x00);
3583	}
3584
3585	reg_w(sd, R51x_SYS_RESET, OV511_RESET_OMNICE);
3586	reg_w(sd, R51x_SYS_RESET, 0);
3587}
3588
3589/* Sets up the OV518/OV518+ with the given image parameters
3590 *
3591 * OV518 needs a completely different approach, until we can figure out what
3592 * the individual registers do. Also, only 15 FPS is supported now.
3593 *
3594 * Do not put any sensor-specific code in here (including I2C I/O functions)
3595 */
3596static void ov518_mode_init_regs(struct sd *sd)
3597{
3598	struct gspca_dev *gspca_dev = (struct gspca_dev *)sd;
3599	int hsegs, vsegs, packet_size;
3600	struct usb_host_interface *alt;
3601	struct usb_interface *intf;
3602
3603	intf = usb_ifnum_to_if(sd->gspca_dev.dev, sd->gspca_dev.iface);
3604	alt = usb_altnum_to_altsetting(intf, sd->gspca_dev.alt);
3605	if (!alt) {
3606		gspca_err(gspca_dev, "Couldn't get altsetting\n");
3607		sd->gspca_dev.usb_err = -EIO;
3608		return;
3609	}
3610
3611	if (alt->desc.bNumEndpoints < 1) {
3612		sd->gspca_dev.usb_err = -ENODEV;
3613		return;
3614	}
3615
3616	packet_size = le16_to_cpu(alt->endpoint[0].desc.wMaxPacketSize);
3617	ov518_reg_w32(sd, R51x_FIFO_PSIZE, packet_size & ~7, 2);
3618
3619	/******** Set the mode ********/
3620	reg_w(sd, 0x2b, 0);
3621	reg_w(sd, 0x2c, 0);
3622	reg_w(sd, 0x2d, 0);
3623	reg_w(sd, 0x2e, 0);
3624	reg_w(sd, 0x3b, 0);
3625	reg_w(sd, 0x3c, 0);
3626	reg_w(sd, 0x3d, 0);
3627	reg_w(sd, 0x3e, 0);
3628
3629	if (sd->bridge == BRIDGE_OV518) {
3630		/* Set 8-bit (YVYU) input format */
3631		reg_w_mask(sd, 0x20, 0x08, 0x08);
3632
3633		/* Set 12-bit (4:2:0) output format */
3634		reg_w_mask(sd, 0x28, 0x80, 0xf0);
3635		reg_w_mask(sd, 0x38, 0x80, 0xf0);
3636	} else {
3637		reg_w(sd, 0x28, 0x80);
3638		reg_w(sd, 0x38, 0x80);
3639	}
3640
3641	hsegs = sd->gspca_dev.pixfmt.width / 16;
3642	vsegs = sd->gspca_dev.pixfmt.height / 4;
3643
3644	reg_w(sd, 0x29, hsegs);
3645	reg_w(sd, 0x2a, vsegs);
3646
3647	reg_w(sd, 0x39, hsegs);
3648	reg_w(sd, 0x3a, vsegs);
3649
3650	/* Windows driver does this here; who knows why */
3651	reg_w(sd, 0x2f, 0x80);
3652
3653	/******** Set the framerate ********/
3654	if (sd->bridge == BRIDGE_OV518PLUS && sd->revision == 0 &&
3655					      sd->sensor == SEN_OV7620AE)
3656		sd->clockdiv = 0;
3657	else
3658		sd->clockdiv = 1;
3659
3660	/* Mode independent, but framerate dependent, regs */
3661	/* 0x51: Clock divider; Only works on some cams which use 2 crystals */
3662	reg_w(sd, 0x51, 0x04);
3663	reg_w(sd, 0x22, 0x18);
3664	reg_w(sd, 0x23, 0xff);
3665
3666	if (sd->bridge == BRIDGE_OV518PLUS) {
3667		switch (sd->sensor) {
3668		case SEN_OV7620AE:
3669			/*
3670			 * HdG: 640x480 needs special handling on device
3671			 * revision 2, we check for device revision > 0 to
3672			 * avoid regressions, as we don't know the correct
3673			 * thing todo for revision 1.
3674			 *
3675			 * Also this likely means we don't need to
3676			 * differentiate between the OV7620 and OV7620AE,
3677			 * earlier testing hitting this same problem likely
3678			 * happened to be with revision < 2 cams using an
3679			 * OV7620 and revision 2 cams using an OV7620AE.
3680			 */
3681			if (sd->revision > 0 &&
3682					sd->gspca_dev.pixfmt.width == 640) {
3683				reg_w(sd, 0x20, 0x60);
3684				reg_w(sd, 0x21, 0x1f);
3685			} else {
3686				reg_w(sd, 0x20, 0x00);
3687				reg_w(sd, 0x21, 0x19);
3688			}
3689			break;
3690		case SEN_OV7620:
3691			reg_w(sd, 0x20, 0x00);
3692			reg_w(sd, 0x21, 0x19);
3693			break;
3694		default:
3695			reg_w(sd, 0x21, 0x19);
3696		}
3697	} else
3698		reg_w(sd, 0x71, 0x17);	/* Compression-related? */
3699
3700	/* FIXME: Sensor-specific */
3701	/* Bit 5 is what matters here. Of course, it is "reserved" */
3702	i2c_w(sd, 0x54, 0x23);
3703
3704	reg_w(sd, 0x2f, 0x80);
3705
3706	if (sd->bridge == BRIDGE_OV518PLUS) {
3707		reg_w(sd, 0x24, 0x94);
3708		reg_w(sd, 0x25, 0x90);
3709		ov518_reg_w32(sd, 0xc4,    400, 2);	/* 190h   */
3710		ov518_reg_w32(sd, 0xc6,    540, 2);	/* 21ch   */
3711		ov518_reg_w32(sd, 0xc7,    540, 2);	/* 21ch   */
3712		ov518_reg_w32(sd, 0xc8,    108, 2);	/* 6ch    */
3713		ov518_reg_w32(sd, 0xca, 131098, 3);	/* 2001ah */
3714		ov518_reg_w32(sd, 0xcb,    532, 2);	/* 214h   */
3715		ov518_reg_w32(sd, 0xcc,   2400, 2);	/* 960h   */
3716		ov518_reg_w32(sd, 0xcd,     32, 2);	/* 20h    */
3717		ov518_reg_w32(sd, 0xce,    608, 2);	/* 260h   */
3718	} else {
3719		reg_w(sd, 0x24, 0x9f);
3720		reg_w(sd, 0x25, 0x90);
3721		ov518_reg_w32(sd, 0xc4,    400, 2);	/* 190h   */
3722		ov518_reg_w32(sd, 0xc6,    381, 2);	/* 17dh   */
3723		ov518_reg_w32(sd, 0xc7,    381, 2);	/* 17dh   */
3724		ov518_reg_w32(sd, 0xc8,    128, 2);	/* 80h    */
3725		ov518_reg_w32(sd, 0xca, 183331, 3);	/* 2cc23h */
3726		ov518_reg_w32(sd, 0xcb,    746, 2);	/* 2eah   */
3727		ov518_reg_w32(sd, 0xcc,   1750, 2);	/* 6d6h   */
3728		ov518_reg_w32(sd, 0xcd,     45, 2);	/* 2dh    */
3729		ov518_reg_w32(sd, 0xce,    851, 2);	/* 353h   */
3730	}
3731
3732	reg_w(sd, 0x2f, 0x80);
3733}
3734
3735/* Sets up the OV519 with the given image parameters
3736 *
3737 * OV519 needs a completely different approach, until we can figure out what
3738 * the individual registers do.
3739 *
3740 * Do not put any sensor-specific code in here (including I2C I/O functions)
3741 */
3742static void ov519_mode_init_regs(struct sd *sd)
3743{
3744	static const struct ov_regvals mode_init_519_ov7670[] = {
3745		{ 0x5d,	0x03 }, /* Turn off suspend mode */
3746		{ 0x53,	0x9f }, /* was 9b in 1.65-1.08 */
3747		{ OV519_R54_EN_CLK1, 0x0f }, /* bit2 (jpeg enable) */
3748		{ 0xa2,	0x20 }, /* a2-a5 are undocumented */
3749		{ 0xa3,	0x18 },
3750		{ 0xa4,	0x04 },
3751		{ 0xa5,	0x28 },
3752		{ 0x37,	0x00 },	/* SetUsbInit */
3753		{ 0x55,	0x02 }, /* 4.096 Mhz audio clock */
3754		/* Enable both fields, YUV Input, disable defect comp (why?) */
3755		{ 0x20,	0x0c },
3756		{ 0x21,	0x38 },
3757		{ 0x22,	0x1d },
3758		{ 0x17,	0x50 }, /* undocumented */
3759		{ 0x37,	0x00 }, /* undocumented */
3760		{ 0x40,	0xff }, /* I2C timeout counter */
3761		{ 0x46,	0x00 }, /* I2C clock prescaler */
3762		{ 0x59,	0x04 },	/* new from windrv 090403 */
3763		{ 0xff,	0x00 }, /* undocumented */
3764		/* windows reads 0x55 at this point, why? */
3765	};
3766
3767	static const struct ov_regvals mode_init_519[] = {
3768		{ 0x5d,	0x03 }, /* Turn off suspend mode */
3769		{ 0x53,	0x9f }, /* was 9b in 1.65-1.08 */
3770		{ OV519_R54_EN_CLK1, 0x0f }, /* bit2 (jpeg enable) */
3771		{ 0xa2,	0x20 }, /* a2-a5 are undocumented */
3772		{ 0xa3,	0x18 },
3773		{ 0xa4,	0x04 },
3774		{ 0xa5,	0x28 },
3775		{ 0x37,	0x00 },	/* SetUsbInit */
3776		{ 0x55,	0x02 }, /* 4.096 Mhz audio clock */
3777		/* Enable both fields, YUV Input, disable defect comp (why?) */
3778		{ 0x22,	0x1d },
3779		{ 0x17,	0x50 }, /* undocumented */
3780		{ 0x37,	0x00 }, /* undocumented */
3781		{ 0x40,	0xff }, /* I2C timeout counter */
3782		{ 0x46,	0x00 }, /* I2C clock prescaler */
3783		{ 0x59,	0x04 },	/* new from windrv 090403 */
3784		{ 0xff,	0x00 }, /* undocumented */
3785		/* windows reads 0x55 at this point, why? */
3786	};
3787
3788	struct gspca_dev *gspca_dev = (struct gspca_dev *)sd;
3789
3790	/******** Set the mode ********/
3791	switch (sd->sensor) {
3792	default:
3793		write_regvals(sd, mode_init_519, ARRAY_SIZE(mode_init_519));
3794		if (sd->sensor == SEN_OV7640 ||
3795		    sd->sensor == SEN_OV7648) {
3796			/* Select 8-bit input mode */
3797			reg_w_mask(sd, OV519_R20_DFR, 0x10, 0x10);
3798		}
3799		break;
3800	case SEN_OV7660:
3801		return;		/* done by ov519_set_mode/fr() */
3802	case SEN_OV7670:
3803		write_regvals(sd, mode_init_519_ov7670,
3804				ARRAY_SIZE(mode_init_519_ov7670));
3805		break;
3806	}
3807
3808	reg_w(sd, OV519_R10_H_SIZE,	sd->gspca_dev.pixfmt.width >> 4);
3809	reg_w(sd, OV519_R11_V_SIZE,	sd->gspca_dev.pixfmt.height >> 3);
3810	if (sd->sensor == SEN_OV7670 &&
3811	    sd->gspca_dev.cam.cam_mode[sd->gspca_dev.curr_mode].priv)
3812		reg_w(sd, OV519_R12_X_OFFSETL, 0x04);
3813	else if (sd->sensor == SEN_OV7648 &&
3814	    sd->gspca_dev.cam.cam_mode[sd->gspca_dev.curr_mode].priv)
3815		reg_w(sd, OV519_R12_X_OFFSETL, 0x01);
3816	else
3817		reg_w(sd, OV519_R12_X_OFFSETL, 0x00);
3818	reg_w(sd, OV519_R13_X_OFFSETH,	0x00);
3819	reg_w(sd, OV519_R14_Y_OFFSETL,	0x00);
3820	reg_w(sd, OV519_R15_Y_OFFSETH,	0x00);
3821	reg_w(sd, OV519_R16_DIVIDER,	0x00);
3822	reg_w(sd, OV519_R25_FORMAT,	0x03); /* YUV422 */
3823	reg_w(sd, 0x26,			0x00); /* Undocumented */
3824
3825	/******** Set the framerate ********/
3826	if (frame_rate > 0)
3827		sd->frame_rate = frame_rate;
3828
3829/* FIXME: These are only valid at the max resolution. */
3830	sd->clockdiv = 0;
3831	switch (sd->sensor) {
3832	case SEN_OV7640:
3833	case SEN_OV7648:
3834		switch (sd->frame_rate) {
3835		default:
3836/*		case 30: */
3837			reg_w(sd, 0xa4, 0x0c);
3838			reg_w(sd, 0x23, 0xff);
3839			break;
3840		case 25:
3841			reg_w(sd, 0xa4, 0x0c);
3842			reg_w(sd, 0x23, 0x1f);
3843			break;
3844		case 20:
3845			reg_w(sd, 0xa4, 0x0c);
3846			reg_w(sd, 0x23, 0x1b);
3847			break;
3848		case 15:
3849			reg_w(sd, 0xa4, 0x04);
3850			reg_w(sd, 0x23, 0xff);
3851			sd->clockdiv = 1;
3852			break;
3853		case 10:
3854			reg_w(sd, 0xa4, 0x04);
3855			reg_w(sd, 0x23, 0x1f);
3856			sd->clockdiv = 1;
3857			break;
3858		case 5:
3859			reg_w(sd, 0xa4, 0x04);
3860			reg_w(sd, 0x23, 0x1b);
3861			sd->clockdiv = 1;
3862			break;
3863		}
3864		break;
3865	case SEN_OV8610:
3866		switch (sd->frame_rate) {
3867		default:	/* 15 fps */
3868/*		case 15: */
3869			reg_w(sd, 0xa4, 0x06);
3870			reg_w(sd, 0x23, 0xff);
3871			break;
3872		case 10:
3873			reg_w(sd, 0xa4, 0x06);
3874			reg_w(sd, 0x23, 0x1f);
3875			break;
3876		case 5:
3877			reg_w(sd, 0xa4, 0x06);
3878			reg_w(sd, 0x23, 0x1b);
3879			break;
3880		}
3881		break;
3882	case SEN_OV7670:		/* guesses, based on 7640 */
3883		gspca_dbg(gspca_dev, D_STREAM, "Setting framerate to %d fps\n",
3884			  (sd->frame_rate == 0) ? 15 : sd->frame_rate);
3885		reg_w(sd, 0xa4, 0x10);
3886		switch (sd->frame_rate) {
3887		case 30:
3888			reg_w(sd, 0x23, 0xff);
3889			break;
3890		case 20:
3891			reg_w(sd, 0x23, 0x1b);
3892			break;
3893		default:
3894/*		case 15: */
3895			reg_w(sd, 0x23, 0xff);
3896			sd->clockdiv = 1;
3897			break;
3898		}
3899		break;
3900	}
3901}
3902
3903static void mode_init_ov_sensor_regs(struct sd *sd)
3904{
3905	struct gspca_dev *gspca_dev = (struct gspca_dev *)sd;
3906	int qvga, xstart, xend, ystart, yend;
3907	u8 v;
3908
3909	qvga = gspca_dev->cam.cam_mode[gspca_dev->curr_mode].priv & 1;
3910
3911	/******** Mode (VGA/QVGA) and sensor specific regs ********/
3912	switch (sd->sensor) {
3913	case SEN_OV2610:
3914		i2c_w_mask(sd, 0x14, qvga ? 0x20 : 0x00, 0x20);
3915		i2c_w_mask(sd, 0x28, qvga ? 0x00 : 0x20, 0x20);
3916		i2c_w(sd, 0x24, qvga ? 0x20 : 0x3a);
3917		i2c_w(sd, 0x25, qvga ? 0x30 : 0x60);
3918		i2c_w_mask(sd, 0x2d, qvga ? 0x40 : 0x00, 0x40);
3919		i2c_w_mask(sd, 0x67, qvga ? 0xf0 : 0x90, 0xf0);
3920		i2c_w_mask(sd, 0x74, qvga ? 0x20 : 0x00, 0x20);
3921		return;
3922	case SEN_OV2610AE: {
3923		u8 v;
3924
3925		/* frame rates:
3926		 *	10fps / 5 fps for 1600x1200
3927		 *	40fps / 20fps for 800x600
3928		 */
3929		v = 80;
3930		if (qvga) {
3931			if (sd->frame_rate < 25)
3932				v = 0x81;
3933		} else {
3934			if (sd->frame_rate < 10)
3935				v = 0x81;
3936		}
3937		i2c_w(sd, 0x11, v);
3938		i2c_w(sd, 0x12, qvga ? 0x60 : 0x20);
3939		return;
3940	    }
3941	case SEN_OV3610:
3942		if (qvga) {
3943			xstart = (1040 - gspca_dev->pixfmt.width) / 2 +
3944				(0x1f << 4);
3945			ystart = (776 - gspca_dev->pixfmt.height) / 2;
3946		} else {
3947			xstart = (2076 - gspca_dev->pixfmt.width) / 2 +
3948				(0x10 << 4);
3949			ystart = (1544 - gspca_dev->pixfmt.height) / 2;
3950		}
3951		xend = xstart + gspca_dev->pixfmt.width;
3952		yend = ystart + gspca_dev->pixfmt.height;
3953		/* Writing to the COMH register resets the other windowing regs
3954		   to their default values, so we must do this first. */
3955		i2c_w_mask(sd, 0x12, qvga ? 0x40 : 0x00, 0xf0);
3956		i2c_w_mask(sd, 0x32,
3957			   (((xend >> 1) & 7) << 3) | ((xstart >> 1) & 7),
3958			   0x3f);
3959		i2c_w_mask(sd, 0x03,
3960			   (((yend >> 1) & 3) << 2) | ((ystart >> 1) & 3),
3961			   0x0f);
3962		i2c_w(sd, 0x17, xstart >> 4);
3963		i2c_w(sd, 0x18, xend >> 4);
3964		i2c_w(sd, 0x19, ystart >> 3);
3965		i2c_w(sd, 0x1a, yend >> 3);
3966		return;
3967	case SEN_OV8610:
3968		/* For OV8610 qvga means qsvga */
3969		i2c_w_mask(sd, OV7610_REG_COM_C, qvga ? (1 << 5) : 0, 1 << 5);
3970		i2c_w_mask(sd, 0x13, 0x00, 0x20); /* Select 16 bit data bus */
3971		i2c_w_mask(sd, 0x12, 0x04, 0x06); /* AWB: 1 Test pattern: 0 */
3972		i2c_w_mask(sd, 0x2d, 0x00, 0x40); /* from windrv 090403 */
3973		i2c_w_mask(sd, 0x28, 0x20, 0x20); /* progressive mode on */
3974		break;
3975	case SEN_OV7610:
3976		i2c_w_mask(sd, 0x14, qvga ? 0x20 : 0x00, 0x20);
3977		i2c_w(sd, 0x35, qvga ? 0x1e : 0x9e);
3978		i2c_w_mask(sd, 0x13, 0x00, 0x20); /* Select 16 bit data bus */
3979		i2c_w_mask(sd, 0x12, 0x04, 0x06); /* AWB: 1 Test pattern: 0 */
3980		break;
3981	case SEN_OV7620:
3982	case SEN_OV7620AE:
3983	case SEN_OV76BE:
3984		i2c_w_mask(sd, 0x14, qvga ? 0x20 : 0x00, 0x20);
3985		i2c_w_mask(sd, 0x28, qvga ? 0x00 : 0x20, 0x20);
3986		i2c_w(sd, 0x24, qvga ? 0x20 : 0x3a);
3987		i2c_w(sd, 0x25, qvga ? 0x30 : 0x60);
3988		i2c_w_mask(sd, 0x2d, qvga ? 0x40 : 0x00, 0x40);
3989		i2c_w_mask(sd, 0x67, qvga ? 0xb0 : 0x90, 0xf0);
3990		i2c_w_mask(sd, 0x74, qvga ? 0x20 : 0x00, 0x20);
3991		i2c_w_mask(sd, 0x13, 0x00, 0x20); /* Select 16 bit data bus */
3992		i2c_w_mask(sd, 0x12, 0x04, 0x06); /* AWB: 1 Test pattern: 0 */
3993		if (sd->sensor == SEN_OV76BE)
3994			i2c_w(sd, 0x35, qvga ? 0x1e : 0x9e);
3995		break;
3996	case SEN_OV7640:
3997	case SEN_OV7648:
3998		i2c_w_mask(sd, 0x14, qvga ? 0x20 : 0x00, 0x20);
3999		i2c_w_mask(sd, 0x28, qvga ? 0x00 : 0x20, 0x20);
4000		/* Setting this undocumented bit in qvga mode removes a very
4001		   annoying vertical shaking of the image */
4002		i2c_w_mask(sd, 0x2d, qvga ? 0x40 : 0x00, 0x40);
4003		/* Unknown */
4004		i2c_w_mask(sd, 0x67, qvga ? 0xf0 : 0x90, 0xf0);
4005		/* Allow higher automatic gain (to allow higher framerates) */
4006		i2c_w_mask(sd, 0x74, qvga ? 0x20 : 0x00, 0x20);
4007		i2c_w_mask(sd, 0x12, 0x04, 0x04); /* AWB: 1 */
4008		break;
4009	case SEN_OV7670:
4010		/* set COM7_FMT_VGA or COM7_FMT_QVGA
4011		 * do we need to set anything else?
4012		 *	HSTART etc are set in set_ov_sensor_window itself */
4013		i2c_w_mask(sd, OV7670_R12_COM7,
4014			 qvga ? OV7670_COM7_FMT_QVGA : OV7670_COM7_FMT_VGA,
4015			 OV7670_COM7_FMT_MASK);
4016		i2c_w_mask(sd, 0x13, 0x00, 0x20); /* Select 16 bit data bus */
4017		i2c_w_mask(sd, OV7670_R13_COM8, OV7670_COM8_AWB,
4018				OV7670_COM8_AWB);
4019		if (qvga) {		/* QVGA from ov7670.c by
4020					 * Jonathan Corbet */
4021			xstart = 164;
4022			xend = 28;
4023			ystart = 14;
4024			yend = 494;
4025		} else {		/* VGA */
4026			xstart = 158;
4027			xend = 14;
4028			ystart = 10;
4029			yend = 490;
4030		}
4031		/* OV7670 hardware window registers are split across
4032		 * multiple locations */
4033		i2c_w(sd, OV7670_R17_HSTART, xstart >> 3);
4034		i2c_w(sd, OV7670_R18_HSTOP, xend >> 3);
4035		v = i2c_r(sd, OV7670_R32_HREF);
4036		v = (v & 0xc0) | ((xend & 0x7) << 3) | (xstart & 0x07);
4037		msleep(10);	/* need to sleep between read and write to
4038				 * same reg! */
4039		i2c_w(sd, OV7670_R32_HREF, v);
4040
4041		i2c_w(sd, OV7670_R19_VSTART, ystart >> 2);
4042		i2c_w(sd, OV7670_R1A_VSTOP, yend >> 2);
4043		v = i2c_r(sd, OV7670_R03_VREF);
4044		v = (v & 0xc0) | ((yend & 0x3) << 2) | (ystart & 0x03);
4045		msleep(10);	/* need to sleep between read and write to
4046				 * same reg! */
4047		i2c_w(sd, OV7670_R03_VREF, v);
4048		break;
4049	case SEN_OV6620:
4050		i2c_w_mask(sd, 0x14, qvga ? 0x20 : 0x00, 0x20);
4051		i2c_w_mask(sd, 0x13, 0x00, 0x20); /* Select 16 bit data bus */
4052		i2c_w_mask(sd, 0x12, 0x04, 0x06); /* AWB: 1 Test pattern: 0 */
4053		break;
4054	case SEN_OV6630:
4055	case SEN_OV66308AF:
4056		i2c_w_mask(sd, 0x14, qvga ? 0x20 : 0x00, 0x20);
4057		i2c_w_mask(sd, 0x12, 0x04, 0x06); /* AWB: 1 Test pattern: 0 */
4058		break;
4059	case SEN_OV9600: {
4060		const struct ov_i2c_regvals *vals;
4061		static const struct ov_i2c_regvals sxga_15[] = {
4062			{0x11, 0x80}, {0x14, 0x3e}, {0x24, 0x85}, {0x25, 0x75}
4063		};
4064		static const struct ov_i2c_regvals sxga_7_5[] = {
4065			{0x11, 0x81}, {0x14, 0x3e}, {0x24, 0x85}, {0x25, 0x75}
4066		};
4067		static const struct ov_i2c_regvals vga_30[] = {
4068			{0x11, 0x81}, {0x14, 0x7e}, {0x24, 0x70}, {0x25, 0x60}
4069		};
4070		static const struct ov_i2c_regvals vga_15[] = {
4071			{0x11, 0x83}, {0x14, 0x3e}, {0x24, 0x80}, {0x25, 0x70}
4072		};
4073
4074		/* frame rates:
4075		 *	15fps / 7.5 fps for 1280x1024
4076		 *	30fps / 15fps for 640x480
4077		 */
4078		i2c_w_mask(sd, 0x12, qvga ? 0x40 : 0x00, 0x40);
4079		if (qvga)
4080			vals = sd->frame_rate < 30 ? vga_15 : vga_30;
4081		else
4082			vals = sd->frame_rate < 15 ? sxga_7_5 : sxga_15;
4083		write_i2c_regvals(sd, vals, ARRAY_SIZE(sxga_15));
4084		return;
4085	    }
4086	default:
4087		return;
4088	}
4089
4090	/******** Clock programming ********/
4091	i2c_w(sd, 0x11, sd->clockdiv);
4092}
4093
4094/* this function works for bridge ov519 and sensors ov7660 and ov7670 only */
4095static void sethvflip(struct gspca_dev *gspca_dev, s32 hflip, s32 vflip)
4096{
4097	struct sd *sd = (struct sd *) gspca_dev;
4098
4099	if (sd->gspca_dev.streaming)
4100		reg_w(sd, OV519_R51_RESET1, 0x0f);	/* block stream */
4101	i2c_w_mask(sd, OV7670_R1E_MVFP,
4102		OV7670_MVFP_MIRROR * hflip | OV7670_MVFP_VFLIP * vflip,
4103		OV7670_MVFP_MIRROR | OV7670_MVFP_VFLIP);
4104	if (sd->gspca_dev.streaming)
4105		reg_w(sd, OV519_R51_RESET1, 0x00);	/* restart stream */
4106}
4107
4108static void set_ov_sensor_window(struct sd *sd)
4109{
4110	struct gspca_dev *gspca_dev;
4111	int qvga, crop;
4112	int hwsbase, hwebase, vwsbase, vwebase, hwscale, vwscale;
4113
4114	/* mode setup is fully handled in mode_init_ov_sensor_regs for these */
4115	switch (sd->sensor) {
4116	case SEN_OV2610:
4117	case SEN_OV2610AE:
4118	case SEN_OV3610:
4119	case SEN_OV7670:
4120	case SEN_OV9600:
4121		mode_init_ov_sensor_regs(sd);
4122		return;
4123	case SEN_OV7660:
4124		ov519_set_mode(sd);
4125		ov519_set_fr(sd);
4126		return;
4127	}
4128
4129	gspca_dev = &sd->gspca_dev;
4130	qvga = gspca_dev->cam.cam_mode[gspca_dev->curr_mode].priv & 1;
4131	crop = gspca_dev->cam.cam_mode[gspca_dev->curr_mode].priv & 2;
4132
4133	/* The different sensor ICs handle setting up of window differently.
4134	 * IF YOU SET IT WRONG, YOU WILL GET ALL ZERO ISOC DATA FROM OV51x!! */
4135	switch (sd->sensor) {
4136	case SEN_OV8610:
4137		hwsbase = 0x1e;
4138		hwebase = 0x1e;
4139		vwsbase = 0x02;
4140		vwebase = 0x02;
4141		break;
4142	case SEN_OV7610:
4143	case SEN_OV76BE:
4144		hwsbase = 0x38;
4145		hwebase = 0x3a;
4146		vwsbase = vwebase = 0x05;
4147		break;
4148	case SEN_OV6620:
4149	case SEN_OV6630:
4150	case SEN_OV66308AF:
4151		hwsbase = 0x38;
4152		hwebase = 0x3a;
4153		vwsbase = 0x05;
4154		vwebase = 0x06;
4155		if (sd->sensor == SEN_OV66308AF && qvga)
4156			/* HDG: this fixes U and V getting swapped */
4157			hwsbase++;
4158		if (crop) {
4159			hwsbase += 8;
4160			hwebase += 8;
4161			vwsbase += 11;
4162			vwebase += 11;
4163		}
4164		break;
4165	case SEN_OV7620:
4166	case SEN_OV7620AE:
4167		hwsbase = 0x2f;		/* From 7620.SET (spec is wrong) */
4168		hwebase = 0x2f;
4169		vwsbase = vwebase = 0x05;
4170		break;
4171	case SEN_OV7640:
4172	case SEN_OV7648:
4173		hwsbase = 0x1a;
4174		hwebase = 0x1a;
4175		vwsbase = vwebase = 0x03;
4176		break;
4177	default:
4178		return;
4179	}
4180
4181	switch (sd->sensor) {
4182	case SEN_OV6620:
4183	case SEN_OV6630:
4184	case SEN_OV66308AF:
4185		if (qvga) {		/* QCIF */
4186			hwscale = 0;
4187			vwscale = 0;
4188		} else {		/* CIF */
4189			hwscale = 1;
4190			vwscale = 1;	/* The datasheet says 0;
4191					 * it's wrong */
4192		}
4193		break;
4194	case SEN_OV8610:
4195		if (qvga) {		/* QSVGA */
4196			hwscale = 1;
4197			vwscale = 1;
4198		} else {		/* SVGA */
4199			hwscale = 2;
4200			vwscale = 2;
4201		}
4202		break;
4203	default:			/* SEN_OV7xx0 */
4204		if (qvga) {		/* QVGA */
4205			hwscale = 1;
4206			vwscale = 0;
4207		} else {		/* VGA */
4208			hwscale = 2;
4209			vwscale = 1;
4210		}
4211	}
4212
4213	mode_init_ov_sensor_regs(sd);
4214
4215	i2c_w(sd, 0x17, hwsbase);
4216	i2c_w(sd, 0x18, hwebase + (sd->sensor_width >> hwscale));
4217	i2c_w(sd, 0x19, vwsbase);
4218	i2c_w(sd, 0x1a, vwebase + (sd->sensor_height >> vwscale));
4219}
4220
4221/* -- start the camera -- */
4222static int sd_start(struct gspca_dev *gspca_dev)
4223{
4224	struct sd *sd = (struct sd *) gspca_dev;
4225
4226	/* Default for most bridges, allow bridge_mode_init_regs to override */
4227	sd->sensor_width = sd->gspca_dev.pixfmt.width;
4228	sd->sensor_height = sd->gspca_dev.pixfmt.height;
4229
4230	switch (sd->bridge) {
4231	case BRIDGE_OV511:
4232	case BRIDGE_OV511PLUS:
4233		ov511_mode_init_regs(sd);
4234		break;
4235	case BRIDGE_OV518:
4236	case BRIDGE_OV518PLUS:
4237		ov518_mode_init_regs(sd);
4238		break;
4239	case BRIDGE_OV519:
4240		ov519_mode_init_regs(sd);
4241		break;
4242	/* case BRIDGE_OVFX2: nothing to do */
4243	case BRIDGE_W9968CF:
4244		w9968cf_mode_init_regs(sd);
4245		break;
4246	}
4247
4248	set_ov_sensor_window(sd);
4249
4250	/* Force clear snapshot state in case the snapshot button was
4251	   pressed while we weren't streaming */
4252	sd->snapshot_needs_reset = 1;
4253	sd_reset_snapshot(gspca_dev);
4254
4255	sd->first_frame = 3;
4256
4257	ov51x_restart(sd);
4258	ov51x_led_control(sd, 1);
4259	return gspca_dev->usb_err;
4260}
4261
4262static void sd_stopN(struct gspca_dev *gspca_dev)
4263{
4264	struct sd *sd = (struct sd *) gspca_dev;
4265
4266	ov51x_stop(sd);
4267	ov51x_led_control(sd, 0);
4268}
4269
4270static void sd_stop0(struct gspca_dev *gspca_dev)
4271{
4272	struct sd *sd = (struct sd *) gspca_dev;
4273
4274	if (!sd->gspca_dev.present)
4275		return;
4276	if (sd->bridge == BRIDGE_W9968CF)
4277		w9968cf_stop0(sd);
4278
4279#if IS_ENABLED(CONFIG_INPUT)
4280	/* If the last button state is pressed, release it now! */
4281	if (sd->snapshot_pressed) {
4282		input_report_key(gspca_dev->input_dev, KEY_CAMERA, 0);
4283		input_sync(gspca_dev->input_dev);
4284		sd->snapshot_pressed = 0;
4285	}
4286#endif
4287	if (sd->bridge == BRIDGE_OV519)
4288		reg_w(sd, OV519_R57_SNAPSHOT, 0x23);
4289}
4290
4291static void ov51x_handle_button(struct gspca_dev *gspca_dev, u8 state)
4292{
4293	struct sd *sd = (struct sd *) gspca_dev;
4294
4295	if (sd->snapshot_pressed != state) {
4296#if IS_ENABLED(CONFIG_INPUT)
4297		input_report_key(gspca_dev->input_dev, KEY_CAMERA, state);
4298		input_sync(gspca_dev->input_dev);
4299#endif
4300		if (state)
4301			sd->snapshot_needs_reset = 1;
4302
4303		sd->snapshot_pressed = state;
4304	} else {
4305		/* On the ov511 / ov519 we need to reset the button state
4306		   multiple times, as resetting does not work as long as the
4307		   button stays pressed */
4308		switch (sd->bridge) {
4309		case BRIDGE_OV511:
4310		case BRIDGE_OV511PLUS:
4311		case BRIDGE_OV519:
4312			if (state)
4313				sd->snapshot_needs_reset = 1;
4314			break;
4315		}
4316	}
4317}
4318
4319static void ov511_pkt_scan(struct gspca_dev *gspca_dev,
4320			u8 *in,			/* isoc packet */
4321			int len)		/* iso packet length */
4322{
4323	struct sd *sd = (struct sd *) gspca_dev;
4324
4325	/* SOF/EOF packets have 1st to 8th bytes zeroed and the 9th
4326	 * byte non-zero. The EOF packet has image width/height in the
4327	 * 10th and 11th bytes. The 9th byte is given as follows:
4328	 *
4329	 * bit 7: EOF
4330	 *     6: compression enabled
4331	 *     5: 422/420/400 modes
4332	 *     4: 422/420/400 modes
4333	 *     3: 1
4334	 *     2: snapshot button on
4335	 *     1: snapshot frame
4336	 *     0: even/odd field
4337	 */
4338	if (!(in[0] | in[1] | in[2] | in[3] | in[4] | in[5] | in[6] | in[7]) &&
4339	    (in[8] & 0x08)) {
4340		ov51x_handle_button(gspca_dev, (in[8] >> 2) & 1);
4341		if (in[8] & 0x80) {
4342			/* Frame end */
4343			if ((in[9] + 1) * 8 != gspca_dev->pixfmt.width ||
4344			    (in[10] + 1) * 8 != gspca_dev->pixfmt.height) {
4345				gspca_err(gspca_dev, "Invalid frame size, got: %dx%d, requested: %dx%d\n",
4346					  (in[9] + 1) * 8, (in[10] + 1) * 8,
4347					  gspca_dev->pixfmt.width,
4348					  gspca_dev->pixfmt.height);
4349				gspca_dev->last_packet_type = DISCARD_PACKET;
4350				return;
4351			}
4352			/* Add 11 byte footer to frame, might be useful */
4353			gspca_frame_add(gspca_dev, LAST_PACKET, in, 11);
4354			return;
4355		} else {
4356			/* Frame start */
4357			gspca_frame_add(gspca_dev, FIRST_PACKET, in, 0);
4358			sd->packet_nr = 0;
4359		}
4360	}
4361
4362	/* Ignore the packet number */
4363	len--;
4364
4365	/* intermediate packet */
4366	gspca_frame_add(gspca_dev, INTER_PACKET, in, len);
4367}
4368
4369static void ov518_pkt_scan(struct gspca_dev *gspca_dev,
4370			u8 *data,			/* isoc packet */
4371			int len)			/* iso packet length */
4372{
4373	struct sd *sd = (struct sd *) gspca_dev;
4374
4375	/* A false positive here is likely, until OVT gives me
4376	 * the definitive SOF/EOF format */
4377	if ((!(data[0] | data[1] | data[2] | data[3] | data[5])) && data[6]) {
4378		ov51x_handle_button(gspca_dev, (data[6] >> 1) & 1);
4379		gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
4380		gspca_frame_add(gspca_dev, FIRST_PACKET, NULL, 0);
4381		sd->packet_nr = 0;
4382	}
4383
4384	if (gspca_dev->last_packet_type == DISCARD_PACKET)
4385		return;
4386
4387	/* Does this device use packet numbers ? */
4388	if (len & 7) {
4389		len--;
4390		if (sd->packet_nr == data[len])
4391			sd->packet_nr++;
4392		/* The last few packets of the frame (which are all 0's
4393		   except that they may contain part of the footer), are
4394		   numbered 0 */
4395		else if (sd->packet_nr == 0 || data[len]) {
4396			gspca_err(gspca_dev, "Invalid packet nr: %d (expect: %d)\n",
4397				  (int)data[len], (int)sd->packet_nr);
4398			gspca_dev->last_packet_type = DISCARD_PACKET;
4399			return;
4400		}
4401	}
4402
4403	/* intermediate packet */
4404	gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
4405}
4406
4407static void ov519_pkt_scan(struct gspca_dev *gspca_dev,
4408			u8 *data,			/* isoc packet */
4409			int len)			/* iso packet length */
4410{
4411	/* Header of ov519 is 16 bytes:
4412	 *     Byte     Value      Description
4413	 *	0	0xff	magic
4414	 *	1	0xff	magic
4415	 *	2	0xff	magic
4416	 *	3	0xXX	0x50 = SOF, 0x51 = EOF
4417	 *	9	0xXX	0x01 initial frame without data,
4418	 *			0x00 standard frame with image
4419	 *	14	Lo	in EOF: length of image data / 8
4420	 *	15	Hi
4421	 */
4422
4423	if (data[0] == 0xff && data[1] == 0xff && data[2] == 0xff) {
4424		switch (data[3]) {
4425		case 0x50:		/* start of frame */
4426			/* Don't check the button state here, as the state
4427			   usually (always ?) changes at EOF and checking it
4428			   here leads to unnecessary snapshot state resets. */
4429#define HDRSZ 16
4430			data += HDRSZ;
4431			len -= HDRSZ;
4432#undef HDRSZ
4433			if (data[0] == 0xff || data[1] == 0xd8)
4434				gspca_frame_add(gspca_dev, FIRST_PACKET,
4435						data, len);
4436			else
4437				gspca_dev->last_packet_type = DISCARD_PACKET;
4438			return;
4439		case 0x51:		/* end of frame */
4440			ov51x_handle_button(gspca_dev, data[11] & 1);
4441			if (data[9] != 0)
4442				gspca_dev->last_packet_type = DISCARD_PACKET;
4443			gspca_frame_add(gspca_dev, LAST_PACKET,
4444					NULL, 0);
4445			return;
4446		}
4447	}
4448
4449	/* intermediate packet */
4450	gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
4451}
4452
4453static void ovfx2_pkt_scan(struct gspca_dev *gspca_dev,
4454			u8 *data,			/* isoc packet */
4455			int len)			/* iso packet length */
4456{
4457	struct sd *sd = (struct sd *) gspca_dev;
4458
4459	gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
4460
4461	/* A short read signals EOF */
4462	if (len < gspca_dev->cam.bulk_size) {
4463		/* If the frame is short, and it is one of the first ones
4464		   the sensor and bridge are still syncing, so drop it. */
4465		if (sd->first_frame) {
4466			sd->first_frame--;
4467			if (gspca_dev->image_len <
4468				  sd->gspca_dev.pixfmt.width *
4469					sd->gspca_dev.pixfmt.height)
4470				gspca_dev->last_packet_type = DISCARD_PACKET;
4471		}
4472		gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
4473		gspca_frame_add(gspca_dev, FIRST_PACKET, NULL, 0);
4474	}
4475}
4476
4477static void sd_pkt_scan(struct gspca_dev *gspca_dev,
4478			u8 *data,			/* isoc packet */
4479			int len)			/* iso packet length */
4480{
4481	struct sd *sd = (struct sd *) gspca_dev;
4482
4483	switch (sd->bridge) {
4484	case BRIDGE_OV511:
4485	case BRIDGE_OV511PLUS:
4486		ov511_pkt_scan(gspca_dev, data, len);
4487		break;
4488	case BRIDGE_OV518:
4489	case BRIDGE_OV518PLUS:
4490		ov518_pkt_scan(gspca_dev, data, len);
4491		break;
4492	case BRIDGE_OV519:
4493		ov519_pkt_scan(gspca_dev, data, len);
4494		break;
4495	case BRIDGE_OVFX2:
4496		ovfx2_pkt_scan(gspca_dev, data, len);
4497		break;
4498	case BRIDGE_W9968CF:
4499		w9968cf_pkt_scan(gspca_dev, data, len);
4500		break;
4501	}
4502}
4503
4504/* -- management routines -- */
4505
4506static void setbrightness(struct gspca_dev *gspca_dev, s32 val)
4507{
4508	struct sd *sd = (struct sd *) gspca_dev;
4509	static const struct ov_i2c_regvals brit_7660[][7] = {
4510		{{0x0f, 0x6a}, {0x24, 0x40}, {0x25, 0x2b}, {0x26, 0x90},
4511			{0x27, 0xe0}, {0x28, 0xe0}, {0x2c, 0xe0}},
4512		{{0x0f, 0x6a}, {0x24, 0x50}, {0x25, 0x40}, {0x26, 0xa1},
4513			{0x27, 0xc0}, {0x28, 0xc0}, {0x2c, 0xc0}},
4514		{{0x0f, 0x6a}, {0x24, 0x68}, {0x25, 0x58}, {0x26, 0xc2},
4515			{0x27, 0xa0}, {0x28, 0xa0}, {0x2c, 0xa0}},
4516		{{0x0f, 0x6a}, {0x24, 0x70}, {0x25, 0x68}, {0x26, 0xd3},
4517			{0x27, 0x80}, {0x28, 0x80}, {0x2c, 0x80}},
4518		{{0x0f, 0x6a}, {0x24, 0x80}, {0x25, 0x70}, {0x26, 0xd3},
4519			{0x27, 0x20}, {0x28, 0x20}, {0x2c, 0x20}},
4520		{{0x0f, 0x6a}, {0x24, 0x88}, {0x25, 0x78}, {0x26, 0xd3},
4521			{0x27, 0x40}, {0x28, 0x40}, {0x2c, 0x40}},
4522		{{0x0f, 0x6a}, {0x24, 0x90}, {0x25, 0x80}, {0x26, 0xd4},
4523			{0x27, 0x60}, {0x28, 0x60}, {0x2c, 0x60}}
4524	};
4525
4526	switch (sd->sensor) {
4527	case SEN_OV8610:
4528	case SEN_OV7610:
4529	case SEN_OV76BE:
4530	case SEN_OV6620:
4531	case SEN_OV6630:
4532	case SEN_OV66308AF:
4533	case SEN_OV7640:
4534	case SEN_OV7648:
4535		i2c_w(sd, OV7610_REG_BRT, val);
4536		break;
4537	case SEN_OV7620:
4538	case SEN_OV7620AE:
4539		i2c_w(sd, OV7610_REG_BRT, val);
4540		break;
4541	case SEN_OV7660:
4542		write_i2c_regvals(sd, brit_7660[val],
4543				ARRAY_SIZE(brit_7660[0]));
4544		break;
4545	case SEN_OV7670:
4546/*win trace
4547 *		i2c_w_mask(sd, OV7670_R13_COM8, 0, OV7670_COM8_AEC); */
4548		i2c_w(sd, OV7670_R55_BRIGHT, ov7670_abs_to_sm(val));
4549		break;
4550	}
4551}
4552
4553static void setcontrast(struct gspca_dev *gspca_dev, s32 val)
4554{
4555	struct sd *sd = (struct sd *) gspca_dev;
4556	static const struct ov_i2c_regvals contrast_7660[][31] = {
4557		{{0x6c, 0xf0}, {0x6d, 0xf0}, {0x6e, 0xf8}, {0x6f, 0xa0},
4558		 {0x70, 0x58}, {0x71, 0x38}, {0x72, 0x30}, {0x73, 0x30},
4559		 {0x74, 0x28}, {0x75, 0x28}, {0x76, 0x24}, {0x77, 0x24},
4560		 {0x78, 0x22}, {0x79, 0x28}, {0x7a, 0x2a}, {0x7b, 0x34},
4561		 {0x7c, 0x0f}, {0x7d, 0x1e}, {0x7e, 0x3d}, {0x7f, 0x65},
4562		 {0x80, 0x70}, {0x81, 0x77}, {0x82, 0x7d}, {0x83, 0x83},
4563		 {0x84, 0x88}, {0x85, 0x8d}, {0x86, 0x96}, {0x87, 0x9f},
4564		 {0x88, 0xb0}, {0x89, 0xc4}, {0x8a, 0xd9}},
4565		{{0x6c, 0xf0}, {0x6d, 0xf0}, {0x6e, 0xf8}, {0x6f, 0x94},
4566		 {0x70, 0x58}, {0x71, 0x40}, {0x72, 0x30}, {0x73, 0x30},
4567		 {0x74, 0x30}, {0x75, 0x30}, {0x76, 0x2c}, {0x77, 0x24},
4568		 {0x78, 0x22}, {0x79, 0x28}, {0x7a, 0x2a}, {0x7b, 0x31},
4569		 {0x7c, 0x0f}, {0x7d, 0x1e}, {0x7e, 0x3d}, {0x7f, 0x62},
4570		 {0x80, 0x6d}, {0x81, 0x75}, {0x82, 0x7b}, {0x83, 0x81},
4571		 {0x84, 0x87}, {0x85, 0x8d}, {0x86, 0x98}, {0x87, 0xa1},
4572		 {0x88, 0xb2}, {0x89, 0xc6}, {0x8a, 0xdb}},
4573		{{0x6c, 0xf0}, {0x6d, 0xf0}, {0x6e, 0xf0}, {0x6f, 0x84},
4574		 {0x70, 0x58}, {0x71, 0x48}, {0x72, 0x40}, {0x73, 0x40},
4575		 {0x74, 0x28}, {0x75, 0x28}, {0x76, 0x28}, {0x77, 0x24},
4576		 {0x78, 0x26}, {0x79, 0x28}, {0x7a, 0x28}, {0x7b, 0x34},
4577		 {0x7c, 0x0f}, {0x7d, 0x1e}, {0x7e, 0x3c}, {0x7f, 0x5d},
4578		 {0x80, 0x68}, {0x81, 0x71}, {0x82, 0x79}, {0x83, 0x81},
4579		 {0x84, 0x86}, {0x85, 0x8b}, {0x86, 0x95}, {0x87, 0x9e},
4580		 {0x88, 0xb1}, {0x89, 0xc5}, {0x8a, 0xd9}},
4581		{{0x6c, 0xf0}, {0x6d, 0xf0}, {0x6e, 0xf0}, {0x6f, 0x70},
4582		 {0x70, 0x58}, {0x71, 0x58}, {0x72, 0x48}, {0x73, 0x48},
4583		 {0x74, 0x38}, {0x75, 0x40}, {0x76, 0x34}, {0x77, 0x34},
4584		 {0x78, 0x2e}, {0x79, 0x28}, {0x7a, 0x24}, {0x7b, 0x22},
4585		 {0x7c, 0x0f}, {0x7d, 0x1e}, {0x7e, 0x3c}, {0x7f, 0x58},
4586		 {0x80, 0x63}, {0x81, 0x6e}, {0x82, 0x77}, {0x83, 0x80},
4587		 {0x84, 0x87}, {0x85, 0x8f}, {0x86, 0x9c}, {0x87, 0xa9},
4588		 {0x88, 0xc0}, {0x89, 0xd4}, {0x8a, 0xe6}},
4589		{{0x6c, 0xa0}, {0x6d, 0xf0}, {0x6e, 0x90}, {0x6f, 0x80},
4590		 {0x70, 0x70}, {0x71, 0x80}, {0x72, 0x60}, {0x73, 0x60},
4591		 {0x74, 0x58}, {0x75, 0x60}, {0x76, 0x4c}, {0x77, 0x38},
4592		 {0x78, 0x38}, {0x79, 0x2a}, {0x7a, 0x20}, {0x7b, 0x0e},
4593		 {0x7c, 0x0a}, {0x7d, 0x14}, {0x7e, 0x26}, {0x7f, 0x46},
4594		 {0x80, 0x54}, {0x81, 0x64}, {0x82, 0x70}, {0x83, 0x7c},
4595		 {0x84, 0x87}, {0x85, 0x93}, {0x86, 0xa6}, {0x87, 0xb4},
4596		 {0x88, 0xd0}, {0x89, 0xe5}, {0x8a, 0xf5}},
4597		{{0x6c, 0x60}, {0x6d, 0x80}, {0x6e, 0x60}, {0x6f, 0x80},
4598		 {0x70, 0x80}, {0x71, 0x80}, {0x72, 0x88}, {0x73, 0x30},
4599		 {0x74, 0x70}, {0x75, 0x68}, {0x76, 0x64}, {0x77, 0x50},
4600		 {0x78, 0x3c}, {0x79, 0x22}, {0x7a, 0x10}, {0x7b, 0x08},
4601		 {0x7c, 0x06}, {0x7d, 0x0e}, {0x7e, 0x1a}, {0x7f, 0x3a},
4602		 {0x80, 0x4a}, {0x81, 0x5a}, {0x82, 0x6b}, {0x83, 0x7b},
4603		 {0x84, 0x89}, {0x85, 0x96}, {0x86, 0xaf}, {0x87, 0xc3},
4604		 {0x88, 0xe1}, {0x89, 0xf2}, {0x8a, 0xfa}},
4605		{{0x6c, 0x20}, {0x6d, 0x40}, {0x6e, 0x20}, {0x6f, 0x60},
4606		 {0x70, 0x88}, {0x71, 0xc8}, {0x72, 0xc0}, {0x73, 0xb8},
4607		 {0x74, 0xa8}, {0x75, 0xb8}, {0x76, 0x80}, {0x77, 0x5c},
4608		 {0x78, 0x26}, {0x79, 0x10}, {0x7a, 0x08}, {0x7b, 0x04},
4609		 {0x7c, 0x02}, {0x7d, 0x06}, {0x7e, 0x0a}, {0x7f, 0x22},
4610		 {0x80, 0x33}, {0x81, 0x4c}, {0x82, 0x64}, {0x83, 0x7b},
4611		 {0x84, 0x90}, {0x85, 0xa7}, {0x86, 0xc7}, {0x87, 0xde},
4612		 {0x88, 0xf1}, {0x89, 0xf9}, {0x8a, 0xfd}},
4613	};
4614
4615	switch (sd->sensor) {
4616	case SEN_OV7610:
4617	case SEN_OV6620:
4618		i2c_w(sd, OV7610_REG_CNT, val);
4619		break;
4620	case SEN_OV6630:
4621	case SEN_OV66308AF:
4622		i2c_w_mask(sd, OV7610_REG_CNT, val >> 4, 0x0f);
4623		break;
4624	case SEN_OV8610: {
4625		static const u8 ctab[] = {
4626			0x03, 0x09, 0x0b, 0x0f, 0x53, 0x6f, 0x35, 0x7f
4627		};
4628
4629		/* Use Y gamma control instead. Bit 0 enables it. */
4630		i2c_w(sd, 0x64, ctab[val >> 5]);
4631		break;
4632	    }
4633	case SEN_OV7620:
4634	case SEN_OV7620AE: {
4635		static const u8 ctab[] = {
4636			0x01, 0x05, 0x09, 0x11, 0x15, 0x35, 0x37, 0x57,
4637			0x5b, 0xa5, 0xa7, 0xc7, 0xc9, 0xcf, 0xef, 0xff
4638		};
4639
4640		/* Use Y gamma control instead. Bit 0 enables it. */
4641		i2c_w(sd, 0x64, ctab[val >> 4]);
4642		break;
4643	    }
4644	case SEN_OV7660:
4645		write_i2c_regvals(sd, contrast_7660[val],
4646					ARRAY_SIZE(contrast_7660[0]));
4647		break;
4648	case SEN_OV7670:
4649		/* check that this isn't just the same as ov7610 */
4650		i2c_w(sd, OV7670_R56_CONTRAS, val >> 1);
4651		break;
4652	}
4653}
4654
4655static void setexposure(struct gspca_dev *gspca_dev, s32 val)
4656{
4657	struct sd *sd = (struct sd *) gspca_dev;
4658
4659	i2c_w(sd, 0x10, val);
4660}
4661
4662static void setcolors(struct gspca_dev *gspca_dev, s32 val)
4663{
4664	struct sd *sd = (struct sd *) gspca_dev;
4665	static const struct ov_i2c_regvals colors_7660[][6] = {
4666		{{0x4f, 0x28}, {0x50, 0x2a}, {0x51, 0x02}, {0x52, 0x0a},
4667		 {0x53, 0x19}, {0x54, 0x23}},
4668		{{0x4f, 0x47}, {0x50, 0x4a}, {0x51, 0x03}, {0x52, 0x11},
4669		 {0x53, 0x2c}, {0x54, 0x3e}},
4670		{{0x4f, 0x66}, {0x50, 0x6b}, {0x51, 0x05}, {0x52, 0x19},
4671		 {0x53, 0x40}, {0x54, 0x59}},
4672		{{0x4f, 0x84}, {0x50, 0x8b}, {0x51, 0x06}, {0x52, 0x20},
4673		 {0x53, 0x53}, {0x54, 0x73}},
4674		{{0x4f, 0xa3}, {0x50, 0xab}, {0x51, 0x08}, {0x52, 0x28},
4675		 {0x53, 0x66}, {0x54, 0x8e}},
4676	};
4677
4678	switch (sd->sensor) {
4679	case SEN_OV8610:
4680	case SEN_OV7610:
4681	case SEN_OV76BE:
4682	case SEN_OV6620:
4683	case SEN_OV6630:
4684	case SEN_OV66308AF:
4685		i2c_w(sd, OV7610_REG_SAT, val);
4686		break;
4687	case SEN_OV7620:
4688	case SEN_OV7620AE:
4689		/* Use UV gamma control instead. Bits 0 & 7 are reserved. */
4690/*		rc = ov_i2c_write(sd->dev, 0x62, (val >> 9) & 0x7e);
4691		if (rc < 0)
4692			goto out; */
4693		i2c_w(sd, OV7610_REG_SAT, val);
4694		break;
4695	case SEN_OV7640:
4696	case SEN_OV7648:
4697		i2c_w(sd, OV7610_REG_SAT, val & 0xf0);
4698		break;
4699	case SEN_OV7660:
4700		write_i2c_regvals(sd, colors_7660[val],
4701					ARRAY_SIZE(colors_7660[0]));
4702		break;
4703	case SEN_OV7670:
4704		/* supported later once I work out how to do it
4705		 * transparently fail now! */
4706		/* set REG_COM13 values for UV sat auto mode */
4707		break;
4708	}
4709}
4710
4711static void setautobright(struct gspca_dev *gspca_dev, s32 val)
4712{
4713	struct sd *sd = (struct sd *) gspca_dev;
4714
4715	i2c_w_mask(sd, 0x2d, val ? 0x10 : 0x00, 0x10);
4716}
4717
4718static void setfreq_i(struct sd *sd, s32 val)
4719{
4720	if (sd->sensor == SEN_OV7660
4721	 || sd->sensor == SEN_OV7670) {
4722		switch (val) {
4723		case 0: /* Banding filter disabled */
4724			i2c_w_mask(sd, OV7670_R13_COM8, 0, OV7670_COM8_BFILT);
4725			break;
4726		case 1: /* 50 hz */
4727			i2c_w_mask(sd, OV7670_R13_COM8, OV7670_COM8_BFILT,
4728				   OV7670_COM8_BFILT);
4729			i2c_w_mask(sd, OV7670_R3B_COM11, 0x08, 0x18);
4730			break;
4731		case 2: /* 60 hz */
4732			i2c_w_mask(sd, OV7670_R13_COM8, OV7670_COM8_BFILT,
4733				   OV7670_COM8_BFILT);
4734			i2c_w_mask(sd, OV7670_R3B_COM11, 0x00, 0x18);
4735			break;
4736		case 3: /* Auto hz - ov7670 only */
4737			i2c_w_mask(sd, OV7670_R13_COM8, OV7670_COM8_BFILT,
4738				   OV7670_COM8_BFILT);
4739			i2c_w_mask(sd, OV7670_R3B_COM11, OV7670_COM11_HZAUTO,
4740				   0x18);
4741			break;
4742		}
4743	} else {
4744		switch (val) {
4745		case 0: /* Banding filter disabled */
4746			i2c_w_mask(sd, 0x2d, 0x00, 0x04);
4747			i2c_w_mask(sd, 0x2a, 0x00, 0x80);
4748			break;
4749		case 1: /* 50 hz (filter on and framerate adj) */
4750			i2c_w_mask(sd, 0x2d, 0x04, 0x04);
4751			i2c_w_mask(sd, 0x2a, 0x80, 0x80);
4752			/* 20 fps -> 16.667 fps */
4753			if (sd->sensor == SEN_OV6620 ||
4754			    sd->sensor == SEN_OV6630 ||
4755			    sd->sensor == SEN_OV66308AF)
4756				i2c_w(sd, 0x2b, 0x5e);
4757			else
4758				i2c_w(sd, 0x2b, 0xac);
4759			break;
4760		case 2: /* 60 hz (filter on, ...) */
4761			i2c_w_mask(sd, 0x2d, 0x04, 0x04);
4762			if (sd->sensor == SEN_OV6620 ||
4763			    sd->sensor == SEN_OV6630 ||
4764			    sd->sensor == SEN_OV66308AF) {
4765				/* 20 fps -> 15 fps */
4766				i2c_w_mask(sd, 0x2a, 0x80, 0x80);
4767				i2c_w(sd, 0x2b, 0xa8);
4768			} else {
4769				/* no framerate adj. */
4770				i2c_w_mask(sd, 0x2a, 0x00, 0x80);
4771			}
4772			break;
4773		}
4774	}
4775}
4776
4777static void setfreq(struct gspca_dev *gspca_dev, s32 val)
4778{
4779	struct sd *sd = (struct sd *) gspca_dev;
4780
4781	setfreq_i(sd, val);
4782
4783	/* Ugly but necessary */
4784	if (sd->bridge == BRIDGE_W9968CF)
4785		w9968cf_set_crop_window(sd);
4786}
4787
4788static int sd_get_jcomp(struct gspca_dev *gspca_dev,
4789			struct v4l2_jpegcompression *jcomp)
4790{
4791	struct sd *sd = (struct sd *) gspca_dev;
4792
4793	if (sd->bridge != BRIDGE_W9968CF)
4794		return -ENOTTY;
4795
4796	memset(jcomp, 0, sizeof *jcomp);
4797	jcomp->quality = v4l2_ctrl_g_ctrl(sd->jpegqual);
4798	jcomp->jpeg_markers = V4L2_JPEG_MARKER_DHT | V4L2_JPEG_MARKER_DQT |
4799			      V4L2_JPEG_MARKER_DRI;
4800	return 0;
4801}
4802
4803static int sd_set_jcomp(struct gspca_dev *gspca_dev,
4804			const struct v4l2_jpegcompression *jcomp)
4805{
4806	struct sd *sd = (struct sd *) gspca_dev;
4807
4808	if (sd->bridge != BRIDGE_W9968CF)
4809		return -ENOTTY;
4810
4811	v4l2_ctrl_s_ctrl(sd->jpegqual, jcomp->quality);
4812	return 0;
4813}
4814
4815static int sd_g_volatile_ctrl(struct v4l2_ctrl *ctrl)
4816{
4817	struct gspca_dev *gspca_dev =
4818		container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
4819	struct sd *sd = (struct sd *)gspca_dev;
4820
4821	gspca_dev->usb_err = 0;
4822
4823	switch (ctrl->id) {
4824	case V4L2_CID_AUTOGAIN:
4825		gspca_dev->exposure->val = i2c_r(sd, 0x10);
4826		break;
4827	}
4828	return 0;
4829}
4830
4831static int sd_s_ctrl(struct v4l2_ctrl *ctrl)
4832{
4833	struct gspca_dev *gspca_dev =
4834		container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
4835	struct sd *sd = (struct sd *)gspca_dev;
4836
4837	gspca_dev->usb_err = 0;
4838
4839	if (!gspca_dev->streaming)
4840		return 0;
4841
4842	switch (ctrl->id) {
4843	case V4L2_CID_BRIGHTNESS:
4844		setbrightness(gspca_dev, ctrl->val);
4845		break;
4846	case V4L2_CID_CONTRAST:
4847		setcontrast(gspca_dev, ctrl->val);
4848		break;
4849	case V4L2_CID_POWER_LINE_FREQUENCY:
4850		setfreq(gspca_dev, ctrl->val);
4851		break;
4852	case V4L2_CID_AUTOBRIGHTNESS:
4853		if (ctrl->is_new)
4854			setautobright(gspca_dev, ctrl->val);
4855		if (!ctrl->val && sd->brightness->is_new)
4856			setbrightness(gspca_dev, sd->brightness->val);
4857		break;
4858	case V4L2_CID_SATURATION:
4859		setcolors(gspca_dev, ctrl->val);
4860		break;
4861	case V4L2_CID_HFLIP:
4862		sethvflip(gspca_dev, ctrl->val, sd->vflip->val);
4863		break;
4864	case V4L2_CID_AUTOGAIN:
4865		if (ctrl->is_new)
4866			setautogain(gspca_dev, ctrl->val);
4867		if (!ctrl->val && gspca_dev->exposure->is_new)
4868			setexposure(gspca_dev, gspca_dev->exposure->val);
4869		break;
4870	case V4L2_CID_JPEG_COMPRESSION_QUALITY:
4871		return -EBUSY; /* Should never happen, as we grab the ctrl */
4872	}
4873	return gspca_dev->usb_err;
4874}
4875
4876static const struct v4l2_ctrl_ops sd_ctrl_ops = {
4877	.g_volatile_ctrl = sd_g_volatile_ctrl,
4878	.s_ctrl = sd_s_ctrl,
4879};
4880
4881static int sd_init_controls(struct gspca_dev *gspca_dev)
4882{
4883	struct sd *sd = (struct sd *)gspca_dev;
4884	struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler;
4885
4886	gspca_dev->vdev.ctrl_handler = hdl;
4887	v4l2_ctrl_handler_init(hdl, 10);
4888	if (valid_controls[sd->sensor].has_brightness)
4889		sd->brightness = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
4890			V4L2_CID_BRIGHTNESS, 0,
4891			sd->sensor == SEN_OV7660 ? 6 : 255, 1,
4892			sd->sensor == SEN_OV7660 ? 3 : 127);
4893	if (valid_controls[sd->sensor].has_contrast) {
4894		if (sd->sensor == SEN_OV7660)
4895			v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
4896				V4L2_CID_CONTRAST, 0, 6, 1, 3);
4897		else
4898			v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
4899				V4L2_CID_CONTRAST, 0, 255, 1,
4900				(sd->sensor == SEN_OV6630 ||
4901				 sd->sensor == SEN_OV66308AF) ? 200 : 127);
4902	}
4903	if (valid_controls[sd->sensor].has_sat)
4904		v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
4905			V4L2_CID_SATURATION, 0,
4906			sd->sensor == SEN_OV7660 ? 4 : 255, 1,
4907			sd->sensor == SEN_OV7660 ? 2 : 127);
4908	if (valid_controls[sd->sensor].has_exposure)
4909		gspca_dev->exposure = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
4910			V4L2_CID_EXPOSURE, 0, 255, 1, 127);
4911	if (valid_controls[sd->sensor].has_hvflip) {
4912		sd->hflip = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
4913			V4L2_CID_HFLIP, 0, 1, 1, 0);
4914		sd->vflip = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
4915			V4L2_CID_VFLIP, 0, 1, 1, 0);
4916	}
4917	if (valid_controls[sd->sensor].has_autobright)
4918		sd->autobright = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
4919			V4L2_CID_AUTOBRIGHTNESS, 0, 1, 1, 1);
4920	if (valid_controls[sd->sensor].has_autogain)
4921		gspca_dev->autogain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
4922			V4L2_CID_AUTOGAIN, 0, 1, 1, 1);
4923	if (valid_controls[sd->sensor].has_freq) {
4924		if (sd->sensor == SEN_OV7670)
4925			sd->freq = v4l2_ctrl_new_std_menu(hdl, &sd_ctrl_ops,
4926				V4L2_CID_POWER_LINE_FREQUENCY,
4927				V4L2_CID_POWER_LINE_FREQUENCY_AUTO, 0,
4928				V4L2_CID_POWER_LINE_FREQUENCY_AUTO);
4929		else
4930			sd->freq = v4l2_ctrl_new_std_menu(hdl, &sd_ctrl_ops,
4931				V4L2_CID_POWER_LINE_FREQUENCY,
4932				V4L2_CID_POWER_LINE_FREQUENCY_60HZ, 0, 0);
4933	}
4934	if (sd->bridge == BRIDGE_W9968CF)
4935		sd->jpegqual = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
4936			V4L2_CID_JPEG_COMPRESSION_QUALITY,
4937			QUALITY_MIN, QUALITY_MAX, 1, QUALITY_DEF);
4938
4939	if (hdl->error) {
4940		gspca_err(gspca_dev, "Could not initialize controls\n");
4941		return hdl->error;
4942	}
4943	if (gspca_dev->autogain)
4944		v4l2_ctrl_auto_cluster(3, &gspca_dev->autogain, 0, true);
4945	if (sd->autobright)
4946		v4l2_ctrl_auto_cluster(2, &sd->autobright, 0, false);
4947	if (sd->hflip)
4948		v4l2_ctrl_cluster(2, &sd->hflip);
4949	return 0;
4950}
4951
4952/* sub-driver description */
4953static const struct sd_desc sd_desc = {
4954	.name = MODULE_NAME,
4955	.config = sd_config,
4956	.init = sd_init,
4957	.init_controls = sd_init_controls,
4958	.isoc_init = sd_isoc_init,
4959	.start = sd_start,
4960	.stopN = sd_stopN,
4961	.stop0 = sd_stop0,
4962	.pkt_scan = sd_pkt_scan,
4963	.dq_callback = sd_reset_snapshot,
4964	.get_jcomp = sd_get_jcomp,
4965	.set_jcomp = sd_set_jcomp,
4966#if IS_ENABLED(CONFIG_INPUT)
4967	.other_input = 1,
4968#endif
4969};
4970
4971/* -- module initialisation -- */
4972static const struct usb_device_id device_table[] = {
4973	{USB_DEVICE(0x041e, 0x4003), .driver_info = BRIDGE_W9968CF },
4974	{USB_DEVICE(0x041e, 0x4052),
4975		.driver_info = BRIDGE_OV519 | BRIDGE_INVERT_LED },
4976	{USB_DEVICE(0x041e, 0x405f), .driver_info = BRIDGE_OV519 },
4977	{USB_DEVICE(0x041e, 0x4060), .driver_info = BRIDGE_OV519 },
4978	{USB_DEVICE(0x041e, 0x4061), .driver_info = BRIDGE_OV519 },
4979	{USB_DEVICE(0x041e, 0x4064), .driver_info = BRIDGE_OV519 },
4980	{USB_DEVICE(0x041e, 0x4067), .driver_info = BRIDGE_OV519 },
4981	{USB_DEVICE(0x041e, 0x4068), .driver_info = BRIDGE_OV519 },
4982	{USB_DEVICE(0x045e, 0x028c),
4983		.driver_info = BRIDGE_OV519 | BRIDGE_INVERT_LED },
4984	{USB_DEVICE(0x054c, 0x0154), .driver_info = BRIDGE_OV519 },
4985	{USB_DEVICE(0x054c, 0x0155), .driver_info = BRIDGE_OV519 },
4986	{USB_DEVICE(0x05a9, 0x0511), .driver_info = BRIDGE_OV511 },
4987	{USB_DEVICE(0x05a9, 0x0518), .driver_info = BRIDGE_OV518 },
4988	{USB_DEVICE(0x05a9, 0x0519),
4989		.driver_info = BRIDGE_OV519 | BRIDGE_INVERT_LED },
4990	{USB_DEVICE(0x05a9, 0x0530),
4991		.driver_info = BRIDGE_OV519 | BRIDGE_INVERT_LED },
4992	{USB_DEVICE(0x05a9, 0x2800), .driver_info = BRIDGE_OVFX2 },
4993	{USB_DEVICE(0x05a9, 0x4519), .driver_info = BRIDGE_OV519 },
4994	{USB_DEVICE(0x05a9, 0x8519), .driver_info = BRIDGE_OV519 },
4995	{USB_DEVICE(0x05a9, 0xa511), .driver_info = BRIDGE_OV511PLUS },
4996	{USB_DEVICE(0x05a9, 0xa518), .driver_info = BRIDGE_OV518PLUS },
4997	{USB_DEVICE(0x0813, 0x0002), .driver_info = BRIDGE_OV511PLUS },
4998	{USB_DEVICE(0x0b62, 0x0059), .driver_info = BRIDGE_OVFX2 },
4999	{USB_DEVICE(0x0e96, 0xc001), .driver_info = BRIDGE_OVFX2 },
5000	{USB_DEVICE(0x1046, 0x9967), .driver_info = BRIDGE_W9968CF },
5001	{USB_DEVICE(0x8020, 0xef04), .driver_info = BRIDGE_OVFX2 },
5002	{}
5003};
5004
5005MODULE_DEVICE_TABLE(usb, device_table);
5006
5007/* -- device connect -- */
5008static int sd_probe(struct usb_interface *intf,
5009			const struct usb_device_id *id)
5010{
5011	return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd),
5012				THIS_MODULE);
5013}
5014
5015static struct usb_driver sd_driver = {
5016	.name = MODULE_NAME,
5017	.id_table = device_table,
5018	.probe = sd_probe,
5019	.disconnect = gspca_disconnect,
5020#ifdef CONFIG_PM
5021	.suspend = gspca_suspend,
5022	.resume = gspca_resume,
5023	.reset_resume = gspca_resume,
5024#endif
5025};
5026
5027module_usb_driver(sd_driver);
5028
5029module_param(frame_rate, int, 0644);
5030MODULE_PARM_DESC(frame_rate, "Frame rate (5, 10, 15, 20 or 30 fps)");
5031