xref: /openbmc/linux/drivers/media/i2c/ov9650.c (revision 18095107)
1 /*
2  * Omnivision OV9650/OV9652 CMOS Image Sensor driver
3  *
4  * Copyright (C) 2013, Sylwester Nawrocki <sylvester.nawrocki@gmail.com>
5  *
6  * Register definitions and initial settings based on a driver written
7  * by Vladimir Fonov.
8  * Copyright (c) 2010, Vladimir Fonov
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License version 2 as
12  * published by the Free Software Foundation.
13  */
14 #include <linux/delay.h>
15 #include <linux/gpio.h>
16 #include <linux/i2c.h>
17 #include <linux/kernel.h>
18 #include <linux/media.h>
19 #include <linux/module.h>
20 #include <linux/ratelimit.h>
21 #include <linux/slab.h>
22 #include <linux/string.h>
23 #include <linux/videodev2.h>
24 
25 #include <media/media-entity.h>
26 #include <media/v4l2-ctrls.h>
27 #include <media/v4l2-device.h>
28 #include <media/v4l2-event.h>
29 #include <media/v4l2-image-sizes.h>
30 #include <media/v4l2-subdev.h>
31 #include <media/v4l2-mediabus.h>
32 #include <media/i2c/ov9650.h>
33 
34 static int debug;
35 module_param(debug, int, 0644);
36 MODULE_PARM_DESC(debug, "Debug level (0-2)");
37 
38 #define DRIVER_NAME "OV9650"
39 
40 /*
41  * OV9650/OV9652 register definitions
42  */
43 #define REG_GAIN		0x00	/* Gain control, AGC[7:0] */
44 #define REG_BLUE		0x01	/* AWB - Blue chanel gain */
45 #define REG_RED			0x02	/* AWB - Red chanel gain */
46 #define REG_VREF		0x03	/* [7:6] - AGC[9:8], [5:3]/[2:0] */
47 #define  VREF_GAIN_MASK		0xc0	/* - VREF end/start low 3 bits */
48 #define REG_COM1		0x04
49 #define  COM1_CCIR656		0x40
50 #define REG_B_AVE		0x05
51 #define REG_GB_AVE		0x06
52 #define REG_GR_AVE		0x07
53 #define REG_R_AVE		0x08
54 #define REG_COM2		0x09
55 #define REG_PID			0x0a	/* Product ID MSB */
56 #define REG_VER			0x0b	/* Product ID LSB */
57 #define REG_COM3		0x0c
58 #define  COM3_SWAP		0x40
59 #define  COM3_VARIOPIXEL1	0x04
60 #define REG_COM4		0x0d	/* Vario Pixels  */
61 #define  COM4_VARIOPIXEL2	0x80
62 #define REG_COM5		0x0e	/* System clock options */
63 #define  COM5_SLAVE_MODE	0x10
64 #define  COM5_SYSTEMCLOCK48MHZ	0x80
65 #define REG_COM6		0x0f	/* HREF & ADBLC options */
66 #define REG_AECH		0x10	/* Exposure value, AEC[9:2] */
67 #define REG_CLKRC		0x11	/* Clock control */
68 #define  CLK_EXT		0x40	/* Use external clock directly */
69 #define  CLK_SCALE		0x3f	/* Mask for internal clock scale */
70 #define REG_COM7		0x12	/* SCCB reset, output format */
71 #define  COM7_RESET		0x80
72 #define  COM7_FMT_MASK		0x38
73 #define  COM7_FMT_VGA		0x40
74 #define	 COM7_FMT_CIF		0x20
75 #define  COM7_FMT_QVGA		0x10
76 #define  COM7_FMT_QCIF		0x08
77 #define	 COM7_RGB		0x04
78 #define	 COM7_YUV		0x00
79 #define	 COM7_BAYER		0x01
80 #define	 COM7_PBAYER		0x05
81 #define REG_COM8		0x13	/* AGC/AEC options */
82 #define  COM8_FASTAEC		0x80	/* Enable fast AGC/AEC */
83 #define  COM8_AECSTEP		0x40	/* Unlimited AEC step size */
84 #define  COM8_BFILT		0x20	/* Band filter enable */
85 #define  COM8_AGC		0x04	/* Auto gain enable */
86 #define  COM8_AWB		0x02	/* White balance enable */
87 #define  COM8_AEC		0x01	/* Auto exposure enable */
88 #define REG_COM9		0x14	/* Gain ceiling */
89 #define  COM9_GAIN_CEIL_MASK	0x70	/* */
90 #define REG_COM10		0x15	/* PCLK, HREF, HSYNC signals polarity */
91 #define  COM10_HSYNC		0x40	/* HSYNC instead of HREF */
92 #define  COM10_PCLK_HB		0x20	/* Suppress PCLK on horiz blank */
93 #define  COM10_HREF_REV		0x08	/* Reverse HREF */
94 #define  COM10_VS_LEAD		0x04	/* VSYNC on clock leading edge */
95 #define  COM10_VS_NEG		0x02	/* VSYNC negative */
96 #define  COM10_HS_NEG		0x01	/* HSYNC negative */
97 #define REG_HSTART		0x17	/* Horiz start high bits */
98 #define REG_HSTOP		0x18	/* Horiz stop high bits */
99 #define REG_VSTART		0x19	/* Vert start high bits */
100 #define REG_VSTOP		0x1a	/* Vert stop high bits */
101 #define REG_PSHFT		0x1b	/* Pixel delay after HREF */
102 #define REG_MIDH		0x1c	/* Manufacturer ID MSB */
103 #define REG_MIDL		0x1d	/* Manufufacturer ID LSB */
104 #define REG_MVFP		0x1e	/* Image mirror/flip */
105 #define  MVFP_MIRROR		0x20	/* Mirror image */
106 #define  MVFP_FLIP		0x10	/* Vertical flip */
107 #define REG_BOS			0x20	/* B channel Offset */
108 #define REG_GBOS		0x21	/* Gb channel Offset */
109 #define REG_GROS		0x22	/* Gr channel Offset */
110 #define REG_ROS			0x23	/* R channel Offset */
111 #define REG_AEW			0x24	/* AGC upper limit */
112 #define REG_AEB			0x25	/* AGC lower limit */
113 #define REG_VPT			0x26	/* AGC/AEC fast mode op region */
114 #define REG_BBIAS		0x27	/* B channel output bias */
115 #define REG_GBBIAS		0x28	/* Gb channel output bias */
116 #define REG_GRCOM		0x29	/* Analog BLC & regulator */
117 #define REG_EXHCH		0x2a	/* Dummy pixel insert MSB */
118 #define REG_EXHCL		0x2b	/* Dummy pixel insert LSB */
119 #define REG_RBIAS		0x2c	/* R channel output bias */
120 #define REG_ADVFL		0x2d	/* LSB of dummy line insert */
121 #define REG_ADVFH		0x2e	/* MSB of dummy line insert */
122 #define REG_YAVE		0x2f	/* Y/G channel average value */
123 #define REG_HSYST		0x30	/* HSYNC rising edge delay LSB*/
124 #define REG_HSYEN		0x31	/* HSYNC falling edge delay LSB*/
125 #define REG_HREF		0x32	/* HREF pieces */
126 #define REG_CHLF		0x33	/* reserved */
127 #define REG_ADC			0x37	/* reserved */
128 #define REG_ACOM		0x38	/* reserved */
129 #define REG_OFON		0x39	/* Power down register */
130 #define  OFON_PWRDN		0x08	/* Power down bit */
131 #define REG_TSLB		0x3a	/* YUVU format */
132 #define  TSLB_YUYV_MASK		0x0c	/* UYVY or VYUY - see com13 */
133 #define REG_COM11		0x3b	/* Night mode, banding filter enable */
134 #define  COM11_NIGHT		0x80	/* Night mode enable */
135 #define  COM11_NMFR		0x60	/* Two bit NM frame rate */
136 #define  COM11_BANDING		0x01	/* Banding filter */
137 #define  COM11_AEC_REF_MASK	0x18	/* AEC reference area selection */
138 #define REG_COM12		0x3c	/* HREF option, UV average */
139 #define  COM12_HREF		0x80	/* HREF always */
140 #define REG_COM13		0x3d	/* Gamma selection, Color matrix en. */
141 #define  COM13_GAMMA		0x80	/* Gamma enable */
142 #define	 COM13_UVSAT		0x40	/* UV saturation auto adjustment */
143 #define  COM13_UVSWAP		0x01	/* V before U - w/TSLB */
144 #define REG_COM14		0x3e	/* Edge enhancement options */
145 #define  COM14_EDGE_EN		0x02
146 #define  COM14_EEF_X2		0x01
147 #define REG_EDGE		0x3f	/* Edge enhancement factor */
148 #define  EDGE_FACTOR_MASK	0x0f
149 #define REG_COM15		0x40	/* Output range, RGB 555/565 */
150 #define  COM15_R10F0		0x00	/* Data range 10 to F0 */
151 #define	 COM15_R01FE		0x80	/* 01 to FE */
152 #define  COM15_R00FF		0xc0	/* 00 to FF */
153 #define  COM15_RGB565		0x10	/* RGB565 output */
154 #define  COM15_RGB555		0x30	/* RGB555 output */
155 #define  COM15_SWAPRB		0x04	/* Swap R&B */
156 #define REG_COM16		0x41	/* Color matrix coeff options */
157 #define REG_COM17		0x42	/* Single frame out, banding filter */
158 /* n = 1...9, 0x4f..0x57 */
159 #define	REG_MTX(__n)		(0x4f + (__n) - 1)
160 #define REG_MTXS		0x58
161 /* Lens Correction Option 1...5, __n = 0...5 */
162 #define REG_LCC(__n)		(0x62 + (__n) - 1)
163 #define  LCC5_LCC_ENABLE	0x01	/* LCC5, enable lens correction */
164 #define  LCC5_LCC_COLOR		0x04
165 #define REG_MANU		0x67	/* Manual U value */
166 #define REG_MANV		0x68	/* Manual V value */
167 #define REG_HV			0x69	/* Manual banding filter MSB */
168 #define REG_MBD			0x6a	/* Manual banding filter value */
169 #define REG_DBLV		0x6b	/* reserved */
170 #define REG_GSP			0x6c	/* Gamma curve */
171 #define  GSP_LEN		15
172 #define REG_GST			0x7c	/* Gamma curve */
173 #define  GST_LEN		15
174 #define REG_COM21		0x8b
175 #define REG_COM22		0x8c	/* Edge enhancement, denoising */
176 #define  COM22_WHTPCOR		0x02	/* White pixel correction enable */
177 #define  COM22_WHTPCOROPT	0x01	/* White pixel correction option */
178 #define  COM22_DENOISE		0x10	/* White pixel correction option */
179 #define REG_COM23		0x8d	/* Color bar test, color gain */
180 #define  COM23_TEST_MODE	0x10
181 #define REG_DBLC1		0x8f	/* Digital BLC */
182 #define REG_DBLC_B		0x90	/* Digital BLC B channel offset */
183 #define REG_DBLC_R		0x91	/* Digital BLC R channel offset */
184 #define REG_DM_LNL		0x92	/* Dummy line low 8 bits */
185 #define REG_DM_LNH		0x93	/* Dummy line high 8 bits */
186 #define REG_LCCFB		0x9d	/* Lens Correction B channel */
187 #define REG_LCCFR		0x9e	/* Lens Correction R channel */
188 #define REG_DBLC_GB		0x9f	/* Digital BLC GB chan offset */
189 #define REG_DBLC_GR		0xa0	/* Digital BLC GR chan offset */
190 #define REG_AECHM		0xa1	/* Exposure value - bits AEC[15:10] */
191 #define REG_BD50ST		0xa2	/* Banding filter value for 50Hz */
192 #define REG_BD60ST		0xa3	/* Banding filter value for 60Hz */
193 #define REG_NULL		0xff	/* Array end token */
194 
195 #define DEF_CLKRC		0x80
196 
197 #define OV965X_ID(_msb, _lsb)	((_msb) << 8 | (_lsb))
198 #define OV9650_ID		0x9650
199 #define OV9652_ID		0x9652
200 
201 struct ov965x_ctrls {
202 	struct v4l2_ctrl_handler handler;
203 	struct {
204 		struct v4l2_ctrl *auto_exp;
205 		struct v4l2_ctrl *exposure;
206 	};
207 	struct {
208 		struct v4l2_ctrl *auto_wb;
209 		struct v4l2_ctrl *blue_balance;
210 		struct v4l2_ctrl *red_balance;
211 	};
212 	struct {
213 		struct v4l2_ctrl *hflip;
214 		struct v4l2_ctrl *vflip;
215 	};
216 	struct {
217 		struct v4l2_ctrl *auto_gain;
218 		struct v4l2_ctrl *gain;
219 	};
220 	struct v4l2_ctrl *brightness;
221 	struct v4l2_ctrl *saturation;
222 	struct v4l2_ctrl *sharpness;
223 	struct v4l2_ctrl *light_freq;
224 	u8 update;
225 };
226 
227 struct ov965x_framesize {
228 	u16 width;
229 	u16 height;
230 	u16 max_exp_lines;
231 	const u8 *regs;
232 };
233 
234 struct ov965x_interval {
235 	struct v4l2_fract interval;
236 	/* Maximum resolution for this interval */
237 	struct v4l2_frmsize_discrete size;
238 	u8 clkrc_div;
239 };
240 
241 enum gpio_id {
242 	GPIO_PWDN,
243 	GPIO_RST,
244 	NUM_GPIOS,
245 };
246 
247 struct ov965x {
248 	struct v4l2_subdev sd;
249 	struct media_pad pad;
250 	enum v4l2_mbus_type bus_type;
251 	int gpios[NUM_GPIOS];
252 	/* External master clock frequency */
253 	unsigned long mclk_frequency;
254 
255 	/* Protects the struct fields below */
256 	struct mutex lock;
257 
258 	struct i2c_client *client;
259 
260 	/* Exposure row interval in us */
261 	unsigned int exp_row_interval;
262 
263 	unsigned short id;
264 	const struct ov965x_framesize *frame_size;
265 	/* YUYV sequence (pixel format) control register */
266 	u8 tslb_reg;
267 	struct v4l2_mbus_framefmt format;
268 
269 	struct ov965x_ctrls ctrls;
270 	/* Pointer to frame rate control data structure */
271 	const struct ov965x_interval *fiv;
272 
273 	int streaming;
274 	int power;
275 
276 	u8 apply_frame_fmt;
277 };
278 
279 struct i2c_rv {
280 	u8 addr;
281 	u8 value;
282 };
283 
284 static const struct i2c_rv ov965x_init_regs[] = {
285 	{ REG_COM2, 0x10 },	/* Set soft sleep mode */
286 	{ REG_COM5, 0x00 },	/* System clock options */
287 	{ REG_COM2, 0x01 },	/* Output drive, soft sleep mode */
288 	{ REG_COM10, 0x00 },	/* Slave mode, HREF vs HSYNC, signals negate */
289 	{ REG_EDGE, 0xa6 },	/* Edge enhancement treshhold and factor */
290 	{ REG_COM16, 0x02 },	/* Color matrix coeff double option */
291 	{ REG_COM17, 0x08 },	/* Single frame out, banding filter */
292 	{ 0x16, 0x06 },
293 	{ REG_CHLF, 0xc0 },	/* Reserved  */
294 	{ 0x34, 0xbf },
295 	{ 0xa8, 0x80 },
296 	{ 0x96, 0x04 },
297 	{ 0x8e, 0x00 },
298 	{ REG_COM12, 0x77 },	/* HREF option, UV average  */
299 	{ 0x8b, 0x06 },
300 	{ 0x35, 0x91 },
301 	{ 0x94, 0x88 },
302 	{ 0x95, 0x88 },
303 	{ REG_COM15, 0xc1 },	/* Output range, RGB 555/565 */
304 	{ REG_GRCOM, 0x2f },	/* Analog BLC & regulator */
305 	{ REG_COM6, 0x43 },	/* HREF & ADBLC options */
306 	{ REG_COM8, 0xe5 },	/* AGC/AEC options */
307 	{ REG_COM13, 0x90 },	/* Gamma selection, colour matrix, UV delay */
308 	{ REG_HV, 0x80 },	/* Manual banding filter MSB  */
309 	{ 0x5c, 0x96 },		/* Reserved up to 0xa5 */
310 	{ 0x5d, 0x96 },
311 	{ 0x5e, 0x10 },
312 	{ 0x59, 0xeb },
313 	{ 0x5a, 0x9c },
314 	{ 0x5b, 0x55 },
315 	{ 0x43, 0xf0 },
316 	{ 0x44, 0x10 },
317 	{ 0x45, 0x55 },
318 	{ 0x46, 0x86 },
319 	{ 0x47, 0x64 },
320 	{ 0x48, 0x86 },
321 	{ 0x5f, 0xe0 },
322 	{ 0x60, 0x8c },
323 	{ 0x61, 0x20 },
324 	{ 0xa5, 0xd9 },
325 	{ 0xa4, 0x74 },		/* reserved */
326 	{ REG_COM23, 0x02 },	/* Color gain analog/_digital_ */
327 	{ REG_COM8, 0xe7 },	/* Enable AEC, AWB, AEC */
328 	{ REG_COM22, 0x23 },	/* Edge enhancement, denoising */
329 	{ 0xa9, 0xb8 },
330 	{ 0xaa, 0x92 },
331 	{ 0xab, 0x0a },
332 	{ REG_DBLC1, 0xdf },	/* Digital BLC */
333 	{ REG_DBLC_B, 0x00 },	/* Digital BLC B chan offset */
334 	{ REG_DBLC_R, 0x00 },	/* Digital BLC R chan offset */
335 	{ REG_DBLC_GB, 0x00 },	/* Digital BLC GB chan offset */
336 	{ REG_DBLC_GR, 0x00 },
337 	{ REG_COM9, 0x3a },	/* Gain ceiling 16x */
338 	{ REG_NULL, 0 }
339 };
340 
341 #define NUM_FMT_REGS 14
342 /*
343  * COM7,  COM3,  COM4, HSTART, HSTOP, HREF, VSTART, VSTOP, VREF,
344  * EXHCH, EXHCL, ADC,  OCOM,   OFON
345  */
346 static const u8 frame_size_reg_addr[NUM_FMT_REGS] = {
347 	0x12, 0x0c, 0x0d, 0x17, 0x18, 0x32, 0x19, 0x1a, 0x03,
348 	0x2a, 0x2b, 0x37, 0x38, 0x39,
349 };
350 
351 static const u8 ov965x_sxga_regs[NUM_FMT_REGS] = {
352 	0x00, 0x00, 0x00, 0x1e, 0xbe, 0xbf, 0x01, 0x81, 0x12,
353 	0x10, 0x34, 0x81, 0x93, 0x51,
354 };
355 
356 static const u8 ov965x_vga_regs[NUM_FMT_REGS] = {
357 	0x40, 0x04, 0x80, 0x26, 0xc6, 0xed, 0x01, 0x3d, 0x00,
358 	0x10, 0x40, 0x91, 0x12, 0x43,
359 };
360 
361 /* Determined empirically. */
362 static const u8 ov965x_qvga_regs[NUM_FMT_REGS] = {
363 	0x10, 0x04, 0x80, 0x25, 0xc5, 0xbf, 0x00, 0x80, 0x12,
364 	0x10, 0x40, 0x91, 0x12, 0x43,
365 };
366 
367 static const struct ov965x_framesize ov965x_framesizes[] = {
368 	{
369 		.width		= SXGA_WIDTH,
370 		.height		= SXGA_HEIGHT,
371 		.regs		= ov965x_sxga_regs,
372 		.max_exp_lines	= 1048,
373 	}, {
374 		.width		= VGA_WIDTH,
375 		.height		= VGA_HEIGHT,
376 		.regs		= ov965x_vga_regs,
377 		.max_exp_lines	= 498,
378 	}, {
379 		.width		= QVGA_WIDTH,
380 		.height		= QVGA_HEIGHT,
381 		.regs		= ov965x_qvga_regs,
382 		.max_exp_lines	= 248,
383 	},
384 };
385 
386 struct ov965x_pixfmt {
387 	u32 code;
388 	u32 colorspace;
389 	/* REG_TSLB value, only bits [3:2] may be set. */
390 	u8 tslb_reg;
391 };
392 
393 static const struct ov965x_pixfmt ov965x_formats[] = {
394 	{ MEDIA_BUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG, 0x00},
395 	{ MEDIA_BUS_FMT_YVYU8_2X8, V4L2_COLORSPACE_JPEG, 0x04},
396 	{ MEDIA_BUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG, 0x0c},
397 	{ MEDIA_BUS_FMT_VYUY8_2X8, V4L2_COLORSPACE_JPEG, 0x08},
398 };
399 
400 /*
401  * This table specifies possible frame resolution and interval
402  * combinations. Default CLKRC[5:0] divider values are valid
403  * only for 24 MHz external clock frequency.
404  */
405 static struct ov965x_interval ov965x_intervals[] = {
406 	{{ 100, 625 }, { SXGA_WIDTH, SXGA_HEIGHT }, 0 },  /* 6.25 fps */
407 	{{ 10,  125 }, { VGA_WIDTH, VGA_HEIGHT },   1 },  /* 12.5 fps */
408 	{{ 10,  125 }, { QVGA_WIDTH, QVGA_HEIGHT }, 3 },  /* 12.5 fps */
409 	{{ 1,   25  }, { VGA_WIDTH, VGA_HEIGHT },   0 },  /* 25 fps */
410 	{{ 1,   25  }, { QVGA_WIDTH, QVGA_HEIGHT }, 1 },  /* 25 fps */
411 };
412 
413 static inline struct v4l2_subdev *ctrl_to_sd(struct v4l2_ctrl *ctrl)
414 {
415 	return &container_of(ctrl->handler, struct ov965x, ctrls.handler)->sd;
416 }
417 
418 static inline struct ov965x *to_ov965x(struct v4l2_subdev *sd)
419 {
420 	return container_of(sd, struct ov965x, sd);
421 }
422 
423 static int ov965x_read(struct i2c_client *client, u8 addr, u8 *val)
424 {
425 	u8 buf = addr;
426 	struct i2c_msg msg = {
427 		.addr = client->addr,
428 		.flags = 0,
429 		.len = 1,
430 		.buf = &buf
431 	};
432 	int ret;
433 
434 	ret = i2c_transfer(client->adapter, &msg, 1);
435 	if (ret == 1) {
436 		msg.flags = I2C_M_RD;
437 		ret = i2c_transfer(client->adapter, &msg, 1);
438 
439 		if (ret == 1)
440 			*val = buf;
441 	}
442 
443 	v4l2_dbg(2, debug, client, "%s: 0x%02x @ 0x%02x. (%d)\n",
444 		 __func__, *val, addr, ret);
445 
446 	return ret == 1 ? 0 : ret;
447 }
448 
449 static int ov965x_write(struct i2c_client *client, u8 addr, u8 val)
450 {
451 	u8 buf[2] = { addr, val };
452 
453 	int ret = i2c_master_send(client, buf, 2);
454 
455 	v4l2_dbg(2, debug, client, "%s: 0x%02x @ 0x%02X (%d)\n",
456 		 __func__, val, addr, ret);
457 
458 	return ret == 2 ? 0 : ret;
459 }
460 
461 static int ov965x_write_array(struct i2c_client *client,
462 			      const struct i2c_rv *regs)
463 {
464 	int i, ret = 0;
465 
466 	for (i = 0; ret == 0 && regs[i].addr != REG_NULL; i++)
467 		ret = ov965x_write(client, regs[i].addr, regs[i].value);
468 
469 	return ret;
470 }
471 
472 static int ov965x_set_default_gamma_curve(struct ov965x *ov965x)
473 {
474 	static const u8 gamma_curve[] = {
475 		/* Values taken from OV application note. */
476 		0x40, 0x30, 0x4b, 0x60, 0x70, 0x70, 0x70, 0x70,
477 		0x60, 0x60, 0x50, 0x48, 0x3a, 0x2e, 0x28, 0x22,
478 		0x04, 0x07, 0x10, 0x28,	0x36, 0x44, 0x52, 0x60,
479 		0x6c, 0x78, 0x8c, 0x9e, 0xbb, 0xd2, 0xe6
480 	};
481 	u8 addr = REG_GSP;
482 	unsigned int i;
483 
484 	for (i = 0; i < ARRAY_SIZE(gamma_curve); i++) {
485 		int ret = ov965x_write(ov965x->client, addr, gamma_curve[i]);
486 		if (ret < 0)
487 			return ret;
488 		addr++;
489 	}
490 
491 	return 0;
492 };
493 
494 static int ov965x_set_color_matrix(struct ov965x *ov965x)
495 {
496 	static const u8 mtx[] = {
497 		/* MTX1..MTX9, MTXS */
498 		0x3a, 0x3d, 0x03, 0x12, 0x26, 0x38, 0x40, 0x40, 0x40, 0x0d
499 	};
500 	u8 addr = REG_MTX(1);
501 	unsigned int i;
502 
503 	for (i = 0; i < ARRAY_SIZE(mtx); i++) {
504 		int ret = ov965x_write(ov965x->client, addr, mtx[i]);
505 		if (ret < 0)
506 			return ret;
507 		addr++;
508 	}
509 
510 	return 0;
511 }
512 
513 static void ov965x_gpio_set(int gpio, int val)
514 {
515 	if (gpio_is_valid(gpio))
516 		gpio_set_value(gpio, val);
517 }
518 
519 static void __ov965x_set_power(struct ov965x *ov965x, int on)
520 {
521 	if (on) {
522 		ov965x_gpio_set(ov965x->gpios[GPIO_PWDN], 0);
523 		ov965x_gpio_set(ov965x->gpios[GPIO_RST], 0);
524 		usleep_range(25000, 26000);
525 	} else {
526 		ov965x_gpio_set(ov965x->gpios[GPIO_RST], 1);
527 		ov965x_gpio_set(ov965x->gpios[GPIO_PWDN], 1);
528 	}
529 
530 	ov965x->streaming = 0;
531 }
532 
533 static int ov965x_s_power(struct v4l2_subdev *sd, int on)
534 {
535 	struct ov965x *ov965x = to_ov965x(sd);
536 	struct i2c_client *client = ov965x->client;
537 	int ret = 0;
538 
539 	v4l2_dbg(1, debug, client, "%s: on: %d\n", __func__, on);
540 
541 	mutex_lock(&ov965x->lock);
542 	if (ov965x->power == !on) {
543 		__ov965x_set_power(ov965x, on);
544 		if (on) {
545 			ret = ov965x_write_array(client,
546 						 ov965x_init_regs);
547 			ov965x->apply_frame_fmt = 1;
548 			ov965x->ctrls.update = 1;
549 		}
550 	}
551 	if (!ret)
552 		ov965x->power += on ? 1 : -1;
553 
554 	WARN_ON(ov965x->power < 0);
555 	mutex_unlock(&ov965x->lock);
556 	return ret;
557 }
558 
559 /*
560  * V4L2 controls
561  */
562 
563 static void ov965x_update_exposure_ctrl(struct ov965x *ov965x)
564 {
565 	struct v4l2_ctrl *ctrl = ov965x->ctrls.exposure;
566 	unsigned long fint, trow;
567 	int min, max, def;
568 	u8 clkrc;
569 
570 	mutex_lock(&ov965x->lock);
571 	if (WARN_ON(!ctrl || !ov965x->frame_size)) {
572 		mutex_unlock(&ov965x->lock);
573 		return;
574 	}
575 	clkrc = DEF_CLKRC + ov965x->fiv->clkrc_div;
576 	/* Calculate internal clock frequency */
577 	fint = ov965x->mclk_frequency * ((clkrc >> 7) + 1) /
578 				((2 * ((clkrc & 0x3f) + 1)));
579 	/* and the row interval (in us). */
580 	trow = (2 * 1520 * 1000000UL) / fint;
581 	max = ov965x->frame_size->max_exp_lines * trow;
582 	ov965x->exp_row_interval = trow;
583 	mutex_unlock(&ov965x->lock);
584 
585 	v4l2_dbg(1, debug, &ov965x->sd, "clkrc: %#x, fi: %lu, tr: %lu, %d\n",
586 		 clkrc, fint, trow, max);
587 
588 	/* Update exposure time range to match current frame format. */
589 	min = (trow + 100) / 100;
590 	max = (max - 100) / 100;
591 	def = min + (max - min) / 2;
592 
593 	if (v4l2_ctrl_modify_range(ctrl, min, max, 1, def))
594 		v4l2_err(&ov965x->sd, "Exposure ctrl range update failed\n");
595 }
596 
597 static int ov965x_set_banding_filter(struct ov965x *ov965x, int value)
598 {
599 	unsigned long mbd, light_freq;
600 	int ret;
601 	u8 reg;
602 
603 	ret = ov965x_read(ov965x->client, REG_COM8, &reg);
604 	if (!ret) {
605 		if (value == V4L2_CID_POWER_LINE_FREQUENCY_DISABLED)
606 			reg &= ~COM8_BFILT;
607 		else
608 			reg |= COM8_BFILT;
609 		ret = ov965x_write(ov965x->client, REG_COM8, reg);
610 	}
611 	if (value == V4L2_CID_POWER_LINE_FREQUENCY_DISABLED)
612 		return 0;
613 	if (WARN_ON(ov965x->fiv == NULL))
614 		return -EINVAL;
615 	/* Set minimal exposure time for 50/60 HZ lighting */
616 	if (value == V4L2_CID_POWER_LINE_FREQUENCY_50HZ)
617 		light_freq = 50;
618 	else
619 		light_freq = 60;
620 	mbd = (1000UL * ov965x->fiv->interval.denominator *
621 	       ov965x->frame_size->max_exp_lines) /
622 	       ov965x->fiv->interval.numerator;
623 	mbd = ((mbd / (light_freq * 2)) + 500) / 1000UL;
624 
625 	return ov965x_write(ov965x->client, REG_MBD, mbd);
626 }
627 
628 static int ov965x_set_white_balance(struct ov965x *ov965x, int awb)
629 {
630 	int ret;
631 	u8 reg;
632 
633 	ret = ov965x_read(ov965x->client, REG_COM8, &reg);
634 	if (!ret) {
635 		reg = awb ? reg | REG_COM8 : reg & ~REG_COM8;
636 		ret = ov965x_write(ov965x->client, REG_COM8, reg);
637 	}
638 	if (!ret && !awb) {
639 		ret = ov965x_write(ov965x->client, REG_BLUE,
640 				   ov965x->ctrls.blue_balance->val);
641 		if (ret < 0)
642 			return ret;
643 		ret = ov965x_write(ov965x->client, REG_RED,
644 				   ov965x->ctrls.red_balance->val);
645 	}
646 	return ret;
647 }
648 
649 #define NUM_BR_LEVELS	7
650 #define NUM_BR_REGS	3
651 
652 static int ov965x_set_brightness(struct ov965x *ov965x, int val)
653 {
654 	static const u8 regs[NUM_BR_LEVELS + 1][NUM_BR_REGS] = {
655 		{ REG_AEW, REG_AEB, REG_VPT },
656 		{ 0x1c, 0x12, 0x50 }, /* -3 */
657 		{ 0x3d, 0x30, 0x71 }, /* -2 */
658 		{ 0x50, 0x44, 0x92 }, /* -1 */
659 		{ 0x70, 0x64, 0xc3 }, /*  0 */
660 		{ 0x90, 0x84, 0xd4 }, /* +1 */
661 		{ 0xc4, 0xbf, 0xf9 }, /* +2 */
662 		{ 0xd8, 0xd0, 0xfa }, /* +3 */
663 	};
664 	int i, ret = 0;
665 
666 	val += (NUM_BR_LEVELS / 2 + 1);
667 	if (val > NUM_BR_LEVELS)
668 		return -EINVAL;
669 
670 	for (i = 0; i < NUM_BR_REGS && !ret; i++)
671 		ret = ov965x_write(ov965x->client, regs[0][i],
672 				   regs[val][i]);
673 	return ret;
674 }
675 
676 static int ov965x_set_gain(struct ov965x *ov965x, int auto_gain)
677 {
678 	struct i2c_client *client = ov965x->client;
679 	struct ov965x_ctrls *ctrls = &ov965x->ctrls;
680 	int ret = 0;
681 	u8 reg;
682 	/*
683 	 * For manual mode we need to disable AGC first, so
684 	 * gain value in REG_VREF, REG_GAIN is not overwritten.
685 	 */
686 	if (ctrls->auto_gain->is_new) {
687 		ret = ov965x_read(client, REG_COM8, &reg);
688 		if (ret < 0)
689 			return ret;
690 		if (ctrls->auto_gain->val)
691 			reg |= COM8_AGC;
692 		else
693 			reg &= ~COM8_AGC;
694 		ret = ov965x_write(client, REG_COM8, reg);
695 		if (ret < 0)
696 			return ret;
697 	}
698 
699 	if (ctrls->gain->is_new && !auto_gain) {
700 		unsigned int gain = ctrls->gain->val;
701 		unsigned int rgain;
702 		int m;
703 		/*
704 		 * Convert gain control value to the sensor's gain
705 		 * registers (VREF[7:6], GAIN[7:0]) format.
706 		 */
707 		for (m = 6; m >= 0; m--)
708 			if (gain >= (1 << m) * 16)
709 				break;
710 		rgain = (gain - ((1 << m) * 16)) / (1 << m);
711 		rgain |= (((1 << m) - 1) << 4);
712 
713 		ret = ov965x_write(client, REG_GAIN, rgain & 0xff);
714 		if (ret < 0)
715 			return ret;
716 		ret = ov965x_read(client, REG_VREF, &reg);
717 		if (ret < 0)
718 			return ret;
719 		reg &= ~VREF_GAIN_MASK;
720 		reg |= (((rgain >> 8) & 0x3) << 6);
721 		ret = ov965x_write(client, REG_VREF, reg);
722 		if (ret < 0)
723 			return ret;
724 		/* Return updated control's value to userspace */
725 		ctrls->gain->val = (1 << m) * (16 + (rgain & 0xf));
726 	}
727 
728 	return ret;
729 }
730 
731 static int ov965x_set_sharpness(struct ov965x *ov965x, unsigned int value)
732 {
733 	u8 com14, edge;
734 	int ret;
735 
736 	ret = ov965x_read(ov965x->client, REG_COM14, &com14);
737 	if (ret < 0)
738 		return ret;
739 	ret = ov965x_read(ov965x->client, REG_EDGE, &edge);
740 	if (ret < 0)
741 		return ret;
742 	com14 = value ? com14 | COM14_EDGE_EN : com14 & ~COM14_EDGE_EN;
743 	value--;
744 	if (value > 0x0f) {
745 		com14 |= COM14_EEF_X2;
746 		value >>= 1;
747 	} else {
748 		com14 &= ~COM14_EEF_X2;
749 	}
750 	ret = ov965x_write(ov965x->client, REG_COM14, com14);
751 	if (ret < 0)
752 		return ret;
753 
754 	edge &= ~EDGE_FACTOR_MASK;
755 	edge |= ((u8)value & 0x0f);
756 
757 	return ov965x_write(ov965x->client, REG_EDGE, edge);
758 }
759 
760 static int ov965x_set_exposure(struct ov965x *ov965x, int exp)
761 {
762 	struct i2c_client *client = ov965x->client;
763 	struct ov965x_ctrls *ctrls = &ov965x->ctrls;
764 	bool auto_exposure = (exp == V4L2_EXPOSURE_AUTO);
765 	int ret;
766 	u8 reg;
767 
768 	if (ctrls->auto_exp->is_new) {
769 		ret = ov965x_read(client, REG_COM8, &reg);
770 		if (ret < 0)
771 			return ret;
772 		if (auto_exposure)
773 			reg |= (COM8_AEC | COM8_AGC);
774 		else
775 			reg &= ~(COM8_AEC | COM8_AGC);
776 		ret = ov965x_write(client, REG_COM8, reg);
777 		if (ret < 0)
778 			return ret;
779 	}
780 
781 	if (!auto_exposure && ctrls->exposure->is_new) {
782 		unsigned int exposure = (ctrls->exposure->val * 100)
783 					 / ov965x->exp_row_interval;
784 		/*
785 		 * Manual exposure value
786 		 * [b15:b0] - AECHM (b15:b10), AECH (b9:b2), COM1 (b1:b0)
787 		 */
788 		ret = ov965x_write(client, REG_COM1, exposure & 0x3);
789 		if (!ret)
790 			ret = ov965x_write(client, REG_AECH,
791 					   (exposure >> 2) & 0xff);
792 		if (!ret)
793 			ret = ov965x_write(client, REG_AECHM,
794 					   (exposure >> 10) & 0x3f);
795 		/* Update the value to minimize rounding errors */
796 		ctrls->exposure->val = ((exposure * ov965x->exp_row_interval)
797 							+ 50) / 100;
798 		if (ret < 0)
799 			return ret;
800 	}
801 
802 	v4l2_ctrl_activate(ov965x->ctrls.brightness, !exp);
803 	return 0;
804 }
805 
806 static int ov965x_set_flip(struct ov965x *ov965x)
807 {
808 	u8 mvfp = 0;
809 
810 	if (ov965x->ctrls.hflip->val)
811 		mvfp |= MVFP_MIRROR;
812 
813 	if (ov965x->ctrls.vflip->val)
814 		mvfp |= MVFP_FLIP;
815 
816 	return ov965x_write(ov965x->client, REG_MVFP, mvfp);
817 }
818 
819 #define NUM_SAT_LEVELS	5
820 #define NUM_SAT_REGS	6
821 
822 static int ov965x_set_saturation(struct ov965x *ov965x, int val)
823 {
824 	static const u8 regs[NUM_SAT_LEVELS][NUM_SAT_REGS] = {
825 		/* MTX(1)...MTX(6) */
826 		{ 0x1d, 0x1f, 0x02, 0x09, 0x13, 0x1c }, /* -2 */
827 		{ 0x2e, 0x31, 0x02, 0x0e, 0x1e, 0x2d }, /* -1 */
828 		{ 0x3a, 0x3d, 0x03, 0x12, 0x26, 0x38 }, /*  0 */
829 		{ 0x46, 0x49, 0x04, 0x16, 0x2e, 0x43 }, /* +1 */
830 		{ 0x57, 0x5c, 0x05, 0x1b, 0x39, 0x54 }, /* +2 */
831 	};
832 	u8 addr = REG_MTX(1);
833 	int i, ret = 0;
834 
835 	val += (NUM_SAT_LEVELS / 2);
836 	if (val >= NUM_SAT_LEVELS)
837 		return -EINVAL;
838 
839 	for (i = 0; i < NUM_SAT_REGS && !ret; i++)
840 		ret = ov965x_write(ov965x->client, addr + i, regs[val][i]);
841 
842 	return ret;
843 }
844 
845 static int ov965x_set_test_pattern(struct ov965x *ov965x, int value)
846 {
847 	int ret;
848 	u8 reg;
849 
850 	ret = ov965x_read(ov965x->client, REG_COM23, &reg);
851 	if (ret < 0)
852 		return ret;
853 	reg = value ? reg | COM23_TEST_MODE : reg & ~COM23_TEST_MODE;
854 	return ov965x_write(ov965x->client, REG_COM23, reg);
855 }
856 
857 static int __g_volatile_ctrl(struct ov965x *ov965x, struct v4l2_ctrl *ctrl)
858 {
859 	struct i2c_client *client = ov965x->client;
860 	unsigned int exposure, gain, m;
861 	u8 reg0, reg1, reg2;
862 	int ret;
863 
864 	if (!ov965x->power)
865 		return 0;
866 
867 	switch (ctrl->id) {
868 	case V4L2_CID_AUTOGAIN:
869 		if (!ctrl->val)
870 			return 0;
871 		ret = ov965x_read(client, REG_GAIN, &reg0);
872 		if (ret < 0)
873 			return ret;
874 		ret = ov965x_read(client, REG_VREF, &reg1);
875 		if (ret < 0)
876 			return ret;
877 		gain = ((reg1 >> 6) << 8) | reg0;
878 		m = 0x01 << fls(gain >> 4);
879 		ov965x->ctrls.gain->val = m * (16 + (gain & 0xf));
880 		break;
881 
882 	case V4L2_CID_EXPOSURE_AUTO:
883 		if (ctrl->val == V4L2_EXPOSURE_MANUAL)
884 			return 0;
885 		ret = ov965x_read(client, REG_COM1, &reg0);
886 		if (!ret)
887 			ret = ov965x_read(client, REG_AECH, &reg1);
888 		if (!ret)
889 			ret = ov965x_read(client, REG_AECHM, &reg2);
890 		if (ret < 0)
891 			return ret;
892 		exposure = ((reg2 & 0x3f) << 10) | (reg1 << 2) |
893 						(reg0 & 0x3);
894 		ov965x->ctrls.exposure->val = ((exposure *
895 				ov965x->exp_row_interval) + 50) / 100;
896 		break;
897 	}
898 
899 	return 0;
900 }
901 
902 static int ov965x_g_volatile_ctrl(struct v4l2_ctrl *ctrl)
903 {
904 	struct v4l2_subdev *sd = ctrl_to_sd(ctrl);
905 	struct ov965x *ov965x = to_ov965x(sd);
906 	int ret;
907 
908 	v4l2_dbg(1, debug, sd, "g_ctrl: %s\n", ctrl->name);
909 
910 	mutex_lock(&ov965x->lock);
911 	ret = __g_volatile_ctrl(ov965x, ctrl);
912 	mutex_unlock(&ov965x->lock);
913 	return ret;
914 }
915 
916 static int ov965x_s_ctrl(struct v4l2_ctrl *ctrl)
917 {
918 	struct v4l2_subdev *sd = ctrl_to_sd(ctrl);
919 	struct ov965x *ov965x = to_ov965x(sd);
920 	int ret = -EINVAL;
921 
922 	v4l2_dbg(1, debug, sd, "s_ctrl: %s, value: %d. power: %d\n",
923 		 ctrl->name, ctrl->val, ov965x->power);
924 
925 	mutex_lock(&ov965x->lock);
926 	/*
927 	 * If the device is not powered up now postpone applying control's
928 	 * value to the hardware, until it is ready to accept commands.
929 	 */
930 	if (ov965x->power == 0) {
931 		mutex_unlock(&ov965x->lock);
932 		return 0;
933 	}
934 
935 	switch (ctrl->id) {
936 	case V4L2_CID_AUTO_WHITE_BALANCE:
937 		ret = ov965x_set_white_balance(ov965x, ctrl->val);
938 		break;
939 
940 	case V4L2_CID_BRIGHTNESS:
941 		ret = ov965x_set_brightness(ov965x, ctrl->val);
942 		break;
943 
944 	case V4L2_CID_EXPOSURE_AUTO:
945 		ret = ov965x_set_exposure(ov965x, ctrl->val);
946 		break;
947 
948 	case V4L2_CID_AUTOGAIN:
949 		ret = ov965x_set_gain(ov965x, ctrl->val);
950 		break;
951 
952 	case V4L2_CID_HFLIP:
953 		ret = ov965x_set_flip(ov965x);
954 		break;
955 
956 	case V4L2_CID_POWER_LINE_FREQUENCY:
957 		ret = ov965x_set_banding_filter(ov965x, ctrl->val);
958 		break;
959 
960 	case V4L2_CID_SATURATION:
961 		ret = ov965x_set_saturation(ov965x, ctrl->val);
962 		break;
963 
964 	case V4L2_CID_SHARPNESS:
965 		ret = ov965x_set_sharpness(ov965x, ctrl->val);
966 		break;
967 
968 	case V4L2_CID_TEST_PATTERN:
969 		ret = ov965x_set_test_pattern(ov965x, ctrl->val);
970 		break;
971 	}
972 
973 	mutex_unlock(&ov965x->lock);
974 	return ret;
975 }
976 
977 static const struct v4l2_ctrl_ops ov965x_ctrl_ops = {
978 	.g_volatile_ctrl = ov965x_g_volatile_ctrl,
979 	.s_ctrl	= ov965x_s_ctrl,
980 };
981 
982 static const char * const test_pattern_menu[] = {
983 	"Disabled",
984 	"Color bars",
985 	NULL
986 };
987 
988 static int ov965x_initialize_controls(struct ov965x *ov965x)
989 {
990 	const struct v4l2_ctrl_ops *ops = &ov965x_ctrl_ops;
991 	struct ov965x_ctrls *ctrls = &ov965x->ctrls;
992 	struct v4l2_ctrl_handler *hdl = &ctrls->handler;
993 	int ret;
994 
995 	ret = v4l2_ctrl_handler_init(hdl, 16);
996 	if (ret < 0)
997 		return ret;
998 
999 	/* Auto/manual white balance */
1000 	ctrls->auto_wb = v4l2_ctrl_new_std(hdl, ops,
1001 				V4L2_CID_AUTO_WHITE_BALANCE,
1002 				0, 1, 1, 1);
1003 	ctrls->blue_balance = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_BLUE_BALANCE,
1004 						0, 0xff, 1, 0x80);
1005 	ctrls->red_balance = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_RED_BALANCE,
1006 						0, 0xff, 1, 0x80);
1007 	/* Auto/manual exposure */
1008 	ctrls->auto_exp = v4l2_ctrl_new_std_menu(hdl, ops,
1009 				V4L2_CID_EXPOSURE_AUTO,
1010 				V4L2_EXPOSURE_MANUAL, 0, V4L2_EXPOSURE_AUTO);
1011 	/* Exposure time, in 100 us units. min/max is updated dynamically. */
1012 	ctrls->exposure = v4l2_ctrl_new_std(hdl, ops,
1013 				V4L2_CID_EXPOSURE_ABSOLUTE,
1014 				2, 1500, 1, 500);
1015 	/* Auto/manual gain */
1016 	ctrls->auto_gain = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_AUTOGAIN,
1017 						0, 1, 1, 1);
1018 	ctrls->gain = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_GAIN,
1019 						16, 64 * (16 + 15), 1, 64 * 16);
1020 
1021 	ctrls->saturation = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_SATURATION,
1022 						-2, 2, 1, 0);
1023 	ctrls->brightness = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_BRIGHTNESS,
1024 						-3, 3, 1, 0);
1025 	ctrls->sharpness = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_SHARPNESS,
1026 						0, 32, 1, 6);
1027 
1028 	ctrls->hflip = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_HFLIP, 0, 1, 1, 0);
1029 	ctrls->vflip = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_VFLIP, 0, 1, 1, 0);
1030 
1031 	ctrls->light_freq = v4l2_ctrl_new_std_menu(hdl, ops,
1032 				V4L2_CID_POWER_LINE_FREQUENCY,
1033 				V4L2_CID_POWER_LINE_FREQUENCY_60HZ, ~0x7,
1034 				V4L2_CID_POWER_LINE_FREQUENCY_50HZ);
1035 
1036 	v4l2_ctrl_new_std_menu_items(hdl, ops, V4L2_CID_TEST_PATTERN,
1037 				ARRAY_SIZE(test_pattern_menu) - 1, 0, 0,
1038 				test_pattern_menu);
1039 	if (hdl->error) {
1040 		ret = hdl->error;
1041 		v4l2_ctrl_handler_free(hdl);
1042 		return ret;
1043 	}
1044 
1045 	ctrls->gain->flags |= V4L2_CTRL_FLAG_VOLATILE;
1046 	ctrls->exposure->flags |= V4L2_CTRL_FLAG_VOLATILE;
1047 
1048 	v4l2_ctrl_auto_cluster(3, &ctrls->auto_wb, 0, false);
1049 	v4l2_ctrl_auto_cluster(3, &ctrls->auto_gain, 0, true);
1050 	v4l2_ctrl_auto_cluster(3, &ctrls->auto_exp, 1, true);
1051 	v4l2_ctrl_cluster(2, &ctrls->hflip);
1052 
1053 	ov965x->sd.ctrl_handler = hdl;
1054 	return 0;
1055 }
1056 
1057 /*
1058  * V4L2 subdev video and pad level operations
1059  */
1060 static void ov965x_get_default_format(struct v4l2_mbus_framefmt *mf)
1061 {
1062 	mf->width = ov965x_framesizes[0].width;
1063 	mf->height = ov965x_framesizes[0].height;
1064 	mf->colorspace = ov965x_formats[0].colorspace;
1065 	mf->code = ov965x_formats[0].code;
1066 	mf->field = V4L2_FIELD_NONE;
1067 }
1068 
1069 static int ov965x_enum_mbus_code(struct v4l2_subdev *sd,
1070 				 struct v4l2_subdev_pad_config *cfg,
1071 				 struct v4l2_subdev_mbus_code_enum *code)
1072 {
1073 	if (code->index >= ARRAY_SIZE(ov965x_formats))
1074 		return -EINVAL;
1075 
1076 	code->code = ov965x_formats[code->index].code;
1077 	return 0;
1078 }
1079 
1080 static int ov965x_enum_frame_sizes(struct v4l2_subdev *sd,
1081 				   struct v4l2_subdev_pad_config *cfg,
1082 				   struct v4l2_subdev_frame_size_enum *fse)
1083 {
1084 	int i = ARRAY_SIZE(ov965x_formats);
1085 
1086 	if (fse->index >= ARRAY_SIZE(ov965x_framesizes))
1087 		return -EINVAL;
1088 
1089 	while (--i)
1090 		if (fse->code == ov965x_formats[i].code)
1091 			break;
1092 
1093 	fse->code = ov965x_formats[i].code;
1094 
1095 	fse->min_width  = ov965x_framesizes[fse->index].width;
1096 	fse->max_width  = fse->min_width;
1097 	fse->max_height = ov965x_framesizes[fse->index].height;
1098 	fse->min_height = fse->max_height;
1099 
1100 	return 0;
1101 }
1102 
1103 static int ov965x_g_frame_interval(struct v4l2_subdev *sd,
1104 				   struct v4l2_subdev_frame_interval *fi)
1105 {
1106 	struct ov965x *ov965x = to_ov965x(sd);
1107 
1108 	mutex_lock(&ov965x->lock);
1109 	fi->interval = ov965x->fiv->interval;
1110 	mutex_unlock(&ov965x->lock);
1111 
1112 	return 0;
1113 }
1114 
1115 static int __ov965x_set_frame_interval(struct ov965x *ov965x,
1116 				       struct v4l2_subdev_frame_interval *fi)
1117 {
1118 	struct v4l2_mbus_framefmt *mbus_fmt = &ov965x->format;
1119 	const struct ov965x_interval *fiv = &ov965x_intervals[0];
1120 	u64 req_int, err, min_err = ~0ULL;
1121 	unsigned int i;
1122 
1123 
1124 	if (fi->interval.denominator == 0)
1125 		return -EINVAL;
1126 
1127 	req_int = (u64)(fi->interval.numerator * 10000) /
1128 		fi->interval.denominator;
1129 
1130 	for (i = 0; i < ARRAY_SIZE(ov965x_intervals); i++) {
1131 		const struct ov965x_interval *iv = &ov965x_intervals[i];
1132 
1133 		if (mbus_fmt->width != iv->size.width ||
1134 		    mbus_fmt->height != iv->size.height)
1135 			continue;
1136 		err = abs((u64)(iv->interval.numerator * 10000) /
1137 			    iv->interval.denominator - req_int);
1138 		if (err < min_err) {
1139 			fiv = iv;
1140 			min_err = err;
1141 		}
1142 	}
1143 	ov965x->fiv = fiv;
1144 
1145 	v4l2_dbg(1, debug, &ov965x->sd, "Changed frame interval to %u us\n",
1146 		 fiv->interval.numerator * 1000000 / fiv->interval.denominator);
1147 
1148 	return 0;
1149 }
1150 
1151 static int ov965x_s_frame_interval(struct v4l2_subdev *sd,
1152 				   struct v4l2_subdev_frame_interval *fi)
1153 {
1154 	struct ov965x *ov965x = to_ov965x(sd);
1155 	int ret;
1156 
1157 	v4l2_dbg(1, debug, sd, "Setting %d/%d frame interval\n",
1158 		 fi->interval.numerator, fi->interval.denominator);
1159 
1160 	mutex_lock(&ov965x->lock);
1161 	ret = __ov965x_set_frame_interval(ov965x, fi);
1162 	ov965x->apply_frame_fmt = 1;
1163 	mutex_unlock(&ov965x->lock);
1164 	return ret;
1165 }
1166 
1167 static int ov965x_get_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_pad_config *cfg,
1168 			  struct v4l2_subdev_format *fmt)
1169 {
1170 	struct ov965x *ov965x = to_ov965x(sd);
1171 	struct v4l2_mbus_framefmt *mf;
1172 
1173 	if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) {
1174 		mf = v4l2_subdev_get_try_format(sd, cfg, 0);
1175 		fmt->format = *mf;
1176 		return 0;
1177 	}
1178 
1179 	mutex_lock(&ov965x->lock);
1180 	fmt->format = ov965x->format;
1181 	mutex_unlock(&ov965x->lock);
1182 
1183 	return 0;
1184 }
1185 
1186 static void __ov965x_try_frame_size(struct v4l2_mbus_framefmt *mf,
1187 				    const struct ov965x_framesize **size)
1188 {
1189 	const struct ov965x_framesize *fsize = &ov965x_framesizes[0],
1190 		*match = NULL;
1191 	int i = ARRAY_SIZE(ov965x_framesizes);
1192 	unsigned int min_err = UINT_MAX;
1193 
1194 	while (i--) {
1195 		int err = abs(fsize->width - mf->width)
1196 				+ abs(fsize->height - mf->height);
1197 		if (err < min_err) {
1198 			min_err = err;
1199 			match = fsize;
1200 		}
1201 		fsize++;
1202 	}
1203 	if (!match)
1204 		match = &ov965x_framesizes[0];
1205 	mf->width  = match->width;
1206 	mf->height = match->height;
1207 	if (size)
1208 		*size = match;
1209 }
1210 
1211 static int ov965x_set_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_pad_config *cfg,
1212 			  struct v4l2_subdev_format *fmt)
1213 {
1214 	unsigned int index = ARRAY_SIZE(ov965x_formats);
1215 	struct v4l2_mbus_framefmt *mf = &fmt->format;
1216 	struct ov965x *ov965x = to_ov965x(sd);
1217 	const struct ov965x_framesize *size = NULL;
1218 	int ret = 0;
1219 
1220 	__ov965x_try_frame_size(mf, &size);
1221 
1222 	while (--index)
1223 		if (ov965x_formats[index].code == mf->code)
1224 			break;
1225 
1226 	mf->colorspace	= V4L2_COLORSPACE_JPEG;
1227 	mf->code	= ov965x_formats[index].code;
1228 	mf->field	= V4L2_FIELD_NONE;
1229 
1230 	mutex_lock(&ov965x->lock);
1231 
1232 	if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) {
1233 		if (cfg != NULL) {
1234 			mf = v4l2_subdev_get_try_format(sd, cfg, fmt->pad);
1235 			*mf = fmt->format;
1236 		}
1237 	} else {
1238 		if (ov965x->streaming) {
1239 			ret = -EBUSY;
1240 		} else {
1241 			ov965x->frame_size = size;
1242 			ov965x->format = fmt->format;
1243 			ov965x->tslb_reg = ov965x_formats[index].tslb_reg;
1244 			ov965x->apply_frame_fmt = 1;
1245 		}
1246 	}
1247 
1248 	if (!ret && fmt->which == V4L2_SUBDEV_FORMAT_ACTIVE) {
1249 		struct v4l2_subdev_frame_interval fiv = {
1250 			.interval = { 0, 1 }
1251 		};
1252 		/* Reset to minimum possible frame interval */
1253 		__ov965x_set_frame_interval(ov965x, &fiv);
1254 	}
1255 	mutex_unlock(&ov965x->lock);
1256 
1257 	if (!ret)
1258 		ov965x_update_exposure_ctrl(ov965x);
1259 
1260 	return ret;
1261 }
1262 
1263 static int ov965x_set_frame_size(struct ov965x *ov965x)
1264 {
1265 	int i, ret = 0;
1266 
1267 	for (i = 0; ret == 0 && i < NUM_FMT_REGS; i++)
1268 		ret = ov965x_write(ov965x->client, frame_size_reg_addr[i],
1269 				   ov965x->frame_size->regs[i]);
1270 	return ret;
1271 }
1272 
1273 static int __ov965x_set_params(struct ov965x *ov965x)
1274 {
1275 	struct i2c_client *client = ov965x->client;
1276 	struct ov965x_ctrls *ctrls = &ov965x->ctrls;
1277 	int ret = 0;
1278 	u8 reg;
1279 
1280 	if (ov965x->apply_frame_fmt) {
1281 		reg = DEF_CLKRC + ov965x->fiv->clkrc_div;
1282 		ret = ov965x_write(client, REG_CLKRC, reg);
1283 		if (ret < 0)
1284 			return ret;
1285 		ret = ov965x_set_frame_size(ov965x);
1286 		if (ret < 0)
1287 			return ret;
1288 		ret = ov965x_read(client, REG_TSLB, &reg);
1289 		if (ret < 0)
1290 			return ret;
1291 		reg &= ~TSLB_YUYV_MASK;
1292 		reg |= ov965x->tslb_reg;
1293 		ret = ov965x_write(client, REG_TSLB, reg);
1294 		if (ret < 0)
1295 			return ret;
1296 	}
1297 	ret = ov965x_set_default_gamma_curve(ov965x);
1298 	if (ret < 0)
1299 		return ret;
1300 	ret = ov965x_set_color_matrix(ov965x);
1301 	if (ret < 0)
1302 		return ret;
1303 	/*
1304 	 * Select manual banding filter, the filter will
1305 	 * be enabled further if required.
1306 	 */
1307 	ret = ov965x_read(client, REG_COM11, &reg);
1308 	if (!ret)
1309 		reg |= COM11_BANDING;
1310 	ret = ov965x_write(client, REG_COM11, reg);
1311 	if (ret < 0)
1312 		return ret;
1313 	/*
1314 	 * Banding filter (REG_MBD value) needs to match selected
1315 	 * resolution and frame rate, so it's always updated here.
1316 	 */
1317 	return ov965x_set_banding_filter(ov965x, ctrls->light_freq->val);
1318 }
1319 
1320 static int ov965x_s_stream(struct v4l2_subdev *sd, int on)
1321 {
1322 	struct i2c_client *client = v4l2_get_subdevdata(sd);
1323 	struct ov965x *ov965x = to_ov965x(sd);
1324 	struct ov965x_ctrls *ctrls = &ov965x->ctrls;
1325 	int ret = 0;
1326 
1327 	v4l2_dbg(1, debug, client, "%s: on: %d\n", __func__, on);
1328 
1329 	mutex_lock(&ov965x->lock);
1330 	if (ov965x->streaming == !on) {
1331 		if (on)
1332 			ret = __ov965x_set_params(ov965x);
1333 
1334 		if (!ret && ctrls->update) {
1335 			/*
1336 			 * ov965x_s_ctrl callback takes the mutex
1337 			 * so it needs to be released here.
1338 			 */
1339 			mutex_unlock(&ov965x->lock);
1340 			ret = v4l2_ctrl_handler_setup(&ctrls->handler);
1341 
1342 			mutex_lock(&ov965x->lock);
1343 			if (!ret)
1344 				ctrls->update = 0;
1345 		}
1346 		if (!ret)
1347 			ret = ov965x_write(client, REG_COM2,
1348 					   on ? 0x01 : 0x11);
1349 	}
1350 	if (!ret)
1351 		ov965x->streaming += on ? 1 : -1;
1352 
1353 	WARN_ON(ov965x->streaming < 0);
1354 	mutex_unlock(&ov965x->lock);
1355 
1356 	return ret;
1357 }
1358 
1359 /*
1360  * V4L2 subdev internal operations
1361  */
1362 static int ov965x_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
1363 {
1364 	struct v4l2_mbus_framefmt *mf = v4l2_subdev_get_try_format(sd, fh->pad, 0);
1365 
1366 	ov965x_get_default_format(mf);
1367 	return 0;
1368 }
1369 
1370 static const struct v4l2_subdev_pad_ops ov965x_pad_ops = {
1371 	.enum_mbus_code = ov965x_enum_mbus_code,
1372 	.enum_frame_size = ov965x_enum_frame_sizes,
1373 	.get_fmt = ov965x_get_fmt,
1374 	.set_fmt = ov965x_set_fmt,
1375 };
1376 
1377 static const struct v4l2_subdev_video_ops ov965x_video_ops = {
1378 	.s_stream = ov965x_s_stream,
1379 	.g_frame_interval = ov965x_g_frame_interval,
1380 	.s_frame_interval = ov965x_s_frame_interval,
1381 
1382 };
1383 
1384 static const struct v4l2_subdev_internal_ops ov965x_sd_internal_ops = {
1385 	.open = ov965x_open,
1386 };
1387 
1388 static const struct v4l2_subdev_core_ops ov965x_core_ops = {
1389 	.s_power = ov965x_s_power,
1390 	.log_status = v4l2_ctrl_subdev_log_status,
1391 	.subscribe_event = v4l2_ctrl_subdev_subscribe_event,
1392 	.unsubscribe_event = v4l2_event_subdev_unsubscribe,
1393 };
1394 
1395 static const struct v4l2_subdev_ops ov965x_subdev_ops = {
1396 	.core = &ov965x_core_ops,
1397 	.pad = &ov965x_pad_ops,
1398 	.video = &ov965x_video_ops,
1399 };
1400 
1401 /*
1402  * Reset and power down GPIOs configuration
1403  */
1404 static int ov965x_configure_gpios(struct ov965x *ov965x,
1405 				  const struct ov9650_platform_data *pdata)
1406 {
1407 	int ret, i;
1408 
1409 	ov965x->gpios[GPIO_PWDN] = pdata->gpio_pwdn;
1410 	ov965x->gpios[GPIO_RST]  = pdata->gpio_reset;
1411 
1412 	for (i = 0; i < ARRAY_SIZE(ov965x->gpios); i++) {
1413 		int gpio = ov965x->gpios[i];
1414 
1415 		if (!gpio_is_valid(gpio))
1416 			continue;
1417 		ret = devm_gpio_request_one(&ov965x->client->dev, gpio,
1418 					    GPIOF_OUT_INIT_HIGH, "OV965X");
1419 		if (ret < 0)
1420 			return ret;
1421 		v4l2_dbg(1, debug, &ov965x->sd, "set gpio %d to 1\n", gpio);
1422 
1423 		gpio_set_value(gpio, 1);
1424 		gpio_export(gpio, 0);
1425 		ov965x->gpios[i] = gpio;
1426 	}
1427 
1428 	return 0;
1429 }
1430 
1431 static int ov965x_detect_sensor(struct v4l2_subdev *sd)
1432 {
1433 	struct i2c_client *client = v4l2_get_subdevdata(sd);
1434 	struct ov965x *ov965x = to_ov965x(sd);
1435 	u8 pid, ver;
1436 	int ret;
1437 
1438 	mutex_lock(&ov965x->lock);
1439 	__ov965x_set_power(ov965x, 1);
1440 	usleep_range(25000, 26000);
1441 
1442 	/* Check sensor revision */
1443 	ret = ov965x_read(client, REG_PID, &pid);
1444 	if (!ret)
1445 		ret = ov965x_read(client, REG_VER, &ver);
1446 
1447 	__ov965x_set_power(ov965x, 0);
1448 
1449 	if (!ret) {
1450 		ov965x->id = OV965X_ID(pid, ver);
1451 		if (ov965x->id == OV9650_ID || ov965x->id == OV9652_ID) {
1452 			v4l2_info(sd, "Found OV%04X sensor\n", ov965x->id);
1453 		} else {
1454 			v4l2_err(sd, "Sensor detection failed (%04X, %d)\n",
1455 				 ov965x->id, ret);
1456 			ret = -ENODEV;
1457 		}
1458 	}
1459 	mutex_unlock(&ov965x->lock);
1460 
1461 	return ret;
1462 }
1463 
1464 static int ov965x_probe(struct i2c_client *client,
1465 			const struct i2c_device_id *id)
1466 {
1467 	const struct ov9650_platform_data *pdata = client->dev.platform_data;
1468 	struct v4l2_subdev *sd;
1469 	struct ov965x *ov965x;
1470 	int ret;
1471 
1472 	if (pdata == NULL) {
1473 		dev_err(&client->dev, "platform data not specified\n");
1474 		return -EINVAL;
1475 	}
1476 
1477 	if (pdata->mclk_frequency == 0) {
1478 		dev_err(&client->dev, "MCLK frequency not specified\n");
1479 		return -EINVAL;
1480 	}
1481 
1482 	ov965x = devm_kzalloc(&client->dev, sizeof(*ov965x), GFP_KERNEL);
1483 	if (!ov965x)
1484 		return -ENOMEM;
1485 
1486 	mutex_init(&ov965x->lock);
1487 	ov965x->client = client;
1488 	ov965x->mclk_frequency = pdata->mclk_frequency;
1489 
1490 	sd = &ov965x->sd;
1491 	v4l2_i2c_subdev_init(sd, client, &ov965x_subdev_ops);
1492 	strlcpy(sd->name, DRIVER_NAME, sizeof(sd->name));
1493 
1494 	sd->internal_ops = &ov965x_sd_internal_ops;
1495 	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
1496 		     V4L2_SUBDEV_FL_HAS_EVENTS;
1497 
1498 	ret = ov965x_configure_gpios(ov965x, pdata);
1499 	if (ret < 0)
1500 		return ret;
1501 
1502 	ov965x->pad.flags = MEDIA_PAD_FL_SOURCE;
1503 	sd->entity.type = MEDIA_ENT_T_V4L2_SUBDEV_SENSOR;
1504 	ret = media_entity_init(&sd->entity, 1, &ov965x->pad);
1505 	if (ret < 0)
1506 		return ret;
1507 
1508 	ret = ov965x_initialize_controls(ov965x);
1509 	if (ret < 0)
1510 		goto err_me;
1511 
1512 	ov965x_get_default_format(&ov965x->format);
1513 	ov965x->frame_size = &ov965x_framesizes[0];
1514 	ov965x->fiv = &ov965x_intervals[0];
1515 
1516 	ret = ov965x_detect_sensor(sd);
1517 	if (ret < 0)
1518 		goto err_ctrls;
1519 
1520 	/* Update exposure time min/max to match frame format */
1521 	ov965x_update_exposure_ctrl(ov965x);
1522 
1523 	return 0;
1524 err_ctrls:
1525 	v4l2_ctrl_handler_free(sd->ctrl_handler);
1526 err_me:
1527 	media_entity_cleanup(&sd->entity);
1528 	return ret;
1529 }
1530 
1531 static int ov965x_remove(struct i2c_client *client)
1532 {
1533 	struct v4l2_subdev *sd = i2c_get_clientdata(client);
1534 
1535 	v4l2_device_unregister_subdev(sd);
1536 	v4l2_ctrl_handler_free(sd->ctrl_handler);
1537 	media_entity_cleanup(&sd->entity);
1538 
1539 	return 0;
1540 }
1541 
1542 static const struct i2c_device_id ov965x_id[] = {
1543 	{ "OV9650", 0 },
1544 	{ "OV9652", 0 },
1545 	{ /* sentinel */ }
1546 };
1547 MODULE_DEVICE_TABLE(i2c, ov965x_id);
1548 
1549 static struct i2c_driver ov965x_i2c_driver = {
1550 	.driver = {
1551 		.name	= DRIVER_NAME,
1552 	},
1553 	.probe		= ov965x_probe,
1554 	.remove		= ov965x_remove,
1555 	.id_table	= ov965x_id,
1556 };
1557 
1558 module_i2c_driver(ov965x_i2c_driver);
1559 
1560 MODULE_AUTHOR("Sylwester Nawrocki <sylvester.nawrocki@gmail.com>");
1561 MODULE_DESCRIPTION("OV9650/OV9652 CMOS Image Sensor driver");
1562 MODULE_LICENSE("GPL");
1563