1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Sunplus spca561 subdriver
4 *
5 * Copyright (C) 2004 Michel Xhaard mxhaard@magic.fr
6 *
7 * V4L2 by Jean-Francois Moine <http://moinejf.free.fr>
8 */
9
10#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
11
12#define MODULE_NAME "spca561"
13
14#include <linux/input.h>
15#include "gspca.h"
16
17MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>");
18MODULE_DESCRIPTION("GSPCA/SPCA561 USB Camera Driver");
19MODULE_LICENSE("GPL");
20
21#define EXPOSURE_MAX (2047 + 325)
22
23/* specific webcam descriptor */
24struct sd {
25	struct gspca_dev gspca_dev;	/* !! must be the first item */
26
27	struct { /* hue/contrast control cluster */
28		struct v4l2_ctrl *contrast;
29		struct v4l2_ctrl *hue;
30	};
31	struct v4l2_ctrl *autogain;
32
33#define EXPO12A_DEF 3
34	__u8 expo12a;		/* expo/gain? for rev 12a */
35
36	__u8 chip_revision;
37#define Rev012A 0
38#define Rev072A 1
39
40	signed char ag_cnt;
41#define AG_CNT_START 13
42};
43
44static const struct v4l2_pix_format sif_012a_mode[] = {
45	{160, 120, V4L2_PIX_FMT_SGBRG8, V4L2_FIELD_NONE,
46		.bytesperline = 160,
47		.sizeimage = 160 * 120,
48		.colorspace = V4L2_COLORSPACE_SRGB,
49		.priv = 3},
50	{176, 144, V4L2_PIX_FMT_SGBRG8, V4L2_FIELD_NONE,
51		.bytesperline = 176,
52		.sizeimage = 176 * 144,
53		.colorspace = V4L2_COLORSPACE_SRGB,
54		.priv = 2},
55	{320, 240, V4L2_PIX_FMT_SPCA561, V4L2_FIELD_NONE,
56		.bytesperline = 320,
57		.sizeimage = 320 * 240 * 4 / 8,
58		.colorspace = V4L2_COLORSPACE_SRGB,
59		.priv = 1},
60	{352, 288, V4L2_PIX_FMT_SPCA561, V4L2_FIELD_NONE,
61		.bytesperline = 352,
62		.sizeimage = 352 * 288 * 4 / 8,
63		.colorspace = V4L2_COLORSPACE_SRGB,
64		.priv = 0},
65};
66
67static const struct v4l2_pix_format sif_072a_mode[] = {
68	{160, 120, V4L2_PIX_FMT_SGBRG8, V4L2_FIELD_NONE,
69		.bytesperline = 160,
70		.sizeimage = 160 * 120,
71		.colorspace = V4L2_COLORSPACE_SRGB,
72		.priv = 3},
73	{176, 144, V4L2_PIX_FMT_SGBRG8, V4L2_FIELD_NONE,
74		.bytesperline = 176,
75		.sizeimage = 176 * 144,
76		.colorspace = V4L2_COLORSPACE_SRGB,
77		.priv = 2},
78	{320, 240, V4L2_PIX_FMT_SGBRG8, V4L2_FIELD_NONE,
79		.bytesperline = 320,
80		.sizeimage = 320 * 240,
81		.colorspace = V4L2_COLORSPACE_SRGB,
82		.priv = 1},
83	{352, 288, V4L2_PIX_FMT_SGBRG8, V4L2_FIELD_NONE,
84		.bytesperline = 352,
85		.sizeimage = 352 * 288,
86		.colorspace = V4L2_COLORSPACE_SRGB,
87		.priv = 0},
88};
89
90/*
91 * Initialization data
92 * I'm not very sure how to split initialization from open data
93 * chunks. For now, we'll consider everything as initialization
94 */
95/* Frame packet header offsets for the spca561 */
96#define SPCA561_OFFSET_SNAP 1
97#define SPCA561_OFFSET_TYPE 2
98#define SPCA561_OFFSET_COMPRESS 3
99#define SPCA561_OFFSET_FRAMSEQ   4
100#define SPCA561_OFFSET_GPIO 5
101#define SPCA561_OFFSET_USBBUFF 6
102#define SPCA561_OFFSET_WIN2GRAVE 7
103#define SPCA561_OFFSET_WIN2RAVE 8
104#define SPCA561_OFFSET_WIN2BAVE 9
105#define SPCA561_OFFSET_WIN2GBAVE 10
106#define SPCA561_OFFSET_WIN1GRAVE 11
107#define SPCA561_OFFSET_WIN1RAVE 12
108#define SPCA561_OFFSET_WIN1BAVE 13
109#define SPCA561_OFFSET_WIN1GBAVE 14
110#define SPCA561_OFFSET_FREQ 15
111#define SPCA561_OFFSET_VSYNC 16
112#define SPCA561_INDEX_I2C_BASE 0x8800
113#define SPCA561_SNAPBIT 0x20
114#define SPCA561_SNAPCTRL 0x40
115
116static const u16 rev72a_reset[][2] = {
117	{0x0000, 0x8114},	/* Software GPIO output data */
118	{0x0001, 0x8114},	/* Software GPIO output data */
119	{0x0000, 0x8112},	/* Some kind of reset */
120	{}
121};
122static const __u16 rev72a_init_data1[][2] = {
123	{0x0003, 0x8701},	/* PCLK clock delay adjustment */
124	{0x0001, 0x8703},	/* HSYNC from cmos inverted */
125	{0x0011, 0x8118},	/* Enable and conf sensor */
126	{0x0001, 0x8118},	/* Conf sensor */
127	{0x0092, 0x8804},	/* I know nothing about these */
128	{0x0010, 0x8802},	/* 0x88xx registers, so I won't */
129	{}
130};
131static const u16 rev72a_init_sensor1[][2] = {
132	{0x0001, 0x000d},
133	{0x0002, 0x0018},
134	{0x0004, 0x0165},
135	{0x0005, 0x0021},
136	{0x0007, 0x00aa},
137	{0x0020, 0x1504},
138	{0x0039, 0x0002},
139	{0x0035, 0x0010},
140	{0x0009, 0x1049},
141	{0x0028, 0x000b},
142	{0x003b, 0x000f},
143	{0x003c, 0x0000},
144	{}
145};
146static const __u16 rev72a_init_data2[][2] = {
147	{0x0018, 0x8601},	/* Pixel/line selection for color separation */
148	{0x0000, 0x8602},	/* Optical black level for user setting */
149	{0x0060, 0x8604},	/* Optical black horizontal offset */
150	{0x0002, 0x8605},	/* Optical black vertical offset */
151	{0x0000, 0x8603},	/* Non-automatic optical black level */
152	{0x0002, 0x865b},	/* Horizontal offset for valid pixels */
153	{0x0000, 0x865f},	/* Vertical valid pixels window (x2) */
154	{0x00b0, 0x865d},	/* Horizontal valid pixels window (x2) */
155	{0x0090, 0x865e},	/* Vertical valid lines window (x2) */
156	{0x00e0, 0x8406},	/* Memory buffer threshold */
157	{0x0000, 0x8660},	/* Compensation memory stuff */
158	{0x0002, 0x8201},	/* Output address for r/w serial EEPROM */
159	{0x0008, 0x8200},	/* Clear valid bit for serial EEPROM */
160	{0x0001, 0x8200},	/* OprMode to be executed by hardware */
161/* from ms-win */
162	{0x0000, 0x8611},	/* R offset for white balance */
163	{0x00fd, 0x8612},	/* Gr offset for white balance */
164	{0x0003, 0x8613},	/* B offset for white balance */
165	{0x0000, 0x8614},	/* Gb offset for white balance */
166/* from ms-win */
167	{0x0035, 0x8651},	/* R gain for white balance */
168	{0x0040, 0x8652},	/* Gr gain for white balance */
169	{0x005f, 0x8653},	/* B gain for white balance */
170	{0x0040, 0x8654},	/* Gb gain for white balance */
171	{0x0002, 0x8502},	/* Maximum average bit rate stuff */
172	{0x0011, 0x8802},
173
174	{0x0087, 0x8700},	/* Set master clock (96Mhz????) */
175	{0x0081, 0x8702},	/* Master clock output enable */
176
177	{0x0000, 0x8500},	/* Set image type (352x288 no compression) */
178	/* Originally was 0x0010 (352x288 compression) */
179
180	{0x0002, 0x865b},	/* Horizontal offset for valid pixels */
181	{0x0003, 0x865c},	/* Vertical offset for valid lines */
182	{}
183};
184static const u16 rev72a_init_sensor2[][2] = {
185	{0x0003, 0x0121},
186	{0x0004, 0x0165},
187	{0x0005, 0x002f},	/* blanking control column */
188	{0x0006, 0x0000},	/* blanking mode row*/
189	{0x000a, 0x0002},
190	{0x0009, 0x1061},	/* setexposure times && pixel clock
191				 * 0001 0 | 000 0110 0001 */
192	{0x0035, 0x0014},
193	{}
194};
195
196/******************** QC Express etch2 stuff ********************/
197static const __u16 Pb100_1map8300[][2] = {
198	/* reg, value */
199	{0x8320, 0x3304},
200
201	{0x8303, 0x0125},	/* image area */
202	{0x8304, 0x0169},
203	{0x8328, 0x000b},
204	{0x833c, 0x0001},		/*fixme: win:07*/
205
206	{0x832f, 0x1904},		/*fixme: was 0419*/
207	{0x8307, 0x00aa},
208	{0x8301, 0x0003},
209	{0x8302, 0x000e},
210	{}
211};
212static const __u16 Pb100_2map8300[][2] = {
213	/* reg, value */
214	{0x8339, 0x0000},
215	{0x8307, 0x00aa},
216	{}
217};
218
219static const __u16 spca561_161rev12A_data1[][2] = {
220	{0x29, 0x8118},		/* Control register (various enable bits) */
221	{0x08, 0x8114},		/* GPIO: Led off */
222	{0x0e, 0x8112},		/* 0x0e stream off 0x3e stream on */
223	{0x00, 0x8102},		/* white balance - new */
224	{0x92, 0x8804},
225	{0x04, 0x8802},		/* windows uses 08 */
226	{}
227};
228static const __u16 spca561_161rev12A_data2[][2] = {
229	{0x21, 0x8118},
230	{0x10, 0x8500},
231	{0x07, 0x8601},
232	{0x07, 0x8602},
233	{0x04, 0x8501},
234
235	{0x07, 0x8201},		/* windows uses 02 */
236	{0x08, 0x8200},
237	{0x01, 0x8200},
238
239	{0x90, 0x8604},
240	{0x00, 0x8605},
241	{0xb0, 0x8603},
242
243	/* sensor gains */
244	{0x07, 0x8601},		/* white balance - new */
245	{0x07, 0x8602},		/* white balance - new */
246	{0x00, 0x8610},		/* *red */
247	{0x00, 0x8611},		/* 3f   *green */
248	{0x00, 0x8612},		/* green *blue */
249	{0x00, 0x8613},		/* blue *green */
250	{0x43, 0x8614},		/* green *red - white balance - was 0x35 */
251	{0x40, 0x8615},		/* 40   *green - white balance - was 0x35 */
252	{0x71, 0x8616},		/* 7a   *blue - white balance - was 0x35 */
253	{0x40, 0x8617},		/* 40   *green - white balance - was 0x35 */
254
255	{0x0c, 0x8620},		/* 0c */
256	{0xc8, 0x8631},		/* c8 */
257	{0xc8, 0x8634},		/* c8 */
258	{0x23, 0x8635},		/* 23 */
259	{0x1f, 0x8636},		/* 1f */
260	{0xdd, 0x8637},		/* dd */
261	{0xe1, 0x8638},		/* e1 */
262	{0x1d, 0x8639},		/* 1d */
263	{0x21, 0x863a},		/* 21 */
264	{0xe3, 0x863b},		/* e3 */
265	{0xdf, 0x863c},		/* df */
266	{0xf0, 0x8505},
267	{0x32, 0x850a},
268/*	{0x99, 0x8700},		 * - white balance - new (removed) */
269	/* HDG we used to do this in stop0, making the init state and the state
270	   after a start / stop different, so do this here instead. */
271	{0x29, 0x8118},
272	{}
273};
274
275static void reg_w_val(struct gspca_dev *gspca_dev, __u16 index, __u8 value)
276{
277	int ret;
278	struct usb_device *dev = gspca_dev->dev;
279
280	ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
281			      0,		/* request */
282			      USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
283			      value, index, NULL, 0, 500);
284	gspca_dbg(gspca_dev, D_USBO, "reg write: 0x%02x:0x%02x\n",
285		  index, value);
286	if (ret < 0)
287		pr_err("reg write: error %d\n", ret);
288}
289
290static void write_vector(struct gspca_dev *gspca_dev,
291			const __u16 data[][2])
292{
293	int i;
294
295	i = 0;
296	while (data[i][1] != 0) {
297		reg_w_val(gspca_dev, data[i][1], data[i][0]);
298		i++;
299	}
300}
301
302/* read 'len' bytes to gspca_dev->usb_buf */
303static void reg_r(struct gspca_dev *gspca_dev,
304		  __u16 index, __u16 length)
305{
306	usb_control_msg(gspca_dev->dev,
307			usb_rcvctrlpipe(gspca_dev->dev, 0),
308			0,			/* request */
309			USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
310			0,			/* value */
311			index, gspca_dev->usb_buf, length, 500);
312}
313
314/* write 'len' bytes from gspca_dev->usb_buf */
315static void reg_w_buf(struct gspca_dev *gspca_dev,
316		      __u16 index, __u16 len)
317{
318	usb_control_msg(gspca_dev->dev,
319			usb_sndctrlpipe(gspca_dev->dev, 0),
320			0,			/* request */
321			USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
322			0,			/* value */
323			index, gspca_dev->usb_buf, len, 500);
324}
325
326static void i2c_write(struct gspca_dev *gspca_dev, __u16 value, __u16 reg)
327{
328	int retry = 60;
329
330	reg_w_val(gspca_dev, 0x8801, reg);
331	reg_w_val(gspca_dev, 0x8805, value);
332	reg_w_val(gspca_dev, 0x8800, value >> 8);
333	do {
334		reg_r(gspca_dev, 0x8803, 1);
335		if (!gspca_dev->usb_buf[0])
336			return;
337		msleep(10);
338	} while (--retry);
339}
340
341static int i2c_read(struct gspca_dev *gspca_dev, __u16 reg, __u8 mode)
342{
343	int retry = 60;
344	__u8 value;
345
346	reg_w_val(gspca_dev, 0x8804, 0x92);
347	reg_w_val(gspca_dev, 0x8801, reg);
348	reg_w_val(gspca_dev, 0x8802, mode | 0x01);
349	do {
350		reg_r(gspca_dev, 0x8803, 1);
351		if (!gspca_dev->usb_buf[0]) {
352			reg_r(gspca_dev, 0x8800, 1);
353			value = gspca_dev->usb_buf[0];
354			reg_r(gspca_dev, 0x8805, 1);
355			return ((int) value << 8) | gspca_dev->usb_buf[0];
356		}
357		msleep(10);
358	} while (--retry);
359	return -1;
360}
361
362static void sensor_mapwrite(struct gspca_dev *gspca_dev,
363			    const __u16 (*sensormap)[2])
364{
365	while ((*sensormap)[0]) {
366		gspca_dev->usb_buf[0] = (*sensormap)[1];
367		gspca_dev->usb_buf[1] = (*sensormap)[1] >> 8;
368		reg_w_buf(gspca_dev, (*sensormap)[0], 2);
369		sensormap++;
370	}
371}
372
373static void write_sensor_72a(struct gspca_dev *gspca_dev,
374			    const __u16 (*sensor)[2])
375{
376	while ((*sensor)[0]) {
377		i2c_write(gspca_dev, (*sensor)[1], (*sensor)[0]);
378		sensor++;
379	}
380}
381
382static void init_161rev12A(struct gspca_dev *gspca_dev)
383{
384	write_vector(gspca_dev, spca561_161rev12A_data1);
385	sensor_mapwrite(gspca_dev, Pb100_1map8300);
386/*fixme: should be in sd_start*/
387	write_vector(gspca_dev, spca561_161rev12A_data2);
388	sensor_mapwrite(gspca_dev, Pb100_2map8300);
389}
390
391/* this function is called at probe time */
392static int sd_config(struct gspca_dev *gspca_dev,
393		     const struct usb_device_id *id)
394{
395	struct sd *sd = (struct sd *) gspca_dev;
396	struct cam *cam;
397	__u16 vendor, product;
398	__u8 data1, data2;
399
400	/* Read frm global register the USB product and vendor IDs, just to
401	 * prove that we can communicate with the device.  This works, which
402	 * confirms at we are communicating properly and that the device
403	 * is a 561. */
404	reg_r(gspca_dev, 0x8104, 1);
405	data1 = gspca_dev->usb_buf[0];
406	reg_r(gspca_dev, 0x8105, 1);
407	data2 = gspca_dev->usb_buf[0];
408	vendor = (data2 << 8) | data1;
409	reg_r(gspca_dev, 0x8106, 1);
410	data1 = gspca_dev->usb_buf[0];
411	reg_r(gspca_dev, 0x8107, 1);
412	data2 = gspca_dev->usb_buf[0];
413	product = (data2 << 8) | data1;
414	if (vendor != id->idVendor || product != id->idProduct) {
415		gspca_dbg(gspca_dev, D_PROBE, "Bad vendor / product from device\n");
416		return -EINVAL;
417	}
418
419	cam = &gspca_dev->cam;
420	cam->needs_full_bandwidth = 1;
421
422	sd->chip_revision = id->driver_info;
423	if (sd->chip_revision == Rev012A) {
424		cam->cam_mode = sif_012a_mode;
425		cam->nmodes = ARRAY_SIZE(sif_012a_mode);
426	} else {
427		cam->cam_mode = sif_072a_mode;
428		cam->nmodes = ARRAY_SIZE(sif_072a_mode);
429	}
430	sd->expo12a = EXPO12A_DEF;
431	return 0;
432}
433
434/* this function is called at probe and resume time */
435static int sd_init_12a(struct gspca_dev *gspca_dev)
436{
437	gspca_dbg(gspca_dev, D_STREAM, "Chip revision: 012a\n");
438	init_161rev12A(gspca_dev);
439	return 0;
440}
441static int sd_init_72a(struct gspca_dev *gspca_dev)
442{
443	gspca_dbg(gspca_dev, D_STREAM, "Chip revision: 072a\n");
444	write_vector(gspca_dev, rev72a_reset);
445	msleep(200);
446	write_vector(gspca_dev, rev72a_init_data1);
447	write_sensor_72a(gspca_dev, rev72a_init_sensor1);
448	write_vector(gspca_dev, rev72a_init_data2);
449	write_sensor_72a(gspca_dev, rev72a_init_sensor2);
450	reg_w_val(gspca_dev, 0x8112, 0x30);
451	return 0;
452}
453
454static void setbrightness(struct gspca_dev *gspca_dev, s32 val)
455{
456	struct sd *sd = (struct sd *) gspca_dev;
457	__u16 reg;
458
459	if (sd->chip_revision == Rev012A)
460		reg = 0x8610;
461	else
462		reg = 0x8611;
463
464	reg_w_val(gspca_dev, reg + 0, val);		/* R */
465	reg_w_val(gspca_dev, reg + 1, val);		/* Gr */
466	reg_w_val(gspca_dev, reg + 2, val);		/* B */
467	reg_w_val(gspca_dev, reg + 3, val);		/* Gb */
468}
469
470static void setwhite(struct gspca_dev *gspca_dev, s32 white, s32 contrast)
471{
472	struct sd *sd = (struct sd *) gspca_dev;
473	__u8 blue, red;
474	__u16 reg;
475
476	/* try to emulate MS-win as possible */
477	red = 0x20 + white * 3 / 8;
478	blue = 0x90 - white * 5 / 8;
479	if (sd->chip_revision == Rev012A) {
480		reg = 0x8614;
481	} else {
482		reg = 0x8651;
483		red += contrast - 0x20;
484		blue += contrast - 0x20;
485		reg_w_val(gspca_dev, 0x8652, contrast + 0x20); /* Gr */
486		reg_w_val(gspca_dev, 0x8654, contrast + 0x20); /* Gb */
487	}
488	reg_w_val(gspca_dev, reg, red);
489	reg_w_val(gspca_dev, reg + 2, blue);
490}
491
492/* rev 12a only */
493static void setexposure(struct gspca_dev *gspca_dev, s32 val)
494{
495	int i, expo = 0;
496
497	/* Register 0x8309 controls exposure for the spca561,
498	   the basic exposure setting goes from 1-2047, where 1 is completely
499	   dark and 2047 is very bright. It not only influences exposure but
500	   also the framerate (to allow for longer exposure) from 1 - 300 it
501	   only raises the exposure time then from 300 - 600 it halves the
502	   framerate to be able to further raise the exposure time and for every
503	   300 more it halves the framerate again. This allows for a maximum
504	   exposure time of circa 0.2 - 0.25 seconds (30 / (2000/3000) fps).
505	   Sometimes this is not enough, the 1-2047 uses bits 0-10, bits 11-12
506	   configure a divider for the base framerate which us used at the
507	   exposure setting of 1-300. These bits configure the base framerate
508	   according to the following formula: fps = 60 / (value + 2) */
509
510	/* We choose to use the high bits setting the fixed framerate divisor
511	   asap, as setting high basic exposure setting without the fixed
512	   divider in combination with high gains makes the cam stop */
513	static const int table[] =  { 0, 450, 550, 625, EXPOSURE_MAX };
514
515	for (i = 0; i < ARRAY_SIZE(table) - 1; i++) {
516		if (val <= table[i + 1]) {
517			expo  = val - table[i];
518			if (i)
519				expo += 300;
520			expo |= i << 11;
521			break;
522		}
523	}
524
525	gspca_dev->usb_buf[0] = expo;
526	gspca_dev->usb_buf[1] = expo >> 8;
527	reg_w_buf(gspca_dev, 0x8309, 2);
528}
529
530/* rev 12a only */
531static void setgain(struct gspca_dev *gspca_dev, s32 val)
532{
533	/* gain reg low 6 bits  0-63 gain, bit 6 and 7, both double the
534	   sensitivity when set, so 31 + one of them set == 63, and 15
535	   with both of them set == 63 */
536	if (val < 64)
537		gspca_dev->usb_buf[0] = val;
538	else if (val < 128)
539		gspca_dev->usb_buf[0] = (val / 2) | 0x40;
540	else
541		gspca_dev->usb_buf[0] = (val / 4) | 0xc0;
542
543	gspca_dev->usb_buf[1] = 0;
544	reg_w_buf(gspca_dev, 0x8335, 2);
545}
546
547static void setautogain(struct gspca_dev *gspca_dev, s32 val)
548{
549	struct sd *sd = (struct sd *) gspca_dev;
550
551	if (val)
552		sd->ag_cnt = AG_CNT_START;
553	else
554		sd->ag_cnt = -1;
555}
556
557static int sd_start_12a(struct gspca_dev *gspca_dev)
558{
559	int mode;
560	static const __u8 Reg8391[8] =
561		{0x92, 0x30, 0x20, 0x00, 0x0c, 0x00, 0x00, 0x00};
562
563	mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv;
564	if (mode <= 1) {
565		/* Use compression on 320x240 and above */
566		reg_w_val(gspca_dev, 0x8500, 0x10 | mode);
567	} else {
568		/* I couldn't get the compression to work below 320x240
569		 * Fortunately at these resolutions the bandwidth
570		 * is sufficient to push raw frames at ~20fps */
571		reg_w_val(gspca_dev, 0x8500, mode);
572	}		/* -- qq@kuku.eu.org */
573
574	gspca_dev->usb_buf[0] = 0xaa;
575	gspca_dev->usb_buf[1] = 0x00;
576	reg_w_buf(gspca_dev, 0x8307, 2);
577	/* clock - lower 0x8X values lead to fps > 30 */
578	reg_w_val(gspca_dev, 0x8700, 0x8a);
579					/* 0x8f 0x85 0x27 clock */
580	reg_w_val(gspca_dev, 0x8112, 0x1e | 0x20);
581	reg_w_val(gspca_dev, 0x850b, 0x03);
582	memcpy(gspca_dev->usb_buf, Reg8391, 8);
583	reg_w_buf(gspca_dev, 0x8391, 8);
584	reg_w_buf(gspca_dev, 0x8390, 8);
585
586	/* Led ON (bit 3 -> 0 */
587	reg_w_val(gspca_dev, 0x8114, 0x00);
588	return 0;
589}
590static int sd_start_72a(struct gspca_dev *gspca_dev)
591{
592	struct sd *sd = (struct sd *) gspca_dev;
593	int Clck;
594	int mode;
595
596	write_vector(gspca_dev, rev72a_reset);
597	msleep(200);
598	write_vector(gspca_dev, rev72a_init_data1);
599	write_sensor_72a(gspca_dev, rev72a_init_sensor1);
600
601	mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv;
602	switch (mode) {
603	default:
604	case 0:
605		Clck = 0x27;		/* ms-win 0x87 */
606		break;
607	case 1:
608		Clck = 0x25;
609		break;
610	case 2:
611		Clck = 0x22;
612		break;
613	case 3:
614		Clck = 0x21;
615		break;
616	}
617	reg_w_val(gspca_dev, 0x8700, Clck);	/* 0x27 clock */
618	reg_w_val(gspca_dev, 0x8702, 0x81);
619	reg_w_val(gspca_dev, 0x8500, mode);	/* mode */
620	write_sensor_72a(gspca_dev, rev72a_init_sensor2);
621	setwhite(gspca_dev, v4l2_ctrl_g_ctrl(sd->hue),
622			v4l2_ctrl_g_ctrl(sd->contrast));
623/*	setbrightness(gspca_dev);	 * fixme: bad values */
624	setautogain(gspca_dev, v4l2_ctrl_g_ctrl(sd->autogain));
625	reg_w_val(gspca_dev, 0x8112, 0x10 | 0x20);
626	return 0;
627}
628
629static void sd_stopN(struct gspca_dev *gspca_dev)
630{
631	struct sd *sd = (struct sd *) gspca_dev;
632
633	if (sd->chip_revision == Rev012A) {
634		reg_w_val(gspca_dev, 0x8112, 0x0e);
635		/* Led Off (bit 3 -> 1 */
636		reg_w_val(gspca_dev, 0x8114, 0x08);
637	} else {
638		reg_w_val(gspca_dev, 0x8112, 0x20);
639/*		reg_w_val(gspca_dev, 0x8102, 0x00); ?? */
640	}
641}
642
643static void do_autogain(struct gspca_dev *gspca_dev)
644{
645	struct sd *sd = (struct sd *) gspca_dev;
646	int expotimes;
647	int pixelclk;
648	int gainG;
649	__u8 R, Gr, Gb, B;
650	int y;
651	__u8 luma_mean = 110;
652	__u8 luma_delta = 20;
653	__u8 spring = 4;
654
655	if (sd->ag_cnt < 0)
656		return;
657	if (--sd->ag_cnt >= 0)
658		return;
659	sd->ag_cnt = AG_CNT_START;
660
661	switch (sd->chip_revision) {
662	case Rev072A:
663		reg_r(gspca_dev, 0x8621, 1);
664		Gr = gspca_dev->usb_buf[0];
665		reg_r(gspca_dev, 0x8622, 1);
666		R = gspca_dev->usb_buf[0];
667		reg_r(gspca_dev, 0x8623, 1);
668		B = gspca_dev->usb_buf[0];
669		reg_r(gspca_dev, 0x8624, 1);
670		Gb = gspca_dev->usb_buf[0];
671		y = (77 * R + 75 * (Gr + Gb) + 29 * B) >> 8;
672		/* u= (128*B-(43*(Gr+Gb+R))) >> 8; */
673		/* v= (128*R-(53*(Gr+Gb))-21*B) >> 8; */
674
675		if (y < luma_mean - luma_delta ||
676		    y > luma_mean + luma_delta) {
677			expotimes = i2c_read(gspca_dev, 0x09, 0x10);
678			pixelclk = 0x0800;
679			expotimes = expotimes & 0x07ff;
680			gainG = i2c_read(gspca_dev, 0x35, 0x10);
681
682			expotimes += (luma_mean - y) >> spring;
683			gainG += (luma_mean - y) / 50;
684
685			if (gainG > 0x3f)
686				gainG = 0x3f;
687			else if (gainG < 3)
688				gainG = 3;
689			i2c_write(gspca_dev, gainG, 0x35);
690
691			if (expotimes > 0x0256)
692				expotimes = 0x0256;
693			else if (expotimes < 3)
694				expotimes = 3;
695			i2c_write(gspca_dev, expotimes | pixelclk, 0x09);
696		}
697		break;
698	}
699}
700
701static void sd_pkt_scan(struct gspca_dev *gspca_dev,
702			u8 *data,		/* isoc packet */
703			int len)		/* iso packet length */
704{
705	struct sd *sd = (struct sd *) gspca_dev;
706
707	len--;
708	switch (*data++) {			/* sequence number */
709	case 0:					/* start of frame */
710		gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
711
712		/* This should never happen */
713		if (len < 2) {
714			gspca_err(gspca_dev, "Short SOF packet, ignoring\n\n\n\n\n");
715			gspca_dev->last_packet_type = DISCARD_PACKET;
716			return;
717		}
718
719#if IS_ENABLED(CONFIG_INPUT)
720		if (data[0] & 0x20) {
721			input_report_key(gspca_dev->input_dev, KEY_CAMERA, 1);
722			input_sync(gspca_dev->input_dev);
723			input_report_key(gspca_dev->input_dev, KEY_CAMERA, 0);
724			input_sync(gspca_dev->input_dev);
725		}
726#endif
727
728		if (data[1] & 0x10) {
729			/* compressed bayer */
730			gspca_frame_add(gspca_dev, FIRST_PACKET, data, len);
731		} else {
732			/* raw bayer (with a header, which we skip) */
733			if (sd->chip_revision == Rev012A) {
734				data += 20;
735				len -= 20;
736			} else {
737				data += 16;
738				len -= 16;
739			}
740			gspca_frame_add(gspca_dev, FIRST_PACKET, data, len);
741		}
742		return;
743	case 0xff:			/* drop (empty mpackets) */
744		return;
745	}
746	gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
747}
748
749static int sd_s_ctrl(struct v4l2_ctrl *ctrl)
750{
751	struct gspca_dev *gspca_dev =
752		container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
753	struct sd *sd = (struct sd *)gspca_dev;
754
755	gspca_dev->usb_err = 0;
756
757	if (!gspca_dev->streaming)
758		return 0;
759
760	switch (ctrl->id) {
761	case V4L2_CID_BRIGHTNESS:
762		setbrightness(gspca_dev, ctrl->val);
763		break;
764	case V4L2_CID_CONTRAST:
765		/* hue/contrast control cluster for 72a */
766		setwhite(gspca_dev, sd->hue->val, ctrl->val);
767		break;
768	case V4L2_CID_HUE:
769		/* just plain hue control for 12a */
770		setwhite(gspca_dev, ctrl->val, 0);
771		break;
772	case V4L2_CID_EXPOSURE:
773		setexposure(gspca_dev, ctrl->val);
774		break;
775	case V4L2_CID_GAIN:
776		setgain(gspca_dev, ctrl->val);
777		break;
778	case V4L2_CID_AUTOGAIN:
779		setautogain(gspca_dev, ctrl->val);
780		break;
781	}
782	return gspca_dev->usb_err;
783}
784
785static const struct v4l2_ctrl_ops sd_ctrl_ops = {
786	.s_ctrl = sd_s_ctrl,
787};
788
789static int sd_init_controls_12a(struct gspca_dev *gspca_dev)
790{
791	struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler;
792
793	gspca_dev->vdev.ctrl_handler = hdl;
794	v4l2_ctrl_handler_init(hdl, 3);
795	v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
796			V4L2_CID_HUE, 1, 0x7f, 1, 0x40);
797	v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
798			V4L2_CID_BRIGHTNESS, -128, 127, 1, 0);
799	v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
800			V4L2_CID_EXPOSURE, 1, EXPOSURE_MAX, 1, 700);
801	v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
802			V4L2_CID_GAIN, 0, 255, 1, 63);
803
804	if (hdl->error) {
805		pr_err("Could not initialize controls\n");
806		return hdl->error;
807	}
808	return 0;
809}
810
811static int sd_init_controls_72a(struct gspca_dev *gspca_dev)
812{
813	struct sd *sd = (struct sd *)gspca_dev;
814	struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler;
815
816	gspca_dev->vdev.ctrl_handler = hdl;
817	v4l2_ctrl_handler_init(hdl, 4);
818	sd->contrast = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
819			V4L2_CID_CONTRAST, 0, 0x3f, 1, 0x20);
820	sd->hue = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
821			V4L2_CID_HUE, 1, 0x7f, 1, 0x40);
822	v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
823			V4L2_CID_BRIGHTNESS, 0, 0x3f, 1, 0x20);
824	sd->autogain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
825			V4L2_CID_AUTOGAIN, 0, 1, 1, 1);
826
827	if (hdl->error) {
828		pr_err("Could not initialize controls\n");
829		return hdl->error;
830	}
831	v4l2_ctrl_cluster(2, &sd->contrast);
832	return 0;
833}
834
835/* sub-driver description */
836static const struct sd_desc sd_desc_12a = {
837	.name = MODULE_NAME,
838	.init_controls = sd_init_controls_12a,
839	.config = sd_config,
840	.init = sd_init_12a,
841	.start = sd_start_12a,
842	.stopN = sd_stopN,
843	.pkt_scan = sd_pkt_scan,
844#if IS_ENABLED(CONFIG_INPUT)
845	.other_input = 1,
846#endif
847};
848static const struct sd_desc sd_desc_72a = {
849	.name = MODULE_NAME,
850	.init_controls = sd_init_controls_72a,
851	.config = sd_config,
852	.init = sd_init_72a,
853	.start = sd_start_72a,
854	.stopN = sd_stopN,
855	.pkt_scan = sd_pkt_scan,
856	.dq_callback = do_autogain,
857#if IS_ENABLED(CONFIG_INPUT)
858	.other_input = 1,
859#endif
860};
861static const struct sd_desc *sd_desc[2] = {
862	&sd_desc_12a,
863	&sd_desc_72a
864};
865
866/* -- module initialisation -- */
867static const struct usb_device_id device_table[] = {
868	{USB_DEVICE(0x041e, 0x401a), .driver_info = Rev072A},
869	{USB_DEVICE(0x041e, 0x403b), .driver_info = Rev012A},
870	{USB_DEVICE(0x0458, 0x7004), .driver_info = Rev072A},
871	{USB_DEVICE(0x0461, 0x0815), .driver_info = Rev072A},
872	{USB_DEVICE(0x046d, 0x0928), .driver_info = Rev012A},
873	{USB_DEVICE(0x046d, 0x0929), .driver_info = Rev012A},
874	{USB_DEVICE(0x046d, 0x092a), .driver_info = Rev012A},
875	{USB_DEVICE(0x046d, 0x092b), .driver_info = Rev012A},
876	{USB_DEVICE(0x046d, 0x092c), .driver_info = Rev012A},
877	{USB_DEVICE(0x046d, 0x092d), .driver_info = Rev012A},
878	{USB_DEVICE(0x046d, 0x092e), .driver_info = Rev012A},
879	{USB_DEVICE(0x046d, 0x092f), .driver_info = Rev012A},
880	{USB_DEVICE(0x04fc, 0x0561), .driver_info = Rev072A},
881	{USB_DEVICE(0x060b, 0xa001), .driver_info = Rev072A},
882	{USB_DEVICE(0x10fd, 0x7e50), .driver_info = Rev072A},
883	{USB_DEVICE(0xabcd, 0xcdee), .driver_info = Rev072A},
884	{}
885};
886
887MODULE_DEVICE_TABLE(usb, device_table);
888
889/* -- device connect -- */
890static int sd_probe(struct usb_interface *intf,
891		    const struct usb_device_id *id)
892{
893	return gspca_dev_probe(intf, id,
894				sd_desc[id->driver_info],
895				sizeof(struct sd),
896			       THIS_MODULE);
897}
898
899static struct usb_driver sd_driver = {
900	.name = MODULE_NAME,
901	.id_table = device_table,
902	.probe = sd_probe,
903	.disconnect = gspca_disconnect,
904#ifdef CONFIG_PM
905	.suspend = gspca_suspend,
906	.resume = gspca_resume,
907	.reset_resume = gspca_resume,
908#endif
909};
910
911module_usb_driver(sd_driver);
912