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