xref: /openbmc/linux/drivers/media/i2c/ov5670.c (revision 5de35c9b)
15de35c9bSChiranjeevi Rapolu /*
25de35c9bSChiranjeevi Rapolu  * Copyright (c) 2017 Intel Corporation.
35de35c9bSChiranjeevi Rapolu  *
45de35c9bSChiranjeevi Rapolu  * This program is free software; you can redistribute it and/or
55de35c9bSChiranjeevi Rapolu  * modify it under the terms of the GNU General Public License version
65de35c9bSChiranjeevi Rapolu  * 2 as published by the Free Software Foundation.
75de35c9bSChiranjeevi Rapolu  *
85de35c9bSChiranjeevi Rapolu  * This program is distributed in the hope that it will be useful,
95de35c9bSChiranjeevi Rapolu  * but WITHOUT ANY WARRANTY; without even the implied warranty of
105de35c9bSChiranjeevi Rapolu  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
115de35c9bSChiranjeevi Rapolu  * GNU General Public License for more details.
125de35c9bSChiranjeevi Rapolu  *
135de35c9bSChiranjeevi Rapolu  */
145de35c9bSChiranjeevi Rapolu 
155de35c9bSChiranjeevi Rapolu #include <linux/acpi.h>
165de35c9bSChiranjeevi Rapolu #include <linux/i2c.h>
175de35c9bSChiranjeevi Rapolu #include <linux/module.h>
185de35c9bSChiranjeevi Rapolu #include <linux/pm_runtime.h>
195de35c9bSChiranjeevi Rapolu #include <media/v4l2-ctrls.h>
205de35c9bSChiranjeevi Rapolu #include <media/v4l2-device.h>
215de35c9bSChiranjeevi Rapolu 
225de35c9bSChiranjeevi Rapolu #define OV5670_REG_CHIP_ID		0x300a
235de35c9bSChiranjeevi Rapolu #define OV5670_CHIP_ID			0x005670
245de35c9bSChiranjeevi Rapolu 
255de35c9bSChiranjeevi Rapolu #define OV5670_REG_MODE_SELECT		0x0100
265de35c9bSChiranjeevi Rapolu #define OV5670_MODE_STANDBY		0x00
275de35c9bSChiranjeevi Rapolu #define OV5670_MODE_STREAMING		0x01
285de35c9bSChiranjeevi Rapolu 
295de35c9bSChiranjeevi Rapolu #define OV5670_REG_SOFTWARE_RST		0x0103
305de35c9bSChiranjeevi Rapolu #define OV5670_SOFTWARE_RST		0x01
315de35c9bSChiranjeevi Rapolu 
325de35c9bSChiranjeevi Rapolu /* vertical-timings from sensor */
335de35c9bSChiranjeevi Rapolu #define OV5670_REG_VTS			0x380e
345de35c9bSChiranjeevi Rapolu #define OV5670_VTS_30FPS		0x0808 /* default for 30 fps */
355de35c9bSChiranjeevi Rapolu #define OV5670_VTS_MAX			0xffff
365de35c9bSChiranjeevi Rapolu #define OV5670_VBLANK_MIN		56
375de35c9bSChiranjeevi Rapolu 
385de35c9bSChiranjeevi Rapolu /* horizontal-timings from sensor */
395de35c9bSChiranjeevi Rapolu #define OV5670_REG_HTS			0x380c
405de35c9bSChiranjeevi Rapolu #define OV5670_DEF_PPL			3360	/* Default pixels per line */
415de35c9bSChiranjeevi Rapolu 
425de35c9bSChiranjeevi Rapolu /* Exposure controls from sensor */
435de35c9bSChiranjeevi Rapolu #define OV5670_REG_EXPOSURE		0x3500
445de35c9bSChiranjeevi Rapolu #define	OV5670_EXPOSURE_MIN		4
455de35c9bSChiranjeevi Rapolu #define	OV5670_EXPOSURE_STEP		1
465de35c9bSChiranjeevi Rapolu 
475de35c9bSChiranjeevi Rapolu /* Analog gain controls from sensor */
485de35c9bSChiranjeevi Rapolu #define OV5670_REG_ANALOG_GAIN		0x3508
495de35c9bSChiranjeevi Rapolu #define	ANALOG_GAIN_MIN			0
505de35c9bSChiranjeevi Rapolu #define	ANALOG_GAIN_MAX			8191
515de35c9bSChiranjeevi Rapolu #define	ANALOG_GAIN_STEP		1
525de35c9bSChiranjeevi Rapolu #define	ANALOG_GAIN_DEFAULT		128
535de35c9bSChiranjeevi Rapolu 
545de35c9bSChiranjeevi Rapolu /* Digital gain controls from sensor */
555de35c9bSChiranjeevi Rapolu #define OV5670_REG_R_DGTL_GAIN		0x5032
565de35c9bSChiranjeevi Rapolu #define OV5670_REG_G_DGTL_GAIN		0x5034
575de35c9bSChiranjeevi Rapolu #define OV5670_REG_B_DGTL_GAIN		0x5036
585de35c9bSChiranjeevi Rapolu #define OV5670_DGTL_GAIN_MIN		0
595de35c9bSChiranjeevi Rapolu #define OV5670_DGTL_GAIN_MAX		4095
605de35c9bSChiranjeevi Rapolu #define OV5670_DGTL_GAIN_STEP		1
615de35c9bSChiranjeevi Rapolu #define OV5670_DGTL_GAIN_DEFAULT	1024
625de35c9bSChiranjeevi Rapolu 
635de35c9bSChiranjeevi Rapolu /* Test Pattern Control */
645de35c9bSChiranjeevi Rapolu #define OV5670_REG_TEST_PATTERN		0x4303
655de35c9bSChiranjeevi Rapolu #define OV5670_TEST_PATTERN_ENABLE	BIT(3)
665de35c9bSChiranjeevi Rapolu #define OV5670_REG_TEST_PATTERN_CTRL	0x4320
675de35c9bSChiranjeevi Rapolu 
685de35c9bSChiranjeevi Rapolu #define OV5670_REG_VALUE_08BIT		1
695de35c9bSChiranjeevi Rapolu #define OV5670_REG_VALUE_16BIT		2
705de35c9bSChiranjeevi Rapolu #define OV5670_REG_VALUE_24BIT		3
715de35c9bSChiranjeevi Rapolu 
725de35c9bSChiranjeevi Rapolu /* Initial number of frames to skip to avoid possible garbage */
735de35c9bSChiranjeevi Rapolu #define OV5670_NUM_OF_SKIP_FRAMES	2
745de35c9bSChiranjeevi Rapolu 
755de35c9bSChiranjeevi Rapolu struct ov5670_reg {
765de35c9bSChiranjeevi Rapolu 	u16 address;
775de35c9bSChiranjeevi Rapolu 	u8 val;
785de35c9bSChiranjeevi Rapolu };
795de35c9bSChiranjeevi Rapolu 
805de35c9bSChiranjeevi Rapolu struct ov5670_reg_list {
815de35c9bSChiranjeevi Rapolu 	u32 num_of_regs;
825de35c9bSChiranjeevi Rapolu 	const struct ov5670_reg *regs;
835de35c9bSChiranjeevi Rapolu };
845de35c9bSChiranjeevi Rapolu 
855de35c9bSChiranjeevi Rapolu struct ov5670_link_freq_config {
865de35c9bSChiranjeevi Rapolu 	u32 pixel_rate;
875de35c9bSChiranjeevi Rapolu 	const struct ov5670_reg_list reg_list;
885de35c9bSChiranjeevi Rapolu };
895de35c9bSChiranjeevi Rapolu 
905de35c9bSChiranjeevi Rapolu struct ov5670_mode {
915de35c9bSChiranjeevi Rapolu 	/* Frame width in pixels */
925de35c9bSChiranjeevi Rapolu 	u32 width;
935de35c9bSChiranjeevi Rapolu 
945de35c9bSChiranjeevi Rapolu 	/* Frame height in pixels */
955de35c9bSChiranjeevi Rapolu 	u32 height;
965de35c9bSChiranjeevi Rapolu 
975de35c9bSChiranjeevi Rapolu 	/* Vertical timining size */
985de35c9bSChiranjeevi Rapolu 	u32 vts;
995de35c9bSChiranjeevi Rapolu 
1005de35c9bSChiranjeevi Rapolu 	/* Link frequency needed for this resolution */
1015de35c9bSChiranjeevi Rapolu 	u32 link_freq_index;
1025de35c9bSChiranjeevi Rapolu 
1035de35c9bSChiranjeevi Rapolu 	/* Sensor register settings for this resolution */
1045de35c9bSChiranjeevi Rapolu 	const struct ov5670_reg_list reg_list;
1055de35c9bSChiranjeevi Rapolu };
1065de35c9bSChiranjeevi Rapolu 
1075de35c9bSChiranjeevi Rapolu static const struct ov5670_reg mipi_data_rate_840mbps[] = {
1085de35c9bSChiranjeevi Rapolu 	{0x0300, 0x04},
1095de35c9bSChiranjeevi Rapolu 	{0x0301, 0x00},
1105de35c9bSChiranjeevi Rapolu 	{0x0302, 0x84},
1115de35c9bSChiranjeevi Rapolu 	{0x0303, 0x00},
1125de35c9bSChiranjeevi Rapolu 	{0x0304, 0x03},
1135de35c9bSChiranjeevi Rapolu 	{0x0305, 0x01},
1145de35c9bSChiranjeevi Rapolu 	{0x0306, 0x01},
1155de35c9bSChiranjeevi Rapolu 	{0x030a, 0x00},
1165de35c9bSChiranjeevi Rapolu 	{0x030b, 0x00},
1175de35c9bSChiranjeevi Rapolu 	{0x030c, 0x00},
1185de35c9bSChiranjeevi Rapolu 	{0x030d, 0x26},
1195de35c9bSChiranjeevi Rapolu 	{0x030e, 0x00},
1205de35c9bSChiranjeevi Rapolu 	{0x030f, 0x06},
1215de35c9bSChiranjeevi Rapolu 	{0x0312, 0x01},
1225de35c9bSChiranjeevi Rapolu 	{0x3031, 0x0a},
1235de35c9bSChiranjeevi Rapolu };
1245de35c9bSChiranjeevi Rapolu 
1255de35c9bSChiranjeevi Rapolu static const struct ov5670_reg mode_2592x1944_regs[] = {
1265de35c9bSChiranjeevi Rapolu 	{0x3000, 0x00},
1275de35c9bSChiranjeevi Rapolu 	{0x3002, 0x21},
1285de35c9bSChiranjeevi Rapolu 	{0x3005, 0xf0},
1295de35c9bSChiranjeevi Rapolu 	{0x3007, 0x00},
1305de35c9bSChiranjeevi Rapolu 	{0x3015, 0x0f},
1315de35c9bSChiranjeevi Rapolu 	{0x3018, 0x32},
1325de35c9bSChiranjeevi Rapolu 	{0x301a, 0xf0},
1335de35c9bSChiranjeevi Rapolu 	{0x301b, 0xf0},
1345de35c9bSChiranjeevi Rapolu 	{0x301c, 0xf0},
1355de35c9bSChiranjeevi Rapolu 	{0x301d, 0xf0},
1365de35c9bSChiranjeevi Rapolu 	{0x301e, 0xf0},
1375de35c9bSChiranjeevi Rapolu 	{0x3030, 0x00},
1385de35c9bSChiranjeevi Rapolu 	{0x3031, 0x0a},
1395de35c9bSChiranjeevi Rapolu 	{0x303c, 0xff},
1405de35c9bSChiranjeevi Rapolu 	{0x303e, 0xff},
1415de35c9bSChiranjeevi Rapolu 	{0x3040, 0xf0},
1425de35c9bSChiranjeevi Rapolu 	{0x3041, 0x00},
1435de35c9bSChiranjeevi Rapolu 	{0x3042, 0xf0},
1445de35c9bSChiranjeevi Rapolu 	{0x3106, 0x11},
1455de35c9bSChiranjeevi Rapolu 	{0x3500, 0x00},
1465de35c9bSChiranjeevi Rapolu 	{0x3501, 0x80},
1475de35c9bSChiranjeevi Rapolu 	{0x3502, 0x00},
1485de35c9bSChiranjeevi Rapolu 	{0x3503, 0x04},
1495de35c9bSChiranjeevi Rapolu 	{0x3504, 0x03},
1505de35c9bSChiranjeevi Rapolu 	{0x3505, 0x83},
1515de35c9bSChiranjeevi Rapolu 	{0x3508, 0x04},
1525de35c9bSChiranjeevi Rapolu 	{0x3509, 0x00},
1535de35c9bSChiranjeevi Rapolu 	{0x350e, 0x04},
1545de35c9bSChiranjeevi Rapolu 	{0x350f, 0x00},
1555de35c9bSChiranjeevi Rapolu 	{0x3510, 0x00},
1565de35c9bSChiranjeevi Rapolu 	{0x3511, 0x02},
1575de35c9bSChiranjeevi Rapolu 	{0x3512, 0x00},
1585de35c9bSChiranjeevi Rapolu 	{0x3601, 0xc8},
1595de35c9bSChiranjeevi Rapolu 	{0x3610, 0x88},
1605de35c9bSChiranjeevi Rapolu 	{0x3612, 0x48},
1615de35c9bSChiranjeevi Rapolu 	{0x3614, 0x5b},
1625de35c9bSChiranjeevi Rapolu 	{0x3615, 0x96},
1635de35c9bSChiranjeevi Rapolu 	{0x3621, 0xd0},
1645de35c9bSChiranjeevi Rapolu 	{0x3622, 0x00},
1655de35c9bSChiranjeevi Rapolu 	{0x3623, 0x00},
1665de35c9bSChiranjeevi Rapolu 	{0x3633, 0x13},
1675de35c9bSChiranjeevi Rapolu 	{0x3634, 0x13},
1685de35c9bSChiranjeevi Rapolu 	{0x3635, 0x13},
1695de35c9bSChiranjeevi Rapolu 	{0x3636, 0x13},
1705de35c9bSChiranjeevi Rapolu 	{0x3645, 0x13},
1715de35c9bSChiranjeevi Rapolu 	{0x3646, 0x82},
1725de35c9bSChiranjeevi Rapolu 	{0x3650, 0x00},
1735de35c9bSChiranjeevi Rapolu 	{0x3652, 0xff},
1745de35c9bSChiranjeevi Rapolu 	{0x3655, 0x20},
1755de35c9bSChiranjeevi Rapolu 	{0x3656, 0xff},
1765de35c9bSChiranjeevi Rapolu 	{0x365a, 0xff},
1775de35c9bSChiranjeevi Rapolu 	{0x365e, 0xff},
1785de35c9bSChiranjeevi Rapolu 	{0x3668, 0x00},
1795de35c9bSChiranjeevi Rapolu 	{0x366a, 0x07},
1805de35c9bSChiranjeevi Rapolu 	{0x366e, 0x10},
1815de35c9bSChiranjeevi Rapolu 	{0x366d, 0x00},
1825de35c9bSChiranjeevi Rapolu 	{0x366f, 0x80},
1835de35c9bSChiranjeevi Rapolu 	{0x3700, 0x28},
1845de35c9bSChiranjeevi Rapolu 	{0x3701, 0x10},
1855de35c9bSChiranjeevi Rapolu 	{0x3702, 0x3a},
1865de35c9bSChiranjeevi Rapolu 	{0x3703, 0x19},
1875de35c9bSChiranjeevi Rapolu 	{0x3704, 0x10},
1885de35c9bSChiranjeevi Rapolu 	{0x3705, 0x00},
1895de35c9bSChiranjeevi Rapolu 	{0x3706, 0x66},
1905de35c9bSChiranjeevi Rapolu 	{0x3707, 0x08},
1915de35c9bSChiranjeevi Rapolu 	{0x3708, 0x34},
1925de35c9bSChiranjeevi Rapolu 	{0x3709, 0x40},
1935de35c9bSChiranjeevi Rapolu 	{0x370a, 0x01},
1945de35c9bSChiranjeevi Rapolu 	{0x370b, 0x1b},
1955de35c9bSChiranjeevi Rapolu 	{0x3714, 0x24},
1965de35c9bSChiranjeevi Rapolu 	{0x371a, 0x3e},
1975de35c9bSChiranjeevi Rapolu 	{0x3733, 0x00},
1985de35c9bSChiranjeevi Rapolu 	{0x3734, 0x00},
1995de35c9bSChiranjeevi Rapolu 	{0x373a, 0x05},
2005de35c9bSChiranjeevi Rapolu 	{0x373b, 0x06},
2015de35c9bSChiranjeevi Rapolu 	{0x373c, 0x0a},
2025de35c9bSChiranjeevi Rapolu 	{0x373f, 0xa0},
2035de35c9bSChiranjeevi Rapolu 	{0x3755, 0x00},
2045de35c9bSChiranjeevi Rapolu 	{0x3758, 0x00},
2055de35c9bSChiranjeevi Rapolu 	{0x375b, 0x0e},
2065de35c9bSChiranjeevi Rapolu 	{0x3766, 0x5f},
2075de35c9bSChiranjeevi Rapolu 	{0x3768, 0x00},
2085de35c9bSChiranjeevi Rapolu 	{0x3769, 0x22},
2095de35c9bSChiranjeevi Rapolu 	{0x3773, 0x08},
2105de35c9bSChiranjeevi Rapolu 	{0x3774, 0x1f},
2115de35c9bSChiranjeevi Rapolu 	{0x3776, 0x06},
2125de35c9bSChiranjeevi Rapolu 	{0x37a0, 0x88},
2135de35c9bSChiranjeevi Rapolu 	{0x37a1, 0x5c},
2145de35c9bSChiranjeevi Rapolu 	{0x37a7, 0x88},
2155de35c9bSChiranjeevi Rapolu 	{0x37a8, 0x70},
2165de35c9bSChiranjeevi Rapolu 	{0x37aa, 0x88},
2175de35c9bSChiranjeevi Rapolu 	{0x37ab, 0x48},
2185de35c9bSChiranjeevi Rapolu 	{0x37b3, 0x66},
2195de35c9bSChiranjeevi Rapolu 	{0x37c2, 0x04},
2205de35c9bSChiranjeevi Rapolu 	{0x37c5, 0x00},
2215de35c9bSChiranjeevi Rapolu 	{0x37c8, 0x00},
2225de35c9bSChiranjeevi Rapolu 	{0x3800, 0x00},
2235de35c9bSChiranjeevi Rapolu 	{0x3801, 0x0c},
2245de35c9bSChiranjeevi Rapolu 	{0x3802, 0x00},
2255de35c9bSChiranjeevi Rapolu 	{0x3803, 0x04},
2265de35c9bSChiranjeevi Rapolu 	{0x3804, 0x0a},
2275de35c9bSChiranjeevi Rapolu 	{0x3805, 0x33},
2285de35c9bSChiranjeevi Rapolu 	{0x3806, 0x07},
2295de35c9bSChiranjeevi Rapolu 	{0x3807, 0xa3},
2305de35c9bSChiranjeevi Rapolu 	{0x3808, 0x0a},
2315de35c9bSChiranjeevi Rapolu 	{0x3809, 0x20},
2325de35c9bSChiranjeevi Rapolu 	{0x380a, 0x07},
2335de35c9bSChiranjeevi Rapolu 	{0x380b, 0x98},
2345de35c9bSChiranjeevi Rapolu 	{0x380c, 0x06},
2355de35c9bSChiranjeevi Rapolu 	{0x380d, 0x90},
2365de35c9bSChiranjeevi Rapolu 	{0x380e, 0x08},
2375de35c9bSChiranjeevi Rapolu 	{0x380f, 0x08},
2385de35c9bSChiranjeevi Rapolu 	{0x3811, 0x04},
2395de35c9bSChiranjeevi Rapolu 	{0x3813, 0x02},
2405de35c9bSChiranjeevi Rapolu 	{0x3814, 0x01},
2415de35c9bSChiranjeevi Rapolu 	{0x3815, 0x01},
2425de35c9bSChiranjeevi Rapolu 	{0x3816, 0x00},
2435de35c9bSChiranjeevi Rapolu 	{0x3817, 0x00},
2445de35c9bSChiranjeevi Rapolu 	{0x3818, 0x00},
2455de35c9bSChiranjeevi Rapolu 	{0x3819, 0x00},
2465de35c9bSChiranjeevi Rapolu 	{0x3820, 0x84},
2475de35c9bSChiranjeevi Rapolu 	{0x3821, 0x46},
2485de35c9bSChiranjeevi Rapolu 	{0x3822, 0x48},
2495de35c9bSChiranjeevi Rapolu 	{0x3826, 0x00},
2505de35c9bSChiranjeevi Rapolu 	{0x3827, 0x08},
2515de35c9bSChiranjeevi Rapolu 	{0x382a, 0x01},
2525de35c9bSChiranjeevi Rapolu 	{0x382b, 0x01},
2535de35c9bSChiranjeevi Rapolu 	{0x3830, 0x08},
2545de35c9bSChiranjeevi Rapolu 	{0x3836, 0x02},
2555de35c9bSChiranjeevi Rapolu 	{0x3837, 0x00},
2565de35c9bSChiranjeevi Rapolu 	{0x3838, 0x10},
2575de35c9bSChiranjeevi Rapolu 	{0x3841, 0xff},
2585de35c9bSChiranjeevi Rapolu 	{0x3846, 0x48},
2595de35c9bSChiranjeevi Rapolu 	{0x3861, 0x00},
2605de35c9bSChiranjeevi Rapolu 	{0x3862, 0x04},
2615de35c9bSChiranjeevi Rapolu 	{0x3863, 0x06},
2625de35c9bSChiranjeevi Rapolu 	{0x3a11, 0x01},
2635de35c9bSChiranjeevi Rapolu 	{0x3a12, 0x78},
2645de35c9bSChiranjeevi Rapolu 	{0x3b00, 0x00},
2655de35c9bSChiranjeevi Rapolu 	{0x3b02, 0x00},
2665de35c9bSChiranjeevi Rapolu 	{0x3b03, 0x00},
2675de35c9bSChiranjeevi Rapolu 	{0x3b04, 0x00},
2685de35c9bSChiranjeevi Rapolu 	{0x3b05, 0x00},
2695de35c9bSChiranjeevi Rapolu 	{0x3c00, 0x89},
2705de35c9bSChiranjeevi Rapolu 	{0x3c01, 0xab},
2715de35c9bSChiranjeevi Rapolu 	{0x3c02, 0x01},
2725de35c9bSChiranjeevi Rapolu 	{0x3c03, 0x00},
2735de35c9bSChiranjeevi Rapolu 	{0x3c04, 0x00},
2745de35c9bSChiranjeevi Rapolu 	{0x3c05, 0x03},
2755de35c9bSChiranjeevi Rapolu 	{0x3c06, 0x00},
2765de35c9bSChiranjeevi Rapolu 	{0x3c07, 0x05},
2775de35c9bSChiranjeevi Rapolu 	{0x3c0c, 0x00},
2785de35c9bSChiranjeevi Rapolu 	{0x3c0d, 0x00},
2795de35c9bSChiranjeevi Rapolu 	{0x3c0e, 0x00},
2805de35c9bSChiranjeevi Rapolu 	{0x3c0f, 0x00},
2815de35c9bSChiranjeevi Rapolu 	{0x3c40, 0x00},
2825de35c9bSChiranjeevi Rapolu 	{0x3c41, 0xa3},
2835de35c9bSChiranjeevi Rapolu 	{0x3c43, 0x7d},
2845de35c9bSChiranjeevi Rapolu 	{0x3c45, 0xd7},
2855de35c9bSChiranjeevi Rapolu 	{0x3c47, 0xfc},
2865de35c9bSChiranjeevi Rapolu 	{0x3c50, 0x05},
2875de35c9bSChiranjeevi Rapolu 	{0x3c52, 0xaa},
2885de35c9bSChiranjeevi Rapolu 	{0x3c54, 0x71},
2895de35c9bSChiranjeevi Rapolu 	{0x3c56, 0x80},
2905de35c9bSChiranjeevi Rapolu 	{0x3d85, 0x17},
2915de35c9bSChiranjeevi Rapolu 	{0x3f03, 0x00},
2925de35c9bSChiranjeevi Rapolu 	{0x3f0a, 0x00},
2935de35c9bSChiranjeevi Rapolu 	{0x3f0b, 0x00},
2945de35c9bSChiranjeevi Rapolu 	{0x4001, 0x60},
2955de35c9bSChiranjeevi Rapolu 	{0x4009, 0x0d},
2965de35c9bSChiranjeevi Rapolu 	{0x4020, 0x00},
2975de35c9bSChiranjeevi Rapolu 	{0x4021, 0x00},
2985de35c9bSChiranjeevi Rapolu 	{0x4022, 0x00},
2995de35c9bSChiranjeevi Rapolu 	{0x4023, 0x00},
3005de35c9bSChiranjeevi Rapolu 	{0x4024, 0x00},
3015de35c9bSChiranjeevi Rapolu 	{0x4025, 0x00},
3025de35c9bSChiranjeevi Rapolu 	{0x4026, 0x00},
3035de35c9bSChiranjeevi Rapolu 	{0x4027, 0x00},
3045de35c9bSChiranjeevi Rapolu 	{0x4028, 0x00},
3055de35c9bSChiranjeevi Rapolu 	{0x4029, 0x00},
3065de35c9bSChiranjeevi Rapolu 	{0x402a, 0x00},
3075de35c9bSChiranjeevi Rapolu 	{0x402b, 0x00},
3085de35c9bSChiranjeevi Rapolu 	{0x402c, 0x00},
3095de35c9bSChiranjeevi Rapolu 	{0x402d, 0x00},
3105de35c9bSChiranjeevi Rapolu 	{0x402e, 0x00},
3115de35c9bSChiranjeevi Rapolu 	{0x402f, 0x00},
3125de35c9bSChiranjeevi Rapolu 	{0x4040, 0x00},
3135de35c9bSChiranjeevi Rapolu 	{0x4041, 0x03},
3145de35c9bSChiranjeevi Rapolu 	{0x4042, 0x00},
3155de35c9bSChiranjeevi Rapolu 	{0x4043, 0x7A},
3165de35c9bSChiranjeevi Rapolu 	{0x4044, 0x00},
3175de35c9bSChiranjeevi Rapolu 	{0x4045, 0x7A},
3185de35c9bSChiranjeevi Rapolu 	{0x4046, 0x00},
3195de35c9bSChiranjeevi Rapolu 	{0x4047, 0x7A},
3205de35c9bSChiranjeevi Rapolu 	{0x4048, 0x00},
3215de35c9bSChiranjeevi Rapolu 	{0x4049, 0x7A},
3225de35c9bSChiranjeevi Rapolu 	{0x4307, 0x30},
3235de35c9bSChiranjeevi Rapolu 	{0x4500, 0x58},
3245de35c9bSChiranjeevi Rapolu 	{0x4501, 0x04},
3255de35c9bSChiranjeevi Rapolu 	{0x4502, 0x40},
3265de35c9bSChiranjeevi Rapolu 	{0x4503, 0x10},
3275de35c9bSChiranjeevi Rapolu 	{0x4508, 0xaa},
3285de35c9bSChiranjeevi Rapolu 	{0x4509, 0xaa},
3295de35c9bSChiranjeevi Rapolu 	{0x450a, 0x00},
3305de35c9bSChiranjeevi Rapolu 	{0x450b, 0x00},
3315de35c9bSChiranjeevi Rapolu 	{0x4600, 0x01},
3325de35c9bSChiranjeevi Rapolu 	{0x4601, 0x03},
3335de35c9bSChiranjeevi Rapolu 	{0x4700, 0xa4},
3345de35c9bSChiranjeevi Rapolu 	{0x4800, 0x4c},
3355de35c9bSChiranjeevi Rapolu 	{0x4816, 0x53},
3365de35c9bSChiranjeevi Rapolu 	{0x481f, 0x40},
3375de35c9bSChiranjeevi Rapolu 	{0x4837, 0x13},
3385de35c9bSChiranjeevi Rapolu 	{0x5000, 0x56},
3395de35c9bSChiranjeevi Rapolu 	{0x5001, 0x01},
3405de35c9bSChiranjeevi Rapolu 	{0x5002, 0x28},
3415de35c9bSChiranjeevi Rapolu 	{0x5004, 0x0c},
3425de35c9bSChiranjeevi Rapolu 	{0x5006, 0x0c},
3435de35c9bSChiranjeevi Rapolu 	{0x5007, 0xe0},
3445de35c9bSChiranjeevi Rapolu 	{0x5008, 0x01},
3455de35c9bSChiranjeevi Rapolu 	{0x5009, 0xb0},
3465de35c9bSChiranjeevi Rapolu 	{0x5901, 0x00},
3475de35c9bSChiranjeevi Rapolu 	{0x5a01, 0x00},
3485de35c9bSChiranjeevi Rapolu 	{0x5a03, 0x00},
3495de35c9bSChiranjeevi Rapolu 	{0x5a04, 0x0c},
3505de35c9bSChiranjeevi Rapolu 	{0x5a05, 0xe0},
3515de35c9bSChiranjeevi Rapolu 	{0x5a06, 0x09},
3525de35c9bSChiranjeevi Rapolu 	{0x5a07, 0xb0},
3535de35c9bSChiranjeevi Rapolu 	{0x5a08, 0x06},
3545de35c9bSChiranjeevi Rapolu 	{0x5e00, 0x00},
3555de35c9bSChiranjeevi Rapolu 	{0x3734, 0x40},
3565de35c9bSChiranjeevi Rapolu 	{0x5b00, 0x01},
3575de35c9bSChiranjeevi Rapolu 	{0x5b01, 0x10},
3585de35c9bSChiranjeevi Rapolu 	{0x5b02, 0x01},
3595de35c9bSChiranjeevi Rapolu 	{0x5b03, 0xdb},
3605de35c9bSChiranjeevi Rapolu 	{0x3d8c, 0x71},
3615de35c9bSChiranjeevi Rapolu 	{0x3d8d, 0xea},
3625de35c9bSChiranjeevi Rapolu 	{0x4017, 0x08},
3635de35c9bSChiranjeevi Rapolu 	{0x3618, 0x2a},
3645de35c9bSChiranjeevi Rapolu 	{0x5780, 0x3e},
3655de35c9bSChiranjeevi Rapolu 	{0x5781, 0x0f},
3665de35c9bSChiranjeevi Rapolu 	{0x5782, 0x44},
3675de35c9bSChiranjeevi Rapolu 	{0x5783, 0x02},
3685de35c9bSChiranjeevi Rapolu 	{0x5784, 0x01},
3695de35c9bSChiranjeevi Rapolu 	{0x5785, 0x01},
3705de35c9bSChiranjeevi Rapolu 	{0x5786, 0x00},
3715de35c9bSChiranjeevi Rapolu 	{0x5787, 0x04},
3725de35c9bSChiranjeevi Rapolu 	{0x5788, 0x02},
3735de35c9bSChiranjeevi Rapolu 	{0x5789, 0x0f},
3745de35c9bSChiranjeevi Rapolu 	{0x578a, 0xfd},
3755de35c9bSChiranjeevi Rapolu 	{0x578b, 0xf5},
3765de35c9bSChiranjeevi Rapolu 	{0x578c, 0xf5},
3775de35c9bSChiranjeevi Rapolu 	{0x578d, 0x03},
3785de35c9bSChiranjeevi Rapolu 	{0x578e, 0x08},
3795de35c9bSChiranjeevi Rapolu 	{0x578f, 0x0c},
3805de35c9bSChiranjeevi Rapolu 	{0x5790, 0x08},
3815de35c9bSChiranjeevi Rapolu 	{0x5791, 0x06},
3825de35c9bSChiranjeevi Rapolu 	{0x5792, 0x00},
3835de35c9bSChiranjeevi Rapolu 	{0x5793, 0x52},
3845de35c9bSChiranjeevi Rapolu 	{0x5794, 0xa3},
3855de35c9bSChiranjeevi Rapolu 	{0x3503, 0x00}
3865de35c9bSChiranjeevi Rapolu };
3875de35c9bSChiranjeevi Rapolu 
3885de35c9bSChiranjeevi Rapolu static const struct ov5670_reg mode_1296x972_regs[] = {
3895de35c9bSChiranjeevi Rapolu 	{0x3000, 0x00},
3905de35c9bSChiranjeevi Rapolu 	{0x3002, 0x21},
3915de35c9bSChiranjeevi Rapolu 	{0x3005, 0xf0},
3925de35c9bSChiranjeevi Rapolu 	{0x3007, 0x00},
3935de35c9bSChiranjeevi Rapolu 	{0x3015, 0x0f},
3945de35c9bSChiranjeevi Rapolu 	{0x3018, 0x32},
3955de35c9bSChiranjeevi Rapolu 	{0x301a, 0xf0},
3965de35c9bSChiranjeevi Rapolu 	{0x301b, 0xf0},
3975de35c9bSChiranjeevi Rapolu 	{0x301c, 0xf0},
3985de35c9bSChiranjeevi Rapolu 	{0x301d, 0xf0},
3995de35c9bSChiranjeevi Rapolu 	{0x301e, 0xf0},
4005de35c9bSChiranjeevi Rapolu 	{0x3030, 0x00},
4015de35c9bSChiranjeevi Rapolu 	{0x3031, 0x0a},
4025de35c9bSChiranjeevi Rapolu 	{0x303c, 0xff},
4035de35c9bSChiranjeevi Rapolu 	{0x303e, 0xff},
4045de35c9bSChiranjeevi Rapolu 	{0x3040, 0xf0},
4055de35c9bSChiranjeevi Rapolu 	{0x3041, 0x00},
4065de35c9bSChiranjeevi Rapolu 	{0x3042, 0xf0},
4075de35c9bSChiranjeevi Rapolu 	{0x3106, 0x11},
4085de35c9bSChiranjeevi Rapolu 	{0x3500, 0x00},
4095de35c9bSChiranjeevi Rapolu 	{0x3501, 0x80},
4105de35c9bSChiranjeevi Rapolu 	{0x3502, 0x00},
4115de35c9bSChiranjeevi Rapolu 	{0x3503, 0x04},
4125de35c9bSChiranjeevi Rapolu 	{0x3504, 0x03},
4135de35c9bSChiranjeevi Rapolu 	{0x3505, 0x83},
4145de35c9bSChiranjeevi Rapolu 	{0x3508, 0x07},
4155de35c9bSChiranjeevi Rapolu 	{0x3509, 0x80},
4165de35c9bSChiranjeevi Rapolu 	{0x350e, 0x04},
4175de35c9bSChiranjeevi Rapolu 	{0x350f, 0x00},
4185de35c9bSChiranjeevi Rapolu 	{0x3510, 0x00},
4195de35c9bSChiranjeevi Rapolu 	{0x3511, 0x02},
4205de35c9bSChiranjeevi Rapolu 	{0x3512, 0x00},
4215de35c9bSChiranjeevi Rapolu 	{0x3601, 0xc8},
4225de35c9bSChiranjeevi Rapolu 	{0x3610, 0x88},
4235de35c9bSChiranjeevi Rapolu 	{0x3612, 0x48},
4245de35c9bSChiranjeevi Rapolu 	{0x3614, 0x5b},
4255de35c9bSChiranjeevi Rapolu 	{0x3615, 0x96},
4265de35c9bSChiranjeevi Rapolu 	{0x3621, 0xd0},
4275de35c9bSChiranjeevi Rapolu 	{0x3622, 0x00},
4285de35c9bSChiranjeevi Rapolu 	{0x3623, 0x00},
4295de35c9bSChiranjeevi Rapolu 	{0x3633, 0x13},
4305de35c9bSChiranjeevi Rapolu 	{0x3634, 0x13},
4315de35c9bSChiranjeevi Rapolu 	{0x3635, 0x13},
4325de35c9bSChiranjeevi Rapolu 	{0x3636, 0x13},
4335de35c9bSChiranjeevi Rapolu 	{0x3645, 0x13},
4345de35c9bSChiranjeevi Rapolu 	{0x3646, 0x82},
4355de35c9bSChiranjeevi Rapolu 	{0x3650, 0x00},
4365de35c9bSChiranjeevi Rapolu 	{0x3652, 0xff},
4375de35c9bSChiranjeevi Rapolu 	{0x3655, 0x20},
4385de35c9bSChiranjeevi Rapolu 	{0x3656, 0xff},
4395de35c9bSChiranjeevi Rapolu 	{0x365a, 0xff},
4405de35c9bSChiranjeevi Rapolu 	{0x365e, 0xff},
4415de35c9bSChiranjeevi Rapolu 	{0x3668, 0x00},
4425de35c9bSChiranjeevi Rapolu 	{0x366a, 0x07},
4435de35c9bSChiranjeevi Rapolu 	{0x366e, 0x08},
4445de35c9bSChiranjeevi Rapolu 	{0x366d, 0x00},
4455de35c9bSChiranjeevi Rapolu 	{0x366f, 0x80},
4465de35c9bSChiranjeevi Rapolu 	{0x3700, 0x28},
4475de35c9bSChiranjeevi Rapolu 	{0x3701, 0x10},
4485de35c9bSChiranjeevi Rapolu 	{0x3702, 0x3a},
4495de35c9bSChiranjeevi Rapolu 	{0x3703, 0x19},
4505de35c9bSChiranjeevi Rapolu 	{0x3704, 0x10},
4515de35c9bSChiranjeevi Rapolu 	{0x3705, 0x00},
4525de35c9bSChiranjeevi Rapolu 	{0x3706, 0x66},
4535de35c9bSChiranjeevi Rapolu 	{0x3707, 0x08},
4545de35c9bSChiranjeevi Rapolu 	{0x3708, 0x34},
4555de35c9bSChiranjeevi Rapolu 	{0x3709, 0x40},
4565de35c9bSChiranjeevi Rapolu 	{0x370a, 0x01},
4575de35c9bSChiranjeevi Rapolu 	{0x370b, 0x1b},
4585de35c9bSChiranjeevi Rapolu 	{0x3714, 0x24},
4595de35c9bSChiranjeevi Rapolu 	{0x371a, 0x3e},
4605de35c9bSChiranjeevi Rapolu 	{0x3733, 0x00},
4615de35c9bSChiranjeevi Rapolu 	{0x3734, 0x00},
4625de35c9bSChiranjeevi Rapolu 	{0x373a, 0x05},
4635de35c9bSChiranjeevi Rapolu 	{0x373b, 0x06},
4645de35c9bSChiranjeevi Rapolu 	{0x373c, 0x0a},
4655de35c9bSChiranjeevi Rapolu 	{0x373f, 0xa0},
4665de35c9bSChiranjeevi Rapolu 	{0x3755, 0x00},
4675de35c9bSChiranjeevi Rapolu 	{0x3758, 0x00},
4685de35c9bSChiranjeevi Rapolu 	{0x375b, 0x0e},
4695de35c9bSChiranjeevi Rapolu 	{0x3766, 0x5f},
4705de35c9bSChiranjeevi Rapolu 	{0x3768, 0x00},
4715de35c9bSChiranjeevi Rapolu 	{0x3769, 0x22},
4725de35c9bSChiranjeevi Rapolu 	{0x3773, 0x08},
4735de35c9bSChiranjeevi Rapolu 	{0x3774, 0x1f},
4745de35c9bSChiranjeevi Rapolu 	{0x3776, 0x06},
4755de35c9bSChiranjeevi Rapolu 	{0x37a0, 0x88},
4765de35c9bSChiranjeevi Rapolu 	{0x37a1, 0x5c},
4775de35c9bSChiranjeevi Rapolu 	{0x37a7, 0x88},
4785de35c9bSChiranjeevi Rapolu 	{0x37a8, 0x70},
4795de35c9bSChiranjeevi Rapolu 	{0x37aa, 0x88},
4805de35c9bSChiranjeevi Rapolu 	{0x37ab, 0x48},
4815de35c9bSChiranjeevi Rapolu 	{0x37b3, 0x66},
4825de35c9bSChiranjeevi Rapolu 	{0x37c2, 0x04},
4835de35c9bSChiranjeevi Rapolu 	{0x37c5, 0x00},
4845de35c9bSChiranjeevi Rapolu 	{0x37c8, 0x00},
4855de35c9bSChiranjeevi Rapolu 	{0x3800, 0x00},
4865de35c9bSChiranjeevi Rapolu 	{0x3801, 0x0c},
4875de35c9bSChiranjeevi Rapolu 	{0x3802, 0x00},
4885de35c9bSChiranjeevi Rapolu 	{0x3803, 0x04},
4895de35c9bSChiranjeevi Rapolu 	{0x3804, 0x0a},
4905de35c9bSChiranjeevi Rapolu 	{0x3805, 0x33},
4915de35c9bSChiranjeevi Rapolu 	{0x3806, 0x07},
4925de35c9bSChiranjeevi Rapolu 	{0x3807, 0xa3},
4935de35c9bSChiranjeevi Rapolu 	{0x3808, 0x05},
4945de35c9bSChiranjeevi Rapolu 	{0x3809, 0x10},
4955de35c9bSChiranjeevi Rapolu 	{0x380a, 0x03},
4965de35c9bSChiranjeevi Rapolu 	{0x380b, 0xcc},
4975de35c9bSChiranjeevi Rapolu 	{0x380c, 0x06},
4985de35c9bSChiranjeevi Rapolu 	{0x380d, 0x90},
4995de35c9bSChiranjeevi Rapolu 	{0x380e, 0x08},
5005de35c9bSChiranjeevi Rapolu 	{0x380f, 0x08},
5015de35c9bSChiranjeevi Rapolu 	{0x3811, 0x04},
5025de35c9bSChiranjeevi Rapolu 	{0x3813, 0x04},
5035de35c9bSChiranjeevi Rapolu 	{0x3814, 0x03},
5045de35c9bSChiranjeevi Rapolu 	{0x3815, 0x01},
5055de35c9bSChiranjeevi Rapolu 	{0x3816, 0x00},
5065de35c9bSChiranjeevi Rapolu 	{0x3817, 0x00},
5075de35c9bSChiranjeevi Rapolu 	{0x3818, 0x00},
5085de35c9bSChiranjeevi Rapolu 	{0x3819, 0x00},
5095de35c9bSChiranjeevi Rapolu 	{0x3820, 0x94},
5105de35c9bSChiranjeevi Rapolu 	{0x3821, 0x47},
5115de35c9bSChiranjeevi Rapolu 	{0x3822, 0x48},
5125de35c9bSChiranjeevi Rapolu 	{0x3826, 0x00},
5135de35c9bSChiranjeevi Rapolu 	{0x3827, 0x08},
5145de35c9bSChiranjeevi Rapolu 	{0x382a, 0x03},
5155de35c9bSChiranjeevi Rapolu 	{0x382b, 0x01},
5165de35c9bSChiranjeevi Rapolu 	{0x3830, 0x08},
5175de35c9bSChiranjeevi Rapolu 	{0x3836, 0x02},
5185de35c9bSChiranjeevi Rapolu 	{0x3837, 0x00},
5195de35c9bSChiranjeevi Rapolu 	{0x3838, 0x10},
5205de35c9bSChiranjeevi Rapolu 	{0x3841, 0xff},
5215de35c9bSChiranjeevi Rapolu 	{0x3846, 0x48},
5225de35c9bSChiranjeevi Rapolu 	{0x3861, 0x00},
5235de35c9bSChiranjeevi Rapolu 	{0x3862, 0x04},
5245de35c9bSChiranjeevi Rapolu 	{0x3863, 0x06},
5255de35c9bSChiranjeevi Rapolu 	{0x3a11, 0x01},
5265de35c9bSChiranjeevi Rapolu 	{0x3a12, 0x78},
5275de35c9bSChiranjeevi Rapolu 	{0x3b00, 0x00},
5285de35c9bSChiranjeevi Rapolu 	{0x3b02, 0x00},
5295de35c9bSChiranjeevi Rapolu 	{0x3b03, 0x00},
5305de35c9bSChiranjeevi Rapolu 	{0x3b04, 0x00},
5315de35c9bSChiranjeevi Rapolu 	{0x3b05, 0x00},
5325de35c9bSChiranjeevi Rapolu 	{0x3c00, 0x89},
5335de35c9bSChiranjeevi Rapolu 	{0x3c01, 0xab},
5345de35c9bSChiranjeevi Rapolu 	{0x3c02, 0x01},
5355de35c9bSChiranjeevi Rapolu 	{0x3c03, 0x00},
5365de35c9bSChiranjeevi Rapolu 	{0x3c04, 0x00},
5375de35c9bSChiranjeevi Rapolu 	{0x3c05, 0x03},
5385de35c9bSChiranjeevi Rapolu 	{0x3c06, 0x00},
5395de35c9bSChiranjeevi Rapolu 	{0x3c07, 0x05},
5405de35c9bSChiranjeevi Rapolu 	{0x3c0c, 0x00},
5415de35c9bSChiranjeevi Rapolu 	{0x3c0d, 0x00},
5425de35c9bSChiranjeevi Rapolu 	{0x3c0e, 0x00},
5435de35c9bSChiranjeevi Rapolu 	{0x3c0f, 0x00},
5445de35c9bSChiranjeevi Rapolu 	{0x3c40, 0x00},
5455de35c9bSChiranjeevi Rapolu 	{0x3c41, 0xa3},
5465de35c9bSChiranjeevi Rapolu 	{0x3c43, 0x7d},
5475de35c9bSChiranjeevi Rapolu 	{0x3c45, 0xd7},
5485de35c9bSChiranjeevi Rapolu 	{0x3c47, 0xfc},
5495de35c9bSChiranjeevi Rapolu 	{0x3c50, 0x05},
5505de35c9bSChiranjeevi Rapolu 	{0x3c52, 0xaa},
5515de35c9bSChiranjeevi Rapolu 	{0x3c54, 0x71},
5525de35c9bSChiranjeevi Rapolu 	{0x3c56, 0x80},
5535de35c9bSChiranjeevi Rapolu 	{0x3d85, 0x17},
5545de35c9bSChiranjeevi Rapolu 	{0x3f03, 0x00},
5555de35c9bSChiranjeevi Rapolu 	{0x3f0a, 0x00},
5565de35c9bSChiranjeevi Rapolu 	{0x3f0b, 0x00},
5575de35c9bSChiranjeevi Rapolu 	{0x4001, 0x60},
5585de35c9bSChiranjeevi Rapolu 	{0x4009, 0x05},
5595de35c9bSChiranjeevi Rapolu 	{0x4020, 0x00},
5605de35c9bSChiranjeevi Rapolu 	{0x4021, 0x00},
5615de35c9bSChiranjeevi Rapolu 	{0x4022, 0x00},
5625de35c9bSChiranjeevi Rapolu 	{0x4023, 0x00},
5635de35c9bSChiranjeevi Rapolu 	{0x4024, 0x00},
5645de35c9bSChiranjeevi Rapolu 	{0x4025, 0x00},
5655de35c9bSChiranjeevi Rapolu 	{0x4026, 0x00},
5665de35c9bSChiranjeevi Rapolu 	{0x4027, 0x00},
5675de35c9bSChiranjeevi Rapolu 	{0x4028, 0x00},
5685de35c9bSChiranjeevi Rapolu 	{0x4029, 0x00},
5695de35c9bSChiranjeevi Rapolu 	{0x402a, 0x00},
5705de35c9bSChiranjeevi Rapolu 	{0x402b, 0x00},
5715de35c9bSChiranjeevi Rapolu 	{0x402c, 0x00},
5725de35c9bSChiranjeevi Rapolu 	{0x402d, 0x00},
5735de35c9bSChiranjeevi Rapolu 	{0x402e, 0x00},
5745de35c9bSChiranjeevi Rapolu 	{0x402f, 0x00},
5755de35c9bSChiranjeevi Rapolu 	{0x4040, 0x00},
5765de35c9bSChiranjeevi Rapolu 	{0x4041, 0x03},
5775de35c9bSChiranjeevi Rapolu 	{0x4042, 0x00},
5785de35c9bSChiranjeevi Rapolu 	{0x4043, 0x7A},
5795de35c9bSChiranjeevi Rapolu 	{0x4044, 0x00},
5805de35c9bSChiranjeevi Rapolu 	{0x4045, 0x7A},
5815de35c9bSChiranjeevi Rapolu 	{0x4046, 0x00},
5825de35c9bSChiranjeevi Rapolu 	{0x4047, 0x7A},
5835de35c9bSChiranjeevi Rapolu 	{0x4048, 0x00},
5845de35c9bSChiranjeevi Rapolu 	{0x4049, 0x7A},
5855de35c9bSChiranjeevi Rapolu 	{0x4307, 0x30},
5865de35c9bSChiranjeevi Rapolu 	{0x4500, 0x58},
5875de35c9bSChiranjeevi Rapolu 	{0x4501, 0x04},
5885de35c9bSChiranjeevi Rapolu 	{0x4502, 0x48},
5895de35c9bSChiranjeevi Rapolu 	{0x4503, 0x10},
5905de35c9bSChiranjeevi Rapolu 	{0x4508, 0x55},
5915de35c9bSChiranjeevi Rapolu 	{0x4509, 0x55},
5925de35c9bSChiranjeevi Rapolu 	{0x450a, 0x00},
5935de35c9bSChiranjeevi Rapolu 	{0x450b, 0x00},
5945de35c9bSChiranjeevi Rapolu 	{0x4600, 0x00},
5955de35c9bSChiranjeevi Rapolu 	{0x4601, 0x81},
5965de35c9bSChiranjeevi Rapolu 	{0x4700, 0xa4},
5975de35c9bSChiranjeevi Rapolu 	{0x4800, 0x4c},
5985de35c9bSChiranjeevi Rapolu 	{0x4816, 0x53},
5995de35c9bSChiranjeevi Rapolu 	{0x481f, 0x40},
6005de35c9bSChiranjeevi Rapolu 	{0x4837, 0x13},
6015de35c9bSChiranjeevi Rapolu 	{0x5000, 0x56},
6025de35c9bSChiranjeevi Rapolu 	{0x5001, 0x01},
6035de35c9bSChiranjeevi Rapolu 	{0x5002, 0x28},
6045de35c9bSChiranjeevi Rapolu 	{0x5004, 0x0c},
6055de35c9bSChiranjeevi Rapolu 	{0x5006, 0x0c},
6065de35c9bSChiranjeevi Rapolu 	{0x5007, 0xe0},
6075de35c9bSChiranjeevi Rapolu 	{0x5008, 0x01},
6085de35c9bSChiranjeevi Rapolu 	{0x5009, 0xb0},
6095de35c9bSChiranjeevi Rapolu 	{0x5901, 0x00},
6105de35c9bSChiranjeevi Rapolu 	{0x5a01, 0x00},
6115de35c9bSChiranjeevi Rapolu 	{0x5a03, 0x00},
6125de35c9bSChiranjeevi Rapolu 	{0x5a04, 0x0c},
6135de35c9bSChiranjeevi Rapolu 	{0x5a05, 0xe0},
6145de35c9bSChiranjeevi Rapolu 	{0x5a06, 0x09},
6155de35c9bSChiranjeevi Rapolu 	{0x5a07, 0xb0},
6165de35c9bSChiranjeevi Rapolu 	{0x5a08, 0x06},
6175de35c9bSChiranjeevi Rapolu 	{0x5e00, 0x00},
6185de35c9bSChiranjeevi Rapolu 	{0x3734, 0x40},
6195de35c9bSChiranjeevi Rapolu 	{0x5b00, 0x01},
6205de35c9bSChiranjeevi Rapolu 	{0x5b01, 0x10},
6215de35c9bSChiranjeevi Rapolu 	{0x5b02, 0x01},
6225de35c9bSChiranjeevi Rapolu 	{0x5b03, 0xdb},
6235de35c9bSChiranjeevi Rapolu 	{0x3d8c, 0x71},
6245de35c9bSChiranjeevi Rapolu 	{0x3d8d, 0xea},
6255de35c9bSChiranjeevi Rapolu 	{0x4017, 0x10},
6265de35c9bSChiranjeevi Rapolu 	{0x3618, 0x2a},
6275de35c9bSChiranjeevi Rapolu 	{0x5780, 0x3e},
6285de35c9bSChiranjeevi Rapolu 	{0x5781, 0x0f},
6295de35c9bSChiranjeevi Rapolu 	{0x5782, 0x44},
6305de35c9bSChiranjeevi Rapolu 	{0x5783, 0x02},
6315de35c9bSChiranjeevi Rapolu 	{0x5784, 0x01},
6325de35c9bSChiranjeevi Rapolu 	{0x5785, 0x01},
6335de35c9bSChiranjeevi Rapolu 	{0x5786, 0x00},
6345de35c9bSChiranjeevi Rapolu 	{0x5787, 0x04},
6355de35c9bSChiranjeevi Rapolu 	{0x5788, 0x02},
6365de35c9bSChiranjeevi Rapolu 	{0x5789, 0x0f},
6375de35c9bSChiranjeevi Rapolu 	{0x578a, 0xfd},
6385de35c9bSChiranjeevi Rapolu 	{0x578b, 0xf5},
6395de35c9bSChiranjeevi Rapolu 	{0x578c, 0xf5},
6405de35c9bSChiranjeevi Rapolu 	{0x578d, 0x03},
6415de35c9bSChiranjeevi Rapolu 	{0x578e, 0x08},
6425de35c9bSChiranjeevi Rapolu 	{0x578f, 0x0c},
6435de35c9bSChiranjeevi Rapolu 	{0x5790, 0x08},
6445de35c9bSChiranjeevi Rapolu 	{0x5791, 0x04},
6455de35c9bSChiranjeevi Rapolu 	{0x5792, 0x00},
6465de35c9bSChiranjeevi Rapolu 	{0x5793, 0x52},
6475de35c9bSChiranjeevi Rapolu 	{0x5794, 0xa3},
6485de35c9bSChiranjeevi Rapolu 	{0x3503, 0x00}
6495de35c9bSChiranjeevi Rapolu };
6505de35c9bSChiranjeevi Rapolu 
6515de35c9bSChiranjeevi Rapolu static const struct ov5670_reg mode_648x486_regs[] = {
6525de35c9bSChiranjeevi Rapolu 	{0x3000, 0x00},
6535de35c9bSChiranjeevi Rapolu 	{0x3002, 0x21},
6545de35c9bSChiranjeevi Rapolu 	{0x3005, 0xf0},
6555de35c9bSChiranjeevi Rapolu 	{0x3007, 0x00},
6565de35c9bSChiranjeevi Rapolu 	{0x3015, 0x0f},
6575de35c9bSChiranjeevi Rapolu 	{0x3018, 0x32},
6585de35c9bSChiranjeevi Rapolu 	{0x301a, 0xf0},
6595de35c9bSChiranjeevi Rapolu 	{0x301b, 0xf0},
6605de35c9bSChiranjeevi Rapolu 	{0x301c, 0xf0},
6615de35c9bSChiranjeevi Rapolu 	{0x301d, 0xf0},
6625de35c9bSChiranjeevi Rapolu 	{0x301e, 0xf0},
6635de35c9bSChiranjeevi Rapolu 	{0x3030, 0x00},
6645de35c9bSChiranjeevi Rapolu 	{0x3031, 0x0a},
6655de35c9bSChiranjeevi Rapolu 	{0x303c, 0xff},
6665de35c9bSChiranjeevi Rapolu 	{0x303e, 0xff},
6675de35c9bSChiranjeevi Rapolu 	{0x3040, 0xf0},
6685de35c9bSChiranjeevi Rapolu 	{0x3041, 0x00},
6695de35c9bSChiranjeevi Rapolu 	{0x3042, 0xf0},
6705de35c9bSChiranjeevi Rapolu 	{0x3106, 0x11},
6715de35c9bSChiranjeevi Rapolu 	{0x3500, 0x00},
6725de35c9bSChiranjeevi Rapolu 	{0x3501, 0x80},
6735de35c9bSChiranjeevi Rapolu 	{0x3502, 0x00},
6745de35c9bSChiranjeevi Rapolu 	{0x3503, 0x04},
6755de35c9bSChiranjeevi Rapolu 	{0x3504, 0x03},
6765de35c9bSChiranjeevi Rapolu 	{0x3505, 0x83},
6775de35c9bSChiranjeevi Rapolu 	{0x3508, 0x04},
6785de35c9bSChiranjeevi Rapolu 	{0x3509, 0x00},
6795de35c9bSChiranjeevi Rapolu 	{0x350e, 0x04},
6805de35c9bSChiranjeevi Rapolu 	{0x350f, 0x00},
6815de35c9bSChiranjeevi Rapolu 	{0x3510, 0x00},
6825de35c9bSChiranjeevi Rapolu 	{0x3511, 0x02},
6835de35c9bSChiranjeevi Rapolu 	{0x3512, 0x00},
6845de35c9bSChiranjeevi Rapolu 	{0x3601, 0xc8},
6855de35c9bSChiranjeevi Rapolu 	{0x3610, 0x88},
6865de35c9bSChiranjeevi Rapolu 	{0x3612, 0x48},
6875de35c9bSChiranjeevi Rapolu 	{0x3614, 0x5b},
6885de35c9bSChiranjeevi Rapolu 	{0x3615, 0x96},
6895de35c9bSChiranjeevi Rapolu 	{0x3621, 0xd0},
6905de35c9bSChiranjeevi Rapolu 	{0x3622, 0x00},
6915de35c9bSChiranjeevi Rapolu 	{0x3623, 0x04},
6925de35c9bSChiranjeevi Rapolu 	{0x3633, 0x13},
6935de35c9bSChiranjeevi Rapolu 	{0x3634, 0x13},
6945de35c9bSChiranjeevi Rapolu 	{0x3635, 0x13},
6955de35c9bSChiranjeevi Rapolu 	{0x3636, 0x13},
6965de35c9bSChiranjeevi Rapolu 	{0x3645, 0x13},
6975de35c9bSChiranjeevi Rapolu 	{0x3646, 0x82},
6985de35c9bSChiranjeevi Rapolu 	{0x3650, 0x00},
6995de35c9bSChiranjeevi Rapolu 	{0x3652, 0xff},
7005de35c9bSChiranjeevi Rapolu 	{0x3655, 0x20},
7015de35c9bSChiranjeevi Rapolu 	{0x3656, 0xff},
7025de35c9bSChiranjeevi Rapolu 	{0x365a, 0xff},
7035de35c9bSChiranjeevi Rapolu 	{0x365e, 0xff},
7045de35c9bSChiranjeevi Rapolu 	{0x3668, 0x00},
7055de35c9bSChiranjeevi Rapolu 	{0x366a, 0x07},
7065de35c9bSChiranjeevi Rapolu 	{0x366e, 0x08},
7075de35c9bSChiranjeevi Rapolu 	{0x366d, 0x00},
7085de35c9bSChiranjeevi Rapolu 	{0x366f, 0x80},
7095de35c9bSChiranjeevi Rapolu 	{0x3700, 0x28},
7105de35c9bSChiranjeevi Rapolu 	{0x3701, 0x10},
7115de35c9bSChiranjeevi Rapolu 	{0x3702, 0x3a},
7125de35c9bSChiranjeevi Rapolu 	{0x3703, 0x19},
7135de35c9bSChiranjeevi Rapolu 	{0x3704, 0x10},
7145de35c9bSChiranjeevi Rapolu 	{0x3705, 0x00},
7155de35c9bSChiranjeevi Rapolu 	{0x3706, 0x66},
7165de35c9bSChiranjeevi Rapolu 	{0x3707, 0x08},
7175de35c9bSChiranjeevi Rapolu 	{0x3708, 0x34},
7185de35c9bSChiranjeevi Rapolu 	{0x3709, 0x40},
7195de35c9bSChiranjeevi Rapolu 	{0x370a, 0x01},
7205de35c9bSChiranjeevi Rapolu 	{0x370b, 0x1b},
7215de35c9bSChiranjeevi Rapolu 	{0x3714, 0x24},
7225de35c9bSChiranjeevi Rapolu 	{0x371a, 0x3e},
7235de35c9bSChiranjeevi Rapolu 	{0x3733, 0x00},
7245de35c9bSChiranjeevi Rapolu 	{0x3734, 0x00},
7255de35c9bSChiranjeevi Rapolu 	{0x373a, 0x05},
7265de35c9bSChiranjeevi Rapolu 	{0x373b, 0x06},
7275de35c9bSChiranjeevi Rapolu 	{0x373c, 0x0a},
7285de35c9bSChiranjeevi Rapolu 	{0x373f, 0xa0},
7295de35c9bSChiranjeevi Rapolu 	{0x3755, 0x00},
7305de35c9bSChiranjeevi Rapolu 	{0x3758, 0x00},
7315de35c9bSChiranjeevi Rapolu 	{0x375b, 0x0e},
7325de35c9bSChiranjeevi Rapolu 	{0x3766, 0x5f},
7335de35c9bSChiranjeevi Rapolu 	{0x3768, 0x00},
7345de35c9bSChiranjeevi Rapolu 	{0x3769, 0x22},
7355de35c9bSChiranjeevi Rapolu 	{0x3773, 0x08},
7365de35c9bSChiranjeevi Rapolu 	{0x3774, 0x1f},
7375de35c9bSChiranjeevi Rapolu 	{0x3776, 0x06},
7385de35c9bSChiranjeevi Rapolu 	{0x37a0, 0x88},
7395de35c9bSChiranjeevi Rapolu 	{0x37a1, 0x5c},
7405de35c9bSChiranjeevi Rapolu 	{0x37a7, 0x88},
7415de35c9bSChiranjeevi Rapolu 	{0x37a8, 0x70},
7425de35c9bSChiranjeevi Rapolu 	{0x37aa, 0x88},
7435de35c9bSChiranjeevi Rapolu 	{0x37ab, 0x48},
7445de35c9bSChiranjeevi Rapolu 	{0x37b3, 0x66},
7455de35c9bSChiranjeevi Rapolu 	{0x37c2, 0x04},
7465de35c9bSChiranjeevi Rapolu 	{0x37c5, 0x00},
7475de35c9bSChiranjeevi Rapolu 	{0x37c8, 0x00},
7485de35c9bSChiranjeevi Rapolu 	{0x3800, 0x00},
7495de35c9bSChiranjeevi Rapolu 	{0x3801, 0x0c},
7505de35c9bSChiranjeevi Rapolu 	{0x3802, 0x00},
7515de35c9bSChiranjeevi Rapolu 	{0x3803, 0x04},
7525de35c9bSChiranjeevi Rapolu 	{0x3804, 0x0a},
7535de35c9bSChiranjeevi Rapolu 	{0x3805, 0x33},
7545de35c9bSChiranjeevi Rapolu 	{0x3806, 0x07},
7555de35c9bSChiranjeevi Rapolu 	{0x3807, 0xa3},
7565de35c9bSChiranjeevi Rapolu 	{0x3808, 0x02},
7575de35c9bSChiranjeevi Rapolu 	{0x3809, 0x88},
7585de35c9bSChiranjeevi Rapolu 	{0x380a, 0x01},
7595de35c9bSChiranjeevi Rapolu 	{0x380b, 0xe6},
7605de35c9bSChiranjeevi Rapolu 	{0x380c, 0x06},
7615de35c9bSChiranjeevi Rapolu 	{0x380d, 0x90},
7625de35c9bSChiranjeevi Rapolu 	{0x380e, 0x08},
7635de35c9bSChiranjeevi Rapolu 	{0x380f, 0x08},
7645de35c9bSChiranjeevi Rapolu 	{0x3811, 0x04},
7655de35c9bSChiranjeevi Rapolu 	{0x3813, 0x02},
7665de35c9bSChiranjeevi Rapolu 	{0x3814, 0x07},
7675de35c9bSChiranjeevi Rapolu 	{0x3815, 0x01},
7685de35c9bSChiranjeevi Rapolu 	{0x3816, 0x00},
7695de35c9bSChiranjeevi Rapolu 	{0x3817, 0x00},
7705de35c9bSChiranjeevi Rapolu 	{0x3818, 0x00},
7715de35c9bSChiranjeevi Rapolu 	{0x3819, 0x00},
7725de35c9bSChiranjeevi Rapolu 	{0x3820, 0x94},
7735de35c9bSChiranjeevi Rapolu 	{0x3821, 0xc6},
7745de35c9bSChiranjeevi Rapolu 	{0x3822, 0x48},
7755de35c9bSChiranjeevi Rapolu 	{0x3826, 0x00},
7765de35c9bSChiranjeevi Rapolu 	{0x3827, 0x08},
7775de35c9bSChiranjeevi Rapolu 	{0x382a, 0x07},
7785de35c9bSChiranjeevi Rapolu 	{0x382b, 0x01},
7795de35c9bSChiranjeevi Rapolu 	{0x3830, 0x08},
7805de35c9bSChiranjeevi Rapolu 	{0x3836, 0x02},
7815de35c9bSChiranjeevi Rapolu 	{0x3837, 0x00},
7825de35c9bSChiranjeevi Rapolu 	{0x3838, 0x10},
7835de35c9bSChiranjeevi Rapolu 	{0x3841, 0xff},
7845de35c9bSChiranjeevi Rapolu 	{0x3846, 0x48},
7855de35c9bSChiranjeevi Rapolu 	{0x3861, 0x00},
7865de35c9bSChiranjeevi Rapolu 	{0x3862, 0x04},
7875de35c9bSChiranjeevi Rapolu 	{0x3863, 0x06},
7885de35c9bSChiranjeevi Rapolu 	{0x3a11, 0x01},
7895de35c9bSChiranjeevi Rapolu 	{0x3a12, 0x78},
7905de35c9bSChiranjeevi Rapolu 	{0x3b00, 0x00},
7915de35c9bSChiranjeevi Rapolu 	{0x3b02, 0x00},
7925de35c9bSChiranjeevi Rapolu 	{0x3b03, 0x00},
7935de35c9bSChiranjeevi Rapolu 	{0x3b04, 0x00},
7945de35c9bSChiranjeevi Rapolu 	{0x3b05, 0x00},
7955de35c9bSChiranjeevi Rapolu 	{0x3c00, 0x89},
7965de35c9bSChiranjeevi Rapolu 	{0x3c01, 0xab},
7975de35c9bSChiranjeevi Rapolu 	{0x3c02, 0x01},
7985de35c9bSChiranjeevi Rapolu 	{0x3c03, 0x00},
7995de35c9bSChiranjeevi Rapolu 	{0x3c04, 0x00},
8005de35c9bSChiranjeevi Rapolu 	{0x3c05, 0x03},
8015de35c9bSChiranjeevi Rapolu 	{0x3c06, 0x00},
8025de35c9bSChiranjeevi Rapolu 	{0x3c07, 0x05},
8035de35c9bSChiranjeevi Rapolu 	{0x3c0c, 0x00},
8045de35c9bSChiranjeevi Rapolu 	{0x3c0d, 0x00},
8055de35c9bSChiranjeevi Rapolu 	{0x3c0e, 0x00},
8065de35c9bSChiranjeevi Rapolu 	{0x3c0f, 0x00},
8075de35c9bSChiranjeevi Rapolu 	{0x3c40, 0x00},
8085de35c9bSChiranjeevi Rapolu 	{0x3c41, 0xa3},
8095de35c9bSChiranjeevi Rapolu 	{0x3c43, 0x7d},
8105de35c9bSChiranjeevi Rapolu 	{0x3c45, 0xd7},
8115de35c9bSChiranjeevi Rapolu 	{0x3c47, 0xfc},
8125de35c9bSChiranjeevi Rapolu 	{0x3c50, 0x05},
8135de35c9bSChiranjeevi Rapolu 	{0x3c52, 0xaa},
8145de35c9bSChiranjeevi Rapolu 	{0x3c54, 0x71},
8155de35c9bSChiranjeevi Rapolu 	{0x3c56, 0x80},
8165de35c9bSChiranjeevi Rapolu 	{0x3d85, 0x17},
8175de35c9bSChiranjeevi Rapolu 	{0x3f03, 0x00},
8185de35c9bSChiranjeevi Rapolu 	{0x3f0a, 0x00},
8195de35c9bSChiranjeevi Rapolu 	{0x3f0b, 0x00},
8205de35c9bSChiranjeevi Rapolu 	{0x4001, 0x60},
8215de35c9bSChiranjeevi Rapolu 	{0x4009, 0x05},
8225de35c9bSChiranjeevi Rapolu 	{0x4020, 0x00},
8235de35c9bSChiranjeevi Rapolu 	{0x4021, 0x00},
8245de35c9bSChiranjeevi Rapolu 	{0x4022, 0x00},
8255de35c9bSChiranjeevi Rapolu 	{0x4023, 0x00},
8265de35c9bSChiranjeevi Rapolu 	{0x4024, 0x00},
8275de35c9bSChiranjeevi Rapolu 	{0x4025, 0x00},
8285de35c9bSChiranjeevi Rapolu 	{0x4026, 0x00},
8295de35c9bSChiranjeevi Rapolu 	{0x4027, 0x00},
8305de35c9bSChiranjeevi Rapolu 	{0x4028, 0x00},
8315de35c9bSChiranjeevi Rapolu 	{0x4029, 0x00},
8325de35c9bSChiranjeevi Rapolu 	{0x402a, 0x00},
8335de35c9bSChiranjeevi Rapolu 	{0x402b, 0x00},
8345de35c9bSChiranjeevi Rapolu 	{0x402c, 0x00},
8355de35c9bSChiranjeevi Rapolu 	{0x402d, 0x00},
8365de35c9bSChiranjeevi Rapolu 	{0x402e, 0x00},
8375de35c9bSChiranjeevi Rapolu 	{0x402f, 0x00},
8385de35c9bSChiranjeevi Rapolu 	{0x4040, 0x00},
8395de35c9bSChiranjeevi Rapolu 	{0x4041, 0x03},
8405de35c9bSChiranjeevi Rapolu 	{0x4042, 0x00},
8415de35c9bSChiranjeevi Rapolu 	{0x4043, 0x7A},
8425de35c9bSChiranjeevi Rapolu 	{0x4044, 0x00},
8435de35c9bSChiranjeevi Rapolu 	{0x4045, 0x7A},
8445de35c9bSChiranjeevi Rapolu 	{0x4046, 0x00},
8455de35c9bSChiranjeevi Rapolu 	{0x4047, 0x7A},
8465de35c9bSChiranjeevi Rapolu 	{0x4048, 0x00},
8475de35c9bSChiranjeevi Rapolu 	{0x4049, 0x7A},
8485de35c9bSChiranjeevi Rapolu 	{0x4307, 0x30},
8495de35c9bSChiranjeevi Rapolu 	{0x4500, 0x58},
8505de35c9bSChiranjeevi Rapolu 	{0x4501, 0x04},
8515de35c9bSChiranjeevi Rapolu 	{0x4502, 0x40},
8525de35c9bSChiranjeevi Rapolu 	{0x4503, 0x10},
8535de35c9bSChiranjeevi Rapolu 	{0x4508, 0x55},
8545de35c9bSChiranjeevi Rapolu 	{0x4509, 0x55},
8555de35c9bSChiranjeevi Rapolu 	{0x450a, 0x02},
8565de35c9bSChiranjeevi Rapolu 	{0x450b, 0x00},
8575de35c9bSChiranjeevi Rapolu 	{0x4600, 0x00},
8585de35c9bSChiranjeevi Rapolu 	{0x4601, 0x40},
8595de35c9bSChiranjeevi Rapolu 	{0x4700, 0xa4},
8605de35c9bSChiranjeevi Rapolu 	{0x4800, 0x4c},
8615de35c9bSChiranjeevi Rapolu 	{0x4816, 0x53},
8625de35c9bSChiranjeevi Rapolu 	{0x481f, 0x40},
8635de35c9bSChiranjeevi Rapolu 	{0x4837, 0x13},
8645de35c9bSChiranjeevi Rapolu 	{0x5000, 0x56},
8655de35c9bSChiranjeevi Rapolu 	{0x5001, 0x01},
8665de35c9bSChiranjeevi Rapolu 	{0x5002, 0x28},
8675de35c9bSChiranjeevi Rapolu 	{0x5004, 0x0c},
8685de35c9bSChiranjeevi Rapolu 	{0x5006, 0x0c},
8695de35c9bSChiranjeevi Rapolu 	{0x5007, 0xe0},
8705de35c9bSChiranjeevi Rapolu 	{0x5008, 0x01},
8715de35c9bSChiranjeevi Rapolu 	{0x5009, 0xb0},
8725de35c9bSChiranjeevi Rapolu 	{0x5901, 0x00},
8735de35c9bSChiranjeevi Rapolu 	{0x5a01, 0x00},
8745de35c9bSChiranjeevi Rapolu 	{0x5a03, 0x00},
8755de35c9bSChiranjeevi Rapolu 	{0x5a04, 0x0c},
8765de35c9bSChiranjeevi Rapolu 	{0x5a05, 0xe0},
8775de35c9bSChiranjeevi Rapolu 	{0x5a06, 0x09},
8785de35c9bSChiranjeevi Rapolu 	{0x5a07, 0xb0},
8795de35c9bSChiranjeevi Rapolu 	{0x5a08, 0x06},
8805de35c9bSChiranjeevi Rapolu 	{0x5e00, 0x00},
8815de35c9bSChiranjeevi Rapolu 	{0x3734, 0x40},
8825de35c9bSChiranjeevi Rapolu 	{0x5b00, 0x01},
8835de35c9bSChiranjeevi Rapolu 	{0x5b01, 0x10},
8845de35c9bSChiranjeevi Rapolu 	{0x5b02, 0x01},
8855de35c9bSChiranjeevi Rapolu 	{0x5b03, 0xdb},
8865de35c9bSChiranjeevi Rapolu 	{0x3d8c, 0x71},
8875de35c9bSChiranjeevi Rapolu 	{0x3d8d, 0xea},
8885de35c9bSChiranjeevi Rapolu 	{0x4017, 0x10},
8895de35c9bSChiranjeevi Rapolu 	{0x3618, 0x2a},
8905de35c9bSChiranjeevi Rapolu 	{0x5780, 0x3e},
8915de35c9bSChiranjeevi Rapolu 	{0x5781, 0x0f},
8925de35c9bSChiranjeevi Rapolu 	{0x5782, 0x44},
8935de35c9bSChiranjeevi Rapolu 	{0x5783, 0x02},
8945de35c9bSChiranjeevi Rapolu 	{0x5784, 0x01},
8955de35c9bSChiranjeevi Rapolu 	{0x5785, 0x01},
8965de35c9bSChiranjeevi Rapolu 	{0x5786, 0x00},
8975de35c9bSChiranjeevi Rapolu 	{0x5787, 0x04},
8985de35c9bSChiranjeevi Rapolu 	{0x5788, 0x02},
8995de35c9bSChiranjeevi Rapolu 	{0x5789, 0x0f},
9005de35c9bSChiranjeevi Rapolu 	{0x578a, 0xfd},
9015de35c9bSChiranjeevi Rapolu 	{0x578b, 0xf5},
9025de35c9bSChiranjeevi Rapolu 	{0x578c, 0xf5},
9035de35c9bSChiranjeevi Rapolu 	{0x578d, 0x03},
9045de35c9bSChiranjeevi Rapolu 	{0x578e, 0x08},
9055de35c9bSChiranjeevi Rapolu 	{0x578f, 0x0c},
9065de35c9bSChiranjeevi Rapolu 	{0x5790, 0x08},
9075de35c9bSChiranjeevi Rapolu 	{0x5791, 0x06},
9085de35c9bSChiranjeevi Rapolu 	{0x5792, 0x00},
9095de35c9bSChiranjeevi Rapolu 	{0x5793, 0x52},
9105de35c9bSChiranjeevi Rapolu 	{0x5794, 0xa3},
9115de35c9bSChiranjeevi Rapolu 	{0x3503, 0x00}
9125de35c9bSChiranjeevi Rapolu };
9135de35c9bSChiranjeevi Rapolu 
9145de35c9bSChiranjeevi Rapolu static const struct ov5670_reg mode_2560x1440_regs[] = {
9155de35c9bSChiranjeevi Rapolu 	{0x3000, 0x00},
9165de35c9bSChiranjeevi Rapolu 	{0x3002, 0x21},
9175de35c9bSChiranjeevi Rapolu 	{0x3005, 0xf0},
9185de35c9bSChiranjeevi Rapolu 	{0x3007, 0x00},
9195de35c9bSChiranjeevi Rapolu 	{0x3015, 0x0f},
9205de35c9bSChiranjeevi Rapolu 	{0x3018, 0x32},
9215de35c9bSChiranjeevi Rapolu 	{0x301a, 0xf0},
9225de35c9bSChiranjeevi Rapolu 	{0x301b, 0xf0},
9235de35c9bSChiranjeevi Rapolu 	{0x301c, 0xf0},
9245de35c9bSChiranjeevi Rapolu 	{0x301d, 0xf0},
9255de35c9bSChiranjeevi Rapolu 	{0x301e, 0xf0},
9265de35c9bSChiranjeevi Rapolu 	{0x3030, 0x00},
9275de35c9bSChiranjeevi Rapolu 	{0x3031, 0x0a},
9285de35c9bSChiranjeevi Rapolu 	{0x303c, 0xff},
9295de35c9bSChiranjeevi Rapolu 	{0x303e, 0xff},
9305de35c9bSChiranjeevi Rapolu 	{0x3040, 0xf0},
9315de35c9bSChiranjeevi Rapolu 	{0x3041, 0x00},
9325de35c9bSChiranjeevi Rapolu 	{0x3042, 0xf0},
9335de35c9bSChiranjeevi Rapolu 	{0x3106, 0x11},
9345de35c9bSChiranjeevi Rapolu 	{0x3500, 0x00},
9355de35c9bSChiranjeevi Rapolu 	{0x3501, 0x80},
9365de35c9bSChiranjeevi Rapolu 	{0x3502, 0x00},
9375de35c9bSChiranjeevi Rapolu 	{0x3503, 0x04},
9385de35c9bSChiranjeevi Rapolu 	{0x3504, 0x03},
9395de35c9bSChiranjeevi Rapolu 	{0x3505, 0x83},
9405de35c9bSChiranjeevi Rapolu 	{0x3508, 0x04},
9415de35c9bSChiranjeevi Rapolu 	{0x3509, 0x00},
9425de35c9bSChiranjeevi Rapolu 	{0x350e, 0x04},
9435de35c9bSChiranjeevi Rapolu 	{0x350f, 0x00},
9445de35c9bSChiranjeevi Rapolu 	{0x3510, 0x00},
9455de35c9bSChiranjeevi Rapolu 	{0x3511, 0x02},
9465de35c9bSChiranjeevi Rapolu 	{0x3512, 0x00},
9475de35c9bSChiranjeevi Rapolu 	{0x3601, 0xc8},
9485de35c9bSChiranjeevi Rapolu 	{0x3610, 0x88},
9495de35c9bSChiranjeevi Rapolu 	{0x3612, 0x48},
9505de35c9bSChiranjeevi Rapolu 	{0x3614, 0x5b},
9515de35c9bSChiranjeevi Rapolu 	{0x3615, 0x96},
9525de35c9bSChiranjeevi Rapolu 	{0x3621, 0xd0},
9535de35c9bSChiranjeevi Rapolu 	{0x3622, 0x00},
9545de35c9bSChiranjeevi Rapolu 	{0x3623, 0x00},
9555de35c9bSChiranjeevi Rapolu 	{0x3633, 0x13},
9565de35c9bSChiranjeevi Rapolu 	{0x3634, 0x13},
9575de35c9bSChiranjeevi Rapolu 	{0x3635, 0x13},
9585de35c9bSChiranjeevi Rapolu 	{0x3636, 0x13},
9595de35c9bSChiranjeevi Rapolu 	{0x3645, 0x13},
9605de35c9bSChiranjeevi Rapolu 	{0x3646, 0x82},
9615de35c9bSChiranjeevi Rapolu 	{0x3650, 0x00},
9625de35c9bSChiranjeevi Rapolu 	{0x3652, 0xff},
9635de35c9bSChiranjeevi Rapolu 	{0x3655, 0x20},
9645de35c9bSChiranjeevi Rapolu 	{0x3656, 0xff},
9655de35c9bSChiranjeevi Rapolu 	{0x365a, 0xff},
9665de35c9bSChiranjeevi Rapolu 	{0x365e, 0xff},
9675de35c9bSChiranjeevi Rapolu 	{0x3668, 0x00},
9685de35c9bSChiranjeevi Rapolu 	{0x366a, 0x07},
9695de35c9bSChiranjeevi Rapolu 	{0x366e, 0x10},
9705de35c9bSChiranjeevi Rapolu 	{0x366d, 0x00},
9715de35c9bSChiranjeevi Rapolu 	{0x366f, 0x80},
9725de35c9bSChiranjeevi Rapolu 	{0x3700, 0x28},
9735de35c9bSChiranjeevi Rapolu 	{0x3701, 0x10},
9745de35c9bSChiranjeevi Rapolu 	{0x3702, 0x3a},
9755de35c9bSChiranjeevi Rapolu 	{0x3703, 0x19},
9765de35c9bSChiranjeevi Rapolu 	{0x3704, 0x10},
9775de35c9bSChiranjeevi Rapolu 	{0x3705, 0x00},
9785de35c9bSChiranjeevi Rapolu 	{0x3706, 0x66},
9795de35c9bSChiranjeevi Rapolu 	{0x3707, 0x08},
9805de35c9bSChiranjeevi Rapolu 	{0x3708, 0x34},
9815de35c9bSChiranjeevi Rapolu 	{0x3709, 0x40},
9825de35c9bSChiranjeevi Rapolu 	{0x370a, 0x01},
9835de35c9bSChiranjeevi Rapolu 	{0x370b, 0x1b},
9845de35c9bSChiranjeevi Rapolu 	{0x3714, 0x24},
9855de35c9bSChiranjeevi Rapolu 	{0x371a, 0x3e},
9865de35c9bSChiranjeevi Rapolu 	{0x3733, 0x00},
9875de35c9bSChiranjeevi Rapolu 	{0x3734, 0x00},
9885de35c9bSChiranjeevi Rapolu 	{0x373a, 0x05},
9895de35c9bSChiranjeevi Rapolu 	{0x373b, 0x06},
9905de35c9bSChiranjeevi Rapolu 	{0x373c, 0x0a},
9915de35c9bSChiranjeevi Rapolu 	{0x373f, 0xa0},
9925de35c9bSChiranjeevi Rapolu 	{0x3755, 0x00},
9935de35c9bSChiranjeevi Rapolu 	{0x3758, 0x00},
9945de35c9bSChiranjeevi Rapolu 	{0x375b, 0x0e},
9955de35c9bSChiranjeevi Rapolu 	{0x3766, 0x5f},
9965de35c9bSChiranjeevi Rapolu 	{0x3768, 0x00},
9975de35c9bSChiranjeevi Rapolu 	{0x3769, 0x22},
9985de35c9bSChiranjeevi Rapolu 	{0x3773, 0x08},
9995de35c9bSChiranjeevi Rapolu 	{0x3774, 0x1f},
10005de35c9bSChiranjeevi Rapolu 	{0x3776, 0x06},
10015de35c9bSChiranjeevi Rapolu 	{0x37a0, 0x88},
10025de35c9bSChiranjeevi Rapolu 	{0x37a1, 0x5c},
10035de35c9bSChiranjeevi Rapolu 	{0x37a7, 0x88},
10045de35c9bSChiranjeevi Rapolu 	{0x37a8, 0x70},
10055de35c9bSChiranjeevi Rapolu 	{0x37aa, 0x88},
10065de35c9bSChiranjeevi Rapolu 	{0x37ab, 0x48},
10075de35c9bSChiranjeevi Rapolu 	{0x37b3, 0x66},
10085de35c9bSChiranjeevi Rapolu 	{0x37c2, 0x04},
10095de35c9bSChiranjeevi Rapolu 	{0x37c5, 0x00},
10105de35c9bSChiranjeevi Rapolu 	{0x37c8, 0x00},
10115de35c9bSChiranjeevi Rapolu 	{0x3800, 0x00},
10125de35c9bSChiranjeevi Rapolu 	{0x3801, 0x0c},
10135de35c9bSChiranjeevi Rapolu 	{0x3802, 0x00},
10145de35c9bSChiranjeevi Rapolu 	{0x3803, 0x04},
10155de35c9bSChiranjeevi Rapolu 	{0x3804, 0x0a},
10165de35c9bSChiranjeevi Rapolu 	{0x3805, 0x33},
10175de35c9bSChiranjeevi Rapolu 	{0x3806, 0x07},
10185de35c9bSChiranjeevi Rapolu 	{0x3807, 0xa3},
10195de35c9bSChiranjeevi Rapolu 	{0x3808, 0x0a},
10205de35c9bSChiranjeevi Rapolu 	{0x3809, 0x00},
10215de35c9bSChiranjeevi Rapolu 	{0x380a, 0x05},
10225de35c9bSChiranjeevi Rapolu 	{0x380b, 0xa0},
10235de35c9bSChiranjeevi Rapolu 	{0x380c, 0x06},
10245de35c9bSChiranjeevi Rapolu 	{0x380d, 0x90},
10255de35c9bSChiranjeevi Rapolu 	{0x380e, 0x08},
10265de35c9bSChiranjeevi Rapolu 	{0x380f, 0x08},
10275de35c9bSChiranjeevi Rapolu 	{0x3811, 0x04},
10285de35c9bSChiranjeevi Rapolu 	{0x3813, 0x02},
10295de35c9bSChiranjeevi Rapolu 	{0x3814, 0x01},
10305de35c9bSChiranjeevi Rapolu 	{0x3815, 0x01},
10315de35c9bSChiranjeevi Rapolu 	{0x3816, 0x00},
10325de35c9bSChiranjeevi Rapolu 	{0x3817, 0x00},
10335de35c9bSChiranjeevi Rapolu 	{0x3818, 0x00},
10345de35c9bSChiranjeevi Rapolu 	{0x3819, 0x00},
10355de35c9bSChiranjeevi Rapolu 	{0x3820, 0x84},
10365de35c9bSChiranjeevi Rapolu 	{0x3821, 0x46},
10375de35c9bSChiranjeevi Rapolu 	{0x3822, 0x48},
10385de35c9bSChiranjeevi Rapolu 	{0x3826, 0x00},
10395de35c9bSChiranjeevi Rapolu 	{0x3827, 0x08},
10405de35c9bSChiranjeevi Rapolu 	{0x382a, 0x01},
10415de35c9bSChiranjeevi Rapolu 	{0x382b, 0x01},
10425de35c9bSChiranjeevi Rapolu 	{0x3830, 0x08},
10435de35c9bSChiranjeevi Rapolu 	{0x3836, 0x02},
10445de35c9bSChiranjeevi Rapolu 	{0x3837, 0x00},
10455de35c9bSChiranjeevi Rapolu 	{0x3838, 0x10},
10465de35c9bSChiranjeevi Rapolu 	{0x3841, 0xff},
10475de35c9bSChiranjeevi Rapolu 	{0x3846, 0x48},
10485de35c9bSChiranjeevi Rapolu 	{0x3861, 0x00},
10495de35c9bSChiranjeevi Rapolu 	{0x3862, 0x04},
10505de35c9bSChiranjeevi Rapolu 	{0x3863, 0x06},
10515de35c9bSChiranjeevi Rapolu 	{0x3a11, 0x01},
10525de35c9bSChiranjeevi Rapolu 	{0x3a12, 0x78},
10535de35c9bSChiranjeevi Rapolu 	{0x3b00, 0x00},
10545de35c9bSChiranjeevi Rapolu 	{0x3b02, 0x00},
10555de35c9bSChiranjeevi Rapolu 	{0x3b03, 0x00},
10565de35c9bSChiranjeevi Rapolu 	{0x3b04, 0x00},
10575de35c9bSChiranjeevi Rapolu 	{0x3b05, 0x00},
10585de35c9bSChiranjeevi Rapolu 	{0x3c00, 0x89},
10595de35c9bSChiranjeevi Rapolu 	{0x3c01, 0xab},
10605de35c9bSChiranjeevi Rapolu 	{0x3c02, 0x01},
10615de35c9bSChiranjeevi Rapolu 	{0x3c03, 0x00},
10625de35c9bSChiranjeevi Rapolu 	{0x3c04, 0x00},
10635de35c9bSChiranjeevi Rapolu 	{0x3c05, 0x03},
10645de35c9bSChiranjeevi Rapolu 	{0x3c06, 0x00},
10655de35c9bSChiranjeevi Rapolu 	{0x3c07, 0x05},
10665de35c9bSChiranjeevi Rapolu 	{0x3c0c, 0x00},
10675de35c9bSChiranjeevi Rapolu 	{0x3c0d, 0x00},
10685de35c9bSChiranjeevi Rapolu 	{0x3c0e, 0x00},
10695de35c9bSChiranjeevi Rapolu 	{0x3c0f, 0x00},
10705de35c9bSChiranjeevi Rapolu 	{0x3c40, 0x00},
10715de35c9bSChiranjeevi Rapolu 	{0x3c41, 0xa3},
10725de35c9bSChiranjeevi Rapolu 	{0x3c43, 0x7d},
10735de35c9bSChiranjeevi Rapolu 	{0x3c45, 0xd7},
10745de35c9bSChiranjeevi Rapolu 	{0x3c47, 0xfc},
10755de35c9bSChiranjeevi Rapolu 	{0x3c50, 0x05},
10765de35c9bSChiranjeevi Rapolu 	{0x3c52, 0xaa},
10775de35c9bSChiranjeevi Rapolu 	{0x3c54, 0x71},
10785de35c9bSChiranjeevi Rapolu 	{0x3c56, 0x80},
10795de35c9bSChiranjeevi Rapolu 	{0x3d85, 0x17},
10805de35c9bSChiranjeevi Rapolu 	{0x3f03, 0x00},
10815de35c9bSChiranjeevi Rapolu 	{0x3f0a, 0x00},
10825de35c9bSChiranjeevi Rapolu 	{0x3f0b, 0x00},
10835de35c9bSChiranjeevi Rapolu 	{0x4001, 0x60},
10845de35c9bSChiranjeevi Rapolu 	{0x4009, 0x0d},
10855de35c9bSChiranjeevi Rapolu 	{0x4020, 0x00},
10865de35c9bSChiranjeevi Rapolu 	{0x4021, 0x00},
10875de35c9bSChiranjeevi Rapolu 	{0x4022, 0x00},
10885de35c9bSChiranjeevi Rapolu 	{0x4023, 0x00},
10895de35c9bSChiranjeevi Rapolu 	{0x4024, 0x00},
10905de35c9bSChiranjeevi Rapolu 	{0x4025, 0x00},
10915de35c9bSChiranjeevi Rapolu 	{0x4026, 0x00},
10925de35c9bSChiranjeevi Rapolu 	{0x4027, 0x00},
10935de35c9bSChiranjeevi Rapolu 	{0x4028, 0x00},
10945de35c9bSChiranjeevi Rapolu 	{0x4029, 0x00},
10955de35c9bSChiranjeevi Rapolu 	{0x402a, 0x00},
10965de35c9bSChiranjeevi Rapolu 	{0x402b, 0x00},
10975de35c9bSChiranjeevi Rapolu 	{0x402c, 0x00},
10985de35c9bSChiranjeevi Rapolu 	{0x402d, 0x00},
10995de35c9bSChiranjeevi Rapolu 	{0x402e, 0x00},
11005de35c9bSChiranjeevi Rapolu 	{0x402f, 0x00},
11015de35c9bSChiranjeevi Rapolu 	{0x4040, 0x00},
11025de35c9bSChiranjeevi Rapolu 	{0x4041, 0x03},
11035de35c9bSChiranjeevi Rapolu 	{0x4042, 0x00},
11045de35c9bSChiranjeevi Rapolu 	{0x4043, 0x7A},
11055de35c9bSChiranjeevi Rapolu 	{0x4044, 0x00},
11065de35c9bSChiranjeevi Rapolu 	{0x4045, 0x7A},
11075de35c9bSChiranjeevi Rapolu 	{0x4046, 0x00},
11085de35c9bSChiranjeevi Rapolu 	{0x4047, 0x7A},
11095de35c9bSChiranjeevi Rapolu 	{0x4048, 0x00},
11105de35c9bSChiranjeevi Rapolu 	{0x4049, 0x7A},
11115de35c9bSChiranjeevi Rapolu 	{0x4307, 0x30},
11125de35c9bSChiranjeevi Rapolu 	{0x4500, 0x58},
11135de35c9bSChiranjeevi Rapolu 	{0x4501, 0x04},
11145de35c9bSChiranjeevi Rapolu 	{0x4502, 0x40},
11155de35c9bSChiranjeevi Rapolu 	{0x4503, 0x10},
11165de35c9bSChiranjeevi Rapolu 	{0x4508, 0xaa},
11175de35c9bSChiranjeevi Rapolu 	{0x4509, 0xaa},
11185de35c9bSChiranjeevi Rapolu 	{0x450a, 0x00},
11195de35c9bSChiranjeevi Rapolu 	{0x450b, 0x00},
11205de35c9bSChiranjeevi Rapolu 	{0x4600, 0x01},
11215de35c9bSChiranjeevi Rapolu 	{0x4601, 0x00},
11225de35c9bSChiranjeevi Rapolu 	{0x4700, 0xa4},
11235de35c9bSChiranjeevi Rapolu 	{0x4800, 0x4c},
11245de35c9bSChiranjeevi Rapolu 	{0x4816, 0x53},
11255de35c9bSChiranjeevi Rapolu 	{0x481f, 0x40},
11265de35c9bSChiranjeevi Rapolu 	{0x4837, 0x13},
11275de35c9bSChiranjeevi Rapolu 	{0x5000, 0x56},
11285de35c9bSChiranjeevi Rapolu 	{0x5001, 0x01},
11295de35c9bSChiranjeevi Rapolu 	{0x5002, 0x28},
11305de35c9bSChiranjeevi Rapolu 	{0x5004, 0x0c},
11315de35c9bSChiranjeevi Rapolu 	{0x5006, 0x0c},
11325de35c9bSChiranjeevi Rapolu 	{0x5007, 0xe0},
11335de35c9bSChiranjeevi Rapolu 	{0x5008, 0x01},
11345de35c9bSChiranjeevi Rapolu 	{0x5009, 0xb0},
11355de35c9bSChiranjeevi Rapolu 	{0x5901, 0x00},
11365de35c9bSChiranjeevi Rapolu 	{0x5a01, 0x00},
11375de35c9bSChiranjeevi Rapolu 	{0x5a03, 0x00},
11385de35c9bSChiranjeevi Rapolu 	{0x5a04, 0x0c},
11395de35c9bSChiranjeevi Rapolu 	{0x5a05, 0xe0},
11405de35c9bSChiranjeevi Rapolu 	{0x5a06, 0x09},
11415de35c9bSChiranjeevi Rapolu 	{0x5a07, 0xb0},
11425de35c9bSChiranjeevi Rapolu 	{0x5a08, 0x06},
11435de35c9bSChiranjeevi Rapolu 	{0x5e00, 0x00},
11445de35c9bSChiranjeevi Rapolu 	{0x3734, 0x40},
11455de35c9bSChiranjeevi Rapolu 	{0x5b00, 0x01},
11465de35c9bSChiranjeevi Rapolu 	{0x5b01, 0x10},
11475de35c9bSChiranjeevi Rapolu 	{0x5b02, 0x01},
11485de35c9bSChiranjeevi Rapolu 	{0x5b03, 0xdb},
11495de35c9bSChiranjeevi Rapolu 	{0x3d8c, 0x71},
11505de35c9bSChiranjeevi Rapolu 	{0x3d8d, 0xea},
11515de35c9bSChiranjeevi Rapolu 	{0x4017, 0x08},
11525de35c9bSChiranjeevi Rapolu 	{0x3618, 0x2a},
11535de35c9bSChiranjeevi Rapolu 	{0x5780, 0x3e},
11545de35c9bSChiranjeevi Rapolu 	{0x5781, 0x0f},
11555de35c9bSChiranjeevi Rapolu 	{0x5782, 0x44},
11565de35c9bSChiranjeevi Rapolu 	{0x5783, 0x02},
11575de35c9bSChiranjeevi Rapolu 	{0x5784, 0x01},
11585de35c9bSChiranjeevi Rapolu 	{0x5785, 0x01},
11595de35c9bSChiranjeevi Rapolu 	{0x5786, 0x00},
11605de35c9bSChiranjeevi Rapolu 	{0x5787, 0x04},
11615de35c9bSChiranjeevi Rapolu 	{0x5788, 0x02},
11625de35c9bSChiranjeevi Rapolu 	{0x5789, 0x0f},
11635de35c9bSChiranjeevi Rapolu 	{0x578a, 0xfd},
11645de35c9bSChiranjeevi Rapolu 	{0x578b, 0xf5},
11655de35c9bSChiranjeevi Rapolu 	{0x578c, 0xf5},
11665de35c9bSChiranjeevi Rapolu 	{0x578d, 0x03},
11675de35c9bSChiranjeevi Rapolu 	{0x578e, 0x08},
11685de35c9bSChiranjeevi Rapolu 	{0x578f, 0x0c},
11695de35c9bSChiranjeevi Rapolu 	{0x5790, 0x08},
11705de35c9bSChiranjeevi Rapolu 	{0x5791, 0x06},
11715de35c9bSChiranjeevi Rapolu 	{0x5792, 0x00},
11725de35c9bSChiranjeevi Rapolu 	{0x5793, 0x52},
11735de35c9bSChiranjeevi Rapolu 	{0x5794, 0xa3}
11745de35c9bSChiranjeevi Rapolu };
11755de35c9bSChiranjeevi Rapolu 
11765de35c9bSChiranjeevi Rapolu static const struct ov5670_reg mode_1280x720_regs[] = {
11775de35c9bSChiranjeevi Rapolu 	{0x3000, 0x00},
11785de35c9bSChiranjeevi Rapolu 	{0x3002, 0x21},
11795de35c9bSChiranjeevi Rapolu 	{0x3005, 0xf0},
11805de35c9bSChiranjeevi Rapolu 	{0x3007, 0x00},
11815de35c9bSChiranjeevi Rapolu 	{0x3015, 0x0f},
11825de35c9bSChiranjeevi Rapolu 	{0x3018, 0x32},
11835de35c9bSChiranjeevi Rapolu 	{0x301a, 0xf0},
11845de35c9bSChiranjeevi Rapolu 	{0x301b, 0xf0},
11855de35c9bSChiranjeevi Rapolu 	{0x301c, 0xf0},
11865de35c9bSChiranjeevi Rapolu 	{0x301d, 0xf0},
11875de35c9bSChiranjeevi Rapolu 	{0x301e, 0xf0},
11885de35c9bSChiranjeevi Rapolu 	{0x3030, 0x00},
11895de35c9bSChiranjeevi Rapolu 	{0x3031, 0x0a},
11905de35c9bSChiranjeevi Rapolu 	{0x303c, 0xff},
11915de35c9bSChiranjeevi Rapolu 	{0x303e, 0xff},
11925de35c9bSChiranjeevi Rapolu 	{0x3040, 0xf0},
11935de35c9bSChiranjeevi Rapolu 	{0x3041, 0x00},
11945de35c9bSChiranjeevi Rapolu 	{0x3042, 0xf0},
11955de35c9bSChiranjeevi Rapolu 	{0x3106, 0x11},
11965de35c9bSChiranjeevi Rapolu 	{0x3500, 0x00},
11975de35c9bSChiranjeevi Rapolu 	{0x3501, 0x80},
11985de35c9bSChiranjeevi Rapolu 	{0x3502, 0x00},
11995de35c9bSChiranjeevi Rapolu 	{0x3503, 0x04},
12005de35c9bSChiranjeevi Rapolu 	{0x3504, 0x03},
12015de35c9bSChiranjeevi Rapolu 	{0x3505, 0x83},
12025de35c9bSChiranjeevi Rapolu 	{0x3508, 0x04},
12035de35c9bSChiranjeevi Rapolu 	{0x3509, 0x00},
12045de35c9bSChiranjeevi Rapolu 	{0x350e, 0x04},
12055de35c9bSChiranjeevi Rapolu 	{0x350f, 0x00},
12065de35c9bSChiranjeevi Rapolu 	{0x3510, 0x00},
12075de35c9bSChiranjeevi Rapolu 	{0x3511, 0x02},
12085de35c9bSChiranjeevi Rapolu 	{0x3512, 0x00},
12095de35c9bSChiranjeevi Rapolu 	{0x3601, 0xc8},
12105de35c9bSChiranjeevi Rapolu 	{0x3610, 0x88},
12115de35c9bSChiranjeevi Rapolu 	{0x3612, 0x48},
12125de35c9bSChiranjeevi Rapolu 	{0x3614, 0x5b},
12135de35c9bSChiranjeevi Rapolu 	{0x3615, 0x96},
12145de35c9bSChiranjeevi Rapolu 	{0x3621, 0xd0},
12155de35c9bSChiranjeevi Rapolu 	{0x3622, 0x00},
12165de35c9bSChiranjeevi Rapolu 	{0x3623, 0x00},
12175de35c9bSChiranjeevi Rapolu 	{0x3633, 0x13},
12185de35c9bSChiranjeevi Rapolu 	{0x3634, 0x13},
12195de35c9bSChiranjeevi Rapolu 	{0x3635, 0x13},
12205de35c9bSChiranjeevi Rapolu 	{0x3636, 0x13},
12215de35c9bSChiranjeevi Rapolu 	{0x3645, 0x13},
12225de35c9bSChiranjeevi Rapolu 	{0x3646, 0x82},
12235de35c9bSChiranjeevi Rapolu 	{0x3650, 0x00},
12245de35c9bSChiranjeevi Rapolu 	{0x3652, 0xff},
12255de35c9bSChiranjeevi Rapolu 	{0x3655, 0x20},
12265de35c9bSChiranjeevi Rapolu 	{0x3656, 0xff},
12275de35c9bSChiranjeevi Rapolu 	{0x365a, 0xff},
12285de35c9bSChiranjeevi Rapolu 	{0x365e, 0xff},
12295de35c9bSChiranjeevi Rapolu 	{0x3668, 0x00},
12305de35c9bSChiranjeevi Rapolu 	{0x366a, 0x07},
12315de35c9bSChiranjeevi Rapolu 	{0x366e, 0x08},
12325de35c9bSChiranjeevi Rapolu 	{0x366d, 0x00},
12335de35c9bSChiranjeevi Rapolu 	{0x366f, 0x80},
12345de35c9bSChiranjeevi Rapolu 	{0x3700, 0x28},
12355de35c9bSChiranjeevi Rapolu 	{0x3701, 0x10},
12365de35c9bSChiranjeevi Rapolu 	{0x3702, 0x3a},
12375de35c9bSChiranjeevi Rapolu 	{0x3703, 0x19},
12385de35c9bSChiranjeevi Rapolu 	{0x3704, 0x10},
12395de35c9bSChiranjeevi Rapolu 	{0x3705, 0x00},
12405de35c9bSChiranjeevi Rapolu 	{0x3706, 0x66},
12415de35c9bSChiranjeevi Rapolu 	{0x3707, 0x08},
12425de35c9bSChiranjeevi Rapolu 	{0x3708, 0x34},
12435de35c9bSChiranjeevi Rapolu 	{0x3709, 0x40},
12445de35c9bSChiranjeevi Rapolu 	{0x370a, 0x01},
12455de35c9bSChiranjeevi Rapolu 	{0x370b, 0x1b},
12465de35c9bSChiranjeevi Rapolu 	{0x3714, 0x24},
12475de35c9bSChiranjeevi Rapolu 	{0x371a, 0x3e},
12485de35c9bSChiranjeevi Rapolu 	{0x3733, 0x00},
12495de35c9bSChiranjeevi Rapolu 	{0x3734, 0x00},
12505de35c9bSChiranjeevi Rapolu 	{0x373a, 0x05},
12515de35c9bSChiranjeevi Rapolu 	{0x373b, 0x06},
12525de35c9bSChiranjeevi Rapolu 	{0x373c, 0x0a},
12535de35c9bSChiranjeevi Rapolu 	{0x373f, 0xa0},
12545de35c9bSChiranjeevi Rapolu 	{0x3755, 0x00},
12555de35c9bSChiranjeevi Rapolu 	{0x3758, 0x00},
12565de35c9bSChiranjeevi Rapolu 	{0x375b, 0x0e},
12575de35c9bSChiranjeevi Rapolu 	{0x3766, 0x5f},
12585de35c9bSChiranjeevi Rapolu 	{0x3768, 0x00},
12595de35c9bSChiranjeevi Rapolu 	{0x3769, 0x22},
12605de35c9bSChiranjeevi Rapolu 	{0x3773, 0x08},
12615de35c9bSChiranjeevi Rapolu 	{0x3774, 0x1f},
12625de35c9bSChiranjeevi Rapolu 	{0x3776, 0x06},
12635de35c9bSChiranjeevi Rapolu 	{0x37a0, 0x88},
12645de35c9bSChiranjeevi Rapolu 	{0x37a1, 0x5c},
12655de35c9bSChiranjeevi Rapolu 	{0x37a7, 0x88},
12665de35c9bSChiranjeevi Rapolu 	{0x37a8, 0x70},
12675de35c9bSChiranjeevi Rapolu 	{0x37aa, 0x88},
12685de35c9bSChiranjeevi Rapolu 	{0x37ab, 0x48},
12695de35c9bSChiranjeevi Rapolu 	{0x37b3, 0x66},
12705de35c9bSChiranjeevi Rapolu 	{0x37c2, 0x04},
12715de35c9bSChiranjeevi Rapolu 	{0x37c5, 0x00},
12725de35c9bSChiranjeevi Rapolu 	{0x37c8, 0x00},
12735de35c9bSChiranjeevi Rapolu 	{0x3800, 0x00},
12745de35c9bSChiranjeevi Rapolu 	{0x3801, 0x0c},
12755de35c9bSChiranjeevi Rapolu 	{0x3802, 0x00},
12765de35c9bSChiranjeevi Rapolu 	{0x3803, 0x04},
12775de35c9bSChiranjeevi Rapolu 	{0x3804, 0x0a},
12785de35c9bSChiranjeevi Rapolu 	{0x3805, 0x33},
12795de35c9bSChiranjeevi Rapolu 	{0x3806, 0x07},
12805de35c9bSChiranjeevi Rapolu 	{0x3807, 0xa3},
12815de35c9bSChiranjeevi Rapolu 	{0x3808, 0x05},
12825de35c9bSChiranjeevi Rapolu 	{0x3809, 0x00},
12835de35c9bSChiranjeevi Rapolu 	{0x380a, 0x02},
12845de35c9bSChiranjeevi Rapolu 	{0x380b, 0xd0},
12855de35c9bSChiranjeevi Rapolu 	{0x380c, 0x06},
12865de35c9bSChiranjeevi Rapolu 	{0x380d, 0x90},
12875de35c9bSChiranjeevi Rapolu 	{0x380e, 0x08},
12885de35c9bSChiranjeevi Rapolu 	{0x380f, 0x08},
12895de35c9bSChiranjeevi Rapolu 	{0x3811, 0x04},
12905de35c9bSChiranjeevi Rapolu 	{0x3813, 0x02},
12915de35c9bSChiranjeevi Rapolu 	{0x3814, 0x03},
12925de35c9bSChiranjeevi Rapolu 	{0x3815, 0x01},
12935de35c9bSChiranjeevi Rapolu 	{0x3816, 0x00},
12945de35c9bSChiranjeevi Rapolu 	{0x3817, 0x00},
12955de35c9bSChiranjeevi Rapolu 	{0x3818, 0x00},
12965de35c9bSChiranjeevi Rapolu 	{0x3819, 0x00},
12975de35c9bSChiranjeevi Rapolu 	{0x3820, 0x94},
12985de35c9bSChiranjeevi Rapolu 	{0x3821, 0x47},
12995de35c9bSChiranjeevi Rapolu 	{0x3822, 0x48},
13005de35c9bSChiranjeevi Rapolu 	{0x3826, 0x00},
13015de35c9bSChiranjeevi Rapolu 	{0x3827, 0x08},
13025de35c9bSChiranjeevi Rapolu 	{0x382a, 0x03},
13035de35c9bSChiranjeevi Rapolu 	{0x382b, 0x01},
13045de35c9bSChiranjeevi Rapolu 	{0x3830, 0x08},
13055de35c9bSChiranjeevi Rapolu 	{0x3836, 0x02},
13065de35c9bSChiranjeevi Rapolu 	{0x3837, 0x00},
13075de35c9bSChiranjeevi Rapolu 	{0x3838, 0x10},
13085de35c9bSChiranjeevi Rapolu 	{0x3841, 0xff},
13095de35c9bSChiranjeevi Rapolu 	{0x3846, 0x48},
13105de35c9bSChiranjeevi Rapolu 	{0x3861, 0x00},
13115de35c9bSChiranjeevi Rapolu 	{0x3862, 0x04},
13125de35c9bSChiranjeevi Rapolu 	{0x3863, 0x06},
13135de35c9bSChiranjeevi Rapolu 	{0x3a11, 0x01},
13145de35c9bSChiranjeevi Rapolu 	{0x3a12, 0x78},
13155de35c9bSChiranjeevi Rapolu 	{0x3b00, 0x00},
13165de35c9bSChiranjeevi Rapolu 	{0x3b02, 0x00},
13175de35c9bSChiranjeevi Rapolu 	{0x3b03, 0x00},
13185de35c9bSChiranjeevi Rapolu 	{0x3b04, 0x00},
13195de35c9bSChiranjeevi Rapolu 	{0x3b05, 0x00},
13205de35c9bSChiranjeevi Rapolu 	{0x3c00, 0x89},
13215de35c9bSChiranjeevi Rapolu 	{0x3c01, 0xab},
13225de35c9bSChiranjeevi Rapolu 	{0x3c02, 0x01},
13235de35c9bSChiranjeevi Rapolu 	{0x3c03, 0x00},
13245de35c9bSChiranjeevi Rapolu 	{0x3c04, 0x00},
13255de35c9bSChiranjeevi Rapolu 	{0x3c05, 0x03},
13265de35c9bSChiranjeevi Rapolu 	{0x3c06, 0x00},
13275de35c9bSChiranjeevi Rapolu 	{0x3c07, 0x05},
13285de35c9bSChiranjeevi Rapolu 	{0x3c0c, 0x00},
13295de35c9bSChiranjeevi Rapolu 	{0x3c0d, 0x00},
13305de35c9bSChiranjeevi Rapolu 	{0x3c0e, 0x00},
13315de35c9bSChiranjeevi Rapolu 	{0x3c0f, 0x00},
13325de35c9bSChiranjeevi Rapolu 	{0x3c40, 0x00},
13335de35c9bSChiranjeevi Rapolu 	{0x3c41, 0xa3},
13345de35c9bSChiranjeevi Rapolu 	{0x3c43, 0x7d},
13355de35c9bSChiranjeevi Rapolu 	{0x3c45, 0xd7},
13365de35c9bSChiranjeevi Rapolu 	{0x3c47, 0xfc},
13375de35c9bSChiranjeevi Rapolu 	{0x3c50, 0x05},
13385de35c9bSChiranjeevi Rapolu 	{0x3c52, 0xaa},
13395de35c9bSChiranjeevi Rapolu 	{0x3c54, 0x71},
13405de35c9bSChiranjeevi Rapolu 	{0x3c56, 0x80},
13415de35c9bSChiranjeevi Rapolu 	{0x3d85, 0x17},
13425de35c9bSChiranjeevi Rapolu 	{0x3f03, 0x00},
13435de35c9bSChiranjeevi Rapolu 	{0x3f0a, 0x00},
13445de35c9bSChiranjeevi Rapolu 	{0x3f0b, 0x00},
13455de35c9bSChiranjeevi Rapolu 	{0x4001, 0x60},
13465de35c9bSChiranjeevi Rapolu 	{0x4009, 0x05},
13475de35c9bSChiranjeevi Rapolu 	{0x4020, 0x00},
13485de35c9bSChiranjeevi Rapolu 	{0x4021, 0x00},
13495de35c9bSChiranjeevi Rapolu 	{0x4022, 0x00},
13505de35c9bSChiranjeevi Rapolu 	{0x4023, 0x00},
13515de35c9bSChiranjeevi Rapolu 	{0x4024, 0x00},
13525de35c9bSChiranjeevi Rapolu 	{0x4025, 0x00},
13535de35c9bSChiranjeevi Rapolu 	{0x4026, 0x00},
13545de35c9bSChiranjeevi Rapolu 	{0x4027, 0x00},
13555de35c9bSChiranjeevi Rapolu 	{0x4028, 0x00},
13565de35c9bSChiranjeevi Rapolu 	{0x4029, 0x00},
13575de35c9bSChiranjeevi Rapolu 	{0x402a, 0x00},
13585de35c9bSChiranjeevi Rapolu 	{0x402b, 0x00},
13595de35c9bSChiranjeevi Rapolu 	{0x402c, 0x00},
13605de35c9bSChiranjeevi Rapolu 	{0x402d, 0x00},
13615de35c9bSChiranjeevi Rapolu 	{0x402e, 0x00},
13625de35c9bSChiranjeevi Rapolu 	{0x402f, 0x00},
13635de35c9bSChiranjeevi Rapolu 	{0x4040, 0x00},
13645de35c9bSChiranjeevi Rapolu 	{0x4041, 0x03},
13655de35c9bSChiranjeevi Rapolu 	{0x4042, 0x00},
13665de35c9bSChiranjeevi Rapolu 	{0x4043, 0x7A},
13675de35c9bSChiranjeevi Rapolu 	{0x4044, 0x00},
13685de35c9bSChiranjeevi Rapolu 	{0x4045, 0x7A},
13695de35c9bSChiranjeevi Rapolu 	{0x4046, 0x00},
13705de35c9bSChiranjeevi Rapolu 	{0x4047, 0x7A},
13715de35c9bSChiranjeevi Rapolu 	{0x4048, 0x00},
13725de35c9bSChiranjeevi Rapolu 	{0x4049, 0x7A},
13735de35c9bSChiranjeevi Rapolu 	{0x4307, 0x30},
13745de35c9bSChiranjeevi Rapolu 	{0x4500, 0x58},
13755de35c9bSChiranjeevi Rapolu 	{0x4501, 0x04},
13765de35c9bSChiranjeevi Rapolu 	{0x4502, 0x48},
13775de35c9bSChiranjeevi Rapolu 	{0x4503, 0x10},
13785de35c9bSChiranjeevi Rapolu 	{0x4508, 0x55},
13795de35c9bSChiranjeevi Rapolu 	{0x4509, 0x55},
13805de35c9bSChiranjeevi Rapolu 	{0x450a, 0x00},
13815de35c9bSChiranjeevi Rapolu 	{0x450b, 0x00},
13825de35c9bSChiranjeevi Rapolu 	{0x4600, 0x00},
13835de35c9bSChiranjeevi Rapolu 	{0x4601, 0x80},
13845de35c9bSChiranjeevi Rapolu 	{0x4700, 0xa4},
13855de35c9bSChiranjeevi Rapolu 	{0x4800, 0x4c},
13865de35c9bSChiranjeevi Rapolu 	{0x4816, 0x53},
13875de35c9bSChiranjeevi Rapolu 	{0x481f, 0x40},
13885de35c9bSChiranjeevi Rapolu 	{0x4837, 0x13},
13895de35c9bSChiranjeevi Rapolu 	{0x5000, 0x56},
13905de35c9bSChiranjeevi Rapolu 	{0x5001, 0x01},
13915de35c9bSChiranjeevi Rapolu 	{0x5002, 0x28},
13925de35c9bSChiranjeevi Rapolu 	{0x5004, 0x0c},
13935de35c9bSChiranjeevi Rapolu 	{0x5006, 0x0c},
13945de35c9bSChiranjeevi Rapolu 	{0x5007, 0xe0},
13955de35c9bSChiranjeevi Rapolu 	{0x5008, 0x01},
13965de35c9bSChiranjeevi Rapolu 	{0x5009, 0xb0},
13975de35c9bSChiranjeevi Rapolu 	{0x5901, 0x00},
13985de35c9bSChiranjeevi Rapolu 	{0x5a01, 0x00},
13995de35c9bSChiranjeevi Rapolu 	{0x5a03, 0x00},
14005de35c9bSChiranjeevi Rapolu 	{0x5a04, 0x0c},
14015de35c9bSChiranjeevi Rapolu 	{0x5a05, 0xe0},
14025de35c9bSChiranjeevi Rapolu 	{0x5a06, 0x09},
14035de35c9bSChiranjeevi Rapolu 	{0x5a07, 0xb0},
14045de35c9bSChiranjeevi Rapolu 	{0x5a08, 0x06},
14055de35c9bSChiranjeevi Rapolu 	{0x5e00, 0x00},
14065de35c9bSChiranjeevi Rapolu 	{0x3734, 0x40},
14075de35c9bSChiranjeevi Rapolu 	{0x5b00, 0x01},
14085de35c9bSChiranjeevi Rapolu 	{0x5b01, 0x10},
14095de35c9bSChiranjeevi Rapolu 	{0x5b02, 0x01},
14105de35c9bSChiranjeevi Rapolu 	{0x5b03, 0xdb},
14115de35c9bSChiranjeevi Rapolu 	{0x3d8c, 0x71},
14125de35c9bSChiranjeevi Rapolu 	{0x3d8d, 0xea},
14135de35c9bSChiranjeevi Rapolu 	{0x4017, 0x10},
14145de35c9bSChiranjeevi Rapolu 	{0x3618, 0x2a},
14155de35c9bSChiranjeevi Rapolu 	{0x5780, 0x3e},
14165de35c9bSChiranjeevi Rapolu 	{0x5781, 0x0f},
14175de35c9bSChiranjeevi Rapolu 	{0x5782, 0x44},
14185de35c9bSChiranjeevi Rapolu 	{0x5783, 0x02},
14195de35c9bSChiranjeevi Rapolu 	{0x5784, 0x01},
14205de35c9bSChiranjeevi Rapolu 	{0x5785, 0x01},
14215de35c9bSChiranjeevi Rapolu 	{0x5786, 0x00},
14225de35c9bSChiranjeevi Rapolu 	{0x5787, 0x04},
14235de35c9bSChiranjeevi Rapolu 	{0x5788, 0x02},
14245de35c9bSChiranjeevi Rapolu 	{0x5789, 0x0f},
14255de35c9bSChiranjeevi Rapolu 	{0x578a, 0xfd},
14265de35c9bSChiranjeevi Rapolu 	{0x578b, 0xf5},
14275de35c9bSChiranjeevi Rapolu 	{0x578c, 0xf5},
14285de35c9bSChiranjeevi Rapolu 	{0x578d, 0x03},
14295de35c9bSChiranjeevi Rapolu 	{0x578e, 0x08},
14305de35c9bSChiranjeevi Rapolu 	{0x578f, 0x0c},
14315de35c9bSChiranjeevi Rapolu 	{0x5790, 0x08},
14325de35c9bSChiranjeevi Rapolu 	{0x5791, 0x06},
14335de35c9bSChiranjeevi Rapolu 	{0x5792, 0x00},
14345de35c9bSChiranjeevi Rapolu 	{0x5793, 0x52},
14355de35c9bSChiranjeevi Rapolu 	{0x5794, 0xa3},
14365de35c9bSChiranjeevi Rapolu 	{0x3503, 0x00}
14375de35c9bSChiranjeevi Rapolu };
14385de35c9bSChiranjeevi Rapolu 
14395de35c9bSChiranjeevi Rapolu static const struct ov5670_reg mode_640x360_regs[] = {
14405de35c9bSChiranjeevi Rapolu 	{0x3000, 0x00},
14415de35c9bSChiranjeevi Rapolu 	{0x3002, 0x21},
14425de35c9bSChiranjeevi Rapolu 	{0x3005, 0xf0},
14435de35c9bSChiranjeevi Rapolu 	{0x3007, 0x00},
14445de35c9bSChiranjeevi Rapolu 	{0x3015, 0x0f},
14455de35c9bSChiranjeevi Rapolu 	{0x3018, 0x32},
14465de35c9bSChiranjeevi Rapolu 	{0x301a, 0xf0},
14475de35c9bSChiranjeevi Rapolu 	{0x301b, 0xf0},
14485de35c9bSChiranjeevi Rapolu 	{0x301c, 0xf0},
14495de35c9bSChiranjeevi Rapolu 	{0x301d, 0xf0},
14505de35c9bSChiranjeevi Rapolu 	{0x301e, 0xf0},
14515de35c9bSChiranjeevi Rapolu 	{0x3030, 0x00},
14525de35c9bSChiranjeevi Rapolu 	{0x3031, 0x0a},
14535de35c9bSChiranjeevi Rapolu 	{0x303c, 0xff},
14545de35c9bSChiranjeevi Rapolu 	{0x303e, 0xff},
14555de35c9bSChiranjeevi Rapolu 	{0x3040, 0xf0},
14565de35c9bSChiranjeevi Rapolu 	{0x3041, 0x00},
14575de35c9bSChiranjeevi Rapolu 	{0x3042, 0xf0},
14585de35c9bSChiranjeevi Rapolu 	{0x3106, 0x11},
14595de35c9bSChiranjeevi Rapolu 	{0x3500, 0x00},
14605de35c9bSChiranjeevi Rapolu 	{0x3501, 0x80},
14615de35c9bSChiranjeevi Rapolu 	{0x3502, 0x00},
14625de35c9bSChiranjeevi Rapolu 	{0x3503, 0x04},
14635de35c9bSChiranjeevi Rapolu 	{0x3504, 0x03},
14645de35c9bSChiranjeevi Rapolu 	{0x3505, 0x83},
14655de35c9bSChiranjeevi Rapolu 	{0x3508, 0x04},
14665de35c9bSChiranjeevi Rapolu 	{0x3509, 0x00},
14675de35c9bSChiranjeevi Rapolu 	{0x350e, 0x04},
14685de35c9bSChiranjeevi Rapolu 	{0x350f, 0x00},
14695de35c9bSChiranjeevi Rapolu 	{0x3510, 0x00},
14705de35c9bSChiranjeevi Rapolu 	{0x3511, 0x02},
14715de35c9bSChiranjeevi Rapolu 	{0x3512, 0x00},
14725de35c9bSChiranjeevi Rapolu 	{0x3601, 0xc8},
14735de35c9bSChiranjeevi Rapolu 	{0x3610, 0x88},
14745de35c9bSChiranjeevi Rapolu 	{0x3612, 0x48},
14755de35c9bSChiranjeevi Rapolu 	{0x3614, 0x5b},
14765de35c9bSChiranjeevi Rapolu 	{0x3615, 0x96},
14775de35c9bSChiranjeevi Rapolu 	{0x3621, 0xd0},
14785de35c9bSChiranjeevi Rapolu 	{0x3622, 0x00},
14795de35c9bSChiranjeevi Rapolu 	{0x3623, 0x04},
14805de35c9bSChiranjeevi Rapolu 	{0x3633, 0x13},
14815de35c9bSChiranjeevi Rapolu 	{0x3634, 0x13},
14825de35c9bSChiranjeevi Rapolu 	{0x3635, 0x13},
14835de35c9bSChiranjeevi Rapolu 	{0x3636, 0x13},
14845de35c9bSChiranjeevi Rapolu 	{0x3645, 0x13},
14855de35c9bSChiranjeevi Rapolu 	{0x3646, 0x82},
14865de35c9bSChiranjeevi Rapolu 	{0x3650, 0x00},
14875de35c9bSChiranjeevi Rapolu 	{0x3652, 0xff},
14885de35c9bSChiranjeevi Rapolu 	{0x3655, 0x20},
14895de35c9bSChiranjeevi Rapolu 	{0x3656, 0xff},
14905de35c9bSChiranjeevi Rapolu 	{0x365a, 0xff},
14915de35c9bSChiranjeevi Rapolu 	{0x365e, 0xff},
14925de35c9bSChiranjeevi Rapolu 	{0x3668, 0x00},
14935de35c9bSChiranjeevi Rapolu 	{0x366a, 0x07},
14945de35c9bSChiranjeevi Rapolu 	{0x366e, 0x08},
14955de35c9bSChiranjeevi Rapolu 	{0x366d, 0x00},
14965de35c9bSChiranjeevi Rapolu 	{0x366f, 0x80},
14975de35c9bSChiranjeevi Rapolu 	{0x3700, 0x28},
14985de35c9bSChiranjeevi Rapolu 	{0x3701, 0x10},
14995de35c9bSChiranjeevi Rapolu 	{0x3702, 0x3a},
15005de35c9bSChiranjeevi Rapolu 	{0x3703, 0x19},
15015de35c9bSChiranjeevi Rapolu 	{0x3704, 0x10},
15025de35c9bSChiranjeevi Rapolu 	{0x3705, 0x00},
15035de35c9bSChiranjeevi Rapolu 	{0x3706, 0x66},
15045de35c9bSChiranjeevi Rapolu 	{0x3707, 0x08},
15055de35c9bSChiranjeevi Rapolu 	{0x3708, 0x34},
15065de35c9bSChiranjeevi Rapolu 	{0x3709, 0x40},
15075de35c9bSChiranjeevi Rapolu 	{0x370a, 0x01},
15085de35c9bSChiranjeevi Rapolu 	{0x370b, 0x1b},
15095de35c9bSChiranjeevi Rapolu 	{0x3714, 0x24},
15105de35c9bSChiranjeevi Rapolu 	{0x371a, 0x3e},
15115de35c9bSChiranjeevi Rapolu 	{0x3733, 0x00},
15125de35c9bSChiranjeevi Rapolu 	{0x3734, 0x00},
15135de35c9bSChiranjeevi Rapolu 	{0x373a, 0x05},
15145de35c9bSChiranjeevi Rapolu 	{0x373b, 0x06},
15155de35c9bSChiranjeevi Rapolu 	{0x373c, 0x0a},
15165de35c9bSChiranjeevi Rapolu 	{0x373f, 0xa0},
15175de35c9bSChiranjeevi Rapolu 	{0x3755, 0x00},
15185de35c9bSChiranjeevi Rapolu 	{0x3758, 0x00},
15195de35c9bSChiranjeevi Rapolu 	{0x375b, 0x0e},
15205de35c9bSChiranjeevi Rapolu 	{0x3766, 0x5f},
15215de35c9bSChiranjeevi Rapolu 	{0x3768, 0x00},
15225de35c9bSChiranjeevi Rapolu 	{0x3769, 0x22},
15235de35c9bSChiranjeevi Rapolu 	{0x3773, 0x08},
15245de35c9bSChiranjeevi Rapolu 	{0x3774, 0x1f},
15255de35c9bSChiranjeevi Rapolu 	{0x3776, 0x06},
15265de35c9bSChiranjeevi Rapolu 	{0x37a0, 0x88},
15275de35c9bSChiranjeevi Rapolu 	{0x37a1, 0x5c},
15285de35c9bSChiranjeevi Rapolu 	{0x37a7, 0x88},
15295de35c9bSChiranjeevi Rapolu 	{0x37a8, 0x70},
15305de35c9bSChiranjeevi Rapolu 	{0x37aa, 0x88},
15315de35c9bSChiranjeevi Rapolu 	{0x37ab, 0x48},
15325de35c9bSChiranjeevi Rapolu 	{0x37b3, 0x66},
15335de35c9bSChiranjeevi Rapolu 	{0x37c2, 0x04},
15345de35c9bSChiranjeevi Rapolu 	{0x37c5, 0x00},
15355de35c9bSChiranjeevi Rapolu 	{0x37c8, 0x00},
15365de35c9bSChiranjeevi Rapolu 	{0x3800, 0x00},
15375de35c9bSChiranjeevi Rapolu 	{0x3801, 0x0c},
15385de35c9bSChiranjeevi Rapolu 	{0x3802, 0x00},
15395de35c9bSChiranjeevi Rapolu 	{0x3803, 0x04},
15405de35c9bSChiranjeevi Rapolu 	{0x3804, 0x0a},
15415de35c9bSChiranjeevi Rapolu 	{0x3805, 0x33},
15425de35c9bSChiranjeevi Rapolu 	{0x3806, 0x07},
15435de35c9bSChiranjeevi Rapolu 	{0x3807, 0xa3},
15445de35c9bSChiranjeevi Rapolu 	{0x3808, 0x02},
15455de35c9bSChiranjeevi Rapolu 	{0x3809, 0x80},
15465de35c9bSChiranjeevi Rapolu 	{0x380a, 0x01},
15475de35c9bSChiranjeevi Rapolu 	{0x380b, 0x68},
15485de35c9bSChiranjeevi Rapolu 	{0x380c, 0x06},
15495de35c9bSChiranjeevi Rapolu 	{0x380d, 0x90},
15505de35c9bSChiranjeevi Rapolu 	{0x380e, 0x08},
15515de35c9bSChiranjeevi Rapolu 	{0x380f, 0x08},
15525de35c9bSChiranjeevi Rapolu 	{0x3811, 0x04},
15535de35c9bSChiranjeevi Rapolu 	{0x3813, 0x02},
15545de35c9bSChiranjeevi Rapolu 	{0x3814, 0x07},
15555de35c9bSChiranjeevi Rapolu 	{0x3815, 0x01},
15565de35c9bSChiranjeevi Rapolu 	{0x3816, 0x00},
15575de35c9bSChiranjeevi Rapolu 	{0x3817, 0x00},
15585de35c9bSChiranjeevi Rapolu 	{0x3818, 0x00},
15595de35c9bSChiranjeevi Rapolu 	{0x3819, 0x00},
15605de35c9bSChiranjeevi Rapolu 	{0x3820, 0x94},
15615de35c9bSChiranjeevi Rapolu 	{0x3821, 0xc6},
15625de35c9bSChiranjeevi Rapolu 	{0x3822, 0x48},
15635de35c9bSChiranjeevi Rapolu 	{0x3826, 0x00},
15645de35c9bSChiranjeevi Rapolu 	{0x3827, 0x08},
15655de35c9bSChiranjeevi Rapolu 	{0x382a, 0x07},
15665de35c9bSChiranjeevi Rapolu 	{0x382b, 0x01},
15675de35c9bSChiranjeevi Rapolu 	{0x3830, 0x08},
15685de35c9bSChiranjeevi Rapolu 	{0x3836, 0x02},
15695de35c9bSChiranjeevi Rapolu 	{0x3837, 0x00},
15705de35c9bSChiranjeevi Rapolu 	{0x3838, 0x10},
15715de35c9bSChiranjeevi Rapolu 	{0x3841, 0xff},
15725de35c9bSChiranjeevi Rapolu 	{0x3846, 0x48},
15735de35c9bSChiranjeevi Rapolu 	{0x3861, 0x00},
15745de35c9bSChiranjeevi Rapolu 	{0x3862, 0x04},
15755de35c9bSChiranjeevi Rapolu 	{0x3863, 0x06},
15765de35c9bSChiranjeevi Rapolu 	{0x3a11, 0x01},
15775de35c9bSChiranjeevi Rapolu 	{0x3a12, 0x78},
15785de35c9bSChiranjeevi Rapolu 	{0x3b00, 0x00},
15795de35c9bSChiranjeevi Rapolu 	{0x3b02, 0x00},
15805de35c9bSChiranjeevi Rapolu 	{0x3b03, 0x00},
15815de35c9bSChiranjeevi Rapolu 	{0x3b04, 0x00},
15825de35c9bSChiranjeevi Rapolu 	{0x3b05, 0x00},
15835de35c9bSChiranjeevi Rapolu 	{0x3c00, 0x89},
15845de35c9bSChiranjeevi Rapolu 	{0x3c01, 0xab},
15855de35c9bSChiranjeevi Rapolu 	{0x3c02, 0x01},
15865de35c9bSChiranjeevi Rapolu 	{0x3c03, 0x00},
15875de35c9bSChiranjeevi Rapolu 	{0x3c04, 0x00},
15885de35c9bSChiranjeevi Rapolu 	{0x3c05, 0x03},
15895de35c9bSChiranjeevi Rapolu 	{0x3c06, 0x00},
15905de35c9bSChiranjeevi Rapolu 	{0x3c07, 0x05},
15915de35c9bSChiranjeevi Rapolu 	{0x3c0c, 0x00},
15925de35c9bSChiranjeevi Rapolu 	{0x3c0d, 0x00},
15935de35c9bSChiranjeevi Rapolu 	{0x3c0e, 0x00},
15945de35c9bSChiranjeevi Rapolu 	{0x3c0f, 0x00},
15955de35c9bSChiranjeevi Rapolu 	{0x3c40, 0x00},
15965de35c9bSChiranjeevi Rapolu 	{0x3c41, 0xa3},
15975de35c9bSChiranjeevi Rapolu 	{0x3c43, 0x7d},
15985de35c9bSChiranjeevi Rapolu 	{0x3c45, 0xd7},
15995de35c9bSChiranjeevi Rapolu 	{0x3c47, 0xfc},
16005de35c9bSChiranjeevi Rapolu 	{0x3c50, 0x05},
16015de35c9bSChiranjeevi Rapolu 	{0x3c52, 0xaa},
16025de35c9bSChiranjeevi Rapolu 	{0x3c54, 0x71},
16035de35c9bSChiranjeevi Rapolu 	{0x3c56, 0x80},
16045de35c9bSChiranjeevi Rapolu 	{0x3d85, 0x17},
16055de35c9bSChiranjeevi Rapolu 	{0x3f03, 0x00},
16065de35c9bSChiranjeevi Rapolu 	{0x3f0a, 0x00},
16075de35c9bSChiranjeevi Rapolu 	{0x3f0b, 0x00},
16085de35c9bSChiranjeevi Rapolu 	{0x4001, 0x60},
16095de35c9bSChiranjeevi Rapolu 	{0x4009, 0x05},
16105de35c9bSChiranjeevi Rapolu 	{0x4020, 0x00},
16115de35c9bSChiranjeevi Rapolu 	{0x4021, 0x00},
16125de35c9bSChiranjeevi Rapolu 	{0x4022, 0x00},
16135de35c9bSChiranjeevi Rapolu 	{0x4023, 0x00},
16145de35c9bSChiranjeevi Rapolu 	{0x4024, 0x00},
16155de35c9bSChiranjeevi Rapolu 	{0x4025, 0x00},
16165de35c9bSChiranjeevi Rapolu 	{0x4026, 0x00},
16175de35c9bSChiranjeevi Rapolu 	{0x4027, 0x00},
16185de35c9bSChiranjeevi Rapolu 	{0x4028, 0x00},
16195de35c9bSChiranjeevi Rapolu 	{0x4029, 0x00},
16205de35c9bSChiranjeevi Rapolu 	{0x402a, 0x00},
16215de35c9bSChiranjeevi Rapolu 	{0x402b, 0x00},
16225de35c9bSChiranjeevi Rapolu 	{0x402c, 0x00},
16235de35c9bSChiranjeevi Rapolu 	{0x402d, 0x00},
16245de35c9bSChiranjeevi Rapolu 	{0x402e, 0x00},
16255de35c9bSChiranjeevi Rapolu 	{0x402f, 0x00},
16265de35c9bSChiranjeevi Rapolu 	{0x4040, 0x00},
16275de35c9bSChiranjeevi Rapolu 	{0x4041, 0x03},
16285de35c9bSChiranjeevi Rapolu 	{0x4042, 0x00},
16295de35c9bSChiranjeevi Rapolu 	{0x4043, 0x7A},
16305de35c9bSChiranjeevi Rapolu 	{0x4044, 0x00},
16315de35c9bSChiranjeevi Rapolu 	{0x4045, 0x7A},
16325de35c9bSChiranjeevi Rapolu 	{0x4046, 0x00},
16335de35c9bSChiranjeevi Rapolu 	{0x4047, 0x7A},
16345de35c9bSChiranjeevi Rapolu 	{0x4048, 0x00},
16355de35c9bSChiranjeevi Rapolu 	{0x4049, 0x7A},
16365de35c9bSChiranjeevi Rapolu 	{0x4307, 0x30},
16375de35c9bSChiranjeevi Rapolu 	{0x4500, 0x58},
16385de35c9bSChiranjeevi Rapolu 	{0x4501, 0x04},
16395de35c9bSChiranjeevi Rapolu 	{0x4502, 0x40},
16405de35c9bSChiranjeevi Rapolu 	{0x4503, 0x10},
16415de35c9bSChiranjeevi Rapolu 	{0x4508, 0x55},
16425de35c9bSChiranjeevi Rapolu 	{0x4509, 0x55},
16435de35c9bSChiranjeevi Rapolu 	{0x450a, 0x02},
16445de35c9bSChiranjeevi Rapolu 	{0x450b, 0x00},
16455de35c9bSChiranjeevi Rapolu 	{0x4600, 0x00},
16465de35c9bSChiranjeevi Rapolu 	{0x4601, 0x40},
16475de35c9bSChiranjeevi Rapolu 	{0x4700, 0xa4},
16485de35c9bSChiranjeevi Rapolu 	{0x4800, 0x4c},
16495de35c9bSChiranjeevi Rapolu 	{0x4816, 0x53},
16505de35c9bSChiranjeevi Rapolu 	{0x481f, 0x40},
16515de35c9bSChiranjeevi Rapolu 	{0x4837, 0x13},
16525de35c9bSChiranjeevi Rapolu 	{0x5000, 0x56},
16535de35c9bSChiranjeevi Rapolu 	{0x5001, 0x01},
16545de35c9bSChiranjeevi Rapolu 	{0x5002, 0x28},
16555de35c9bSChiranjeevi Rapolu 	{0x5004, 0x0c},
16565de35c9bSChiranjeevi Rapolu 	{0x5006, 0x0c},
16575de35c9bSChiranjeevi Rapolu 	{0x5007, 0xe0},
16585de35c9bSChiranjeevi Rapolu 	{0x5008, 0x01},
16595de35c9bSChiranjeevi Rapolu 	{0x5009, 0xb0},
16605de35c9bSChiranjeevi Rapolu 	{0x5901, 0x00},
16615de35c9bSChiranjeevi Rapolu 	{0x5a01, 0x00},
16625de35c9bSChiranjeevi Rapolu 	{0x5a03, 0x00},
16635de35c9bSChiranjeevi Rapolu 	{0x5a04, 0x0c},
16645de35c9bSChiranjeevi Rapolu 	{0x5a05, 0xe0},
16655de35c9bSChiranjeevi Rapolu 	{0x5a06, 0x09},
16665de35c9bSChiranjeevi Rapolu 	{0x5a07, 0xb0},
16675de35c9bSChiranjeevi Rapolu 	{0x5a08, 0x06},
16685de35c9bSChiranjeevi Rapolu 	{0x5e00, 0x00},
16695de35c9bSChiranjeevi Rapolu 	{0x3734, 0x40},
16705de35c9bSChiranjeevi Rapolu 	{0x5b00, 0x01},
16715de35c9bSChiranjeevi Rapolu 	{0x5b01, 0x10},
16725de35c9bSChiranjeevi Rapolu 	{0x5b02, 0x01},
16735de35c9bSChiranjeevi Rapolu 	{0x5b03, 0xdb},
16745de35c9bSChiranjeevi Rapolu 	{0x3d8c, 0x71},
16755de35c9bSChiranjeevi Rapolu 	{0x3d8d, 0xea},
16765de35c9bSChiranjeevi Rapolu 	{0x4017, 0x10},
16775de35c9bSChiranjeevi Rapolu 	{0x3618, 0x2a},
16785de35c9bSChiranjeevi Rapolu 	{0x5780, 0x3e},
16795de35c9bSChiranjeevi Rapolu 	{0x5781, 0x0f},
16805de35c9bSChiranjeevi Rapolu 	{0x5782, 0x44},
16815de35c9bSChiranjeevi Rapolu 	{0x5783, 0x02},
16825de35c9bSChiranjeevi Rapolu 	{0x5784, 0x01},
16835de35c9bSChiranjeevi Rapolu 	{0x5785, 0x01},
16845de35c9bSChiranjeevi Rapolu 	{0x5786, 0x00},
16855de35c9bSChiranjeevi Rapolu 	{0x5787, 0x04},
16865de35c9bSChiranjeevi Rapolu 	{0x5788, 0x02},
16875de35c9bSChiranjeevi Rapolu 	{0x5789, 0x0f},
16885de35c9bSChiranjeevi Rapolu 	{0x578a, 0xfd},
16895de35c9bSChiranjeevi Rapolu 	{0x578b, 0xf5},
16905de35c9bSChiranjeevi Rapolu 	{0x578c, 0xf5},
16915de35c9bSChiranjeevi Rapolu 	{0x578d, 0x03},
16925de35c9bSChiranjeevi Rapolu 	{0x578e, 0x08},
16935de35c9bSChiranjeevi Rapolu 	{0x578f, 0x0c},
16945de35c9bSChiranjeevi Rapolu 	{0x5790, 0x08},
16955de35c9bSChiranjeevi Rapolu 	{0x5791, 0x06},
16965de35c9bSChiranjeevi Rapolu 	{0x5792, 0x00},
16975de35c9bSChiranjeevi Rapolu 	{0x5793, 0x52},
16985de35c9bSChiranjeevi Rapolu 	{0x5794, 0xa3},
16995de35c9bSChiranjeevi Rapolu 	{0x3503, 0x00}
17005de35c9bSChiranjeevi Rapolu };
17015de35c9bSChiranjeevi Rapolu 
17025de35c9bSChiranjeevi Rapolu static const char * const ov5670_test_pattern_menu[] = {
17035de35c9bSChiranjeevi Rapolu 	"Disabled",
17045de35c9bSChiranjeevi Rapolu 	"Vertical Color Bar Type 1",
17055de35c9bSChiranjeevi Rapolu };
17065de35c9bSChiranjeevi Rapolu 
17075de35c9bSChiranjeevi Rapolu /* Supported link frequencies */
17085de35c9bSChiranjeevi Rapolu #define OV5670_LINK_FREQ_420MHZ		420000000
17095de35c9bSChiranjeevi Rapolu #define OV5670_LINK_FREQ_420MHZ_INDEX	0
17105de35c9bSChiranjeevi Rapolu static const struct ov5670_link_freq_config link_freq_configs[] = {
17115de35c9bSChiranjeevi Rapolu 	{
17125de35c9bSChiranjeevi Rapolu 		/* pixel_rate = link_freq * 2 * nr_of_lanes / bits_per_sample */
17135de35c9bSChiranjeevi Rapolu 		.pixel_rate = (OV5670_LINK_FREQ_420MHZ * 2 * 2) / 10,
17145de35c9bSChiranjeevi Rapolu 		.reg_list = {
17155de35c9bSChiranjeevi Rapolu 			.num_of_regs = ARRAY_SIZE(mipi_data_rate_840mbps),
17165de35c9bSChiranjeevi Rapolu 			.regs = mipi_data_rate_840mbps,
17175de35c9bSChiranjeevi Rapolu 		}
17185de35c9bSChiranjeevi Rapolu 	}
17195de35c9bSChiranjeevi Rapolu };
17205de35c9bSChiranjeevi Rapolu 
17215de35c9bSChiranjeevi Rapolu static const s64 link_freq_menu_items[] = {
17225de35c9bSChiranjeevi Rapolu 	OV5670_LINK_FREQ_420MHZ
17235de35c9bSChiranjeevi Rapolu };
17245de35c9bSChiranjeevi Rapolu 
17255de35c9bSChiranjeevi Rapolu /*
17265de35c9bSChiranjeevi Rapolu  * OV5670 sensor supports following resolutions with full FOV:
17275de35c9bSChiranjeevi Rapolu  * 4:3  ==> {2592x1944, 1296x972, 648x486}
17285de35c9bSChiranjeevi Rapolu  * 16:9 ==> {2560x1440, 1280x720, 640x360}
17295de35c9bSChiranjeevi Rapolu  */
17305de35c9bSChiranjeevi Rapolu static const struct ov5670_mode supported_modes[] = {
17315de35c9bSChiranjeevi Rapolu 	{
17325de35c9bSChiranjeevi Rapolu 		.width = 2592,
17335de35c9bSChiranjeevi Rapolu 		.height = 1944,
17345de35c9bSChiranjeevi Rapolu 		.vts = OV5670_VTS_30FPS,
17355de35c9bSChiranjeevi Rapolu 		.reg_list = {
17365de35c9bSChiranjeevi Rapolu 			.num_of_regs = ARRAY_SIZE(mode_2592x1944_regs),
17375de35c9bSChiranjeevi Rapolu 			.regs = mode_2592x1944_regs,
17385de35c9bSChiranjeevi Rapolu 		},
17395de35c9bSChiranjeevi Rapolu 		.link_freq_index = OV5670_LINK_FREQ_420MHZ_INDEX,
17405de35c9bSChiranjeevi Rapolu 	},
17415de35c9bSChiranjeevi Rapolu 	{
17425de35c9bSChiranjeevi Rapolu 		.width = 1296,
17435de35c9bSChiranjeevi Rapolu 		.height = 972,
17445de35c9bSChiranjeevi Rapolu 		.vts = OV5670_VTS_30FPS,
17455de35c9bSChiranjeevi Rapolu 		.reg_list = {
17465de35c9bSChiranjeevi Rapolu 			.num_of_regs = ARRAY_SIZE(mode_1296x972_regs),
17475de35c9bSChiranjeevi Rapolu 			.regs = mode_1296x972_regs,
17485de35c9bSChiranjeevi Rapolu 		},
17495de35c9bSChiranjeevi Rapolu 		.link_freq_index = OV5670_LINK_FREQ_420MHZ_INDEX,
17505de35c9bSChiranjeevi Rapolu 	},
17515de35c9bSChiranjeevi Rapolu 	{
17525de35c9bSChiranjeevi Rapolu 		.width = 648,
17535de35c9bSChiranjeevi Rapolu 		.height = 486,
17545de35c9bSChiranjeevi Rapolu 		.vts = OV5670_VTS_30FPS,
17555de35c9bSChiranjeevi Rapolu 		.reg_list = {
17565de35c9bSChiranjeevi Rapolu 			.num_of_regs = ARRAY_SIZE(mode_648x486_regs),
17575de35c9bSChiranjeevi Rapolu 			.regs = mode_648x486_regs,
17585de35c9bSChiranjeevi Rapolu 		},
17595de35c9bSChiranjeevi Rapolu 		.link_freq_index = OV5670_LINK_FREQ_420MHZ_INDEX,
17605de35c9bSChiranjeevi Rapolu 	},
17615de35c9bSChiranjeevi Rapolu 	{
17625de35c9bSChiranjeevi Rapolu 		.width = 2560,
17635de35c9bSChiranjeevi Rapolu 		.height = 1440,
17645de35c9bSChiranjeevi Rapolu 		.vts = OV5670_VTS_30FPS,
17655de35c9bSChiranjeevi Rapolu 		.reg_list = {
17665de35c9bSChiranjeevi Rapolu 			.num_of_regs = ARRAY_SIZE(mode_2560x1440_regs),
17675de35c9bSChiranjeevi Rapolu 			.regs = mode_2560x1440_regs,
17685de35c9bSChiranjeevi Rapolu 		},
17695de35c9bSChiranjeevi Rapolu 		.link_freq_index = OV5670_LINK_FREQ_420MHZ_INDEX,
17705de35c9bSChiranjeevi Rapolu 	},
17715de35c9bSChiranjeevi Rapolu 	{
17725de35c9bSChiranjeevi Rapolu 		.width = 1280,
17735de35c9bSChiranjeevi Rapolu 		.height = 720,
17745de35c9bSChiranjeevi Rapolu 		.vts = OV5670_VTS_30FPS,
17755de35c9bSChiranjeevi Rapolu 		.reg_list = {
17765de35c9bSChiranjeevi Rapolu 			.num_of_regs = ARRAY_SIZE(mode_1280x720_regs),
17775de35c9bSChiranjeevi Rapolu 			.regs = mode_1280x720_regs,
17785de35c9bSChiranjeevi Rapolu 		},
17795de35c9bSChiranjeevi Rapolu 		.link_freq_index = OV5670_LINK_FREQ_420MHZ_INDEX,
17805de35c9bSChiranjeevi Rapolu 	},
17815de35c9bSChiranjeevi Rapolu 	{
17825de35c9bSChiranjeevi Rapolu 		.width = 640,
17835de35c9bSChiranjeevi Rapolu 		.height = 360,
17845de35c9bSChiranjeevi Rapolu 		.vts = OV5670_VTS_30FPS,
17855de35c9bSChiranjeevi Rapolu 		.reg_list = {
17865de35c9bSChiranjeevi Rapolu 			.num_of_regs = ARRAY_SIZE(mode_640x360_regs),
17875de35c9bSChiranjeevi Rapolu 			.regs = mode_640x360_regs,
17885de35c9bSChiranjeevi Rapolu 		},
17895de35c9bSChiranjeevi Rapolu 		.link_freq_index = OV5670_LINK_FREQ_420MHZ_INDEX,
17905de35c9bSChiranjeevi Rapolu 	}
17915de35c9bSChiranjeevi Rapolu };
17925de35c9bSChiranjeevi Rapolu 
17935de35c9bSChiranjeevi Rapolu struct ov5670 {
17945de35c9bSChiranjeevi Rapolu 	struct v4l2_subdev sd;
17955de35c9bSChiranjeevi Rapolu 	struct media_pad pad;
17965de35c9bSChiranjeevi Rapolu 
17975de35c9bSChiranjeevi Rapolu 	struct v4l2_ctrl_handler ctrl_handler;
17985de35c9bSChiranjeevi Rapolu 	/* V4L2 Controls */
17995de35c9bSChiranjeevi Rapolu 	struct v4l2_ctrl *link_freq;
18005de35c9bSChiranjeevi Rapolu 	struct v4l2_ctrl *pixel_rate;
18015de35c9bSChiranjeevi Rapolu 	struct v4l2_ctrl *vblank;
18025de35c9bSChiranjeevi Rapolu 	struct v4l2_ctrl *hblank;
18035de35c9bSChiranjeevi Rapolu 	struct v4l2_ctrl *exposure;
18045de35c9bSChiranjeevi Rapolu 
18055de35c9bSChiranjeevi Rapolu 	/* Current mode */
18065de35c9bSChiranjeevi Rapolu 	const struct ov5670_mode *cur_mode;
18075de35c9bSChiranjeevi Rapolu 
18085de35c9bSChiranjeevi Rapolu 	/* To serialize asynchronus callbacks */
18095de35c9bSChiranjeevi Rapolu 	struct mutex mutex;
18105de35c9bSChiranjeevi Rapolu 
18115de35c9bSChiranjeevi Rapolu 	/* Streaming on/off */
18125de35c9bSChiranjeevi Rapolu 	bool streaming;
18135de35c9bSChiranjeevi Rapolu };
18145de35c9bSChiranjeevi Rapolu 
18155de35c9bSChiranjeevi Rapolu #define to_ov5670(_sd)	container_of(_sd, struct ov5670, sd)
18165de35c9bSChiranjeevi Rapolu 
18175de35c9bSChiranjeevi Rapolu /* Read registers up to 4 at a time */
18185de35c9bSChiranjeevi Rapolu static int ov5670_read_reg(struct ov5670 *ov5670, u16 reg, unsigned int len,
18195de35c9bSChiranjeevi Rapolu 			   u32 *val)
18205de35c9bSChiranjeevi Rapolu {
18215de35c9bSChiranjeevi Rapolu 	struct i2c_client *client = v4l2_get_subdevdata(&ov5670->sd);
18225de35c9bSChiranjeevi Rapolu 	struct i2c_msg msgs[2];
18235de35c9bSChiranjeevi Rapolu 	u8 *data_be_p;
18245de35c9bSChiranjeevi Rapolu 	u32 data_be = 0;
18255de35c9bSChiranjeevi Rapolu 	u16 reg_addr_be = cpu_to_be16(reg);
18265de35c9bSChiranjeevi Rapolu 	int ret;
18275de35c9bSChiranjeevi Rapolu 
18285de35c9bSChiranjeevi Rapolu 	if (len > 4)
18295de35c9bSChiranjeevi Rapolu 		return -EINVAL;
18305de35c9bSChiranjeevi Rapolu 
18315de35c9bSChiranjeevi Rapolu 	data_be_p = (u8 *)&data_be;
18325de35c9bSChiranjeevi Rapolu 	/* Write register address */
18335de35c9bSChiranjeevi Rapolu 	msgs[0].addr = client->addr;
18345de35c9bSChiranjeevi Rapolu 	msgs[0].flags = 0;
18355de35c9bSChiranjeevi Rapolu 	msgs[0].len = 2;
18365de35c9bSChiranjeevi Rapolu 	msgs[0].buf = (u8 *)&reg_addr_be;
18375de35c9bSChiranjeevi Rapolu 
18385de35c9bSChiranjeevi Rapolu 	/* Read data from register */
18395de35c9bSChiranjeevi Rapolu 	msgs[1].addr = client->addr;
18405de35c9bSChiranjeevi Rapolu 	msgs[1].flags = I2C_M_RD;
18415de35c9bSChiranjeevi Rapolu 	msgs[1].len = len;
18425de35c9bSChiranjeevi Rapolu 	msgs[1].buf = &data_be_p[4 - len];
18435de35c9bSChiranjeevi Rapolu 
18445de35c9bSChiranjeevi Rapolu 	ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
18455de35c9bSChiranjeevi Rapolu 	if (ret != ARRAY_SIZE(msgs))
18465de35c9bSChiranjeevi Rapolu 		return -EIO;
18475de35c9bSChiranjeevi Rapolu 
18485de35c9bSChiranjeevi Rapolu 	*val = be32_to_cpu(data_be);
18495de35c9bSChiranjeevi Rapolu 
18505de35c9bSChiranjeevi Rapolu 	return 0;
18515de35c9bSChiranjeevi Rapolu }
18525de35c9bSChiranjeevi Rapolu 
18535de35c9bSChiranjeevi Rapolu /* Write registers up to 4 at a time */
18545de35c9bSChiranjeevi Rapolu static int ov5670_write_reg(struct ov5670 *ov5670, u16 reg, unsigned int len,
18555de35c9bSChiranjeevi Rapolu 			    u32 val)
18565de35c9bSChiranjeevi Rapolu {
18575de35c9bSChiranjeevi Rapolu 	struct i2c_client *client = v4l2_get_subdevdata(&ov5670->sd);
18585de35c9bSChiranjeevi Rapolu 	int buf_i;
18595de35c9bSChiranjeevi Rapolu 	int val_i;
18605de35c9bSChiranjeevi Rapolu 	u8 buf[6];
18615de35c9bSChiranjeevi Rapolu 	u8 *val_p;
18625de35c9bSChiranjeevi Rapolu 
18635de35c9bSChiranjeevi Rapolu 	if (len > 4)
18645de35c9bSChiranjeevi Rapolu 		return -EINVAL;
18655de35c9bSChiranjeevi Rapolu 
18665de35c9bSChiranjeevi Rapolu 	buf[0] = reg >> 8;
18675de35c9bSChiranjeevi Rapolu 	buf[1] = reg & 0xff;
18685de35c9bSChiranjeevi Rapolu 
18695de35c9bSChiranjeevi Rapolu 	val = cpu_to_be32(val);
18705de35c9bSChiranjeevi Rapolu 	val_p = (u8 *)&val;
18715de35c9bSChiranjeevi Rapolu 	buf_i = 2;
18725de35c9bSChiranjeevi Rapolu 	val_i = 4 - len;
18735de35c9bSChiranjeevi Rapolu 
18745de35c9bSChiranjeevi Rapolu 	while (val_i < 4)
18755de35c9bSChiranjeevi Rapolu 		buf[buf_i++] = val_p[val_i++];
18765de35c9bSChiranjeevi Rapolu 
18775de35c9bSChiranjeevi Rapolu 	if (i2c_master_send(client, buf, len + 2) != len + 2)
18785de35c9bSChiranjeevi Rapolu 		return -EIO;
18795de35c9bSChiranjeevi Rapolu 
18805de35c9bSChiranjeevi Rapolu 	return 0;
18815de35c9bSChiranjeevi Rapolu }
18825de35c9bSChiranjeevi Rapolu 
18835de35c9bSChiranjeevi Rapolu /* Write a list of registers */
18845de35c9bSChiranjeevi Rapolu static int ov5670_write_regs(struct ov5670 *ov5670,
18855de35c9bSChiranjeevi Rapolu 			     const struct ov5670_reg *regs, unsigned int len)
18865de35c9bSChiranjeevi Rapolu {
18875de35c9bSChiranjeevi Rapolu 	struct i2c_client *client = v4l2_get_subdevdata(&ov5670->sd);
18885de35c9bSChiranjeevi Rapolu 	unsigned int i;
18895de35c9bSChiranjeevi Rapolu 	int ret;
18905de35c9bSChiranjeevi Rapolu 
18915de35c9bSChiranjeevi Rapolu 	for (i = 0; i < len; i++) {
18925de35c9bSChiranjeevi Rapolu 		ret = ov5670_write_reg(ov5670, regs[i].address, 1, regs[i].val);
18935de35c9bSChiranjeevi Rapolu 		if (ret) {
18945de35c9bSChiranjeevi Rapolu 			dev_err_ratelimited(
18955de35c9bSChiranjeevi Rapolu 				&client->dev,
18965de35c9bSChiranjeevi Rapolu 				"Failed to write reg 0x%4.4x. error = %d\n",
18975de35c9bSChiranjeevi Rapolu 				regs[i].address, ret);
18985de35c9bSChiranjeevi Rapolu 
18995de35c9bSChiranjeevi Rapolu 			return ret;
19005de35c9bSChiranjeevi Rapolu 		}
19015de35c9bSChiranjeevi Rapolu 	}
19025de35c9bSChiranjeevi Rapolu 
19035de35c9bSChiranjeevi Rapolu 	return 0;
19045de35c9bSChiranjeevi Rapolu }
19055de35c9bSChiranjeevi Rapolu 
19065de35c9bSChiranjeevi Rapolu static int ov5670_write_reg_list(struct ov5670 *ov5670,
19075de35c9bSChiranjeevi Rapolu 				 const struct ov5670_reg_list *r_list)
19085de35c9bSChiranjeevi Rapolu {
19095de35c9bSChiranjeevi Rapolu 	return ov5670_write_regs(ov5670, r_list->regs, r_list->num_of_regs);
19105de35c9bSChiranjeevi Rapolu }
19115de35c9bSChiranjeevi Rapolu 
19125de35c9bSChiranjeevi Rapolu /* Open sub-device */
19135de35c9bSChiranjeevi Rapolu static int ov5670_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
19145de35c9bSChiranjeevi Rapolu {
19155de35c9bSChiranjeevi Rapolu 	struct ov5670 *ov5670 = to_ov5670(sd);
19165de35c9bSChiranjeevi Rapolu 	struct v4l2_mbus_framefmt *try_fmt =
19175de35c9bSChiranjeevi Rapolu 				v4l2_subdev_get_try_format(sd, fh->pad, 0);
19185de35c9bSChiranjeevi Rapolu 
19195de35c9bSChiranjeevi Rapolu 	mutex_lock(&ov5670->mutex);
19205de35c9bSChiranjeevi Rapolu 
19215de35c9bSChiranjeevi Rapolu 	/* Initialize try_fmt */
19225de35c9bSChiranjeevi Rapolu 	try_fmt->width = ov5670->cur_mode->width;
19235de35c9bSChiranjeevi Rapolu 	try_fmt->height = ov5670->cur_mode->height;
19245de35c9bSChiranjeevi Rapolu 	try_fmt->code = MEDIA_BUS_FMT_SGRBG10_1X10;
19255de35c9bSChiranjeevi Rapolu 	try_fmt->field = V4L2_FIELD_NONE;
19265de35c9bSChiranjeevi Rapolu 
19275de35c9bSChiranjeevi Rapolu 	/* No crop or compose */
19285de35c9bSChiranjeevi Rapolu 	mutex_unlock(&ov5670->mutex);
19295de35c9bSChiranjeevi Rapolu 
19305de35c9bSChiranjeevi Rapolu 	return 0;
19315de35c9bSChiranjeevi Rapolu }
19325de35c9bSChiranjeevi Rapolu 
19335de35c9bSChiranjeevi Rapolu static int ov5670_update_digital_gain(struct ov5670 *ov5670, u32 d_gain)
19345de35c9bSChiranjeevi Rapolu {
19355de35c9bSChiranjeevi Rapolu 	int ret;
19365de35c9bSChiranjeevi Rapolu 
19375de35c9bSChiranjeevi Rapolu 	ret = ov5670_write_reg(ov5670, OV5670_REG_R_DGTL_GAIN,
19385de35c9bSChiranjeevi Rapolu 			       OV5670_REG_VALUE_16BIT, d_gain);
19395de35c9bSChiranjeevi Rapolu 	if (ret)
19405de35c9bSChiranjeevi Rapolu 		return ret;
19415de35c9bSChiranjeevi Rapolu 
19425de35c9bSChiranjeevi Rapolu 	ret = ov5670_write_reg(ov5670, OV5670_REG_G_DGTL_GAIN,
19435de35c9bSChiranjeevi Rapolu 			       OV5670_REG_VALUE_16BIT, d_gain);
19445de35c9bSChiranjeevi Rapolu 	if (ret)
19455de35c9bSChiranjeevi Rapolu 		return ret;
19465de35c9bSChiranjeevi Rapolu 
19475de35c9bSChiranjeevi Rapolu 	return ov5670_write_reg(ov5670, OV5670_REG_B_DGTL_GAIN,
19485de35c9bSChiranjeevi Rapolu 				OV5670_REG_VALUE_16BIT, d_gain);
19495de35c9bSChiranjeevi Rapolu }
19505de35c9bSChiranjeevi Rapolu 
19515de35c9bSChiranjeevi Rapolu static int ov5670_enable_test_pattern(struct ov5670 *ov5670, u32 pattern)
19525de35c9bSChiranjeevi Rapolu {
19535de35c9bSChiranjeevi Rapolu 	u32 val;
19545de35c9bSChiranjeevi Rapolu 	int ret;
19555de35c9bSChiranjeevi Rapolu 
19565de35c9bSChiranjeevi Rapolu 	/* Set the bayer order that we support */
19575de35c9bSChiranjeevi Rapolu 	ret = ov5670_write_reg(ov5670, OV5670_REG_TEST_PATTERN_CTRL,
19585de35c9bSChiranjeevi Rapolu 			       OV5670_REG_VALUE_08BIT, 0);
19595de35c9bSChiranjeevi Rapolu 	if (ret)
19605de35c9bSChiranjeevi Rapolu 		return ret;
19615de35c9bSChiranjeevi Rapolu 
19625de35c9bSChiranjeevi Rapolu 	ret = ov5670_read_reg(ov5670, OV5670_REG_TEST_PATTERN,
19635de35c9bSChiranjeevi Rapolu 			      OV5670_REG_VALUE_08BIT, &val);
19645de35c9bSChiranjeevi Rapolu 	if (ret)
19655de35c9bSChiranjeevi Rapolu 		return ret;
19665de35c9bSChiranjeevi Rapolu 
19675de35c9bSChiranjeevi Rapolu 	if (pattern)
19685de35c9bSChiranjeevi Rapolu 		val |= OV5670_TEST_PATTERN_ENABLE;
19695de35c9bSChiranjeevi Rapolu 	else
19705de35c9bSChiranjeevi Rapolu 		val &= ~OV5670_TEST_PATTERN_ENABLE;
19715de35c9bSChiranjeevi Rapolu 
19725de35c9bSChiranjeevi Rapolu 	return ov5670_write_reg(ov5670, OV5670_REG_TEST_PATTERN,
19735de35c9bSChiranjeevi Rapolu 				OV5670_REG_VALUE_08BIT, val);
19745de35c9bSChiranjeevi Rapolu }
19755de35c9bSChiranjeevi Rapolu 
19765de35c9bSChiranjeevi Rapolu /* Initialize control handlers */
19775de35c9bSChiranjeevi Rapolu static int ov5670_set_ctrl(struct v4l2_ctrl *ctrl)
19785de35c9bSChiranjeevi Rapolu {
19795de35c9bSChiranjeevi Rapolu 	struct ov5670 *ov5670 = container_of(ctrl->handler,
19805de35c9bSChiranjeevi Rapolu 					     struct ov5670, ctrl_handler);
19815de35c9bSChiranjeevi Rapolu 	struct i2c_client *client = v4l2_get_subdevdata(&ov5670->sd);
19825de35c9bSChiranjeevi Rapolu 	s64 max;
19835de35c9bSChiranjeevi Rapolu 	int ret = 0;
19845de35c9bSChiranjeevi Rapolu 
19855de35c9bSChiranjeevi Rapolu 	/* Propagate change of current control to all related controls */
19865de35c9bSChiranjeevi Rapolu 	switch (ctrl->id) {
19875de35c9bSChiranjeevi Rapolu 	case V4L2_CID_VBLANK:
19885de35c9bSChiranjeevi Rapolu 		/* Update max exposure while meeting expected vblanking */
19895de35c9bSChiranjeevi Rapolu 		max = ov5670->cur_mode->height + ctrl->val - 8;
19905de35c9bSChiranjeevi Rapolu 		__v4l2_ctrl_modify_range(ov5670->exposure,
19915de35c9bSChiranjeevi Rapolu 					 ov5670->exposure->minimum, max,
19925de35c9bSChiranjeevi Rapolu 					 ov5670->exposure->step, max);
19935de35c9bSChiranjeevi Rapolu 		break;
19945de35c9bSChiranjeevi Rapolu 	}
19955de35c9bSChiranjeevi Rapolu 
19965de35c9bSChiranjeevi Rapolu 	/* V4L2 controls values will be applied only when power is already up */
19975de35c9bSChiranjeevi Rapolu 	if (pm_runtime_get_if_in_use(&client->dev) <= 0)
19985de35c9bSChiranjeevi Rapolu 		return 0;
19995de35c9bSChiranjeevi Rapolu 
20005de35c9bSChiranjeevi Rapolu 	switch (ctrl->id) {
20015de35c9bSChiranjeevi Rapolu 	case V4L2_CID_ANALOGUE_GAIN:
20025de35c9bSChiranjeevi Rapolu 		ret = ov5670_write_reg(ov5670, OV5670_REG_ANALOG_GAIN,
20035de35c9bSChiranjeevi Rapolu 				       OV5670_REG_VALUE_16BIT, ctrl->val);
20045de35c9bSChiranjeevi Rapolu 		break;
20055de35c9bSChiranjeevi Rapolu 	case V4L2_CID_DIGITAL_GAIN:
20065de35c9bSChiranjeevi Rapolu 		ret = ov5670_update_digital_gain(ov5670, ctrl->val);
20075de35c9bSChiranjeevi Rapolu 		break;
20085de35c9bSChiranjeevi Rapolu 	case V4L2_CID_EXPOSURE:
20095de35c9bSChiranjeevi Rapolu 		/* 4 least significant bits of expsoure are fractional part */
20105de35c9bSChiranjeevi Rapolu 		ret = ov5670_write_reg(ov5670, OV5670_REG_EXPOSURE,
20115de35c9bSChiranjeevi Rapolu 				       OV5670_REG_VALUE_24BIT, ctrl->val << 4);
20125de35c9bSChiranjeevi Rapolu 		break;
20135de35c9bSChiranjeevi Rapolu 	case V4L2_CID_VBLANK:
20145de35c9bSChiranjeevi Rapolu 		/* Update VTS that meets expected vertical blanking */
20155de35c9bSChiranjeevi Rapolu 		ret = ov5670_write_reg(ov5670, OV5670_REG_VTS,
20165de35c9bSChiranjeevi Rapolu 				       OV5670_REG_VALUE_16BIT,
20175de35c9bSChiranjeevi Rapolu 				       ov5670->cur_mode->height + ctrl->val);
20185de35c9bSChiranjeevi Rapolu 		break;
20195de35c9bSChiranjeevi Rapolu 	case V4L2_CID_HBLANK:
20205de35c9bSChiranjeevi Rapolu 		/* Update HTS that meets expected horizontal blanking */
20215de35c9bSChiranjeevi Rapolu 		ret = ov5670_write_reg(ov5670, OV5670_REG_HTS,
20225de35c9bSChiranjeevi Rapolu 				       OV5670_REG_VALUE_16BIT,
20235de35c9bSChiranjeevi Rapolu 				       (ov5670->cur_mode->width +
20245de35c9bSChiranjeevi Rapolu 					ctrl->val) / 2);
20255de35c9bSChiranjeevi Rapolu 		break;
20265de35c9bSChiranjeevi Rapolu 	case V4L2_CID_TEST_PATTERN:
20275de35c9bSChiranjeevi Rapolu 		ret = ov5670_enable_test_pattern(ov5670, ctrl->val);
20285de35c9bSChiranjeevi Rapolu 		break;
20295de35c9bSChiranjeevi Rapolu 	default:
20305de35c9bSChiranjeevi Rapolu 		dev_info(&client->dev, "%s Unhandled id:0x%x, val:0x%x\n",
20315de35c9bSChiranjeevi Rapolu 			 __func__, ctrl->id, ctrl->val);
20325de35c9bSChiranjeevi Rapolu 		break;
20335de35c9bSChiranjeevi Rapolu 	};
20345de35c9bSChiranjeevi Rapolu 
20355de35c9bSChiranjeevi Rapolu 	pm_runtime_put(&client->dev);
20365de35c9bSChiranjeevi Rapolu 
20375de35c9bSChiranjeevi Rapolu 	return ret;
20385de35c9bSChiranjeevi Rapolu }
20395de35c9bSChiranjeevi Rapolu 
20405de35c9bSChiranjeevi Rapolu static const struct v4l2_ctrl_ops ov5670_ctrl_ops = {
20415de35c9bSChiranjeevi Rapolu 	.s_ctrl = ov5670_set_ctrl,
20425de35c9bSChiranjeevi Rapolu };
20435de35c9bSChiranjeevi Rapolu 
20445de35c9bSChiranjeevi Rapolu /* Initialize control handlers */
20455de35c9bSChiranjeevi Rapolu static int ov5670_init_controls(struct ov5670 *ov5670)
20465de35c9bSChiranjeevi Rapolu {
20475de35c9bSChiranjeevi Rapolu 	struct v4l2_ctrl_handler *ctrl_hdlr;
20485de35c9bSChiranjeevi Rapolu 	s64 vblank_max;
20495de35c9bSChiranjeevi Rapolu 	s64 vblank_def;
20505de35c9bSChiranjeevi Rapolu 	s64 exposure_max;
20515de35c9bSChiranjeevi Rapolu 	int ret;
20525de35c9bSChiranjeevi Rapolu 
20535de35c9bSChiranjeevi Rapolu 	ctrl_hdlr = &ov5670->ctrl_handler;
20545de35c9bSChiranjeevi Rapolu 	ret = v4l2_ctrl_handler_init(ctrl_hdlr, 8);
20555de35c9bSChiranjeevi Rapolu 	if (ret)
20565de35c9bSChiranjeevi Rapolu 		return ret;
20575de35c9bSChiranjeevi Rapolu 
20585de35c9bSChiranjeevi Rapolu 	ctrl_hdlr->lock = &ov5670->mutex;
20595de35c9bSChiranjeevi Rapolu 	ov5670->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr,
20605de35c9bSChiranjeevi Rapolu 						   &ov5670_ctrl_ops,
20615de35c9bSChiranjeevi Rapolu 						   V4L2_CID_LINK_FREQ,
20625de35c9bSChiranjeevi Rapolu 						   0, 0, link_freq_menu_items);
20635de35c9bSChiranjeevi Rapolu 	if (ov5670->link_freq)
20645de35c9bSChiranjeevi Rapolu 		ov5670->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
20655de35c9bSChiranjeevi Rapolu 
20665de35c9bSChiranjeevi Rapolu 	/* By default, V4L2_CID_PIXEL_RATE is read only */
20675de35c9bSChiranjeevi Rapolu 	ov5670->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &ov5670_ctrl_ops,
20685de35c9bSChiranjeevi Rapolu 					       V4L2_CID_PIXEL_RATE, 0,
20695de35c9bSChiranjeevi Rapolu 					       link_freq_configs[0].pixel_rate,
20705de35c9bSChiranjeevi Rapolu 					       1,
20715de35c9bSChiranjeevi Rapolu 					       link_freq_configs[0].pixel_rate);
20725de35c9bSChiranjeevi Rapolu 
20735de35c9bSChiranjeevi Rapolu 	vblank_max = OV5670_VTS_MAX - ov5670->cur_mode->height;
20745de35c9bSChiranjeevi Rapolu 	vblank_def = ov5670->cur_mode->vts - ov5670->cur_mode->height;
20755de35c9bSChiranjeevi Rapolu 	ov5670->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &ov5670_ctrl_ops,
20765de35c9bSChiranjeevi Rapolu 					   V4L2_CID_VBLANK, OV5670_VBLANK_MIN,
20775de35c9bSChiranjeevi Rapolu 					   vblank_max, 1, vblank_def);
20785de35c9bSChiranjeevi Rapolu 
20795de35c9bSChiranjeevi Rapolu 	ov5670->hblank = v4l2_ctrl_new_std(
20805de35c9bSChiranjeevi Rapolu 				ctrl_hdlr, &ov5670_ctrl_ops, V4L2_CID_HBLANK,
20815de35c9bSChiranjeevi Rapolu 				OV5670_DEF_PPL - ov5670->cur_mode->width,
20825de35c9bSChiranjeevi Rapolu 				OV5670_DEF_PPL - ov5670->cur_mode->width, 1,
20835de35c9bSChiranjeevi Rapolu 				OV5670_DEF_PPL - ov5670->cur_mode->width);
20845de35c9bSChiranjeevi Rapolu 
20855de35c9bSChiranjeevi Rapolu 	/* Get min, max, step, default from sensor */
20865de35c9bSChiranjeevi Rapolu 	v4l2_ctrl_new_std(ctrl_hdlr, &ov5670_ctrl_ops, V4L2_CID_ANALOGUE_GAIN,
20875de35c9bSChiranjeevi Rapolu 			  ANALOG_GAIN_MIN, ANALOG_GAIN_MAX, ANALOG_GAIN_STEP,
20885de35c9bSChiranjeevi Rapolu 			  ANALOG_GAIN_DEFAULT);
20895de35c9bSChiranjeevi Rapolu 
20905de35c9bSChiranjeevi Rapolu 	/* Digital gain */
20915de35c9bSChiranjeevi Rapolu 	v4l2_ctrl_new_std(ctrl_hdlr, &ov5670_ctrl_ops, V4L2_CID_DIGITAL_GAIN,
20925de35c9bSChiranjeevi Rapolu 			  OV5670_DGTL_GAIN_MIN, OV5670_DGTL_GAIN_MAX,
20935de35c9bSChiranjeevi Rapolu 			  OV5670_DGTL_GAIN_STEP, OV5670_DGTL_GAIN_DEFAULT);
20945de35c9bSChiranjeevi Rapolu 
20955de35c9bSChiranjeevi Rapolu 	/* Get min, max, step, default from sensor */
20965de35c9bSChiranjeevi Rapolu 	exposure_max = ov5670->cur_mode->vts - 8;
20975de35c9bSChiranjeevi Rapolu 	ov5670->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &ov5670_ctrl_ops,
20985de35c9bSChiranjeevi Rapolu 					     V4L2_CID_EXPOSURE,
20995de35c9bSChiranjeevi Rapolu 					     OV5670_EXPOSURE_MIN,
21005de35c9bSChiranjeevi Rapolu 					     exposure_max, OV5670_EXPOSURE_STEP,
21015de35c9bSChiranjeevi Rapolu 					     exposure_max);
21025de35c9bSChiranjeevi Rapolu 
21035de35c9bSChiranjeevi Rapolu 	v4l2_ctrl_new_std_menu_items(ctrl_hdlr, &ov5670_ctrl_ops,
21045de35c9bSChiranjeevi Rapolu 				     V4L2_CID_TEST_PATTERN,
21055de35c9bSChiranjeevi Rapolu 				     ARRAY_SIZE(ov5670_test_pattern_menu) - 1,
21065de35c9bSChiranjeevi Rapolu 				     0, 0, ov5670_test_pattern_menu);
21075de35c9bSChiranjeevi Rapolu 
21085de35c9bSChiranjeevi Rapolu 	if (ctrl_hdlr->error) {
21095de35c9bSChiranjeevi Rapolu 		ret = ctrl_hdlr->error;
21105de35c9bSChiranjeevi Rapolu 		goto error;
21115de35c9bSChiranjeevi Rapolu 	}
21125de35c9bSChiranjeevi Rapolu 
21135de35c9bSChiranjeevi Rapolu 	ov5670->sd.ctrl_handler = ctrl_hdlr;
21145de35c9bSChiranjeevi Rapolu 
21155de35c9bSChiranjeevi Rapolu 	return 0;
21165de35c9bSChiranjeevi Rapolu 
21175de35c9bSChiranjeevi Rapolu error:
21185de35c9bSChiranjeevi Rapolu 	v4l2_ctrl_handler_free(ctrl_hdlr);
21195de35c9bSChiranjeevi Rapolu 
21205de35c9bSChiranjeevi Rapolu 	return ret;
21215de35c9bSChiranjeevi Rapolu }
21225de35c9bSChiranjeevi Rapolu 
21235de35c9bSChiranjeevi Rapolu static int ov5670_enum_mbus_code(struct v4l2_subdev *sd,
21245de35c9bSChiranjeevi Rapolu 				 struct v4l2_subdev_pad_config *cfg,
21255de35c9bSChiranjeevi Rapolu 				 struct v4l2_subdev_mbus_code_enum *code)
21265de35c9bSChiranjeevi Rapolu {
21275de35c9bSChiranjeevi Rapolu 	/* Only one bayer order GRBG is supported */
21285de35c9bSChiranjeevi Rapolu 	if (code->index > 0)
21295de35c9bSChiranjeevi Rapolu 		return -EINVAL;
21305de35c9bSChiranjeevi Rapolu 
21315de35c9bSChiranjeevi Rapolu 	code->code = MEDIA_BUS_FMT_SGRBG10_1X10;
21325de35c9bSChiranjeevi Rapolu 
21335de35c9bSChiranjeevi Rapolu 	return 0;
21345de35c9bSChiranjeevi Rapolu }
21355de35c9bSChiranjeevi Rapolu 
21365de35c9bSChiranjeevi Rapolu static int ov5670_enum_frame_size(struct v4l2_subdev *sd,
21375de35c9bSChiranjeevi Rapolu 				  struct v4l2_subdev_pad_config *cfg,
21385de35c9bSChiranjeevi Rapolu 				  struct v4l2_subdev_frame_size_enum *fse)
21395de35c9bSChiranjeevi Rapolu {
21405de35c9bSChiranjeevi Rapolu 	if (fse->index >= ARRAY_SIZE(supported_modes))
21415de35c9bSChiranjeevi Rapolu 		return -EINVAL;
21425de35c9bSChiranjeevi Rapolu 
21435de35c9bSChiranjeevi Rapolu 	if (fse->code != MEDIA_BUS_FMT_SGRBG10_1X10)
21445de35c9bSChiranjeevi Rapolu 		return -EINVAL;
21455de35c9bSChiranjeevi Rapolu 
21465de35c9bSChiranjeevi Rapolu 	fse->min_width = supported_modes[fse->index].width;
21475de35c9bSChiranjeevi Rapolu 	fse->max_width = fse->min_width;
21485de35c9bSChiranjeevi Rapolu 	fse->min_height = supported_modes[fse->index].height;
21495de35c9bSChiranjeevi Rapolu 	fse->max_height = fse->min_height;
21505de35c9bSChiranjeevi Rapolu 
21515de35c9bSChiranjeevi Rapolu 	return 0;
21525de35c9bSChiranjeevi Rapolu }
21535de35c9bSChiranjeevi Rapolu 
21545de35c9bSChiranjeevi Rapolu /* Calculate resolution distance */
21555de35c9bSChiranjeevi Rapolu static int ov5670_get_reso_dist(const struct ov5670_mode *mode,
21565de35c9bSChiranjeevi Rapolu 				struct v4l2_mbus_framefmt *framefmt)
21575de35c9bSChiranjeevi Rapolu {
21585de35c9bSChiranjeevi Rapolu 	return abs(mode->width - framefmt->width) +
21595de35c9bSChiranjeevi Rapolu 	       abs(mode->height - framefmt->height);
21605de35c9bSChiranjeevi Rapolu }
21615de35c9bSChiranjeevi Rapolu 
21625de35c9bSChiranjeevi Rapolu /* Find the closest supported resolution to the requested resolution */
21635de35c9bSChiranjeevi Rapolu static const struct ov5670_mode *ov5670_find_best_fit(
21645de35c9bSChiranjeevi Rapolu 						struct ov5670 *ov5670,
21655de35c9bSChiranjeevi Rapolu 						struct v4l2_subdev_format *fmt)
21665de35c9bSChiranjeevi Rapolu {
21675de35c9bSChiranjeevi Rapolu 	struct v4l2_mbus_framefmt *framefmt = &fmt->format;
21685de35c9bSChiranjeevi Rapolu 	int dist;
21695de35c9bSChiranjeevi Rapolu 	int cur_best_fit = 0;
21705de35c9bSChiranjeevi Rapolu 	int cur_best_fit_dist = -1;
21715de35c9bSChiranjeevi Rapolu 	int i;
21725de35c9bSChiranjeevi Rapolu 
21735de35c9bSChiranjeevi Rapolu 	for (i = 0; i < ARRAY_SIZE(supported_modes); i++) {
21745de35c9bSChiranjeevi Rapolu 		dist = ov5670_get_reso_dist(&supported_modes[i], framefmt);
21755de35c9bSChiranjeevi Rapolu 		if (cur_best_fit_dist == -1 || dist < cur_best_fit_dist) {
21765de35c9bSChiranjeevi Rapolu 			cur_best_fit_dist = dist;
21775de35c9bSChiranjeevi Rapolu 			cur_best_fit = i;
21785de35c9bSChiranjeevi Rapolu 		}
21795de35c9bSChiranjeevi Rapolu 	}
21805de35c9bSChiranjeevi Rapolu 
21815de35c9bSChiranjeevi Rapolu 	return &supported_modes[cur_best_fit];
21825de35c9bSChiranjeevi Rapolu }
21835de35c9bSChiranjeevi Rapolu 
21845de35c9bSChiranjeevi Rapolu static void ov5670_update_pad_format(const struct ov5670_mode *mode,
21855de35c9bSChiranjeevi Rapolu 				     struct v4l2_subdev_format *fmt)
21865de35c9bSChiranjeevi Rapolu {
21875de35c9bSChiranjeevi Rapolu 	fmt->format.width = mode->width;
21885de35c9bSChiranjeevi Rapolu 	fmt->format.height = mode->height;
21895de35c9bSChiranjeevi Rapolu 	fmt->format.code = MEDIA_BUS_FMT_SGRBG10_1X10;
21905de35c9bSChiranjeevi Rapolu 	fmt->format.field = V4L2_FIELD_NONE;
21915de35c9bSChiranjeevi Rapolu }
21925de35c9bSChiranjeevi Rapolu 
21935de35c9bSChiranjeevi Rapolu static int ov5670_do_get_pad_format(struct ov5670 *ov5670,
21945de35c9bSChiranjeevi Rapolu 				    struct v4l2_subdev_pad_config *cfg,
21955de35c9bSChiranjeevi Rapolu 				    struct v4l2_subdev_format *fmt)
21965de35c9bSChiranjeevi Rapolu {
21975de35c9bSChiranjeevi Rapolu 	if (fmt->which == V4L2_SUBDEV_FORMAT_TRY)
21985de35c9bSChiranjeevi Rapolu 		fmt->format = *v4l2_subdev_get_try_format(&ov5670->sd, cfg,
21995de35c9bSChiranjeevi Rapolu 							  fmt->pad);
22005de35c9bSChiranjeevi Rapolu 	else
22015de35c9bSChiranjeevi Rapolu 		ov5670_update_pad_format(ov5670->cur_mode, fmt);
22025de35c9bSChiranjeevi Rapolu 
22035de35c9bSChiranjeevi Rapolu 	return 0;
22045de35c9bSChiranjeevi Rapolu }
22055de35c9bSChiranjeevi Rapolu 
22065de35c9bSChiranjeevi Rapolu static int ov5670_get_pad_format(struct v4l2_subdev *sd,
22075de35c9bSChiranjeevi Rapolu 				 struct v4l2_subdev_pad_config *cfg,
22085de35c9bSChiranjeevi Rapolu 				 struct v4l2_subdev_format *fmt)
22095de35c9bSChiranjeevi Rapolu {
22105de35c9bSChiranjeevi Rapolu 	struct ov5670 *ov5670 = to_ov5670(sd);
22115de35c9bSChiranjeevi Rapolu 	int ret;
22125de35c9bSChiranjeevi Rapolu 
22135de35c9bSChiranjeevi Rapolu 	mutex_lock(&ov5670->mutex);
22145de35c9bSChiranjeevi Rapolu 	ret = ov5670_do_get_pad_format(ov5670, cfg, fmt);
22155de35c9bSChiranjeevi Rapolu 	mutex_unlock(&ov5670->mutex);
22165de35c9bSChiranjeevi Rapolu 
22175de35c9bSChiranjeevi Rapolu 	return ret;
22185de35c9bSChiranjeevi Rapolu }
22195de35c9bSChiranjeevi Rapolu 
22205de35c9bSChiranjeevi Rapolu static int ov5670_set_pad_format(struct v4l2_subdev *sd,
22215de35c9bSChiranjeevi Rapolu 				 struct v4l2_subdev_pad_config *cfg,
22225de35c9bSChiranjeevi Rapolu 				 struct v4l2_subdev_format *fmt)
22235de35c9bSChiranjeevi Rapolu {
22245de35c9bSChiranjeevi Rapolu 	struct ov5670 *ov5670 = to_ov5670(sd);
22255de35c9bSChiranjeevi Rapolu 	const struct ov5670_mode *mode;
22265de35c9bSChiranjeevi Rapolu 	s32 vblank_def;
22275de35c9bSChiranjeevi Rapolu 	s32 h_blank;
22285de35c9bSChiranjeevi Rapolu 
22295de35c9bSChiranjeevi Rapolu 	mutex_lock(&ov5670->mutex);
22305de35c9bSChiranjeevi Rapolu 
22315de35c9bSChiranjeevi Rapolu 	fmt->format.code = MEDIA_BUS_FMT_SGRBG10_1X10;
22325de35c9bSChiranjeevi Rapolu 
22335de35c9bSChiranjeevi Rapolu 	mode = ov5670_find_best_fit(ov5670, fmt);
22345de35c9bSChiranjeevi Rapolu 	ov5670_update_pad_format(mode, fmt);
22355de35c9bSChiranjeevi Rapolu 	if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) {
22365de35c9bSChiranjeevi Rapolu 		*v4l2_subdev_get_try_format(sd, cfg, fmt->pad) = fmt->format;
22375de35c9bSChiranjeevi Rapolu 	} else {
22385de35c9bSChiranjeevi Rapolu 		ov5670->cur_mode = mode;
22395de35c9bSChiranjeevi Rapolu 		__v4l2_ctrl_s_ctrl(ov5670->link_freq, mode->link_freq_index);
22405de35c9bSChiranjeevi Rapolu 		__v4l2_ctrl_s_ctrl_int64(
22415de35c9bSChiranjeevi Rapolu 			ov5670->pixel_rate,
22425de35c9bSChiranjeevi Rapolu 			link_freq_configs[mode->link_freq_index].pixel_rate);
22435de35c9bSChiranjeevi Rapolu 		/* Update limits and set FPS to default */
22445de35c9bSChiranjeevi Rapolu 		vblank_def = ov5670->cur_mode->vts - ov5670->cur_mode->height;
22455de35c9bSChiranjeevi Rapolu 		__v4l2_ctrl_modify_range(
22465de35c9bSChiranjeevi Rapolu 			ov5670->vblank, OV5670_VBLANK_MIN,
22475de35c9bSChiranjeevi Rapolu 			OV5670_VTS_MAX - ov5670->cur_mode->height, 1,
22485de35c9bSChiranjeevi Rapolu 			vblank_def);
22495de35c9bSChiranjeevi Rapolu 		__v4l2_ctrl_s_ctrl(ov5670->vblank, vblank_def);
22505de35c9bSChiranjeevi Rapolu 		h_blank = OV5670_DEF_PPL - ov5670->cur_mode->width;
22515de35c9bSChiranjeevi Rapolu 		__v4l2_ctrl_modify_range(ov5670->hblank, h_blank, h_blank, 1,
22525de35c9bSChiranjeevi Rapolu 					 h_blank);
22535de35c9bSChiranjeevi Rapolu 	}
22545de35c9bSChiranjeevi Rapolu 
22555de35c9bSChiranjeevi Rapolu 	mutex_unlock(&ov5670->mutex);
22565de35c9bSChiranjeevi Rapolu 
22575de35c9bSChiranjeevi Rapolu 	return 0;
22585de35c9bSChiranjeevi Rapolu }
22595de35c9bSChiranjeevi Rapolu 
22605de35c9bSChiranjeevi Rapolu static int ov5670_get_skip_frames(struct v4l2_subdev *sd, u32 *frames)
22615de35c9bSChiranjeevi Rapolu {
22625de35c9bSChiranjeevi Rapolu 	*frames = OV5670_NUM_OF_SKIP_FRAMES;
22635de35c9bSChiranjeevi Rapolu 
22645de35c9bSChiranjeevi Rapolu 	return 0;
22655de35c9bSChiranjeevi Rapolu }
22665de35c9bSChiranjeevi Rapolu 
22675de35c9bSChiranjeevi Rapolu /* Prepare streaming by writing default values and customized values */
22685de35c9bSChiranjeevi Rapolu static int ov5670_start_streaming(struct ov5670 *ov5670)
22695de35c9bSChiranjeevi Rapolu {
22705de35c9bSChiranjeevi Rapolu 	struct i2c_client *client = v4l2_get_subdevdata(&ov5670->sd);
22715de35c9bSChiranjeevi Rapolu 	const struct ov5670_reg_list *reg_list;
22725de35c9bSChiranjeevi Rapolu 	int link_freq_index;
22735de35c9bSChiranjeevi Rapolu 	int ret;
22745de35c9bSChiranjeevi Rapolu 
22755de35c9bSChiranjeevi Rapolu 	/* Get out of from software reset */
22765de35c9bSChiranjeevi Rapolu 	ret = ov5670_write_reg(ov5670, OV5670_REG_SOFTWARE_RST,
22775de35c9bSChiranjeevi Rapolu 			       OV5670_REG_VALUE_08BIT, OV5670_SOFTWARE_RST);
22785de35c9bSChiranjeevi Rapolu 	if (ret) {
22795de35c9bSChiranjeevi Rapolu 		dev_err(&client->dev, "%s failed to set powerup registers\n",
22805de35c9bSChiranjeevi Rapolu 			__func__);
22815de35c9bSChiranjeevi Rapolu 		return ret;
22825de35c9bSChiranjeevi Rapolu 	}
22835de35c9bSChiranjeevi Rapolu 
22845de35c9bSChiranjeevi Rapolu 	/* Setup PLL */
22855de35c9bSChiranjeevi Rapolu 	link_freq_index = ov5670->cur_mode->link_freq_index;
22865de35c9bSChiranjeevi Rapolu 	reg_list = &link_freq_configs[link_freq_index].reg_list;
22875de35c9bSChiranjeevi Rapolu 	ret = ov5670_write_reg_list(ov5670, reg_list);
22885de35c9bSChiranjeevi Rapolu 	if (ret) {
22895de35c9bSChiranjeevi Rapolu 		dev_err(&client->dev, "%s failed to set plls\n", __func__);
22905de35c9bSChiranjeevi Rapolu 		return ret;
22915de35c9bSChiranjeevi Rapolu 	}
22925de35c9bSChiranjeevi Rapolu 
22935de35c9bSChiranjeevi Rapolu 	/* Apply default values of current mode */
22945de35c9bSChiranjeevi Rapolu 	reg_list = &ov5670->cur_mode->reg_list;
22955de35c9bSChiranjeevi Rapolu 	ret = ov5670_write_reg_list(ov5670, reg_list);
22965de35c9bSChiranjeevi Rapolu 	if (ret) {
22975de35c9bSChiranjeevi Rapolu 		dev_err(&client->dev, "%s failed to set mode\n", __func__);
22985de35c9bSChiranjeevi Rapolu 		return ret;
22995de35c9bSChiranjeevi Rapolu 	}
23005de35c9bSChiranjeevi Rapolu 
23015de35c9bSChiranjeevi Rapolu 	ret = __v4l2_ctrl_handler_setup(ov5670->sd.ctrl_handler);
23025de35c9bSChiranjeevi Rapolu 	if (ret)
23035de35c9bSChiranjeevi Rapolu 		return ret;
23045de35c9bSChiranjeevi Rapolu 
23055de35c9bSChiranjeevi Rapolu 	/* Write stream on list */
23065de35c9bSChiranjeevi Rapolu 	ret = ov5670_write_reg(ov5670, OV5670_REG_MODE_SELECT,
23075de35c9bSChiranjeevi Rapolu 			       OV5670_REG_VALUE_08BIT, OV5670_MODE_STREAMING);
23085de35c9bSChiranjeevi Rapolu 	if (ret) {
23095de35c9bSChiranjeevi Rapolu 		dev_err(&client->dev, "%s failed to set stream\n", __func__);
23105de35c9bSChiranjeevi Rapolu 		return ret;
23115de35c9bSChiranjeevi Rapolu 	}
23125de35c9bSChiranjeevi Rapolu 
23135de35c9bSChiranjeevi Rapolu 	ov5670->streaming = true;
23145de35c9bSChiranjeevi Rapolu 
23155de35c9bSChiranjeevi Rapolu 	return 0;
23165de35c9bSChiranjeevi Rapolu }
23175de35c9bSChiranjeevi Rapolu 
23185de35c9bSChiranjeevi Rapolu static int ov5670_stop_streaming(struct ov5670 *ov5670)
23195de35c9bSChiranjeevi Rapolu {
23205de35c9bSChiranjeevi Rapolu 	struct i2c_client *client = v4l2_get_subdevdata(&ov5670->sd);
23215de35c9bSChiranjeevi Rapolu 	int ret;
23225de35c9bSChiranjeevi Rapolu 
23235de35c9bSChiranjeevi Rapolu 	ret = ov5670_write_reg(ov5670, OV5670_REG_MODE_SELECT,
23245de35c9bSChiranjeevi Rapolu 			       OV5670_REG_VALUE_08BIT, OV5670_MODE_STANDBY);
23255de35c9bSChiranjeevi Rapolu 	if (ret)
23265de35c9bSChiranjeevi Rapolu 		dev_err(&client->dev, "%s failed to set stream\n", __func__);
23275de35c9bSChiranjeevi Rapolu 
23285de35c9bSChiranjeevi Rapolu 	ov5670->streaming = false;
23295de35c9bSChiranjeevi Rapolu 
23305de35c9bSChiranjeevi Rapolu 	/* Return success even if it was an error, as there is nothing the
23315de35c9bSChiranjeevi Rapolu 	 * caller can do about it.
23325de35c9bSChiranjeevi Rapolu 	 */
23335de35c9bSChiranjeevi Rapolu 	return 0;
23345de35c9bSChiranjeevi Rapolu }
23355de35c9bSChiranjeevi Rapolu 
23365de35c9bSChiranjeevi Rapolu static int ov5670_set_stream(struct v4l2_subdev *sd, int enable)
23375de35c9bSChiranjeevi Rapolu {
23385de35c9bSChiranjeevi Rapolu 	struct ov5670 *ov5670 = to_ov5670(sd);
23395de35c9bSChiranjeevi Rapolu 	struct i2c_client *client = v4l2_get_subdevdata(sd);
23405de35c9bSChiranjeevi Rapolu 	int ret = 0;
23415de35c9bSChiranjeevi Rapolu 
23425de35c9bSChiranjeevi Rapolu 	mutex_lock(&ov5670->mutex);
23435de35c9bSChiranjeevi Rapolu 	if (ov5670->streaming == enable)
23445de35c9bSChiranjeevi Rapolu 		goto unlock_and_return;
23455de35c9bSChiranjeevi Rapolu 
23465de35c9bSChiranjeevi Rapolu 	if (enable) {
23475de35c9bSChiranjeevi Rapolu 		ret = pm_runtime_get_sync(&client->dev);
23485de35c9bSChiranjeevi Rapolu 		if (ret < 0) {
23495de35c9bSChiranjeevi Rapolu 			pm_runtime_put_noidle(&client->dev);
23505de35c9bSChiranjeevi Rapolu 			goto unlock_and_return;
23515de35c9bSChiranjeevi Rapolu 		}
23525de35c9bSChiranjeevi Rapolu 
23535de35c9bSChiranjeevi Rapolu 		ret = ov5670_start_streaming(ov5670);
23545de35c9bSChiranjeevi Rapolu 		if (ret)
23555de35c9bSChiranjeevi Rapolu 			goto error;
23565de35c9bSChiranjeevi Rapolu 	} else {
23575de35c9bSChiranjeevi Rapolu 		ret = ov5670_stop_streaming(ov5670);
23585de35c9bSChiranjeevi Rapolu 		pm_runtime_put(&client->dev);
23595de35c9bSChiranjeevi Rapolu 	}
23605de35c9bSChiranjeevi Rapolu 	goto unlock_and_return;
23615de35c9bSChiranjeevi Rapolu 
23625de35c9bSChiranjeevi Rapolu error:
23635de35c9bSChiranjeevi Rapolu 	pm_runtime_put(&client->dev);
23645de35c9bSChiranjeevi Rapolu 
23655de35c9bSChiranjeevi Rapolu unlock_and_return:
23665de35c9bSChiranjeevi Rapolu 	mutex_unlock(&ov5670->mutex);
23675de35c9bSChiranjeevi Rapolu 
23685de35c9bSChiranjeevi Rapolu 	return ret;
23695de35c9bSChiranjeevi Rapolu }
23705de35c9bSChiranjeevi Rapolu 
23715de35c9bSChiranjeevi Rapolu static int __maybe_unused ov5670_suspend(struct device *dev)
23725de35c9bSChiranjeevi Rapolu {
23735de35c9bSChiranjeevi Rapolu 	struct i2c_client *client = to_i2c_client(dev);
23745de35c9bSChiranjeevi Rapolu 	struct v4l2_subdev *sd = i2c_get_clientdata(client);
23755de35c9bSChiranjeevi Rapolu 	struct ov5670 *ov5670 = to_ov5670(sd);
23765de35c9bSChiranjeevi Rapolu 
23775de35c9bSChiranjeevi Rapolu 	if (ov5670->streaming)
23785de35c9bSChiranjeevi Rapolu 		ov5670_stop_streaming(ov5670);
23795de35c9bSChiranjeevi Rapolu 
23805de35c9bSChiranjeevi Rapolu 	return 0;
23815de35c9bSChiranjeevi Rapolu }
23825de35c9bSChiranjeevi Rapolu 
23835de35c9bSChiranjeevi Rapolu static int __maybe_unused ov5670_resume(struct device *dev)
23845de35c9bSChiranjeevi Rapolu {
23855de35c9bSChiranjeevi Rapolu 	struct i2c_client *client = to_i2c_client(dev);
23865de35c9bSChiranjeevi Rapolu 	struct v4l2_subdev *sd = i2c_get_clientdata(client);
23875de35c9bSChiranjeevi Rapolu 	struct ov5670 *ov5670 = to_ov5670(sd);
23885de35c9bSChiranjeevi Rapolu 	int ret;
23895de35c9bSChiranjeevi Rapolu 
23905de35c9bSChiranjeevi Rapolu 	if (ov5670->streaming) {
23915de35c9bSChiranjeevi Rapolu 		ret = ov5670_start_streaming(ov5670);
23925de35c9bSChiranjeevi Rapolu 		if (ret) {
23935de35c9bSChiranjeevi Rapolu 			ov5670_stop_streaming(ov5670);
23945de35c9bSChiranjeevi Rapolu 			return ret;
23955de35c9bSChiranjeevi Rapolu 		}
23965de35c9bSChiranjeevi Rapolu 	}
23975de35c9bSChiranjeevi Rapolu 
23985de35c9bSChiranjeevi Rapolu 	return 0;
23995de35c9bSChiranjeevi Rapolu }
24005de35c9bSChiranjeevi Rapolu 
24015de35c9bSChiranjeevi Rapolu /* Verify chip ID */
24025de35c9bSChiranjeevi Rapolu static int ov5670_identify_module(struct ov5670 *ov5670)
24035de35c9bSChiranjeevi Rapolu {
24045de35c9bSChiranjeevi Rapolu 	struct i2c_client *client = v4l2_get_subdevdata(&ov5670->sd);
24055de35c9bSChiranjeevi Rapolu 	int ret;
24065de35c9bSChiranjeevi Rapolu 	u32 val;
24075de35c9bSChiranjeevi Rapolu 
24085de35c9bSChiranjeevi Rapolu 	ret = ov5670_read_reg(ov5670, OV5670_REG_CHIP_ID,
24095de35c9bSChiranjeevi Rapolu 			      OV5670_REG_VALUE_24BIT, &val);
24105de35c9bSChiranjeevi Rapolu 	if (ret)
24115de35c9bSChiranjeevi Rapolu 		return ret;
24125de35c9bSChiranjeevi Rapolu 
24135de35c9bSChiranjeevi Rapolu 	if (val != OV5670_CHIP_ID) {
24145de35c9bSChiranjeevi Rapolu 		dev_err(&client->dev, "chip id mismatch: %x!=%x\n",
24155de35c9bSChiranjeevi Rapolu 			OV5670_CHIP_ID, val);
24165de35c9bSChiranjeevi Rapolu 		return -ENXIO;
24175de35c9bSChiranjeevi Rapolu 	}
24185de35c9bSChiranjeevi Rapolu 
24195de35c9bSChiranjeevi Rapolu 	return 0;
24205de35c9bSChiranjeevi Rapolu }
24215de35c9bSChiranjeevi Rapolu 
24225de35c9bSChiranjeevi Rapolu static const struct v4l2_subdev_video_ops ov5670_video_ops = {
24235de35c9bSChiranjeevi Rapolu 	.s_stream = ov5670_set_stream,
24245de35c9bSChiranjeevi Rapolu };
24255de35c9bSChiranjeevi Rapolu 
24265de35c9bSChiranjeevi Rapolu static const struct v4l2_subdev_pad_ops ov5670_pad_ops = {
24275de35c9bSChiranjeevi Rapolu 	.enum_mbus_code = ov5670_enum_mbus_code,
24285de35c9bSChiranjeevi Rapolu 	.get_fmt = ov5670_get_pad_format,
24295de35c9bSChiranjeevi Rapolu 	.set_fmt = ov5670_set_pad_format,
24305de35c9bSChiranjeevi Rapolu 	.enum_frame_size = ov5670_enum_frame_size,
24315de35c9bSChiranjeevi Rapolu };
24325de35c9bSChiranjeevi Rapolu 
24335de35c9bSChiranjeevi Rapolu static const struct v4l2_subdev_sensor_ops ov5670_sensor_ops = {
24345de35c9bSChiranjeevi Rapolu 	.g_skip_frames = ov5670_get_skip_frames,
24355de35c9bSChiranjeevi Rapolu };
24365de35c9bSChiranjeevi Rapolu 
24375de35c9bSChiranjeevi Rapolu static const struct v4l2_subdev_ops ov5670_subdev_ops = {
24385de35c9bSChiranjeevi Rapolu 	.video = &ov5670_video_ops,
24395de35c9bSChiranjeevi Rapolu 	.pad = &ov5670_pad_ops,
24405de35c9bSChiranjeevi Rapolu 	.sensor = &ov5670_sensor_ops,
24415de35c9bSChiranjeevi Rapolu };
24425de35c9bSChiranjeevi Rapolu 
24435de35c9bSChiranjeevi Rapolu static const struct media_entity_operations ov5670_subdev_entity_ops = {
24445de35c9bSChiranjeevi Rapolu 	.link_validate = v4l2_subdev_link_validate,
24455de35c9bSChiranjeevi Rapolu };
24465de35c9bSChiranjeevi Rapolu 
24475de35c9bSChiranjeevi Rapolu static const struct v4l2_subdev_internal_ops ov5670_internal_ops = {
24485de35c9bSChiranjeevi Rapolu 	.open = ov5670_open,
24495de35c9bSChiranjeevi Rapolu };
24505de35c9bSChiranjeevi Rapolu 
24515de35c9bSChiranjeevi Rapolu static int ov5670_probe(struct i2c_client *client)
24525de35c9bSChiranjeevi Rapolu {
24535de35c9bSChiranjeevi Rapolu 	struct ov5670 *ov5670;
24545de35c9bSChiranjeevi Rapolu 	const char *err_msg;
24555de35c9bSChiranjeevi Rapolu 	u32 input_clk = 0;
24565de35c9bSChiranjeevi Rapolu 	int ret;
24575de35c9bSChiranjeevi Rapolu 
24585de35c9bSChiranjeevi Rapolu 	device_property_read_u32(&client->dev, "clock-frequency", &input_clk);
24595de35c9bSChiranjeevi Rapolu 	if (input_clk != 19200000)
24605de35c9bSChiranjeevi Rapolu 		return -EINVAL;
24615de35c9bSChiranjeevi Rapolu 
24625de35c9bSChiranjeevi Rapolu 	ov5670 = devm_kzalloc(&client->dev, sizeof(*ov5670), GFP_KERNEL);
24635de35c9bSChiranjeevi Rapolu 	if (!ov5670) {
24645de35c9bSChiranjeevi Rapolu 		ret = -ENOMEM;
24655de35c9bSChiranjeevi Rapolu 		err_msg = "devm_kzalloc() error";
24665de35c9bSChiranjeevi Rapolu 		goto error_print;
24675de35c9bSChiranjeevi Rapolu 	}
24685de35c9bSChiranjeevi Rapolu 
24695de35c9bSChiranjeevi Rapolu 	/* Initialize subdev */
24705de35c9bSChiranjeevi Rapolu 	v4l2_i2c_subdev_init(&ov5670->sd, client, &ov5670_subdev_ops);
24715de35c9bSChiranjeevi Rapolu 
24725de35c9bSChiranjeevi Rapolu 	/* Check module identity */
24735de35c9bSChiranjeevi Rapolu 	ret = ov5670_identify_module(ov5670);
24745de35c9bSChiranjeevi Rapolu 	if (ret) {
24755de35c9bSChiranjeevi Rapolu 		err_msg = "ov5670_identify_module() error";
24765de35c9bSChiranjeevi Rapolu 		goto error_print;
24775de35c9bSChiranjeevi Rapolu 	}
24785de35c9bSChiranjeevi Rapolu 
24795de35c9bSChiranjeevi Rapolu 	mutex_init(&ov5670->mutex);
24805de35c9bSChiranjeevi Rapolu 
24815de35c9bSChiranjeevi Rapolu 	/* Set default mode to max resolution */
24825de35c9bSChiranjeevi Rapolu 	ov5670->cur_mode = &supported_modes[0];
24835de35c9bSChiranjeevi Rapolu 
24845de35c9bSChiranjeevi Rapolu 	ret = ov5670_init_controls(ov5670);
24855de35c9bSChiranjeevi Rapolu 	if (ret) {
24865de35c9bSChiranjeevi Rapolu 		err_msg = "ov5670_init_controls() error";
24875de35c9bSChiranjeevi Rapolu 		goto error_mutex_destroy;
24885de35c9bSChiranjeevi Rapolu 	}
24895de35c9bSChiranjeevi Rapolu 
24905de35c9bSChiranjeevi Rapolu 	ov5670->sd.internal_ops = &ov5670_internal_ops;
24915de35c9bSChiranjeevi Rapolu 	ov5670->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
24925de35c9bSChiranjeevi Rapolu 	ov5670->sd.entity.ops = &ov5670_subdev_entity_ops;
24935de35c9bSChiranjeevi Rapolu 	ov5670->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
24945de35c9bSChiranjeevi Rapolu 
24955de35c9bSChiranjeevi Rapolu 	/* Source pad initialization */
24965de35c9bSChiranjeevi Rapolu 	ov5670->pad.flags = MEDIA_PAD_FL_SOURCE;
24975de35c9bSChiranjeevi Rapolu 	ret = media_entity_pads_init(&ov5670->sd.entity, 1, &ov5670->pad);
24985de35c9bSChiranjeevi Rapolu 	if (ret) {
24995de35c9bSChiranjeevi Rapolu 		err_msg = "media_entity_pads_init() error";
25005de35c9bSChiranjeevi Rapolu 		goto error_handler_free;
25015de35c9bSChiranjeevi Rapolu 	}
25025de35c9bSChiranjeevi Rapolu 
25035de35c9bSChiranjeevi Rapolu 	/* Async register for subdev */
25045de35c9bSChiranjeevi Rapolu 	ret = v4l2_async_register_subdev(&ov5670->sd);
25055de35c9bSChiranjeevi Rapolu 	if (ret < 0) {
25065de35c9bSChiranjeevi Rapolu 		err_msg = "v4l2_async_register_subdev() error";
25075de35c9bSChiranjeevi Rapolu 		goto error_entity_cleanup;
25085de35c9bSChiranjeevi Rapolu 	}
25095de35c9bSChiranjeevi Rapolu 
25105de35c9bSChiranjeevi Rapolu 	ov5670->streaming = false;
25115de35c9bSChiranjeevi Rapolu 
25125de35c9bSChiranjeevi Rapolu 	/*
25135de35c9bSChiranjeevi Rapolu 	 * Device is already turned on by i2c-core with ACPI domain PM.
25145de35c9bSChiranjeevi Rapolu 	 * Enable runtime PM and turn off the device.
25155de35c9bSChiranjeevi Rapolu 	 */
25165de35c9bSChiranjeevi Rapolu 	pm_runtime_get_noresume(&client->dev);
25175de35c9bSChiranjeevi Rapolu 	pm_runtime_set_active(&client->dev);
25185de35c9bSChiranjeevi Rapolu 	pm_runtime_enable(&client->dev);
25195de35c9bSChiranjeevi Rapolu 	pm_runtime_put(&client->dev);
25205de35c9bSChiranjeevi Rapolu 
25215de35c9bSChiranjeevi Rapolu 	return 0;
25225de35c9bSChiranjeevi Rapolu 
25235de35c9bSChiranjeevi Rapolu error_entity_cleanup:
25245de35c9bSChiranjeevi Rapolu 	media_entity_cleanup(&ov5670->sd.entity);
25255de35c9bSChiranjeevi Rapolu 
25265de35c9bSChiranjeevi Rapolu error_handler_free:
25275de35c9bSChiranjeevi Rapolu 	v4l2_ctrl_handler_free(ov5670->sd.ctrl_handler);
25285de35c9bSChiranjeevi Rapolu 
25295de35c9bSChiranjeevi Rapolu error_mutex_destroy:
25305de35c9bSChiranjeevi Rapolu 	mutex_destroy(&ov5670->mutex);
25315de35c9bSChiranjeevi Rapolu 
25325de35c9bSChiranjeevi Rapolu error_print:
25335de35c9bSChiranjeevi Rapolu 	dev_err(&client->dev, "%s: %s %d\n", __func__, err_msg, ret);
25345de35c9bSChiranjeevi Rapolu 
25355de35c9bSChiranjeevi Rapolu 	return ret;
25365de35c9bSChiranjeevi Rapolu }
25375de35c9bSChiranjeevi Rapolu 
25385de35c9bSChiranjeevi Rapolu static int ov5670_remove(struct i2c_client *client)
25395de35c9bSChiranjeevi Rapolu {
25405de35c9bSChiranjeevi Rapolu 	struct v4l2_subdev *sd = i2c_get_clientdata(client);
25415de35c9bSChiranjeevi Rapolu 	struct ov5670 *ov5670 = to_ov5670(sd);
25425de35c9bSChiranjeevi Rapolu 
25435de35c9bSChiranjeevi Rapolu 	v4l2_async_unregister_subdev(sd);
25445de35c9bSChiranjeevi Rapolu 	media_entity_cleanup(&sd->entity);
25455de35c9bSChiranjeevi Rapolu 	v4l2_ctrl_handler_free(sd->ctrl_handler);
25465de35c9bSChiranjeevi Rapolu 	mutex_destroy(&ov5670->mutex);
25475de35c9bSChiranjeevi Rapolu 
25485de35c9bSChiranjeevi Rapolu 	/*
25495de35c9bSChiranjeevi Rapolu 	 * Disable runtime PM but keep the device turned on.
25505de35c9bSChiranjeevi Rapolu 	 * i2c-core with ACPI domain PM will turn off the device.
25515de35c9bSChiranjeevi Rapolu 	 */
25525de35c9bSChiranjeevi Rapolu 	pm_runtime_get_sync(&client->dev);
25535de35c9bSChiranjeevi Rapolu 	pm_runtime_disable(&client->dev);
25545de35c9bSChiranjeevi Rapolu 	pm_runtime_set_suspended(&client->dev);
25555de35c9bSChiranjeevi Rapolu 	pm_runtime_put_noidle(&client->dev);
25565de35c9bSChiranjeevi Rapolu 
25575de35c9bSChiranjeevi Rapolu 	return 0;
25585de35c9bSChiranjeevi Rapolu }
25595de35c9bSChiranjeevi Rapolu 
25605de35c9bSChiranjeevi Rapolu static const struct dev_pm_ops ov5670_pm_ops = {
25615de35c9bSChiranjeevi Rapolu 	SET_SYSTEM_SLEEP_PM_OPS(ov5670_suspend, ov5670_resume)
25625de35c9bSChiranjeevi Rapolu };
25635de35c9bSChiranjeevi Rapolu 
25645de35c9bSChiranjeevi Rapolu #ifdef CONFIG_ACPI
25655de35c9bSChiranjeevi Rapolu static const struct acpi_device_id ov5670_acpi_ids[] = {
25665de35c9bSChiranjeevi Rapolu 	{"INT3479"},
25675de35c9bSChiranjeevi Rapolu 	{ /* sentinel */ }
25685de35c9bSChiranjeevi Rapolu };
25695de35c9bSChiranjeevi Rapolu 
25705de35c9bSChiranjeevi Rapolu MODULE_DEVICE_TABLE(acpi, ov5670_acpi_ids);
25715de35c9bSChiranjeevi Rapolu #endif
25725de35c9bSChiranjeevi Rapolu 
25735de35c9bSChiranjeevi Rapolu static struct i2c_driver ov5670_i2c_driver = {
25745de35c9bSChiranjeevi Rapolu 	.driver = {
25755de35c9bSChiranjeevi Rapolu 		.name = "ov5670",
25765de35c9bSChiranjeevi Rapolu 		.pm = &ov5670_pm_ops,
25775de35c9bSChiranjeevi Rapolu 		.acpi_match_table = ACPI_PTR(ov5670_acpi_ids),
25785de35c9bSChiranjeevi Rapolu 	},
25795de35c9bSChiranjeevi Rapolu 	.probe_new = ov5670_probe,
25805de35c9bSChiranjeevi Rapolu 	.remove = ov5670_remove,
25815de35c9bSChiranjeevi Rapolu };
25825de35c9bSChiranjeevi Rapolu 
25835de35c9bSChiranjeevi Rapolu module_i2c_driver(ov5670_i2c_driver);
25845de35c9bSChiranjeevi Rapolu 
25855de35c9bSChiranjeevi Rapolu MODULE_AUTHOR("Rapolu, Chiranjeevi <chiranjeevi.rapolu@intel.com>");
25865de35c9bSChiranjeevi Rapolu MODULE_AUTHOR("Yang, Hyungwoo <hyungwoo.yang@intel.com>");
25875de35c9bSChiranjeevi Rapolu MODULE_DESCRIPTION("Omnivision ov5670 sensor driver");
25885de35c9bSChiranjeevi Rapolu MODULE_LICENSE("GPL v2");
2589