1 /*
2  * OmniVision OV511 Camera-to-USB Bridge Driver
3  *
4  * Copyright (c) 1999-2003 Mark W. McClelland
5  * Original decompression code Copyright 1998-2000 OmniVision Technologies
6  * Many improvements by Bret Wallach <bwallac1@san.rr.com>
7  * Color fixes by by Orion Sky Lawlor <olawlor@acm.org> (2/26/2000)
8  * Snapshot code by Kevin Moore
9  * OV7620 fixes by Charl P. Botha <cpbotha@ieee.org>
10  * Changes by Claudio Matsuoka <claudio@conectiva.com>
11  * Original SAA7111A code by Dave Perks <dperks@ibm.net>
12  * URB error messages from pwc driver by Nemosoft
13  * generic_ioctl() code from videodev.c by Gerd Knorr and Alan Cox
14  * Memory management (rvmalloc) code from bttv driver, by Gerd Knorr and others
15  *
16  * Based on the Linux CPiA driver written by Peter Pregler,
17  * Scott J. Bertin and Johannes Erdfelt.
18  *
19  * Please see the file: linux/Documentation/usb/ov511.txt
20  * and the website at:  http://alpha.dyndns.org/ov511
21  * for more info.
22  *
23  * This program is free software; you can redistribute it and/or modify it
24  * under the terms of the GNU General Public License as published by the
25  * Free Software Foundation; either version 2 of the License, or (at your
26  * option) any later version.
27  *
28  * This program is distributed in the hope that it will be useful, but
29  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
30  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
31  * for more details.
32  *
33  * You should have received a copy of the GNU General Public License
34  * along with this program; if not, write to the Free Software Foundation,
35  * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
36  */
37 
38 #include <linux/config.h>
39 #include <linux/version.h>
40 #include <linux/module.h>
41 #include <linux/init.h>
42 #include <linux/fs.h>
43 #include <linux/vmalloc.h>
44 #include <linux/slab.h>
45 #include <linux/proc_fs.h>
46 #include <linux/ctype.h>
47 #include <linux/pagemap.h>
48 #include <asm/io.h>
49 #include <asm/semaphore.h>
50 #include <asm/processor.h>
51 #include <linux/wrapper.h>
52 #include <linux/mm.h>
53 
54 #if defined (__i386__)
55 	#include <asm/cpufeature.h>
56 #endif
57 
58 #include "ov511.h"
59 
60 /*
61  * Version Information
62  */
63 #define DRIVER_VERSION "v1.63 for Linux 2.4"
64 #define EMAIL "mark@alpha.dyndns.org"
65 #define DRIVER_AUTHOR "Mark McClelland <mark@alpha.dyndns.org> & Bret Wallach \
66 	& Orion Sky Lawlor <olawlor@acm.org> & Kevin Moore & Charl P. Botha \
67 	<cpbotha@ieee.org> & Claudio Matsuoka <claudio@conectiva.com>"
68 #define DRIVER_DESC "ov511 USB Camera Driver"
69 
70 #define OV511_I2C_RETRIES 3
71 #define ENABLE_Y_QUANTABLE 1
72 #define ENABLE_UV_QUANTABLE 1
73 
74 #define OV511_MAX_UNIT_VIDEO 16
75 
76 /* Pixel count * 3 bytes for RGB */
77 #define MAX_FRAME_SIZE(w, h) ((w) * (h) * 3)
78 
79 #define MAX_DATA_SIZE(w, h) (MAX_FRAME_SIZE(w, h) + sizeof(struct timeval))
80 
81 /* Max size * bytes per YUV420 pixel (1.5) + one extra isoc frame for safety */
82 #define MAX_RAW_DATA_SIZE(w, h) ((w) * (h) * 3 / 2 + 1024)
83 
84 #define FATAL_ERROR(rc) ((rc) < 0 && (rc) != -EPERM)
85 
86 /**********************************************************************
87  * Module Parameters
88  * (See ov511.txt for detailed descriptions of these)
89  **********************************************************************/
90 
91 /* These variables (and all static globals) default to zero */
92 static int autobright		= 1;
93 static int autogain		= 1;
94 static int autoexp		= 1;
95 static int debug;
96 static int snapshot;
97 static int fix_rgb_offset;
98 static int force_rgb;
99 static int cams			= 1;
100 static int compress;
101 static int testpat;
102 static int dumppix;
103 static int led 			= 1;
104 static int dump_bridge;
105 static int dump_sensor;
106 static int printph;
107 static int phy			= 0x1f;
108 static int phuv			= 0x05;
109 static int pvy			= 0x06;
110 static int pvuv			= 0x06;
111 static int qhy			= 0x14;
112 static int qhuv			= 0x03;
113 static int qvy			= 0x04;
114 static int qvuv			= 0x04;
115 static int lightfreq;
116 static int bandingfilter;
117 static int clockdiv		= -1;
118 static int packetsize		= -1;
119 static int framedrop		= -1;
120 static int fastset;
121 static int force_palette;
122 static int backlight;
123 static int unit_video[OV511_MAX_UNIT_VIDEO];
124 static int remove_zeros;
125 static int mirror;
126 static int ov518_color;
127 
128 MODULE_PARM(autobright, "i");
129 MODULE_PARM_DESC(autobright, "Sensor automatically changes brightness");
130 MODULE_PARM(autogain, "i");
131 MODULE_PARM_DESC(autogain, "Sensor automatically changes gain");
132 MODULE_PARM(autoexp, "i");
133 MODULE_PARM_DESC(autoexp, "Sensor automatically changes exposure");
134 MODULE_PARM(debug, "i");
135 MODULE_PARM_DESC(debug,
136   "Debug level: 0=none, 1=inits, 2=warning, 3=config, 4=functions, 5=max");
137 MODULE_PARM(snapshot, "i");
138 MODULE_PARM_DESC(snapshot, "Enable snapshot mode");
139 MODULE_PARM(fix_rgb_offset, "i");
140 MODULE_PARM_DESC(fix_rgb_offset,
141   "Fix vertical misalignment of red and blue at 640x480");
142 MODULE_PARM(force_rgb, "i");
143 MODULE_PARM_DESC(force_rgb, "Read RGB instead of BGR");
144 MODULE_PARM(cams, "i");
145 MODULE_PARM_DESC(cams, "Number of simultaneous cameras");
146 MODULE_PARM(compress, "i");
147 MODULE_PARM_DESC(compress, "Turn on compression (not reliable yet)");
148 MODULE_PARM(testpat, "i");
149 MODULE_PARM_DESC(testpat,
150   "Replace image with vertical bar testpattern (only partially working)");
151 MODULE_PARM(dumppix, "i");
152 MODULE_PARM_DESC(dumppix, "Dump raw pixel data");
153 MODULE_PARM(led, "i");
154 MODULE_PARM_DESC(led,
155   "LED policy (OV511+ or later). 0=off, 1=on (default), 2=auto (on when open)");
156 MODULE_PARM(dump_bridge, "i");
157 MODULE_PARM_DESC(dump_bridge, "Dump the bridge registers");
158 MODULE_PARM(dump_sensor, "i");
159 MODULE_PARM_DESC(dump_sensor, "Dump the sensor registers");
160 MODULE_PARM(printph, "i");
161 MODULE_PARM_DESC(printph, "Print frame start/end headers");
162 MODULE_PARM(phy, "i");
163 MODULE_PARM_DESC(phy, "Prediction range (horiz. Y)");
164 MODULE_PARM(phuv, "i");
165 MODULE_PARM_DESC(phuv, "Prediction range (horiz. UV)");
166 MODULE_PARM(pvy, "i");
167 MODULE_PARM_DESC(pvy, "Prediction range (vert. Y)");
168 MODULE_PARM(pvuv, "i");
169 MODULE_PARM_DESC(pvuv, "Prediction range (vert. UV)");
170 MODULE_PARM(qhy, "i");
171 MODULE_PARM_DESC(qhy, "Quantization threshold (horiz. Y)");
172 MODULE_PARM(qhuv, "i");
173 MODULE_PARM_DESC(qhuv, "Quantization threshold (horiz. UV)");
174 MODULE_PARM(qvy, "i");
175 MODULE_PARM_DESC(qvy, "Quantization threshold (vert. Y)");
176 MODULE_PARM(qvuv, "i");
177 MODULE_PARM_DESC(qvuv, "Quantization threshold (vert. UV)");
178 MODULE_PARM(lightfreq, "i");
179 MODULE_PARM_DESC(lightfreq,
180   "Light frequency. Set to 50 or 60 Hz, or zero for default settings");
181 MODULE_PARM(bandingfilter, "i");
182 MODULE_PARM_DESC(bandingfilter,
183   "Enable banding filter (to reduce effects of fluorescent lighting)");
184 MODULE_PARM(clockdiv, "i");
185 MODULE_PARM_DESC(clockdiv, "Force pixel clock divisor to a specific value");
186 MODULE_PARM(packetsize, "i");
187 MODULE_PARM_DESC(packetsize, "Force a specific isoc packet size");
188 MODULE_PARM(framedrop, "i");
189 MODULE_PARM_DESC(framedrop, "Force a specific frame drop register setting");
190 MODULE_PARM(fastset, "i");
191 MODULE_PARM_DESC(fastset, "Allows picture settings to take effect immediately");
192 MODULE_PARM(force_palette, "i");
193 MODULE_PARM_DESC(force_palette, "Force the palette to a specific value");
194 MODULE_PARM(backlight, "i");
195 MODULE_PARM_DESC(backlight, "For objects that are lit from behind");
196 MODULE_PARM(unit_video, "1-" __MODULE_STRING(OV511_MAX_UNIT_VIDEO) "i");
197 MODULE_PARM_DESC(unit_video,
198   "Force use of specific minor number(s). 0 is not allowed.");
199 MODULE_PARM(remove_zeros, "i");
200 MODULE_PARM_DESC(remove_zeros,
201   "Remove zero-padding from uncompressed incoming data");
202 MODULE_PARM(mirror, "i");
203 MODULE_PARM_DESC(mirror, "Reverse image horizontally");
204 MODULE_PARM(ov518_color, "i");
205 MODULE_PARM_DESC(ov518_color, "Enable OV518 color (experimental)");
206 
207 MODULE_AUTHOR(DRIVER_AUTHOR);
208 MODULE_DESCRIPTION(DRIVER_DESC);
209 MODULE_LICENSE("GPL");
210 
211 /**********************************************************************
212  * Miscellaneous Globals
213  **********************************************************************/
214 
215 static struct usb_driver ov511_driver;
216 
217 static struct ov51x_decomp_ops *ov511_decomp_ops;
218 static struct ov51x_decomp_ops *ov511_mmx_decomp_ops;
219 static struct ov51x_decomp_ops *ov518_decomp_ops;
220 static struct ov51x_decomp_ops *ov518_mmx_decomp_ops;
221 
222 /* Number of times to retry a failed I2C transaction. Increase this if you
223  * are getting "Failed to read sensor ID..." */
224 static int i2c_detect_tries = 5;
225 
226 /* MMX support is present in kernel and CPU. Checked upon decomp module load. */
227 static int ov51x_mmx_available;
228 
229 static struct usb_device_id device_table [] = {
230 	{ USB_DEVICE(VEND_OMNIVISION, PROD_OV511) },
231 	{ USB_DEVICE(VEND_OMNIVISION, PROD_OV511PLUS) },
232 	{ USB_DEVICE(VEND_OMNIVISION, PROD_OV518) },
233 	{ USB_DEVICE(VEND_OMNIVISION, PROD_OV518PLUS) },
234 	{ USB_DEVICE(VEND_MATTEL, PROD_ME2CAM) },
235 	{ }  /* Terminating entry */
236 };
237 
238 MODULE_DEVICE_TABLE (usb, device_table);
239 
240 static unsigned char yQuanTable511[] = OV511_YQUANTABLE;
241 static unsigned char uvQuanTable511[] = OV511_UVQUANTABLE;
242 static unsigned char yQuanTable518[] = OV518_YQUANTABLE;
243 static unsigned char uvQuanTable518[] = OV518_UVQUANTABLE;
244 
245 /**********************************************************************
246  * Symbolic Names
247  **********************************************************************/
248 
249 /* Known OV511-based cameras */
250 static struct symbolic_list camlist[] = {
251 	{   0, "Generic Camera (no ID)" },
252 	{   1, "Mustek WCam 3X" },
253 	{   3, "D-Link DSB-C300" },
254 	{   4, "Generic OV511/OV7610" },
255 	{   5, "Puretek PT-6007" },
256 	{   6, "Lifeview USB Life TV (NTSC)" },
257 	{  21, "Creative Labs WebCam 3" },
258 	{  22, "Lifeview USB Life TV (PAL D/K+B/G)" },
259 	{  36, "Koala-Cam" },
260 	{  38, "Lifeview USB Life TV (PAL)" },
261 	{  41, "Samsung Anycam MPC-M10" },
262 	{  43, "Mtekvision Zeca MV402" },
263 	{  46, "Suma eON" },
264 	{  70, "Lifeview USB Life TV (PAL/SECAM)" },
265 	{ 100, "Lifeview RoboCam" },
266 	{ 102, "AverMedia InterCam Elite" },
267 	{ 112, "MediaForte MV300" },	/* or OV7110 evaluation kit */
268 	{ 134, "Ezonics EZCam II" },
269 	{ 192, "Webeye 2000B" },
270 	{ 253, "Alpha Vision Tech. AlphaCam SE" },
271 	{  -1, NULL }
272 };
273 
274 /* Video4Linux1 Palettes */
275 static struct symbolic_list v4l1_plist[] = {
276 	{ VIDEO_PALETTE_GREY,	"GREY" },
277 	{ VIDEO_PALETTE_HI240,	"HI240" },
278 	{ VIDEO_PALETTE_RGB565,	"RGB565" },
279 	{ VIDEO_PALETTE_RGB24,	"RGB24" },
280 	{ VIDEO_PALETTE_RGB32,	"RGB32" },
281 	{ VIDEO_PALETTE_RGB555,	"RGB555" },
282 	{ VIDEO_PALETTE_YUV422,	"YUV422" },
283 	{ VIDEO_PALETTE_YUYV,	"YUYV" },
284 	{ VIDEO_PALETTE_UYVY,	"UYVY" },
285 	{ VIDEO_PALETTE_YUV420,	"YUV420" },
286 	{ VIDEO_PALETTE_YUV411,	"YUV411" },
287 	{ VIDEO_PALETTE_RAW,	"RAW" },
288 	{ VIDEO_PALETTE_YUV422P,"YUV422P" },
289 	{ VIDEO_PALETTE_YUV411P,"YUV411P" },
290 	{ VIDEO_PALETTE_YUV420P,"YUV420P" },
291 	{ VIDEO_PALETTE_YUV410P,"YUV410P" },
292 	{ -1, NULL }
293 };
294 
295 static struct symbolic_list brglist[] = {
296 	{ BRG_OV511,		"OV511" },
297 	{ BRG_OV511PLUS,	"OV511+" },
298 	{ BRG_OV518,		"OV518" },
299 	{ BRG_OV518PLUS,	"OV518+" },
300 	{ -1, NULL }
301 };
302 
303 #if defined(CONFIG_VIDEO_PROC_FS)
304 static struct symbolic_list senlist[] = {
305 	{ SEN_OV76BE,	"OV76BE" },
306 	{ SEN_OV7610,	"OV7610" },
307 	{ SEN_OV7620,	"OV7620" },
308 	{ SEN_OV7620AE,	"OV7620AE" },
309 	{ SEN_OV6620,	"OV6620" },
310 	{ SEN_OV6630,	"OV6630" },
311 	{ SEN_OV6630AE,	"OV6630AE" },
312 	{ SEN_OV6630AF,	"OV6630AF" },
313 	{ SEN_OV8600,	"OV8600" },
314 	{ SEN_KS0127,	"KS0127" },
315 	{ SEN_KS0127B,	"KS0127B" },
316 	{ SEN_SAA7111A,	"SAA7111A" },
317 	{ -1, NULL }
318 };
319 #endif
320 
321 /* URB error codes: */
322 static struct symbolic_list urb_errlist[] = {
323 	{ -ENOSR,	"Buffer error (overrun)" },
324 	{ -EPIPE,	"Stalled (device not responding)" },
325 	{ -EOVERFLOW,	"Babble (bad cable?)" },
326 	{ -EPROTO,	"Bit-stuff error (bad cable?)" },
327 	{ -EILSEQ,	"CRC/Timeout" },
328 	{ -ETIMEDOUT,	"NAK (device does not respond)" },
329 	{ -1, NULL }
330 };
331 
332 /**********************************************************************
333  * Prototypes
334  **********************************************************************/
335 
336 static void ov51x_clear_snapshot(struct usb_ov511 *);
337 static int sensor_get_picture(struct usb_ov511 *,
338 			      struct video_picture *);
339 #if defined(CONFIG_PROC_FS) && defined(CONFIG_VIDEO_PROC_FS)
340 static int sensor_get_exposure(struct usb_ov511 *, unsigned char *);
341 static int ov51x_control_ioctl(struct inode *, struct file *, unsigned int,
342 			       unsigned long);
343 static int ov51x_check_snapshot(struct usb_ov511 *);
344 #endif
345 
346 /**********************************************************************
347  * Memory management
348  **********************************************************************/
349 
350 /* Here we want the physical address of the memory.
351  * This is used when initializing the contents of the area.
352  */
353 static inline unsigned long
kvirt_to_pa(unsigned long adr)354 kvirt_to_pa(unsigned long adr)
355 {
356 	unsigned long kva, ret;
357 
358 	kva = (unsigned long) page_address(vmalloc_to_page((void *)adr));
359 	kva |= adr & (PAGE_SIZE-1); /* restore the offset */
360 	ret = __pa(kva);
361 	return ret;
362 }
363 
364 static void *
rvmalloc(unsigned long size)365 rvmalloc(unsigned long size)
366 {
367 	void *mem;
368 	unsigned long adr;
369 
370 	size = PAGE_ALIGN(size);
371 	mem = vmalloc_32(size);
372 	if (!mem)
373 		return NULL;
374 
375 	memset(mem, 0, size); /* Clear the ram out, no junk to the user */
376 	adr = (unsigned long) mem;
377 	while (size > 0) {
378 		mem_map_reserve(vmalloc_to_page((void *)adr));
379 		adr += PAGE_SIZE;
380 		size -= PAGE_SIZE;
381 	}
382 
383 	return mem;
384 }
385 
386 static void
rvfree(void * mem,unsigned long size)387 rvfree(void *mem, unsigned long size)
388 {
389 	unsigned long adr;
390 
391 	if (!mem)
392 		return;
393 
394 	adr = (unsigned long) mem;
395 	while ((long) size > 0) {
396 		mem_map_unreserve(vmalloc_to_page((void *)adr));
397 		adr += PAGE_SIZE;
398 		size -= PAGE_SIZE;
399 	}
400 	vfree(mem);
401 }
402 
403 /**********************************************************************
404  * /proc interface
405  * Based on the CPiA driver version 0.7.4 -claudio
406  **********************************************************************/
407 
408 #if defined(CONFIG_PROC_FS) && defined(CONFIG_VIDEO_PROC_FS)
409 
410 static struct proc_dir_entry *ov511_proc_entry = NULL;
411 extern struct proc_dir_entry *video_proc_entry;
412 
413 static struct file_operations ov511_control_fops = {
414 	.ioctl =	ov51x_control_ioctl,
415 };
416 
417 #define YES_NO(x) ((x) ? "yes" : "no")
418 
419 /* /proc/video/ov511/<minor#>/info */
420 static int
ov511_read_proc_info(char * page,char ** start,off_t off,int count,int * eof,void * data)421 ov511_read_proc_info(char *page, char **start, off_t off, int count, int *eof,
422 		     void *data)
423 {
424 	char *out = page;
425 	int i, len;
426 	struct usb_ov511 *ov = data;
427 	struct video_picture p;
428 	unsigned char exp;
429 
430 	if (!ov || !ov->dev)
431 		return -ENODEV;
432 
433 	sensor_get_picture(ov, &p);
434 	sensor_get_exposure(ov, &exp);
435 
436 	/* IMPORTANT: This output MUST be kept under PAGE_SIZE
437 	 *            or we need to get more sophisticated. */
438 
439 	out += sprintf(out, "driver_version  : %s\n", DRIVER_VERSION);
440 	out += sprintf(out, "custom_id       : %d\n", ov->customid);
441 	out += sprintf(out, "model           : %s\n", ov->desc);
442 	out += sprintf(out, "streaming       : %s\n", YES_NO(ov->streaming));
443 	out += sprintf(out, "grabbing        : %s\n", YES_NO(ov->grabbing));
444 	out += sprintf(out, "compress        : %s\n", YES_NO(ov->compress));
445 	out += sprintf(out, "subcapture      : %s\n", YES_NO(ov->sub_flag));
446 	out += sprintf(out, "sub_size        : %d %d %d %d\n",
447 		       ov->subx, ov->suby, ov->subw, ov->subh);
448 	out += sprintf(out, "data_format     : %s\n",
449 		       force_rgb ? "RGB" : "BGR");
450 	out += sprintf(out, "brightness      : %d\n", p.brightness >> 8);
451 	out += sprintf(out, "colour          : %d\n", p.colour >> 8);
452 	out += sprintf(out, "contrast        : %d\n", p.contrast >> 8);
453 	out += sprintf(out, "hue             : %d\n", p.hue >> 8);
454 	out += sprintf(out, "exposure        : %d\n", exp);
455 	out += sprintf(out, "num_frames      : %d\n", OV511_NUMFRAMES);
456 	for (i = 0; i < OV511_NUMFRAMES; i++) {
457 		out += sprintf(out, "frame           : %d\n", i);
458 		out += sprintf(out, "  depth         : %d\n",
459 			       ov->frame[i].depth);
460 		out += sprintf(out, "  size          : %d %d\n",
461 			       ov->frame[i].width, ov->frame[i].height);
462 		out += sprintf(out, "  format        : %s\n",
463 			       symbolic(v4l1_plist, ov->frame[i].format));
464 		out += sprintf(out, "  data_buffer   : 0x%p\n",
465 			       ov->frame[i].data);
466 	}
467 	out += sprintf(out, "snap_enabled    : %s\n", YES_NO(ov->snap_enabled));
468 	out += sprintf(out, "bridge          : %s\n",
469 		       symbolic(brglist, ov->bridge));
470 	out += sprintf(out, "sensor          : %s\n",
471 		       symbolic(senlist, ov->sensor));
472 	out += sprintf(out, "packet_size     : %d\n", ov->packet_size);
473 	out += sprintf(out, "framebuffer     : 0x%p\n", ov->fbuf);
474 	out += sprintf(out, "packet_numbering: %d\n", ov->packet_numbering);
475 	out += sprintf(out, "topology        : %s\n", ov->usb_path);
476 
477 	len = out - page;
478 	len -= off;
479 	if (len < count) {
480 		*eof = 1;
481 		if (len <= 0)
482 			return 0;
483 	} else
484 		len = count;
485 
486 	*start = page + off;
487 
488 	return len;
489 }
490 
491 /* /proc/video/ov511/<minor#>/button
492  *
493  * When the camera's button is pressed, the output of this will change from a
494  * 0 to a 1 (ASCII). It will retain this value until it is read, after which
495  * it will reset to zero.
496  *
497  * SECURITY NOTE: Since reading this file can change the state of the snapshot
498  * status, it is important for applications that open it to keep it locked
499  * against access by other processes, using flock() or a similar mechanism. No
500  * locking is provided by this driver.
501  */
502 static int
ov511_read_proc_button(char * page,char ** start,off_t off,int count,int * eof,void * data)503 ov511_read_proc_button(char *page, char **start, off_t off, int count, int *eof,
504 		       void *data)
505 {
506 	char *out = page;
507 	int len, status;
508 	struct usb_ov511 *ov = data;
509 
510 	if (!ov || !ov->dev)
511 		return -ENODEV;
512 
513 	status = ov51x_check_snapshot(ov);
514 	out += sprintf(out, "%d", status);
515 
516 	if (status)
517 		ov51x_clear_snapshot(ov);
518 
519 	len = out - page;
520 	len -= off;
521 	if (len < count) {
522 		*eof = 1;
523 		if (len <= 0)
524 			return 0;
525 	} else {
526 		len = count;
527 	}
528 
529 	*start = page + off;
530 
531 	return len;
532 }
533 
534 static void
create_proc_ov511_cam(struct usb_ov511 * ov)535 create_proc_ov511_cam(struct usb_ov511 *ov)
536 {
537 	char dirname[10];
538 
539 	if (!ov511_proc_entry || !ov)
540 		return;
541 
542 	/* Create per-device directory */
543 	snprintf(dirname, 10, "%d", ov->vdev.minor);
544 	PDEBUG(4, "creating /proc/video/ov511/%s/", dirname);
545 	ov->proc_devdir = create_proc_entry(dirname, S_IFDIR, ov511_proc_entry);
546 	if (!ov->proc_devdir)
547 		return;
548 	ov->proc_devdir->owner = THIS_MODULE;
549 
550 	/* Create "info" entry (human readable device information) */
551 	PDEBUG(4, "creating /proc/video/ov511/%s/info", dirname);
552 	ov->proc_info = create_proc_read_entry("info", S_IFREG|S_IRUGO|S_IWUSR,
553 		ov->proc_devdir, ov511_read_proc_info, ov);
554 	if (!ov->proc_info)
555 		return;
556 	ov->proc_info->owner = THIS_MODULE;
557 
558 	/* Don't create it if old snapshot mode on (would cause race cond.) */
559 	if (!snapshot) {
560 		/* Create "button" entry (snapshot button status) */
561 		PDEBUG(4, "creating /proc/video/ov511/%s/button", dirname);
562 		ov->proc_button = create_proc_read_entry("button",
563 			S_IFREG|S_IRUGO|S_IWUSR, ov->proc_devdir,
564 			ov511_read_proc_button, ov);
565 		if (!ov->proc_button)
566 			return;
567 		ov->proc_button->owner = THIS_MODULE;
568 	}
569 
570 	/* Create "control" entry (ioctl() interface) */
571 	PDEBUG(4, "creating /proc/video/ov511/%s/control", dirname);
572 	lock_kernel();
573 	ov->proc_control = create_proc_entry("control",	S_IFREG|S_IRUGO|S_IWUSR,
574 		ov->proc_devdir);
575 	if (!ov->proc_control) {
576 		unlock_kernel();
577 		return;
578 	}
579 	ov->proc_control->owner = THIS_MODULE;
580 	ov->proc_control->data = ov;
581 	ov->proc_control->proc_fops = &ov511_control_fops;
582 	unlock_kernel();
583 }
584 
585 static void
destroy_proc_ov511_cam(struct usb_ov511 * ov)586 destroy_proc_ov511_cam(struct usb_ov511 *ov)
587 {
588 	char dirname[10];
589 
590 	if (!ov || !ov->proc_devdir)
591 		return;
592 
593 	snprintf(dirname, 10, "%d", ov->vdev.minor);
594 
595 	/* Destroy "control" entry */
596 	if (ov->proc_control) {
597 		PDEBUG(4, "destroying /proc/video/ov511/%s/control", dirname);
598 		remove_proc_entry("control", ov->proc_devdir);
599 		ov->proc_control = NULL;
600 	}
601 
602 	/* Destroy "button" entry */
603 	if (ov->proc_button) {
604 		PDEBUG(4, "destroying /proc/video/ov511/%s/button", dirname);
605 		remove_proc_entry("button", ov->proc_devdir);
606 		ov->proc_button = NULL;
607 	}
608 
609 	/* Destroy "info" entry */
610 	if (ov->proc_info) {
611 		PDEBUG(4, "destroying /proc/video/ov511/%s/info", dirname);
612 		remove_proc_entry("info", ov->proc_devdir);
613 		ov->proc_info = NULL;
614 	}
615 
616 	/* Destroy per-device directory */
617 	PDEBUG(4, "destroying /proc/video/ov511/%s/", dirname);
618 	remove_proc_entry(dirname, ov511_proc_entry);
619 	ov->proc_devdir = NULL;
620 }
621 
622 static void
proc_ov511_create(void)623 proc_ov511_create(void)
624 {
625 	/* No current standard here. Alan prefers /proc/video/ as it keeps
626 	 * /proc "less cluttered than /proc/randomcardifoundintheshed/"
627 	 * -claudio
628 	 */
629 	if (video_proc_entry == NULL) {
630 		err("Error: /proc/video/ does not exist");
631 		return;
632 	}
633 
634 	ov511_proc_entry = create_proc_entry("ov511", S_IFDIR,
635 					     video_proc_entry);
636 
637 	if (ov511_proc_entry)
638 		ov511_proc_entry->owner = THIS_MODULE;
639 	else
640 		err("Unable to create /proc/video/ov511");
641 }
642 
643 static void
proc_ov511_destroy(void)644 proc_ov511_destroy(void)
645 {
646 	PDEBUG(3, "removing /proc/video/ov511");
647 
648 	if (ov511_proc_entry == NULL)
649 		return;
650 
651 	remove_proc_entry("ov511", video_proc_entry);
652 }
653 #endif /* CONFIG_PROC_FS && CONFIG_VIDEO_PROC_FS */
654 
655 /**********************************************************************
656  *
657  * Register I/O
658  *
659  **********************************************************************/
660 
661 /* Write an OV51x register */
662 static int
reg_w(struct usb_ov511 * ov,unsigned char reg,unsigned char value)663 reg_w(struct usb_ov511 *ov, unsigned char reg, unsigned char value)
664 {
665 	int rc;
666 
667 	PDEBUG(5, "0x%02X:0x%02X", reg, value);
668 
669 	down(&ov->cbuf_lock);
670 	ov->cbuf[0] = value;
671 	rc = usb_control_msg(ov->dev,
672 			     usb_sndctrlpipe(ov->dev, 0),
673 			     (ov->bclass == BCL_OV518)?1:2 /* REG_IO */,
674 			     USB_TYPE_VENDOR | USB_RECIP_DEVICE,
675 			     0, (__u16)reg, &ov->cbuf[0], 1, HZ);
676 	up(&ov->cbuf_lock);
677 
678 	if (rc < 0)
679 		err("reg write: error %d: %s", rc, symbolic(urb_errlist, rc));
680 
681 	return rc;
682 }
683 
684 /* Read from an OV51x register */
685 /* returns: negative is error, pos or zero is data */
686 static int
reg_r(struct usb_ov511 * ov,unsigned char reg)687 reg_r(struct usb_ov511 *ov, unsigned char reg)
688 {
689 	int rc;
690 
691 	down(&ov->cbuf_lock);
692 	rc = usb_control_msg(ov->dev,
693 			     usb_rcvctrlpipe(ov->dev, 0),
694 			     (ov->bclass == BCL_OV518)?1:3 /* REG_IO */,
695 			     USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
696 			     0, (__u16)reg, &ov->cbuf[0], 1, HZ);
697 
698 	if (rc < 0) {
699 		err("reg read: error %d: %s", rc, symbolic(urb_errlist, rc));
700 	} else {
701 		rc = ov->cbuf[0];
702 		PDEBUG(5, "0x%02X:0x%02X", reg, ov->cbuf[0]);
703 	}
704 
705 	up(&ov->cbuf_lock);
706 
707 	return rc;
708 }
709 
710 /*
711  * Writes bits at positions specified by mask to an OV51x reg. Bits that are in
712  * the same position as 1's in "mask" are cleared and set to "value". Bits
713  * that are in the same position as 0's in "mask" are preserved, regardless
714  * of their respective state in "value".
715  */
716 static int
reg_w_mask(struct usb_ov511 * ov,unsigned char reg,unsigned char value,unsigned char mask)717 reg_w_mask(struct usb_ov511 *ov,
718 	   unsigned char reg,
719 	   unsigned char value,
720 	   unsigned char mask)
721 {
722 	int ret;
723 	unsigned char oldval, newval;
724 
725 	ret = reg_r(ov, reg);
726 	if (ret < 0)
727 		return ret;
728 
729 	oldval = (unsigned char) ret;
730 	oldval &= (~mask);		/* Clear the masked bits */
731 	value &= mask;			/* Enforce mask on value */
732 	newval = oldval | value;	/* Set the desired bits */
733 
734 	return (reg_w(ov, reg, newval));
735 }
736 
737 /*
738  * Writes multiple (n) byte value to a single register. Only valid with certain
739  * registers (0x30 and 0xc4 - 0xce).
740  */
741 static int
ov518_reg_w32(struct usb_ov511 * ov,unsigned char reg,u32 val,int n)742 ov518_reg_w32(struct usb_ov511 *ov, unsigned char reg, u32 val, int n)
743 {
744 	int rc;
745 
746 	PDEBUG(5, "0x%02X:%7d, n=%d", reg, val, n);
747 
748 	down(&ov->cbuf_lock);
749 
750 	*((u32 *)ov->cbuf) = __cpu_to_le32(val);
751 
752 	rc = usb_control_msg(ov->dev,
753 			     usb_sndctrlpipe(ov->dev, 0),
754 			     1 /* REG_IO */,
755 			     USB_TYPE_VENDOR | USB_RECIP_DEVICE,
756 			     0, (__u16)reg, ov->cbuf, n, HZ);
757 	up(&ov->cbuf_lock);
758 
759 	if (rc < 0)
760 		err("reg write multiple: error %d: %s", rc,
761 		    symbolic(urb_errlist, rc));
762 
763 	return rc;
764 }
765 
766 static int
ov511_upload_quan_tables(struct usb_ov511 * ov)767 ov511_upload_quan_tables(struct usb_ov511 *ov)
768 {
769 	unsigned char *pYTable = yQuanTable511;
770 	unsigned char *pUVTable = uvQuanTable511;
771 	unsigned char val0, val1;
772 	int i, rc, reg = R511_COMP_LUT_BEGIN;
773 
774 	PDEBUG(4, "Uploading quantization tables");
775 
776 	for (i = 0; i < OV511_QUANTABLESIZE / 2; i++) {
777 		if (ENABLE_Y_QUANTABLE)	{
778 			val0 = *pYTable++;
779 			val1 = *pYTable++;
780 			val0 &= 0x0f;
781 			val1 &= 0x0f;
782 			val0 |= val1 << 4;
783 			rc = reg_w(ov, reg, val0);
784 			if (rc < 0)
785 				return rc;
786 		}
787 
788 		if (ENABLE_UV_QUANTABLE) {
789 			val0 = *pUVTable++;
790 			val1 = *pUVTable++;
791 			val0 &= 0x0f;
792 			val1 &= 0x0f;
793 			val0 |= val1 << 4;
794 			rc = reg_w(ov, reg + OV511_QUANTABLESIZE/2, val0);
795 			if (rc < 0)
796 				return rc;
797 		}
798 
799 		reg++;
800 	}
801 
802 	return 0;
803 }
804 
805 /* OV518 quantization tables are 8x4 (instead of 8x8) */
806 static int
ov518_upload_quan_tables(struct usb_ov511 * ov)807 ov518_upload_quan_tables(struct usb_ov511 *ov)
808 {
809 	unsigned char *pYTable = yQuanTable518;
810 	unsigned char *pUVTable = uvQuanTable518;
811 	unsigned char val0, val1;
812 	int i, rc, reg = R511_COMP_LUT_BEGIN;
813 
814 	PDEBUG(4, "Uploading quantization tables");
815 
816 	for (i = 0; i < OV518_QUANTABLESIZE / 2; i++) {
817 		if (ENABLE_Y_QUANTABLE) {
818 			val0 = *pYTable++;
819 			val1 = *pYTable++;
820 			val0 &= 0x0f;
821 			val1 &= 0x0f;
822 			val0 |= val1 << 4;
823 			rc = reg_w(ov, reg, val0);
824 			if (rc < 0)
825 				return rc;
826 		}
827 
828 		if (ENABLE_UV_QUANTABLE) {
829 			val0 = *pUVTable++;
830 			val1 = *pUVTable++;
831 			val0 &= 0x0f;
832 			val1 &= 0x0f;
833 			val0 |= val1 << 4;
834 			rc = reg_w(ov, reg + OV518_QUANTABLESIZE/2, val0);
835 			if (rc < 0)
836 				return rc;
837 		}
838 
839 		reg++;
840 	}
841 
842 	return 0;
843 }
844 
845 static int
ov51x_reset(struct usb_ov511 * ov,unsigned char reset_type)846 ov51x_reset(struct usb_ov511 *ov, unsigned char reset_type)
847 {
848 	int rc;
849 
850 	/* Setting bit 0 not allowed on 518/518Plus */
851 	if (ov->bclass == BCL_OV518)
852 		reset_type &= 0xfe;
853 
854 	PDEBUG(4, "Reset: type=0x%02X", reset_type);
855 
856 	rc = reg_w(ov, R51x_SYS_RESET, reset_type);
857 	rc = reg_w(ov, R51x_SYS_RESET, 0);
858 
859 	if (rc < 0)
860 		err("reset: command failed");
861 
862 	return rc;
863 }
864 
865 /**********************************************************************
866  *
867  * Low-level I2C I/O functions
868  *
869  **********************************************************************/
870 
871 /* NOTE: Do not call this function directly!
872  * The OV518 I2C I/O procedure is different, hence, this function.
873  * This is normally only called from i2c_w(). Note that this function
874  * always succeeds regardless of whether the sensor is present and working.
875  */
876 static int
ov518_i2c_write_internal(struct usb_ov511 * ov,unsigned char reg,unsigned char value)877 ov518_i2c_write_internal(struct usb_ov511 *ov,
878 			 unsigned char reg,
879 			 unsigned char value)
880 {
881 	int rc;
882 
883 	PDEBUG(5, "0x%02X:0x%02X", reg, value);
884 
885 	/* Select camera register */
886 	rc = reg_w(ov, R51x_I2C_SADDR_3, reg);
887 	if (rc < 0) return rc;
888 
889 	/* Write "value" to I2C data port of OV511 */
890 	rc = reg_w(ov, R51x_I2C_DATA, value);
891 	if (rc < 0) return rc;
892 
893 	/* Initiate 3-byte write cycle */
894 	rc = reg_w(ov, R518_I2C_CTL, 0x01);
895 	if (rc < 0) return rc;
896 
897 	return 0;
898 }
899 
900 /* NOTE: Do not call this function directly! */
901 static int
ov511_i2c_write_internal(struct usb_ov511 * ov,unsigned char reg,unsigned char value)902 ov511_i2c_write_internal(struct usb_ov511 *ov,
903 			 unsigned char reg,
904 			 unsigned char value)
905 {
906 	int rc, retries;
907 
908 	PDEBUG(5, "0x%02X:0x%02X", reg, value);
909 
910 	/* Three byte write cycle */
911 	for (retries = OV511_I2C_RETRIES; ; ) {
912 		/* Select camera register */
913 		rc = reg_w(ov, R51x_I2C_SADDR_3, reg);
914 		if (rc < 0) return rc;
915 
916 		/* Write "value" to I2C data port of OV511 */
917 		rc = reg_w(ov, R51x_I2C_DATA, value);
918 		if (rc < 0) return rc;
919 
920 		/* Initiate 3-byte write cycle */
921 		rc = reg_w(ov, R511_I2C_CTL, 0x01);
922 		if (rc < 0) return rc;
923 
924 		do rc = reg_r(ov, R511_I2C_CTL);
925 		while (rc > 0 && ((rc&1) == 0)); /* Retry until idle */
926 		if (rc < 0) return rc;
927 
928 		if ((rc&2) == 0) /* Ack? */
929 			break;
930 #if 0
931 		/* I2C abort */
932 		reg_w(ov, R511_I2C_CTL, 0x10);
933 #endif
934 		if (--retries < 0) {
935 			err("i2c write retries exhausted");
936 			return -1;
937 		}
938 	}
939 
940 	return 0;
941 }
942 
943 /* NOTE: Do not call this function directly!
944  * The OV518 I2C I/O procedure is different, hence, this function.
945  * This is normally only called from i2c_r(). Note that this function
946  * always succeeds regardless of whether the sensor is present and working.
947  */
948 static int
ov518_i2c_read_internal(struct usb_ov511 * ov,unsigned char reg)949 ov518_i2c_read_internal(struct usb_ov511 *ov, unsigned char reg)
950 {
951 	int rc, value;
952 
953 	/* Select camera register */
954 	rc = reg_w(ov, R51x_I2C_SADDR_2, reg);
955 	if (rc < 0) return rc;
956 
957 	/* Initiate 2-byte write cycle */
958 	rc = reg_w(ov, R518_I2C_CTL, 0x03);
959 	if (rc < 0) return rc;
960 
961 	/* Initiate 2-byte read cycle */
962 	rc = reg_w(ov, R518_I2C_CTL, 0x05);
963 	if (rc < 0) return rc;
964 
965 	value = reg_r(ov, R51x_I2C_DATA);
966 
967 	PDEBUG(5, "0x%02X:0x%02X", reg, value);
968 
969 	return value;
970 }
971 
972 /* NOTE: Do not call this function directly!
973  * returns: negative is error, pos or zero is data */
974 static int
ov511_i2c_read_internal(struct usb_ov511 * ov,unsigned char reg)975 ov511_i2c_read_internal(struct usb_ov511 *ov, unsigned char reg)
976 {
977 	int rc, value, retries;
978 
979 	/* Two byte write cycle */
980 	for (retries = OV511_I2C_RETRIES; ; ) {
981 		/* Select camera register */
982 		rc = reg_w(ov, R51x_I2C_SADDR_2, reg);
983 		if (rc < 0) return rc;
984 
985 		/* Initiate 2-byte write cycle */
986 		rc = reg_w(ov, R511_I2C_CTL, 0x03);
987 		if (rc < 0) return rc;
988 
989 		do rc = reg_r(ov, R511_I2C_CTL);
990 		while (rc > 0 && ((rc&1) == 0)); /* Retry until idle */
991 		if (rc < 0) return rc;
992 
993 		if ((rc&2) == 0) /* Ack? */
994 			break;
995 
996 		/* I2C abort */
997 		reg_w(ov, R511_I2C_CTL, 0x10);
998 
999 		if (--retries < 0) {
1000 			err("i2c write retries exhausted");
1001 			return -1;
1002 		}
1003 	}
1004 
1005 	/* Two byte read cycle */
1006 	for (retries = OV511_I2C_RETRIES; ; ) {
1007 		/* Initiate 2-byte read cycle */
1008 		rc = reg_w(ov, R511_I2C_CTL, 0x05);
1009 		if (rc < 0) return rc;
1010 
1011 		do rc = reg_r(ov, R511_I2C_CTL);
1012 		while (rc > 0 && ((rc&1) == 0)); /* Retry until idle */
1013 		if (rc < 0) return rc;
1014 
1015 		if ((rc&2) == 0) /* Ack? */
1016 			break;
1017 
1018 		/* I2C abort */
1019 		rc = reg_w(ov, R511_I2C_CTL, 0x10);
1020 		if (rc < 0) return rc;
1021 
1022 		if (--retries < 0) {
1023 			err("i2c read retries exhausted");
1024 			return -1;
1025 		}
1026 	}
1027 
1028 	value = reg_r(ov, R51x_I2C_DATA);
1029 
1030 	PDEBUG(5, "0x%02X:0x%02X", reg, value);
1031 
1032 	/* This is needed to make i2c_w() work */
1033 	rc = reg_w(ov, R511_I2C_CTL, 0x05);
1034 	if (rc < 0)
1035 		return rc;
1036 
1037 	return value;
1038 }
1039 
1040 /* returns: negative is error, pos or zero is data */
1041 static int
i2c_r(struct usb_ov511 * ov,unsigned char reg)1042 i2c_r(struct usb_ov511 *ov, unsigned char reg)
1043 {
1044 	int rc;
1045 
1046 	down(&ov->i2c_lock);
1047 
1048 	if (ov->bclass == BCL_OV518)
1049 		rc = ov518_i2c_read_internal(ov, reg);
1050 	else
1051 		rc = ov511_i2c_read_internal(ov, reg);
1052 
1053 	up(&ov->i2c_lock);
1054 
1055 	return rc;
1056 }
1057 
1058 static int
i2c_w(struct usb_ov511 * ov,unsigned char reg,unsigned char value)1059 i2c_w(struct usb_ov511 *ov, unsigned char reg, unsigned char value)
1060 {
1061 	int rc;
1062 
1063 	down(&ov->i2c_lock);
1064 
1065 	if (ov->bclass == BCL_OV518)
1066 		rc = ov518_i2c_write_internal(ov, reg, value);
1067 	else
1068 		rc = ov511_i2c_write_internal(ov, reg, value);
1069 
1070 	up(&ov->i2c_lock);
1071 
1072 	return rc;
1073 }
1074 
1075 /* Do not call this function directly! */
1076 static int
ov51x_i2c_write_mask_internal(struct usb_ov511 * ov,unsigned char reg,unsigned char value,unsigned char mask)1077 ov51x_i2c_write_mask_internal(struct usb_ov511 *ov,
1078 			      unsigned char reg,
1079 			      unsigned char value,
1080 			      unsigned char mask)
1081 {
1082 	int rc;
1083 	unsigned char oldval, newval;
1084 
1085 	if (mask == 0xff) {
1086 		newval = value;
1087 	} else {
1088 		if (ov->bclass == BCL_OV518)
1089 			rc = ov518_i2c_read_internal(ov, reg);
1090 		else
1091 			rc = ov511_i2c_read_internal(ov, reg);
1092 		if (rc < 0)
1093 			return rc;
1094 
1095 		oldval = (unsigned char) rc;
1096 		oldval &= (~mask);		/* Clear the masked bits */
1097 		value &= mask;			/* Enforce mask on value */
1098 		newval = oldval | value;	/* Set the desired bits */
1099 	}
1100 
1101 	if (ov->bclass == BCL_OV518)
1102 		return (ov518_i2c_write_internal(ov, reg, newval));
1103 	else
1104 		return (ov511_i2c_write_internal(ov, reg, newval));
1105 }
1106 
1107 /* Writes bits at positions specified by mask to an I2C reg. Bits that are in
1108  * the same position as 1's in "mask" are cleared and set to "value". Bits
1109  * that are in the same position as 0's in "mask" are preserved, regardless
1110  * of their respective state in "value".
1111  */
1112 static int
i2c_w_mask(struct usb_ov511 * ov,unsigned char reg,unsigned char value,unsigned char mask)1113 i2c_w_mask(struct usb_ov511 *ov,
1114 	   unsigned char reg,
1115 	   unsigned char value,
1116 	   unsigned char mask)
1117 {
1118 	int rc;
1119 
1120 	down(&ov->i2c_lock);
1121 	rc = ov51x_i2c_write_mask_internal(ov, reg, value, mask);
1122 	up(&ov->i2c_lock);
1123 
1124 	return rc;
1125 }
1126 
1127 /* Set the read and write slave IDs. The "slave" argument is the write slave,
1128  * and the read slave will be set to (slave + 1). ov->i2c_lock should be held
1129  * when calling this. This should not be called from outside the i2c I/O
1130  * functions.
1131  */
1132 static inline int
i2c_set_slave_internal(struct usb_ov511 * ov,unsigned char slave)1133 i2c_set_slave_internal(struct usb_ov511 *ov, unsigned char slave)
1134 {
1135 	int rc;
1136 
1137 	rc = reg_w(ov, R51x_I2C_W_SID, slave);
1138 	if (rc < 0) return rc;
1139 
1140 	rc = reg_w(ov, R51x_I2C_R_SID, slave + 1);
1141 	if (rc < 0) return rc;
1142 
1143 	return 0;
1144 }
1145 
1146 /* Write to a specific I2C slave ID and register, using the specified mask */
1147 static int
i2c_w_slave(struct usb_ov511 * ov,unsigned char slave,unsigned char reg,unsigned char value,unsigned char mask)1148 i2c_w_slave(struct usb_ov511 *ov,
1149 	    unsigned char slave,
1150 	    unsigned char reg,
1151 	    unsigned char value,
1152 	    unsigned char mask)
1153 {
1154 	int rc = 0;
1155 
1156 	down(&ov->i2c_lock);
1157 
1158 	/* Set new slave IDs */
1159 	rc = i2c_set_slave_internal(ov, slave);
1160 	if (rc < 0) goto out;
1161 
1162 	rc = ov51x_i2c_write_mask_internal(ov, reg, value, mask);
1163 
1164 out:
1165 	/* Restore primary IDs */
1166 	if (i2c_set_slave_internal(ov, ov->primary_i2c_slave) < 0)
1167 		err("Couldn't restore primary I2C slave");
1168 
1169 	up(&ov->i2c_lock);
1170 	return rc;
1171 }
1172 
1173 /* Read from a specific I2C slave ID and register */
1174 static int
i2c_r_slave(struct usb_ov511 * ov,unsigned char slave,unsigned char reg)1175 i2c_r_slave(struct usb_ov511 *ov,
1176 	    unsigned char slave,
1177 	    unsigned char reg)
1178 {
1179 	int rc;
1180 
1181 	down(&ov->i2c_lock);
1182 
1183 	/* Set new slave IDs */
1184 	rc = i2c_set_slave_internal(ov, slave);
1185 	if (rc < 0) goto out;
1186 
1187 	if (ov->bclass == BCL_OV518)
1188 		rc = ov518_i2c_read_internal(ov, reg);
1189 	else
1190 		rc = ov511_i2c_read_internal(ov, reg);
1191 
1192 out:
1193 	/* Restore primary IDs */
1194 	if (i2c_set_slave_internal(ov, ov->primary_i2c_slave) < 0)
1195 		err("Couldn't restore primary I2C slave");
1196 
1197 	up(&ov->i2c_lock);
1198 	return rc;
1199 }
1200 
1201 /* Sets I2C read and write slave IDs. Returns <0 for error */
1202 static int
ov51x_set_slave_ids(struct usb_ov511 * ov,unsigned char sid)1203 ov51x_set_slave_ids(struct usb_ov511 *ov, unsigned char sid)
1204 {
1205 	int rc;
1206 
1207 	down(&ov->i2c_lock);
1208 
1209 	rc = i2c_set_slave_internal(ov, sid);
1210 	if (rc < 0) goto out;
1211 
1212 	// FIXME: Is this actually necessary?
1213 	rc = ov51x_reset(ov, OV511_RESET_NOREGS);
1214 	if (rc < 0) goto out;
1215 
1216 out:
1217 	up(&ov->i2c_lock);
1218 	return rc;
1219 }
1220 
1221 static int
write_regvals(struct usb_ov511 * ov,struct ov511_regvals * pRegvals)1222 write_regvals(struct usb_ov511 *ov, struct ov511_regvals * pRegvals)
1223 {
1224 	int rc;
1225 
1226 	while (pRegvals->bus != OV511_DONE_BUS) {
1227 		if (pRegvals->bus == OV511_REG_BUS) {
1228 			if ((rc = reg_w(ov, pRegvals->reg, pRegvals->val)) < 0)
1229 				return rc;
1230 		} else if (pRegvals->bus == OV511_I2C_BUS) {
1231 			if ((rc = i2c_w(ov, pRegvals->reg, pRegvals->val)) < 0)
1232 				return rc;
1233 		} else {
1234 			err("Bad regval array");
1235 			return -1;
1236 		}
1237 		pRegvals++;
1238 	}
1239 	return 0;
1240 }
1241 
1242 #ifdef OV511_DEBUG
1243 static void
dump_i2c_range(struct usb_ov511 * ov,int reg1,int regn)1244 dump_i2c_range(struct usb_ov511 *ov, int reg1, int regn)
1245 {
1246 	int i, rc;
1247 
1248 	for (i = reg1; i <= regn; i++) {
1249 		rc = i2c_r(ov, i);
1250 		info("Sensor[0x%02X] = 0x%02X", i, rc);
1251 	}
1252 }
1253 
1254 static void
dump_i2c_regs(struct usb_ov511 * ov)1255 dump_i2c_regs(struct usb_ov511 *ov)
1256 {
1257 	info("I2C REGS");
1258 	dump_i2c_range(ov, 0x00, 0x7C);
1259 }
1260 
1261 static void
dump_reg_range(struct usb_ov511 * ov,int reg1,int regn)1262 dump_reg_range(struct usb_ov511 *ov, int reg1, int regn)
1263 {
1264 	int i, rc;
1265 
1266 	for (i = reg1; i <= regn; i++) {
1267 		rc = reg_r(ov, i);
1268 		info("OV511[0x%02X] = 0x%02X", i, rc);
1269 	}
1270 }
1271 
1272 static void
ov511_dump_regs(struct usb_ov511 * ov)1273 ov511_dump_regs(struct usb_ov511 *ov)
1274 {
1275 	info("CAMERA INTERFACE REGS");
1276 	dump_reg_range(ov, 0x10, 0x1f);
1277 	info("DRAM INTERFACE REGS");
1278 	dump_reg_range(ov, 0x20, 0x23);
1279 	info("ISO FIFO REGS");
1280 	dump_reg_range(ov, 0x30, 0x31);
1281 	info("PIO REGS");
1282 	dump_reg_range(ov, 0x38, 0x39);
1283 	dump_reg_range(ov, 0x3e, 0x3e);
1284 	info("I2C REGS");
1285 	dump_reg_range(ov, 0x40, 0x49);
1286 	info("SYSTEM CONTROL REGS");
1287 	dump_reg_range(ov, 0x50, 0x55);
1288 	dump_reg_range(ov, 0x5e, 0x5f);
1289 	info("OmniCE REGS");
1290 	dump_reg_range(ov, 0x70, 0x79);
1291 	/* NOTE: Quantization tables are not readable. You will get the value
1292 	 * in reg. 0x79 for every table register */
1293 	dump_reg_range(ov, 0x80, 0x9f);
1294 	dump_reg_range(ov, 0xa0, 0xbf);
1295 
1296 }
1297 
1298 static void
ov518_dump_regs(struct usb_ov511 * ov)1299 ov518_dump_regs(struct usb_ov511 *ov)
1300 {
1301 	info("VIDEO MODE REGS");
1302 	dump_reg_range(ov, 0x20, 0x2f);
1303 	info("DATA PUMP AND SNAPSHOT REGS");
1304 	dump_reg_range(ov, 0x30, 0x3f);
1305 	info("I2C REGS");
1306 	dump_reg_range(ov, 0x40, 0x4f);
1307 	info("SYSTEM CONTROL AND VENDOR REGS");
1308 	dump_reg_range(ov, 0x50, 0x5f);
1309 	info("60 - 6F");
1310 	dump_reg_range(ov, 0x60, 0x6f);
1311 	info("70 - 7F");
1312 	dump_reg_range(ov, 0x70, 0x7f);
1313 	info("Y QUANTIZATION TABLE");
1314 	dump_reg_range(ov, 0x80, 0x8f);
1315 	info("UV QUANTIZATION TABLE");
1316 	dump_reg_range(ov, 0x90, 0x9f);
1317 	info("A0 - BF");
1318 	dump_reg_range(ov, 0xa0, 0xbf);
1319 	info("CBR");
1320 	dump_reg_range(ov, 0xc0, 0xcf);
1321 }
1322 #endif
1323 
1324 /*****************************************************************************/
1325 
1326 /* Temporarily stops OV511 from functioning. Must do this before changing
1327  * registers while the camera is streaming */
1328 static inline int
ov51x_stop(struct usb_ov511 * ov)1329 ov51x_stop(struct usb_ov511 *ov)
1330 {
1331 	PDEBUG(4, "stopping");
1332 	ov->stopped = 1;
1333 	if (ov->bclass == BCL_OV518)
1334 		return (reg_w_mask(ov, R51x_SYS_RESET, 0x3a, 0x3a));
1335 	else
1336 		return (reg_w(ov, R51x_SYS_RESET, 0x3d));
1337 }
1338 
1339 /* Restarts OV511 after ov511_stop() is called. Has no effect if it is not
1340  * actually stopped (for performance). */
1341 static inline int
ov51x_restart(struct usb_ov511 * ov)1342 ov51x_restart(struct usb_ov511 *ov)
1343 {
1344 	if (ov->stopped) {
1345 		PDEBUG(4, "restarting");
1346 		ov->stopped = 0;
1347 
1348 		/* Reinitialize the stream */
1349 		if (ov->bclass == BCL_OV518)
1350 			reg_w(ov, 0x2f, 0x80);
1351 
1352 		return (reg_w(ov, R51x_SYS_RESET, 0x00));
1353 	}
1354 
1355 	return 0;
1356 }
1357 
1358 /* Resets the hardware snapshot button */
1359 static void
ov51x_clear_snapshot(struct usb_ov511 * ov)1360 ov51x_clear_snapshot(struct usb_ov511 *ov)
1361 {
1362 	if (ov->bclass == BCL_OV511) {
1363 		reg_w(ov, R51x_SYS_SNAP, 0x00);
1364 		reg_w(ov, R51x_SYS_SNAP, 0x02);
1365 		reg_w(ov, R51x_SYS_SNAP, 0x00);
1366 	} else if (ov->bclass == BCL_OV518) {
1367 		warn("snapshot reset not supported yet on OV518(+)");
1368 	} else {
1369 		err("clear snap: invalid bridge type");
1370 	}
1371 }
1372 
1373 #if defined(CONFIG_PROC_FS) && defined(CONFIG_VIDEO_PROC_FS)
1374 /* Checks the status of the snapshot button. Returns 1 if it was pressed since
1375  * it was last cleared, and zero in all other cases (including errors) */
1376 static int
ov51x_check_snapshot(struct usb_ov511 * ov)1377 ov51x_check_snapshot(struct usb_ov511 *ov)
1378 {
1379 	int ret, status = 0;
1380 
1381 	if (ov->bclass == BCL_OV511) {
1382 		ret = reg_r(ov, R51x_SYS_SNAP);
1383 		if (ret < 0) {
1384 			err("Error checking snspshot status (%d)", ret);
1385 		} else if (ret & 0x08) {
1386 			status = 1;
1387 		}
1388 	} else if (ov->bclass == BCL_OV518) {
1389 		warn("snapshot check not supported yet on OV518(+)");
1390 	} else {
1391 		err("check snap: invalid bridge type");
1392 	}
1393 
1394 	return status;
1395 }
1396 #endif
1397 
1398 /* This does an initial reset of an OmniVision sensor and ensures that I2C
1399  * is synchronized. Returns <0 for failure.
1400  */
1401 static int
init_ov_sensor(struct usb_ov511 * ov)1402 init_ov_sensor(struct usb_ov511 *ov)
1403 {
1404 	int i, success;
1405 
1406 	/* Reset the sensor */
1407 	if (i2c_w(ov, 0x12, 0x80) < 0) return -EIO;
1408 
1409 	/* Wait for it to initialize */
1410 	schedule_timeout(1 + 150 * HZ / 1000);
1411 
1412 	for (i = 0, success = 0; i < i2c_detect_tries && !success; i++) {
1413 		if ((i2c_r(ov, OV7610_REG_ID_HIGH) == 0x7F) &&
1414 		    (i2c_r(ov, OV7610_REG_ID_LOW) == 0xA2)) {
1415 			success = 1;
1416 			continue;
1417 		}
1418 
1419 		/* Reset the sensor */
1420 		if (i2c_w(ov, 0x12, 0x80) < 0) return -EIO;
1421 		/* Wait for it to initialize */
1422 		schedule_timeout(1 + 150 * HZ / 1000);
1423 		/* Dummy read to sync I2C */
1424 		if (i2c_r(ov, 0x00) < 0) return -EIO;
1425 	}
1426 
1427 	if (!success)
1428 		return -EIO;
1429 
1430 	PDEBUG(1, "I2C synced in %d attempt(s)", i);
1431 
1432 	return 0;
1433 }
1434 
1435 static int
ov511_set_packet_size(struct usb_ov511 * ov,int size)1436 ov511_set_packet_size(struct usb_ov511 *ov, int size)
1437 {
1438 	int alt, mult;
1439 
1440 	if (ov51x_stop(ov) < 0)
1441 		return -EIO;
1442 
1443 	mult = size >> 5;
1444 
1445 	if (ov->bridge == BRG_OV511) {
1446 		if (size == 0) alt = OV511_ALT_SIZE_0;
1447 		else if (size == 257) alt = OV511_ALT_SIZE_257;
1448 		else if (size == 513) alt = OV511_ALT_SIZE_513;
1449 		else if (size == 769) alt = OV511_ALT_SIZE_769;
1450 		else if (size == 993) alt = OV511_ALT_SIZE_993;
1451 		else {
1452 			err("Set packet size: invalid size (%d)", size);
1453 			return -EINVAL;
1454 		}
1455 	} else if (ov->bridge == BRG_OV511PLUS) {
1456 		if (size == 0) alt = OV511PLUS_ALT_SIZE_0;
1457 		else if (size == 33) alt = OV511PLUS_ALT_SIZE_33;
1458 		else if (size == 129) alt = OV511PLUS_ALT_SIZE_129;
1459 		else if (size == 257) alt = OV511PLUS_ALT_SIZE_257;
1460 		else if (size == 385) alt = OV511PLUS_ALT_SIZE_385;
1461 		else if (size == 513) alt = OV511PLUS_ALT_SIZE_513;
1462 		else if (size == 769) alt = OV511PLUS_ALT_SIZE_769;
1463 		else if (size == 961) alt = OV511PLUS_ALT_SIZE_961;
1464 		else {
1465 			err("Set packet size: invalid size (%d)", size);
1466 			return -EINVAL;
1467 		}
1468 	} else {
1469 		err("Set packet size: Invalid bridge type");
1470 		return -EINVAL;
1471 	}
1472 
1473 	PDEBUG(3, "%d, mult=%d, alt=%d", size, mult, alt);
1474 
1475 	if (reg_w(ov, R51x_FIFO_PSIZE, mult) < 0)
1476 		return -EIO;
1477 
1478 	if (usb_set_interface(ov->dev, ov->iface, alt) < 0) {
1479 		err("Set packet size: set interface error");
1480 		return -EBUSY;
1481 	}
1482 
1483 	if (ov51x_reset(ov, OV511_RESET_NOREGS) < 0)
1484 		return -EIO;
1485 
1486 	ov->packet_size = size;
1487 
1488 	if (ov51x_restart(ov) < 0)
1489 		return -EIO;
1490 
1491 	return 0;
1492 }
1493 
1494 /* Note: Unlike the OV511/OV511+, the size argument does NOT include the
1495  * optional packet number byte. The actual size *is* stored in ov->packet_size,
1496  * though. */
1497 static int
ov518_set_packet_size(struct usb_ov511 * ov,int size)1498 ov518_set_packet_size(struct usb_ov511 *ov, int size)
1499 {
1500 	int alt;
1501 
1502 	if (ov51x_stop(ov) < 0)
1503 		return -EIO;
1504 
1505 	if (ov->bclass == BCL_OV518) {
1506 		if (size == 0) alt = OV518_ALT_SIZE_0;
1507 		else if (size == 128) alt = OV518_ALT_SIZE_128;
1508 		else if (size == 256) alt = OV518_ALT_SIZE_256;
1509 		else if (size == 384) alt = OV518_ALT_SIZE_384;
1510 		else if (size == 512) alt = OV518_ALT_SIZE_512;
1511 		else if (size == 640) alt = OV518_ALT_SIZE_640;
1512 		else if (size == 768) alt = OV518_ALT_SIZE_768;
1513 		else if (size == 896) alt = OV518_ALT_SIZE_896;
1514 		else {
1515 			err("Set packet size: invalid size (%d)", size);
1516 			return -EINVAL;
1517 		}
1518 	} else {
1519 		err("Set packet size: Invalid bridge type");
1520 		return -EINVAL;
1521 	}
1522 
1523 	PDEBUG(3, "%d, alt=%d", size, alt);
1524 
1525 	ov->packet_size = size;
1526 	if (size > 0) {
1527 		/* Program ISO FIFO size reg (packet number isn't included) */
1528 		ov518_reg_w32(ov, 0x30, size, 2);
1529 
1530 		if (ov->packet_numbering)
1531 			++ov->packet_size;
1532 	}
1533 
1534 	if (usb_set_interface(ov->dev, ov->iface, alt) < 0) {
1535 		err("Set packet size: set interface error");
1536 		return -EBUSY;
1537 	}
1538 
1539 	/* Initialize the stream */
1540 	if (reg_w(ov, 0x2f, 0x80) < 0)
1541 		return -EIO;
1542 
1543 	if (ov51x_restart(ov) < 0)
1544 		return -EIO;
1545 
1546 	if (ov51x_reset(ov, OV511_RESET_NOREGS) < 0)
1547 		return -EIO;
1548 
1549 	return 0;
1550 }
1551 
1552 /* Upload compression params and quantization tables. Returns 0 for success. */
1553 static int
ov511_init_compression(struct usb_ov511 * ov)1554 ov511_init_compression(struct usb_ov511 *ov)
1555 {
1556 	int rc = 0;
1557 
1558 	if (!ov->compress_inited) {
1559 		reg_w(ov, 0x70, phy);
1560 		reg_w(ov, 0x71, phuv);
1561 		reg_w(ov, 0x72, pvy);
1562 		reg_w(ov, 0x73, pvuv);
1563 		reg_w(ov, 0x74, qhy);
1564 		reg_w(ov, 0x75, qhuv);
1565 		reg_w(ov, 0x76, qvy);
1566 		reg_w(ov, 0x77, qvuv);
1567 
1568 		if (ov511_upload_quan_tables(ov) < 0) {
1569 			err("Error uploading quantization tables");
1570 			rc = -EIO;
1571 			goto out;
1572 		}
1573 	}
1574 
1575 	ov->compress_inited = 1;
1576 out:
1577 	return rc;
1578 }
1579 
1580 /* Upload compression params and quantization tables. Returns 0 for success. */
1581 static int
ov518_init_compression(struct usb_ov511 * ov)1582 ov518_init_compression(struct usb_ov511 *ov)
1583 {
1584 	int rc = 0;
1585 
1586 	if (!ov->compress_inited) {
1587 		if (ov518_upload_quan_tables(ov) < 0) {
1588 			err("Error uploading quantization tables");
1589 			rc = -EIO;
1590 			goto out;
1591 		}
1592 	}
1593 
1594 	ov->compress_inited = 1;
1595 out:
1596 	return rc;
1597 }
1598 
1599 /* -------------------------------------------------------------------------- */
1600 
1601 /* Sets sensor's contrast setting to "val" */
1602 static int
sensor_set_contrast(struct usb_ov511 * ov,unsigned short val)1603 sensor_set_contrast(struct usb_ov511 *ov, unsigned short val)
1604 {
1605 	int rc;
1606 
1607 	PDEBUG(3, "%d", val);
1608 
1609 	if (ov->stop_during_set)
1610 		if (ov51x_stop(ov) < 0)
1611 			return -EIO;
1612 
1613 	switch (ov->sensor) {
1614 	case SEN_OV7610:
1615 	case SEN_OV6620:
1616 	{
1617 		rc = i2c_w(ov, OV7610_REG_CNT, val >> 8);
1618 		if (rc < 0)
1619 			goto out;
1620 		break;
1621 	}
1622 	case SEN_OV6630:
1623 	{
1624 		rc = i2c_w_mask(ov, OV7610_REG_CNT, val >> 12, 0x0f);
1625 		if (rc < 0)
1626 			goto out;
1627 		break;
1628 	}
1629 	case SEN_OV7620:
1630 	{
1631 		unsigned char ctab[] = {
1632 			0x01, 0x05, 0x09, 0x11, 0x15, 0x35, 0x37, 0x57,
1633 			0x5b, 0xa5, 0xa7, 0xc7, 0xc9, 0xcf, 0xef, 0xff
1634 		};
1635 
1636 		/* Use Y gamma control instead. Bit 0 enables it. */
1637 		rc = i2c_w(ov, 0x64, ctab[val>>12]);
1638 		if (rc < 0)
1639 			goto out;
1640 		break;
1641 	}
1642 	case SEN_SAA7111A:
1643 	{
1644 		rc = i2c_w(ov, 0x0b, val >> 9);
1645 		if (rc < 0)
1646 			goto out;
1647 		break;
1648 	}
1649 	default:
1650 	{
1651 		PDEBUG(3, "Unsupported with this sensor");
1652 		rc = -EPERM;
1653 		goto out;
1654 	}
1655 	}
1656 
1657 	rc = 0;		/* Success */
1658 	ov->contrast = val;
1659 out:
1660 	if (ov51x_restart(ov) < 0)
1661 		return -EIO;
1662 
1663 	return rc;
1664 }
1665 
1666 /* Gets sensor's contrast setting */
1667 static int
sensor_get_contrast(struct usb_ov511 * ov,unsigned short * val)1668 sensor_get_contrast(struct usb_ov511 *ov, unsigned short *val)
1669 {
1670 	int rc;
1671 
1672 	switch (ov->sensor) {
1673 	case SEN_OV7610:
1674 	case SEN_OV6620:
1675 		rc = i2c_r(ov, OV7610_REG_CNT);
1676 		if (rc < 0)
1677 			return rc;
1678 		else
1679 			*val = rc << 8;
1680 		break;
1681 	case SEN_OV6630:
1682 		rc = i2c_r(ov, OV7610_REG_CNT);
1683 		if (rc < 0)
1684 			return rc;
1685 		else
1686 			*val = rc << 12;
1687 		break;
1688 	case SEN_OV7620:
1689 		/* Use Y gamma reg instead. Bit 0 is the enable bit. */
1690 		rc = i2c_r(ov, 0x64);
1691 		if (rc < 0)
1692 			return rc;
1693 		else
1694 			*val = (rc & 0xfe) << 8;
1695 		break;
1696 	case SEN_SAA7111A:
1697 		*val = ov->contrast;
1698 		break;
1699 	default:
1700 		PDEBUG(3, "Unsupported with this sensor");
1701 		return -EPERM;
1702 	}
1703 
1704 	PDEBUG(3, "%d", *val);
1705 	ov->contrast = *val;
1706 
1707 	return 0;
1708 }
1709 
1710 /* -------------------------------------------------------------------------- */
1711 
1712 /* Sets sensor's brightness setting to "val" */
1713 static int
sensor_set_brightness(struct usb_ov511 * ov,unsigned short val)1714 sensor_set_brightness(struct usb_ov511 *ov, unsigned short val)
1715 {
1716 	int rc;
1717 
1718 	PDEBUG(4, "%d", val);
1719 
1720 	if (ov->stop_during_set)
1721 		if (ov51x_stop(ov) < 0)
1722 			return -EIO;
1723 
1724 	switch (ov->sensor) {
1725 	case SEN_OV7610:
1726 	case SEN_OV76BE:
1727 	case SEN_OV6620:
1728 	case SEN_OV6630:
1729 		rc = i2c_w(ov, OV7610_REG_BRT, val >> 8);
1730 		if (rc < 0)
1731 			goto out;
1732 		break;
1733 	case SEN_OV7620:
1734 		/* 7620 doesn't like manual changes when in auto mode */
1735 		if (!ov->auto_brt) {
1736 			rc = i2c_w(ov, OV7610_REG_BRT, val >> 8);
1737 			if (rc < 0)
1738 				goto out;
1739 		}
1740 		break;
1741 	case SEN_SAA7111A:
1742 		rc = i2c_w(ov, 0x0a, val >> 8);
1743 		if (rc < 0)
1744 			goto out;
1745 		break;
1746 	default:
1747 		PDEBUG(3, "Unsupported with this sensor");
1748 		rc = -EPERM;
1749 		goto out;
1750 	}
1751 
1752 	rc = 0;		/* Success */
1753 	ov->brightness = val;
1754 out:
1755 	if (ov51x_restart(ov) < 0)
1756 		return -EIO;
1757 
1758 	return rc;
1759 }
1760 
1761 /* Gets sensor's brightness setting */
1762 static int
sensor_get_brightness(struct usb_ov511 * ov,unsigned short * val)1763 sensor_get_brightness(struct usb_ov511 *ov, unsigned short *val)
1764 {
1765 	int rc;
1766 
1767 	switch (ov->sensor) {
1768 	case SEN_OV7610:
1769 	case SEN_OV76BE:
1770 	case SEN_OV7620:
1771 	case SEN_OV6620:
1772 	case SEN_OV6630:
1773 		rc = i2c_r(ov, OV7610_REG_BRT);
1774 		if (rc < 0)
1775 			return rc;
1776 		else
1777 			*val = rc << 8;
1778 		break;
1779 	case SEN_SAA7111A:
1780 		*val = ov->brightness;
1781 		break;
1782 	default:
1783 		PDEBUG(3, "Unsupported with this sensor");
1784 		return -EPERM;
1785 	}
1786 
1787 	PDEBUG(3, "%d", *val);
1788 	ov->brightness = *val;
1789 
1790 	return 0;
1791 }
1792 
1793 /* -------------------------------------------------------------------------- */
1794 
1795 /* Sets sensor's saturation (color intensity) setting to "val" */
1796 static int
sensor_set_saturation(struct usb_ov511 * ov,unsigned short val)1797 sensor_set_saturation(struct usb_ov511 *ov, unsigned short val)
1798 {
1799 	int rc;
1800 
1801 	PDEBUG(3, "%d", val);
1802 
1803 	if (ov->stop_during_set)
1804 		if (ov51x_stop(ov) < 0)
1805 			return -EIO;
1806 
1807 	switch (ov->sensor) {
1808 	case SEN_OV7610:
1809 	case SEN_OV76BE:
1810 	case SEN_OV6620:
1811 	case SEN_OV6630:
1812 		rc = i2c_w(ov, OV7610_REG_SAT, val >> 8);
1813 		if (rc < 0)
1814 			goto out;
1815 		break;
1816 	case SEN_OV7620:
1817 //		/* Use UV gamma control instead. Bits 0 & 7 are reserved. */
1818 //		rc = ov_i2c_write(ov->dev, 0x62, (val >> 9) & 0x7e);
1819 //		if (rc < 0)
1820 //			goto out;
1821 		rc = i2c_w(ov, OV7610_REG_SAT, val >> 8);
1822 		if (rc < 0)
1823 			goto out;
1824 		break;
1825 	case SEN_SAA7111A:
1826 		rc = i2c_w(ov, 0x0c, val >> 9);
1827 		if (rc < 0)
1828 			goto out;
1829 		break;
1830 	default:
1831 		PDEBUG(3, "Unsupported with this sensor");
1832 		rc = -EPERM;
1833 		goto out;
1834 	}
1835 
1836 	rc = 0;		/* Success */
1837 	ov->colour = val;
1838 out:
1839 	if (ov51x_restart(ov) < 0)
1840 		return -EIO;
1841 
1842 	return rc;
1843 }
1844 
1845 /* Gets sensor's saturation (color intensity) setting */
1846 static int
sensor_get_saturation(struct usb_ov511 * ov,unsigned short * val)1847 sensor_get_saturation(struct usb_ov511 *ov, unsigned short *val)
1848 {
1849 	int rc;
1850 
1851 	switch (ov->sensor) {
1852 	case SEN_OV7610:
1853 	case SEN_OV76BE:
1854 	case SEN_OV6620:
1855 	case SEN_OV6630:
1856 		rc = i2c_r(ov, OV7610_REG_SAT);
1857 		if (rc < 0)
1858 			return rc;
1859 		else
1860 			*val = rc << 8;
1861 		break;
1862 	case SEN_OV7620:
1863 //		/* Use UV gamma reg instead. Bits 0 & 7 are reserved. */
1864 //		rc = i2c_r(ov, 0x62);
1865 //		if (rc < 0)
1866 //			return rc;
1867 //		else
1868 //			*val = (rc & 0x7e) << 9;
1869 		rc = i2c_r(ov, OV7610_REG_SAT);
1870 		if (rc < 0)
1871 			return rc;
1872 		else
1873 			*val = rc << 8;
1874 		break;
1875 	case SEN_SAA7111A:
1876 		*val = ov->colour;
1877 		break;
1878 	default:
1879 		PDEBUG(3, "Unsupported with this sensor");
1880 		return -EPERM;
1881 	}
1882 
1883 	PDEBUG(3, "%d", *val);
1884 	ov->colour = *val;
1885 
1886 	return 0;
1887 }
1888 
1889 /* -------------------------------------------------------------------------- */
1890 
1891 /* Sets sensor's hue (red/blue balance) setting to "val" */
1892 static int
sensor_set_hue(struct usb_ov511 * ov,unsigned short val)1893 sensor_set_hue(struct usb_ov511 *ov, unsigned short val)
1894 {
1895 	int rc;
1896 
1897 	PDEBUG(3, "%d", val);
1898 
1899 	if (ov->stop_during_set)
1900 		if (ov51x_stop(ov) < 0)
1901 			return -EIO;
1902 
1903 	switch (ov->sensor) {
1904 	case SEN_OV7610:
1905 	case SEN_OV6620:
1906 	case SEN_OV6630:
1907 		rc = i2c_w(ov, OV7610_REG_RED, 0xFF - (val >> 8));
1908 		if (rc < 0)
1909 			goto out;
1910 
1911 		rc = i2c_w(ov, OV7610_REG_BLUE, val >> 8);
1912 		if (rc < 0)
1913 			goto out;
1914 		break;
1915 	case SEN_OV7620:
1916 // Hue control is causing problems. I will enable it once it's fixed.
1917 #if 0
1918 		rc = i2c_w(ov, 0x7a, (unsigned char)(val >> 8) + 0xb);
1919 		if (rc < 0)
1920 			goto out;
1921 
1922 		rc = i2c_w(ov, 0x79, (unsigned char)(val >> 8) + 0xb);
1923 		if (rc < 0)
1924 			goto out;
1925 #endif
1926 		break;
1927 	case SEN_SAA7111A:
1928 		rc = i2c_w(ov, 0x0d, (val + 32768) >> 8);
1929 		if (rc < 0)
1930 			goto out;
1931 		break;
1932 	default:
1933 		PDEBUG(3, "Unsupported with this sensor");
1934 		rc = -EPERM;
1935 		goto out;
1936 	}
1937 
1938 	rc = 0;		/* Success */
1939 	ov->hue = val;
1940 out:
1941 	if (ov51x_restart(ov) < 0)
1942 		return -EIO;
1943 
1944 	return rc;
1945 }
1946 
1947 /* Gets sensor's hue (red/blue balance) setting */
1948 static int
sensor_get_hue(struct usb_ov511 * ov,unsigned short * val)1949 sensor_get_hue(struct usb_ov511 *ov, unsigned short *val)
1950 {
1951 	int rc;
1952 
1953 	switch (ov->sensor) {
1954 	case SEN_OV7610:
1955 	case SEN_OV6620:
1956 	case SEN_OV6630:
1957 		rc = i2c_r(ov, OV7610_REG_BLUE);
1958 		if (rc < 0)
1959 			return rc;
1960 		else
1961 			*val = rc << 8;
1962 		break;
1963 	case SEN_OV7620:
1964 		rc = i2c_r(ov, 0x7a);
1965 		if (rc < 0)
1966 			return rc;
1967 		else
1968 			*val = rc << 8;
1969 		break;
1970 	case SEN_SAA7111A:
1971 		*val = ov->hue;
1972 		break;
1973 	default:
1974 		PDEBUG(3, "Unsupported with this sensor");
1975 		return -EPERM;
1976 	}
1977 
1978 	PDEBUG(3, "%d", *val);
1979 	ov->hue = *val;
1980 
1981 	return 0;
1982 }
1983 
1984 /* -------------------------------------------------------------------------- */
1985 
1986 static inline int
sensor_set_picture(struct usb_ov511 * ov,struct video_picture * p)1987 sensor_set_picture(struct usb_ov511 *ov, struct video_picture *p)
1988 {
1989 	int rc;
1990 
1991 	PDEBUG(4, "sensor_set_picture");
1992 
1993 	ov->whiteness = p->whiteness;
1994 
1995 	/* Don't return error if a setting is unsupported, or rest of settings
1996          * will not be performed */
1997 
1998 	rc = sensor_set_contrast(ov, p->contrast);
1999 	if (FATAL_ERROR(rc))
2000 		return rc;
2001 
2002 	rc = sensor_set_brightness(ov, p->brightness);
2003 	if (FATAL_ERROR(rc))
2004 		return rc;
2005 
2006 	rc = sensor_set_saturation(ov, p->colour);
2007 	if (FATAL_ERROR(rc))
2008 		return rc;
2009 
2010 	rc = sensor_set_hue(ov, p->hue);
2011 	if (FATAL_ERROR(rc))
2012 		return rc;
2013 
2014 	return 0;
2015 }
2016 
2017 static int
sensor_get_picture(struct usb_ov511 * ov,struct video_picture * p)2018 sensor_get_picture(struct usb_ov511 *ov, struct video_picture *p)
2019 {
2020 	int rc;
2021 
2022 	PDEBUG(4, "sensor_get_picture");
2023 
2024 	/* Don't return error if a setting is unsupported, or rest of settings
2025          * will not be performed */
2026 
2027 	rc = sensor_get_contrast(ov, &(p->contrast));
2028 	if (FATAL_ERROR(rc))
2029 		return rc;
2030 
2031 	rc = sensor_get_brightness(ov, &(p->brightness));
2032 	if (FATAL_ERROR(rc))
2033 		return rc;
2034 
2035 	rc = sensor_get_saturation(ov, &(p->colour));
2036 	if (FATAL_ERROR(rc))
2037 		return rc;
2038 
2039 	rc = sensor_get_hue(ov, &(p->hue));
2040 	if (FATAL_ERROR(rc))
2041 		return rc;
2042 
2043 	p->whiteness = 105 << 8;
2044 
2045 	return 0;
2046 }
2047 
2048 #if defined(CONFIG_PROC_FS) && defined(CONFIG_VIDEO_PROC_FS)
2049 // FIXME: Exposure range is only 0x00-0x7f in interlace mode
2050 /* Sets current exposure for sensor. This only has an effect if auto-exposure
2051  * is off */
2052 static inline int
sensor_set_exposure(struct usb_ov511 * ov,unsigned char val)2053 sensor_set_exposure(struct usb_ov511 *ov, unsigned char val)
2054 {
2055 	int rc;
2056 
2057 	PDEBUG(3, "%d", val);
2058 
2059 	if (ov->stop_during_set)
2060 		if (ov51x_stop(ov) < 0)
2061 			return -EIO;
2062 
2063 	switch (ov->sensor) {
2064 	case SEN_OV6620:
2065 	case SEN_OV6630:
2066 	case SEN_OV7610:
2067 	case SEN_OV7620:
2068 	case SEN_OV76BE:
2069 	case SEN_OV8600:
2070 		rc = i2c_w(ov, 0x10, val);
2071 		if (rc < 0)
2072 			goto out;
2073 
2074 		break;
2075 	case SEN_KS0127:
2076 	case SEN_KS0127B:
2077 	case SEN_SAA7111A:
2078 		PDEBUG(3, "Unsupported with this sensor");
2079 		return -EPERM;
2080 	default:
2081 		err("Sensor not supported for set_exposure");
2082 		return -EINVAL;
2083 	}
2084 
2085 	rc = 0;		/* Success */
2086 	ov->exposure = val;
2087 out:
2088 	if (ov51x_restart(ov) < 0)
2089 		return -EIO;
2090 
2091 	return rc;
2092 }
2093 
2094 /* Gets current exposure level from sensor, regardless of whether it is under
2095  * manual control. */
2096 static int
sensor_get_exposure(struct usb_ov511 * ov,unsigned char * val)2097 sensor_get_exposure(struct usb_ov511 *ov, unsigned char *val)
2098 {
2099 	int rc;
2100 
2101 	switch (ov->sensor) {
2102 	case SEN_OV7610:
2103 	case SEN_OV6620:
2104 	case SEN_OV6630:
2105 	case SEN_OV7620:
2106 	case SEN_OV76BE:
2107 	case SEN_OV8600:
2108 		rc = i2c_r(ov, 0x10);
2109 		if (rc < 0)
2110 			return rc;
2111 		else
2112 			*val = rc;
2113 		break;
2114 	case SEN_KS0127:
2115 	case SEN_KS0127B:
2116 	case SEN_SAA7111A:
2117 		val = 0;
2118 		PDEBUG(3, "Unsupported with this sensor");
2119 		return -EPERM;
2120 	default:
2121 		err("Sensor not supported for get_exposure");
2122 		return -EINVAL;
2123 	}
2124 
2125 	PDEBUG(3, "%d", *val);
2126 	ov->exposure = *val;
2127 
2128 	return 0;
2129 }
2130 #endif /* CONFIG_PROC_FS && CONFIG_VIDEO_PROC_FS */
2131 
2132 /* Turns on or off the LED. Only has an effect with OV511+/OV518(+) */
2133 static inline void
ov51x_led_control(struct usb_ov511 * ov,int enable)2134 ov51x_led_control(struct usb_ov511 *ov, int enable)
2135 {
2136 	PDEBUG(4, " (%s)", enable ? "turn on" : "turn off");
2137 
2138 	if (ov->bridge == BRG_OV511PLUS)
2139 		reg_w(ov, R511_SYS_LED_CTL, enable ? 1 : 0);
2140 	else if (ov->bclass == BCL_OV518)
2141 		reg_w_mask(ov, R518_GPIO_OUT, enable ? 0x02 : 0x00, 0x02);
2142 
2143 	return;
2144 }
2145 
2146 /* Matches the sensor's internal frame rate to the lighting frequency.
2147  * Valid frequencies are:
2148  *	50 - 50Hz, for European and Asian lighting
2149  *	60 - 60Hz, for American lighting
2150  *
2151  * Tested with: OV7610, OV7620, OV76BE, OV6620
2152  * Unsupported: KS0127, KS0127B, SAA7111A
2153  * Returns: 0 for success
2154  */
2155 static int
sensor_set_light_freq(struct usb_ov511 * ov,int freq)2156 sensor_set_light_freq(struct usb_ov511 *ov, int freq)
2157 {
2158 	int sixty;
2159 
2160 	PDEBUG(4, "%d Hz", freq);
2161 
2162 	if (freq == 60)
2163 		sixty = 1;
2164 	else if (freq == 50)
2165 		sixty = 0;
2166 	else {
2167 		err("Invalid light freq (%d Hz)", freq);
2168 		return -EINVAL;
2169 	}
2170 
2171 	switch (ov->sensor) {
2172 	case SEN_OV7610:
2173 		i2c_w_mask(ov, 0x2a, sixty?0x00:0x80, 0x80);
2174 		i2c_w(ov, 0x2b, sixty?0x00:0xac);
2175 		i2c_w_mask(ov, 0x13, 0x10, 0x10);
2176 		i2c_w_mask(ov, 0x13, 0x00, 0x10);
2177 		break;
2178 	case SEN_OV7620:
2179 	case SEN_OV76BE:
2180 	case SEN_OV8600:
2181 		i2c_w_mask(ov, 0x2a, sixty?0x00:0x80, 0x80);
2182 		i2c_w(ov, 0x2b, sixty?0x00:0xac);
2183 		i2c_w_mask(ov, 0x76, 0x01, 0x01);
2184 		break;
2185 	case SEN_OV6620:
2186 	case SEN_OV6630:
2187 		i2c_w(ov, 0x2b, sixty?0xa8:0x28);
2188 		i2c_w(ov, 0x2a, sixty?0x84:0xa4);
2189 		break;
2190 	case SEN_KS0127:
2191 	case SEN_KS0127B:
2192 	case SEN_SAA7111A:
2193 		PDEBUG(5, "Unsupported with this sensor");
2194 		return -EPERM;
2195 	default:
2196 		err("Sensor not supported for set_light_freq");
2197 		return -EINVAL;
2198 	}
2199 
2200 	ov->lightfreq = freq;
2201 
2202 	return 0;
2203 }
2204 
2205 /* If enable is true, turn on the sensor's banding filter, otherwise turn it
2206  * off. This filter tries to reduce the pattern of horizontal light/dark bands
2207  * caused by some (usually fluorescent) lighting. The light frequency must be
2208  * set either before or after enabling it with ov51x_set_light_freq().
2209  *
2210  * Tested with: OV7610, OV7620, OV76BE, OV6620.
2211  * Unsupported: KS0127, KS0127B, SAA7111A
2212  * Returns: 0 for success
2213  */
2214 static inline int
sensor_set_banding_filter(struct usb_ov511 * ov,int enable)2215 sensor_set_banding_filter(struct usb_ov511 *ov, int enable)
2216 {
2217 	int rc;
2218 
2219 	PDEBUG(4, " (%s)", enable ? "turn on" : "turn off");
2220 
2221 	if (ov->sensor == SEN_KS0127 || ov->sensor == SEN_KS0127B
2222 		|| ov->sensor == SEN_SAA7111A) {
2223 		PDEBUG(5, "Unsupported with this sensor");
2224 		return -EPERM;
2225 	}
2226 
2227 	rc = i2c_w_mask(ov, 0x2d, enable?0x04:0x00, 0x04);
2228 	if (rc < 0)
2229 		return rc;
2230 
2231 	ov->bandfilt = enable;
2232 
2233 	return 0;
2234 }
2235 
2236 /* If enable is true, turn on the sensor's auto brightness control, otherwise
2237  * turn it off.
2238  *
2239  * Unsupported: KS0127, KS0127B, SAA7111A
2240  * Returns: 0 for success
2241  */
2242 static inline int
sensor_set_auto_brightness(struct usb_ov511 * ov,int enable)2243 sensor_set_auto_brightness(struct usb_ov511 *ov, int enable)
2244 {
2245 	int rc;
2246 
2247 	PDEBUG(4, " (%s)", enable ? "turn on" : "turn off");
2248 
2249 	if (ov->sensor == SEN_KS0127 || ov->sensor == SEN_KS0127B
2250 		|| ov->sensor == SEN_SAA7111A) {
2251 		PDEBUG(5, "Unsupported with this sensor");
2252 		return -EPERM;
2253 	}
2254 
2255 	rc = i2c_w_mask(ov, 0x2d, enable?0x10:0x00, 0x10);
2256 	if (rc < 0)
2257 		return rc;
2258 
2259 	ov->auto_brt = enable;
2260 
2261 	return 0;
2262 }
2263 
2264 /* If enable is true, turn on the sensor's auto exposure control, otherwise
2265  * turn it off.
2266  *
2267  * Unsupported: KS0127, KS0127B, SAA7111A
2268  * Returns: 0 for success
2269  */
2270 static inline int
sensor_set_auto_exposure(struct usb_ov511 * ov,int enable)2271 sensor_set_auto_exposure(struct usb_ov511 *ov, int enable)
2272 {
2273 	PDEBUG(4, " (%s)", enable ? "turn on" : "turn off");
2274 
2275 	switch (ov->sensor) {
2276 	case SEN_OV7610:
2277 		i2c_w_mask(ov, 0x29, enable?0x00:0x80, 0x80);
2278 		break;
2279 	case SEN_OV6620:
2280 	case SEN_OV7620:
2281 	case SEN_OV76BE:
2282 	case SEN_OV8600:
2283 		i2c_w_mask(ov, 0x13, enable?0x01:0x00, 0x01);
2284 		break;
2285 	case SEN_OV6630:
2286 		i2c_w_mask(ov, 0x28, enable?0x00:0x10, 0x10);
2287 		break;
2288 	case SEN_KS0127:
2289 	case SEN_KS0127B:
2290 	case SEN_SAA7111A:
2291 		PDEBUG(5, "Unsupported with this sensor");
2292 		return -EPERM;
2293 	default:
2294 		err("Sensor not supported for set_auto_exposure");
2295 		return -EINVAL;
2296 	}
2297 
2298 	ov->auto_exp = enable;
2299 
2300 	return 0;
2301 }
2302 
2303 /* Modifies the sensor's exposure algorithm to allow proper exposure of objects
2304  * that are illuminated from behind.
2305  *
2306  * Tested with: OV6620, OV7620
2307  * Unsupported: OV7610, OV76BE, KS0127, KS0127B, SAA7111A
2308  * Returns: 0 for success
2309  */
2310 static int
sensor_set_backlight(struct usb_ov511 * ov,int enable)2311 sensor_set_backlight(struct usb_ov511 *ov, int enable)
2312 {
2313 	PDEBUG(4, " (%s)", enable ? "turn on" : "turn off");
2314 
2315 	switch (ov->sensor) {
2316 	case SEN_OV7620:
2317 	case SEN_OV8600:
2318 		i2c_w_mask(ov, 0x68, enable?0xe0:0xc0, 0xe0);
2319 		i2c_w_mask(ov, 0x29, enable?0x08:0x00, 0x08);
2320 		i2c_w_mask(ov, 0x28, enable?0x02:0x00, 0x02);
2321 		break;
2322 	case SEN_OV6620:
2323 		i2c_w_mask(ov, 0x4e, enable?0xe0:0xc0, 0xe0);
2324 		i2c_w_mask(ov, 0x29, enable?0x08:0x00, 0x08);
2325 		i2c_w_mask(ov, 0x0e, enable?0x80:0x00, 0x80);
2326 		break;
2327 	case SEN_OV6630:
2328 		i2c_w_mask(ov, 0x4e, enable?0x80:0x60, 0xe0);
2329 		i2c_w_mask(ov, 0x29, enable?0x08:0x00, 0x08);
2330 		i2c_w_mask(ov, 0x28, enable?0x02:0x00, 0x02);
2331 		break;
2332 	case SEN_OV7610:
2333 	case SEN_OV76BE:
2334 	case SEN_KS0127:
2335 	case SEN_KS0127B:
2336 	case SEN_SAA7111A:
2337 		PDEBUG(5, "Unsupported with this sensor");
2338 		return -EPERM;
2339 	default:
2340 		err("Sensor not supported for set_backlight");
2341 		return -EINVAL;
2342 	}
2343 
2344 	ov->backlight = enable;
2345 
2346 	return 0;
2347 }
2348 
2349 static inline int
sensor_set_mirror(struct usb_ov511 * ov,int enable)2350 sensor_set_mirror(struct usb_ov511 *ov, int enable)
2351 {
2352 	PDEBUG(4, " (%s)", enable ? "turn on" : "turn off");
2353 
2354 	switch (ov->sensor) {
2355 	case SEN_OV6620:
2356 	case SEN_OV6630:
2357 	case SEN_OV7610:
2358 	case SEN_OV7620:
2359 	case SEN_OV76BE:
2360 	case SEN_OV8600:
2361 		i2c_w_mask(ov, 0x12, enable?0x40:0x00, 0x40);
2362 		break;
2363 	case SEN_KS0127:
2364 	case SEN_KS0127B:
2365 	case SEN_SAA7111A:
2366 		PDEBUG(5, "Unsupported with this sensor");
2367 		return -EPERM;
2368 	default:
2369 		err("Sensor not supported for set_mirror");
2370 		return -EINVAL;
2371 	}
2372 
2373 	ov->mirror = enable;
2374 
2375 	return 0;
2376 }
2377 
2378 /* Returns number of bits per pixel (regardless of where they are located;
2379  * planar or not), or zero for unsupported format.
2380  */
2381 static inline int
get_depth(int palette)2382 get_depth(int palette)
2383 {
2384 	switch (palette) {
2385 	case VIDEO_PALETTE_GREY:    return 8;
2386 	case VIDEO_PALETTE_YUV420:  return 12;
2387 	case VIDEO_PALETTE_YUV420P: return 12; /* Planar */
2388 	case VIDEO_PALETTE_RGB565:  return 16;
2389 	case VIDEO_PALETTE_RGB24:   return 24;
2390 	case VIDEO_PALETTE_YUV422:  return 16;
2391 	case VIDEO_PALETTE_YUYV:    return 16;
2392 	case VIDEO_PALETTE_YUV422P: return 16; /* Planar */
2393 	default:		    return 0;  /* Invalid format */
2394 	}
2395 }
2396 
2397 /* Bytes per frame. Used by read(). Return of 0 indicates error */
2398 static inline long int
get_frame_length(struct ov511_frame * frame)2399 get_frame_length(struct ov511_frame *frame)
2400 {
2401 	if (!frame)
2402 		return 0;
2403 	else
2404 		return ((frame->width * frame->height
2405 			 * get_depth(frame->format)) >> 3);
2406 }
2407 
2408 static int
mode_init_ov_sensor_regs(struct usb_ov511 * ov,int width,int height,int mode,int sub_flag,int qvga)2409 mode_init_ov_sensor_regs(struct usb_ov511 *ov, int width, int height,
2410 			 int mode, int sub_flag, int qvga)
2411 {
2412 	int clock;
2413 
2414 	/******** Mode (VGA/QVGA) and sensor specific regs ********/
2415 
2416 	switch (ov->sensor) {
2417 	case SEN_OV7610:
2418 		i2c_w(ov, 0x14, qvga?0x24:0x04);
2419 // FIXME: Does this improve the image quality or frame rate?
2420 #if 0
2421 		i2c_w_mask(ov, 0x28, qvga?0x00:0x20, 0x20);
2422 		i2c_w(ov, 0x24, 0x10);
2423 		i2c_w(ov, 0x25, qvga?0x40:0x8a);
2424 		i2c_w(ov, 0x2f, qvga?0x30:0xb0);
2425 		i2c_w(ov, 0x35, qvga?0x1c:0x9c);
2426 #endif
2427 		break;
2428 	case SEN_OV7620:
2429 //		i2c_w(ov, 0x2b, 0x00);
2430 		i2c_w(ov, 0x14, qvga?0xa4:0x84);
2431 		i2c_w_mask(ov, 0x28, qvga?0x00:0x20, 0x20);
2432 		i2c_w(ov, 0x24, qvga?0x20:0x3a);
2433 		i2c_w(ov, 0x25, qvga?0x30:0x60);
2434 		i2c_w_mask(ov, 0x2d, qvga?0x40:0x00, 0x40);
2435 		i2c_w_mask(ov, 0x67, qvga?0xf0:0x90, 0xf0);
2436 		i2c_w_mask(ov, 0x74, qvga?0x20:0x00, 0x20);
2437 		break;
2438 	case SEN_OV76BE:
2439 //		i2c_w(ov, 0x2b, 0x00);
2440 		i2c_w(ov, 0x14, qvga?0xa4:0x84);
2441 // FIXME: Enable this once 7620AE uses 7620 initial settings
2442 #if 0
2443 		i2c_w_mask(ov, 0x28, qvga?0x00:0x20, 0x20);
2444 		i2c_w(ov, 0x24, qvga?0x20:0x3a);
2445 		i2c_w(ov, 0x25, qvga?0x30:0x60);
2446 		i2c_w_mask(ov, 0x2d, qvga?0x40:0x00, 0x40);
2447 		i2c_w_mask(ov, 0x67, qvga?0xb0:0x90, 0xf0);
2448 		i2c_w_mask(ov, 0x74, qvga?0x20:0x00, 0x20);
2449 #endif
2450 		break;
2451 	case SEN_OV6620:
2452 		i2c_w(ov, 0x14, qvga?0x24:0x04);
2453 		break;
2454 	case SEN_OV6630:
2455 		i2c_w(ov, 0x14, qvga?0xa0:0x80);
2456 		break;
2457 	default:
2458 		err("Invalid sensor");
2459 		return -EINVAL;
2460 	}
2461 
2462 	/******** Palette-specific regs ********/
2463 
2464 	if (mode == VIDEO_PALETTE_GREY) {
2465 		if (ov->sensor == SEN_OV7610 || ov->sensor == SEN_OV76BE) {
2466 			/* these aren't valid on the OV6620/OV7620/6630? */
2467 			i2c_w_mask(ov, 0x0e, 0x40, 0x40);
2468 		}
2469 
2470 		if (ov->sensor == SEN_OV6630 && ov->bridge == BRG_OV518
2471 		    && ov518_color) {
2472 			i2c_w_mask(ov, 0x12, 0x00, 0x10);
2473 			i2c_w_mask(ov, 0x13, 0x00, 0x20);
2474 		} else {
2475 			i2c_w_mask(ov, 0x13, 0x20, 0x20);
2476 		}
2477 	} else {
2478 		if (ov->sensor == SEN_OV7610 || ov->sensor == SEN_OV76BE) {
2479 			/* not valid on the OV6620/OV7620/6630? */
2480 			i2c_w_mask(ov, 0x0e, 0x00, 0x40);
2481 		}
2482 
2483 		/* The OV518 needs special treatment. Although both the OV518
2484 		 * and the OV6630 support a 16-bit video bus, only the 8 bit Y
2485 		 * bus is actually used. The UV bus is tied to ground.
2486 		 * Therefore, the OV6630 needs to be in 8-bit multiplexed
2487 		 * output mode */
2488 
2489 		if (ov->sensor == SEN_OV6630 && ov->bridge == BRG_OV518
2490 		    && ov518_color) {
2491 			i2c_w_mask(ov, 0x12, 0x10, 0x10);
2492 			i2c_w_mask(ov, 0x13, 0x20, 0x20);
2493 		} else {
2494 			i2c_w_mask(ov, 0x13, 0x00, 0x20);
2495 		}
2496 	}
2497 
2498 	/******** Clock programming ********/
2499 
2500 	// FIXME: Test this with OV6630
2501 
2502 	/* The OV6620 needs special handling. This prevents the
2503 	 * severe banding that normally occurs */
2504 	if (ov->sensor == SEN_OV6620 || ov->sensor == SEN_OV6630)
2505 	{
2506 		/* Clock down */
2507 
2508 		i2c_w(ov, 0x2a, 0x04);
2509 
2510 		if (ov->compress) {
2511 //			clock = 0;    /* This ensures the highest frame rate */
2512 			clock = 3;
2513 		} else if (clockdiv == -1) {   /* If user didn't override it */
2514 			clock = 3;    /* Gives better exposure time */
2515 		} else {
2516 			clock = clockdiv;
2517 		}
2518 
2519 		PDEBUG(4, "Setting clock divisor to %d", clock);
2520 
2521 		i2c_w(ov, 0x11, clock);
2522 
2523 		i2c_w(ov, 0x2a, 0x84);
2524 		/* This next setting is critical. It seems to improve
2525 		 * the gain or the contrast. The "reserved" bits seem
2526 		 * to have some effect in this case. */
2527 		i2c_w(ov, 0x2d, 0x85);
2528 	}
2529 	else
2530 	{
2531 		if (ov->compress) {
2532 			clock = 1;    /* This ensures the highest frame rate */
2533 		} else if (clockdiv == -1) {   /* If user didn't override it */
2534 			/* Calculate and set the clock divisor */
2535 			clock = ((sub_flag ? ov->subw * ov->subh
2536 				  : width * height)
2537 				 * (mode == VIDEO_PALETTE_GREY ? 2 : 3) / 2)
2538 				 / 66000;
2539 		} else {
2540 			clock = clockdiv;
2541 		}
2542 
2543 		PDEBUG(4, "Setting clock divisor to %d", clock);
2544 
2545 		i2c_w(ov, 0x11, clock);
2546 	}
2547 
2548 	/******** Special Features ********/
2549 
2550 	if (framedrop >= 0)
2551 		i2c_w(ov, 0x16, framedrop);
2552 
2553 	/* Test Pattern */
2554 	i2c_w_mask(ov, 0x12, (testpat?0x02:0x00), 0x02);
2555 
2556 	/* Enable auto white balance */
2557 	i2c_w_mask(ov, 0x12, 0x04, 0x04);
2558 
2559 	// This will go away as soon as ov51x_mode_init_sensor_regs()
2560 	// is fully tested.
2561 	/* 7620/6620/6630? don't have register 0x35, so play it safe */
2562 	if (ov->sensor == SEN_OV7610 || ov->sensor == SEN_OV76BE) {
2563 		if (width == 640 && height == 480)
2564 			i2c_w(ov, 0x35, 0x9e);
2565 		else
2566 			i2c_w(ov, 0x35, 0x1e);
2567 	}
2568 
2569 	return 0;
2570 }
2571 
2572 static int
set_ov_sensor_window(struct usb_ov511 * ov,int width,int height,int mode,int sub_flag)2573 set_ov_sensor_window(struct usb_ov511 *ov, int width, int height, int mode,
2574 		     int sub_flag)
2575 {
2576 	int ret;
2577 	int hwsbase, hwebase, vwsbase, vwebase, hwsize, vwsize;
2578 	int hoffset, voffset, hwscale = 0, vwscale = 0;
2579 
2580 	/* The different sensor ICs handle setting up of window differently.
2581 	 * IF YOU SET IT WRONG, YOU WILL GET ALL ZERO ISOC DATA FROM OV51x!!! */
2582 	switch (ov->sensor) {
2583 	case SEN_OV7610:
2584 	case SEN_OV76BE:
2585 		hwsbase = 0x38;
2586 		hwebase = 0x3a;
2587 		vwsbase = vwebase = 0x05;
2588 		break;
2589 	case SEN_OV6620:
2590 	case SEN_OV6630:
2591 		hwsbase = 0x38;
2592 		hwebase = 0x3a;
2593 		vwsbase = 0x05;
2594 		vwebase = 0x06;
2595 		break;
2596 	case SEN_OV7620:
2597 		hwsbase = 0x2f;		/* From 7620.SET (spec is wrong) */
2598 		hwebase = 0x2f;
2599 		vwsbase = vwebase = 0x05;
2600 		break;
2601 	default:
2602 		err("Invalid sensor");
2603 		return -EINVAL;
2604 	}
2605 
2606 	if (ov->sensor == SEN_OV6620 || ov->sensor == SEN_OV6630) {
2607 		/* Note: OV518(+) does downsample on its own) */
2608 		if ((width > 176 && height > 144)
2609 		    || ov->bclass == BCL_OV518) {  /* CIF */
2610 			ret = mode_init_ov_sensor_regs(ov, width, height,
2611 				mode, sub_flag, 0);
2612 			if (ret < 0)
2613 				return ret;
2614 			hwscale = 1;
2615 			vwscale = 1;  /* The datasheet says 0; it's wrong */
2616 			hwsize = 352;
2617 			vwsize = 288;
2618 		} else if (width > 176 || height > 144) {
2619 			err("Illegal dimensions");
2620 			return -EINVAL;
2621 		} else {			    /* QCIF */
2622 			ret = mode_init_ov_sensor_regs(ov, width, height,
2623 				mode, sub_flag, 1);
2624 			if (ret < 0)
2625 				return ret;
2626 			hwsize = 176;
2627 			vwsize = 144;
2628 		}
2629 	} else {
2630 		if (width > 320 && height > 240) {  /* VGA */
2631 			ret = mode_init_ov_sensor_regs(ov, width, height,
2632 				mode, sub_flag, 0);
2633 			if (ret < 0)
2634 				return ret;
2635 			hwscale = 2;
2636 			vwscale = 1;
2637 			hwsize = 640;
2638 			vwsize = 480;
2639 		} else if (width > 320 || height > 240) {
2640 			err("Illegal dimensions");
2641 			return -EINVAL;
2642 		} else {			    /* QVGA */
2643 			ret = mode_init_ov_sensor_regs(ov, width, height,
2644 				mode, sub_flag, 1);
2645 			if (ret < 0)
2646 				return ret;
2647 			hwscale = 1;
2648 			hwsize = 320;
2649 			vwsize = 240;
2650 		}
2651 	}
2652 
2653 	/* Center the window */
2654 	hoffset = ((hwsize - width) / 2) >> hwscale;
2655 	voffset = ((vwsize - height) / 2) >> vwscale;
2656 
2657 	/* FIXME! - This needs to be changed to support 160x120 and 6620!!! */
2658 	if (sub_flag) {
2659 		i2c_w(ov, 0x17, hwsbase+(ov->subx>>hwscale));
2660 		i2c_w(ov, 0x18,	hwebase+((ov->subx+ov->subw)>>hwscale));
2661 		i2c_w(ov, 0x19, vwsbase+(ov->suby>>vwscale));
2662 		i2c_w(ov, 0x1a, vwebase+((ov->suby+ov->subh)>>vwscale));
2663 	} else {
2664 		i2c_w(ov, 0x17, hwsbase + hoffset);
2665 		i2c_w(ov, 0x18, hwebase + hoffset + (hwsize>>hwscale));
2666 		i2c_w(ov, 0x19, vwsbase + voffset);
2667 		i2c_w(ov, 0x1a, vwebase + voffset + (vwsize>>vwscale));
2668 	}
2669 
2670 #ifdef OV511_DEBUG
2671 	if (dump_sensor)
2672 		dump_i2c_regs(ov);
2673 #endif
2674 
2675 	return 0;
2676 }
2677 
2678 /* Set up the OV511/OV511+ with the given image parameters.
2679  *
2680  * Do not put any sensor-specific code in here (including I2C I/O functions)
2681  */
2682 static int
ov511_mode_init_regs(struct usb_ov511 * ov,int width,int height,int mode,int sub_flag)2683 ov511_mode_init_regs(struct usb_ov511 *ov,
2684 		     int width, int height, int mode, int sub_flag)
2685 {
2686 	int hsegs, vsegs;
2687 
2688 	if (sub_flag) {
2689 		width = ov->subw;
2690 		height = ov->subh;
2691 	}
2692 
2693 	PDEBUG(3, "width:%d, height:%d, mode:%d, sub:%d",
2694 	       width, height, mode, sub_flag);
2695 
2696 	// FIXME: This should be moved to a 7111a-specific function once
2697 	// subcapture is dealt with properly
2698 	if (ov->sensor == SEN_SAA7111A) {
2699 		if (width == 320 && height == 240) {
2700 			/* No need to do anything special */
2701 		} else if (width == 640 && height == 480) {
2702 			/* Set the OV511 up as 320x480, but keep the
2703 			 * V4L resolution as 640x480 */
2704 			width = 320;
2705 		} else {
2706 			err("SAA7111A only allows 320x240 or 640x480");
2707 			return -EINVAL;
2708 		}
2709 	}
2710 
2711 	/* Make sure width and height are a multiple of 8 */
2712 	if (width % 8 || height % 8) {
2713 		err("Invalid size (%d, %d) (mode = %d)", width, height, mode);
2714 		return -EINVAL;
2715 	}
2716 
2717 	if (width < ov->minwidth || height < ov->minheight) {
2718 		err("Requested dimensions are too small");
2719 		return -EINVAL;
2720 	}
2721 
2722 	if (ov51x_stop(ov) < 0)
2723 		return -EIO;
2724 
2725 	if (mode == VIDEO_PALETTE_GREY) {
2726 		reg_w(ov, R511_CAM_UV_EN, 0x00);
2727 		reg_w(ov, R511_SNAP_UV_EN, 0x00);
2728 		reg_w(ov, R511_SNAP_OPTS, 0x01);
2729 	} else {
2730 		reg_w(ov, R511_CAM_UV_EN, 0x01);
2731 		reg_w(ov, R511_SNAP_UV_EN, 0x01);
2732 		reg_w(ov, R511_SNAP_OPTS, 0x03);
2733 	}
2734 
2735 	/* Here I'm assuming that snapshot size == image size.
2736 	 * I hope that's always true. --claudio
2737 	 */
2738 	hsegs = (width >> 3) - 1;
2739 	vsegs = (height >> 3) - 1;
2740 
2741 	reg_w(ov, R511_CAM_PXCNT, hsegs);
2742 	reg_w(ov, R511_CAM_LNCNT, vsegs);
2743 	reg_w(ov, R511_CAM_PXDIV, 0x00);
2744 	reg_w(ov, R511_CAM_LNDIV, 0x00);
2745 
2746 	/* YUV420, low pass filter on */
2747 	reg_w(ov, R511_CAM_OPTS, 0x03);
2748 
2749 	/* Snapshot additions */
2750 	reg_w(ov, R511_SNAP_PXCNT, hsegs);
2751 	reg_w(ov, R511_SNAP_LNCNT, vsegs);
2752 	reg_w(ov, R511_SNAP_PXDIV, 0x00);
2753 	reg_w(ov, R511_SNAP_LNDIV, 0x00);
2754 
2755 	if (ov->compress) {
2756 		/* Enable Y and UV quantization and compression */
2757 		reg_w(ov, R511_COMP_EN, 0x07);
2758 		reg_w(ov, R511_COMP_LUT_EN, 0x03);
2759 		ov51x_reset(ov, OV511_RESET_OMNICE);
2760 	}
2761 
2762 	if (ov51x_restart(ov) < 0)
2763 		return -EIO;
2764 
2765 	return 0;
2766 }
2767 
2768 /* Sets up the OV518/OV518+ with the given image parameters
2769  *
2770  * OV518 needs a completely different approach, until we can figure out what
2771  * the individual registers do. Also, only 15 FPS is supported now.
2772  *
2773  * Do not put any sensor-specific code in here (including I2C I/O functions)
2774  */
2775 static int
ov518_mode_init_regs(struct usb_ov511 * ov,int width,int height,int mode,int sub_flag)2776 ov518_mode_init_regs(struct usb_ov511 *ov,
2777 		     int width, int height, int mode, int sub_flag)
2778 {
2779 	int hsegs, vsegs, hi_res;
2780 
2781 	if (sub_flag) {
2782 		width = ov->subw;
2783 		height = ov->subh;
2784 	}
2785 
2786 	PDEBUG(3, "width:%d, height:%d, mode:%d, sub:%d",
2787 	       width, height, mode, sub_flag);
2788 
2789 	if (width % 16 || height % 8) {
2790 		err("Invalid size (%d, %d)", width, height);
2791 		return -EINVAL;
2792 	}
2793 
2794 	if (width < ov->minwidth || height < ov->minheight) {
2795 		err("Requested dimensions are too small");
2796 		return -EINVAL;
2797 	}
2798 
2799 	if (width >= 320 && height >= 240) {
2800 		hi_res = 1;
2801 	} else if (width >= 320 || height >= 240) {
2802 		err("Invalid width/height combination (%d, %d)", width, height);
2803 		return -EINVAL;
2804 	} else {
2805 		hi_res = 0;
2806 	}
2807 
2808 	if (ov51x_stop(ov) < 0)
2809 		return -EIO;
2810 
2811 	/******** Set the mode ********/
2812 
2813 	reg_w(ov, 0x2b, 0);
2814 	reg_w(ov, 0x2c, 0);
2815 	reg_w(ov, 0x2d, 0);
2816 	reg_w(ov, 0x2e, 0);
2817 	reg_w(ov, 0x3b, 0);
2818 	reg_w(ov, 0x3c, 0);
2819 	reg_w(ov, 0x3d, 0);
2820 	reg_w(ov, 0x3e, 0);
2821 
2822 	if (ov->bridge == BRG_OV518 && ov518_color) {
2823 		/* OV518 needs U and V swapped */
2824 		i2c_w_mask(ov, 0x15, 0x00, 0x01);
2825 
2826 	 	if (mode == VIDEO_PALETTE_GREY) {
2827 			/* Set 16-bit input format (UV data are ignored) */
2828 			reg_w_mask(ov, 0x20, 0x00, 0x08);
2829 
2830 			/* Set 8-bit (4:0:0) output format */
2831 			reg_w_mask(ov, 0x28, 0x00, 0xf0);
2832 			reg_w_mask(ov, 0x38, 0x00, 0xf0);
2833 		} else {
2834 			/* Set 8-bit (YVYU) input format */
2835 			reg_w_mask(ov, 0x20, 0x08, 0x08);
2836 
2837 			/* Set 12-bit (4:2:0) output format */
2838 			reg_w_mask(ov, 0x28, 0x80, 0xf0);
2839 			reg_w_mask(ov, 0x38, 0x80, 0xf0);
2840 		}
2841 	} else {
2842 		reg_w(ov, 0x28, (mode == VIDEO_PALETTE_GREY) ? 0x00:0x80);
2843 		reg_w(ov, 0x38, (mode == VIDEO_PALETTE_GREY) ? 0x00:0x80);
2844 	}
2845 
2846 	hsegs = width / 16;
2847 	vsegs = height / 4;
2848 
2849 	reg_w(ov, 0x29, hsegs);
2850 	reg_w(ov, 0x2a, vsegs);
2851 
2852 	reg_w(ov, 0x39, hsegs);
2853 	reg_w(ov, 0x3a, vsegs);
2854 
2855 	/* Windows driver does this here; who knows why */
2856 	reg_w(ov, 0x2f, 0x80);
2857 
2858 	/******** Set the framerate (to 15 FPS) ********/
2859 
2860 	/* Mode independent, but framerate dependent, regs */
2861 	reg_w(ov, 0x51, 0x02);	/* Clock divider; lower==faster */
2862 	reg_w(ov, 0x22, 0x18);
2863 	reg_w(ov, 0x23, 0xff);
2864 
2865 	if (ov->bridge == BRG_OV518PLUS)
2866 		reg_w(ov, 0x21, 0x19);
2867 	else
2868 		reg_w(ov, 0x71, 0x19);	/* Compression-related? */
2869 
2870 	// FIXME: Sensor-specific
2871 	/* Bit 5 is what matters here. Of course, it is "reserved" */
2872 	i2c_w(ov, 0x54, 0x23);
2873 
2874 	reg_w(ov, 0x2f, 0x80);
2875 
2876 	if (ov->bridge == BRG_OV518PLUS) {
2877 		reg_w(ov, 0x24, 0x94);
2878 		reg_w(ov, 0x25, 0x90);
2879 		ov518_reg_w32(ov, 0xc4,    400, 2);	/* 190h   */
2880 		ov518_reg_w32(ov, 0xc6,    540, 2);	/* 21ch   */
2881 		ov518_reg_w32(ov, 0xc7,    540, 2);	/* 21ch   */
2882 		ov518_reg_w32(ov, 0xc8,    108, 2);	/* 6ch    */
2883 		ov518_reg_w32(ov, 0xca, 131098, 3);	/* 2001ah */
2884 		ov518_reg_w32(ov, 0xcb,    532, 2);	/* 214h   */
2885 		ov518_reg_w32(ov, 0xcc,   2400, 2);	/* 960h   */
2886 		ov518_reg_w32(ov, 0xcd,     32, 2);	/* 20h    */
2887 		ov518_reg_w32(ov, 0xce,    608, 2);	/* 260h   */
2888 	} else {
2889 		reg_w(ov, 0x24, 0x9f);
2890 		reg_w(ov, 0x25, 0x90);
2891 		ov518_reg_w32(ov, 0xc4,    400, 2);	/* 190h   */
2892 		ov518_reg_w32(ov, 0xc6,    500, 2);	/* 1f4h   */
2893 		ov518_reg_w32(ov, 0xc7,    500, 2);	/* 1f4h   */
2894 		ov518_reg_w32(ov, 0xc8,    142, 2);	/* 8eh    */
2895 		ov518_reg_w32(ov, 0xca, 131098, 3);	/* 2001ah */
2896 		ov518_reg_w32(ov, 0xcb,    532, 2);	/* 214h   */
2897 		ov518_reg_w32(ov, 0xcc,   2000, 2);	/* 7d0h   */
2898 		ov518_reg_w32(ov, 0xcd,     32, 2);	/* 20h    */
2899 		ov518_reg_w32(ov, 0xce,    608, 2);	/* 260h   */
2900 	}
2901 
2902 	reg_w(ov, 0x2f, 0x80);
2903 
2904 	if (ov51x_restart(ov) < 0)
2905 		return -EIO;
2906 
2907 	/* Reset it just for good measure */
2908 	if (ov51x_reset(ov, OV511_RESET_NOREGS) < 0)
2909 		return -EIO;
2910 
2911 	return 0;
2912 }
2913 
2914 /* This is a wrapper around the OV511, OV518, and sensor specific functions */
2915 static int
mode_init_regs(struct usb_ov511 * ov,int width,int height,int mode,int sub_flag)2916 mode_init_regs(struct usb_ov511 *ov,
2917 	       int width, int height, int mode, int sub_flag)
2918 {
2919 	int rc = 0;
2920 
2921 	if (!ov || !ov->dev)
2922 		return -EFAULT;
2923 
2924 	if (ov->bclass == BCL_OV518) {
2925 		rc = ov518_mode_init_regs(ov, width, height, mode, sub_flag);
2926 	} else {
2927 		rc = ov511_mode_init_regs(ov, width, height, mode, sub_flag);
2928 	}
2929 
2930 	if (FATAL_ERROR(rc))
2931 		return rc;
2932 
2933 	switch (ov->sensor) {
2934 	case SEN_OV7610:
2935 	case SEN_OV7620:
2936 	case SEN_OV76BE:
2937 	case SEN_OV8600:
2938 	case SEN_OV6620:
2939 	case SEN_OV6630:
2940 		rc = set_ov_sensor_window(ov, width, height, mode, sub_flag);
2941 		break;
2942 	case SEN_KS0127:
2943 	case SEN_KS0127B:
2944 		err("KS0127-series decoders not supported yet");
2945 		rc = -EINVAL;
2946 		break;
2947 	case SEN_SAA7111A:
2948 //		rc = mode_init_saa_sensor_regs(ov, width, height, mode,
2949 //					       sub_flag);
2950 
2951 		PDEBUG(1, "SAA status = 0x%02X", i2c_r(ov, 0x1f));
2952 		break;
2953 	default:
2954 		err("Unknown sensor");
2955 		rc = -EINVAL;
2956 	}
2957 
2958 	if (FATAL_ERROR(rc))
2959 		return rc;
2960 
2961 	/* Sensor-independent settings */
2962 	rc = sensor_set_auto_brightness(ov, ov->auto_brt);
2963 	if (FATAL_ERROR(rc))
2964 		return rc;
2965 
2966 	rc = sensor_set_auto_exposure(ov, ov->auto_exp);
2967 	if (FATAL_ERROR(rc))
2968 		return rc;
2969 
2970 	rc = sensor_set_banding_filter(ov, bandingfilter);
2971 	if (FATAL_ERROR(rc))
2972 		return rc;
2973 
2974 	if (ov->lightfreq) {
2975 		rc = sensor_set_light_freq(ov, lightfreq);
2976 		if (FATAL_ERROR(rc))
2977 			return rc;
2978 	}
2979 
2980 	rc = sensor_set_backlight(ov, ov->backlight);
2981 	if (FATAL_ERROR(rc))
2982 		return rc;
2983 
2984 	rc = sensor_set_mirror(ov, ov->mirror);
2985 	if (FATAL_ERROR(rc))
2986 		return rc;
2987 
2988 	return 0;
2989 }
2990 
2991 /* This sets the default image parameters. This is useful for apps that use
2992  * read() and do not set these.
2993  */
2994 static int
ov51x_set_default_params(struct usb_ov511 * ov)2995 ov51x_set_default_params(struct usb_ov511 *ov)
2996 {
2997 	int i;
2998 
2999 	/* Set default sizes in case IOCTL (VIDIOCMCAPTURE) is not used
3000 	 * (using read() instead). */
3001 	for (i = 0; i < OV511_NUMFRAMES; i++) {
3002 		ov->frame[i].width = ov->maxwidth;
3003 		ov->frame[i].height = ov->maxheight;
3004 		ov->frame[i].bytes_read = 0;
3005 		if (force_palette)
3006 			ov->frame[i].format = force_palette;
3007 		else
3008 			ov->frame[i].format = VIDEO_PALETTE_RGB24;
3009 
3010 		ov->frame[i].depth = get_depth(ov->frame[i].format);
3011 	}
3012 
3013 	PDEBUG(3, "%dx%d, %s", ov->maxwidth, ov->maxheight,
3014 	       symbolic(v4l1_plist, ov->frame[0].format));
3015 
3016 	/* Initialize to max width/height, YUV420 or RGB24 (if supported) */
3017 	if (mode_init_regs(ov, ov->maxwidth, ov->maxheight,
3018 			   ov->frame[0].format, 0) < 0)
3019 		return -EINVAL;
3020 
3021 	return 0;
3022 }
3023 
3024 /**********************************************************************
3025  *
3026  * Video decoder stuff
3027  *
3028  **********************************************************************/
3029 
3030 /* Set analog input port of decoder */
3031 static int
decoder_set_input(struct usb_ov511 * ov,int input)3032 decoder_set_input(struct usb_ov511 *ov, int input)
3033 {
3034 	PDEBUG(4, "port %d", input);
3035 
3036 	switch (ov->sensor) {
3037 	case SEN_SAA7111A:
3038 	{
3039 		/* Select mode */
3040 		i2c_w_mask(ov, 0x02, input, 0x07);
3041 		/* Bypass chrominance trap for modes 4..7 */
3042 		i2c_w_mask(ov, 0x09, (input > 3) ? 0x80:0x00, 0x80);
3043 		break;
3044 	}
3045 	default:
3046 		return -EINVAL;
3047 	}
3048 
3049 	return 0;
3050 }
3051 
3052 /* Get ASCII name of video input */
3053 static int
decoder_get_input_name(struct usb_ov511 * ov,int input,char * name)3054 decoder_get_input_name(struct usb_ov511 *ov, int input, char *name)
3055 {
3056 	switch (ov->sensor) {
3057 	case SEN_SAA7111A:
3058 	{
3059 		if (input < 0 || input > 7)
3060 			return -EINVAL;
3061 		else if (input < 4)
3062 			sprintf(name, "CVBS-%d", input);
3063 		else // if (input < 8)
3064 			sprintf(name, "S-Video-%d", input - 4);
3065 		break;
3066 	}
3067 	default:
3068 		sprintf(name, "%s", "Camera");
3069 	}
3070 
3071 	return 0;
3072 }
3073 
3074 /* Set norm (NTSC, PAL, SECAM, AUTO) */
3075 static int
decoder_set_norm(struct usb_ov511 * ov,int norm)3076 decoder_set_norm(struct usb_ov511 *ov, int norm)
3077 {
3078 	PDEBUG(4, "%d", norm);
3079 
3080 	switch (ov->sensor) {
3081 	case SEN_SAA7111A:
3082 	{
3083 		int reg_8, reg_e;
3084 
3085 		if (norm == VIDEO_MODE_NTSC) {
3086 			reg_8 = 0x40;	/* 60 Hz */
3087 			reg_e = 0x00;	/* NTSC M / PAL BGHI */
3088 		} else if (norm == VIDEO_MODE_PAL) {
3089 			reg_8 = 0x00;	/* 50 Hz */
3090 			reg_e = 0x00;	/* NTSC M / PAL BGHI */
3091 		} else if (norm == VIDEO_MODE_AUTO) {
3092 			reg_8 = 0x80;	/* Auto field detect */
3093 			reg_e = 0x00;	/* NTSC M / PAL BGHI */
3094 		} else if (norm == VIDEO_MODE_SECAM) {
3095 			reg_8 = 0x00;	/* 50 Hz */
3096 			reg_e = 0x50;	/* SECAM / PAL 4.43 */
3097 		} else {
3098 			return -EINVAL;
3099 		}
3100 
3101 		i2c_w_mask(ov, 0x08, reg_8, 0xc0);
3102 		i2c_w_mask(ov, 0x0e, reg_e, 0x70);
3103 		break;
3104 	}
3105 	default:
3106 		return -EINVAL;
3107 	}
3108 
3109 	return 0;
3110 }
3111 
3112 /**********************************************************************
3113  *
3114  * Color correction functions
3115  *
3116  **********************************************************************/
3117 
3118 /*
3119  * Turn a YUV4:2:0 block into an RGB block
3120  *
3121  * Video4Linux seems to use the blue, green, red channel
3122  * order convention-- rgb[0] is blue, rgb[1] is green, rgb[2] is red.
3123  *
3124  * Color space conversion coefficients taken from the excellent
3125  * http://www.inforamp.net/~poynton/ColorFAQ.html
3126  * In his terminology, this is a CCIR 601.1 YCbCr -> RGB.
3127  * Y values are given for all 4 pixels, but the U (Pb)
3128  * and V (Pr) are assumed constant over the 2x2 block.
3129  *
3130  * To avoid floating point arithmetic, the color conversion
3131  * coefficients are scaled into 16.16 fixed-point integers.
3132  * They were determined as follows:
3133  *
3134  *	double brightness = 1.0;  (0->black; 1->full scale)
3135  *	double saturation = 1.0;  (0->greyscale; 1->full color)
3136  *	double fixScale = brightness * 256 * 256;
3137  *	int rvScale = (int)(1.402 * saturation * fixScale);
3138  *	int guScale = (int)(-0.344136 * saturation * fixScale);
3139  *	int gvScale = (int)(-0.714136 * saturation * fixScale);
3140  *	int buScale = (int)(1.772 * saturation * fixScale);
3141  *	int yScale = (int)(fixScale);
3142  */
3143 
3144 /* LIMIT: convert a 16.16 fixed-point value to a byte, with clipping. */
3145 #define LIMIT(x) ((x)>0xffffff?0xff: ((x)<=0xffff?0:((x)>>16)))
3146 
3147 static inline void
move_420_block(int yTL,int yTR,int yBL,int yBR,int u,int v,int rowPixels,unsigned char * rgb,int bits)3148 move_420_block(int yTL, int yTR, int yBL, int yBR, int u, int v,
3149 	       int rowPixels, unsigned char * rgb, int bits)
3150 {
3151 	const int rvScale = 91881;
3152 	const int guScale = -22553;
3153 	const int gvScale = -46801;
3154 	const int buScale = 116129;
3155 	const int yScale  = 65536;
3156 	int r, g, b;
3157 
3158 	g = guScale * u + gvScale * v;
3159 	if (force_rgb) {
3160 		r = buScale * u;
3161 		b = rvScale * v;
3162 	} else {
3163 		r = rvScale * v;
3164 		b = buScale * u;
3165 	}
3166 
3167 	yTL *= yScale; yTR *= yScale;
3168 	yBL *= yScale; yBR *= yScale;
3169 
3170 	if (bits == 24) {
3171 		/* Write out top two pixels */
3172 		rgb[0] = LIMIT(b+yTL); rgb[1] = LIMIT(g+yTL);
3173 		rgb[2] = LIMIT(r+yTL);
3174 
3175 		rgb[3] = LIMIT(b+yTR); rgb[4] = LIMIT(g+yTR);
3176 		rgb[5] = LIMIT(r+yTR);
3177 
3178 		/* Skip down to next line to write out bottom two pixels */
3179 		rgb += 3 * rowPixels;
3180 		rgb[0] = LIMIT(b+yBL); rgb[1] = LIMIT(g+yBL);
3181 		rgb[2] = LIMIT(r+yBL);
3182 
3183 		rgb[3] = LIMIT(b+yBR); rgb[4] = LIMIT(g+yBR);
3184 		rgb[5] = LIMIT(r+yBR);
3185 	} else if (bits == 16) {
3186 		/* Write out top two pixels */
3187 		rgb[0] = ((LIMIT(b+yTL) >> 3) & 0x1F)
3188 			| ((LIMIT(g+yTL) << 3) & 0xE0);
3189 		rgb[1] = ((LIMIT(g+yTL) >> 5) & 0x07)
3190 			| (LIMIT(r+yTL) & 0xF8);
3191 
3192 		rgb[2] = ((LIMIT(b+yTR) >> 3) & 0x1F)
3193 			| ((LIMIT(g+yTR) << 3) & 0xE0);
3194 		rgb[3] = ((LIMIT(g+yTR) >> 5) & 0x07)
3195 			| (LIMIT(r+yTR) & 0xF8);
3196 
3197 		/* Skip down to next line to write out bottom two pixels */
3198 		rgb += 2 * rowPixels;
3199 
3200 		rgb[0] = ((LIMIT(b+yBL) >> 3) & 0x1F)
3201 			| ((LIMIT(g+yBL) << 3) & 0xE0);
3202 		rgb[1] = ((LIMIT(g+yBL) >> 5) & 0x07)
3203 			| (LIMIT(r+yBL) & 0xF8);
3204 
3205 		rgb[2] = ((LIMIT(b+yBR) >> 3) & 0x1F)
3206 			| ((LIMIT(g+yBR) << 3) & 0xE0);
3207 		rgb[3] = ((LIMIT(g+yBR) >> 5) & 0x07)
3208 			| (LIMIT(r+yBR) & 0xF8);
3209 	}
3210 }
3211 
3212 /**********************************************************************
3213  *
3214  * Raw data parsing
3215  *
3216  **********************************************************************/
3217 
3218 /* Copies a 64-byte segment at pIn to an 8x8 block at pOut. The width of the
3219  * image at pOut is specified by w.
3220  */
3221 static inline void
make_8x8(unsigned char * pIn,unsigned char * pOut,int w)3222 make_8x8(unsigned char *pIn, unsigned char *pOut, int w)
3223 {
3224 	unsigned char *pOut1 = pOut;
3225 	int x, y;
3226 
3227 	for (y = 0; y < 8; y++) {
3228 		pOut1 = pOut;
3229 		for (x = 0; x < 8; x++) {
3230 			*pOut1++ = *pIn++;
3231 		}
3232 		pOut += w;
3233 	}
3234 }
3235 
3236 /*
3237  * For RAW BW (YUV 4:0:0) images, data show up in 256 byte segments.
3238  * The segments represent 4 squares of 8x8 pixels as follows:
3239  *
3240  *      0  1 ...  7    64  65 ...  71   ...  192 193 ... 199
3241  *      8  9 ... 15    72  73 ...  79        200 201 ... 207
3242  *           ...              ...                    ...
3243  *     56 57 ... 63   120 121 ... 127        248 249 ... 255
3244  *
3245  */
3246 static void
yuv400raw_to_yuv400p(struct ov511_frame * frame,unsigned char * pIn0,unsigned char * pOut0)3247 yuv400raw_to_yuv400p(struct ov511_frame *frame,
3248 		     unsigned char *pIn0, unsigned char *pOut0)
3249 {
3250 	int x, y;
3251 	unsigned char *pIn, *pOut, *pOutLine;
3252 
3253 	/* Copy Y */
3254 	pIn = pIn0;
3255 	pOutLine = pOut0;
3256 	for (y = 0; y < frame->rawheight - 1; y += 8) {
3257 		pOut = pOutLine;
3258 		for (x = 0; x < frame->rawwidth - 1; x += 8) {
3259 			make_8x8(pIn, pOut, frame->rawwidth);
3260 			pIn += 64;
3261 			pOut += 8;
3262 		}
3263 		pOutLine += 8 * frame->rawwidth;
3264 	}
3265 }
3266 
3267 /*
3268  * For YUV 4:2:0 images, the data show up in 384 byte segments.
3269  * The first 64 bytes of each segment are U, the next 64 are V.  The U and
3270  * V are arranged as follows:
3271  *
3272  *      0  1 ...  7
3273  *      8  9 ... 15
3274  *           ...
3275  *     56 57 ... 63
3276  *
3277  * U and V are shipped at half resolution (1 U,V sample -> one 2x2 block).
3278  *
3279  * The next 256 bytes are full resolution Y data and represent 4 squares
3280  * of 8x8 pixels as follows:
3281  *
3282  *      0  1 ...  7    64  65 ...  71   ...  192 193 ... 199
3283  *      8  9 ... 15    72  73 ...  79        200 201 ... 207
3284  *           ...              ...                    ...
3285  *     56 57 ... 63   120 121 ... 127   ...  248 249 ... 255
3286  *
3287  * Note that the U and V data in one segment represent a 16 x 16 pixel
3288  * area, but the Y data represent a 32 x 8 pixel area. If the width is not an
3289  * even multiple of 32, the extra 8x8 blocks within a 32x8 block belong to the
3290  * next horizontal stripe.
3291  *
3292  * If dumppix module param is set, _parse_data just dumps the incoming segments,
3293  * verbatim, in order, into the frame. When used with vidcat -f ppm -s 640x480
3294  * this puts the data on the standard output and can be analyzed with the
3295  * parseppm.c utility I wrote.  That's a much faster way for figuring out how
3296  * these data are scrambled.
3297  */
3298 
3299 /* Converts from raw, uncompressed segments at pIn0 to a YUV420P frame at pOut0.
3300  *
3301  * FIXME: Currently only handles width and height that are multiples of 16
3302  */
3303 static void
yuv420raw_to_yuv420p(struct ov511_frame * frame,unsigned char * pIn0,unsigned char * pOut0)3304 yuv420raw_to_yuv420p(struct ov511_frame *frame,
3305 		     unsigned char *pIn0, unsigned char *pOut0)
3306 {
3307 	int k, x, y;
3308 	unsigned char *pIn, *pOut, *pOutLine;
3309 	const unsigned int a = frame->rawwidth * frame->rawheight;
3310 	const unsigned int w = frame->rawwidth / 2;
3311 
3312 	/* Copy U and V */
3313 	pIn = pIn0;
3314 	pOutLine = pOut0 + a;
3315 	for (y = 0; y < frame->rawheight - 1; y += 16) {
3316 		pOut = pOutLine;
3317 		for (x = 0; x < frame->rawwidth - 1; x += 16) {
3318 			make_8x8(pIn, pOut, w);
3319 			make_8x8(pIn + 64, pOut + a/4, w);
3320 			pIn += 384;
3321 			pOut += 8;
3322 		}
3323 		pOutLine += 8 * w;
3324 	}
3325 
3326 	/* Copy Y */
3327 	pIn = pIn0 + 128;
3328 	pOutLine = pOut0;
3329 	k = 0;
3330 	for (y = 0; y < frame->rawheight - 1; y += 8) {
3331 		pOut = pOutLine;
3332 		for (x = 0; x < frame->rawwidth - 1; x += 8) {
3333 			make_8x8(pIn, pOut, frame->rawwidth);
3334 			pIn += 64;
3335 			pOut += 8;
3336 			if ((++k) > 3) {
3337 				k = 0;
3338 				pIn += 128;
3339 			}
3340 		}
3341 		pOutLine += 8 * frame->rawwidth;
3342 	}
3343 }
3344 
3345 /*
3346  * fixFrameRGBoffset--
3347  * My camera seems to return the red channel about 1 pixel
3348  * low, and the blue channel about 1 pixel high. After YUV->RGB
3349  * conversion, we can correct this easily. OSL 2/24/2000.
3350  */
3351 static void
fixFrameRGBoffset(struct ov511_frame * frame)3352 fixFrameRGBoffset(struct ov511_frame *frame)
3353 {
3354 	int x, y;
3355 	int rowBytes = frame->width*3, w = frame->width;
3356 	unsigned char *rgb = frame->data;
3357 	const int shift = 1;  /* Distance to shift pixels by, vertically */
3358 
3359 	/* Don't bother with little images */
3360 	if (frame->width < 400)
3361 		return;
3362 
3363 	/* This only works with RGB24 */
3364 	if (frame->format != VIDEO_PALETTE_RGB24)
3365 		return;
3366 
3367 	/* Shift red channel up */
3368 	for (y = shift; y < frame->height; y++)	{
3369 		int lp = (y-shift)*rowBytes;     /* Previous line offset */
3370 		int lc = y*rowBytes;             /* Current line offset */
3371 		for (x = 0; x < w; x++)
3372 			rgb[lp+x*3+2] = rgb[lc+x*3+2]; /* Shift red up */
3373 	}
3374 
3375 	/* Shift blue channel down */
3376 	for (y = frame->height-shift-1; y >= 0; y--) {
3377 		int ln = (y + shift) * rowBytes;  /* Next line offset */
3378 		int lc = y * rowBytes;            /* Current line offset */
3379 		for (x = 0; x < w; x++)
3380 			rgb[ln+x*3+0] = rgb[lc+x*3+0]; /* Shift blue down */
3381 	}
3382 }
3383 
3384 /**********************************************************************
3385  *
3386  * Decompression
3387  *
3388  **********************************************************************/
3389 
3390 /* Chooses a decompression module, locks it, and sets ov->decomp_ops
3391  * accordingly. Returns -ENXIO if decompressor is not available, otherwise
3392  * returns 0 if no other error.
3393  */
3394 static int
request_decompressor(struct usb_ov511 * ov)3395 request_decompressor(struct usb_ov511 *ov)
3396 {
3397 	if (!ov)
3398 		return -ENODEV;
3399 
3400 	if (ov->decomp_ops) {
3401 		err("ERROR: Decompressor already requested!");
3402 		return -EINVAL;
3403 	}
3404 
3405 	lock_kernel();
3406 
3407 	/* Try to get MMX, and fall back on no-MMX if necessary */
3408 	if (ov->bclass == BCL_OV511) {
3409 		if (ov511_mmx_decomp_ops) {
3410 			PDEBUG(3, "Using OV511 MMX decompressor");
3411 			ov->decomp_ops = ov511_mmx_decomp_ops;
3412 		} else if (ov511_decomp_ops) {
3413 			PDEBUG(3, "Using OV511 decompressor");
3414 			ov->decomp_ops = ov511_decomp_ops;
3415 		} else {
3416 			err("No decompressor available");
3417 		}
3418 	} else if (ov->bclass == BCL_OV518) {
3419 		if (ov518_mmx_decomp_ops) {
3420 			PDEBUG(3, "Using OV518 MMX decompressor");
3421 			ov->decomp_ops = ov518_mmx_decomp_ops;
3422 		} else if (ov518_decomp_ops) {
3423 			PDEBUG(3, "Using OV518 decompressor");
3424 			ov->decomp_ops = ov518_decomp_ops;
3425 		} else {
3426 			err("No decompressor available");
3427 		}
3428 	} else {
3429 		err("Unknown bridge");
3430 	}
3431 
3432 	if (ov->decomp_ops) {
3433 		if (!ov->decomp_ops->owner) {
3434 			ov->decomp_ops = NULL;
3435 			unlock_kernel();
3436 			return -ENOSYS;
3437 		}
3438 		__MOD_INC_USE_COUNT(ov->decomp_ops->owner);
3439 		unlock_kernel();
3440 		return 0;
3441 	} else {
3442 		unlock_kernel();
3443 		return -ENOSYS;
3444 	}
3445 }
3446 
3447 /* Unlocks decompression module and nulls ov->decomp_ops. Safe to call even
3448  * if ov->decomp_ops is NULL.
3449  */
3450 static void
release_decompressor(struct usb_ov511 * ov)3451 release_decompressor(struct usb_ov511 *ov)
3452 {
3453 	int released = 0;	/* Did we actually do anything? */
3454 
3455 	if (!ov)
3456 		return;
3457 
3458 	lock_kernel();
3459 
3460 	if (ov->decomp_ops && ov->decomp_ops->owner) {
3461 		__MOD_DEC_USE_COUNT(ov->decomp_ops->owner);
3462 		released = 1;
3463 	}
3464 
3465 	ov->decomp_ops = NULL;
3466 
3467 	unlock_kernel();
3468 
3469 	if (released)
3470 		PDEBUG(3, "Decompressor released");
3471 }
3472 
3473 static void
decompress(struct usb_ov511 * ov,struct ov511_frame * frame,unsigned char * pIn0,unsigned char * pOut0)3474 decompress(struct usb_ov511 *ov, struct ov511_frame *frame,
3475 	   unsigned char *pIn0, unsigned char *pOut0)
3476 {
3477 	if (!ov->decomp_ops)
3478 		if (request_decompressor(ov))
3479 			return;
3480 
3481 	PDEBUG(4, "Decompressing %d bytes", frame->bytes_recvd);
3482 
3483 	if (frame->format == VIDEO_PALETTE_GREY
3484 	    && ov->decomp_ops->decomp_400) {
3485 		int ret = ov->decomp_ops->decomp_400(
3486 			pIn0,
3487 			pOut0,
3488 			frame->compbuf,
3489 			frame->rawwidth,
3490 			frame->rawheight,
3491 			frame->bytes_recvd);
3492 		PDEBUG(4, "DEBUG: decomp_400 returned %d", ret);
3493 	} else if (frame->format != VIDEO_PALETTE_GREY
3494 		   && ov->decomp_ops->decomp_420) {
3495 		int ret = ov->decomp_ops->decomp_420(
3496 			pIn0,
3497 			pOut0,
3498 			frame->compbuf,
3499 			frame->rawwidth,
3500 			frame->rawheight,
3501 			frame->bytes_recvd);
3502 		PDEBUG(4, "DEBUG: decomp_420 returned %d", ret);
3503 	} else {
3504 		err("Decompressor does not support this format");
3505 	}
3506 }
3507 
3508 /**********************************************************************
3509  *
3510  * Format conversion
3511  *
3512  **********************************************************************/
3513 
3514 /* Converts from planar YUV420 to RGB24. */
3515 static void
yuv420p_to_rgb(struct ov511_frame * frame,unsigned char * pIn0,unsigned char * pOut0,int bits)3516 yuv420p_to_rgb(struct ov511_frame *frame,
3517 	       unsigned char *pIn0, unsigned char *pOut0, int bits)
3518 {
3519 	const int numpix = frame->width * frame->height;
3520 	const int bytes = bits >> 3;
3521 	int i, j, y00, y01, y10, y11, u, v;
3522 	unsigned char *pY = pIn0;
3523 	unsigned char *pU = pY + numpix;
3524 	unsigned char *pV = pU + numpix / 4;
3525 	unsigned char *pOut = pOut0;
3526 
3527 	for (j = 0; j <= frame->height - 2; j += 2) {
3528 		for (i = 0; i <= frame->width - 2; i += 2) {
3529 			y00 = *pY;
3530 			y01 = *(pY + 1);
3531 			y10 = *(pY + frame->width);
3532 			y11 = *(pY + frame->width + 1);
3533 			u = (*pU++) - 128;
3534 			v = (*pV++) - 128;
3535 
3536 			move_420_block(y00, y01, y10, y11, u, v,
3537 				       frame->width, pOut, bits);
3538 
3539 			pY += 2;
3540 			pOut += 2 * bytes;
3541 		}
3542 		pY += frame->width;
3543 		pOut += frame->width * bytes;
3544 	}
3545 }
3546 
3547 /* Converts from planar YUV420 to YUV422 (YUYV). */
3548 static void
yuv420p_to_yuv422(struct ov511_frame * frame,unsigned char * pIn0,unsigned char * pOut0)3549 yuv420p_to_yuv422(struct ov511_frame *frame,
3550 		  unsigned char *pIn0, unsigned char *pOut0)
3551 {
3552 	const int numpix = frame->width * frame->height;
3553 	int i, j;
3554 	unsigned char *pY = pIn0;
3555 	unsigned char *pU = pY + numpix;
3556 	unsigned char *pV = pU + numpix / 4;
3557 	unsigned char *pOut = pOut0;
3558 
3559 	for (i = 0; i < numpix; i++) {
3560 		*pOut = *(pY + i);
3561 		pOut += 2;
3562 	}
3563 
3564 	pOut = pOut0 + 1;
3565 	for (j = 0; j <= frame->height - 2 ; j += 2) {
3566 		for (i = 0; i <= frame->width - 2; i += 2) {
3567 			int u = *pU++;
3568 			int v = *pV++;
3569 
3570 			*pOut = u;
3571 			*(pOut+2) = v;
3572 			*(pOut+frame->width*2) = u;
3573 			*(pOut+frame->width*2+2) = v;
3574 			pOut += 4;
3575 		}
3576 		pOut += (frame->width * 2);
3577 	}
3578 }
3579 
3580 /* Converts pData from planar YUV420 to planar YUV422 **in place**. */
3581 static void
yuv420p_to_yuv422p(struct ov511_frame * frame,unsigned char * pData)3582 yuv420p_to_yuv422p(struct ov511_frame *frame, unsigned char *pData)
3583 {
3584 	const int numpix = frame->width * frame->height;
3585 	const int w = frame->width;
3586 	int j;
3587 	unsigned char *pIn, *pOut;
3588 
3589 	/* Clear U and V */
3590 	memset(pData + numpix + numpix / 2, 127, numpix / 2);
3591 
3592 	/* Convert V starting from beginning and working forward */
3593 	pIn = pData + numpix + numpix / 4;
3594 	pOut = pData + numpix +numpix / 2;
3595 	for (j = 0; j <= frame->height - 2; j += 2) {
3596 		memmove(pOut, pIn, w/2);
3597 		memmove(pOut + w/2, pIn, w/2);
3598 		pIn += w/2;
3599 		pOut += w;
3600 	}
3601 
3602 	/* Convert U, starting from end and working backward */
3603 	pIn = pData + numpix + numpix / 4;
3604 	pOut = pData + numpix + numpix / 2;
3605 	for (j = 0; j <= frame->height - 2; j += 2) {
3606 		pIn -= w/2;
3607 		pOut -= w;
3608 		memmove(pOut, pIn, w/2);
3609 		memmove(pOut + w/2, pIn, w/2);
3610 	}
3611 }
3612 
3613 /* Fuses even and odd fields together, and doubles width.
3614  * INPUT: an odd field followed by an even field at pIn0, in YUV planar format
3615  * OUTPUT: a normal YUV planar image, with correct aspect ratio
3616  */
3617 static void
deinterlace(struct ov511_frame * frame,int rawformat,unsigned char * pIn0,unsigned char * pOut0)3618 deinterlace(struct ov511_frame *frame, int rawformat,
3619             unsigned char *pIn0, unsigned char *pOut0)
3620 {
3621 	const int fieldheight = frame->rawheight / 2;
3622 	const int fieldpix = fieldheight * frame->rawwidth;
3623 	const int w = frame->width;
3624 	int x, y;
3625 	unsigned char *pInEven, *pInOdd, *pOut;
3626 
3627 	PDEBUG(5, "fieldheight=%d", fieldheight);
3628 
3629 	if (frame->rawheight != frame->height) {
3630 		err("invalid height");
3631 		return;
3632 	}
3633 
3634 	if ((frame->rawwidth * 2) != frame->width) {
3635 		err("invalid width");
3636 		return;
3637 	}
3638 
3639 	/* Y */
3640 	pInOdd = pIn0;
3641 	pInEven = pInOdd + fieldpix;
3642 	pOut = pOut0;
3643 	for (y = 0; y < fieldheight; y++) {
3644 		for (x = 0; x < frame->rawwidth; x++) {
3645 			*pOut = *pInEven;
3646 			*(pOut+1) = *pInEven++;
3647 			*(pOut+w) = *pInOdd;
3648 			*(pOut+w+1) = *pInOdd++;
3649 			pOut += 2;
3650 		}
3651 		pOut += w;
3652 	}
3653 
3654 	if (rawformat == RAWFMT_YUV420) {
3655 	/* U */
3656 		pInOdd = pIn0 + fieldpix * 2;
3657 		pInEven = pInOdd + fieldpix / 4;
3658 		for (y = 0; y < fieldheight / 2; y++) {
3659 			for (x = 0; x < frame->rawwidth / 2; x++) {
3660 				*pOut = *pInEven;
3661 				*(pOut+1) = *pInEven++;
3662 				*(pOut+w/2) = *pInOdd;
3663 				*(pOut+w/2+1) = *pInOdd++;
3664 				pOut += 2;
3665 			}
3666 			pOut += w/2;
3667 		}
3668 	/* V */
3669 		pInOdd = pIn0 + fieldpix * 2 + fieldpix / 2;
3670 		pInEven = pInOdd + fieldpix / 4;
3671 		for (y = 0; y < fieldheight / 2; y++) {
3672 			for (x = 0; x < frame->rawwidth / 2; x++) {
3673 				*pOut = *pInEven;
3674 				*(pOut+1) = *pInEven++;
3675 				*(pOut+w/2) = *pInOdd;
3676 				*(pOut+w/2+1) = *pInOdd++;
3677 				pOut += 2;
3678 			}
3679 			pOut += w/2;
3680 		}
3681 	}
3682 }
3683 
3684 static void
ov51x_postprocess_grey(struct usb_ov511 * ov,struct ov511_frame * frame)3685 ov51x_postprocess_grey(struct usb_ov511 *ov, struct ov511_frame *frame)
3686 {
3687 		/* Deinterlace frame, if necessary */
3688 		if (ov->sensor == SEN_SAA7111A && frame->rawheight >= 480) {
3689 			if (frame->compressed)
3690 				decompress(ov, frame, frame->rawdata,
3691 						 frame->tempdata);
3692 			else
3693 				yuv400raw_to_yuv400p(frame, frame->rawdata,
3694 						     frame->tempdata);
3695 
3696 			deinterlace(frame, RAWFMT_YUV400, frame->tempdata,
3697 			            frame->data);
3698 		} else {
3699 			if (frame->compressed)
3700 				decompress(ov, frame, frame->rawdata,
3701 						 frame->data);
3702 			else
3703 				yuv400raw_to_yuv400p(frame, frame->rawdata,
3704 						     frame->data);
3705 		}
3706 }
3707 
3708 /* Process raw YUV420 data into the format requested by the app. Conversion
3709  * between V4L formats is allowed.
3710  */
3711 static void
ov51x_postprocess_yuv420(struct usb_ov511 * ov,struct ov511_frame * frame)3712 ov51x_postprocess_yuv420(struct usb_ov511 *ov, struct ov511_frame *frame)
3713 {
3714 	/* Process frame->rawdata to frame->tempdata */
3715 	if (frame->compressed)
3716 		decompress(ov, frame, frame->rawdata, frame->tempdata);
3717 	else
3718 		yuv420raw_to_yuv420p(frame, frame->rawdata, frame->tempdata);
3719 
3720 	/* Deinterlace frame, if necessary */
3721 	if (ov->sensor == SEN_SAA7111A && frame->rawheight >= 480) {
3722 		memcpy(frame->rawdata, frame->tempdata,
3723 			MAX_RAW_DATA_SIZE(frame->width, frame->height));
3724 		deinterlace(frame, RAWFMT_YUV420, frame->rawdata,
3725 		            frame->tempdata);
3726 	}
3727 
3728 	/* Frame should be (width x height) and not (rawwidth x rawheight) at
3729          * this point. */
3730 
3731 	/* Process frame->tempdata to frame->data */
3732 	switch (frame->format) {
3733 	case VIDEO_PALETTE_RGB565:
3734 		yuv420p_to_rgb(frame, frame->tempdata, frame->data, 16);
3735 		break;
3736 	case VIDEO_PALETTE_RGB24:
3737 		yuv420p_to_rgb(frame, frame->tempdata, frame->data, 24);
3738 		break;
3739 	case VIDEO_PALETTE_YUV422:
3740 	case VIDEO_PALETTE_YUYV:
3741 		yuv420p_to_yuv422(frame, frame->tempdata, frame->data);
3742 		break;
3743 	case VIDEO_PALETTE_YUV420:
3744 	case VIDEO_PALETTE_YUV420P:
3745 		memcpy(frame->data, frame->tempdata,
3746 			MAX_RAW_DATA_SIZE(frame->width, frame->height));
3747 		break;
3748 	case VIDEO_PALETTE_YUV422P:
3749 		/* Data is converted in place, so copy it in advance */
3750 		memcpy(frame->data, frame->tempdata,
3751 			MAX_RAW_DATA_SIZE(frame->width, frame->height));
3752 
3753 		yuv420p_to_yuv422p(frame, frame->data);
3754 		break;
3755 	default:
3756 		err("Cannot convert YUV420 to %s",
3757 		    symbolic(v4l1_plist, frame->format));
3758 	}
3759 
3760 	if (fix_rgb_offset)
3761 		fixFrameRGBoffset(frame);
3762 }
3763 
3764 /* Post-processes the specified frame. This consists of:
3765  * 	1. Decompress frame, if necessary
3766  *	2. Deinterlace frame and scale to proper size, if necessary
3767  * 	3. Convert from YUV planar to destination format, if necessary
3768  * 	4. Fix the RGB offset, if necessary
3769  */
3770 static void
ov51x_postprocess(struct usb_ov511 * ov,struct ov511_frame * frame)3771 ov51x_postprocess(struct usb_ov511 *ov, struct ov511_frame *frame)
3772 {
3773 	if (dumppix) {
3774 		memset(frame->data, 0,
3775 			MAX_DATA_SIZE(ov->maxwidth, ov->maxheight));
3776 		PDEBUG(4, "Dumping %d bytes", frame->bytes_recvd);
3777 		memcpy(frame->data, frame->rawdata, frame->bytes_recvd);
3778 	} else {
3779 		switch (frame->format) {
3780 		case VIDEO_PALETTE_GREY:
3781 			ov51x_postprocess_grey(ov, frame);
3782 			break;
3783 		case VIDEO_PALETTE_YUV420:
3784 		case VIDEO_PALETTE_YUV420P:
3785 		case VIDEO_PALETTE_RGB565:
3786 		case VIDEO_PALETTE_RGB24:
3787 		case VIDEO_PALETTE_YUV422:
3788 		case VIDEO_PALETTE_YUYV:
3789 		case VIDEO_PALETTE_YUV422P:
3790 			ov51x_postprocess_yuv420(ov, frame);
3791 			break;
3792 		default:
3793 			err("Cannot convert data to %s",
3794 			    symbolic(v4l1_plist, frame->format));
3795 		}
3796 	}
3797 }
3798 
3799 /**********************************************************************
3800  *
3801  * OV51x data transfer, IRQ handler
3802  *
3803  **********************************************************************/
3804 
3805 static inline void
ov511_move_data(struct usb_ov511 * ov,unsigned char * in,int n)3806 ov511_move_data(struct usb_ov511 *ov, unsigned char *in, int n)
3807 {
3808 	int num, offset;
3809 	int pnum = in[ov->packet_size - 1];		/* Get packet number */
3810 	int max_raw = MAX_RAW_DATA_SIZE(ov->maxwidth, ov->maxheight);
3811 	struct ov511_frame *frame = &ov->frame[ov->curframe];
3812 	struct timeval *ts;
3813 
3814 	/* SOF/EOF packets have 1st to 8th bytes zeroed and the 9th
3815 	 * byte non-zero. The EOF packet has image width/height in the
3816 	 * 10th and 11th bytes. The 9th byte is given as follows:
3817 	 *
3818 	 * bit 7: EOF
3819 	 *     6: compression enabled
3820 	 *     5: 422/420/400 modes
3821 	 *     4: 422/420/400 modes
3822 	 *     3: 1
3823 	 *     2: snapshot button on
3824 	 *     1: snapshot frame
3825 	 *     0: even/odd field
3826 	 */
3827 
3828 	if (printph) {
3829 		info("ph(%3d): %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x",
3830 		     pnum, in[0], in[1], in[2], in[3], in[4], in[5], in[6],
3831 		     in[7], in[8], in[9], in[10], in[11]);
3832 	}
3833 
3834 	/* Check for SOF/EOF packet */
3835 	if ((in[0] | in[1] | in[2] | in[3] | in[4] | in[5] | in[6] | in[7]) ||
3836 	    (~in[8] & 0x08))
3837 		goto check_middle;
3838 
3839 	/* Frame end */
3840 	if (in[8] & 0x80) {
3841 		ts = (struct timeval *)(frame->data
3842 		      + MAX_FRAME_SIZE(ov->maxwidth, ov->maxheight));
3843 		do_gettimeofday(ts);
3844 
3845 		/* Get the actual frame size from the EOF header */
3846 		frame->rawwidth = ((int)(in[9]) + 1) * 8;
3847 		frame->rawheight = ((int)(in[10]) + 1) * 8;
3848 
3849  		PDEBUG(4, "Frame end, frame=%d, pnum=%d, w=%d, h=%d, recvd=%d",
3850 			ov->curframe, pnum, frame->rawwidth, frame->rawheight,
3851 			frame->bytes_recvd);
3852 
3853 		/* Validate the header data */
3854 		RESTRICT_TO_RANGE(frame->rawwidth, ov->minwidth, ov->maxwidth);
3855 		RESTRICT_TO_RANGE(frame->rawheight, ov->minheight,
3856 				  ov->maxheight);
3857 
3858 		/* Don't allow byte count to exceed buffer size */
3859 		RESTRICT_TO_RANGE(frame->bytes_recvd, 8, max_raw);
3860 
3861 		if (frame->scanstate == STATE_LINES) {
3862 	    		int nextf;
3863 
3864 			frame->grabstate = FRAME_DONE;	// FIXME: Is this right?
3865 
3866 			if (waitqueue_active(&frame->wq)) {
3867 				frame->grabstate = FRAME_DONE;
3868 				wake_up_interruptible(&frame->wq);
3869 			}
3870 
3871 			/* If next frame is ready or grabbing,
3872 			 * point to it */
3873 			nextf = (ov->curframe + 1) % OV511_NUMFRAMES;
3874 			if (ov->frame[nextf].grabstate == FRAME_READY
3875 			    || ov->frame[nextf].grabstate == FRAME_GRABBING) {
3876 				ov->curframe = nextf;
3877 				ov->frame[nextf].scanstate = STATE_SCANNING;
3878 			} else {
3879 				if (frame->grabstate == FRAME_DONE) {
3880 					PDEBUG(4, "** Frame done **");
3881 				} else {
3882 					PDEBUG(4, "Frame not ready? state = %d",
3883 						ov->frame[nextf].grabstate);
3884 				}
3885 
3886 				ov->curframe = -1;
3887 			}
3888 		} else {
3889 			PDEBUG(5, "Frame done, but not scanning");
3890 		}
3891 		/* Image corruption caused by misplaced frame->segment = 0
3892 		 * fixed by carlosf@conectiva.com.br
3893 		 */
3894 	} else {
3895 		/* Frame start */
3896 		PDEBUG(4, "Frame start, framenum = %d", ov->curframe);
3897 
3898 		/* Check to see if it's a snapshot frame */
3899 		/* FIXME?? Should the snapshot reset go here? Performance? */
3900 		if (in[8] & 0x02) {
3901 			frame->snapshot = 1;
3902 			PDEBUG(3, "snapshot detected");
3903 		}
3904 
3905 		frame->scanstate = STATE_LINES;
3906 		frame->bytes_recvd = 0;
3907 		frame->compressed = in[8] & 0x40;
3908 	}
3909 
3910 check_middle:
3911 	/* Are we in a frame? */
3912 	if (frame->scanstate != STATE_LINES) {
3913 		PDEBUG(5, "Not in a frame; packet skipped");
3914 		return;
3915 	}
3916 
3917 	/* If frame start, skip header */
3918 	if (frame->bytes_recvd == 0)
3919 		offset = 9;
3920 	else
3921 		offset = 0;
3922 
3923 	num = n - offset - 1;
3924 
3925 	/* Dump all data exactly as received */
3926 	if (dumppix == 2) {
3927 		frame->bytes_recvd += n - 1;
3928 		if (frame->bytes_recvd <= max_raw)
3929 			memcpy(frame->rawdata + frame->bytes_recvd - (n - 1),
3930 				in, n - 1);
3931 		else
3932 			PDEBUG(3, "Raw data buffer overrun!! (%d)",
3933 				frame->bytes_recvd - max_raw);
3934 	} else if (!frame->compressed && !remove_zeros) {
3935 		frame->bytes_recvd += num;
3936 		if (frame->bytes_recvd <= max_raw)
3937 			memcpy(frame->rawdata + frame->bytes_recvd - num,
3938 				in + offset, num);
3939 		else
3940 			PDEBUG(3, "Raw data buffer overrun!! (%d)",
3941 				frame->bytes_recvd - max_raw);
3942 	} else { /* Remove all-zero FIFO lines (aligned 32-byte blocks) */
3943 		int b, read = 0, allzero, copied = 0;
3944 		if (offset) {
3945 			frame->bytes_recvd += 32 - offset;	// Bytes out
3946 			memcpy(frame->rawdata,	in + offset, 32 - offset);
3947 			read += 32;
3948 		}
3949 
3950 		while (read < n - 1) {
3951 			allzero = 1;
3952 			for (b = 0; b < 32; b++) {
3953 				if (in[read + b]) {
3954 					allzero = 0;
3955 					break;
3956 				}
3957 			}
3958 
3959 			if (allzero) {
3960 				/* Don't copy it */
3961 			} else {
3962 				if (frame->bytes_recvd + copied + 32 <= max_raw)
3963 				{
3964 					memcpy(frame->rawdata
3965 						+ frame->bytes_recvd + copied,
3966 						in + read, 32);
3967 					copied += 32;
3968 				} else {
3969 					PDEBUG(3, "Raw data buffer overrun!!");
3970 				}
3971 			}
3972 			read += 32;
3973 		}
3974 
3975 		frame->bytes_recvd += copied;
3976 	}
3977 }
3978 
3979 static inline void
ov518_move_data(struct usb_ov511 * ov,unsigned char * in,int n)3980 ov518_move_data(struct usb_ov511 *ov, unsigned char *in, int n)
3981 {
3982 	int max_raw = MAX_RAW_DATA_SIZE(ov->maxwidth, ov->maxheight);
3983 	struct ov511_frame *frame = &ov->frame[ov->curframe];
3984 	struct timeval *ts;
3985 
3986 	/* Don't copy the packet number byte */
3987 	if (ov->packet_numbering)
3988 		--n;
3989 
3990 	/* A false positive here is likely, until OVT gives me
3991 	 * the definitive SOF/EOF format */
3992 	if ((!(in[0] | in[1] | in[2] | in[3] | in[5])) && in[6]) {
3993 		if (printph) {
3994 			info("ph: %2x %2x %2x %2x %2x %2x %2x %2x", in[0],
3995 			     in[1], in[2], in[3], in[4], in[5], in[6], in[7]);
3996 		}
3997 
3998 		if (frame->scanstate == STATE_LINES) {
3999 			PDEBUG(4, "Detected frame end/start");
4000 			goto eof;
4001 		} else { //scanstate == STATE_SCANNING
4002 			/* Frame start */
4003 			PDEBUG(4, "Frame start, framenum = %d", ov->curframe);
4004 			goto sof;
4005 		}
4006 	} else {
4007 		goto check_middle;
4008 	}
4009 
4010 eof:
4011 	ts = (struct timeval *)(frame->data
4012 	      + MAX_FRAME_SIZE(ov->maxwidth, ov->maxheight));
4013 	do_gettimeofday(ts);
4014 
4015 	PDEBUG(4, "Frame end, curframe = %d, hw=%d, vw=%d, recvd=%d",
4016 		ov->curframe,
4017 		(int)(in[9]), (int)(in[10]), frame->bytes_recvd);
4018 
4019 	// FIXME: Since we don't know the header formats yet,
4020 	// there is no way to know what the actual image size is
4021 	frame->rawwidth = frame->width;
4022 	frame->rawheight = frame->height;
4023 
4024 	/* Validate the header data */
4025 	RESTRICT_TO_RANGE(frame->rawwidth, ov->minwidth, ov->maxwidth);
4026 	RESTRICT_TO_RANGE(frame->rawheight, ov->minheight, ov->maxheight);
4027 
4028 	/* Don't allow byte count to exceed buffer size */
4029 	RESTRICT_TO_RANGE(frame->bytes_recvd, 8, max_raw);
4030 
4031 	if (frame->scanstate == STATE_LINES) {
4032     		int nextf;
4033 
4034 		frame->grabstate = FRAME_DONE;	// FIXME: Is this right?
4035 
4036 		if (waitqueue_active(&frame->wq)) {
4037 			frame->grabstate = FRAME_DONE;
4038 			wake_up_interruptible(&frame->wq);
4039 		}
4040 
4041 		/* If next frame is ready or grabbing,
4042 		 * point to it */
4043 		nextf = (ov->curframe + 1) % OV511_NUMFRAMES;
4044 		if (ov->frame[nextf].grabstate == FRAME_READY
4045 		    || ov->frame[nextf].grabstate == FRAME_GRABBING) {
4046 			ov->curframe = nextf;
4047 			ov->frame[nextf].scanstate = STATE_SCANNING;
4048 			frame = &ov->frame[nextf];
4049 		} else {
4050 			if (frame->grabstate == FRAME_DONE) {
4051 				PDEBUG(4, "** Frame done **");
4052 			} else {
4053 				PDEBUG(4, "Frame not ready? state = %d",
4054 				       ov->frame[nextf].grabstate);
4055 			}
4056 
4057 			ov->curframe = -1;
4058 			PDEBUG(4, "SOF dropped (no active frame)");
4059 			return;  /* Nowhere to store this frame */
4060 		}
4061 	}
4062 sof:
4063 	PDEBUG(4, "Starting capture on frame %d", frame->framenum);
4064 
4065 // Snapshot not reverse-engineered yet.
4066 #if 0
4067 	/* Check to see if it's a snapshot frame */
4068 	/* FIXME?? Should the snapshot reset go here? Performance? */
4069 	if (in[8] & 0x02) {
4070 		frame->snapshot = 1;
4071 		PDEBUG(3, "snapshot detected");
4072 	}
4073 #endif
4074 	frame->scanstate = STATE_LINES;
4075 	frame->bytes_recvd = 0;
4076 	frame->compressed = 1;
4077 
4078 check_middle:
4079 	/* Are we in a frame? */
4080 	if (frame->scanstate != STATE_LINES) {
4081 		PDEBUG(4, "scanstate: no SOF yet");
4082 		return;
4083 	}
4084 
4085 	/* Dump all data exactly as received */
4086 	if (dumppix == 2) {
4087 		frame->bytes_recvd += n;
4088 		if (frame->bytes_recvd <= max_raw)
4089 			memcpy(frame->rawdata + frame->bytes_recvd - n, in, n);
4090 		else
4091 			PDEBUG(3, "Raw data buffer overrun!! (%d)",
4092 				frame->bytes_recvd - max_raw);
4093 	} else {
4094 		/* All incoming data are divided into 8-byte segments. If the
4095 		 * segment contains all zero bytes, it must be skipped. These
4096 		 * zero-segments allow the OV518 to mainain a constant data rate
4097 		 * regardless of the effectiveness of the compression. Segments
4098 		 * are aligned relative to the beginning of each isochronous
4099 		 * packet. The first segment in each image is a header (the
4100 		 * decompressor skips it later).
4101 		 */
4102 
4103 		int b, read = 0, allzero, copied = 0;
4104 
4105 		while (read < n) {
4106 			allzero = 1;
4107 			for (b = 0; b < 8; b++) {
4108 				if (in[read + b]) {
4109 					allzero = 0;
4110 					break;
4111 				}
4112 			}
4113 
4114 			if (allzero) {
4115 			/* Don't copy it */
4116 			} else {
4117 				if (frame->bytes_recvd + copied + 8 <= max_raw)
4118 				{
4119 					memcpy(frame->rawdata
4120 						+ frame->bytes_recvd + copied,
4121 						in + read, 8);
4122 					copied += 8;
4123 				} else {
4124 					PDEBUG(3, "Raw data buffer overrun!!");
4125 				}
4126 			}
4127 			read += 8;
4128 		}
4129 		frame->bytes_recvd += copied;
4130 	}
4131 }
4132 
4133 static void
ov51x_isoc_irq(struct urb * urb)4134 ov51x_isoc_irq(struct urb *urb)
4135 {
4136 	int i;
4137 	struct usb_ov511 *ov;
4138 	struct ov511_sbuf *sbuf;
4139 
4140 	if (!urb->context) {
4141 		PDEBUG(4, "no context");
4142 		return;
4143 	}
4144 
4145 	sbuf = urb->context;
4146 	ov = sbuf->ov;
4147 
4148 	if (!ov || !ov->dev || !ov->user) {
4149 		PDEBUG(4, "no device, or not open");
4150 		return;
4151 	}
4152 
4153 	if (!ov->streaming) {
4154 		PDEBUG(4, "hmmm... not streaming, but got interrupt");
4155 		return;
4156 	}
4157 
4158         if (urb->status == -ENOENT || urb->status == -ECONNRESET) {
4159                 PDEBUG(4, "URB unlinked");
4160                 return;
4161         }
4162 
4163 	if (urb->status != -EINPROGRESS && urb->status != 0) {
4164 		err("ERROR: urb->status=%d: %s", urb->status,
4165 		    symbolic(urb_errlist, urb->status));
4166 	}
4167 
4168 	/* Copy the data received into our frame buffer */
4169 	PDEBUG(5, "sbuf[%d]: Moving %d packets", sbuf->n,
4170 	       urb->number_of_packets);
4171 	for (i = 0; i < urb->number_of_packets; i++) {
4172 		/* Warning: Don't call *_move_data() if no frame active! */
4173 		if (ov->curframe >= 0) {
4174 			int n = urb->iso_frame_desc[i].actual_length;
4175 			int st = urb->iso_frame_desc[i].status;
4176 			unsigned char *cdata;
4177 
4178 			urb->iso_frame_desc[i].actual_length = 0;
4179 			urb->iso_frame_desc[i].status = 0;
4180 
4181 			cdata = urb->transfer_buffer
4182 				+ urb->iso_frame_desc[i].offset;
4183 
4184 			if (!n) {
4185 				PDEBUG(4, "Zero-length packet");
4186 				continue;
4187 			}
4188 
4189 			if (st)
4190 				PDEBUG(2, "data error: [%d] len=%d, status=%d",
4191 				       i, n, st);
4192 
4193 			if (ov->bclass == BCL_OV511)
4194 				ov511_move_data(ov, cdata, n);
4195 			else if (ov->bclass == BCL_OV518)
4196 				ov518_move_data(ov, cdata, n);
4197 			else
4198 				err("Unknown bridge device (%d)", ov->bridge);
4199 
4200 		} else if (waitqueue_active(&ov->wq)) {
4201 			wake_up_interruptible(&ov->wq);
4202 		}
4203 	}
4204 
4205 	/* Resubmit this URB */
4206 	urb->dev = ov->dev;
4207 	if ((i = usb_submit_urb(urb)) != 0)
4208 		err("usb_submit_urb() ret %d", i);
4209 
4210 	return;
4211 }
4212 
4213 /****************************************************************************
4214  *
4215  * Stream initialization and termination
4216  *
4217  ***************************************************************************/
4218 
4219 static int
ov51x_init_isoc(struct usb_ov511 * ov)4220 ov51x_init_isoc(struct usb_ov511 *ov)
4221 {
4222 	struct urb *urb;
4223 	int fx, err, n, size;
4224 
4225 	PDEBUG(3, "*** Initializing capture ***");
4226 
4227 	ov->curframe = -1;
4228 
4229 	if (ov->bridge == BRG_OV511) {
4230 		if (cams == 1)				size = 993;
4231 		else if (cams == 2)			size = 513;
4232 		else if (cams == 3 || cams == 4)	size = 257;
4233 		else {
4234 			err("\"cams\" parameter too high!");
4235 			return -1;
4236 		}
4237 	} else if (ov->bridge == BRG_OV511PLUS) {
4238 		if (cams == 1)				size = 961;
4239 		else if (cams == 2)			size = 513;
4240 		else if (cams == 3 || cams == 4)	size = 257;
4241 		else if (cams >= 5 && cams <= 8)	size = 129;
4242 		else if (cams >= 9 && cams <= 31)	size = 33;
4243 		else {
4244 			err("\"cams\" parameter too high!");
4245 			return -1;
4246 		}
4247 	} else if (ov->bclass == BCL_OV518) {
4248 		if (cams == 1)				size = 896;
4249 		else if (cams == 2)			size = 512;
4250 		else if (cams == 3 || cams == 4)	size = 256;
4251 		else if (cams >= 5 && cams <= 8)	size = 128;
4252 		else {
4253 			err("\"cams\" parameter too high!");
4254 			return -1;
4255 		}
4256 	} else {
4257 		err("invalid bridge type");
4258 		return -1;
4259 	}
4260 
4261 	// FIXME: OV518 is hardcoded to 15 FPS (alternate 5) for now
4262 	if (ov->bclass == BCL_OV518) {
4263 		if (packetsize == -1) {
4264 			ov518_set_packet_size(ov, 640);
4265 		} else {
4266 			info("Forcing packet size to %d", packetsize);
4267 			ov518_set_packet_size(ov, packetsize);
4268 		}
4269 	} else {
4270 		if (packetsize == -1) {
4271 			ov511_set_packet_size(ov, size);
4272 		} else {
4273 			info("Forcing packet size to %d", packetsize);
4274 			ov511_set_packet_size(ov, packetsize);
4275 		}
4276 	}
4277 
4278 	for (n = 0; n < OV511_NUMSBUF; n++) {
4279 		urb = usb_alloc_urb(FRAMES_PER_DESC);
4280 
4281 		if (!urb) {
4282 			err("init isoc: usb_alloc_urb ret. NULL");
4283 			return -ENOMEM;
4284 		}
4285 		ov->sbuf[n].urb = urb;
4286 		urb->dev = ov->dev;
4287 		urb->context = &ov->sbuf[n];
4288 		urb->pipe = usb_rcvisocpipe(ov->dev, OV511_ENDPOINT_ADDRESS);
4289 		urb->transfer_flags = USB_ISO_ASAP;
4290 		urb->transfer_buffer = ov->sbuf[n].data;
4291 		urb->complete = ov51x_isoc_irq;
4292 		urb->number_of_packets = FRAMES_PER_DESC;
4293 		urb->transfer_buffer_length = ov->packet_size * FRAMES_PER_DESC;
4294 		urb->interval = 1;
4295 		for (fx = 0; fx < FRAMES_PER_DESC; fx++) {
4296 			urb->iso_frame_desc[fx].offset = ov->packet_size * fx;
4297 			urb->iso_frame_desc[fx].length = ov->packet_size;
4298 		}
4299 	}
4300 
4301 	ov->streaming = 1;
4302 
4303 	for (n = 0; n < OV511_NUMSBUF; n++) {
4304 		ov->sbuf[n].urb->dev = ov->dev;
4305 		err = usb_submit_urb(ov->sbuf[n].urb);
4306 		if (err) {
4307 			err("init isoc: usb_submit_urb(%d) ret %d", n, err);
4308 			return err;
4309 		}
4310 	}
4311 
4312 	return 0;
4313 }
4314 
4315 static void
ov51x_unlink_isoc(struct usb_ov511 * ov)4316 ov51x_unlink_isoc(struct usb_ov511 *ov)
4317 {
4318 	int n;
4319 
4320 	/* Unschedule all of the iso td's */
4321 	for (n = OV511_NUMSBUF - 1; n >= 0; n--) {
4322 		if (ov->sbuf[n].urb) {
4323 			usb_unlink_urb(ov->sbuf[n].urb);
4324 			usb_free_urb(ov->sbuf[n].urb);
4325 			ov->sbuf[n].urb = NULL;
4326 		}
4327 	}
4328 }
4329 
4330 static void
ov51x_stop_isoc(struct usb_ov511 * ov)4331 ov51x_stop_isoc(struct usb_ov511 *ov)
4332 {
4333 	if (!ov->streaming || !ov->dev)
4334 		return;
4335 
4336 	PDEBUG(3, "*** Stopping capture ***");
4337 
4338 	if (ov->bclass == BCL_OV518)
4339 		ov518_set_packet_size(ov, 0);
4340 	else
4341 		ov511_set_packet_size(ov, 0);
4342 
4343 	ov->streaming = 0;
4344 
4345 	ov51x_unlink_isoc(ov);
4346 }
4347 
4348 static int
ov51x_new_frame(struct usb_ov511 * ov,int framenum)4349 ov51x_new_frame(struct usb_ov511 *ov, int framenum)
4350 {
4351 	struct ov511_frame *frame;
4352 	int newnum;
4353 
4354 	PDEBUG(4, "ov->curframe = %d, framenum = %d", ov->curframe, framenum);
4355 
4356 	if (!ov->dev)
4357 		return -1;
4358 
4359 	/* If we're not grabbing a frame right now and the other frame is */
4360 	/* ready to be grabbed into, then use it instead */
4361 	if (ov->curframe == -1) {
4362 		newnum = (framenum - 1 + OV511_NUMFRAMES) % OV511_NUMFRAMES;
4363 		if (ov->frame[newnum].grabstate == FRAME_READY)
4364 			framenum = newnum;
4365 	} else
4366 		return 0;
4367 
4368 	frame = &ov->frame[framenum];
4369 
4370 	PDEBUG(4, "framenum = %d, width = %d, height = %d", framenum,
4371 	       frame->width, frame->height);
4372 
4373 	frame->grabstate = FRAME_GRABBING;
4374 	frame->scanstate = STATE_SCANNING;
4375 	frame->snapshot = 0;
4376 
4377 	ov->curframe = framenum;
4378 
4379 	/* Make sure it's not too big */
4380 	if (frame->width > ov->maxwidth)
4381 		frame->width = ov->maxwidth;
4382 
4383 	frame->width &= ~7L;		/* Multiple of 8 */
4384 
4385 	if (frame->height > ov->maxheight)
4386 		frame->height = ov->maxheight;
4387 
4388 	frame->height &= ~3L;		/* Multiple of 4 */
4389 
4390 	return 0;
4391 }
4392 
4393 /****************************************************************************
4394  *
4395  * Buffer management
4396  *
4397  ***************************************************************************/
4398 
4399 /*
4400  * - You must acquire buf_lock before entering this function.
4401  * - Because this code will free any non-null pointer, you must be sure to null
4402  *   them if you explicitly free them somewhere else!
4403  */
4404 static void
ov51x_do_dealloc(struct usb_ov511 * ov)4405 ov51x_do_dealloc(struct usb_ov511 *ov)
4406 {
4407 	int i;
4408 	PDEBUG(4, "entered");
4409 
4410 	if (ov->fbuf) {
4411 		rvfree(ov->fbuf, OV511_NUMFRAMES
4412 		       * MAX_DATA_SIZE(ov->maxwidth, ov->maxheight));
4413 		ov->fbuf = NULL;
4414 	}
4415 
4416 	if (ov->rawfbuf) {
4417 		vfree(ov->rawfbuf);
4418 		ov->rawfbuf = NULL;
4419 	}
4420 
4421 	if (ov->tempfbuf) {
4422 		vfree(ov->tempfbuf);
4423 		ov->tempfbuf = NULL;
4424 	}
4425 
4426 	for (i = 0; i < OV511_NUMSBUF; i++) {
4427 		if (ov->sbuf[i].data) {
4428 			kfree(ov->sbuf[i].data);
4429 			ov->sbuf[i].data = NULL;
4430 		}
4431 	}
4432 
4433 	for (i = 0; i < OV511_NUMFRAMES; i++) {
4434 		ov->frame[i].data = NULL;
4435 		ov->frame[i].rawdata = NULL;
4436 		ov->frame[i].tempdata = NULL;
4437 		if (ov->frame[i].compbuf) {
4438 			free_page((unsigned long) ov->frame[i].compbuf);
4439 			ov->frame[i].compbuf = NULL;
4440 		}
4441 	}
4442 
4443 	PDEBUG(4, "buffer memory deallocated");
4444 	ov->buf_state = BUF_NOT_ALLOCATED;
4445 	PDEBUG(4, "leaving");
4446 }
4447 
4448 static int
ov51x_alloc(struct usb_ov511 * ov)4449 ov51x_alloc(struct usb_ov511 *ov)
4450 {
4451 	int i;
4452 	const int w = ov->maxwidth;
4453 	const int h = ov->maxheight;
4454 	const int data_bufsize = OV511_NUMFRAMES * MAX_DATA_SIZE(w, h);
4455 	const int raw_bufsize = OV511_NUMFRAMES * MAX_RAW_DATA_SIZE(w, h);
4456 
4457 	PDEBUG(4, "entered");
4458 	down(&ov->buf_lock);
4459 
4460 	if (ov->buf_state == BUF_ALLOCATED)
4461 		goto out;
4462 
4463 	ov->fbuf = rvmalloc(data_bufsize);
4464 	if (!ov->fbuf)
4465 		goto error;
4466 
4467 	ov->rawfbuf = vmalloc(raw_bufsize);
4468 	if (!ov->rawfbuf)
4469 		goto error;
4470 
4471 	memset(ov->rawfbuf, 0, raw_bufsize);
4472 
4473 	ov->tempfbuf = vmalloc(raw_bufsize);
4474 	if (!ov->tempfbuf)
4475 		goto error;
4476 
4477 	memset(ov->tempfbuf, 0, raw_bufsize);
4478 
4479 	for (i = 0; i < OV511_NUMSBUF; i++) {
4480 		ov->sbuf[i].data = kmalloc(FRAMES_PER_DESC *
4481 			MAX_FRAME_SIZE_PER_DESC, GFP_KERNEL);
4482 		if (!ov->sbuf[i].data)
4483 			goto error;
4484 
4485 		PDEBUG(4, "sbuf[%d] @ %p", i, ov->sbuf[i].data);
4486 	}
4487 
4488 	for (i = 0; i < OV511_NUMFRAMES; i++) {
4489 		ov->frame[i].data = ov->fbuf + i * MAX_DATA_SIZE(w, h);
4490 		ov->frame[i].rawdata = ov->rawfbuf
4491 		 + i * MAX_RAW_DATA_SIZE(w, h);
4492 		ov->frame[i].tempdata = ov->tempfbuf
4493 		 + i * MAX_RAW_DATA_SIZE(w, h);
4494 
4495 		ov->frame[i].compbuf =
4496 		 (unsigned char *) __get_free_page(GFP_KERNEL);
4497 		if (!ov->frame[i].compbuf)
4498 			goto error;
4499 
4500 		PDEBUG(4, "frame[%d] @ %p", i, ov->frame[i].data);
4501 	}
4502 
4503 	ov->buf_state = BUF_ALLOCATED;
4504 out:
4505 	up(&ov->buf_lock);
4506 	PDEBUG(4, "leaving");
4507 	return 0;
4508 error:
4509 	ov51x_do_dealloc(ov);
4510 	up(&ov->buf_lock);
4511 	PDEBUG(4, "errored");
4512 	return -ENOMEM;
4513 }
4514 
4515 static void
ov51x_dealloc(struct usb_ov511 * ov,int now)4516 ov51x_dealloc(struct usb_ov511 *ov, int now)
4517 {
4518 	PDEBUG(4, "entered");
4519 	down(&ov->buf_lock);
4520 	ov51x_do_dealloc(ov);
4521 	up(&ov->buf_lock);
4522 	PDEBUG(4, "leaving");
4523 }
4524 
4525 /****************************************************************************
4526  *
4527  * V4L 1 API
4528  *
4529  ***************************************************************************/
4530 
4531 static int
ov51x_v4l1_open(struct inode * inode,struct file * file)4532 ov51x_v4l1_open(struct inode *inode, struct file *file)
4533 {
4534 	struct video_device *vdev = video_devdata(file);
4535 	struct usb_ov511 *ov = vdev->priv;
4536 	int err, i;
4537 
4538 	PDEBUG(4, "opening");
4539 
4540 	down(&ov->lock);
4541 
4542 	err = -EBUSY;
4543 	if (ov->user)
4544 		goto out;
4545 
4546 	err = ov51x_alloc(ov);
4547 	if (err < 0)
4548 		goto out;
4549 
4550 	ov->sub_flag = 0;
4551 
4552 	/* In case app doesn't set them... */
4553 	err = ov51x_set_default_params(ov);
4554 	if (err < 0)
4555 		goto out;
4556 
4557 	/* Make sure frames are reset */
4558 	for (i = 0; i < OV511_NUMFRAMES; i++) {
4559 		ov->frame[i].grabstate = FRAME_UNUSED;
4560 		ov->frame[i].bytes_read = 0;
4561 	}
4562 
4563 	/* If compression is on, make sure now that a
4564 	 * decompressor can be loaded */
4565 	if (ov->compress && !ov->decomp_ops) {
4566 		err = request_decompressor(ov);
4567 		if (err && !dumppix)
4568 			goto out;
4569 	}
4570 
4571 	err = ov51x_init_isoc(ov);
4572 	if (err) {
4573 		ov51x_dealloc(ov, 0);
4574 		goto out;
4575 	}
4576 
4577 	ov->user++;
4578 	file->private_data = vdev;
4579 
4580 	if (ov->led_policy == LED_AUTO)
4581 		ov51x_led_control(ov, 1);
4582 
4583 out:
4584 	up(&ov->lock);
4585 	return err;
4586 }
4587 
4588 static int
ov51x_v4l1_close(struct inode * inode,struct file * file)4589 ov51x_v4l1_close(struct inode *inode, struct file *file)
4590 {
4591 	struct video_device *vdev = file->private_data;
4592 	struct usb_ov511 *ov = vdev->priv;
4593 
4594 	PDEBUG(4, "ov511_close");
4595 
4596 	down(&ov->lock);
4597 
4598 	ov->user--;
4599 	ov51x_stop_isoc(ov);
4600 
4601 	release_decompressor(ov);
4602 
4603 	if (ov->led_policy == LED_AUTO)
4604 		ov51x_led_control(ov, 0);
4605 
4606 	if (ov->dev)
4607 		ov51x_dealloc(ov, 0);
4608 
4609 	up(&ov->lock);
4610 
4611 	/* Device unplugged while open. Only a minimum of unregistration is done
4612 	 * here; the disconnect callback already did the rest. */
4613 	if (!ov->dev) {
4614 		down(&ov->cbuf_lock);
4615 		kfree(ov->cbuf);
4616 		ov->cbuf = NULL;
4617 		up(&ov->cbuf_lock);
4618 
4619 		ov51x_dealloc(ov, 1);
4620 		kfree(ov);
4621 		ov = NULL;
4622 	}
4623 
4624 	file->private_data = NULL;
4625 	return 0;
4626 }
4627 
4628 /* Do not call this function directly! */
4629 static int
ov51x_v4l1_ioctl_internal(struct inode * inode,struct file * file,unsigned int cmd,void * arg)4630 ov51x_v4l1_ioctl_internal(struct inode *inode, struct file *file,
4631 			  unsigned int cmd, void *arg)
4632 {
4633 	struct video_device *vdev = file->private_data;
4634 	struct usb_ov511 *ov = vdev->priv;
4635 
4636 	PDEBUG(5, "IOCtl: 0x%X", cmd);
4637 
4638 	if (!ov->dev)
4639 		return -EIO;
4640 
4641 	switch (cmd) {
4642 	case VIDIOCGCAP:
4643 	{
4644 		struct video_capability *b = arg;
4645 
4646 		PDEBUG(4, "VIDIOCGCAP");
4647 
4648 		memset(b, 0, sizeof(struct video_capability));
4649 		sprintf(b->name, "%s USB Camera",
4650 			symbolic(brglist, ov->bridge));
4651 		b->type = VID_TYPE_CAPTURE | VID_TYPE_SUBCAPTURE;
4652 		b->channels = ov->num_inputs;
4653 		b->audios = 0;
4654 		b->maxwidth = ov->maxwidth;
4655 		b->maxheight = ov->maxheight;
4656 		b->minwidth = ov->minwidth;
4657 		b->minheight = ov->minheight;
4658 
4659 		return 0;
4660 	}
4661 	case VIDIOCGCHAN:
4662 	{
4663 		struct video_channel *v = arg;
4664 
4665 		PDEBUG(4, "VIDIOCGCHAN");
4666 
4667 		if ((unsigned)(v->channel) >= ov->num_inputs) {
4668 			err("Invalid channel (%d)", v->channel);
4669 			return -EINVAL;
4670 		}
4671 
4672 		v->norm = ov->norm;
4673 		v->type = VIDEO_TYPE_CAMERA;
4674 		v->flags = 0;
4675 //		v->flags |= (ov->has_decoder) ? VIDEO_VC_NORM : 0;
4676 		v->tuners = 0;
4677 		decoder_get_input_name(ov, v->channel, v->name);
4678 
4679 		return 0;
4680 	}
4681 	case VIDIOCSCHAN:
4682 	{
4683 		struct video_channel *v = arg;
4684 		int err;
4685 
4686 		PDEBUG(4, "VIDIOCSCHAN");
4687 
4688 		/* Make sure it's not a camera */
4689 		if (!ov->has_decoder) {
4690 			if (v->channel == 0)
4691 				return 0;
4692 			else
4693 				return -EINVAL;
4694 		}
4695 
4696 		if (v->norm != VIDEO_MODE_PAL &&
4697 		    v->norm != VIDEO_MODE_NTSC &&
4698 		    v->norm != VIDEO_MODE_SECAM &&
4699 		    v->norm != VIDEO_MODE_AUTO) {
4700 			err("Invalid norm (%d)", v->norm);
4701 			return -EINVAL;
4702 		}
4703 
4704 		if ((unsigned)(v->channel) >= ov->num_inputs) {
4705 			err("Invalid channel (%d)", v->channel);
4706 			return -EINVAL;
4707 		}
4708 
4709 		err = decoder_set_input(ov, v->channel);
4710 		if (err)
4711 			return err;
4712 
4713 		err = decoder_set_norm(ov, v->norm);
4714 		if (err)
4715 			return err;
4716 
4717 		return 0;
4718 	}
4719 	case VIDIOCGPICT:
4720 	{
4721 		struct video_picture *p = arg;
4722 
4723 		PDEBUG(4, "VIDIOCGPICT");
4724 
4725 		memset(p, 0, sizeof(struct video_picture));
4726 		if (sensor_get_picture(ov, p))
4727 			return -EIO;
4728 
4729 		/* Can we get these from frame[0]? -claudio? */
4730 		p->depth = ov->frame[0].depth;
4731 		p->palette = ov->frame[0].format;
4732 
4733 		return 0;
4734 	}
4735 	case VIDIOCSPICT:
4736 	{
4737 		struct video_picture *p = arg;
4738 		int i;
4739 
4740 		PDEBUG(4, "VIDIOCSPICT");
4741 
4742 		if (!get_depth(p->palette))
4743 			return -EINVAL;
4744 
4745 		if (sensor_set_picture(ov, p))
4746 			return -EIO;
4747 
4748 		if (force_palette && p->palette != force_palette) {
4749 			info("Palette rejected (%s)",
4750 			     symbolic(v4l1_plist, p->palette));
4751 			return -EINVAL;
4752 		}
4753 
4754 		// FIXME: Format should be independent of frames
4755 		if (p->palette != ov->frame[0].format) {
4756 			PDEBUG(4, "Detected format change");
4757 
4758 			/* If we're collecting previous frame wait
4759 			   before changing modes */
4760 			interruptible_sleep_on(&ov->wq);
4761 			if (signal_pending(current)) return -EINTR;
4762 
4763 			mode_init_regs(ov, ov->frame[0].width,
4764 				ov->frame[0].height, p->palette, ov->sub_flag);
4765 		}
4766 
4767 		PDEBUG(4, "Setting depth=%d, palette=%s",
4768 		       p->depth, symbolic(v4l1_plist, p->palette));
4769 
4770 		for (i = 0; i < OV511_NUMFRAMES; i++) {
4771 			ov->frame[i].depth = p->depth;
4772 			ov->frame[i].format = p->palette;
4773 		}
4774 
4775 		return 0;
4776 	}
4777 	case VIDIOCGCAPTURE:
4778 	{
4779 		int *vf = arg;
4780 
4781 		PDEBUG(4, "VIDIOCGCAPTURE");
4782 
4783 		ov->sub_flag = *vf;
4784 		return 0;
4785 	}
4786 	case VIDIOCSCAPTURE:
4787 	{
4788 		struct video_capture *vc = arg;
4789 
4790 		PDEBUG(4, "VIDIOCSCAPTURE");
4791 
4792 		if (vc->flags)
4793 			return -EINVAL;
4794 		if (vc->decimation)
4795 			return -EINVAL;
4796 
4797 		vc->x &= ~3L;
4798 		vc->y &= ~1L;
4799 		vc->y &= ~31L;
4800 
4801 		if (vc->width == 0)
4802 			vc->width = 32;
4803 
4804 		vc->height /= 16;
4805 		vc->height *= 16;
4806 		if (vc->height == 0)
4807 			vc->height = 16;
4808 
4809 		ov->subx = vc->x;
4810 		ov->suby = vc->y;
4811 		ov->subw = vc->width;
4812 		ov->subh = vc->height;
4813 
4814 		return 0;
4815 	}
4816 	case VIDIOCSWIN:
4817 	{
4818 		struct video_window *vw = arg;
4819 		int i, result;
4820 
4821 		PDEBUG(4, "VIDIOCSWIN: %dx%d", vw->width, vw->height);
4822 
4823 #if 0
4824 		if (vw->flags)
4825 			return -EINVAL;
4826 		if (vw->clipcount)
4827 			return -EINVAL;
4828 		if (vw->height != ov->maxheight)
4829 			return -EINVAL;
4830 		if (vw->width != ov->maxwidth)
4831 			return -EINVAL;
4832 #endif
4833 
4834 		/* If we're collecting previous frame wait
4835 		   before changing modes */
4836 		interruptible_sleep_on(&ov->wq);
4837 		if (signal_pending(current)) return -EINTR;
4838 
4839 		result = mode_init_regs(ov, vw->width, vw->height,
4840 			ov->frame[0].format, ov->sub_flag);
4841 		if (result < 0)
4842 			return result;
4843 
4844 		for (i = 0; i < OV511_NUMFRAMES; i++) {
4845 			ov->frame[i].width = vw->width;
4846 			ov->frame[i].height = vw->height;
4847 		}
4848 
4849 		return 0;
4850 	}
4851 	case VIDIOCGWIN:
4852 	{
4853 		struct video_window *vw = arg;
4854 
4855 		memset(vw, 0, sizeof(struct video_window));
4856 		vw->x = 0;		/* FIXME */
4857 		vw->y = 0;
4858 		vw->width = ov->frame[0].width;
4859 		vw->height = ov->frame[0].height;
4860 		vw->flags = 30;
4861 
4862 		PDEBUG(4, "VIDIOCGWIN: %dx%d", vw->width, vw->height);
4863 
4864 		return 0;
4865 	}
4866 	case VIDIOCGMBUF:
4867 	{
4868 		struct video_mbuf *vm = arg;
4869 		int i;
4870 
4871 		PDEBUG(4, "VIDIOCGMBUF");
4872 
4873 		memset(vm, 0, sizeof(struct video_mbuf));
4874 		vm->size = OV511_NUMFRAMES
4875 			   * MAX_DATA_SIZE(ov->maxwidth, ov->maxheight);
4876 		vm->frames = OV511_NUMFRAMES;
4877 
4878 		vm->offsets[0] = 0;
4879 		for (i = 1; i < OV511_NUMFRAMES; i++) {
4880 			vm->offsets[i] = vm->offsets[i-1]
4881 			   + MAX_DATA_SIZE(ov->maxwidth, ov->maxheight);
4882 		}
4883 
4884 		return 0;
4885 	}
4886 	case VIDIOCMCAPTURE:
4887 	{
4888 		struct video_mmap *vm = arg;
4889 		int ret, depth;
4890 		unsigned int f = vm->frame;
4891 
4892 		PDEBUG(4, "VIDIOCMCAPTURE: frame: %d, %dx%d, %s", f, vm->width,
4893 			vm->height, symbolic(v4l1_plist, vm->format));
4894 
4895 		depth = get_depth(vm->format);
4896 		if (!depth) {
4897 			PDEBUG(2, "VIDIOCMCAPTURE: invalid format (%s)",
4898 			       symbolic(v4l1_plist, vm->format));
4899 			return -EINVAL;
4900 		}
4901 
4902 		if (f >= OV511_NUMFRAMES) {
4903 			err("VIDIOCMCAPTURE: invalid frame (%d)", f);
4904 			return -EINVAL;
4905 		}
4906 
4907 		if (vm->width > ov->maxwidth
4908 		    || vm->height > ov->maxheight) {
4909 			err("VIDIOCMCAPTURE: requested dimensions too big");
4910 			return -EINVAL;
4911 		}
4912 
4913 		if (ov->frame[f].grabstate == FRAME_GRABBING) {
4914 			PDEBUG(4, "VIDIOCMCAPTURE: already grabbing");
4915 			return -EBUSY;
4916 		}
4917 
4918 		if (force_palette && (vm->format != force_palette)) {
4919 			PDEBUG(2, "palette rejected (%s)",
4920 			       symbolic(v4l1_plist, vm->format));
4921 			return -EINVAL;
4922 		}
4923 
4924 		if ((ov->frame[f].width != vm->width) ||
4925 		    (ov->frame[f].height != vm->height) ||
4926 		    (ov->frame[f].format != vm->format) ||
4927 		    (ov->frame[f].sub_flag != ov->sub_flag) ||
4928 		    (ov->frame[f].depth != depth)) {
4929 			PDEBUG(4, "VIDIOCMCAPTURE: change in image parameters");
4930 
4931 			/* If we're collecting previous frame wait
4932 			   before changing modes */
4933 			interruptible_sleep_on(&ov->wq);
4934 			if (signal_pending(current)) return -EINTR;
4935 			ret = mode_init_regs(ov, vm->width, vm->height,
4936 				vm->format, ov->sub_flag);
4937 #if 0
4938 			if (ret < 0) {
4939 				PDEBUG(1, "Got error while initializing regs ");
4940 				return ret;
4941 			}
4942 #endif
4943 			ov->frame[f].width = vm->width;
4944 			ov->frame[f].height = vm->height;
4945 			ov->frame[f].format = vm->format;
4946 			ov->frame[f].sub_flag = ov->sub_flag;
4947 			ov->frame[f].depth = depth;
4948 		}
4949 
4950 		/* Mark it as ready */
4951 		ov->frame[f].grabstate = FRAME_READY;
4952 
4953 		PDEBUG(4, "VIDIOCMCAPTURE: renewing frame %d", f);
4954 
4955 		return ov51x_new_frame(ov, f);
4956 	}
4957 	case VIDIOCSYNC:
4958 	{
4959 		unsigned int fnum = *((unsigned int *) arg);
4960 		struct ov511_frame *frame;
4961 		int rc;
4962 
4963 		if (fnum >= OV511_NUMFRAMES) {
4964 			err("VIDIOCSYNC: invalid frame (%d)", fnum);
4965 			return -EINVAL;
4966 		}
4967 
4968 		frame = &ov->frame[fnum];
4969 
4970 		PDEBUG(4, "syncing to frame %d, grabstate = %d", fnum,
4971 		       frame->grabstate);
4972 
4973 		switch (frame->grabstate) {
4974 		case FRAME_UNUSED:
4975 			return -EINVAL;
4976 		case FRAME_READY:
4977 		case FRAME_GRABBING:
4978 		case FRAME_ERROR:
4979 redo:
4980 			if (!ov->dev)
4981 				return -EIO;
4982 
4983 			rc = wait_event_interruptible(frame->wq,
4984 			    (frame->grabstate == FRAME_DONE)
4985 			    || (frame->grabstate == FRAME_ERROR));
4986 
4987 			if (rc)
4988 				return rc;
4989 
4990 			if (frame->grabstate == FRAME_ERROR) {
4991 				int ret;
4992 
4993 				if ((ret = ov51x_new_frame(ov, fnum)) < 0)
4994 					return ret;
4995 				goto redo;
4996 			}
4997 			/* Fall through */
4998 		case FRAME_DONE:
4999 			if (ov->snap_enabled && !frame->snapshot) {
5000 				int ret;
5001 				if ((ret = ov51x_new_frame(ov, fnum)) < 0)
5002 					return ret;
5003 				goto redo;
5004 			}
5005 
5006 			frame->grabstate = FRAME_UNUSED;
5007 
5008 			/* Reset the hardware snapshot button */
5009 			/* FIXME - Is this the best place for this? */
5010 			if ((ov->snap_enabled) && (frame->snapshot)) {
5011 				frame->snapshot = 0;
5012 				ov51x_clear_snapshot(ov);
5013 			}
5014 
5015 			/* Decompression, format conversion, etc... */
5016 			ov51x_postprocess(ov, frame);
5017 
5018 			break;
5019 		} /* end switch */
5020 
5021 		return 0;
5022 	}
5023 	case VIDIOCGFBUF:
5024 	{
5025 		struct video_buffer *vb = arg;
5026 
5027 		PDEBUG(4, "VIDIOCGFBUF");
5028 
5029 		memset(vb, 0, sizeof(struct video_buffer));
5030 
5031 		return 0;
5032 	}
5033 	case VIDIOCGUNIT:
5034 	{
5035 		struct video_unit *vu = arg;
5036 
5037 		PDEBUG(4, "VIDIOCGUNIT");
5038 
5039 		memset(vu, 0, sizeof(struct video_unit));
5040 
5041 		vu->video = ov->vdev.minor;
5042 		vu->vbi = VIDEO_NO_UNIT;
5043 		vu->radio = VIDEO_NO_UNIT;
5044 		vu->audio = VIDEO_NO_UNIT;
5045 		vu->teletext = VIDEO_NO_UNIT;
5046 
5047 		return 0;
5048 	}
5049 	case OV511IOC_WI2C:
5050 	{
5051 		struct ov511_i2c_struct *w = arg;
5052 
5053 		return i2c_w_slave(ov, w->slave, w->reg, w->value, w->mask);
5054 	}
5055 	case OV511IOC_RI2C:
5056 	{
5057 		struct ov511_i2c_struct *r = arg;
5058 		int rc;
5059 
5060 		rc = i2c_r_slave(ov, r->slave, r->reg);
5061 		if (rc < 0)
5062 			return rc;
5063 
5064 		r->value = rc;
5065 		return 0;
5066 	}
5067 	default:
5068 		PDEBUG(3, "Unsupported IOCtl: 0x%X", cmd);
5069 		return -ENOIOCTLCMD;
5070 	} /* end switch */
5071 
5072 	return 0;
5073 }
5074 
5075 static int
ov51x_v4l1_ioctl(struct inode * inode,struct file * file,unsigned int cmd,unsigned long arg)5076 ov51x_v4l1_ioctl(struct inode *inode, struct file *file,
5077 		 unsigned int cmd, unsigned long arg)
5078 {
5079 	struct video_device *vdev = file->private_data;
5080 	struct usb_ov511 *ov = vdev->priv;
5081 	int rc;
5082 
5083 	if (down_interruptible(&ov->lock))
5084 		return -EINTR;
5085 
5086 	rc = video_usercopy(inode, file, cmd, arg, ov51x_v4l1_ioctl_internal);
5087 
5088 	up(&ov->lock);
5089 	return rc;
5090 }
5091 
5092 static int
ov51x_v4l1_read(struct file * file,char * buf,size_t cnt,loff_t * ppos)5093 ov51x_v4l1_read(struct file *file, char *buf, size_t cnt, loff_t *ppos)
5094 {
5095 	struct video_device *vdev = file->private_data;
5096 	int noblock = file->f_flags&O_NONBLOCK;
5097 	unsigned long count = cnt;
5098 	struct usb_ov511 *ov = vdev->priv;
5099 	int i, rc = 0, frmx = -1;
5100 	struct ov511_frame *frame;
5101 
5102 	if (down_interruptible(&ov->lock))
5103 		return -EINTR;
5104 
5105 	PDEBUG(4, "%ld bytes, noblock=%d", count, noblock);
5106 
5107 	if (!vdev || !buf) {
5108 		rc = -EFAULT;
5109 		goto error;
5110 	}
5111 
5112 	if (!ov->dev) {
5113 		rc = -EIO;
5114 		goto error;
5115 	}
5116 
5117 // FIXME: Only supports two frames
5118 	/* See if a frame is completed, then use it. */
5119 	if (ov->frame[0].grabstate >= FRAME_DONE)	/* _DONE or _ERROR */
5120 		frmx = 0;
5121 	else if (ov->frame[1].grabstate >= FRAME_DONE)/* _DONE or _ERROR */
5122 		frmx = 1;
5123 
5124 	/* If nonblocking we return immediately */
5125 	if (noblock && (frmx == -1)) {
5126 		rc = -EAGAIN;
5127 		goto error;
5128 	}
5129 
5130 	/* If no FRAME_DONE, look for a FRAME_GRABBING state. */
5131 	/* See if a frame is in process (grabbing), then use it. */
5132 	if (frmx == -1) {
5133 		if (ov->frame[0].grabstate == FRAME_GRABBING)
5134 			frmx = 0;
5135 		else if (ov->frame[1].grabstate == FRAME_GRABBING)
5136 			frmx = 1;
5137 	}
5138 
5139 	/* If no frame is active, start one. */
5140 	if (frmx == -1) {
5141 		if ((rc = ov51x_new_frame(ov, frmx = 0))) {
5142 			err("read: ov51x_new_frame error");
5143 			goto error;
5144 		}
5145 	}
5146 
5147 	frame = &ov->frame[frmx];
5148 
5149 restart:
5150 	if (!ov->dev) {
5151 		rc = -EIO;
5152 		goto error;
5153 	}
5154 
5155 	/* Wait while we're grabbing the image */
5156 	PDEBUG(4, "Waiting image grabbing");
5157 	rc = wait_event_interruptible(frame->wq,
5158 		(frame->grabstate == FRAME_DONE)
5159 		|| (frame->grabstate == FRAME_ERROR));
5160 
5161 	if (rc)
5162 		goto error;
5163 
5164 	PDEBUG(4, "Got image, frame->grabstate = %d", frame->grabstate);
5165 	PDEBUG(4, "bytes_recvd = %d", frame->bytes_recvd);
5166 
5167 	if (frame->grabstate == FRAME_ERROR) {
5168 		frame->bytes_read = 0;
5169 		err("** ick! ** Errored frame %d", ov->curframe);
5170 		if (ov51x_new_frame(ov, frmx)) {
5171 			err("read: ov51x_new_frame error");
5172 			goto error;
5173 		}
5174 		goto restart;
5175 	}
5176 
5177 
5178 	/* Repeat until we get a snapshot frame */
5179 	if (ov->snap_enabled)
5180 		PDEBUG(4, "Waiting snapshot frame");
5181 	if (ov->snap_enabled && !frame->snapshot) {
5182 		frame->bytes_read = 0;
5183 		if ((rc = ov51x_new_frame(ov, frmx))) {
5184 			err("read: ov51x_new_frame error");
5185 			goto error;
5186 		}
5187 		goto restart;
5188 	}
5189 
5190 	/* Clear the snapshot */
5191 	if (ov->snap_enabled && frame->snapshot) {
5192 		frame->snapshot = 0;
5193 		ov51x_clear_snapshot(ov);
5194 	}
5195 
5196 	/* Decompression, format conversion, etc... */
5197 	ov51x_postprocess(ov, frame);
5198 
5199 	PDEBUG(4, "frmx=%d, bytes_read=%ld, length=%ld", frmx,
5200 		frame->bytes_read,
5201 		get_frame_length(frame));
5202 
5203 	/* copy bytes to user space; we allow for partials reads */
5204 //	if ((count + frame->bytes_read)
5205 //	    > get_frame_length((struct ov511_frame *)frame))
5206 //		count = frame->scanlength - frame->bytes_read;
5207 
5208 	/* FIXME - count hardwired to be one frame... */
5209 	count = get_frame_length(frame);
5210 
5211 	PDEBUG(4, "Copy to user space: %ld bytes", count);
5212 	if ((i = copy_to_user(buf, frame->data + frame->bytes_read, count))) {
5213 		PDEBUG(4, "Copy failed! %d bytes not copied", i);
5214 		rc = -EFAULT;
5215 		goto error;
5216 	}
5217 
5218 	frame->bytes_read += count;
5219 	PDEBUG(4, "{copy} count used=%ld, new bytes_read=%ld",
5220 		count, frame->bytes_read);
5221 
5222 	/* If all data have been read... */
5223 	if (frame->bytes_read
5224 	    >= get_frame_length(frame)) {
5225 		frame->bytes_read = 0;
5226 
5227 // FIXME: Only supports two frames
5228 		/* Mark it as available to be used again. */
5229 		ov->frame[frmx].grabstate = FRAME_UNUSED;
5230 		if ((rc = ov51x_new_frame(ov, !frmx))) {
5231 			err("ov51x_new_frame returned error");
5232 			goto error;
5233 		}
5234 	}
5235 
5236 	PDEBUG(4, "read finished, returning %ld (sweet)", count);
5237 
5238 	up(&ov->lock);
5239 	return count;
5240 
5241 error:
5242 	up(&ov->lock);
5243 	return rc;
5244 }
5245 
5246 static int
ov51x_v4l1_mmap(struct file * file,struct vm_area_struct * vma)5247 ov51x_v4l1_mmap(struct file *file, struct vm_area_struct *vma)
5248 {
5249 	struct video_device *vdev = file->private_data;
5250 	unsigned long start = vma->vm_start;
5251 	unsigned long size  = vma->vm_end - vma->vm_start;
5252 	struct usb_ov511 *ov = vdev->priv;
5253 	unsigned long page, pos;
5254 
5255 	if (ov->dev == NULL)
5256 		return -EIO;
5257 
5258 	PDEBUG(4, "mmap: %ld (%lX) bytes", size, size);
5259 
5260 	if (size > (((OV511_NUMFRAMES
5261 	              * MAX_DATA_SIZE(ov->maxwidth, ov->maxheight)
5262 	              + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))))
5263 		return -EINVAL;
5264 
5265 	if (down_interruptible(&ov->lock))
5266 		return -EINTR;
5267 
5268 	pos = (unsigned long)ov->fbuf;
5269 	while (size > 0) {
5270 		page = kvirt_to_pa(pos);
5271 		if (remap_page_range(start, page, PAGE_SIZE, PAGE_SHARED)) {
5272 			up(&ov->lock);
5273 			return -EAGAIN;
5274 		}
5275 		start += PAGE_SIZE;
5276 		pos += PAGE_SIZE;
5277 		if (size > PAGE_SIZE)
5278 			size -= PAGE_SIZE;
5279 		else
5280 			size = 0;
5281 	}
5282 
5283 	up(&ov->lock);
5284 	return 0;
5285 }
5286 
5287 static struct file_operations ov511_fops = {
5288 	.owner =	THIS_MODULE,
5289 	.open =		ov51x_v4l1_open,
5290 	.release =	ov51x_v4l1_close,
5291 	.read =		ov51x_v4l1_read,
5292 	.mmap =		ov51x_v4l1_mmap,
5293 	.ioctl =	ov51x_v4l1_ioctl,
5294 	.llseek =	no_llseek,
5295 };
5296 
5297 static struct video_device vdev_template = {
5298 	.owner =	THIS_MODULE,
5299 	.name =		"OV511 USB Camera",
5300 	.type =		VID_TYPE_CAPTURE,
5301 	.hardware =	VID_HARDWARE_OV511,
5302 	.fops =		&ov511_fops,
5303 };
5304 
5305 #if defined(CONFIG_PROC_FS) && defined(CONFIG_VIDEO_PROC_FS)
5306 static int
ov51x_control_ioctl(struct inode * inode,struct file * file,unsigned int cmd,unsigned long ularg)5307 ov51x_control_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
5308 		    unsigned long ularg)
5309 {
5310 	struct proc_dir_entry *pde = inode->u.generic_ip;
5311 	struct usb_ov511 *ov;
5312 	void *arg = (void *) ularg;
5313 	int rc;
5314 
5315 	if (!pde)
5316 		return -ENOENT;
5317 
5318 	ov = pde->data;
5319 	if (!ov)
5320 		return -ENODEV;
5321 
5322 	if (!ov->dev)
5323 		return -EIO;
5324 
5325 	/* Should we pass through standard V4L IOCTLs? */
5326 
5327 	switch (cmd) {
5328 	case OV511IOC_GINTVER:
5329 	{
5330 		int ver = OV511_INTERFACE_VER;
5331 
5332 		PDEBUG(4, "Get interface version: %d", ver);
5333 		if (copy_to_user(arg, &ver, sizeof(ver)))
5334 			return -EFAULT;
5335 
5336 		return 0;
5337 	}
5338 	case OV511IOC_GUSHORT:
5339 	{
5340 		struct ov511_ushort_opt opt;
5341 
5342 		if (copy_from_user(&opt, arg, sizeof(opt)))
5343 			return -EFAULT;
5344 
5345 		switch (opt.optnum) {
5346 		case OV511_USOPT_BRIGHT:
5347 			rc = sensor_get_brightness(ov, &(opt.val));
5348 			if (rc)	return rc;
5349 			break;
5350 		case OV511_USOPT_SAT:
5351 			rc = sensor_get_saturation(ov, &(opt.val));
5352 			if (rc)	return rc;
5353 			break;
5354 		case OV511_USOPT_HUE:
5355 			rc = sensor_get_hue(ov, &(opt.val));
5356 			if (rc)	return rc;
5357 			break;
5358 		case OV511_USOPT_CONTRAST:
5359 			rc = sensor_get_contrast(ov, &(opt.val));
5360 			if (rc)	return rc;
5361 			break;
5362 		default:
5363 			err("Invalid get short option number");
5364 			return -EINVAL;
5365 		}
5366 
5367 		if (copy_to_user(arg, &opt, sizeof(opt)))
5368 			return -EFAULT;
5369 
5370 		return 0;
5371 	}
5372 	case OV511IOC_SUSHORT:
5373 	{
5374 		struct ov511_ushort_opt opt;
5375 
5376 		if (copy_from_user(&opt, arg, sizeof(opt)))
5377 			return -EFAULT;
5378 
5379 		switch (opt.optnum) {
5380 		case OV511_USOPT_BRIGHT:
5381 			rc = sensor_set_brightness(ov, opt.val);
5382 			if (rc)	return rc;
5383 			break;
5384 		case OV511_USOPT_SAT:
5385 			rc = sensor_set_saturation(ov, opt.val);
5386 			if (rc)	return rc;
5387 			break;
5388 		case OV511_USOPT_HUE:
5389 			rc = sensor_set_hue(ov, opt.val);
5390 			if (rc)	return rc;
5391 			break;
5392 		case OV511_USOPT_CONTRAST:
5393 			rc = sensor_set_contrast(ov, opt.val);
5394 			if (rc)	return rc;
5395 			break;
5396 		default:
5397 			err("Invalid set short option number");
5398 			return -EINVAL;
5399 		}
5400 
5401 		return 0;
5402 	}
5403 	case OV511IOC_GUINT:
5404 	{
5405 		struct ov511_uint_opt opt;
5406 
5407 		if (copy_from_user(&opt, arg, sizeof(opt)))
5408 			return -EFAULT;
5409 
5410 		switch (opt.optnum) {
5411 		case OV511_UIOPT_POWER_FREQ:
5412 			opt.val = ov->lightfreq;
5413 			break;
5414 		case OV511_UIOPT_BFILTER:
5415 			opt.val = ov->bandfilt;
5416 			break;
5417 		case OV511_UIOPT_LED:
5418 			opt.val = ov->led_policy;
5419 			break;
5420 		case OV511_UIOPT_DEBUG:
5421 			opt.val = debug;
5422 			break;
5423 		case OV511_UIOPT_COMPRESS:
5424 			opt.val = ov->compress;
5425 			break;
5426 		default:
5427 			err("Invalid get int option number");
5428 			return -EINVAL;
5429 		}
5430 
5431 		if (copy_to_user(arg, &opt, sizeof(opt)))
5432 			return -EFAULT;
5433 
5434 		return 0;
5435 	}
5436 	case OV511IOC_SUINT:
5437 	{
5438 		struct ov511_uint_opt opt;
5439 
5440 		if (copy_from_user(&opt, arg, sizeof(opt)))
5441 			return -EFAULT;
5442 
5443 		switch (opt.optnum) {
5444 		case OV511_UIOPT_POWER_FREQ:
5445 			rc = sensor_set_light_freq(ov, opt.val);
5446 			if (rc)	return rc;
5447 			break;
5448 		case OV511_UIOPT_BFILTER:
5449 			rc = sensor_set_banding_filter(ov, opt.val);
5450 			if (rc)	return rc;
5451 			break;
5452 		case OV511_UIOPT_LED:
5453 			if (opt.val <= 2) {
5454 				ov->led_policy = opt.val;
5455 				if (ov->led_policy == LED_OFF)
5456 					ov51x_led_control(ov, 0);
5457 				else if (ov->led_policy == LED_ON)
5458 					ov51x_led_control(ov, 1);
5459 			} else {
5460 				return -EINVAL;
5461 			}
5462 			break;
5463 		case OV511_UIOPT_DEBUG:
5464 			if (opt.val <= 5)
5465 				debug = opt.val;
5466 			else
5467 				return -EINVAL;
5468 			break;
5469 		case OV511_UIOPT_COMPRESS:
5470 			ov->compress = opt.val;
5471 			if (ov->compress) {
5472 				if (ov->bclass == BCL_OV511)
5473 					ov511_init_compression(ov);
5474 				else if (ov->bclass == BCL_OV518)
5475 					ov518_init_compression(ov);
5476 			}
5477 			break;
5478 		default:
5479 			err("Invalid get int option number");
5480 			return -EINVAL;
5481 		}
5482 
5483 		return 0;
5484 	}
5485 	case OV511IOC_WI2C:
5486 	{
5487 		struct ov511_i2c_struct w;
5488 
5489 		if (copy_from_user(&w, arg, sizeof(w)))
5490 			return -EFAULT;
5491 
5492 		return i2c_w_slave(ov, w.slave, w.reg, w.value,	w.mask);
5493 	}
5494 	case OV511IOC_RI2C:
5495 	{
5496 		struct ov511_i2c_struct r;
5497 
5498 		if (copy_from_user(&r, arg, sizeof(r)))
5499 			return -EFAULT;
5500 
5501 		rc = i2c_r_slave(ov, r.slave, r.reg);
5502 		if (rc < 0)
5503 			return rc;
5504 
5505 		r.value = rc;
5506 
5507 		if (copy_to_user(arg, &r, sizeof(r)))
5508 			return -EFAULT;
5509 
5510 		return 0;
5511 	}
5512 	default:
5513 		return -EINVAL;
5514 	} /* end switch */
5515 
5516 	return 0;
5517 }
5518 #endif
5519 
5520 /****************************************************************************
5521  *
5522  * OV511 and sensor configuration
5523  *
5524  ***************************************************************************/
5525 
5526 /* This initializes the OV7610, OV7620, or OV76BE sensor. The OV76BE uses
5527  * the same register settings as the OV7610, since they are very similar.
5528  */
5529 static int
ov7xx0_configure(struct usb_ov511 * ov)5530 ov7xx0_configure(struct usb_ov511 *ov)
5531 {
5532 	int i, success;
5533 	int rc;
5534 
5535 	/* Lawrence Glaister <lg@jfm.bc.ca> reports:
5536 	 *
5537 	 * Register 0x0f in the 7610 has the following effects:
5538 	 *
5539 	 * 0x85 (AEC method 1): Best overall, good contrast range
5540 	 * 0x45 (AEC method 2): Very overexposed
5541 	 * 0xa5 (spec sheet default): Ok, but the black level is
5542 	 *	shifted resulting in loss of contrast
5543 	 * 0x05 (old driver setting): very overexposed, too much
5544 	 *	contrast
5545 	 */
5546 	static struct ov511_regvals aRegvalsNorm7610[] = {
5547 		{ OV511_I2C_BUS, 0x10, 0xff },
5548 		{ OV511_I2C_BUS, 0x16, 0x06 },
5549 		{ OV511_I2C_BUS, 0x28, 0x24 },
5550 		{ OV511_I2C_BUS, 0x2b, 0xac },
5551 		{ OV511_I2C_BUS, 0x12, 0x00 },
5552 		{ OV511_I2C_BUS, 0x38, 0x81 },
5553 		{ OV511_I2C_BUS, 0x28, 0x24 },	/* 0c */
5554 		{ OV511_I2C_BUS, 0x0f, 0x85 },	/* lg's setting */
5555 		{ OV511_I2C_BUS, 0x15, 0x01 },
5556 		{ OV511_I2C_BUS, 0x20, 0x1c },
5557 		{ OV511_I2C_BUS, 0x23, 0x2a },
5558 		{ OV511_I2C_BUS, 0x24, 0x10 },
5559 		{ OV511_I2C_BUS, 0x25, 0x8a },
5560 		{ OV511_I2C_BUS, 0x26, 0xa2 },
5561 		{ OV511_I2C_BUS, 0x27, 0xc2 },
5562 		{ OV511_I2C_BUS, 0x2a, 0x04 },
5563 		{ OV511_I2C_BUS, 0x2c, 0xfe },
5564 		{ OV511_I2C_BUS, 0x2d, 0x93 },
5565 		{ OV511_I2C_BUS, 0x30, 0x71 },
5566 		{ OV511_I2C_BUS, 0x31, 0x60 },
5567 		{ OV511_I2C_BUS, 0x32, 0x26 },
5568 		{ OV511_I2C_BUS, 0x33, 0x20 },
5569 		{ OV511_I2C_BUS, 0x34, 0x48 },
5570 		{ OV511_I2C_BUS, 0x12, 0x24 },
5571 		{ OV511_I2C_BUS, 0x11, 0x01 },
5572 		{ OV511_I2C_BUS, 0x0c, 0x24 },
5573 		{ OV511_I2C_BUS, 0x0d, 0x24 },
5574 		{ OV511_DONE_BUS, 0x0, 0x00 },
5575 	};
5576 
5577 	static struct ov511_regvals aRegvalsNorm7620[] = {
5578 		{ OV511_I2C_BUS, 0x00, 0x00 },
5579 		{ OV511_I2C_BUS, 0x01, 0x80 },
5580 		{ OV511_I2C_BUS, 0x02, 0x80 },
5581 		{ OV511_I2C_BUS, 0x03, 0xc0 },
5582 		{ OV511_I2C_BUS, 0x06, 0x60 },
5583 		{ OV511_I2C_BUS, 0x07, 0x00 },
5584 		{ OV511_I2C_BUS, 0x0c, 0x24 },
5585 		{ OV511_I2C_BUS, 0x0c, 0x24 },
5586 		{ OV511_I2C_BUS, 0x0d, 0x24 },
5587 		{ OV511_I2C_BUS, 0x11, 0x01 },
5588 		{ OV511_I2C_BUS, 0x12, 0x24 },
5589 		{ OV511_I2C_BUS, 0x13, 0x01 },
5590 		{ OV511_I2C_BUS, 0x14, 0x84 },
5591 		{ OV511_I2C_BUS, 0x15, 0x01 },
5592 		{ OV511_I2C_BUS, 0x16, 0x03 },
5593 		{ OV511_I2C_BUS, 0x17, 0x2f },
5594 		{ OV511_I2C_BUS, 0x18, 0xcf },
5595 		{ OV511_I2C_BUS, 0x19, 0x06 },
5596 		{ OV511_I2C_BUS, 0x1a, 0xf5 },
5597 		{ OV511_I2C_BUS, 0x1b, 0x00 },
5598 		{ OV511_I2C_BUS, 0x20, 0x18 },
5599 		{ OV511_I2C_BUS, 0x21, 0x80 },
5600 		{ OV511_I2C_BUS, 0x22, 0x80 },
5601 		{ OV511_I2C_BUS, 0x23, 0x00 },
5602 		{ OV511_I2C_BUS, 0x26, 0xa2 },
5603 		{ OV511_I2C_BUS, 0x27, 0xea },
5604 		{ OV511_I2C_BUS, 0x28, 0x20 },
5605 		{ OV511_I2C_BUS, 0x29, 0x00 },
5606 		{ OV511_I2C_BUS, 0x2a, 0x10 },
5607 		{ OV511_I2C_BUS, 0x2b, 0x00 },
5608 		{ OV511_I2C_BUS, 0x2c, 0x88 },
5609 		{ OV511_I2C_BUS, 0x2d, 0x91 },
5610 		{ OV511_I2C_BUS, 0x2e, 0x80 },
5611 		{ OV511_I2C_BUS, 0x2f, 0x44 },
5612 		{ OV511_I2C_BUS, 0x60, 0x27 },
5613 		{ OV511_I2C_BUS, 0x61, 0x02 },
5614 		{ OV511_I2C_BUS, 0x62, 0x5f },
5615 		{ OV511_I2C_BUS, 0x63, 0xd5 },
5616 		{ OV511_I2C_BUS, 0x64, 0x57 },
5617 		{ OV511_I2C_BUS, 0x65, 0x83 },
5618 		{ OV511_I2C_BUS, 0x66, 0x55 },
5619 		{ OV511_I2C_BUS, 0x67, 0x92 },
5620 		{ OV511_I2C_BUS, 0x68, 0xcf },
5621 		{ OV511_I2C_BUS, 0x69, 0x76 },
5622 		{ OV511_I2C_BUS, 0x6a, 0x22 },
5623 		{ OV511_I2C_BUS, 0x6b, 0x00 },
5624 		{ OV511_I2C_BUS, 0x6c, 0x02 },
5625 		{ OV511_I2C_BUS, 0x6d, 0x44 },
5626 		{ OV511_I2C_BUS, 0x6e, 0x80 },
5627 		{ OV511_I2C_BUS, 0x6f, 0x1d },
5628 		{ OV511_I2C_BUS, 0x70, 0x8b },
5629 		{ OV511_I2C_BUS, 0x71, 0x00 },
5630 		{ OV511_I2C_BUS, 0x72, 0x14 },
5631 		{ OV511_I2C_BUS, 0x73, 0x54 },
5632 		{ OV511_I2C_BUS, 0x74, 0x00 },
5633 		{ OV511_I2C_BUS, 0x75, 0x8e },
5634 		{ OV511_I2C_BUS, 0x76, 0x00 },
5635 		{ OV511_I2C_BUS, 0x77, 0xff },
5636 		{ OV511_I2C_BUS, 0x78, 0x80 },
5637 		{ OV511_I2C_BUS, 0x79, 0x80 },
5638 		{ OV511_I2C_BUS, 0x7a, 0x80 },
5639 		{ OV511_I2C_BUS, 0x7b, 0xe2 },
5640 		{ OV511_I2C_BUS, 0x7c, 0x00 },
5641 		{ OV511_DONE_BUS, 0x0, 0x00 },
5642 	};
5643 
5644 	PDEBUG(4, "starting configuration");
5645 
5646 	/* This looks redundant, but is necessary for WebCam 3 */
5647 	ov->primary_i2c_slave = OV7xx0_SID;
5648 	if (ov51x_set_slave_ids(ov, OV7xx0_SID) < 0)
5649 		return -1;
5650 
5651 	if (init_ov_sensor(ov) >= 0) {
5652 		PDEBUG(1, "OV7xx0 sensor initalized (method 1)");
5653 	} else {
5654 		/* Reset the 76xx */
5655 		if (i2c_w(ov, 0x12, 0x80) < 0) return -1;
5656 
5657 		/* Wait for it to initialize */
5658 		schedule_timeout(1 + 150 * HZ / 1000);
5659 
5660 		i = 0;
5661 		success = 0;
5662 		while (i <= i2c_detect_tries) {
5663 			if ((i2c_r(ov, OV7610_REG_ID_HIGH) == 0x7F) &&
5664 			    (i2c_r(ov, OV7610_REG_ID_LOW) == 0xA2)) {
5665 				success = 1;
5666 				break;
5667 			} else {
5668 				i++;
5669 			}
5670 		}
5671 
5672 // Was (i == i2c_detect_tries) previously. This obviously used to always report
5673 // success. Whether anyone actually depended on that bug is unknown
5674 		if ((i >= i2c_detect_tries) && (success == 0)) {
5675 			err("Failed to read sensor ID. You might not have an");
5676 			err("OV7610/20, or it may be not responding. Report");
5677 			err("this to " EMAIL);
5678 			err("This is only a warning. You can attempt to use");
5679 			err("your camera anyway");
5680 // Only issue a warning for now
5681 //			return -1;
5682 		} else {
5683 			PDEBUG(1, "OV7xx0 initialized (method 2, %dx)", i+1);
5684 		}
5685 	}
5686 
5687 	/* Detect sensor (sub)type */
5688 	rc = i2c_r(ov, OV7610_REG_COM_I);
5689 
5690 	if (rc < 0) {
5691 		err("Error detecting sensor type");
5692 		return -1;
5693 	} else if ((rc & 3) == 3) {
5694 		info("Sensor is an OV7610");
5695 		ov->sensor = SEN_OV7610;
5696 	} else if ((rc & 3) == 1) {
5697 		/* I don't know what's different about the 76BE yet. */
5698 		if (i2c_r(ov, 0x15) & 1)
5699 			info("Sensor is an OV7620AE");
5700 		else
5701 			info("Sensor is an OV76BE");
5702 
5703 		/* OV511+ will return all zero isoc data unless we
5704 		 * configure the sensor as a 7620. Someone needs to
5705 		 * find the exact reg. setting that causes this. */
5706 		if (ov->bridge == BRG_OV511PLUS) {
5707 			info("Enabling 511+/7620AE workaround");
5708 			ov->sensor = SEN_OV7620;
5709 		} else {
5710 			ov->sensor = SEN_OV76BE;
5711 		}
5712 	} else if ((rc & 3) == 0) {
5713 		info("Sensor is an OV7620");
5714 		ov->sensor = SEN_OV7620;
5715 	} else {
5716 		err("Unknown image sensor version: %d", rc & 3);
5717 		return -1;
5718 	}
5719 
5720 	if (ov->sensor == SEN_OV7620) {
5721 		PDEBUG(4, "Writing 7620 registers");
5722 		if (write_regvals(ov, aRegvalsNorm7620))
5723 			return -1;
5724 	} else {
5725 		PDEBUG(4, "Writing 7610 registers");
5726 		if (write_regvals(ov, aRegvalsNorm7610))
5727 			return -1;
5728 	}
5729 
5730 	/* Set sensor-specific vars */
5731 	ov->maxwidth = 640;
5732 	ov->maxheight = 480;
5733 	ov->minwidth = 64;
5734 	ov->minheight = 48;
5735 
5736 	// FIXME: These do not match the actual settings yet
5737 	ov->brightness = 0x80 << 8;
5738 	ov->contrast = 0x80 << 8;
5739 	ov->colour = 0x80 << 8;
5740 	ov->hue = 0x80 << 8;
5741 
5742 	return 0;
5743 }
5744 
5745 /* This initializes the OV6620, OV6630, OV6630AE, or OV6630AF sensor. */
5746 static int
ov6xx0_configure(struct usb_ov511 * ov)5747 ov6xx0_configure(struct usb_ov511 *ov)
5748 {
5749 	int rc;
5750 
5751 	static struct ov511_regvals aRegvalsNorm6x20[] = {
5752 		{ OV511_I2C_BUS, 0x12, 0x80 }, /* reset */
5753 		{ OV511_I2C_BUS, 0x11, 0x01 },
5754 		{ OV511_I2C_BUS, 0x03, 0x60 },
5755 		{ OV511_I2C_BUS, 0x05, 0x7f }, /* For when autoadjust is off */
5756 		{ OV511_I2C_BUS, 0x07, 0xa8 },
5757 		/* The ratio of 0x0c and 0x0d  controls the white point */
5758 		{ OV511_I2C_BUS, 0x0c, 0x24 },
5759 		{ OV511_I2C_BUS, 0x0d, 0x24 },
5760 		{ OV511_I2C_BUS, 0x0f, 0x15 }, /* COMS */
5761 		{ OV511_I2C_BUS, 0x10, 0x75 }, /* AEC Exposure time */
5762 		{ OV511_I2C_BUS, 0x12, 0x24 }, /* Enable AGC */
5763 		{ OV511_I2C_BUS, 0x14, 0x04 },
5764 		/* 0x16: 0x06 helps frame stability with moving objects */
5765 		{ OV511_I2C_BUS, 0x16, 0x06 },
5766 //		{ OV511_I2C_BUS, 0x20, 0x30 }, /* Aperture correction enable */
5767 		{ OV511_I2C_BUS, 0x26, 0xb2 }, /* BLC enable */
5768 		/* 0x28: 0x05 Selects RGB format if RGB on */
5769 		{ OV511_I2C_BUS, 0x28, 0x05 },
5770 		{ OV511_I2C_BUS, 0x2a, 0x04 }, /* Disable framerate adjust */
5771 //		{ OV511_I2C_BUS, 0x2b, 0xac }, /* Framerate; Set 2a[7] first */
5772 		{ OV511_I2C_BUS, 0x2d, 0x99 },
5773 		{ OV511_I2C_BUS, 0x33, 0xa0 }, /* Color Procesing Parameter */
5774 		{ OV511_I2C_BUS, 0x34, 0xd2 }, /* Max A/D range */
5775 		{ OV511_I2C_BUS, 0x38, 0x8b },
5776 		{ OV511_I2C_BUS, 0x39, 0x40 },
5777 
5778 		{ OV511_I2C_BUS, 0x3c, 0x39 }, /* Enable AEC mode changing */
5779 		{ OV511_I2C_BUS, 0x3c, 0x3c }, /* Change AEC mode */
5780 		{ OV511_I2C_BUS, 0x3c, 0x24 }, /* Disable AEC mode changing */
5781 
5782 		{ OV511_I2C_BUS, 0x3d, 0x80 },
5783 		/* These next two registers (0x4a, 0x4b) are undocumented. They
5784 		 * control the color balance */
5785 		{ OV511_I2C_BUS, 0x4a, 0x80 },
5786 		{ OV511_I2C_BUS, 0x4b, 0x80 },
5787 		{ OV511_I2C_BUS, 0x4d, 0xd2 }, /* This reduces noise a bit */
5788 		{ OV511_I2C_BUS, 0x4e, 0xc1 },
5789 		{ OV511_I2C_BUS, 0x4f, 0x04 },
5790 // Do 50-53 have any effect?
5791 // Toggle 0x12[2] off and on here?
5792 		{ OV511_DONE_BUS, 0x0, 0x00 },	/* END MARKER */
5793 	};
5794 
5795 	static struct ov511_regvals aRegvalsNorm6x30[] = {
5796 		{ OV511_I2C_BUS, 0x12, 0x80 }, /* reset */
5797 		{ OV511_I2C_BUS, 0x11, 0x00 },
5798 		{ OV511_I2C_BUS, 0x03, 0x60 },
5799 		{ OV511_I2C_BUS, 0x05, 0x7f }, /* For when autoadjust is off */
5800 		{ OV511_I2C_BUS, 0x07, 0xa8 },
5801 		/* The ratio of 0x0c and 0x0d  controls the white point */
5802 		{ OV511_I2C_BUS, 0x0c, 0x24 },
5803 		{ OV511_I2C_BUS, 0x0d, 0x24 },
5804 		{ OV511_I2C_BUS, 0x0e, 0x20 },
5805 //		{ OV511_I2C_BUS, 0x14, 0x80 },
5806 		{ OV511_I2C_BUS, 0x16, 0x03 },
5807 //		{ OV511_I2C_BUS, 0x20, 0x30 }, /* Aperture correction enable */
5808 		// 21 & 22? The suggested values look wrong. Go with default
5809 		{ OV511_I2C_BUS, 0x23, 0xc0 },
5810 		{ OV511_I2C_BUS, 0x25, 0x9a }, // Check this against default
5811 //		{ OV511_I2C_BUS, 0x26, 0xb2 }, /* BLC enable */
5812 
5813 		/* 0x28: 0x05 Selects RGB format if RGB on */
5814 //		{ OV511_I2C_BUS, 0x28, 0x05 },
5815 //		{ OV511_I2C_BUS, 0x28, 0x45 }, // DEBUG: Tristate UV bus
5816 
5817 		{ OV511_I2C_BUS, 0x2a, 0x04 }, /* Disable framerate adjust */
5818 //		{ OV511_I2C_BUS, 0x2b, 0xac }, /* Framerate; Set 2a[7] first */
5819 		{ OV511_I2C_BUS, 0x2d, 0x99 },
5820 //		{ OV511_I2C_BUS, 0x33, 0x26 }, // Reserved bits on 6620
5821 //		{ OV511_I2C_BUS, 0x34, 0x03 }, /* Max A/D range */
5822 //		{ OV511_I2C_BUS, 0x38, 0x83 },
5823 //		{ OV511_I2C_BUS, 0x39, 0xc0 }, // 6630 adds bit 7
5824 //		{ OV511_I2C_BUS, 0x3c, 0x39 }, /* Enable AEC mode changing */
5825 //		{ OV511_I2C_BUS, 0x3c, 0x3c }, /* Change AEC mode */
5826 //		{ OV511_I2C_BUS, 0x3c, 0x24 }, /* Disable AEC mode changing */
5827 		{ OV511_I2C_BUS, 0x3d, 0x80 },
5828 //		{ OV511_I2C_BUS, 0x3f, 0x0e },
5829 
5830 		/* These next two registers (0x4a, 0x4b) are undocumented. They
5831 		 * control the color balance */
5832 //		{ OV511_I2C_BUS, 0x4a, 0x80 }, // Check these
5833 //		{ OV511_I2C_BUS, 0x4b, 0x80 },
5834 		{ OV511_I2C_BUS, 0x4d, 0x10 }, /* U = 0.563u, V = 0.714v */
5835 		{ OV511_I2C_BUS, 0x4e, 0x40 },
5836 
5837 		/* UV average mode, color killer: strongest */
5838 		{ OV511_I2C_BUS, 0x4f, 0x07 },
5839 
5840 		{ OV511_I2C_BUS, 0x54, 0x23 }, /* Max AGC gain: 18dB */
5841 		{ OV511_I2C_BUS, 0x57, 0x81 }, /* (default) */
5842 		{ OV511_I2C_BUS, 0x59, 0x01 }, /* AGC dark current comp: +1 */
5843 		{ OV511_I2C_BUS, 0x5a, 0x2c }, /* (undocumented) */
5844 		{ OV511_I2C_BUS, 0x5b, 0x0f }, /* AWB chrominance levels */
5845 //		{ OV511_I2C_BUS, 0x5c, 0x10 },
5846 		{ OV511_DONE_BUS, 0x0, 0x00 },	/* END MARKER */
5847 	};
5848 
5849 	PDEBUG(4, "starting sensor configuration");
5850 
5851 	if (init_ov_sensor(ov) < 0) {
5852 		err("Failed to read sensor ID. You might not have an OV6xx0,");
5853 		err("or it may be not responding. Report this to " EMAIL);
5854 		return -1;
5855 	} else {
5856 		PDEBUG(1, "OV6xx0 sensor detected");
5857 	}
5858 
5859 	/* Detect sensor (sub)type */
5860 	rc = i2c_r(ov, OV7610_REG_COM_I);
5861 
5862 	if (rc < 0) {
5863 		err("Error detecting sensor type");
5864 		return -1;
5865 	}
5866 
5867 	if ((rc & 3) == 0) {
5868 		ov->sensor = SEN_OV6630;
5869 		info("Sensor is an OV6630");
5870 	} else if ((rc & 3) == 1) {
5871 		ov->sensor = SEN_OV6620;
5872 		info("Sensor is an OV6620");
5873 	} else if ((rc & 3) == 2) {
5874 		ov->sensor = SEN_OV6630;
5875 		info("Sensor is an OV6630AE");
5876 	} else if ((rc & 3) == 3) {
5877 		ov->sensor = SEN_OV6630;
5878 		info("Sensor is an OV6630AF");
5879 	}
5880 
5881 	/* Set sensor-specific vars */
5882 	ov->maxwidth = 352;
5883 	ov->maxheight = 288;
5884 	ov->minwidth = 64;
5885 	ov->minheight = 48;
5886 
5887 	// FIXME: These do not match the actual settings yet
5888 	ov->brightness = 0x80 << 8;
5889 	ov->contrast = 0x80 << 8;
5890 	ov->colour = 0x80 << 8;
5891 	ov->hue = 0x80 << 8;
5892 
5893 	if (ov->sensor == SEN_OV6620) {
5894 		PDEBUG(4, "Writing 6x20 registers");
5895 		if (write_regvals(ov, aRegvalsNorm6x20))
5896 			return -1;
5897 	} else {
5898 		PDEBUG(4, "Writing 6x30 registers");
5899 		if (write_regvals(ov, aRegvalsNorm6x30))
5900 			return -1;
5901 	}
5902 
5903 	return 0;
5904 }
5905 
5906 /* This initializes the KS0127 and KS0127B video decoders. */
5907 static int
ks0127_configure(struct usb_ov511 * ov)5908 ks0127_configure(struct usb_ov511 *ov)
5909 {
5910 	int rc;
5911 
5912 // FIXME: I don't know how to sync or reset it yet
5913 #if 0
5914 	if (ov51x_init_ks_sensor(ov) < 0) {
5915 		err("Failed to initialize the KS0127");
5916 		return -1;
5917 	} else {
5918 		PDEBUG(1, "KS012x(B) sensor detected");
5919 	}
5920 #endif
5921 
5922 	/* Detect decoder subtype */
5923 	rc = i2c_r(ov, 0x00);
5924 	if (rc < 0) {
5925 		err("Error detecting sensor type");
5926 		return -1;
5927 	} else if (rc & 0x08) {
5928 		rc = i2c_r(ov, 0x3d);
5929 		if (rc < 0) {
5930 			err("Error detecting sensor type");
5931 			return -1;
5932 		} else if ((rc & 0x0f) == 0) {
5933 			info("Sensor is a KS0127");
5934 			ov->sensor = SEN_KS0127;
5935 		} else if ((rc & 0x0f) == 9) {
5936 			info("Sensor is a KS0127B Rev. A");
5937 			ov->sensor = SEN_KS0127B;
5938 		}
5939 	} else {
5940 		err("Error: Sensor is an unsupported KS0122");
5941 		return -1;
5942 	}
5943 
5944 	/* Set sensor-specific vars */
5945 	ov->maxwidth = 640;
5946 	ov->maxheight = 480;
5947 	ov->minwidth = 64;
5948 	ov->minheight = 48;
5949 
5950 	// FIXME: These do not match the actual settings yet
5951 	ov->brightness = 0x80 << 8;
5952 	ov->contrast = 0x80 << 8;
5953 	ov->colour = 0x80 << 8;
5954 	ov->hue = 0x80 << 8;
5955 
5956 	/* This device is not supported yet. Bail out now... */
5957 	err("This sensor is not supported yet.");
5958 	return -1;
5959 
5960 	return 0;
5961 }
5962 
5963 /* This initializes the SAA7111A video decoder. */
5964 static int
saa7111a_configure(struct usb_ov511 * ov)5965 saa7111a_configure(struct usb_ov511 *ov)
5966 {
5967 	int rc;
5968 
5969 	/* Since there is no register reset command, all registers must be
5970 	 * written, otherwise gives erratic results */
5971 	static struct ov511_regvals aRegvalsNormSAA7111A[] = {
5972 		{ OV511_I2C_BUS, 0x06, 0xce },
5973 		{ OV511_I2C_BUS, 0x07, 0x00 },
5974 		{ OV511_I2C_BUS, 0x10, 0x44 }, /* YUV422, 240/286 lines */
5975 		{ OV511_I2C_BUS, 0x0e, 0x01 }, /* NTSC M or PAL BGHI */
5976 		{ OV511_I2C_BUS, 0x00, 0x00 },
5977 		{ OV511_I2C_BUS, 0x01, 0x00 },
5978 		{ OV511_I2C_BUS, 0x03, 0x23 },
5979 		{ OV511_I2C_BUS, 0x04, 0x00 },
5980 		{ OV511_I2C_BUS, 0x05, 0x00 },
5981 		{ OV511_I2C_BUS, 0x08, 0xc8 }, /* Auto field freq */
5982 		{ OV511_I2C_BUS, 0x09, 0x01 }, /* Chrom. trap off, APER=0.25 */
5983 		{ OV511_I2C_BUS, 0x0a, 0x80 }, /* BRIG=128 */
5984 		{ OV511_I2C_BUS, 0x0b, 0x40 }, /* CONT=1.0 */
5985 		{ OV511_I2C_BUS, 0x0c, 0x40 }, /* SATN=1.0 */
5986 		{ OV511_I2C_BUS, 0x0d, 0x00 }, /* HUE=0 */
5987 		{ OV511_I2C_BUS, 0x0f, 0x00 },
5988 		{ OV511_I2C_BUS, 0x11, 0x0c },
5989 		{ OV511_I2C_BUS, 0x12, 0x00 },
5990 		{ OV511_I2C_BUS, 0x13, 0x00 },
5991 		{ OV511_I2C_BUS, 0x14, 0x00 },
5992 		{ OV511_I2C_BUS, 0x15, 0x00 },
5993 		{ OV511_I2C_BUS, 0x16, 0x00 },
5994 		{ OV511_I2C_BUS, 0x17, 0x00 },
5995 		{ OV511_I2C_BUS, 0x02, 0xc0 },	/* Composite input 0 */
5996 		{ OV511_DONE_BUS, 0x0, 0x00 },
5997 	};
5998 
5999 // FIXME: I don't know how to sync or reset it yet
6000 #if 0
6001 	if (ov51x_init_saa_sensor(ov) < 0) {
6002 		err("Failed to initialize the SAA7111A");
6003 		return -1;
6004 	} else {
6005 		PDEBUG(1, "SAA7111A sensor detected");
6006 	}
6007 #endif
6008 
6009 	/* 640x480 not supported with PAL */
6010 	if (ov->pal) {
6011 		ov->maxwidth = 320;
6012 		ov->maxheight = 240;		/* Even field only */
6013 	} else {
6014 		ov->maxwidth = 640;
6015 		ov->maxheight = 480;		/* Even/Odd fields */
6016 	}
6017 
6018 	ov->minwidth = 320;
6019 	ov->minheight = 240;		/* Even field only */
6020 
6021 	ov->has_decoder = 1;
6022 	ov->num_inputs = 8;
6023 	ov->norm = VIDEO_MODE_AUTO;
6024 	ov->stop_during_set = 0;	/* Decoder guarantees stable image */
6025 
6026 	/* Decoder doesn't change these values, so we use these instead of
6027 	 * acutally reading the registers (which doesn't work) */
6028 	ov->brightness = 0x80 << 8;
6029 	ov->contrast = 0x40 << 9;
6030 	ov->colour = 0x40 << 9;
6031 	ov->hue = 32768;
6032 
6033 	PDEBUG(4, "Writing SAA7111A registers");
6034 	if (write_regvals(ov, aRegvalsNormSAA7111A))
6035 		return -1;
6036 
6037 	/* Detect version of decoder. This must be done after writing the
6038          * initial regs or the decoder will lock up. */
6039 	rc = i2c_r(ov, 0x00);
6040 
6041 	if (rc < 0) {
6042 		err("Error detecting sensor version");
6043 		return -1;
6044 	} else {
6045 		info("Sensor is an SAA7111A (version 0x%x)", rc);
6046 		ov->sensor = SEN_SAA7111A;
6047 	}
6048 
6049 	// FIXME: Fix this for OV518(+)
6050 	/* Latch to negative edge of clock. Otherwise, we get incorrect
6051 	 * colors and jitter in the digital signal. */
6052 	if (ov->bclass == BCL_OV511)
6053 		reg_w(ov, 0x11, 0x00);
6054 	else
6055 		warn("SAA7111A not yet supported with OV518/OV518+");
6056 
6057 	return 0;
6058 }
6059 
6060 /* This initializes the OV511/OV511+ and the sensor */
6061 static int
ov511_configure(struct usb_ov511 * ov)6062 ov511_configure(struct usb_ov511 *ov)
6063 {
6064 	static struct ov511_regvals aRegvalsInit511[] = {
6065 		{ OV511_REG_BUS, R51x_SYS_RESET,	0x7f },
6066 	 	{ OV511_REG_BUS, R51x_SYS_INIT,		0x01 },
6067 	 	{ OV511_REG_BUS, R51x_SYS_RESET,	0x7f },
6068 		{ OV511_REG_BUS, R51x_SYS_INIT,		0x01 },
6069 		{ OV511_REG_BUS, R51x_SYS_RESET,	0x3f },
6070 		{ OV511_REG_BUS, R51x_SYS_INIT,		0x01 },
6071 		{ OV511_REG_BUS, R51x_SYS_RESET,	0x3d },
6072 		{ OV511_DONE_BUS, 0x0, 0x00},
6073 	};
6074 
6075 	static struct ov511_regvals aRegvalsNorm511[] = {
6076 		{ OV511_REG_BUS, R511_DRAM_FLOW_CTL, 	0x01 },
6077 		{ OV511_REG_BUS, R51x_SYS_SNAP,		0x00 },
6078 		{ OV511_REG_BUS, R51x_SYS_SNAP,		0x02 },
6079 		{ OV511_REG_BUS, R51x_SYS_SNAP,		0x00 },
6080 		{ OV511_REG_BUS, R511_FIFO_OPTS,	0x1f },
6081 		{ OV511_REG_BUS, R511_COMP_EN,		0x00 },
6082 		{ OV511_REG_BUS, R511_COMP_LUT_EN,	0x03 },
6083 		{ OV511_DONE_BUS, 0x0, 0x00 },
6084 	};
6085 
6086 	static struct ov511_regvals aRegvalsNorm511Plus[] = {
6087 		{ OV511_REG_BUS, R511_DRAM_FLOW_CTL,	0xff },
6088 		{ OV511_REG_BUS, R51x_SYS_SNAP,		0x00 },
6089 		{ OV511_REG_BUS, R51x_SYS_SNAP,		0x02 },
6090 		{ OV511_REG_BUS, R51x_SYS_SNAP,		0x00 },
6091 		{ OV511_REG_BUS, R511_FIFO_OPTS,	0xff },
6092 		{ OV511_REG_BUS, R511_COMP_EN,		0x00 },
6093 		{ OV511_REG_BUS, R511_COMP_LUT_EN,	0x03 },
6094 		{ OV511_DONE_BUS, 0x0, 0x00 },
6095 	};
6096 
6097 	PDEBUG(4, "");
6098 
6099 	ov->customid = reg_r(ov, R511_SYS_CUST_ID);
6100 	if (ov->customid < 0) {
6101 		err("Unable to read camera bridge registers");
6102 		goto error;
6103 	}
6104 
6105 	PDEBUG (1, "CustomID = %d", ov->customid);
6106 	ov->desc = symbolic(camlist, ov->customid);
6107 	info("model: %s", ov->desc);
6108 
6109 	if (0 == strcmp(ov->desc, NOT_DEFINED_STR)) {
6110 		err("Camera type (%d) not recognized", ov->customid);
6111 		err("Please notify " EMAIL " of the name,");
6112 		err("manufacturer, model, and this number of your camera.");
6113 		err("Also include the output of the detection process.");
6114 	}
6115 
6116 	if (ov->customid == 70)		/* USB Life TV (PAL/SECAM) */
6117 		ov->pal = 1;
6118 
6119 	if (write_regvals(ov, aRegvalsInit511)) goto error;
6120 
6121 	if (ov->led_policy == LED_OFF || ov->led_policy == LED_AUTO)
6122 		ov51x_led_control(ov, 0);
6123 
6124 	/* The OV511+ has undocumented bits in the flow control register.
6125 	 * Setting it to 0xff fixes the corruption with moving objects. */
6126 	if (ov->bridge == BRG_OV511) {
6127 		if (write_regvals(ov, aRegvalsNorm511)) goto error;
6128 	} else if (ov->bridge == BRG_OV511PLUS) {
6129 		if (write_regvals(ov, aRegvalsNorm511Plus)) goto error;
6130 	} else {
6131 		err("Invalid bridge");
6132 	}
6133 
6134 	if (ov511_init_compression(ov)) goto error;
6135 
6136 	ov->packet_numbering = 1;
6137 	ov511_set_packet_size(ov, 0);
6138 
6139 	ov->snap_enabled = snapshot;
6140 
6141 	/* Test for 7xx0 */
6142 	PDEBUG(3, "Testing for 0V7xx0");
6143 	ov->primary_i2c_slave = OV7xx0_SID;
6144 	if (ov51x_set_slave_ids(ov, OV7xx0_SID) < 0)
6145 		goto error;
6146 
6147 	if (i2c_w(ov, 0x12, 0x80) < 0) {
6148 		/* Test for 6xx0 */
6149 		PDEBUG(3, "Testing for 0V6xx0");
6150 		ov->primary_i2c_slave = OV6xx0_SID;
6151 		if (ov51x_set_slave_ids(ov, OV6xx0_SID) < 0)
6152 			goto error;
6153 
6154 		if (i2c_w(ov, 0x12, 0x80) < 0) {
6155 			/* Test for 8xx0 */
6156 			PDEBUG(3, "Testing for 0V8xx0");
6157 			ov->primary_i2c_slave = OV8xx0_SID;
6158 			if (ov51x_set_slave_ids(ov, OV8xx0_SID) < 0)
6159 				goto error;
6160 
6161 			if (i2c_w(ov, 0x12, 0x80) < 0) {
6162 				/* Test for SAA7111A */
6163 				PDEBUG(3, "Testing for SAA7111A");
6164 				ov->primary_i2c_slave = SAA7111A_SID;
6165 				if (ov51x_set_slave_ids(ov, SAA7111A_SID) < 0)
6166 					goto error;
6167 
6168 				if (i2c_w(ov, 0x0d, 0x00) < 0) {
6169 					/* Test for KS0127 */
6170 					PDEBUG(3, "Testing for KS0127");
6171 					ov->primary_i2c_slave = KS0127_SID;
6172 					if (ov51x_set_slave_ids(ov, KS0127_SID) < 0)
6173 						goto error;
6174 
6175 					if (i2c_w(ov, 0x10, 0x00) < 0) {
6176 						err("Can't determine sensor slave IDs");
6177 		 				goto error;
6178 					} else {
6179 						if (ks0127_configure(ov) < 0) {
6180 							err("Failed to configure KS0127");
6181 	 						goto error;
6182 						}
6183 					}
6184 				} else {
6185 					if (saa7111a_configure(ov) < 0) {
6186 						err("Failed to configure SAA7111A");
6187 	 					goto error;
6188 					}
6189 				}
6190 			} else {
6191 				err("Detected unsupported OV8xx0 sensor");
6192 				goto error;
6193 			}
6194 		} else {
6195 			if (ov6xx0_configure(ov) < 0) {
6196 				err("Failed to configure OV6xx0");
6197  				goto error;
6198 			}
6199 		}
6200 	} else {
6201 		if (ov7xx0_configure(ov) < 0) {
6202 			err("Failed to configure OV7xx0");
6203 	 		goto error;
6204 		}
6205 	}
6206 
6207 	return 0;
6208 
6209 error:
6210 	err("OV511 Config failed");
6211 
6212 	return -EBUSY;
6213 }
6214 
6215 /* This initializes the OV518/OV518+ and the sensor */
6216 static int
ov518_configure(struct usb_ov511 * ov)6217 ov518_configure(struct usb_ov511 *ov)
6218 {
6219 	/* For 518 and 518+ */
6220 	static struct ov511_regvals aRegvalsInit518[] = {
6221 		{ OV511_REG_BUS, R51x_SYS_RESET,	0x40 },
6222 	 	{ OV511_REG_BUS, R51x_SYS_INIT,		0xe1 },
6223 	 	{ OV511_REG_BUS, R51x_SYS_RESET,	0x3e },
6224 		{ OV511_REG_BUS, R51x_SYS_INIT,		0xe1 },
6225 		{ OV511_REG_BUS, R51x_SYS_RESET,	0x00 },
6226 		{ OV511_REG_BUS, R51x_SYS_INIT,		0xe1 },
6227 		{ OV511_REG_BUS, 0x46,			0x00 },
6228 		{ OV511_REG_BUS, 0x5d,			0x03 },
6229 		{ OV511_DONE_BUS, 0x0, 0x00},
6230 	};
6231 
6232 	static struct ov511_regvals aRegvalsNorm518[] = {
6233 		{ OV511_REG_BUS, R51x_SYS_SNAP,		0x02 }, /* Reset */
6234 		{ OV511_REG_BUS, R51x_SYS_SNAP,		0x01 }, /* Enable */
6235 		{ OV511_REG_BUS, 0x31, 			0x0f },
6236 		{ OV511_REG_BUS, 0x5d,			0x03 },
6237 		{ OV511_REG_BUS, 0x24,			0x9f },
6238 		{ OV511_REG_BUS, 0x25,			0x90 },
6239 		{ OV511_REG_BUS, 0x20,			0x00 },
6240 		{ OV511_REG_BUS, 0x51,			0x04 },
6241 		{ OV511_REG_BUS, 0x71,			0x19 },
6242 		{ OV511_DONE_BUS, 0x0, 0x00 },
6243 	};
6244 
6245 	static struct ov511_regvals aRegvalsNorm518Plus[] = {
6246 		{ OV511_REG_BUS, R51x_SYS_SNAP,		0x02 }, /* Reset */
6247 		{ OV511_REG_BUS, R51x_SYS_SNAP,		0x01 }, /* Enable */
6248 		{ OV511_REG_BUS, 0x31, 			0x0f },
6249 		{ OV511_REG_BUS, 0x5d,			0x03 },
6250 		{ OV511_REG_BUS, 0x24,			0x9f },
6251 		{ OV511_REG_BUS, 0x25,			0x90 },
6252 		{ OV511_REG_BUS, 0x20,			0x60 },
6253 		{ OV511_REG_BUS, 0x51,			0x02 },
6254 		{ OV511_REG_BUS, 0x71,			0x19 },
6255 		{ OV511_REG_BUS, 0x40,			0xff },
6256 		{ OV511_REG_BUS, 0x41,			0x42 },
6257 		{ OV511_REG_BUS, 0x46,			0x00 },
6258 		{ OV511_REG_BUS, 0x33,			0x04 },
6259 		{ OV511_REG_BUS, 0x21,			0x19 },
6260 		{ OV511_REG_BUS, 0x3f,			0x10 },
6261 		{ OV511_DONE_BUS, 0x0, 0x00 },
6262 	};
6263 
6264 	PDEBUG(4, "");
6265 
6266 	/* First 5 bits of custom ID reg are a revision ID on OV518 */
6267 	info("Device revision %d", 0x1F & reg_r(ov, R511_SYS_CUST_ID));
6268 
6269 	/* Give it the default description */
6270 	ov->desc = symbolic(camlist, 0);
6271 
6272 	if (write_regvals(ov, aRegvalsInit518)) goto error;
6273 
6274 	/* Set LED GPIO pin to output mode */
6275 	if (reg_w_mask(ov, 0x57, 0x00, 0x02) < 0) goto error;
6276 
6277 	/* LED is off by default with OV518; have to explicitly turn it on */
6278 	if (ov->led_policy == LED_OFF || ov->led_policy == LED_AUTO)
6279 		ov51x_led_control(ov, 0);
6280 	else
6281 		ov51x_led_control(ov, 1);
6282 
6283 	/* Don't require compression if dumppix is enabled; otherwise it's
6284 	 * required. OV518 has no uncompressed mode, to save RAM. */
6285 	if (!dumppix && !ov->compress) {
6286 		ov->compress = 1;
6287 		warn("Compression required with OV518...enabling");
6288 	}
6289 
6290 	if (ov->bridge == BRG_OV518) {
6291 		if (write_regvals(ov, aRegvalsNorm518)) goto error;
6292 	} else if (ov->bridge == BRG_OV518PLUS) {
6293 		if (write_regvals(ov, aRegvalsNorm518Plus)) goto error;
6294 	} else {
6295 		err("Invalid bridge");
6296 	}
6297 
6298 	if (reg_w(ov, 0x2f, 0x80) < 0) goto error;
6299 
6300 	if (ov518_init_compression(ov)) goto error;
6301 
6302 	if (ov->bridge == BRG_OV518)
6303 	{
6304 		struct usb_interface *ifp = &ov->dev->config[0].interface[0];
6305 		__u16 mxps = ifp->altsetting[7].endpoint[0].wMaxPacketSize;
6306 
6307 		/* Some OV518s have packet numbering by default, some don't */
6308 		if (mxps == 897)
6309 			ov->packet_numbering = 1;
6310 		else
6311 			ov->packet_numbering = 0;
6312 	} else {
6313 		/* OV518+ has packet numbering turned on by default */
6314 		ov->packet_numbering = 1;
6315 	}
6316 
6317 	ov518_set_packet_size(ov, 0);
6318 
6319 	ov->snap_enabled = snapshot;
6320 
6321 	/* Test for 76xx */
6322 	ov->primary_i2c_slave = OV7xx0_SID;
6323 	if (ov51x_set_slave_ids(ov, OV7xx0_SID) < 0)
6324 		goto error;
6325 
6326 	/* The OV518 must be more aggressive about sensor detection since
6327 	 * I2C write will never fail if the sensor is not present. We have
6328 	 * to try to initialize the sensor to detect its presence */
6329 
6330 	if (init_ov_sensor(ov) < 0) {
6331 		/* Test for 6xx0 */
6332 		ov->primary_i2c_slave = OV6xx0_SID;
6333 		if (ov51x_set_slave_ids(ov, OV6xx0_SID) < 0)
6334 			goto error;
6335 
6336 		if (init_ov_sensor(ov) < 0) {
6337 			/* Test for 8xx0 */
6338 			ov->primary_i2c_slave = OV8xx0_SID;
6339 			if (ov51x_set_slave_ids(ov, OV8xx0_SID) < 0)
6340 				goto error;
6341 
6342 			if (init_ov_sensor(ov) < 0) {
6343 				err("Can't determine sensor slave IDs");
6344  				goto error;
6345 			} else {
6346 				err("Detected unsupported OV8xx0 sensor");
6347 				goto error;
6348 			}
6349 		} else {
6350 			if (ov6xx0_configure(ov) < 0) {
6351 				err("Failed to configure OV6xx0");
6352  				goto error;
6353 			}
6354 		}
6355 	} else {
6356 		if (ov7xx0_configure(ov) < 0) {
6357 			err("Failed to configure OV7xx0");
6358 	 		goto error;
6359 		}
6360 	}
6361 
6362 	ov->maxwidth = 352;
6363 	ov->maxheight = 288;
6364 
6365 	// The OV518 cannot go as low as the sensor can
6366 	ov->minwidth = 160;
6367 	ov->minheight = 120;
6368 
6369 	return 0;
6370 
6371 error:
6372 	err("OV518 Config failed");
6373 
6374 	return -EBUSY;
6375 }
6376 
6377 
6378 /****************************************************************************
6379  *
6380  *  USB routines
6381  *
6382  ***************************************************************************/
6383 
6384 static void *
ov51x_probe(struct usb_device * dev,unsigned int ifnum,const struct usb_device_id * id)6385 ov51x_probe(struct usb_device *dev, unsigned int ifnum,
6386 	    const struct usb_device_id *id)
6387 {
6388 	struct usb_interface_descriptor *interface;
6389 	struct usb_ov511 *ov;
6390 	int i;
6391 	int registered = 0;
6392 
6393 	PDEBUG(1, "probing for device...");
6394 
6395 	/* We don't handle multi-config cameras */
6396 	if (dev->descriptor.bNumConfigurations != 1)
6397 		return NULL;
6398 
6399 	interface = &dev->actconfig->interface[ifnum].altsetting[0];
6400 
6401 	/* Checking vendor/product should be enough, but what the hell */
6402 	if (interface->bInterfaceClass != 0xFF)
6403 		return NULL;
6404 	if (interface->bInterfaceSubClass != 0x00)
6405 		return NULL;
6406 
6407 	/* Since code below may sleep, we use this as a lock */
6408 	MOD_INC_USE_COUNT;
6409 
6410 	if ((ov = kmalloc(sizeof(*ov), GFP_KERNEL)) == NULL) {
6411 		err("couldn't kmalloc ov struct");
6412 		goto error_out;
6413 	}
6414 
6415 	memset(ov, 0, sizeof(*ov));
6416 
6417 	ov->dev = dev;
6418 	ov->iface = interface->bInterfaceNumber;
6419 	ov->led_policy = led;
6420 	ov->compress = compress;
6421 	ov->lightfreq = lightfreq;
6422 	ov->num_inputs = 1;	   /* Video decoder init functs. change this */
6423 	ov->stop_during_set = !fastset;
6424 	ov->backlight = backlight;
6425 	ov->mirror = mirror;
6426 	ov->auto_brt = autobright;
6427 	ov->auto_gain = autogain;
6428 	ov->auto_exp = autoexp;
6429 
6430 	switch (dev->descriptor.idProduct) {
6431 	case PROD_OV511:
6432 		ov->bridge = BRG_OV511;
6433 		ov->bclass = BCL_OV511;
6434 		break;
6435 	case PROD_OV511PLUS:
6436 		ov->bridge = BRG_OV511PLUS;
6437 		ov->bclass = BCL_OV511;
6438 		break;
6439 	case PROD_OV518:
6440 		ov->bridge = BRG_OV518;
6441 		ov->bclass = BCL_OV518;
6442 		break;
6443 	case PROD_OV518PLUS:
6444 		ov->bridge = BRG_OV518PLUS;
6445 		ov->bclass = BCL_OV518;
6446 		break;
6447 	case PROD_ME2CAM:
6448 		if (dev->descriptor.idVendor != VEND_MATTEL)
6449 			goto error;
6450 		ov->bridge = BRG_OV511PLUS;
6451 		ov->bclass = BCL_OV511;
6452 		break;
6453 	default:
6454 		err("Unknown product ID 0x%04x", dev->descriptor.idProduct);
6455 		goto error_dealloc;
6456 	}
6457 
6458 	info("USB %s video device found", symbolic(brglist, ov->bridge));
6459 
6460 	/* Workaround for some applications that want data in RGB
6461 	 * instead of BGR. */
6462 	if (force_rgb)
6463 		info("data format set to RGB");
6464 
6465 	init_waitqueue_head(&ov->wq);
6466 
6467 	init_MUTEX(&ov->lock);	/* to 1 == available */
6468 	init_MUTEX(&ov->buf_lock);
6469 	init_MUTEX(&ov->param_lock);
6470 	init_MUTEX(&ov->i2c_lock);
6471 	init_MUTEX(&ov->cbuf_lock);
6472 
6473 	ov->buf_state = BUF_NOT_ALLOCATED;
6474 
6475 	if (usb_make_path(dev, ov->usb_path, OV511_USB_PATH_LEN) < 0) {
6476 		err("usb_make_path error");
6477 		goto error_dealloc;
6478 	}
6479 
6480 	/* Allocate control transfer buffer. */
6481 	/* Must be kmalloc()'ed, for DMA compatibility */
6482 	ov->cbuf = kmalloc(OV511_CBUF_SIZE, GFP_KERNEL);
6483 	if (!ov->cbuf)
6484 		goto error;
6485 
6486 	if (ov->bclass == BCL_OV518) {
6487 		if (ov518_configure(ov) < 0)
6488 			goto error;
6489 	} else {
6490 		if (ov511_configure(ov) < 0)
6491 			goto error;
6492 	}
6493 
6494 	for (i = 0; i < OV511_NUMFRAMES; i++) {
6495 		ov->frame[i].framenum = i;
6496 		init_waitqueue_head(&ov->frame[i].wq);
6497 	}
6498 
6499 	for (i = 0; i < OV511_NUMSBUF; i++) {
6500 		ov->sbuf[i].ov = ov;
6501 		spin_lock_init(&ov->sbuf[i].lock);
6502 		ov->sbuf[i].n = i;
6503 	}
6504 
6505 	/* Unnecessary? (This is done on open(). Need to make sure variables
6506 	 * are properly initialized without this before removing it, though). */
6507 	if (ov51x_set_default_params(ov) < 0)
6508 		goto error;
6509 
6510 #ifdef OV511_DEBUG
6511 	if (dump_bridge) {
6512 		if (ov->bclass == BCL_OV511)
6513 			ov511_dump_regs(ov);
6514 		else
6515 			ov518_dump_regs(ov);
6516 	}
6517 #endif
6518 
6519 	memcpy(&ov->vdev, &vdev_template, sizeof(vdev_template));
6520 	ov->vdev.priv = ov;
6521 
6522 	for (i = 0; i < OV511_MAX_UNIT_VIDEO; i++) {
6523 		/* Minor 0 cannot be specified; assume user wants autodetect */
6524 		if (unit_video[i] == 0)
6525 			break;
6526 
6527 		if (video_register_device(&ov->vdev, VFL_TYPE_GRABBER,
6528 			unit_video[i]) >= 0) {
6529 			registered = 1;
6530 			break;
6531 		}
6532 	}
6533 
6534 	/* Use the next available one */
6535 	if (!registered &&
6536 	    video_register_device(&ov->vdev, VFL_TYPE_GRABBER, -1) < 0) {
6537 		err("video_register_device failed");
6538 		goto error;
6539 	}
6540 
6541 	info("Device at %s registered to minor %d", ov->usb_path,
6542 	     ov->vdev.minor);
6543 
6544 #if defined(CONFIG_PROC_FS) && defined(CONFIG_VIDEO_PROC_FS)
6545 	create_proc_ov511_cam(ov);
6546 #endif
6547 
6548 	MOD_DEC_USE_COUNT;
6549      	return ov;
6550 
6551 error:
6552 #if defined(CONFIG_PROC_FS) && defined(CONFIG_VIDEO_PROC_FS)
6553 	/* Safe to call even if entry doesn't exist */
6554 	destroy_proc_ov511_cam(ov);
6555 #endif
6556 
6557 	if (ov->cbuf) {
6558 		down(&ov->cbuf_lock);
6559 		kfree(ov->cbuf);
6560 		ov->cbuf = NULL;
6561 		up(&ov->cbuf_lock);
6562 	}
6563 
6564 error_dealloc:
6565 	if (ov) {
6566 		kfree(ov);
6567 		ov = NULL;
6568 	}
6569 
6570 error_out:
6571 	MOD_DEC_USE_COUNT;
6572 	err("Camera initialization failed");
6573 	return NULL;
6574 }
6575 
6576 
6577 static void
ov51x_disconnect(struct usb_device * dev,void * ptr)6578 ov51x_disconnect(struct usb_device *dev, void *ptr)
6579 {
6580 	struct usb_ov511 *ov = (struct usb_ov511 *) ptr;
6581 	int n;
6582 
6583 	MOD_INC_USE_COUNT;
6584 
6585 	PDEBUG(3, "");
6586 
6587 	video_unregister_device(&ov->vdev);
6588 	if (ov->user)
6589 		PDEBUG(3, "Device open...deferring video_unregister_device");
6590 
6591 	for (n = 0; n < OV511_NUMFRAMES; n++)
6592 		ov->frame[n].grabstate = FRAME_ERROR;
6593 
6594 	ov->curframe = -1;
6595 
6596 	/* This will cause the process to request another frame */
6597 	for (n = 0; n < OV511_NUMFRAMES; n++)
6598 		if (waitqueue_active(&ov->frame[n].wq))
6599 			wake_up_interruptible(&ov->frame[n].wq);
6600 	if (waitqueue_active(&ov->wq))
6601 		wake_up_interruptible(&ov->wq);
6602 
6603 	ov->streaming = 0;
6604 
6605 	ov51x_unlink_isoc(ov);
6606 
6607 #if defined(CONFIG_PROC_FS) && defined(CONFIG_VIDEO_PROC_FS)
6608         destroy_proc_ov511_cam(ov);
6609 #endif
6610 
6611 	ov->dev = NULL;
6612 
6613 	/* Free the memory */
6614 	if (ov && !ov->user) {
6615 		down(&ov->cbuf_lock);
6616 		kfree(ov->cbuf);
6617 		ov->cbuf = NULL;
6618 		up(&ov->cbuf_lock);
6619 
6620 		ov51x_dealloc(ov, 1);
6621 		kfree(ov);
6622 		ov = NULL;
6623 	}
6624 
6625 	MOD_DEC_USE_COUNT;
6626 
6627 	PDEBUG(3, "Disconnect complete");
6628 }
6629 
6630 static struct usb_driver ov511_driver = {
6631 	.name =		"ov511",
6632 	.id_table =	device_table,
6633 	.probe =	ov51x_probe,
6634 	.disconnect =	ov51x_disconnect
6635 };
6636 
6637 
6638 /****************************************************************************
6639  *
6640  *  Module routines
6641  *
6642  ***************************************************************************/
6643 
6644 /* Returns 0 for success */
6645 int
ov511_register_decomp_module(int ver,struct ov51x_decomp_ops * ops,int ov518,int mmx)6646 ov511_register_decomp_module(int ver, struct ov51x_decomp_ops *ops, int ov518,
6647 			     int mmx)
6648 {
6649 	if (ver != DECOMP_INTERFACE_VER) {
6650 		err("Decompression module has incompatible");
6651 		err("interface version %d", ver);
6652 		err("Interface version %d is required", DECOMP_INTERFACE_VER);
6653 		return -EINVAL;
6654 	}
6655 
6656 	if (!ops)
6657 		return -EFAULT;
6658 
6659 	if (mmx && !ov51x_mmx_available) {
6660 		err("MMX not available on this system or kernel");
6661 		return -EINVAL;
6662 	}
6663 
6664 	lock_kernel();
6665 
6666 	if (ov518) {
6667 		if (mmx) {
6668 			if (ov518_mmx_decomp_ops)
6669 				goto err_in_use;
6670 			else
6671 				ov518_mmx_decomp_ops = ops;
6672 		} else {
6673 			if (ov518_decomp_ops)
6674 				goto err_in_use;
6675 			else
6676 				ov518_decomp_ops = ops;
6677 		}
6678 	} else {
6679 		if (mmx) {
6680 			if (ov511_mmx_decomp_ops)
6681 				goto err_in_use;
6682 			else
6683 				ov511_mmx_decomp_ops = ops;
6684 		} else {
6685 			if (ov511_decomp_ops)
6686 				goto err_in_use;
6687 			else
6688 				ov511_decomp_ops = ops;
6689 		}
6690 	}
6691 
6692 	MOD_INC_USE_COUNT;
6693 
6694 	unlock_kernel();
6695 	return 0;
6696 
6697 err_in_use:
6698 	unlock_kernel();
6699 	return -EBUSY;
6700 }
6701 
6702 void
ov511_deregister_decomp_module(int ov518,int mmx)6703 ov511_deregister_decomp_module(int ov518, int mmx)
6704 {
6705 	lock_kernel();
6706 
6707 	if (ov518) {
6708 		if (mmx)
6709 			ov518_mmx_decomp_ops = NULL;
6710 		else
6711 			ov518_decomp_ops = NULL;
6712 	} else {
6713 		if (mmx)
6714 			ov511_mmx_decomp_ops = NULL;
6715 		else
6716 			ov511_decomp_ops = NULL;
6717 	}
6718 
6719 	MOD_DEC_USE_COUNT;
6720 
6721 	unlock_kernel();
6722 }
6723 
6724 static int __init
usb_ov511_init(void)6725 usb_ov511_init(void)
6726 {
6727 #if defined(CONFIG_PROC_FS) && defined(CONFIG_VIDEO_PROC_FS)
6728         proc_ov511_create();
6729 #endif
6730 
6731 	if (usb_register(&ov511_driver) < 0)
6732 		return -1;
6733 
6734 #if defined (__i386__)
6735 	if (test_bit(X86_FEATURE_MMX, boot_cpu_data.x86_capability))
6736 		ov51x_mmx_available = 1;
6737 #endif
6738 
6739 	info(DRIVER_VERSION " : " DRIVER_DESC);
6740 
6741 	return 0;
6742 }
6743 
6744 static void __exit
usb_ov511_exit(void)6745 usb_ov511_exit(void)
6746 {
6747 	usb_deregister(&ov511_driver);
6748 	info("driver deregistered");
6749 
6750 #if defined(CONFIG_PROC_FS) && defined(CONFIG_VIDEO_PROC_FS)
6751         proc_ov511_destroy();
6752 #endif
6753 }
6754 
6755 module_init(usb_ov511_init);
6756 module_exit(usb_ov511_exit);
6757 
6758 EXPORT_SYMBOL(ov511_register_decomp_module);
6759 EXPORT_SYMBOL(ov511_deregister_decomp_module);
6760