1/*
2 * Pixart PAC7302 driver
3 *
4 * Copyright (C) 2008-2012 Jean-Francois Moine <http://moinejf.free.fr>
5 * Copyright (C) 2005 Thomas Kaiser thomas@kaiser-linux.li
6 *
7 * Separated from Pixart PAC7311 library by Márton Németh
8 * Camera button input handling by Márton Németh <nm127@freemail.hu>
9 * Copyright (C) 2009-2010 Márton Németh <nm127@freemail.hu>
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 */
25
26/*
27 * Some documentation about various registers as determined by trial and error.
28 *
29 * Register page 0:
30 *
31 * Address	Description
32 * 0x01		Red balance control
33 * 0x02		Green balance control
34 * 0x03		Blue balance control
35 *		     The Windows driver uses a quadratic approach to map
36 *		     the settable values (0-200) on register values:
37 *		     min=0x20, default=0x40, max=0x80
38 * 0x0f-0x20	Color and saturation control
39 * 0xa2-0xab	Brightness, contrast and gamma control
40 * 0xb6		Sharpness control (bits 0-4)
41 *
42 * Register page 1:
43 *
44 * Address	Description
45 * 0x78		Global control, bit 6 controls the LED (inverted)
46 * 0x80		Compression balance, 2 interesting settings:
47 *		0x0f Default
48 *		0x50 Values >= this switch the camera to a lower compression,
49 *		     using the same table for both luminance and chrominance.
50 *		     This gives a sharper picture. Only usable when running
51 *		     at < 15 fps! Note currently the driver does not use this
52 *		     as the quality gain is small and the generated JPG-s are
53 *		     only understood by v4l-utils >= 0.8.9
54 *
55 * Register page 3:
56 *
57 * Address	Description
58 * 0x02		Clock divider 3-63, fps = 90 / val. Must be a multiple of 3 on
59 *		the 7302, so one of 3, 6, 9, ..., except when between 6 and 12?
60 * 0x03		Variable framerate ctrl reg2==3: 0 -> ~30 fps, 255 -> ~22fps
61 * 0x04		Another var framerate ctrl reg2==3, reg3==0: 0 -> ~30 fps,
62 *		63 -> ~27 fps, the 2 msb's must always be 1 !!
63 * 0x05		Another var framerate ctrl reg2==3, reg3==0, reg4==0xc0:
64 *		1 -> ~30 fps, 2 -> ~20 fps
65 * 0x0e		Exposure bits 0-7, 0-448, 0 = use full frame time
66 * 0x0f		Exposure bit 8, 0-448, 448 = no exposure at all
67 * 0x10		Gain 0-31
68 * 0x12		Another gain 0-31, unlike 0x10 this one seems to start with an
69 *		amplification value of 1 rather then 0 at its lowest setting
70 * 0x21		Bitfield: 0-1 unused, 2-3 vflip/hflip, 4-5 unknown, 6-7 unused
71 * 0x80		Another framerate control, best left at 1, moving it from 1 to
72 *		2 causes the framerate to become 3/4th of what it was, and
73 *		also seems to cause pixel averaging, resulting in an effective
74 *		resolution of 320x240 and thus a much blockier image
75 *
76 * The registers are accessed in the following functions:
77 *
78 * Page | Register   | Function
79 * -----+------------+---------------------------------------------------
80 *  0   | 0x01       | setredbalance()
81 *  0   | 0x03       | setbluebalance()
82 *  0   | 0x0f..0x20 | setcolors()
83 *  0   | 0xa2..0xab | setbrightcont()
84 *  0   | 0xb6       | setsharpness()
85 *  0   | 0xc6       | setwhitebalance()
86 *  0   | 0xdc       | setbrightcont(), setcolors()
87 *  3   | 0x02       | setexposure()
88 *  3   | 0x10, 0x12 | setgain()
89 *  3   | 0x11       | setcolors(), setgain(), setexposure(), sethvflip()
90 *  3   | 0x21       | sethvflip()
91 */
92
93#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
94
95#include <linux/input.h>
96#include "gspca.h"
97/* Include pac common sof detection functions */
98#include "pac_common.h"
99
100#define PAC7302_RGB_BALANCE_MIN		  0
101#define PAC7302_RGB_BALANCE_MAX		200
102#define PAC7302_RGB_BALANCE_DEFAULT	100
103#define PAC7302_GAIN_DEFAULT		 15
104#define PAC7302_GAIN_KNEE		 42
105#define PAC7302_EXPOSURE_DEFAULT	 66 /* 33 ms / 30 fps */
106#define PAC7302_EXPOSURE_KNEE		133 /* 66 ms / 15 fps */
107
108MODULE_AUTHOR("Jean-Francois Moine <http://moinejf.free.fr>, "
109		"Thomas Kaiser thomas@kaiser-linux.li");
110MODULE_DESCRIPTION("Pixart PAC7302");
111MODULE_LICENSE("GPL");
112
113struct sd {
114	struct gspca_dev gspca_dev;		/* !! must be the first item */
115
116	struct { /* brightness / contrast cluster */
117		struct v4l2_ctrl *brightness;
118		struct v4l2_ctrl *contrast;
119	};
120	struct v4l2_ctrl *saturation;
121	struct v4l2_ctrl *white_balance;
122	struct v4l2_ctrl *red_balance;
123	struct v4l2_ctrl *blue_balance;
124	struct { /* flip cluster */
125		struct v4l2_ctrl *hflip;
126		struct v4l2_ctrl *vflip;
127	};
128	struct v4l2_ctrl *sharpness;
129	u8 flags;
130#define FL_HFLIP 0x01		/* mirrored by default */
131#define FL_VFLIP 0x02		/* vertical flipped by default */
132
133	u8 sof_read;
134	s8 autogain_ignore_frames;
135
136	atomic_t avg_lum;
137};
138
139static const struct v4l2_pix_format vga_mode[] = {
140	{640, 480, V4L2_PIX_FMT_PJPG, V4L2_FIELD_NONE,
141		.bytesperline = 640,
142		.sizeimage = 640 * 480 * 3 / 8 + 590,
143		.colorspace = V4L2_COLORSPACE_JPEG,
144	},
145};
146
147#define LOAD_PAGE3		255
148#define END_OF_SEQUENCE		0
149
150static const u8 init_7302[] = {
151/*	index,value */
152	0xff, 0x01,		/* page 1 */
153	0x78, 0x00,		/* deactivate */
154	0xff, 0x01,
155	0x78, 0x40,		/* led off */
156};
157static const u8 start_7302[] = {
158/*	index, len, [value]* */
159	0xff, 1,	0x00,		/* page 0 */
160	0x00, 12,	0x01, 0x40, 0x40, 0x40, 0x01, 0xe0, 0x02, 0x80,
161			0x00, 0x00, 0x00, 0x00,
162	0x0d, 24,	0x03, 0x01, 0x00, 0xb5, 0x07, 0xcb, 0x00, 0x00,
163			0x07, 0xc8, 0x00, 0xea, 0x07, 0xcf, 0x07, 0xf7,
164			0x07, 0x7e, 0x01, 0x0b, 0x00, 0x00, 0x00, 0x11,
165	0x26, 2,	0xaa, 0xaa,
166	0x2e, 1,	0x31,
167	0x38, 1,	0x01,
168	0x3a, 3,	0x14, 0xff, 0x5a,
169	0x43, 11,	0x00, 0x0a, 0x18, 0x11, 0x01, 0x2c, 0x88, 0x11,
170			0x00, 0x54, 0x11,
171	0x55, 1,	0x00,
172	0x62, 4,	0x10, 0x1e, 0x1e, 0x18,
173	0x6b, 1,	0x00,
174	0x6e, 3,	0x08, 0x06, 0x00,
175	0x72, 3,	0x00, 0xff, 0x00,
176	0x7d, 23,	0x01, 0x01, 0x58, 0x46, 0x50, 0x3c, 0x50, 0x3c,
177			0x54, 0x46, 0x54, 0x56, 0x52, 0x50, 0x52, 0x50,
178			0x56, 0x64, 0xa4, 0x00, 0xda, 0x00, 0x00,
179	0xa2, 10,	0x22, 0x2c, 0x3c, 0x54, 0x69, 0x7c, 0x9c, 0xb9,
180			0xd2, 0xeb,
181	0xaf, 1,	0x02,
182	0xb5, 2,	0x08, 0x08,
183	0xb8, 2,	0x08, 0x88,
184	0xc4, 4,	0xae, 0x01, 0x04, 0x01,
185	0xcc, 1,	0x00,
186	0xd1, 11,	0x01, 0x30, 0x49, 0x5e, 0x6f, 0x7f, 0x8e, 0xa9,
187			0xc1, 0xd7, 0xec,
188	0xdc, 1,	0x01,
189	0xff, 1,	0x01,		/* page 1 */
190	0x12, 3,	0x02, 0x00, 0x01,
191	0x3e, 2,	0x00, 0x00,
192	0x76, 5,	0x01, 0x20, 0x40, 0x00, 0xf2,
193	0x7c, 1,	0x00,
194	0x7f, 10,	0x4b, 0x0f, 0x01, 0x2c, 0x02, 0x58, 0x03, 0x20,
195			0x02, 0x00,
196	0x96, 5,	0x01, 0x10, 0x04, 0x01, 0x04,
197	0xc8, 14,	0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
198			0x07, 0x00, 0x01, 0x07, 0x04, 0x01,
199	0xd8, 1,	0x01,
200	0xdb, 2,	0x00, 0x01,
201	0xde, 7,	0x00, 0x01, 0x04, 0x04, 0x00, 0x00, 0x00,
202	0xe6, 4,	0x00, 0x00, 0x00, 0x01,
203	0xeb, 1,	0x00,
204	0xff, 1,	0x02,		/* page 2 */
205	0x22, 1,	0x00,
206	0xff, 1,	0x03,		/* page 3 */
207	0, LOAD_PAGE3,			/* load the page 3 */
208	0x11, 1,	0x01,
209	0xff, 1,	0x02,		/* page 2 */
210	0x13, 1,	0x00,
211	0x22, 4,	0x1f, 0xa4, 0xf0, 0x96,
212	0x27, 2,	0x14, 0x0c,
213	0x2a, 5,	0xc8, 0x00, 0x18, 0x12, 0x22,
214	0x64, 8,	0x00, 0x00, 0xf0, 0x01, 0x14, 0x44, 0x44, 0x44,
215	0x6e, 1,	0x08,
216	0xff, 1,	0x01,		/* page 1 */
217	0x78, 1,	0x00,
218	0, END_OF_SEQUENCE		/* end of sequence */
219};
220
221#define SKIP		0xaa
222/* page 3 - the value SKIP says skip the index - see reg_w_page() */
223static const u8 page3_7302[] = {
224	0x90, 0x40, 0x03, 0x00, 0xc0, 0x01, 0x14, 0x16,
225	0x14, 0x12, 0x00, 0x00, 0x00, 0x02, 0x33, 0x00,
226	0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
227	0x00, 0x00, 0x00, 0x47, 0x01, 0xb3, 0x01, 0x00,
228	0x00, 0x08, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x21,
229	0x00, 0x00, 0x00, 0x54, 0xf4, 0x02, 0x52, 0x54,
230	0xa4, 0xb8, 0xe0, 0x2a, 0xf6, 0x00, 0x00, 0x00,
231	0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
232	0x00, 0xfc, 0x00, 0xf2, 0x1f, 0x04, 0x00, 0x00,
233	SKIP, 0x00, 0x00, 0xc0, 0xc0, 0x10, 0x00, 0x00,
234	0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
235	0x00, 0x40, 0xff, 0x03, 0x19, 0x00, 0x00, 0x00,
236	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
237	0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0xc8, 0xc8,
238	0xc8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50,
239	0x08, 0x10, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00,
240	0x01, 0x00, 0x02, 0x47, 0x00, 0x00, 0x00, 0x00,
241	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
242	0x00, 0x02, 0xfa, 0x00, 0x64, 0x5a, 0x28, 0x00,
243	0x00
244};
245
246static void reg_w_buf(struct gspca_dev *gspca_dev,
247		u8 index,
248		  const u8 *buffer, int len)
249{
250	int ret;
251
252	if (gspca_dev->usb_err < 0)
253		return;
254	memcpy(gspca_dev->usb_buf, buffer, len);
255	ret = usb_control_msg(gspca_dev->dev,
256			usb_sndctrlpipe(gspca_dev->dev, 0),
257			0,		/* request */
258			USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
259			0,		/* value */
260			index, gspca_dev->usb_buf, len,
261			500);
262	if (ret < 0) {
263		pr_err("reg_w_buf failed i: %02x error %d\n",
264		       index, ret);
265		gspca_dev->usb_err = ret;
266	}
267}
268
269
270static void reg_w(struct gspca_dev *gspca_dev,
271		u8 index,
272		u8 value)
273{
274	int ret;
275
276	if (gspca_dev->usb_err < 0)
277		return;
278	gspca_dev->usb_buf[0] = value;
279	ret = usb_control_msg(gspca_dev->dev,
280			usb_sndctrlpipe(gspca_dev->dev, 0),
281			0,			/* request */
282			USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
283			0, index, gspca_dev->usb_buf, 1,
284			500);
285	if (ret < 0) {
286		pr_err("reg_w() failed i: %02x v: %02x error %d\n",
287		       index, value, ret);
288		gspca_dev->usb_err = ret;
289	}
290}
291
292static void reg_w_seq(struct gspca_dev *gspca_dev,
293		const u8 *seq, int len)
294{
295	while (--len >= 0) {
296		reg_w(gspca_dev, seq[0], seq[1]);
297		seq += 2;
298	}
299}
300
301/* load the beginning of a page */
302static void reg_w_page(struct gspca_dev *gspca_dev,
303			const u8 *page, int len)
304{
305	int index;
306	int ret = 0;
307
308	if (gspca_dev->usb_err < 0)
309		return;
310	for (index = 0; index < len; index++) {
311		if (page[index] == SKIP)		/* skip this index */
312			continue;
313		gspca_dev->usb_buf[0] = page[index];
314		ret = usb_control_msg(gspca_dev->dev,
315				usb_sndctrlpipe(gspca_dev->dev, 0),
316				0,			/* request */
317			USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
318				0, index, gspca_dev->usb_buf, 1,
319				500);
320		if (ret < 0) {
321			pr_err("reg_w_page() failed i: %02x v: %02x error %d\n",
322			       index, page[index], ret);
323			gspca_dev->usb_err = ret;
324			break;
325		}
326	}
327}
328
329/* output a variable sequence */
330static void reg_w_var(struct gspca_dev *gspca_dev,
331			const u8 *seq,
332			const u8 *page3, unsigned int page3_len)
333{
334	int index, len;
335
336	for (;;) {
337		index = *seq++;
338		len = *seq++;
339		switch (len) {
340		case END_OF_SEQUENCE:
341			return;
342		case LOAD_PAGE3:
343			reg_w_page(gspca_dev, page3, page3_len);
344			break;
345		default:
346			if (len > USB_BUF_SZ) {
347				PERR("Incorrect variable sequence");
348				return;
349			}
350			while (len > 0) {
351				if (len < 8) {
352					reg_w_buf(gspca_dev,
353						index, seq, len);
354					seq += len;
355					break;
356				}
357				reg_w_buf(gspca_dev, index, seq, 8);
358				seq += 8;
359				index += 8;
360				len -= 8;
361			}
362		}
363	}
364	/* not reached */
365}
366
367/* this function is called at probe time for pac7302 */
368static int sd_config(struct gspca_dev *gspca_dev,
369			const struct usb_device_id *id)
370{
371	struct sd *sd = (struct sd *) gspca_dev;
372	struct cam *cam;
373
374	cam = &gspca_dev->cam;
375
376	cam->cam_mode = vga_mode;	/* only 640x480 */
377	cam->nmodes = ARRAY_SIZE(vga_mode);
378
379	sd->flags = id->driver_info;
380	return 0;
381}
382
383static void setbrightcont(struct gspca_dev *gspca_dev)
384{
385	struct sd *sd = (struct sd *) gspca_dev;
386	int i, v;
387	static const u8 max[10] =
388		{0x29, 0x33, 0x42, 0x5a, 0x6e, 0x80, 0x9f, 0xbb,
389		 0xd4, 0xec};
390	static const u8 delta[10] =
391		{0x35, 0x33, 0x33, 0x2f, 0x2a, 0x25, 0x1e, 0x17,
392		 0x11, 0x0b};
393
394	reg_w(gspca_dev, 0xff, 0x00);		/* page 0 */
395	for (i = 0; i < 10; i++) {
396		v = max[i];
397		v += (sd->brightness->val - (s32)sd->brightness->maximum)
398			* 150 / (s32)sd->brightness->maximum; /* 200 ? */
399		v -= delta[i] * sd->contrast->val / (s32)sd->contrast->maximum;
400		if (v < 0)
401			v = 0;
402		else if (v > 0xff)
403			v = 0xff;
404		reg_w(gspca_dev, 0xa2 + i, v);
405	}
406	reg_w(gspca_dev, 0xdc, 0x01);
407}
408
409static void setcolors(struct gspca_dev *gspca_dev)
410{
411	struct sd *sd = (struct sd *) gspca_dev;
412	int i, v;
413	static const int a[9] =
414		{217, -212, 0, -101, 170, -67, -38, -315, 355};
415	static const int b[9] =
416		{19, 106, 0, 19, 106, 1, 19, 106, 1};
417
418	reg_w(gspca_dev, 0xff, 0x03);			/* page 3 */
419	reg_w(gspca_dev, 0x11, 0x01);
420	reg_w(gspca_dev, 0xff, 0x00);			/* page 0 */
421	for (i = 0; i < 9; i++) {
422		v = a[i] * sd->saturation->val / (s32)sd->saturation->maximum;
423		v += b[i];
424		reg_w(gspca_dev, 0x0f + 2 * i, (v >> 8) & 0x07);
425		reg_w(gspca_dev, 0x0f + 2 * i + 1, v);
426	}
427	reg_w(gspca_dev, 0xdc, 0x01);
428}
429
430static void setwhitebalance(struct gspca_dev *gspca_dev)
431{
432	struct sd *sd = (struct sd *) gspca_dev;
433
434	reg_w(gspca_dev, 0xff, 0x00);		/* page 0 */
435	reg_w(gspca_dev, 0xc6, sd->white_balance->val);
436
437	reg_w(gspca_dev, 0xdc, 0x01);
438}
439
440static u8 rgbbalance_ctrl_to_reg_value(s32 rgb_ctrl_val)
441{
442	const unsigned int k = 1000;	/* precision factor */
443	unsigned int norm;
444
445	/* Normed value [0...k] */
446	norm = k * (rgb_ctrl_val - PAC7302_RGB_BALANCE_MIN)
447		    / (PAC7302_RGB_BALANCE_MAX - PAC7302_RGB_BALANCE_MIN);
448	/* Qudratic apporach improves control at small (register) values: */
449	return 64 * norm * norm / (k*k)  +  32 * norm / k  +  32;
450	/* Y = 64*X*X + 32*X + 32
451	 * => register values 0x20-0x80; Windows driver uses these limits */
452
453	/* NOTE: for full value range (0x00-0xff) use
454	 *         Y = 254*X*X + X
455	 *         => 254 * norm * norm / (k*k)  +  1 * norm / k	*/
456}
457
458static void setredbalance(struct gspca_dev *gspca_dev)
459{
460	struct sd *sd = (struct sd *) gspca_dev;
461
462	reg_w(gspca_dev, 0xff, 0x00);			/* page 0 */
463	reg_w(gspca_dev, 0x01,
464	      rgbbalance_ctrl_to_reg_value(sd->red_balance->val));
465
466	reg_w(gspca_dev, 0xdc, 0x01);
467}
468
469static void setbluebalance(struct gspca_dev *gspca_dev)
470{
471	struct sd *sd = (struct sd *) gspca_dev;
472
473	reg_w(gspca_dev, 0xff, 0x00);			/* page 0 */
474	reg_w(gspca_dev, 0x03,
475	      rgbbalance_ctrl_to_reg_value(sd->blue_balance->val));
476
477	reg_w(gspca_dev, 0xdc, 0x01);
478}
479
480static void setgain(struct gspca_dev *gspca_dev)
481{
482	u8 reg10, reg12;
483
484	if (gspca_dev->gain->val < 32) {
485		reg10 = gspca_dev->gain->val;
486		reg12 = 0;
487	} else {
488		reg10 = 31;
489		reg12 = gspca_dev->gain->val - 31;
490	}
491
492	reg_w(gspca_dev, 0xff, 0x03);			/* page 3 */
493	reg_w(gspca_dev, 0x10, reg10);
494	reg_w(gspca_dev, 0x12, reg12);
495
496	/* load registers to sensor (Bit 0, auto clear) */
497	reg_w(gspca_dev, 0x11, 0x01);
498}
499
500static void setexposure(struct gspca_dev *gspca_dev)
501{
502	u8 clockdiv;
503	u16 exposure;
504
505	/*
506	 * Register 2 of frame 3 contains the clock divider configuring the
507	 * no fps according to the formula: 90 / reg. sd->exposure is the
508	 * desired exposure time in 0.5 ms.
509	 */
510	clockdiv = (90 * gspca_dev->exposure->val + 1999) / 2000;
511
512	/*
513	 * Note clockdiv = 3 also works, but when running at 30 fps, depending
514	 * on the scene being recorded, the camera switches to another
515	 * quantization table for certain JPEG blocks, and we don't know how
516	 * to decompress these blocks. So we cap the framerate at 15 fps.
517	 */
518	if (clockdiv < 6)
519		clockdiv = 6;
520	else if (clockdiv > 63)
521		clockdiv = 63;
522
523	/*
524	 * Register 2 MUST be a multiple of 3, except when between 6 and 12?
525	 * Always round up, otherwise we cannot get the desired frametime
526	 * using the partial frame time exposure control.
527	 */
528	if (clockdiv < 6 || clockdiv > 12)
529		clockdiv = ((clockdiv + 2) / 3) * 3;
530
531	/*
532	 * frame exposure time in ms = 1000 * clockdiv / 90    ->
533	 * exposure = (sd->exposure / 2) * 448 / (1000 * clockdiv / 90)
534	 */
535	exposure = (gspca_dev->exposure->val * 45 * 448) / (1000 * clockdiv);
536	/* 0 = use full frametime, 448 = no exposure, reverse it */
537	exposure = 448 - exposure;
538
539	reg_w(gspca_dev, 0xff, 0x03);			/* page 3 */
540	reg_w(gspca_dev, 0x02, clockdiv);
541	reg_w(gspca_dev, 0x0e, exposure & 0xff);
542	reg_w(gspca_dev, 0x0f, exposure >> 8);
543
544	/* load registers to sensor (Bit 0, auto clear) */
545	reg_w(gspca_dev, 0x11, 0x01);
546}
547
548static void sethvflip(struct gspca_dev *gspca_dev)
549{
550	struct sd *sd = (struct sd *) gspca_dev;
551	u8 data, hflip, vflip;
552
553	hflip = sd->hflip->val;
554	if (sd->flags & FL_HFLIP)
555		hflip = !hflip;
556	vflip = sd->vflip->val;
557	if (sd->flags & FL_VFLIP)
558		vflip = !vflip;
559
560	reg_w(gspca_dev, 0xff, 0x03);			/* page 3 */
561	data = (hflip ? 0x08 : 0x00) | (vflip ? 0x04 : 0x00);
562	reg_w(gspca_dev, 0x21, data);
563
564	/* load registers to sensor (Bit 0, auto clear) */
565	reg_w(gspca_dev, 0x11, 0x01);
566}
567
568static void setsharpness(struct gspca_dev *gspca_dev)
569{
570	struct sd *sd = (struct sd *) gspca_dev;
571
572	reg_w(gspca_dev, 0xff, 0x00);		/* page 0 */
573	reg_w(gspca_dev, 0xb6, sd->sharpness->val);
574
575	reg_w(gspca_dev, 0xdc, 0x01);
576}
577
578/* this function is called at probe and resume time for pac7302 */
579static int sd_init(struct gspca_dev *gspca_dev)
580{
581	reg_w_seq(gspca_dev, init_7302, sizeof(init_7302)/2);
582	return gspca_dev->usb_err;
583}
584
585static int sd_s_ctrl(struct v4l2_ctrl *ctrl)
586{
587	struct gspca_dev *gspca_dev =
588		container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
589	struct sd *sd = (struct sd *)gspca_dev;
590
591	gspca_dev->usb_err = 0;
592
593	if (ctrl->id == V4L2_CID_AUTOGAIN && ctrl->is_new && ctrl->val) {
594		/* when switching to autogain set defaults to make sure
595		   we are on a valid point of the autogain gain /
596		   exposure knee graph, and give this change time to
597		   take effect before doing autogain. */
598		gspca_dev->exposure->val    = PAC7302_EXPOSURE_DEFAULT;
599		gspca_dev->gain->val        = PAC7302_GAIN_DEFAULT;
600		sd->autogain_ignore_frames  = PAC_AUTOGAIN_IGNORE_FRAMES;
601	}
602
603	if (!gspca_dev->streaming)
604		return 0;
605
606	switch (ctrl->id) {
607	case V4L2_CID_BRIGHTNESS:
608		setbrightcont(gspca_dev);
609		break;
610	case V4L2_CID_SATURATION:
611		setcolors(gspca_dev);
612		break;
613	case V4L2_CID_WHITE_BALANCE_TEMPERATURE:
614		setwhitebalance(gspca_dev);
615		break;
616	case V4L2_CID_RED_BALANCE:
617		setredbalance(gspca_dev);
618		break;
619	case V4L2_CID_BLUE_BALANCE:
620		setbluebalance(gspca_dev);
621		break;
622	case V4L2_CID_AUTOGAIN:
623		if (gspca_dev->exposure->is_new || (ctrl->is_new && ctrl->val))
624			setexposure(gspca_dev);
625		if (gspca_dev->gain->is_new || (ctrl->is_new && ctrl->val))
626			setgain(gspca_dev);
627		break;
628	case V4L2_CID_HFLIP:
629		sethvflip(gspca_dev);
630		break;
631	case V4L2_CID_SHARPNESS:
632		setsharpness(gspca_dev);
633		break;
634	default:
635		return -EINVAL;
636	}
637	return gspca_dev->usb_err;
638}
639
640static const struct v4l2_ctrl_ops sd_ctrl_ops = {
641	.s_ctrl = sd_s_ctrl,
642};
643
644/* this function is called at probe time */
645static int sd_init_controls(struct gspca_dev *gspca_dev)
646{
647	struct sd *sd = (struct sd *) gspca_dev;
648	struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler;
649
650	gspca_dev->vdev.ctrl_handler = hdl;
651	v4l2_ctrl_handler_init(hdl, 12);
652
653	sd->brightness = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
654					V4L2_CID_BRIGHTNESS, 0, 32, 1, 16);
655	sd->contrast = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
656					V4L2_CID_CONTRAST, 0, 255, 1, 127);
657
658	sd->saturation = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
659					V4L2_CID_SATURATION, 0, 255, 1, 127);
660	sd->white_balance = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
661					V4L2_CID_WHITE_BALANCE_TEMPERATURE,
662					0, 255, 1, 55);
663	sd->red_balance = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
664					V4L2_CID_RED_BALANCE,
665					PAC7302_RGB_BALANCE_MIN,
666					PAC7302_RGB_BALANCE_MAX,
667					1, PAC7302_RGB_BALANCE_DEFAULT);
668	sd->blue_balance = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
669					V4L2_CID_BLUE_BALANCE,
670					PAC7302_RGB_BALANCE_MIN,
671					PAC7302_RGB_BALANCE_MAX,
672					1, PAC7302_RGB_BALANCE_DEFAULT);
673
674	gspca_dev->autogain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
675					V4L2_CID_AUTOGAIN, 0, 1, 1, 1);
676	gspca_dev->exposure = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
677					V4L2_CID_EXPOSURE, 0, 1023, 1,
678					PAC7302_EXPOSURE_DEFAULT);
679	gspca_dev->gain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
680					V4L2_CID_GAIN, 0, 62, 1,
681					PAC7302_GAIN_DEFAULT);
682
683	sd->hflip = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
684		V4L2_CID_HFLIP, 0, 1, 1, 0);
685	sd->vflip = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
686		V4L2_CID_VFLIP, 0, 1, 1, 0);
687
688	sd->sharpness = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
689					V4L2_CID_SHARPNESS, 0, 15, 1, 8);
690
691	if (hdl->error) {
692		pr_err("Could not initialize controls\n");
693		return hdl->error;
694	}
695
696	v4l2_ctrl_cluster(2, &sd->brightness);
697	v4l2_ctrl_auto_cluster(3, &gspca_dev->autogain, 0, false);
698	v4l2_ctrl_cluster(2, &sd->hflip);
699	return 0;
700}
701
702/* -- start the camera -- */
703static int sd_start(struct gspca_dev *gspca_dev)
704{
705	struct sd *sd = (struct sd *) gspca_dev;
706
707	reg_w_var(gspca_dev, start_7302,
708		page3_7302, sizeof(page3_7302));
709
710	sd->sof_read = 0;
711	sd->autogain_ignore_frames = 0;
712	atomic_set(&sd->avg_lum, 270 + sd->brightness->val);
713
714	/* start stream */
715	reg_w(gspca_dev, 0xff, 0x01);
716	reg_w(gspca_dev, 0x78, 0x01);
717
718	return gspca_dev->usb_err;
719}
720
721static void sd_stopN(struct gspca_dev *gspca_dev)
722{
723
724	/* stop stream */
725	reg_w(gspca_dev, 0xff, 0x01);
726	reg_w(gspca_dev, 0x78, 0x00);
727}
728
729/* called on streamoff with alt 0 and on disconnect for pac7302 */
730static void sd_stop0(struct gspca_dev *gspca_dev)
731{
732	if (!gspca_dev->present)
733		return;
734	reg_w(gspca_dev, 0xff, 0x01);
735	reg_w(gspca_dev, 0x78, 0x40);
736}
737
738static void do_autogain(struct gspca_dev *gspca_dev)
739{
740	struct sd *sd = (struct sd *) gspca_dev;
741	int avg_lum = atomic_read(&sd->avg_lum);
742	int desired_lum;
743	const int deadzone = 30;
744
745	if (sd->autogain_ignore_frames < 0)
746		return;
747
748	if (sd->autogain_ignore_frames > 0) {
749		sd->autogain_ignore_frames--;
750	} else {
751		desired_lum = 270 + sd->brightness->val;
752
753		if (gspca_expo_autogain(gspca_dev, avg_lum, desired_lum,
754					deadzone, PAC7302_GAIN_KNEE,
755					PAC7302_EXPOSURE_KNEE))
756			sd->autogain_ignore_frames =
757						PAC_AUTOGAIN_IGNORE_FRAMES;
758	}
759}
760
761/* JPEG header */
762static const u8 jpeg_header[] = {
763	0xff, 0xd8,	/* SOI: Start of Image */
764
765	0xff, 0xc0,	/* SOF0: Start of Frame (Baseline DCT) */
766	0x00, 0x11,	/* length = 17 bytes (including this length field) */
767	0x08,		/* Precision: 8 */
768	0x02, 0x80,	/* height = 640 (image rotated) */
769	0x01, 0xe0,	/* width = 480 */
770	0x03,		/* Number of image components: 3 */
771	0x01, 0x21, 0x00, /* ID=1, Subsampling 1x1, Quantization table: 0 */
772	0x02, 0x11, 0x01, /* ID=2, Subsampling 2x1, Quantization table: 1 */
773	0x03, 0x11, 0x01, /* ID=3, Subsampling 2x1, Quantization table: 1 */
774
775	0xff, 0xda,	/* SOS: Start Of Scan */
776	0x00, 0x0c,	/* length = 12 bytes (including this length field) */
777	0x03,		/* number of components: 3 */
778	0x01, 0x00,	/* selector 1, table 0x00 */
779	0x02, 0x11,	/* selector 2, table 0x11 */
780	0x03, 0x11,	/* selector 3, table 0x11 */
781	0x00, 0x3f,	/* Spectral selection: 0 .. 63 */
782	0x00		/* Successive approximation: 0 */
783};
784
785/* this function is run at interrupt level */
786static void sd_pkt_scan(struct gspca_dev *gspca_dev,
787			u8 *data,			/* isoc packet */
788			int len)			/* iso packet length */
789{
790	struct sd *sd = (struct sd *) gspca_dev;
791	u8 *image;
792	u8 *sof;
793
794	sof = pac_find_sof(gspca_dev, &sd->sof_read, data, len);
795	if (sof) {
796		int n, lum_offset, footer_length;
797
798		/*
799		 * 6 bytes after the FF D9 EOF marker a number of lumination
800		 * bytes are send corresponding to different parts of the
801		 * image, the 14th and 15th byte after the EOF seem to
802		 * correspond to the center of the image.
803		 */
804		lum_offset = 61 + sizeof pac_sof_marker;
805		footer_length = 74;
806
807		/* Finish decoding current frame */
808		n = (sof - data) - (footer_length + sizeof pac_sof_marker);
809		if (n < 0) {
810			gspca_dev->image_len += n;
811			n = 0;
812		} else {
813			gspca_frame_add(gspca_dev, INTER_PACKET, data, n);
814		}
815
816		image = gspca_dev->image;
817		if (image != NULL
818		 && image[gspca_dev->image_len - 2] == 0xff
819		 && image[gspca_dev->image_len - 1] == 0xd9)
820			gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
821
822		n = sof - data;
823		len -= n;
824		data = sof;
825
826		/* Get average lumination */
827		if (gspca_dev->last_packet_type == LAST_PACKET &&
828				n >= lum_offset)
829			atomic_set(&sd->avg_lum, data[-lum_offset] +
830						data[-lum_offset + 1]);
831
832		/* Start the new frame with the jpeg header */
833		/* The PAC7302 has the image rotated 90 degrees */
834		gspca_frame_add(gspca_dev, FIRST_PACKET,
835				jpeg_header, sizeof jpeg_header);
836	}
837	gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
838}
839
840#ifdef CONFIG_VIDEO_ADV_DEBUG
841static int sd_dbg_s_register(struct gspca_dev *gspca_dev,
842			const struct v4l2_dbg_register *reg)
843{
844	u8 index;
845	u8 value;
846
847	/*
848	 * reg->reg: bit0..15: reserved for register index (wIndex is 16bit
849	 *		       long on the USB bus)
850	 */
851	if (reg->match.addr == 0 &&
852	    (reg->reg < 0x000000ff) &&
853	    (reg->val <= 0x000000ff)
854	) {
855		/* Currently writing to page 0 is only supported. */
856		/* reg_w() only supports 8bit index */
857		index = reg->reg;
858		value = reg->val;
859
860		/*
861		 * Note that there shall be no access to other page
862		 * by any other function between the page switch and
863		 * the actual register write.
864		 */
865		reg_w(gspca_dev, 0xff, 0x00);		/* page 0 */
866		reg_w(gspca_dev, index, value);
867
868		reg_w(gspca_dev, 0xdc, 0x01);
869	}
870	return gspca_dev->usb_err;
871}
872#endif
873
874#if IS_ENABLED(CONFIG_INPUT)
875static int sd_int_pkt_scan(struct gspca_dev *gspca_dev,
876			u8 *data,		/* interrupt packet data */
877			int len)		/* interrupt packet length */
878{
879	int ret = -EINVAL;
880	u8 data0, data1;
881
882	if (len == 2) {
883		data0 = data[0];
884		data1 = data[1];
885		if ((data0 == 0x00 && data1 == 0x11) ||
886		    (data0 == 0x22 && data1 == 0x33) ||
887		    (data0 == 0x44 && data1 == 0x55) ||
888		    (data0 == 0x66 && data1 == 0x77) ||
889		    (data0 == 0x88 && data1 == 0x99) ||
890		    (data0 == 0xaa && data1 == 0xbb) ||
891		    (data0 == 0xcc && data1 == 0xdd) ||
892		    (data0 == 0xee && data1 == 0xff)) {
893			input_report_key(gspca_dev->input_dev, KEY_CAMERA, 1);
894			input_sync(gspca_dev->input_dev);
895			input_report_key(gspca_dev->input_dev, KEY_CAMERA, 0);
896			input_sync(gspca_dev->input_dev);
897			ret = 0;
898		}
899	}
900
901	return ret;
902}
903#endif
904
905/* sub-driver description for pac7302 */
906static const struct sd_desc sd_desc = {
907	.name = KBUILD_MODNAME,
908	.config = sd_config,
909	.init = sd_init,
910	.init_controls = sd_init_controls,
911	.start = sd_start,
912	.stopN = sd_stopN,
913	.stop0 = sd_stop0,
914	.pkt_scan = sd_pkt_scan,
915	.dq_callback = do_autogain,
916#ifdef CONFIG_VIDEO_ADV_DEBUG
917	.set_register = sd_dbg_s_register,
918#endif
919#if IS_ENABLED(CONFIG_INPUT)
920	.int_pkt_scan = sd_int_pkt_scan,
921#endif
922};
923
924/* -- module initialisation -- */
925static const struct usb_device_id device_table[] = {
926	{USB_DEVICE(0x06f8, 0x3009)},
927	{USB_DEVICE(0x06f8, 0x301b)},
928	{USB_DEVICE(0x093a, 0x2620)},
929	{USB_DEVICE(0x093a, 0x2621)},
930	{USB_DEVICE(0x093a, 0x2622), .driver_info = FL_VFLIP},
931	{USB_DEVICE(0x093a, 0x2623), .driver_info = FL_VFLIP},
932	{USB_DEVICE(0x093a, 0x2624), .driver_info = FL_VFLIP},
933	{USB_DEVICE(0x093a, 0x2625)},
934	{USB_DEVICE(0x093a, 0x2626)},
935	{USB_DEVICE(0x093a, 0x2627), .driver_info = FL_VFLIP},
936	{USB_DEVICE(0x093a, 0x2628)},
937	{USB_DEVICE(0x093a, 0x2629), .driver_info = FL_VFLIP},
938	{USB_DEVICE(0x093a, 0x262a)},
939	{USB_DEVICE(0x093a, 0x262c)},
940	{USB_DEVICE(0x145f, 0x013c)},
941	{USB_DEVICE(0x1ae7, 0x2001)}, /* SpeedLink Snappy Mic SL-6825-SBK */
942	{}
943};
944MODULE_DEVICE_TABLE(usb, device_table);
945
946/* -- device connect -- */
947static int sd_probe(struct usb_interface *intf,
948			const struct usb_device_id *id)
949{
950	return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd),
951				THIS_MODULE);
952}
953
954static struct usb_driver sd_driver = {
955	.name = KBUILD_MODNAME,
956	.id_table = device_table,
957	.probe = sd_probe,
958	.disconnect = gspca_disconnect,
959#ifdef CONFIG_PM
960	.suspend = gspca_suspend,
961	.resume = gspca_resume,
962	.reset_resume = gspca_resume,
963#endif
964};
965
966module_usb_driver(sd_driver);
967