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