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