• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Support for OmniVision OV2722 1080p HD camera sensor.
3  *
4  * Copyright (c) 2013 Intel Corporation. All Rights Reserved.
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License version
8  * 2 as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18  * 02110-1301, USA.
19  *
20  */
21 
22 #ifndef __OV2722_H__
23 #define __OV2722_H__
24 #include <linux/kernel.h>
25 #include <linux/types.h>
26 #include <linux/i2c.h>
27 #include <linux/delay.h>
28 #include <linux/videodev2.h>
29 #include <linux/spinlock.h>
30 #include <media/v4l2-subdev.h>
31 #include <media/v4l2-device.h>
32 #include <linux/v4l2-mediabus.h>
33 #include <media/media-entity.h>
34 #include <media/v4l2-ctrls.h>
35 
36 #include "../include/linux/atomisp_platform.h"
37 
38 #define OV2722_NAME		"ov2722"
39 
40 #define OV2722_POWER_UP_RETRY_NUM 5
41 
42 /* Defines for register writes and register array processing */
43 #define I2C_MSG_LENGTH		0x2
44 #define I2C_RETRY_COUNT		5
45 
46 #define OV2722_FOCAL_LENGTH_NUM	278	/*2.78mm*/
47 #define OV2722_FOCAL_LENGTH_DEM	100
48 #define OV2722_F_NUMBER_DEFAULT_NUM	26
49 #define OV2722_F_NUMBER_DEM	10
50 
51 #define MAX_FMTS		1
52 
53 /*
54  * focal length bits definition:
55  * bits 31-16: numerator, bits 15-0: denominator
56  */
57 #define OV2722_FOCAL_LENGTH_DEFAULT 0x1160064
58 
59 /*
60  * current f-number bits definition:
61  * bits 31-16: numerator, bits 15-0: denominator
62  */
63 #define OV2722_F_NUMBER_DEFAULT 0x1a000a
64 
65 /*
66  * f-number range bits definition:
67  * bits 31-24: max f-number numerator
68  * bits 23-16: max f-number denominator
69  * bits 15-8: min f-number numerator
70  * bits 7-0: min f-number denominator
71  */
72 #define OV2722_F_NUMBER_RANGE 0x1a0a1a0a
73 #define OV2720_ID	0x2720
74 #define OV2722_ID	0x2722
75 
76 #define OV2722_FINE_INTG_TIME_MIN 0
77 #define OV2722_FINE_INTG_TIME_MAX_MARGIN 0
78 #define OV2722_COARSE_INTG_TIME_MIN 1
79 #define OV2722_COARSE_INTG_TIME_MAX_MARGIN 4
80 
81 /*
82  * OV2722 System control registers
83  */
84 #define OV2722_SW_SLEEP				0x0100
85 #define OV2722_SW_RESET				0x0103
86 #define OV2722_SW_STREAM			0x0100
87 
88 #define OV2722_SC_CMMN_CHIP_ID_H		0x300A
89 #define OV2722_SC_CMMN_CHIP_ID_L		0x300B
90 #define OV2722_SC_CMMN_SCCB_ID			0x300C
91 #define OV2722_SC_CMMN_SUB_ID			0x302A /* process, version*/
92 
93 #define OV2722_SC_CMMN_PAD_OEN0			0x3000
94 #define OV2722_SC_CMMN_PAD_OEN1			0x3001
95 #define OV2722_SC_CMMN_PAD_OEN2			0x3002
96 #define OV2722_SC_CMMN_PAD_OUT0			0x3008
97 #define OV2722_SC_CMMN_PAD_OUT1			0x3009
98 #define OV2722_SC_CMMN_PAD_OUT2			0x300D
99 #define OV2722_SC_CMMN_PAD_SEL0			0x300E
100 #define OV2722_SC_CMMN_PAD_SEL1			0x300F
101 #define OV2722_SC_CMMN_PAD_SEL2			0x3010
102 
103 #define OV2722_SC_CMMN_PAD_PK			0x3011
104 #define OV2722_SC_CMMN_A_PWC_PK_O_13		0x3013
105 #define OV2722_SC_CMMN_A_PWC_PK_O_14		0x3014
106 
107 #define OV2722_SC_CMMN_CLKRST0			0x301A
108 #define OV2722_SC_CMMN_CLKRST1			0x301B
109 #define OV2722_SC_CMMN_CLKRST2			0x301C
110 #define OV2722_SC_CMMN_CLKRST3			0x301D
111 #define OV2722_SC_CMMN_CLKRST4			0x301E
112 #define OV2722_SC_CMMN_CLKRST5			0x3005
113 #define OV2722_SC_CMMN_PCLK_DIV_CTRL		0x3007
114 #define OV2722_SC_CMMN_CLOCK_SEL		0x3020
115 #define OV2722_SC_SOC_CLKRST5			0x3040
116 
117 #define OV2722_SC_CMMN_PLL_CTRL0		0x3034
118 #define OV2722_SC_CMMN_PLL_CTRL1		0x3035
119 #define OV2722_SC_CMMN_PLL_CTRL2		0x3039
120 #define OV2722_SC_CMMN_PLL_CTRL3		0x3037
121 #define OV2722_SC_CMMN_PLL_MULTIPLIER		0x3036
122 #define OV2722_SC_CMMN_PLL_DEBUG_OPT		0x3038
123 #define OV2722_SC_CMMN_PLLS_CTRL0		0x303A
124 #define OV2722_SC_CMMN_PLLS_CTRL1		0x303B
125 #define OV2722_SC_CMMN_PLLS_CTRL2		0x303C
126 #define OV2722_SC_CMMN_PLLS_CTRL3		0x303D
127 
128 #define OV2722_SC_CMMN_MIPI_PHY_16		0x3016
129 #define OV2722_SC_CMMN_MIPI_PHY_17		0x3017
130 #define OV2722_SC_CMMN_MIPI_SC_CTRL_18		0x3018
131 #define OV2722_SC_CMMN_MIPI_SC_CTRL_19		0x3019
132 #define OV2722_SC_CMMN_MIPI_SC_CTRL_21		0x3021
133 #define OV2722_SC_CMMN_MIPI_SC_CTRL_22		0x3022
134 
135 #define OV2722_AEC_PK_EXPO_H			0x3500
136 #define OV2722_AEC_PK_EXPO_M			0x3501
137 #define OV2722_AEC_PK_EXPO_L			0x3502
138 #define OV2722_AEC_MANUAL_CTRL			0x3503
139 #define OV2722_AGC_ADJ_H			0x3508
140 #define OV2722_AGC_ADJ_L			0x3509
141 #define OV2722_VTS_DIFF_H			0x350c
142 #define OV2722_VTS_DIFF_L			0x350d
143 #define OV2722_GROUP_ACCESS			0x3208
144 #define OV2722_HTS_H				0x380c
145 #define OV2722_HTS_L				0x380d
146 #define OV2722_VTS_H				0x380e
147 #define OV2722_VTS_L				0x380f
148 
149 #define OV2722_MWB_GAIN_R_H			0x5186
150 #define OV2722_MWB_GAIN_R_L			0x5187
151 #define OV2722_MWB_GAIN_G_H			0x5188
152 #define OV2722_MWB_GAIN_G_L			0x5189
153 #define OV2722_MWB_GAIN_B_H			0x518a
154 #define OV2722_MWB_GAIN_B_L			0x518b
155 
156 #define OV2722_H_CROP_START_H			0x3800
157 #define OV2722_H_CROP_START_L			0x3801
158 #define OV2722_V_CROP_START_H			0x3802
159 #define OV2722_V_CROP_START_L			0x3803
160 #define OV2722_H_CROP_END_H			0x3804
161 #define OV2722_H_CROP_END_L			0x3805
162 #define OV2722_V_CROP_END_H			0x3806
163 #define OV2722_V_CROP_END_L			0x3807
164 #define OV2722_H_OUTSIZE_H			0x3808
165 #define OV2722_H_OUTSIZE_L			0x3809
166 #define OV2722_V_OUTSIZE_H			0x380a
167 #define OV2722_V_OUTSIZE_L			0x380b
168 
169 #define OV2722_START_STREAMING			0x01
170 #define OV2722_STOP_STREAMING			0x00
171 
172 struct regval_list {
173 	u16 reg_num;
174 	u8 value;
175 };
176 
177 struct ov2722_resolution {
178 	u8 *desc;
179 	const struct ov2722_reg *regs;
180 	int res;
181 	int width;
182 	int height;
183 	int fps;
184 	int pix_clk_freq;
185 	u32 skip_frames;
186 	u16 pixels_per_line;
187 	u16 lines_per_frame;
188 	u8 bin_factor_x;
189 	u8 bin_factor_y;
190 	u8 bin_mode;
191 	bool used;
192 	int mipi_freq;
193 };
194 
195 struct ov2722_format {
196 	u8 *desc;
197 	u32 pixelformat;
198 	struct ov2722_reg *regs;
199 };
200 
201 /*
202  * ov2722 device structure.
203  */
204 struct ov2722_device {
205 	struct v4l2_subdev sd;
206 	struct media_pad pad;
207 	struct v4l2_mbus_framefmt format;
208 	struct mutex input_lock;
209 
210 	struct camera_sensor_platform_data *platform_data;
211 	int vt_pix_clk_freq_mhz;
212 	int fmt_idx;
213 	int run_mode;
214 	u16 pixels_per_line;
215 	u16 lines_per_frame;
216 	u8 res;
217 	u8 type;
218 
219 	struct v4l2_ctrl_handler ctrl_handler;
220 	struct v4l2_ctrl *link_freq;
221 };
222 
223 enum ov2722_tok_type {
224 	OV2722_8BIT  = 0x0001,
225 	OV2722_16BIT = 0x0002,
226 	OV2722_32BIT = 0x0004,
227 	OV2722_TOK_TERM   = 0xf000,	/* terminating token for reg list */
228 	OV2722_TOK_DELAY  = 0xfe00,	/* delay token for reg list */
229 	OV2722_TOK_MASK = 0xfff0
230 };
231 
232 /**
233  * struct ov2722_reg - MI sensor  register format
234  * @type: type of the register
235  * @reg: 16-bit offset to register
236  * @val: 8/16/32-bit register value
237  *
238  * Define a structure for sensor register initialization values
239  */
240 struct ov2722_reg {
241 	enum ov2722_tok_type type;
242 	u16 reg;
243 	u32 val;	/* @set value for read/mod/write, @mask */
244 };
245 
246 #define to_ov2722_sensor(x) container_of(x, struct ov2722_device, sd)
247 
248 #define OV2722_MAX_WRITE_BUF_SIZE	30
249 
250 struct ov2722_write_buffer {
251 	u16 addr;
252 	u8 data[OV2722_MAX_WRITE_BUF_SIZE];
253 };
254 
255 struct ov2722_write_ctrl {
256 	int index;
257 	struct ov2722_write_buffer buffer;
258 };
259 
260 static const struct i2c_device_id ov2722_id[] = {
261 	{OV2722_NAME, 0},
262 	{}
263 };
264 
265 /*
266  * Register settings for various resolution
267  */
268 static struct ov2722_reg const ov2722_QVGA_30fps[] = {
269 	{OV2722_8BIT, 0x3718, 0x10},
270 	{OV2722_8BIT, 0x3702, 0x0c},
271 	{OV2722_8BIT, 0x373a, 0x1c},
272 	{OV2722_8BIT, 0x3715, 0x01},
273 	{OV2722_8BIT, 0x3703, 0x0c},
274 	{OV2722_8BIT, 0x3705, 0x06},
275 	{OV2722_8BIT, 0x3730, 0x0e},
276 	{OV2722_8BIT, 0x3704, 0x1c},
277 	{OV2722_8BIT, 0x3f06, 0x00},
278 	{OV2722_8BIT, 0x371c, 0x00},
279 	{OV2722_8BIT, 0x371d, 0x46},
280 	{OV2722_8BIT, 0x371e, 0x00},
281 	{OV2722_8BIT, 0x371f, 0x63},
282 	{OV2722_8BIT, 0x3708, 0x61},
283 	{OV2722_8BIT, 0x3709, 0x12},
284 	{OV2722_8BIT, 0x3800, 0x01},
285 	{OV2722_8BIT, 0x3801, 0x42}, /* H crop start: 322 */
286 	{OV2722_8BIT, 0x3802, 0x00},
287 	{OV2722_8BIT, 0x3803, 0x20}, /* V crop start: 32 */
288 	{OV2722_8BIT, 0x3804, 0x06},
289 	{OV2722_8BIT, 0x3805, 0x95}, /* H crop end:  1685 */
290 	{OV2722_8BIT, 0x3806, 0x04},
291 	{OV2722_8BIT, 0x3807, 0x27}, /* V crop end:  1063 */
292 	{OV2722_8BIT, 0x3808, 0x01},
293 	{OV2722_8BIT, 0x3809, 0x50}, /* H output size: 336 */
294 	{OV2722_8BIT, 0x380a, 0x01},
295 	{OV2722_8BIT, 0x380b, 0x00}, /* V output size: 256 */
296 
297 	/* H blank timing */
298 	{OV2722_8BIT, 0x380c, 0x08},
299 	{OV2722_8BIT, 0x380d, 0x00}, /* H total size: 2048 */
300 	{OV2722_8BIT, 0x380e, 0x04},
301 	{OV2722_8BIT, 0x380f, 0xa0}, /* V total size: 1184 */
302 	{OV2722_8BIT, 0x3810, 0x00},
303 	{OV2722_8BIT, 0x3811, 0x04}, /* H window offset: 5 */
304 	{OV2722_8BIT, 0x3812, 0x00},
305 	{OV2722_8BIT, 0x3813, 0x01}, /* V window offset: 2 */
306 	{OV2722_8BIT, 0x3820, 0xc0},
307 	{OV2722_8BIT, 0x3821, 0x06}, /* flip isp*/
308 	{OV2722_8BIT, 0x3814, 0x71},
309 	{OV2722_8BIT, 0x3815, 0x71},
310 	{OV2722_8BIT, 0x3612, 0x49},
311 	{OV2722_8BIT, 0x3618, 0x00},
312 	{OV2722_8BIT, 0x3a08, 0x01},
313 	{OV2722_8BIT, 0x3a09, 0xc3},
314 	{OV2722_8BIT, 0x3a0a, 0x01},
315 	{OV2722_8BIT, 0x3a0b, 0x77},
316 	{OV2722_8BIT, 0x3a0d, 0x00},
317 	{OV2722_8BIT, 0x3a0e, 0x00},
318 	{OV2722_8BIT, 0x4520, 0x09},
319 	{OV2722_8BIT, 0x4837, 0x1b},
320 	{OV2722_8BIT, 0x3000, 0xff},
321 	{OV2722_8BIT, 0x3001, 0xff},
322 	{OV2722_8BIT, 0x3002, 0xf0},
323 	{OV2722_8BIT, 0x3600, 0x08},
324 	{OV2722_8BIT, 0x3621, 0xc0},
325 	{OV2722_8BIT, 0x3632, 0x53}, /* added for power opt */
326 	{OV2722_8BIT, 0x3633, 0x63},
327 	{OV2722_8BIT, 0x3634, 0x24},
328 	{OV2722_8BIT, 0x3f01, 0x0c},
329 	{OV2722_8BIT, 0x5001, 0xc1}, /* v_en, h_en, blc_en */
330 	{OV2722_8BIT, 0x3614, 0xf0},
331 	{OV2722_8BIT, 0x3630, 0x2d},
332 	{OV2722_8BIT, 0x370b, 0x62},
333 	{OV2722_8BIT, 0x3706, 0x61},
334 	{OV2722_8BIT, 0x4000, 0x02},
335 	{OV2722_8BIT, 0x4002, 0xc5},
336 	{OV2722_8BIT, 0x4005, 0x08},
337 	{OV2722_8BIT, 0x404f, 0x84},
338 	{OV2722_8BIT, 0x4051, 0x00},
339 	{OV2722_8BIT, 0x5000, 0xff},
340 	{OV2722_8BIT, 0x3a18, 0x00},
341 	{OV2722_8BIT, 0x3a19, 0x80},
342 	{OV2722_8BIT, 0x4521, 0x00},
343 	{OV2722_8BIT, 0x5183, 0xb0}, /* AWB red */
344 	{OV2722_8BIT, 0x5184, 0xb0}, /* AWB green */
345 	{OV2722_8BIT, 0x5185, 0xb0}, /* AWB blue */
346 	{OV2722_8BIT, 0x5180, 0x03}, /* AWB manual mode */
347 	{OV2722_8BIT, 0x370c, 0x0c},
348 	{OV2722_8BIT, 0x4800, 0x24}, /* clk lane gate enable */
349 	{OV2722_8BIT, 0x3035, 0x00},
350 	{OV2722_8BIT, 0x3036, 0x26},
351 	{OV2722_8BIT, 0x3037, 0xa1},
352 	{OV2722_8BIT, 0x303e, 0x19},
353 	{OV2722_8BIT, 0x3038, 0x06},
354 	{OV2722_8BIT, 0x3018, 0x04},
355 
356 	/* Added for power optimization */
357 	{OV2722_8BIT, 0x3000, 0x00},
358 	{OV2722_8BIT, 0x3001, 0x00},
359 	{OV2722_8BIT, 0x3002, 0x00},
360 	{OV2722_8BIT, 0x3a0f, 0x40},
361 	{OV2722_8BIT, 0x3a10, 0x38},
362 	{OV2722_8BIT, 0x3a1b, 0x48},
363 	{OV2722_8BIT, 0x3a1e, 0x30},
364 	{OV2722_8BIT, 0x3a11, 0x90},
365 	{OV2722_8BIT, 0x3a1f, 0x10},
366 	{OV2722_8BIT, 0x3011, 0x22},
367 	{OV2722_8BIT, 0x3a00, 0x58},
368 	{OV2722_8BIT, 0x3503, 0x17},
369 	{OV2722_8BIT, 0x3500, 0x00},
370 	{OV2722_8BIT, 0x3501, 0x46},
371 	{OV2722_8BIT, 0x3502, 0x00},
372 	{OV2722_8BIT, 0x3508, 0x00},
373 	{OV2722_8BIT, 0x3509, 0x10},
374 	{OV2722_TOK_TERM, 0, 0},
375 
376 };
377 
378 static struct ov2722_reg const ov2722_480P_30fps[] = {
379 	{OV2722_8BIT, 0x3718, 0x10},
380 	{OV2722_8BIT, 0x3702, 0x18},
381 	{OV2722_8BIT, 0x373a, 0x3c},
382 	{OV2722_8BIT, 0x3715, 0x01},
383 	{OV2722_8BIT, 0x3703, 0x1d},
384 	{OV2722_8BIT, 0x3705, 0x12},
385 	{OV2722_8BIT, 0x3730, 0x1f},
386 	{OV2722_8BIT, 0x3704, 0x3f},
387 	{OV2722_8BIT, 0x3f06, 0x1d},
388 	{OV2722_8BIT, 0x371c, 0x00},
389 	{OV2722_8BIT, 0x371d, 0x83},
390 	{OV2722_8BIT, 0x371e, 0x00},
391 	{OV2722_8BIT, 0x371f, 0xbd},
392 	{OV2722_8BIT, 0x3708, 0x63},
393 	{OV2722_8BIT, 0x3709, 0x52},
394 	{OV2722_8BIT, 0x3800, 0x00},
395 	{OV2722_8BIT, 0x3801, 0xf2}, /* H crop start: 322 - 80 = 242*/
396 	{OV2722_8BIT, 0x3802, 0x00},
397 	{OV2722_8BIT, 0x3803, 0x20}, /* V crop start:  32*/
398 	{OV2722_8BIT, 0x3804, 0x06},
399 	{OV2722_8BIT, 0x3805, 0xBB}, /* H crop end:   1643 + 80 = 1723*/
400 	{OV2722_8BIT, 0x3806, 0x04},
401 	{OV2722_8BIT, 0x3807, 0x03}, /* V crop end:   1027*/
402 	{OV2722_8BIT, 0x3808, 0x02},
403 	{OV2722_8BIT, 0x3809, 0xE0}, /* H output size: 656 +80 = 736*/
404 	{OV2722_8BIT, 0x380a, 0x01},
405 	{OV2722_8BIT, 0x380b, 0xF0}, /* V output size: 496 */
406 
407 	/* H blank timing */
408 	{OV2722_8BIT, 0x380c, 0x08},
409 	{OV2722_8BIT, 0x380d, 0x00}, /* H total size: 2048 */
410 	{OV2722_8BIT, 0x380e, 0x04},
411 	{OV2722_8BIT, 0x380f, 0xa0}, /* V total size: 1184 */
412 	{OV2722_8BIT, 0x3810, 0x00},
413 	{OV2722_8BIT, 0x3811, 0x04}, /* H window offset: 5 */
414 	{OV2722_8BIT, 0x3812, 0x00},
415 	{OV2722_8BIT, 0x3813, 0x01}, /* V window offset: 2 */
416 	{OV2722_8BIT, 0x3820, 0x80},
417 	{OV2722_8BIT, 0x3821, 0x06}, /* flip isp*/
418 	{OV2722_8BIT, 0x3814, 0x31},
419 	{OV2722_8BIT, 0x3815, 0x31},
420 	{OV2722_8BIT, 0x3612, 0x4b},
421 	{OV2722_8BIT, 0x3618, 0x04},
422 	{OV2722_8BIT, 0x3a08, 0x02},
423 	{OV2722_8BIT, 0x3a09, 0x67},
424 	{OV2722_8BIT, 0x3a0a, 0x02},
425 	{OV2722_8BIT, 0x3a0b, 0x00},
426 	{OV2722_8BIT, 0x3a0d, 0x00},
427 	{OV2722_8BIT, 0x3a0e, 0x00},
428 	{OV2722_8BIT, 0x4520, 0x0a},
429 	{OV2722_8BIT, 0x4837, 0x1b},
430 	{OV2722_8BIT, 0x3000, 0xff},
431 	{OV2722_8BIT, 0x3001, 0xff},
432 	{OV2722_8BIT, 0x3002, 0xf0},
433 	{OV2722_8BIT, 0x3600, 0x08},
434 	{OV2722_8BIT, 0x3621, 0xc0},
435 	{OV2722_8BIT, 0x3632, 0x53}, /* added for power opt */
436 	{OV2722_8BIT, 0x3633, 0x63},
437 	{OV2722_8BIT, 0x3634, 0x24},
438 	{OV2722_8BIT, 0x3f01, 0x0c},
439 	{OV2722_8BIT, 0x5001, 0xc1}, /* v_en, h_en, blc_en */
440 	{OV2722_8BIT, 0x3614, 0xf0},
441 	{OV2722_8BIT, 0x3630, 0x2d},
442 	{OV2722_8BIT, 0x370b, 0x62},
443 	{OV2722_8BIT, 0x3706, 0x61},
444 	{OV2722_8BIT, 0x4000, 0x02},
445 	{OV2722_8BIT, 0x4002, 0xc5},
446 	{OV2722_8BIT, 0x4005, 0x08},
447 	{OV2722_8BIT, 0x404f, 0x84},
448 	{OV2722_8BIT, 0x4051, 0x00},
449 	{OV2722_8BIT, 0x5000, 0xff},
450 	{OV2722_8BIT, 0x3a18, 0x00},
451 	{OV2722_8BIT, 0x3a19, 0x80},
452 	{OV2722_8BIT, 0x4521, 0x00},
453 	{OV2722_8BIT, 0x5183, 0xb0}, /* AWB red */
454 	{OV2722_8BIT, 0x5184, 0xb0}, /* AWB green */
455 	{OV2722_8BIT, 0x5185, 0xb0}, /* AWB blue */
456 	{OV2722_8BIT, 0x5180, 0x03}, /* AWB manual mode */
457 	{OV2722_8BIT, 0x370c, 0x0c},
458 	{OV2722_8BIT, 0x4800, 0x24}, /* clk lane gate enable */
459 	{OV2722_8BIT, 0x3035, 0x00},
460 	{OV2722_8BIT, 0x3036, 0x26},
461 	{OV2722_8BIT, 0x3037, 0xa1},
462 	{OV2722_8BIT, 0x303e, 0x19},
463 	{OV2722_8BIT, 0x3038, 0x06},
464 	{OV2722_8BIT, 0x3018, 0x04},
465 
466 	/* Added for power optimization */
467 	{OV2722_8BIT, 0x3000, 0x00},
468 	{OV2722_8BIT, 0x3001, 0x00},
469 	{OV2722_8BIT, 0x3002, 0x00},
470 	{OV2722_8BIT, 0x3a0f, 0x40},
471 	{OV2722_8BIT, 0x3a10, 0x38},
472 	{OV2722_8BIT, 0x3a1b, 0x48},
473 	{OV2722_8BIT, 0x3a1e, 0x30},
474 	{OV2722_8BIT, 0x3a11, 0x90},
475 	{OV2722_8BIT, 0x3a1f, 0x10},
476 	{OV2722_8BIT, 0x3011, 0x22},
477 	{OV2722_8BIT, 0x3a00, 0x58},
478 	{OV2722_8BIT, 0x3503, 0x17},
479 	{OV2722_8BIT, 0x3500, 0x00},
480 	{OV2722_8BIT, 0x3501, 0x46},
481 	{OV2722_8BIT, 0x3502, 0x00},
482 	{OV2722_8BIT, 0x3508, 0x00},
483 	{OV2722_8BIT, 0x3509, 0x10},
484 	{OV2722_TOK_TERM, 0, 0},
485 };
486 
487 static struct ov2722_reg const ov2722_VGA_30fps[] = {
488 	{OV2722_8BIT, 0x3718, 0x10},
489 	{OV2722_8BIT, 0x3702, 0x18},
490 	{OV2722_8BIT, 0x373a, 0x3c},
491 	{OV2722_8BIT, 0x3715, 0x01},
492 	{OV2722_8BIT, 0x3703, 0x1d},
493 	{OV2722_8BIT, 0x3705, 0x12},
494 	{OV2722_8BIT, 0x3730, 0x1f},
495 	{OV2722_8BIT, 0x3704, 0x3f},
496 	{OV2722_8BIT, 0x3f06, 0x1d},
497 	{OV2722_8BIT, 0x371c, 0x00},
498 	{OV2722_8BIT, 0x371d, 0x83},
499 	{OV2722_8BIT, 0x371e, 0x00},
500 	{OV2722_8BIT, 0x371f, 0xbd},
501 	{OV2722_8BIT, 0x3708, 0x63},
502 	{OV2722_8BIT, 0x3709, 0x52},
503 	{OV2722_8BIT, 0x3800, 0x01},
504 	{OV2722_8BIT, 0x3801, 0x42}, /* H crop start: 322 */
505 	{OV2722_8BIT, 0x3802, 0x00},
506 	{OV2722_8BIT, 0x3803, 0x20}, /* V crop start:  32*/
507 	{OV2722_8BIT, 0x3804, 0x06},
508 	{OV2722_8BIT, 0x3805, 0x6B}, /* H crop end:   1643*/
509 	{OV2722_8BIT, 0x3806, 0x04},
510 	{OV2722_8BIT, 0x3807, 0x03}, /* V crop end:   1027*/
511 	{OV2722_8BIT, 0x3808, 0x02},
512 	{OV2722_8BIT, 0x3809, 0x90}, /* H output size: 656 */
513 	{OV2722_8BIT, 0x380a, 0x01},
514 	{OV2722_8BIT, 0x380b, 0xF0}, /* V output size: 496 */
515 
516 	/* H blank timing */
517 	{OV2722_8BIT, 0x380c, 0x08},
518 	{OV2722_8BIT, 0x380d, 0x00}, /* H total size: 2048 */
519 	{OV2722_8BIT, 0x380e, 0x04},
520 	{OV2722_8BIT, 0x380f, 0xa0}, /* V total size: 1184 */
521 	{OV2722_8BIT, 0x3810, 0x00},
522 	{OV2722_8BIT, 0x3811, 0x04}, /* H window offset: 5 */
523 	{OV2722_8BIT, 0x3812, 0x00},
524 	{OV2722_8BIT, 0x3813, 0x01}, /* V window offset: 2 */
525 	{OV2722_8BIT, 0x3820, 0x80},
526 	{OV2722_8BIT, 0x3821, 0x06}, /* flip isp*/
527 	{OV2722_8BIT, 0x3814, 0x31},
528 	{OV2722_8BIT, 0x3815, 0x31},
529 	{OV2722_8BIT, 0x3612, 0x4b},
530 	{OV2722_8BIT, 0x3618, 0x04},
531 	{OV2722_8BIT, 0x3a08, 0x02},
532 	{OV2722_8BIT, 0x3a09, 0x67},
533 	{OV2722_8BIT, 0x3a0a, 0x02},
534 	{OV2722_8BIT, 0x3a0b, 0x00},
535 	{OV2722_8BIT, 0x3a0d, 0x00},
536 	{OV2722_8BIT, 0x3a0e, 0x00},
537 	{OV2722_8BIT, 0x4520, 0x0a},
538 	{OV2722_8BIT, 0x4837, 0x29},
539 	{OV2722_8BIT, 0x3000, 0xff},
540 	{OV2722_8BIT, 0x3001, 0xff},
541 	{OV2722_8BIT, 0x3002, 0xf0},
542 	{OV2722_8BIT, 0x3600, 0x08},
543 	{OV2722_8BIT, 0x3621, 0xc0},
544 	{OV2722_8BIT, 0x3632, 0x53}, /* added for power opt */
545 	{OV2722_8BIT, 0x3633, 0x63},
546 	{OV2722_8BIT, 0x3634, 0x24},
547 	{OV2722_8BIT, 0x3f01, 0x0c},
548 	{OV2722_8BIT, 0x5001, 0xc1}, /* v_en, h_en, blc_en */
549 	{OV2722_8BIT, 0x3614, 0xf0},
550 	{OV2722_8BIT, 0x3630, 0x2d},
551 	{OV2722_8BIT, 0x370b, 0x62},
552 	{OV2722_8BIT, 0x3706, 0x61},
553 	{OV2722_8BIT, 0x4000, 0x02},
554 	{OV2722_8BIT, 0x4002, 0xc5},
555 	{OV2722_8BIT, 0x4005, 0x08},
556 	{OV2722_8BIT, 0x404f, 0x84},
557 	{OV2722_8BIT, 0x4051, 0x00},
558 	{OV2722_8BIT, 0x5000, 0xff},
559 	{OV2722_8BIT, 0x3a18, 0x00},
560 	{OV2722_8BIT, 0x3a19, 0x80},
561 	{OV2722_8BIT, 0x4521, 0x00},
562 	{OV2722_8BIT, 0x5183, 0xb0}, /* AWB red */
563 	{OV2722_8BIT, 0x5184, 0xb0}, /* AWB green */
564 	{OV2722_8BIT, 0x5185, 0xb0}, /* AWB blue */
565 	{OV2722_8BIT, 0x5180, 0x03}, /* AWB manual mode */
566 	{OV2722_8BIT, 0x370c, 0x0c},
567 	{OV2722_8BIT, 0x4800, 0x24}, /* clk lane gate enable */
568 	{OV2722_8BIT, 0x3035, 0x00},
569 	{OV2722_8BIT, 0x3036, 0x26},
570 	{OV2722_8BIT, 0x3037, 0xa1},
571 	{OV2722_8BIT, 0x303e, 0x19},
572 	{OV2722_8BIT, 0x3038, 0x06},
573 	{OV2722_8BIT, 0x3018, 0x04},
574 
575 	/* Added for power optimization */
576 	{OV2722_8BIT, 0x3000, 0x00},
577 	{OV2722_8BIT, 0x3001, 0x00},
578 	{OV2722_8BIT, 0x3002, 0x00},
579 	{OV2722_8BIT, 0x3a0f, 0x40},
580 	{OV2722_8BIT, 0x3a10, 0x38},
581 	{OV2722_8BIT, 0x3a1b, 0x48},
582 	{OV2722_8BIT, 0x3a1e, 0x30},
583 	{OV2722_8BIT, 0x3a11, 0x90},
584 	{OV2722_8BIT, 0x3a1f, 0x10},
585 	{OV2722_8BIT, 0x3011, 0x22},
586 	{OV2722_8BIT, 0x3a00, 0x58},
587 	{OV2722_8BIT, 0x3503, 0x17},
588 	{OV2722_8BIT, 0x3500, 0x00},
589 	{OV2722_8BIT, 0x3501, 0x46},
590 	{OV2722_8BIT, 0x3502, 0x00},
591 	{OV2722_8BIT, 0x3508, 0x00},
592 	{OV2722_8BIT, 0x3509, 0x10},
593 	{OV2722_TOK_TERM, 0, 0},
594 };
595 
596 static struct ov2722_reg const ov2722_1632_1092_30fps[] = {
597 	{OV2722_8BIT, 0x3021, 0x03}, /* For stand wait for
598 				a whole frame complete.(vblank) */
599 	{OV2722_8BIT, 0x3718, 0x10},
600 	{OV2722_8BIT, 0x3702, 0x24},
601 	{OV2722_8BIT, 0x373a, 0x60},
602 	{OV2722_8BIT, 0x3715, 0x01},
603 	{OV2722_8BIT, 0x3703, 0x2e},
604 	{OV2722_8BIT, 0x3705, 0x10},
605 	{OV2722_8BIT, 0x3730, 0x30},
606 	{OV2722_8BIT, 0x3704, 0x62},
607 	{OV2722_8BIT, 0x3f06, 0x3a},
608 	{OV2722_8BIT, 0x371c, 0x00},
609 	{OV2722_8BIT, 0x371d, 0xc4},
610 	{OV2722_8BIT, 0x371e, 0x01},
611 	{OV2722_8BIT, 0x371f, 0x0d},
612 	{OV2722_8BIT, 0x3708, 0x61},
613 	{OV2722_8BIT, 0x3709, 0x12},
614 	{OV2722_8BIT, 0x3800, 0x00},
615 	{OV2722_8BIT, 0x3801, 0x9E}, /* H crop start: 158 */
616 	{OV2722_8BIT, 0x3802, 0x00},
617 	{OV2722_8BIT, 0x3803, 0x01}, /* V crop start: 1 */
618 	{OV2722_8BIT, 0x3804, 0x07},
619 	{OV2722_8BIT, 0x3805, 0x05}, /* H crop end: 1797 */
620 	{OV2722_8BIT, 0x3806, 0x04},
621 	{OV2722_8BIT, 0x3807, 0x45}, /* V crop end: 1093 */
622 
623 	{OV2722_8BIT, 0x3808, 0x06},
624 	{OV2722_8BIT, 0x3809, 0x60}, /* H output size: 1632 */
625 	{OV2722_8BIT, 0x380a, 0x04},
626 	{OV2722_8BIT, 0x380b, 0x44}, /* V output size: 1092 */
627 	{OV2722_8BIT, 0x380c, 0x08},
628 	{OV2722_8BIT, 0x380d, 0xd4}, /* H timing: 2260 */
629 	{OV2722_8BIT, 0x380e, 0x04},
630 	{OV2722_8BIT, 0x380f, 0xdc}, /* V timing: 1244 */
631 	{OV2722_8BIT, 0x3810, 0x00},
632 	{OV2722_8BIT, 0x3811, 0x03}, /* H window offset: 3 */
633 	{OV2722_8BIT, 0x3812, 0x00},
634 	{OV2722_8BIT, 0x3813, 0x02}, /* V window offset: 2 */
635 	{OV2722_8BIT, 0x3820, 0x80},
636 	{OV2722_8BIT, 0x3821, 0x06}, /*  mirror */
637 	{OV2722_8BIT, 0x3814, 0x11},
638 	{OV2722_8BIT, 0x3815, 0x11},
639 	{OV2722_8BIT, 0x3612, 0x0b},
640 	{OV2722_8BIT, 0x3618, 0x04},
641 	{OV2722_8BIT, 0x3a08, 0x01},
642 	{OV2722_8BIT, 0x3a09, 0x50},
643 	{OV2722_8BIT, 0x3a0a, 0x01},
644 	{OV2722_8BIT, 0x3a0b, 0x18},
645 	{OV2722_8BIT, 0x3a0d, 0x03},
646 	{OV2722_8BIT, 0x3a0e, 0x03},
647 	{OV2722_8BIT, 0x4520, 0x00},
648 	{OV2722_8BIT, 0x4837, 0x1b},
649 	{OV2722_8BIT, 0x3600, 0x08},
650 	{OV2722_8BIT, 0x3621, 0xc0},
651 	{OV2722_8BIT, 0x3632, 0xd2}, /* added for power opt */
652 	{OV2722_8BIT, 0x3633, 0x23},
653 	{OV2722_8BIT, 0x3634, 0x54},
654 	{OV2722_8BIT, 0x3f01, 0x0c},
655 	{OV2722_8BIT, 0x5001, 0xc1},
656 	{OV2722_8BIT, 0x3614, 0xf0},
657 	{OV2722_8BIT, 0x3630, 0x2d},
658 	{OV2722_8BIT, 0x370b, 0x62},
659 	{OV2722_8BIT, 0x3706, 0x61},
660 	{OV2722_8BIT, 0x4000, 0x02},
661 	{OV2722_8BIT, 0x4002, 0xc5},
662 	{OV2722_8BIT, 0x4005, 0x08},
663 	{OV2722_8BIT, 0x404f, 0x84},
664 	{OV2722_8BIT, 0x4051, 0x00},
665 	{OV2722_8BIT, 0x5000, 0xcf}, /* manual 3a */
666 	{OV2722_8BIT, 0x301d, 0xf0}, /* enable group hold */
667 	{OV2722_8BIT, 0x3a18, 0x00},
668 	{OV2722_8BIT, 0x3a19, 0x80},
669 	{OV2722_8BIT, 0x4521, 0x00},
670 	{OV2722_8BIT, 0x5183, 0xb0},
671 	{OV2722_8BIT, 0x5184, 0xb0},
672 	{OV2722_8BIT, 0x5185, 0xb0},
673 	{OV2722_8BIT, 0x370c, 0x0c},
674 	{OV2722_8BIT, 0x3035, 0x00},
675 	{OV2722_8BIT, 0x3036, 0x2c}, /* 422.4 MHz */
676 	{OV2722_8BIT, 0x3037, 0xa1},
677 	{OV2722_8BIT, 0x303e, 0x19},
678 	{OV2722_8BIT, 0x3038, 0x06},
679 	{OV2722_8BIT, 0x3018, 0x04},
680 	{OV2722_8BIT, 0x3000, 0x00}, /* added for power optimization */
681 	{OV2722_8BIT, 0x3001, 0x00},
682 	{OV2722_8BIT, 0x3002, 0x00},
683 	{OV2722_8BIT, 0x3a0f, 0x40},
684 	{OV2722_8BIT, 0x3a10, 0x38},
685 	{OV2722_8BIT, 0x3a1b, 0x48},
686 	{OV2722_8BIT, 0x3a1e, 0x30},
687 	{OV2722_8BIT, 0x3a11, 0x90},
688 	{OV2722_8BIT, 0x3a1f, 0x10},
689 	{OV2722_8BIT, 0x3503, 0x17}, /* manual 3a */
690 	{OV2722_8BIT, 0x3500, 0x00},
691 	{OV2722_8BIT, 0x3501, 0x3F},
692 	{OV2722_8BIT, 0x3502, 0x00},
693 	{OV2722_8BIT, 0x3508, 0x00},
694 	{OV2722_8BIT, 0x3509, 0x00},
695 	{OV2722_TOK_TERM, 0, 0}
696 };
697 
698 static struct ov2722_reg const ov2722_1452_1092_30fps[] = {
699 	{OV2722_8BIT, 0x3021, 0x03}, /* For stand wait for
700 				a whole frame complete.(vblank) */
701 	{OV2722_8BIT, 0x3718, 0x10},
702 	{OV2722_8BIT, 0x3702, 0x24},
703 	{OV2722_8BIT, 0x373a, 0x60},
704 	{OV2722_8BIT, 0x3715, 0x01},
705 	{OV2722_8BIT, 0x3703, 0x2e},
706 	{OV2722_8BIT, 0x3705, 0x10},
707 	{OV2722_8BIT, 0x3730, 0x30},
708 	{OV2722_8BIT, 0x3704, 0x62},
709 	{OV2722_8BIT, 0x3f06, 0x3a},
710 	{OV2722_8BIT, 0x371c, 0x00},
711 	{OV2722_8BIT, 0x371d, 0xc4},
712 	{OV2722_8BIT, 0x371e, 0x01},
713 	{OV2722_8BIT, 0x371f, 0x0d},
714 	{OV2722_8BIT, 0x3708, 0x61},
715 	{OV2722_8BIT, 0x3709, 0x12},
716 	{OV2722_8BIT, 0x3800, 0x00},
717 	{OV2722_8BIT, 0x3801, 0xF8}, /* H crop start: 248 */
718 	{OV2722_8BIT, 0x3802, 0x00},
719 	{OV2722_8BIT, 0x3803, 0x01}, /* V crop start: 1 */
720 	{OV2722_8BIT, 0x3804, 0x06},
721 	{OV2722_8BIT, 0x3805, 0xab}, /* H crop end: 1707 */
722 	{OV2722_8BIT, 0x3806, 0x04},
723 	{OV2722_8BIT, 0x3807, 0x45}, /* V crop end: 1093 */
724 	{OV2722_8BIT, 0x3808, 0x05},
725 	{OV2722_8BIT, 0x3809, 0xac}, /* H output size: 1452 */
726 	{OV2722_8BIT, 0x380a, 0x04},
727 	{OV2722_8BIT, 0x380b, 0x44}, /* V output size: 1092 */
728 	{OV2722_8BIT, 0x380c, 0x08},
729 	{OV2722_8BIT, 0x380d, 0xd4}, /* H timing: 2260 */
730 	{OV2722_8BIT, 0x380e, 0x04},
731 	{OV2722_8BIT, 0x380f, 0xdc}, /* V timing: 1244 */
732 	{OV2722_8BIT, 0x3810, 0x00},
733 	{OV2722_8BIT, 0x3811, 0x03}, /* H window offset: 3 */
734 	{OV2722_8BIT, 0x3812, 0x00},
735 	{OV2722_8BIT, 0x3813, 0x02}, /* V window offset: 2 */
736 	{OV2722_8BIT, 0x3820, 0x80},
737 	{OV2722_8BIT, 0x3821, 0x06}, /*  mirror */
738 	{OV2722_8BIT, 0x3814, 0x11},
739 	{OV2722_8BIT, 0x3815, 0x11},
740 	{OV2722_8BIT, 0x3612, 0x0b},
741 	{OV2722_8BIT, 0x3618, 0x04},
742 	{OV2722_8BIT, 0x3a08, 0x01},
743 	{OV2722_8BIT, 0x3a09, 0x50},
744 	{OV2722_8BIT, 0x3a0a, 0x01},
745 	{OV2722_8BIT, 0x3a0b, 0x18},
746 	{OV2722_8BIT, 0x3a0d, 0x03},
747 	{OV2722_8BIT, 0x3a0e, 0x03},
748 	{OV2722_8BIT, 0x4520, 0x00},
749 	{OV2722_8BIT, 0x4837, 0x1b},
750 	{OV2722_8BIT, 0x3600, 0x08},
751 	{OV2722_8BIT, 0x3621, 0xc0},
752 	{OV2722_8BIT, 0x3632, 0xd2}, /* added for power opt */
753 	{OV2722_8BIT, 0x3633, 0x23},
754 	{OV2722_8BIT, 0x3634, 0x54},
755 	{OV2722_8BIT, 0x3f01, 0x0c},
756 	{OV2722_8BIT, 0x5001, 0xc1},
757 	{OV2722_8BIT, 0x3614, 0xf0},
758 	{OV2722_8BIT, 0x3630, 0x2d},
759 	{OV2722_8BIT, 0x370b, 0x62},
760 	{OV2722_8BIT, 0x3706, 0x61},
761 	{OV2722_8BIT, 0x4000, 0x02},
762 	{OV2722_8BIT, 0x4002, 0xc5},
763 	{OV2722_8BIT, 0x4005, 0x08},
764 	{OV2722_8BIT, 0x404f, 0x84},
765 	{OV2722_8BIT, 0x4051, 0x00},
766 	{OV2722_8BIT, 0x5000, 0xcf}, /* manual 3a */
767 	{OV2722_8BIT, 0x301d, 0xf0}, /* enable group hold */
768 	{OV2722_8BIT, 0x3a18, 0x00},
769 	{OV2722_8BIT, 0x3a19, 0x80},
770 	{OV2722_8BIT, 0x4521, 0x00},
771 	{OV2722_8BIT, 0x5183, 0xb0},
772 	{OV2722_8BIT, 0x5184, 0xb0},
773 	{OV2722_8BIT, 0x5185, 0xb0},
774 	{OV2722_8BIT, 0x370c, 0x0c},
775 	{OV2722_8BIT, 0x3035, 0x00},
776 	{OV2722_8BIT, 0x3036, 0x2c}, /* 422.4 MHz */
777 	{OV2722_8BIT, 0x3037, 0xa1},
778 	{OV2722_8BIT, 0x303e, 0x19},
779 	{OV2722_8BIT, 0x3038, 0x06},
780 	{OV2722_8BIT, 0x3018, 0x04},
781 	{OV2722_8BIT, 0x3000, 0x00}, /* added for power optimization */
782 	{OV2722_8BIT, 0x3001, 0x00},
783 	{OV2722_8BIT, 0x3002, 0x00},
784 	{OV2722_8BIT, 0x3a0f, 0x40},
785 	{OV2722_8BIT, 0x3a10, 0x38},
786 	{OV2722_8BIT, 0x3a1b, 0x48},
787 	{OV2722_8BIT, 0x3a1e, 0x30},
788 	{OV2722_8BIT, 0x3a11, 0x90},
789 	{OV2722_8BIT, 0x3a1f, 0x10},
790 	{OV2722_8BIT, 0x3503, 0x17}, /* manual 3a */
791 	{OV2722_8BIT, 0x3500, 0x00},
792 	{OV2722_8BIT, 0x3501, 0x3F},
793 	{OV2722_8BIT, 0x3502, 0x00},
794 	{OV2722_8BIT, 0x3508, 0x00},
795 	{OV2722_8BIT, 0x3509, 0x00},
796 	{OV2722_TOK_TERM, 0, 0}
797 };
798 static struct ov2722_reg const ov2722_1M3_30fps[] = {
799 	{OV2722_8BIT, 0x3718, 0x10},
800 	{OV2722_8BIT, 0x3702, 0x24},
801 	{OV2722_8BIT, 0x373a, 0x60},
802 	{OV2722_8BIT, 0x3715, 0x01},
803 	{OV2722_8BIT, 0x3703, 0x2e},
804 	{OV2722_8BIT, 0x3705, 0x10},
805 	{OV2722_8BIT, 0x3730, 0x30},
806 	{OV2722_8BIT, 0x3704, 0x62},
807 	{OV2722_8BIT, 0x3f06, 0x3a},
808 	{OV2722_8BIT, 0x371c, 0x00},
809 	{OV2722_8BIT, 0x371d, 0xc4},
810 	{OV2722_8BIT, 0x371e, 0x01},
811 	{OV2722_8BIT, 0x371f, 0x0d},
812 	{OV2722_8BIT, 0x3708, 0x61},
813 	{OV2722_8BIT, 0x3709, 0x12},
814 	{OV2722_8BIT, 0x3800, 0x01},
815 	{OV2722_8BIT, 0x3801, 0x4a},	/* H crop start: 330 */
816 	{OV2722_8BIT, 0x3802, 0x00},
817 	{OV2722_8BIT, 0x3803, 0x03},	/* V crop start: 3 */
818 	{OV2722_8BIT, 0x3804, 0x06},
819 	{OV2722_8BIT, 0x3805, 0xe1},	/* H crop end:  1761 */
820 	{OV2722_8BIT, 0x3806, 0x04},
821 	{OV2722_8BIT, 0x3807, 0x47},	/* V crop end:  1095 */
822 	{OV2722_8BIT, 0x3808, 0x05},
823 	{OV2722_8BIT, 0x3809, 0x88},	/* H output size: 1416 */
824 	{OV2722_8BIT, 0x380a, 0x04},
825 	{OV2722_8BIT, 0x380b, 0x0a},	/* V output size: 1034 */
826 
827 	/* H blank timing */
828 	{OV2722_8BIT, 0x380c, 0x08},
829 	{OV2722_8BIT, 0x380d, 0x00},	/* H total size: 2048 */
830 	{OV2722_8BIT, 0x380e, 0x04},
831 	{OV2722_8BIT, 0x380f, 0xa0},	/* V total size: 1184 */
832 	{OV2722_8BIT, 0x3810, 0x00},
833 	{OV2722_8BIT, 0x3811, 0x05},	/* H window offset: 5 */
834 	{OV2722_8BIT, 0x3812, 0x00},
835 	{OV2722_8BIT, 0x3813, 0x02},	/* V window offset: 2 */
836 	{OV2722_8BIT, 0x3820, 0x80},
837 	{OV2722_8BIT, 0x3821, 0x06},	/* flip isp */
838 	{OV2722_8BIT, 0x3814, 0x11},
839 	{OV2722_8BIT, 0x3815, 0x11},
840 	{OV2722_8BIT, 0x3612, 0x0b},
841 	{OV2722_8BIT, 0x3618, 0x04},
842 	{OV2722_8BIT, 0x3a08, 0x01},
843 	{OV2722_8BIT, 0x3a09, 0x50},
844 	{OV2722_8BIT, 0x3a0a, 0x01},
845 	{OV2722_8BIT, 0x3a0b, 0x18},
846 	{OV2722_8BIT, 0x3a0d, 0x03},
847 	{OV2722_8BIT, 0x3a0e, 0x03},
848 	{OV2722_8BIT, 0x4520, 0x00},
849 	{OV2722_8BIT, 0x4837, 0x1b},
850 	{OV2722_8BIT, 0x3000, 0xff},
851 	{OV2722_8BIT, 0x3001, 0xff},
852 	{OV2722_8BIT, 0x3002, 0xf0},
853 	{OV2722_8BIT, 0x3600, 0x08},
854 	{OV2722_8BIT, 0x3621, 0xc0},
855 	{OV2722_8BIT, 0x3632, 0xd2},	/* added for power opt */
856 	{OV2722_8BIT, 0x3633, 0x23},
857 	{OV2722_8BIT, 0x3634, 0x54},
858 	{OV2722_8BIT, 0x3f01, 0x0c},
859 	{OV2722_8BIT, 0x5001, 0xc1},	/* v_en, h_en, blc_en */
860 	{OV2722_8BIT, 0x3614, 0xf0},
861 	{OV2722_8BIT, 0x3630, 0x2d},
862 	{OV2722_8BIT, 0x370b, 0x62},
863 	{OV2722_8BIT, 0x3706, 0x61},
864 	{OV2722_8BIT, 0x4000, 0x02},
865 	{OV2722_8BIT, 0x4002, 0xc5},
866 	{OV2722_8BIT, 0x4005, 0x08},
867 	{OV2722_8BIT, 0x404f, 0x84},
868 	{OV2722_8BIT, 0x4051, 0x00},
869 	{OV2722_8BIT, 0x5000, 0xcf},
870 	{OV2722_8BIT, 0x3a18, 0x00},
871 	{OV2722_8BIT, 0x3a19, 0x80},
872 	{OV2722_8BIT, 0x4521, 0x00},
873 	{OV2722_8BIT, 0x5183, 0xb0},	/* AWB red */
874 	{OV2722_8BIT, 0x5184, 0xb0},	/* AWB green */
875 	{OV2722_8BIT, 0x5185, 0xb0},	/* AWB blue */
876 	{OV2722_8BIT, 0x5180, 0x03},	/* AWB manual mode */
877 	{OV2722_8BIT, 0x370c, 0x0c},
878 	{OV2722_8BIT, 0x4800, 0x24},	/* clk lane gate enable */
879 	{OV2722_8BIT, 0x3035, 0x00},
880 	{OV2722_8BIT, 0x3036, 0x26},
881 	{OV2722_8BIT, 0x3037, 0xa1},
882 	{OV2722_8BIT, 0x303e, 0x19},
883 	{OV2722_8BIT, 0x3038, 0x06},
884 	{OV2722_8BIT, 0x3018, 0x04},
885 
886 	/* Added for power optimization */
887 	{OV2722_8BIT, 0x3000, 0x00},
888 	{OV2722_8BIT, 0x3001, 0x00},
889 	{OV2722_8BIT, 0x3002, 0x00},
890 	{OV2722_8BIT, 0x3a0f, 0x40},
891 	{OV2722_8BIT, 0x3a10, 0x38},
892 	{OV2722_8BIT, 0x3a1b, 0x48},
893 	{OV2722_8BIT, 0x3a1e, 0x30},
894 	{OV2722_8BIT, 0x3a11, 0x90},
895 	{OV2722_8BIT, 0x3a1f, 0x10},
896 	{OV2722_8BIT, 0x3503, 0x17},
897 	{OV2722_8BIT, 0x3500, 0x00},
898 	{OV2722_8BIT, 0x3501, 0x46},
899 	{OV2722_8BIT, 0x3502, 0x00},
900 	{OV2722_8BIT, 0x3508, 0x00},
901 	{OV2722_8BIT, 0x3509, 0x10},
902 	{OV2722_TOK_TERM, 0, 0},
903 };
904 
905 static struct ov2722_reg const ov2722_1080p_30fps[] = {
906 	{OV2722_8BIT, 0x3021, 0x03}, /* For stand wait for a whole
907 					frame complete.(vblank) */
908 	{OV2722_8BIT, 0x3718, 0x10},
909 	{OV2722_8BIT, 0x3702, 0x24},
910 	{OV2722_8BIT, 0x373a, 0x60},
911 	{OV2722_8BIT, 0x3715, 0x01},
912 	{OV2722_8BIT, 0x3703, 0x2e},
913 	{OV2722_8BIT, 0x3705, 0x2b},
914 	{OV2722_8BIT, 0x3730, 0x30},
915 	{OV2722_8BIT, 0x3704, 0x62},
916 	{OV2722_8BIT, 0x3f06, 0x3a},
917 	{OV2722_8BIT, 0x371c, 0x00},
918 	{OV2722_8BIT, 0x371d, 0xc4},
919 	{OV2722_8BIT, 0x371e, 0x01},
920 	{OV2722_8BIT, 0x371f, 0x28},
921 	{OV2722_8BIT, 0x3708, 0x61},
922 	{OV2722_8BIT, 0x3709, 0x12},
923 	{OV2722_8BIT, 0x3800, 0x00},
924 	{OV2722_8BIT, 0x3801, 0x08}, /* H crop start: 8 */
925 	{OV2722_8BIT, 0x3802, 0x00},
926 	{OV2722_8BIT, 0x3803, 0x01}, /* V crop start: 1 */
927 	{OV2722_8BIT, 0x3804, 0x07},
928 	{OV2722_8BIT, 0x3805, 0x9b}, /* H crop end: 1947 */
929 	{OV2722_8BIT, 0x3806, 0x04},
930 	{OV2722_8BIT, 0x3807, 0x45}, /* V crop end: 1093 */
931 	{OV2722_8BIT, 0x3808, 0x07},
932 	{OV2722_8BIT, 0x3809, 0x8c}, /* H output size: 1932 */
933 	{OV2722_8BIT, 0x380a, 0x04},
934 	{OV2722_8BIT, 0x380b, 0x44}, /* V output size: 1092 */
935 	{OV2722_8BIT, 0x380c, 0x08},
936 	{OV2722_8BIT, 0x380d, 0x14}, /* H timing: 2068 */
937 	{OV2722_8BIT, 0x380e, 0x04},
938 	{OV2722_8BIT, 0x380f, 0x5a}, /* V timing: 1114 */
939 	{OV2722_8BIT, 0x3810, 0x00},
940 	{OV2722_8BIT, 0x3811, 0x03}, /* H window offset: 3 */
941 	{OV2722_8BIT, 0x3812, 0x00},
942 	{OV2722_8BIT, 0x3813, 0x02}, /* V window offset: 2 */
943 	{OV2722_8BIT, 0x3820, 0x80},
944 	{OV2722_8BIT, 0x3821, 0x06}, /*  mirror */
945 	{OV2722_8BIT, 0x3814, 0x11},
946 	{OV2722_8BIT, 0x3815, 0x11},
947 	{OV2722_8BIT, 0x3612, 0x4b},
948 	{OV2722_8BIT, 0x3618, 0x04},
949 	{OV2722_8BIT, 0x3a08, 0x01},
950 	{OV2722_8BIT, 0x3a09, 0x50},
951 	{OV2722_8BIT, 0x3a0a, 0x01},
952 	{OV2722_8BIT, 0x3a0b, 0x18},
953 	{OV2722_8BIT, 0x3a0d, 0x03},
954 	{OV2722_8BIT, 0x3a0e, 0x03},
955 	{OV2722_8BIT, 0x4520, 0x00},
956 	{OV2722_8BIT, 0x4837, 0x1b},
957 	{OV2722_8BIT, 0x3000, 0xff},
958 	{OV2722_8BIT, 0x3001, 0xff},
959 	{OV2722_8BIT, 0x3002, 0xf0},
960 	{OV2722_8BIT, 0x3600, 0x08},
961 	{OV2722_8BIT, 0x3621, 0xc0},
962 	{OV2722_8BIT, 0x3632, 0x53}, /* added for power opt */
963 	{OV2722_8BIT, 0x3633, 0x63},
964 	{OV2722_8BIT, 0x3634, 0x24},
965 	{OV2722_8BIT, 0x3f01, 0x0c},
966 	{OV2722_8BIT, 0x5001, 0xc1},
967 	{OV2722_8BIT, 0x3614, 0xf0},
968 	{OV2722_8BIT, 0x3630, 0x2d},
969 	{OV2722_8BIT, 0x370b, 0x62},
970 	{OV2722_8BIT, 0x3706, 0x61},
971 	{OV2722_8BIT, 0x4000, 0x02},
972 	{OV2722_8BIT, 0x4002, 0xc5},
973 	{OV2722_8BIT, 0x4005, 0x08},
974 	{OV2722_8BIT, 0x404f, 0x84},
975 	{OV2722_8BIT, 0x4051, 0x00},
976 	{OV2722_8BIT, 0x5000, 0xcd}, /* manual 3a */
977 	{OV2722_8BIT, 0x301d, 0xf0}, /* enable group hold */
978 	{OV2722_8BIT, 0x3a18, 0x00},
979 	{OV2722_8BIT, 0x3a19, 0x80},
980 	{OV2722_8BIT, 0x3503, 0x17},
981 	{OV2722_8BIT, 0x4521, 0x00},
982 	{OV2722_8BIT, 0x5183, 0xb0},
983 	{OV2722_8BIT, 0x5184, 0xb0},
984 	{OV2722_8BIT, 0x5185, 0xb0},
985 	{OV2722_8BIT, 0x370c, 0x0c},
986 	{OV2722_8BIT, 0x3035, 0x00},
987 	{OV2722_8BIT, 0x3036, 0x24}, /* 345.6 MHz */
988 	{OV2722_8BIT, 0x3037, 0xa1},
989 	{OV2722_8BIT, 0x303e, 0x19},
990 	{OV2722_8BIT, 0x3038, 0x06},
991 	{OV2722_8BIT, 0x3018, 0x04},
992 	{OV2722_8BIT, 0x3000, 0x00}, /* added for power optimization */
993 	{OV2722_8BIT, 0x3001, 0x00},
994 	{OV2722_8BIT, 0x3002, 0x00},
995 	{OV2722_8BIT, 0x3a0f, 0x40},
996 	{OV2722_8BIT, 0x3a10, 0x38},
997 	{OV2722_8BIT, 0x3a1b, 0x48},
998 	{OV2722_8BIT, 0x3a1e, 0x30},
999 	{OV2722_8BIT, 0x3a11, 0x90},
1000 	{OV2722_8BIT, 0x3a1f, 0x10},
1001 	{OV2722_8BIT, 0x3011, 0x22},
1002 	{OV2722_8BIT, 0x3500, 0x00},
1003 	{OV2722_8BIT, 0x3501, 0x3F},
1004 	{OV2722_8BIT, 0x3502, 0x00},
1005 	{OV2722_8BIT, 0x3508, 0x00},
1006 	{OV2722_8BIT, 0x3509, 0x00},
1007 	{OV2722_TOK_TERM, 0, 0}
1008 };
1009 
1010 static struct ov2722_reg const ov2722_720p_30fps[] = {
1011 	{OV2722_8BIT, 0x3021, 0x03},
1012 	{OV2722_8BIT, 0x3718, 0x10},
1013 	{OV2722_8BIT, 0x3702, 0x24},
1014 	{OV2722_8BIT, 0x373a, 0x60},
1015 	{OV2722_8BIT, 0x3715, 0x01},
1016 	{OV2722_8BIT, 0x3703, 0x2e},
1017 	{OV2722_8BIT, 0x3705, 0x10},
1018 	{OV2722_8BIT, 0x3730, 0x30},
1019 	{OV2722_8BIT, 0x3704, 0x62},
1020 	{OV2722_8BIT, 0x3f06, 0x3a},
1021 	{OV2722_8BIT, 0x371c, 0x00},
1022 	{OV2722_8BIT, 0x371d, 0xc4},
1023 	{OV2722_8BIT, 0x371e, 0x01},
1024 	{OV2722_8BIT, 0x371f, 0x0d},
1025 	{OV2722_8BIT, 0x3708, 0x61},
1026 	{OV2722_8BIT, 0x3709, 0x12},
1027 	{OV2722_8BIT, 0x3800, 0x01},
1028 	{OV2722_8BIT, 0x3801, 0x40}, /* H crop start: 320 */
1029 	{OV2722_8BIT, 0x3802, 0x00},
1030 	{OV2722_8BIT, 0x3803, 0xb1}, /* V crop start: 177 */
1031 	{OV2722_8BIT, 0x3804, 0x06},
1032 	{OV2722_8BIT, 0x3805, 0x55}, /* H crop end: 1621 */
1033 	{OV2722_8BIT, 0x3806, 0x03},
1034 	{OV2722_8BIT, 0x3807, 0x95}, /* V crop end: 918 */
1035 	{OV2722_8BIT, 0x3808, 0x05},
1036 	{OV2722_8BIT, 0x3809, 0x10}, /* H output size: 0x0788==1928 */
1037 	{OV2722_8BIT, 0x380a, 0x02},
1038 	{OV2722_8BIT, 0x380b, 0xe0}, /* output size: 0x02DE==734 */
1039 	{OV2722_8BIT, 0x380c, 0x08},
1040 	{OV2722_8BIT, 0x380d, 0x00}, /* H timing: 2048 */
1041 	{OV2722_8BIT, 0x380e, 0x04},
1042 	{OV2722_8BIT, 0x380f, 0xa3}, /* V timing: 1187 */
1043 	{OV2722_8BIT, 0x3810, 0x00},
1044 	{OV2722_8BIT, 0x3811, 0x03}, /* H window offset: 3 */
1045 	{OV2722_8BIT, 0x3812, 0x00},
1046 	{OV2722_8BIT, 0x3813, 0x02}, /* V window offset: 2 */
1047 	{OV2722_8BIT, 0x3820, 0x80},
1048 	{OV2722_8BIT, 0x3821, 0x06}, /* mirror */
1049 	{OV2722_8BIT, 0x3814, 0x11},
1050 	{OV2722_8BIT, 0x3815, 0x11},
1051 	{OV2722_8BIT, 0x3612, 0x0b},
1052 	{OV2722_8BIT, 0x3618, 0x04},
1053 	{OV2722_8BIT, 0x3a08, 0x01},
1054 	{OV2722_8BIT, 0x3a09, 0x50},
1055 	{OV2722_8BIT, 0x3a0a, 0x01},
1056 	{OV2722_8BIT, 0x3a0b, 0x18},
1057 	{OV2722_8BIT, 0x3a0d, 0x03},
1058 	{OV2722_8BIT, 0x3a0e, 0x03},
1059 	{OV2722_8BIT, 0x4520, 0x00},
1060 	{OV2722_8BIT, 0x4837, 0x1b},
1061 	{OV2722_8BIT, 0x3600, 0x08},
1062 	{OV2722_8BIT, 0x3621, 0xc0},
1063 	{OV2722_8BIT, 0x3632, 0xd2}, /* added for power opt */
1064 	{OV2722_8BIT, 0x3633, 0x23},
1065 	{OV2722_8BIT, 0x3634, 0x54},
1066 	{OV2722_8BIT, 0x3f01, 0x0c},
1067 	{OV2722_8BIT, 0x5001, 0xc1},
1068 	{OV2722_8BIT, 0x3614, 0xf0},
1069 	{OV2722_8BIT, 0x3630, 0x2d},
1070 	{OV2722_8BIT, 0x370b, 0x62},
1071 	{OV2722_8BIT, 0x3706, 0x61},
1072 	{OV2722_8BIT, 0x4000, 0x02},
1073 	{OV2722_8BIT, 0x4002, 0xc5},
1074 	{OV2722_8BIT, 0x4005, 0x08},
1075 	{OV2722_8BIT, 0x404f, 0x84},
1076 	{OV2722_8BIT, 0x4051, 0x00},
1077 	{OV2722_8BIT, 0x5000, 0xcf}, /* manual 3a */
1078 	{OV2722_8BIT, 0x301d, 0xf0}, /* enable group hold */
1079 	{OV2722_8BIT, 0x3a18, 0x00},
1080 	{OV2722_8BIT, 0x3a19, 0x80},
1081 	{OV2722_8BIT, 0x4521, 0x00},
1082 	{OV2722_8BIT, 0x5183, 0xb0},
1083 	{OV2722_8BIT, 0x5184, 0xb0},
1084 	{OV2722_8BIT, 0x5185, 0xb0},
1085 	{OV2722_8BIT, 0x370c, 0x0c},
1086 	{OV2722_8BIT, 0x3035, 0x00},
1087 	{OV2722_8BIT, 0x3036, 0x26}, /* {0x3036, 0x2c}, //422.4 MHz */
1088 	{OV2722_8BIT, 0x3037, 0xa1},
1089 	{OV2722_8BIT, 0x303e, 0x19},
1090 	{OV2722_8BIT, 0x3038, 0x06},
1091 	{OV2722_8BIT, 0x3018, 0x04},
1092 	{OV2722_8BIT, 0x3000, 0x00}, /* added for power optimization */
1093 	{OV2722_8BIT, 0x3001, 0x00},
1094 	{OV2722_8BIT, 0x3002, 0x00},
1095 	{OV2722_8BIT, 0x3a0f, 0x40},
1096 	{OV2722_8BIT, 0x3a10, 0x38},
1097 	{OV2722_8BIT, 0x3a1b, 0x48},
1098 	{OV2722_8BIT, 0x3a1e, 0x30},
1099 	{OV2722_8BIT, 0x3a11, 0x90},
1100 	{OV2722_8BIT, 0x3a1f, 0x10},
1101 	{OV2722_8BIT, 0x3503, 0x17}, /* manual 3a */
1102 	{OV2722_8BIT, 0x3500, 0x00},
1103 	{OV2722_8BIT, 0x3501, 0x3F},
1104 	{OV2722_8BIT, 0x3502, 0x00},
1105 	{OV2722_8BIT, 0x3508, 0x00},
1106 	{OV2722_8BIT, 0x3509, 0x00},
1107 	{OV2722_TOK_TERM, 0, 0},
1108 };
1109 
1110 struct ov2722_resolution ov2722_res_preview[] = {
1111 	{
1112 		.desc = "ov2722_1632_1092_30fps",
1113 		.width = 1632,
1114 		.height = 1092,
1115 		.fps = 30,
1116 		.pix_clk_freq = 85,
1117 		.used = 0,
1118 		.pixels_per_line = 2260,
1119 		.lines_per_frame = 1244,
1120 		.bin_factor_x = 1,
1121 		.bin_factor_y = 1,
1122 		.bin_mode = 0,
1123 		.skip_frames = 3,
1124 		.regs = ov2722_1632_1092_30fps,
1125 		.mipi_freq = 422400,
1126 	},
1127 	{
1128 		.desc = "ov2722_1452_1092_30fps",
1129 		.width = 1452,
1130 		.height = 1092,
1131 		.fps = 30,
1132 		.pix_clk_freq = 85,
1133 		.used = 0,
1134 		.pixels_per_line = 2260,
1135 		.lines_per_frame = 1244,
1136 		.bin_factor_x = 1,
1137 		.bin_factor_y = 1,
1138 		.bin_mode = 0,
1139 		.skip_frames = 3,
1140 		.regs = ov2722_1452_1092_30fps,
1141 		.mipi_freq = 422400,
1142 	},
1143 	{
1144 		.desc = "ov2722_1080P_30fps",
1145 		.width = 1932,
1146 		.height = 1092,
1147 		.pix_clk_freq = 69,
1148 		.fps = 30,
1149 		.used = 0,
1150 		.pixels_per_line = 2068,
1151 		.lines_per_frame = 1114,
1152 		.bin_factor_x = 1,
1153 		.bin_factor_y = 1,
1154 		.bin_mode = 0,
1155 		.skip_frames = 3,
1156 		.regs = ov2722_1080p_30fps,
1157 		.mipi_freq = 345600,
1158 	},
1159 };
1160 #define N_RES_PREVIEW (ARRAY_SIZE(ov2722_res_preview))
1161 
1162 struct ov2722_resolution ov2722_res_still[] = {
1163 	{
1164 		.desc = "ov2722_480P_30fps",
1165 		.width = 1632,
1166 		.height = 1092,
1167 		.fps = 30,
1168 		.pix_clk_freq = 85,
1169 		.used = 0,
1170 		.pixels_per_line = 2260,
1171 		.lines_per_frame = 1244,
1172 		.bin_factor_x = 1,
1173 		.bin_factor_y = 1,
1174 		.bin_mode = 0,
1175 		.skip_frames = 3,
1176 		.regs = ov2722_1632_1092_30fps,
1177 		.mipi_freq = 422400,
1178 	},
1179 	{
1180 		.desc = "ov2722_1452_1092_30fps",
1181 		.width = 1452,
1182 		.height = 1092,
1183 		.fps = 30,
1184 		.pix_clk_freq = 85,
1185 		.used = 0,
1186 		.pixels_per_line = 2260,
1187 		.lines_per_frame = 1244,
1188 		.bin_factor_x = 1,
1189 		.bin_factor_y = 1,
1190 		.bin_mode = 0,
1191 		.skip_frames = 3,
1192 		.regs = ov2722_1452_1092_30fps,
1193 		.mipi_freq = 422400,
1194 	},
1195 	{
1196 		.desc = "ov2722_1080P_30fps",
1197 		.width = 1932,
1198 		.height = 1092,
1199 		.pix_clk_freq = 69,
1200 		.fps = 30,
1201 		.used = 0,
1202 		.pixels_per_line = 2068,
1203 		.lines_per_frame = 1114,
1204 		.bin_factor_x = 1,
1205 		.bin_factor_y = 1,
1206 		.bin_mode = 0,
1207 		.skip_frames = 3,
1208 		.regs = ov2722_1080p_30fps,
1209 		.mipi_freq = 345600,
1210 	},
1211 };
1212 #define N_RES_STILL (ARRAY_SIZE(ov2722_res_still))
1213 
1214 struct ov2722_resolution ov2722_res_video[] = {
1215 	{
1216 		.desc = "ov2722_QVGA_30fps",
1217 		.width = 336,
1218 		.height = 256,
1219 		.fps = 30,
1220 		.pix_clk_freq = 73,
1221 		.used = 0,
1222 		.pixels_per_line = 2048,
1223 		.lines_per_frame = 1184,
1224 		.bin_factor_x = 1,
1225 		.bin_factor_y = 1,
1226 		.bin_mode = 0,
1227 		.skip_frames = 3,
1228 		.regs = ov2722_QVGA_30fps,
1229 		.mipi_freq = 364800,
1230 	},
1231 	{
1232 		.desc = "ov2722_480P_30fps",
1233 		.width = 736,
1234 		.height = 496,
1235 		.fps = 30,
1236 		.pix_clk_freq = 73,
1237 		.used = 0,
1238 		.pixels_per_line = 2048,
1239 		.lines_per_frame = 1184,
1240 		.bin_factor_x = 1,
1241 		.bin_factor_y = 1,
1242 		.bin_mode = 0,
1243 		.skip_frames = 3,
1244 		.regs = ov2722_480P_30fps,
1245 	},
1246 	{
1247 		.desc = "ov2722_1080P_30fps",
1248 		.width = 1932,
1249 		.height = 1092,
1250 		.pix_clk_freq = 69,
1251 		.fps = 30,
1252 		.used = 0,
1253 		.pixels_per_line = 2068,
1254 		.lines_per_frame = 1114,
1255 		.bin_factor_x = 1,
1256 		.bin_factor_y = 1,
1257 		.bin_mode = 0,
1258 		.skip_frames = 3,
1259 		.regs = ov2722_1080p_30fps,
1260 		.mipi_freq = 345600,
1261 	},
1262 };
1263 #define N_RES_VIDEO (ARRAY_SIZE(ov2722_res_video))
1264 
1265 static struct ov2722_resolution *ov2722_res = ov2722_res_preview;
1266 static unsigned long N_RES = N_RES_PREVIEW;
1267 #endif
1268