xref: /openbmc/linux/drivers/media/i2c/ov08x40.c (revision 2cd17b9b)
138fc5136SShawn Tu // SPDX-License-Identifier: GPL-2.0
238fc5136SShawn Tu // Copyright (c) 2022 Intel Corporation.
338fc5136SShawn Tu 
438fc5136SShawn Tu #include <linux/acpi.h>
538fc5136SShawn Tu #include <linux/i2c.h>
638fc5136SShawn Tu #include <linux/module.h>
738fc5136SShawn Tu #include <linux/delay.h>
838fc5136SShawn Tu #include <linux/pm_runtime.h>
938fc5136SShawn Tu #include <media/v4l2-ctrls.h>
1038fc5136SShawn Tu #include <media/v4l2-device.h>
1138fc5136SShawn Tu #include <media/v4l2-fwnode.h>
1238fc5136SShawn Tu 
1338fc5136SShawn Tu #define OV08X40_REG_VALUE_08BIT		1
1438fc5136SShawn Tu #define OV08X40_REG_VALUE_16BIT		2
1538fc5136SShawn Tu #define OV08X40_REG_VALUE_24BIT		3
1638fc5136SShawn Tu 
1738fc5136SShawn Tu #define OV08X40_REG_MODE_SELECT		0x0100
1838fc5136SShawn Tu #define OV08X40_MODE_STANDBY		0x00
1938fc5136SShawn Tu #define OV08X40_MODE_STREAMING		0x01
2038fc5136SShawn Tu 
2138fc5136SShawn Tu #define OV08X40_REG_AO_STANDBY		0x1000
2238fc5136SShawn Tu #define OV08X40_AO_STREAMING		0x04
2338fc5136SShawn Tu 
2438fc5136SShawn Tu #define OV08X40_REG_MS_SELECT		0x1001
2538fc5136SShawn Tu #define OV08X40_MS_STANDBY			0x00
2638fc5136SShawn Tu #define OV08X40_MS_STREAMING		0x04
2738fc5136SShawn Tu 
2838fc5136SShawn Tu #define OV08X40_REG_SOFTWARE_RST	0x0103
2938fc5136SShawn Tu #define OV08X40_SOFTWARE_RST		0x01
3038fc5136SShawn Tu 
3138fc5136SShawn Tu /* Chip ID */
3238fc5136SShawn Tu #define OV08X40_REG_CHIP_ID		0x300a
3338fc5136SShawn Tu #define OV08X40_CHIP_ID			0x560858
3438fc5136SShawn Tu 
3538fc5136SShawn Tu /* V_TIMING internal */
3638fc5136SShawn Tu #define OV08X40_REG_VTS			0x380e
3738fc5136SShawn Tu #define OV08X40_VTS_30FPS		0x1388
3838fc5136SShawn Tu #define OV08X40_VTS_BIN_30FPS		0x115c
3938fc5136SShawn Tu #define OV08X40_VTS_MAX			0x7fff
4038fc5136SShawn Tu 
4138fc5136SShawn Tu /* H TIMING internal */
4238fc5136SShawn Tu #define OV08X40_REG_HTS			0x380c
4338fc5136SShawn Tu #define OV08X40_HTS_30FPS		0x0280
4438fc5136SShawn Tu 
4538fc5136SShawn Tu /* Exposure control */
4638fc5136SShawn Tu #define OV08X40_REG_EXPOSURE		0x3500
4738fc5136SShawn Tu #define OV08X40_EXPOSURE_MAX_MARGIN 31
4838fc5136SShawn Tu #define OV08X40_EXPOSURE_MIN		1
4938fc5136SShawn Tu #define OV08X40_EXPOSURE_STEP		1
5038fc5136SShawn Tu #define OV08X40_EXPOSURE_DEFAULT	0x40
5138fc5136SShawn Tu 
5238fc5136SShawn Tu /* Short Exposure control */
5338fc5136SShawn Tu #define OV08X40_REG_SHORT_EXPOSURE	0x3540
5438fc5136SShawn Tu 
5538fc5136SShawn Tu /* Analog gain control */
5638fc5136SShawn Tu #define OV08X40_REG_ANALOG_GAIN		0x3508
5738fc5136SShawn Tu #define OV08X40_ANA_GAIN_MIN		0x80
5838fc5136SShawn Tu #define OV08X40_ANA_GAIN_MAX		0x07c0
5938fc5136SShawn Tu #define OV08X40_ANA_GAIN_STEP		1
6038fc5136SShawn Tu #define OV08X40_ANA_GAIN_DEFAULT	0x80
6138fc5136SShawn Tu 
6238fc5136SShawn Tu /* Digital gain control */
6338fc5136SShawn Tu #define OV08X40_REG_DGTL_GAIN_H		0x350a
6438fc5136SShawn Tu #define OV08X40_REG_DGTL_GAIN_M		0x350b
6538fc5136SShawn Tu #define OV08X40_REG_DGTL_GAIN_L		0x350c
6638fc5136SShawn Tu 
6738fc5136SShawn Tu #define OV08X40_DGTL_GAIN_MIN		1024	     /* Min = 1 X */
6838fc5136SShawn Tu #define OV08X40_DGTL_GAIN_MAX		(4096 - 1)   /* Max = 4 X */
6938fc5136SShawn Tu #define OV08X40_DGTL_GAIN_DEFAULT	2560	     /* Default gain = 2.5 X */
7038fc5136SShawn Tu #define OV08X40_DGTL_GAIN_STEP		1            /* Each step = 1/1024 */
7138fc5136SShawn Tu 
7238fc5136SShawn Tu #define OV08X40_DGTL_GAIN_L_SHIFT	6
7338fc5136SShawn Tu #define OV08X40_DGTL_GAIN_L_MASK	0x3
7438fc5136SShawn Tu #define OV08X40_DGTL_GAIN_M_SHIFT	2
7538fc5136SShawn Tu #define OV08X40_DGTL_GAIN_M_MASK	0xff
7638fc5136SShawn Tu #define OV08X40_DGTL_GAIN_H_SHIFT	10
7738fc5136SShawn Tu #define OV08X40_DGTL_GAIN_H_MASK	0x1F
7838fc5136SShawn Tu 
7938fc5136SShawn Tu /* Test Pattern Control */
8038fc5136SShawn Tu #define OV08X40_REG_TEST_PATTERN	0x50C1
8138fc5136SShawn Tu #define OV08X40_REG_ISP             0x5000
8238fc5136SShawn Tu #define OV08X40_REG_SHORT_TEST_PATTERN  0x53C1
8338fc5136SShawn Tu #define OV08X40_TEST_PATTERN_ENABLE	BIT(0)
8438fc5136SShawn Tu #define OV08X40_TEST_PATTERN_MASK	0xcf
8538fc5136SShawn Tu #define OV08X40_TEST_PATTERN_BAR_SHIFT	4
8638fc5136SShawn Tu 
8738fc5136SShawn Tu /* Flip Control */
8838fc5136SShawn Tu #define OV08X40_REG_VFLIP		0x3820
8938fc5136SShawn Tu #define OV08X40_REG_MIRROR		0x3821
9038fc5136SShawn Tu 
9138fc5136SShawn Tu /* Horizontal Window Offset */
9238fc5136SShawn Tu #define OV08X40_REG_H_WIN_OFFSET	0x3811
9338fc5136SShawn Tu 
9438fc5136SShawn Tu /* Vertical Window Offset */
9538fc5136SShawn Tu #define OV08X40_REG_V_WIN_OFFSET	0x3813
9638fc5136SShawn Tu 
9738fc5136SShawn Tu enum {
9838fc5136SShawn Tu 	OV08X40_LINK_FREQ_400MHZ_INDEX,
9938fc5136SShawn Tu };
10038fc5136SShawn Tu 
10138fc5136SShawn Tu struct ov08x40_reg {
10238fc5136SShawn Tu 	u16 address;
10338fc5136SShawn Tu 	u8 val;
10438fc5136SShawn Tu };
10538fc5136SShawn Tu 
10638fc5136SShawn Tu struct ov08x40_reg_list {
10738fc5136SShawn Tu 	u32 num_of_regs;
10838fc5136SShawn Tu 	const struct ov08x40_reg *regs;
10938fc5136SShawn Tu };
11038fc5136SShawn Tu 
11138fc5136SShawn Tu /* Link frequency config */
11238fc5136SShawn Tu struct ov08x40_link_freq_config {
11338fc5136SShawn Tu 	/* registers for this link frequency */
11438fc5136SShawn Tu 	struct ov08x40_reg_list reg_list;
11538fc5136SShawn Tu };
11638fc5136SShawn Tu 
11738fc5136SShawn Tu /* Mode : resolution and related config&values */
11838fc5136SShawn Tu struct ov08x40_mode {
11938fc5136SShawn Tu 	/* Frame width */
12038fc5136SShawn Tu 	u32 width;
12138fc5136SShawn Tu 	/* Frame height */
12238fc5136SShawn Tu 	u32 height;
12338fc5136SShawn Tu 
12438fc5136SShawn Tu 	u32 lanes;
12538fc5136SShawn Tu 	/* V-timing */
12638fc5136SShawn Tu 	u32 vts_def;
12738fc5136SShawn Tu 	u32 vts_min;
12838fc5136SShawn Tu 
129*2cd17b9bSJason Chen 	/* HTS */
130*2cd17b9bSJason Chen 	u32 hts;
131*2cd17b9bSJason Chen 
13238fc5136SShawn Tu 	/* Index of Link frequency config to be used */
13338fc5136SShawn Tu 	u32 link_freq_index;
13438fc5136SShawn Tu 	/* Default register values */
13538fc5136SShawn Tu 	struct ov08x40_reg_list reg_list;
13638fc5136SShawn Tu };
13738fc5136SShawn Tu 
13838fc5136SShawn Tu static const struct ov08x40_reg mipi_data_rate_800mbps[] = {
13938fc5136SShawn Tu 	{0x0103, 0x01},
14038fc5136SShawn Tu 	{0x1000, 0x00},
14138fc5136SShawn Tu 	{0x1601, 0xd0},
14238fc5136SShawn Tu 	{0x1001, 0x04},
14338fc5136SShawn Tu 	{0x5004, 0x53},
14438fc5136SShawn Tu 	{0x5110, 0x00},
14538fc5136SShawn Tu 	{0x5111, 0x14},
14638fc5136SShawn Tu 	{0x5112, 0x01},
14738fc5136SShawn Tu 	{0x5113, 0x7b},
14838fc5136SShawn Tu 	{0x5114, 0x00},
14938fc5136SShawn Tu 	{0x5152, 0xa3},
15038fc5136SShawn Tu 	{0x5a52, 0x1f},
15138fc5136SShawn Tu 	{0x5a1a, 0x0e},
15238fc5136SShawn Tu 	{0x5a1b, 0x10},
15338fc5136SShawn Tu 	{0x5a1f, 0x0e},
15438fc5136SShawn Tu 	{0x5a27, 0x0e},
15538fc5136SShawn Tu 	{0x6002, 0x2e},
15638fc5136SShawn Tu };
15738fc5136SShawn Tu 
15838fc5136SShawn Tu static const struct ov08x40_reg mode_3856x2416_regs[] = {
15938fc5136SShawn Tu 	{0x5000, 0x5d},
16038fc5136SShawn Tu 	{0x5001, 0x20},
16138fc5136SShawn Tu 	{0x5008, 0xb0},
16238fc5136SShawn Tu 	{0x50c1, 0x00},
16338fc5136SShawn Tu 	{0x53c1, 0x00},
16438fc5136SShawn Tu 	{0x5f40, 0x00},
16538fc5136SShawn Tu 	{0x5f41, 0x40},
16638fc5136SShawn Tu 	{0x0300, 0x3a},
16738fc5136SShawn Tu 	{0x0301, 0xc8},
16838fc5136SShawn Tu 	{0x0302, 0x31},
16938fc5136SShawn Tu 	{0x0303, 0x03},
17038fc5136SShawn Tu 	{0x0304, 0x01},
17138fc5136SShawn Tu 	{0x0305, 0xa1},
17238fc5136SShawn Tu 	{0x0306, 0x04},
17338fc5136SShawn Tu 	{0x0307, 0x01},
17438fc5136SShawn Tu 	{0x0308, 0x03},
17538fc5136SShawn Tu 	{0x0309, 0x03},
17638fc5136SShawn Tu 	{0x0310, 0x0a},
17738fc5136SShawn Tu 	{0x0311, 0x02},
17838fc5136SShawn Tu 	{0x0312, 0x01},
17938fc5136SShawn Tu 	{0x0313, 0x08},
18038fc5136SShawn Tu 	{0x0314, 0x66},
18138fc5136SShawn Tu 	{0x0315, 0x00},
18238fc5136SShawn Tu 	{0x0316, 0x34},
18338fc5136SShawn Tu 	{0x0320, 0x02},
18438fc5136SShawn Tu 	{0x0321, 0x03},
18538fc5136SShawn Tu 	{0x0323, 0x05},
18638fc5136SShawn Tu 	{0x0324, 0x01},
18738fc5136SShawn Tu 	{0x0325, 0xb8},
18838fc5136SShawn Tu 	{0x0326, 0x4a},
18938fc5136SShawn Tu 	{0x0327, 0x04},
19038fc5136SShawn Tu 	{0x0329, 0x00},
19138fc5136SShawn Tu 	{0x032a, 0x05},
19238fc5136SShawn Tu 	{0x032b, 0x00},
19338fc5136SShawn Tu 	{0x032c, 0x00},
19438fc5136SShawn Tu 	{0x032d, 0x00},
19538fc5136SShawn Tu 	{0x032e, 0x02},
19638fc5136SShawn Tu 	{0x032f, 0xa0},
19738fc5136SShawn Tu 	{0x0350, 0x00},
19838fc5136SShawn Tu 	{0x0360, 0x01},
19938fc5136SShawn Tu 	{0x1216, 0x60},
20038fc5136SShawn Tu 	{0x1217, 0x5b},
20138fc5136SShawn Tu 	{0x1218, 0x00},
20238fc5136SShawn Tu 	{0x1220, 0x24},
20338fc5136SShawn Tu 	{0x198a, 0x00},
20438fc5136SShawn Tu 	{0x198b, 0x01},
20538fc5136SShawn Tu 	{0x198e, 0x00},
20638fc5136SShawn Tu 	{0x198f, 0x01},
20738fc5136SShawn Tu 	{0x3009, 0x04},
20838fc5136SShawn Tu 	{0x3012, 0x41},
20938fc5136SShawn Tu 	{0x3015, 0x00},
21038fc5136SShawn Tu 	{0x3016, 0xb0},
21138fc5136SShawn Tu 	{0x3017, 0xf0},
21238fc5136SShawn Tu 	{0x3018, 0xf0},
21338fc5136SShawn Tu 	{0x3019, 0xd2},
21438fc5136SShawn Tu 	{0x301a, 0xb0},
21538fc5136SShawn Tu 	{0x301c, 0x81},
21638fc5136SShawn Tu 	{0x301d, 0x02},
21738fc5136SShawn Tu 	{0x301e, 0x80},
21838fc5136SShawn Tu 	{0x3022, 0xf0},
21938fc5136SShawn Tu 	{0x3025, 0x89},
22038fc5136SShawn Tu 	{0x3030, 0x03},
22138fc5136SShawn Tu 	{0x3044, 0xc2},
22238fc5136SShawn Tu 	{0x3050, 0x35},
22338fc5136SShawn Tu 	{0x3051, 0x60},
22438fc5136SShawn Tu 	{0x3052, 0x25},
22538fc5136SShawn Tu 	{0x3053, 0x00},
22638fc5136SShawn Tu 	{0x3054, 0x00},
22738fc5136SShawn Tu 	{0x3055, 0x02},
22838fc5136SShawn Tu 	{0x3056, 0x80},
22938fc5136SShawn Tu 	{0x3057, 0x80},
23038fc5136SShawn Tu 	{0x3058, 0x80},
23138fc5136SShawn Tu 	{0x3059, 0x00},
23238fc5136SShawn Tu 	{0x3107, 0x86},
23338fc5136SShawn Tu 	{0x3400, 0x1c},
23438fc5136SShawn Tu 	{0x3401, 0x80},
23538fc5136SShawn Tu 	{0x3402, 0x8c},
23638fc5136SShawn Tu 	{0x3419, 0x13},
23738fc5136SShawn Tu 	{0x341a, 0x89},
23838fc5136SShawn Tu 	{0x341b, 0x30},
23938fc5136SShawn Tu 	{0x3420, 0x00},
24038fc5136SShawn Tu 	{0x3421, 0x00},
24138fc5136SShawn Tu 	{0x3422, 0x00},
24238fc5136SShawn Tu 	{0x3423, 0x00},
24338fc5136SShawn Tu 	{0x3424, 0x00},
24438fc5136SShawn Tu 	{0x3425, 0x00},
24538fc5136SShawn Tu 	{0x3426, 0x00},
24638fc5136SShawn Tu 	{0x3427, 0x00},
24738fc5136SShawn Tu 	{0x3428, 0x0f},
24838fc5136SShawn Tu 	{0x3429, 0x00},
24938fc5136SShawn Tu 	{0x342a, 0x00},
25038fc5136SShawn Tu 	{0x342b, 0x00},
25138fc5136SShawn Tu 	{0x342c, 0x00},
25238fc5136SShawn Tu 	{0x342d, 0x00},
25338fc5136SShawn Tu 	{0x342e, 0x00},
25438fc5136SShawn Tu 	{0x342f, 0x11},
25538fc5136SShawn Tu 	{0x3430, 0x11},
25638fc5136SShawn Tu 	{0x3431, 0x10},
25738fc5136SShawn Tu 	{0x3432, 0x00},
25838fc5136SShawn Tu 	{0x3433, 0x00},
25938fc5136SShawn Tu 	{0x3434, 0x00},
26038fc5136SShawn Tu 	{0x3435, 0x00},
26138fc5136SShawn Tu 	{0x3436, 0x00},
26238fc5136SShawn Tu 	{0x3437, 0x00},
26338fc5136SShawn Tu 	{0x3442, 0x02},
26438fc5136SShawn Tu 	{0x3443, 0x02},
26538fc5136SShawn Tu 	{0x3444, 0x07},
26638fc5136SShawn Tu 	{0x3450, 0x00},
26738fc5136SShawn Tu 	{0x3451, 0x00},
26838fc5136SShawn Tu 	{0x3452, 0x18},
26938fc5136SShawn Tu 	{0x3453, 0x18},
27038fc5136SShawn Tu 	{0x3454, 0x00},
27138fc5136SShawn Tu 	{0x3455, 0x80},
27238fc5136SShawn Tu 	{0x3456, 0x08},
27338fc5136SShawn Tu 	{0x3500, 0x00},
27438fc5136SShawn Tu 	{0x3501, 0x02},
27538fc5136SShawn Tu 	{0x3502, 0x00},
27638fc5136SShawn Tu 	{0x3504, 0x4c},
27738fc5136SShawn Tu 	{0x3506, 0x30},
27838fc5136SShawn Tu 	{0x3507, 0x00},
27938fc5136SShawn Tu 	{0x3508, 0x01},
28038fc5136SShawn Tu 	{0x3509, 0x00},
28138fc5136SShawn Tu 	{0x350a, 0x01},
28238fc5136SShawn Tu 	{0x350b, 0x00},
28338fc5136SShawn Tu 	{0x350c, 0x00},
28438fc5136SShawn Tu 	{0x3540, 0x00},
28538fc5136SShawn Tu 	{0x3541, 0x01},
28638fc5136SShawn Tu 	{0x3542, 0x00},
28738fc5136SShawn Tu 	{0x3544, 0x4c},
28838fc5136SShawn Tu 	{0x3546, 0x30},
28938fc5136SShawn Tu 	{0x3547, 0x00},
29038fc5136SShawn Tu 	{0x3548, 0x01},
29138fc5136SShawn Tu 	{0x3549, 0x00},
29238fc5136SShawn Tu 	{0x354a, 0x01},
29338fc5136SShawn Tu 	{0x354b, 0x00},
29438fc5136SShawn Tu 	{0x354c, 0x00},
29538fc5136SShawn Tu 	{0x3688, 0x02},
29638fc5136SShawn Tu 	{0x368a, 0x2e},
29738fc5136SShawn Tu 	{0x368e, 0x71},
29838fc5136SShawn Tu 	{0x3696, 0xd1},
29938fc5136SShawn Tu 	{0x3699, 0x00},
30038fc5136SShawn Tu 	{0x369a, 0x00},
30138fc5136SShawn Tu 	{0x36a4, 0x00},
30238fc5136SShawn Tu 	{0x36a6, 0x00},
30338fc5136SShawn Tu 	{0x3711, 0x00},
30438fc5136SShawn Tu 	{0x3712, 0x51},
30538fc5136SShawn Tu 	{0x3713, 0x00},
30638fc5136SShawn Tu 	{0x3714, 0x24},
30738fc5136SShawn Tu 	{0x3716, 0x00},
30838fc5136SShawn Tu 	{0x3718, 0x07},
30938fc5136SShawn Tu 	{0x371a, 0x1c},
31038fc5136SShawn Tu 	{0x371b, 0x00},
31138fc5136SShawn Tu 	{0x3720, 0x08},
31238fc5136SShawn Tu 	{0x3725, 0x32},
31338fc5136SShawn Tu 	{0x3727, 0x05},
31438fc5136SShawn Tu 	{0x3760, 0x02},
31538fc5136SShawn Tu 	{0x3761, 0x17},
31638fc5136SShawn Tu 	{0x3762, 0x02},
31738fc5136SShawn Tu 	{0x3763, 0x02},
31838fc5136SShawn Tu 	{0x3764, 0x02},
31938fc5136SShawn Tu 	{0x3765, 0x2c},
32038fc5136SShawn Tu 	{0x3766, 0x04},
32138fc5136SShawn Tu 	{0x3767, 0x2c},
32238fc5136SShawn Tu 	{0x3768, 0x02},
32338fc5136SShawn Tu 	{0x3769, 0x00},
32438fc5136SShawn Tu 	{0x376b, 0x20},
32538fc5136SShawn Tu 	{0x376e, 0x03},
32638fc5136SShawn Tu 	{0x37b0, 0x00},
32738fc5136SShawn Tu 	{0x37b1, 0xab},
32838fc5136SShawn Tu 	{0x37b2, 0x01},
32938fc5136SShawn Tu 	{0x37b3, 0x82},
33038fc5136SShawn Tu 	{0x37b4, 0x00},
33138fc5136SShawn Tu 	{0x37b5, 0xe4},
33238fc5136SShawn Tu 	{0x37b6, 0x01},
33338fc5136SShawn Tu 	{0x37b7, 0xee},
33438fc5136SShawn Tu 	{0x3800, 0x00},
33538fc5136SShawn Tu 	{0x3801, 0x00},
33638fc5136SShawn Tu 	{0x3802, 0x00},
33738fc5136SShawn Tu 	{0x3803, 0x00},
33838fc5136SShawn Tu 	{0x3804, 0x0f},
33938fc5136SShawn Tu 	{0x3805, 0x1f},
34038fc5136SShawn Tu 	{0x3806, 0x09},
34138fc5136SShawn Tu 	{0x3807, 0x7f},
34238fc5136SShawn Tu 	{0x3808, 0x0f},
34338fc5136SShawn Tu 	{0x3809, 0x10},
34438fc5136SShawn Tu 	{0x380a, 0x09},
34538fc5136SShawn Tu 	{0x380b, 0x70},
34638fc5136SShawn Tu 	{0x380c, 0x02},
34738fc5136SShawn Tu 	{0x380d, 0x80},
34838fc5136SShawn Tu 	{0x380e, 0x13},
34938fc5136SShawn Tu 	{0x380f, 0x88},
35038fc5136SShawn Tu 	{0x3810, 0x00},
35138fc5136SShawn Tu 	{0x3811, 0x08},
35238fc5136SShawn Tu 	{0x3812, 0x00},
35338fc5136SShawn Tu 	{0x3813, 0x07},
35438fc5136SShawn Tu 	{0x3814, 0x11},
35538fc5136SShawn Tu 	{0x3815, 0x11},
35638fc5136SShawn Tu 	{0x3820, 0x00},
35738fc5136SShawn Tu 	{0x3821, 0x04},
35838fc5136SShawn Tu 	{0x3822, 0x00},
35938fc5136SShawn Tu 	{0x3823, 0x04},
36038fc5136SShawn Tu 	{0x3828, 0x0f},
36138fc5136SShawn Tu 	{0x382a, 0x80},
36238fc5136SShawn Tu 	{0x382e, 0x41},
36338fc5136SShawn Tu 	{0x3837, 0x08},
36438fc5136SShawn Tu 	{0x383a, 0x81},
36538fc5136SShawn Tu 	{0x383b, 0x81},
36638fc5136SShawn Tu 	{0x383c, 0x11},
36738fc5136SShawn Tu 	{0x383d, 0x11},
36838fc5136SShawn Tu 	{0x383e, 0x00},
36938fc5136SShawn Tu 	{0x383f, 0x38},
37038fc5136SShawn Tu 	{0x3840, 0x00},
37138fc5136SShawn Tu 	{0x3847, 0x00},
37238fc5136SShawn Tu 	{0x384a, 0x00},
37338fc5136SShawn Tu 	{0x384c, 0x02},
37438fc5136SShawn Tu 	{0x384d, 0x80},
37538fc5136SShawn Tu 	{0x3856, 0x50},
37638fc5136SShawn Tu 	{0x3857, 0x30},
37738fc5136SShawn Tu 	{0x3858, 0x80},
37838fc5136SShawn Tu 	{0x3859, 0x40},
37938fc5136SShawn Tu 	{0x3860, 0x00},
38038fc5136SShawn Tu 	{0x3888, 0x00},
38138fc5136SShawn Tu 	{0x3889, 0x00},
38238fc5136SShawn Tu 	{0x388a, 0x00},
38338fc5136SShawn Tu 	{0x388b, 0x00},
38438fc5136SShawn Tu 	{0x388c, 0x00},
38538fc5136SShawn Tu 	{0x388d, 0x00},
38638fc5136SShawn Tu 	{0x388e, 0x00},
38738fc5136SShawn Tu 	{0x388f, 0x00},
38838fc5136SShawn Tu 	{0x3894, 0x00},
38938fc5136SShawn Tu 	{0x3895, 0x00},
39038fc5136SShawn Tu 	{0x3c84, 0x00},
39138fc5136SShawn Tu 	{0x3d85, 0x8b},
39238fc5136SShawn Tu 	{0x3daa, 0x80},
39338fc5136SShawn Tu 	{0x3dab, 0x14},
39438fc5136SShawn Tu 	{0x3dac, 0x80},
39538fc5136SShawn Tu 	{0x3dad, 0xc8},
39638fc5136SShawn Tu 	{0x3dae, 0x81},
39738fc5136SShawn Tu 	{0x3daf, 0x7b},
39838fc5136SShawn Tu 	{0x3f00, 0x10},
39938fc5136SShawn Tu 	{0x3f01, 0x11},
40038fc5136SShawn Tu 	{0x3f06, 0x0d},
40138fc5136SShawn Tu 	{0x3f07, 0x0b},
40238fc5136SShawn Tu 	{0x3f08, 0x0d},
40338fc5136SShawn Tu 	{0x3f09, 0x0b},
40438fc5136SShawn Tu 	{0x3f0a, 0x01},
40538fc5136SShawn Tu 	{0x3f0b, 0x11},
40638fc5136SShawn Tu 	{0x3f0c, 0x33},
40738fc5136SShawn Tu 	{0x4001, 0x07},
40838fc5136SShawn Tu 	{0x4007, 0x20},
40938fc5136SShawn Tu 	{0x4008, 0x00},
41038fc5136SShawn Tu 	{0x4009, 0x05},
41138fc5136SShawn Tu 	{0x400a, 0x00},
41238fc5136SShawn Tu 	{0x400b, 0x08},
41338fc5136SShawn Tu 	{0x400c, 0x00},
41438fc5136SShawn Tu 	{0x400d, 0x08},
41538fc5136SShawn Tu 	{0x400e, 0x14},
41638fc5136SShawn Tu 	{0x4010, 0xf4},
41738fc5136SShawn Tu 	{0x4011, 0x03},
41838fc5136SShawn Tu 	{0x4012, 0x55},
41938fc5136SShawn Tu 	{0x4015, 0x00},
42038fc5136SShawn Tu 	{0x4016, 0x2d},
42138fc5136SShawn Tu 	{0x4017, 0x00},
42238fc5136SShawn Tu 	{0x4018, 0x0f},
42338fc5136SShawn Tu 	{0x401b, 0x08},
42438fc5136SShawn Tu 	{0x401c, 0x00},
42538fc5136SShawn Tu 	{0x401d, 0x10},
42638fc5136SShawn Tu 	{0x401e, 0x02},
42738fc5136SShawn Tu 	{0x401f, 0x00},
42838fc5136SShawn Tu 	{0x4050, 0x06},
42938fc5136SShawn Tu 	{0x4051, 0xff},
43038fc5136SShawn Tu 	{0x4052, 0xff},
43138fc5136SShawn Tu 	{0x4053, 0xff},
43238fc5136SShawn Tu 	{0x4054, 0xff},
43338fc5136SShawn Tu 	{0x4055, 0xff},
43438fc5136SShawn Tu 	{0x4056, 0xff},
43538fc5136SShawn Tu 	{0x4057, 0x7f},
43638fc5136SShawn Tu 	{0x4058, 0x00},
43738fc5136SShawn Tu 	{0x4059, 0x00},
43838fc5136SShawn Tu 	{0x405a, 0x00},
43938fc5136SShawn Tu 	{0x405b, 0x00},
44038fc5136SShawn Tu 	{0x405c, 0x07},
44138fc5136SShawn Tu 	{0x405d, 0xff},
44238fc5136SShawn Tu 	{0x405e, 0x07},
44338fc5136SShawn Tu 	{0x405f, 0xff},
44438fc5136SShawn Tu 	{0x4080, 0x78},
44538fc5136SShawn Tu 	{0x4081, 0x78},
44638fc5136SShawn Tu 	{0x4082, 0x78},
44738fc5136SShawn Tu 	{0x4083, 0x78},
44838fc5136SShawn Tu 	{0x4019, 0x00},
44938fc5136SShawn Tu 	{0x401a, 0x40},
45038fc5136SShawn Tu 	{0x4020, 0x04},
45138fc5136SShawn Tu 	{0x4021, 0x00},
45238fc5136SShawn Tu 	{0x4022, 0x04},
45338fc5136SShawn Tu 	{0x4023, 0x00},
45438fc5136SShawn Tu 	{0x4024, 0x04},
45538fc5136SShawn Tu 	{0x4025, 0x00},
45638fc5136SShawn Tu 	{0x4026, 0x04},
45738fc5136SShawn Tu 	{0x4027, 0x00},
45838fc5136SShawn Tu 	{0x4030, 0x00},
45938fc5136SShawn Tu 	{0x4031, 0x00},
46038fc5136SShawn Tu 	{0x4032, 0x00},
46138fc5136SShawn Tu 	{0x4033, 0x00},
46238fc5136SShawn Tu 	{0x4034, 0x00},
46338fc5136SShawn Tu 	{0x4035, 0x00},
46438fc5136SShawn Tu 	{0x4036, 0x00},
46538fc5136SShawn Tu 	{0x4037, 0x00},
46638fc5136SShawn Tu 	{0x4040, 0x00},
46738fc5136SShawn Tu 	{0x4041, 0x80},
46838fc5136SShawn Tu 	{0x4042, 0x00},
46938fc5136SShawn Tu 	{0x4043, 0x80},
47038fc5136SShawn Tu 	{0x4044, 0x00},
47138fc5136SShawn Tu 	{0x4045, 0x80},
47238fc5136SShawn Tu 	{0x4046, 0x00},
47338fc5136SShawn Tu 	{0x4047, 0x80},
47438fc5136SShawn Tu 	{0x4060, 0x00},
47538fc5136SShawn Tu 	{0x4061, 0x00},
47638fc5136SShawn Tu 	{0x4062, 0x00},
47738fc5136SShawn Tu 	{0x4063, 0x00},
47838fc5136SShawn Tu 	{0x4064, 0x00},
47938fc5136SShawn Tu 	{0x4065, 0x00},
48038fc5136SShawn Tu 	{0x4066, 0x00},
48138fc5136SShawn Tu 	{0x4067, 0x00},
48238fc5136SShawn Tu 	{0x4068, 0x00},
48338fc5136SShawn Tu 	{0x4069, 0x00},
48438fc5136SShawn Tu 	{0x406a, 0x00},
48538fc5136SShawn Tu 	{0x406b, 0x00},
48638fc5136SShawn Tu 	{0x406c, 0x00},
48738fc5136SShawn Tu 	{0x406d, 0x00},
48838fc5136SShawn Tu 	{0x406e, 0x00},
48938fc5136SShawn Tu 	{0x406f, 0x00},
49038fc5136SShawn Tu 	{0x4070, 0x00},
49138fc5136SShawn Tu 	{0x4071, 0x00},
49238fc5136SShawn Tu 	{0x4072, 0x00},
49338fc5136SShawn Tu 	{0x4073, 0x00},
49438fc5136SShawn Tu 	{0x4074, 0x00},
49538fc5136SShawn Tu 	{0x4075, 0x00},
49638fc5136SShawn Tu 	{0x4076, 0x00},
49738fc5136SShawn Tu 	{0x4077, 0x00},
49838fc5136SShawn Tu 	{0x4078, 0x00},
49938fc5136SShawn Tu 	{0x4079, 0x00},
50038fc5136SShawn Tu 	{0x407a, 0x00},
50138fc5136SShawn Tu 	{0x407b, 0x00},
50238fc5136SShawn Tu 	{0x407c, 0x00},
50338fc5136SShawn Tu 	{0x407d, 0x00},
50438fc5136SShawn Tu 	{0x407e, 0x00},
50538fc5136SShawn Tu 	{0x407f, 0x00},
50638fc5136SShawn Tu 	{0x40e0, 0x00},
50738fc5136SShawn Tu 	{0x40e1, 0x00},
50838fc5136SShawn Tu 	{0x40e2, 0x00},
50938fc5136SShawn Tu 	{0x40e3, 0x00},
51038fc5136SShawn Tu 	{0x40e4, 0x00},
51138fc5136SShawn Tu 	{0x40e5, 0x00},
51238fc5136SShawn Tu 	{0x40e6, 0x00},
51338fc5136SShawn Tu 	{0x40e7, 0x00},
51438fc5136SShawn Tu 	{0x40e8, 0x00},
51538fc5136SShawn Tu 	{0x40e9, 0x80},
51638fc5136SShawn Tu 	{0x40ea, 0x00},
51738fc5136SShawn Tu 	{0x40eb, 0x80},
51838fc5136SShawn Tu 	{0x40ec, 0x00},
51938fc5136SShawn Tu 	{0x40ed, 0x80},
52038fc5136SShawn Tu 	{0x40ee, 0x00},
52138fc5136SShawn Tu 	{0x40ef, 0x80},
52238fc5136SShawn Tu 	{0x40f0, 0x02},
52338fc5136SShawn Tu 	{0x40f1, 0x04},
52438fc5136SShawn Tu 	{0x4300, 0x00},
52538fc5136SShawn Tu 	{0x4301, 0x00},
52638fc5136SShawn Tu 	{0x4302, 0x00},
52738fc5136SShawn Tu 	{0x4303, 0x00},
52838fc5136SShawn Tu 	{0x4304, 0x00},
52938fc5136SShawn Tu 	{0x4305, 0x00},
53038fc5136SShawn Tu 	{0x4306, 0x00},
53138fc5136SShawn Tu 	{0x4307, 0x00},
53238fc5136SShawn Tu 	{0x4308, 0x00},
53338fc5136SShawn Tu 	{0x4309, 0x00},
53438fc5136SShawn Tu 	{0x430a, 0x00},
53538fc5136SShawn Tu 	{0x430b, 0xff},
53638fc5136SShawn Tu 	{0x430c, 0xff},
53738fc5136SShawn Tu 	{0x430d, 0x00},
53838fc5136SShawn Tu 	{0x430e, 0x00},
53938fc5136SShawn Tu 	{0x4315, 0x00},
54038fc5136SShawn Tu 	{0x4316, 0x00},
54138fc5136SShawn Tu 	{0x4317, 0x00},
54238fc5136SShawn Tu 	{0x4318, 0x00},
54338fc5136SShawn Tu 	{0x4319, 0x00},
54438fc5136SShawn Tu 	{0x431a, 0x00},
54538fc5136SShawn Tu 	{0x431b, 0x00},
54638fc5136SShawn Tu 	{0x431c, 0x00},
54738fc5136SShawn Tu 	{0x4500, 0x07},
54838fc5136SShawn Tu 	{0x4501, 0x00},
54938fc5136SShawn Tu 	{0x4502, 0x00},
55038fc5136SShawn Tu 	{0x4503, 0x0f},
55138fc5136SShawn Tu 	{0x4504, 0x80},
55238fc5136SShawn Tu 	{0x4506, 0x01},
55338fc5136SShawn Tu 	{0x4509, 0x05},
55438fc5136SShawn Tu 	{0x450c, 0x00},
55538fc5136SShawn Tu 	{0x450d, 0x20},
55638fc5136SShawn Tu 	{0x450e, 0x00},
55738fc5136SShawn Tu 	{0x450f, 0x00},
55838fc5136SShawn Tu 	{0x4510, 0x00},
55938fc5136SShawn Tu 	{0x4523, 0x00},
56038fc5136SShawn Tu 	{0x4526, 0x00},
56138fc5136SShawn Tu 	{0x4542, 0x00},
56238fc5136SShawn Tu 	{0x4543, 0x00},
56338fc5136SShawn Tu 	{0x4544, 0x00},
56438fc5136SShawn Tu 	{0x4545, 0x00},
56538fc5136SShawn Tu 	{0x4546, 0x00},
56638fc5136SShawn Tu 	{0x4547, 0x10},
56738fc5136SShawn Tu 	{0x4602, 0x00},
56838fc5136SShawn Tu 	{0x4603, 0x15},
56938fc5136SShawn Tu 	{0x460b, 0x07},
57038fc5136SShawn Tu 	{0x4680, 0x11},
57138fc5136SShawn Tu 	{0x4686, 0x00},
57238fc5136SShawn Tu 	{0x4687, 0x00},
57338fc5136SShawn Tu 	{0x4700, 0x00},
57438fc5136SShawn Tu 	{0x4800, 0x64},
57538fc5136SShawn Tu 	{0x4806, 0x40},
57638fc5136SShawn Tu 	{0x480b, 0x10},
57738fc5136SShawn Tu 	{0x480c, 0x80},
57838fc5136SShawn Tu 	{0x480f, 0x32},
57938fc5136SShawn Tu 	{0x4813, 0xe4},
58038fc5136SShawn Tu 	{0x4837, 0x14},
58138fc5136SShawn Tu 	{0x4850, 0x42},
58238fc5136SShawn Tu 	{0x4884, 0x04},
58338fc5136SShawn Tu 	{0x4c00, 0xf8},
58438fc5136SShawn Tu 	{0x4c01, 0x44},
58538fc5136SShawn Tu 	{0x4c03, 0x00},
58638fc5136SShawn Tu 	{0x4d00, 0x00},
58738fc5136SShawn Tu 	{0x4d01, 0x16},
58838fc5136SShawn Tu 	{0x4d04, 0x10},
58938fc5136SShawn Tu 	{0x4d05, 0x00},
59038fc5136SShawn Tu 	{0x4d06, 0x0c},
59138fc5136SShawn Tu 	{0x4d07, 0x00},
59238fc5136SShawn Tu 	{0x3d84, 0x04},
59338fc5136SShawn Tu 	{0x3680, 0xa4},
59438fc5136SShawn Tu 	{0x3682, 0x80},
59538fc5136SShawn Tu 	{0x3601, 0x40},
59638fc5136SShawn Tu 	{0x3602, 0x90},
59738fc5136SShawn Tu 	{0x3608, 0x0a},
59838fc5136SShawn Tu 	{0x3938, 0x09},
59938fc5136SShawn Tu 	{0x3a74, 0x84},
60038fc5136SShawn Tu 	{0x3a99, 0x84},
60138fc5136SShawn Tu 	{0x3ab9, 0xa6},
60238fc5136SShawn Tu 	{0x3aba, 0xba},
60338fc5136SShawn Tu 	{0x3b12, 0x84},
60438fc5136SShawn Tu 	{0x3b14, 0xbb},
60538fc5136SShawn Tu 	{0x3b15, 0xbf},
60638fc5136SShawn Tu 	{0x3a29, 0x26},
60738fc5136SShawn Tu 	{0x3a1f, 0x8a},
60838fc5136SShawn Tu 	{0x3a22, 0x91},
60938fc5136SShawn Tu 	{0x3a25, 0x96},
61038fc5136SShawn Tu 	{0x3a28, 0xb4},
61138fc5136SShawn Tu 	{0x3a2b, 0xba},
61238fc5136SShawn Tu 	{0x3a2e, 0xbf},
61338fc5136SShawn Tu 	{0x3a31, 0xc1},
61438fc5136SShawn Tu 	{0x3a20, 0x00},
61538fc5136SShawn Tu 	{0x3939, 0x9d},
61638fc5136SShawn Tu 	{0x3902, 0x0e},
61738fc5136SShawn Tu 	{0x3903, 0x0e},
61838fc5136SShawn Tu 	{0x3904, 0x0e},
61938fc5136SShawn Tu 	{0x3905, 0x0e},
62038fc5136SShawn Tu 	{0x3906, 0x07},
62138fc5136SShawn Tu 	{0x3907, 0x0d},
62238fc5136SShawn Tu 	{0x3908, 0x11},
62338fc5136SShawn Tu 	{0x3909, 0x12},
62438fc5136SShawn Tu 	{0x360f, 0x99},
62538fc5136SShawn Tu 	{0x390c, 0x33},
62638fc5136SShawn Tu 	{0x390d, 0x66},
62738fc5136SShawn Tu 	{0x390e, 0xaa},
62838fc5136SShawn Tu 	{0x3911, 0x90},
62938fc5136SShawn Tu 	{0x3913, 0x90},
63038fc5136SShawn Tu 	{0x3915, 0x90},
63138fc5136SShawn Tu 	{0x3917, 0x90},
63238fc5136SShawn Tu 	{0x3b3f, 0x9d},
63338fc5136SShawn Tu 	{0x3b45, 0x9d},
63438fc5136SShawn Tu 	{0x3b1b, 0xc9},
63538fc5136SShawn Tu 	{0x3b21, 0xc9},
63638fc5136SShawn Tu 	{0x3440, 0xa4},
63738fc5136SShawn Tu 	{0x3a23, 0x15},
63838fc5136SShawn Tu 	{0x3a26, 0x1d},
63938fc5136SShawn Tu 	{0x3a2c, 0x4a},
64038fc5136SShawn Tu 	{0x3a2f, 0x18},
64138fc5136SShawn Tu 	{0x3a32, 0x55},
64238fc5136SShawn Tu 	{0x3b0a, 0x01},
64338fc5136SShawn Tu 	{0x3b0b, 0x00},
64438fc5136SShawn Tu 	{0x3b0e, 0x01},
64538fc5136SShawn Tu 	{0x3b0f, 0x00},
64638fc5136SShawn Tu 	{0x392c, 0x02},
64738fc5136SShawn Tu 	{0x392d, 0x02},
64838fc5136SShawn Tu 	{0x392e, 0x04},
64938fc5136SShawn Tu 	{0x392f, 0x03},
65038fc5136SShawn Tu 	{0x3930, 0x08},
65138fc5136SShawn Tu 	{0x3931, 0x07},
65238fc5136SShawn Tu 	{0x3932, 0x10},
65338fc5136SShawn Tu 	{0x3933, 0x0c},
65438fc5136SShawn Tu 	{0x3609, 0x08},
65538fc5136SShawn Tu 	{0x3921, 0x0f},
65638fc5136SShawn Tu 	{0x3928, 0x15},
65738fc5136SShawn Tu 	{0x3929, 0x2a},
65838fc5136SShawn Tu 	{0x392a, 0x54},
65938fc5136SShawn Tu 	{0x392b, 0xa8},
66038fc5136SShawn Tu 	{0x3426, 0x10},
66138fc5136SShawn Tu 	{0x3407, 0x01},
66238fc5136SShawn Tu 	{0x3404, 0x01},
66338fc5136SShawn Tu 	{0x3500, 0x00},
66438fc5136SShawn Tu 	{0x3501, 0x10},
66538fc5136SShawn Tu 	{0x3502, 0x10},
66638fc5136SShawn Tu 	{0x3508, 0x0f},
66738fc5136SShawn Tu 	{0x3509, 0x80},
66838fc5136SShawn Tu 	{0x5a80, 0x75},
66938fc5136SShawn Tu 	{0x5a81, 0x75},
67038fc5136SShawn Tu 	{0x5a82, 0x75},
67138fc5136SShawn Tu 	{0x5a83, 0x75},
67238fc5136SShawn Tu 	{0x5a84, 0x75},
67338fc5136SShawn Tu 	{0x5a85, 0x75},
67438fc5136SShawn Tu 	{0x5a86, 0x75},
67538fc5136SShawn Tu 	{0x5a87, 0x75},
67638fc5136SShawn Tu 	{0x5a88, 0x75},
67738fc5136SShawn Tu 	{0x5a89, 0x75},
67838fc5136SShawn Tu 	{0x5a8a, 0x75},
67938fc5136SShawn Tu 	{0x5a8b, 0x75},
68038fc5136SShawn Tu 	{0x5a8c, 0x75},
68138fc5136SShawn Tu 	{0x5a8d, 0x75},
68238fc5136SShawn Tu 	{0x5a8e, 0x75},
68338fc5136SShawn Tu 	{0x5a8f, 0x75},
68438fc5136SShawn Tu 	{0x5a90, 0x75},
68538fc5136SShawn Tu 	{0x5a91, 0x75},
68638fc5136SShawn Tu 	{0x5a92, 0x75},
68738fc5136SShawn Tu 	{0x5a93, 0x75},
68838fc5136SShawn Tu 	{0x5a94, 0x75},
68938fc5136SShawn Tu 	{0x5a95, 0x75},
69038fc5136SShawn Tu 	{0x5a96, 0x75},
69138fc5136SShawn Tu 	{0x5a97, 0x75},
69238fc5136SShawn Tu 	{0x5a98, 0x75},
69338fc5136SShawn Tu 	{0x5a99, 0x75},
69438fc5136SShawn Tu 	{0x5a9a, 0x75},
69538fc5136SShawn Tu 	{0x5a9b, 0x75},
69638fc5136SShawn Tu 	{0x5a9c, 0x75},
69738fc5136SShawn Tu 	{0x5a9d, 0x75},
69838fc5136SShawn Tu 	{0x5a9e, 0x75},
69938fc5136SShawn Tu 	{0x5a9f, 0x75},
70038fc5136SShawn Tu 	{0x5aa0, 0x75},
70138fc5136SShawn Tu 	{0x5aa1, 0x75},
70238fc5136SShawn Tu 	{0x5aa2, 0x75},
70338fc5136SShawn Tu 	{0x5aa3, 0x75},
70438fc5136SShawn Tu 	{0x5aa4, 0x75},
70538fc5136SShawn Tu 	{0x5aa5, 0x75},
70638fc5136SShawn Tu 	{0x5aa6, 0x75},
70738fc5136SShawn Tu 	{0x5aa7, 0x75},
70838fc5136SShawn Tu 	{0x5aa8, 0x75},
70938fc5136SShawn Tu 	{0x5aa9, 0x75},
71038fc5136SShawn Tu 	{0x5aaa, 0x75},
71138fc5136SShawn Tu 	{0x5aab, 0x75},
71238fc5136SShawn Tu 	{0x5aac, 0x75},
71338fc5136SShawn Tu 	{0x5aad, 0x75},
71438fc5136SShawn Tu 	{0x5aae, 0x75},
71538fc5136SShawn Tu 	{0x5aaf, 0x75},
71638fc5136SShawn Tu 	{0x5ab0, 0x75},
71738fc5136SShawn Tu 	{0x5ab1, 0x75},
71838fc5136SShawn Tu 	{0x5ab2, 0x75},
71938fc5136SShawn Tu 	{0x5ab3, 0x75},
72038fc5136SShawn Tu 	{0x5ab4, 0x75},
72138fc5136SShawn Tu 	{0x5ab5, 0x75},
72238fc5136SShawn Tu 	{0x5ab6, 0x75},
72338fc5136SShawn Tu 	{0x5ab7, 0x75},
72438fc5136SShawn Tu 	{0x5ab8, 0x75},
72538fc5136SShawn Tu 	{0x5ab9, 0x75},
72638fc5136SShawn Tu 	{0x5aba, 0x75},
72738fc5136SShawn Tu 	{0x5abb, 0x75},
72838fc5136SShawn Tu 	{0x5abc, 0x75},
72938fc5136SShawn Tu 	{0x5abd, 0x75},
73038fc5136SShawn Tu 	{0x5abe, 0x75},
73138fc5136SShawn Tu 	{0x5abf, 0x75},
73238fc5136SShawn Tu 	{0x5ac0, 0x75},
73338fc5136SShawn Tu 	{0x5ac1, 0x75},
73438fc5136SShawn Tu 	{0x5ac2, 0x75},
73538fc5136SShawn Tu 	{0x5ac3, 0x75},
73638fc5136SShawn Tu 	{0x5ac4, 0x75},
73738fc5136SShawn Tu 	{0x5ac5, 0x75},
73838fc5136SShawn Tu 	{0x5ac6, 0x75},
73938fc5136SShawn Tu 	{0x5ac7, 0x75},
74038fc5136SShawn Tu 	{0x5ac8, 0x75},
74138fc5136SShawn Tu 	{0x5ac9, 0x75},
74238fc5136SShawn Tu 	{0x5aca, 0x75},
74338fc5136SShawn Tu 	{0x5acb, 0x75},
74438fc5136SShawn Tu 	{0x5acc, 0x75},
74538fc5136SShawn Tu 	{0x5acd, 0x75},
74638fc5136SShawn Tu 	{0x5ace, 0x75},
74738fc5136SShawn Tu 	{0x5acf, 0x75},
74838fc5136SShawn Tu 	{0x5ad0, 0x75},
74938fc5136SShawn Tu 	{0x5ad1, 0x75},
75038fc5136SShawn Tu 	{0x5ad2, 0x75},
75138fc5136SShawn Tu 	{0x5ad3, 0x75},
75238fc5136SShawn Tu 	{0x5ad4, 0x75},
75338fc5136SShawn Tu 	{0x5ad5, 0x75},
75438fc5136SShawn Tu 	{0x5ad6, 0x75},
75538fc5136SShawn Tu 	{0x5ad7, 0x75},
75638fc5136SShawn Tu 	{0x5ad8, 0x75},
75738fc5136SShawn Tu 	{0x5ad9, 0x75},
75838fc5136SShawn Tu 	{0x5ada, 0x75},
75938fc5136SShawn Tu 	{0x5adb, 0x75},
76038fc5136SShawn Tu 	{0x5adc, 0x75},
76138fc5136SShawn Tu 	{0x5add, 0x75},
76238fc5136SShawn Tu 	{0x5ade, 0x75},
76338fc5136SShawn Tu 	{0x5adf, 0x75},
76438fc5136SShawn Tu 	{0x5ae0, 0x75},
76538fc5136SShawn Tu 	{0x5ae1, 0x75},
76638fc5136SShawn Tu 	{0x5ae2, 0x75},
76738fc5136SShawn Tu 	{0x5ae3, 0x75},
76838fc5136SShawn Tu 	{0x5ae4, 0x75},
76938fc5136SShawn Tu 	{0x5ae5, 0x75},
77038fc5136SShawn Tu 	{0x5ae6, 0x75},
77138fc5136SShawn Tu 	{0x5ae7, 0x75},
77238fc5136SShawn Tu 	{0x5ae8, 0x75},
77338fc5136SShawn Tu 	{0x5ae9, 0x75},
77438fc5136SShawn Tu 	{0x5aea, 0x75},
77538fc5136SShawn Tu 	{0x5aeb, 0x75},
77638fc5136SShawn Tu 	{0x5aec, 0x75},
77738fc5136SShawn Tu 	{0x5aed, 0x75},
77838fc5136SShawn Tu 	{0x5aee, 0x75},
77938fc5136SShawn Tu 	{0x5aef, 0x75},
78038fc5136SShawn Tu 	{0x5af0, 0x75},
78138fc5136SShawn Tu 	{0x5af1, 0x75},
78238fc5136SShawn Tu 	{0x5af2, 0x75},
78338fc5136SShawn Tu 	{0x5af3, 0x75},
78438fc5136SShawn Tu 	{0x5af4, 0x75},
78538fc5136SShawn Tu 	{0x5af5, 0x75},
78638fc5136SShawn Tu 	{0x5af6, 0x75},
78738fc5136SShawn Tu 	{0x5af7, 0x75},
78838fc5136SShawn Tu 	{0x5af8, 0x75},
78938fc5136SShawn Tu 	{0x5af9, 0x75},
79038fc5136SShawn Tu 	{0x5afa, 0x75},
79138fc5136SShawn Tu 	{0x5afb, 0x75},
79238fc5136SShawn Tu 	{0x5afc, 0x75},
79338fc5136SShawn Tu 	{0x5afd, 0x75},
79438fc5136SShawn Tu 	{0x5afe, 0x75},
79538fc5136SShawn Tu 	{0x5aff, 0x75},
79638fc5136SShawn Tu 	{0x5b00, 0x75},
79738fc5136SShawn Tu 	{0x5b01, 0x75},
79838fc5136SShawn Tu 	{0x5b02, 0x75},
79938fc5136SShawn Tu 	{0x5b03, 0x75},
80038fc5136SShawn Tu 	{0x5b04, 0x75},
80138fc5136SShawn Tu 	{0x5b05, 0x75},
80238fc5136SShawn Tu 	{0x5b06, 0x75},
80338fc5136SShawn Tu 	{0x5b07, 0x75},
80438fc5136SShawn Tu 	{0x5b08, 0x75},
80538fc5136SShawn Tu 	{0x5b09, 0x75},
80638fc5136SShawn Tu 	{0x5b0a, 0x75},
80738fc5136SShawn Tu 	{0x5b0b, 0x75},
80838fc5136SShawn Tu 	{0x5b0c, 0x75},
80938fc5136SShawn Tu 	{0x5b0d, 0x75},
81038fc5136SShawn Tu 	{0x5b0e, 0x75},
81138fc5136SShawn Tu 	{0x5b0f, 0x75},
81238fc5136SShawn Tu 	{0x5b10, 0x75},
81338fc5136SShawn Tu 	{0x5b11, 0x75},
81438fc5136SShawn Tu 	{0x5b12, 0x75},
81538fc5136SShawn Tu 	{0x5b13, 0x75},
81638fc5136SShawn Tu 	{0x5b14, 0x75},
81738fc5136SShawn Tu 	{0x5b15, 0x75},
81838fc5136SShawn Tu 	{0x5b16, 0x75},
81938fc5136SShawn Tu 	{0x5b17, 0x75},
82038fc5136SShawn Tu 	{0x5b18, 0x75},
82138fc5136SShawn Tu 	{0x5b19, 0x75},
82238fc5136SShawn Tu 	{0x5b1a, 0x75},
82338fc5136SShawn Tu 	{0x5b1b, 0x75},
82438fc5136SShawn Tu 	{0x5b1c, 0x75},
82538fc5136SShawn Tu 	{0x5b1d, 0x75},
82638fc5136SShawn Tu 	{0x5b1e, 0x75},
82738fc5136SShawn Tu 	{0x5b1f, 0x75},
82838fc5136SShawn Tu 	{0x5b20, 0x75},
82938fc5136SShawn Tu 	{0x5b21, 0x75},
83038fc5136SShawn Tu 	{0x5b22, 0x75},
83138fc5136SShawn Tu 	{0x5b23, 0x75},
83238fc5136SShawn Tu 	{0x5b24, 0x75},
83338fc5136SShawn Tu 	{0x5b25, 0x75},
83438fc5136SShawn Tu 	{0x5b26, 0x75},
83538fc5136SShawn Tu 	{0x5b27, 0x75},
83638fc5136SShawn Tu 	{0x5b28, 0x75},
83738fc5136SShawn Tu 	{0x5b29, 0x75},
83838fc5136SShawn Tu 	{0x5b2a, 0x75},
83938fc5136SShawn Tu 	{0x5b2b, 0x75},
84038fc5136SShawn Tu 	{0x5b2c, 0x75},
84138fc5136SShawn Tu 	{0x5b2d, 0x75},
84238fc5136SShawn Tu 	{0x5b2e, 0x75},
84338fc5136SShawn Tu 	{0x5b2f, 0x75},
84438fc5136SShawn Tu 	{0x5b30, 0x75},
84538fc5136SShawn Tu 	{0x5b31, 0x75},
84638fc5136SShawn Tu 	{0x5b32, 0x75},
84738fc5136SShawn Tu 	{0x5b33, 0x75},
84838fc5136SShawn Tu 	{0x5b34, 0x75},
84938fc5136SShawn Tu 	{0x5b35, 0x75},
85038fc5136SShawn Tu 	{0x5b36, 0x75},
85138fc5136SShawn Tu 	{0x5b37, 0x75},
85238fc5136SShawn Tu 	{0x5b38, 0x75},
85338fc5136SShawn Tu 	{0x5b39, 0x75},
85438fc5136SShawn Tu 	{0x5b3a, 0x75},
85538fc5136SShawn Tu 	{0x5b3b, 0x75},
85638fc5136SShawn Tu 	{0x5b3c, 0x75},
85738fc5136SShawn Tu 	{0x5b3d, 0x75},
85838fc5136SShawn Tu 	{0x5b3e, 0x75},
85938fc5136SShawn Tu 	{0x5b3f, 0x75},
86038fc5136SShawn Tu 	{0x5b40, 0x75},
86138fc5136SShawn Tu 	{0x5b41, 0x75},
86238fc5136SShawn Tu 	{0x5b42, 0x75},
86338fc5136SShawn Tu 	{0x5b43, 0x75},
86438fc5136SShawn Tu 	{0x5b44, 0x75},
86538fc5136SShawn Tu 	{0x5b45, 0x75},
86638fc5136SShawn Tu 	{0x5b46, 0x75},
86738fc5136SShawn Tu 	{0x5b47, 0x75},
86838fc5136SShawn Tu 	{0x5b48, 0x75},
86938fc5136SShawn Tu 	{0x5b49, 0x75},
87038fc5136SShawn Tu 	{0x5b4a, 0x75},
87138fc5136SShawn Tu 	{0x5b4b, 0x75},
87238fc5136SShawn Tu 	{0x5b4c, 0x75},
87338fc5136SShawn Tu 	{0x5b4d, 0x75},
87438fc5136SShawn Tu 	{0x5b4e, 0x75},
87538fc5136SShawn Tu 	{0x5b4f, 0x75},
87638fc5136SShawn Tu 	{0x5b50, 0x75},
87738fc5136SShawn Tu 	{0x5b51, 0x75},
87838fc5136SShawn Tu 	{0x5b52, 0x75},
87938fc5136SShawn Tu 	{0x5b53, 0x75},
88038fc5136SShawn Tu 	{0x5b54, 0x75},
88138fc5136SShawn Tu 	{0x5b55, 0x75},
88238fc5136SShawn Tu 	{0x5b56, 0x75},
88338fc5136SShawn Tu 	{0x5b57, 0x75},
88438fc5136SShawn Tu 	{0x5b58, 0x75},
88538fc5136SShawn Tu 	{0x5b59, 0x75},
88638fc5136SShawn Tu 	{0x5b5a, 0x75},
88738fc5136SShawn Tu 	{0x5b5b, 0x75},
88838fc5136SShawn Tu 	{0x5b5c, 0x75},
88938fc5136SShawn Tu 	{0x5b5d, 0x75},
89038fc5136SShawn Tu 	{0x5b5e, 0x75},
89138fc5136SShawn Tu 	{0x5b5f, 0x75},
89238fc5136SShawn Tu 	{0x5b60, 0x75},
89338fc5136SShawn Tu 	{0x5b61, 0x75},
89438fc5136SShawn Tu 	{0x5b62, 0x75},
89538fc5136SShawn Tu 	{0x5b63, 0x75},
89638fc5136SShawn Tu 	{0x5b64, 0x75},
89738fc5136SShawn Tu 	{0x5b65, 0x75},
89838fc5136SShawn Tu 	{0x5b66, 0x75},
89938fc5136SShawn Tu 	{0x5b67, 0x75},
90038fc5136SShawn Tu 	{0x5b68, 0x75},
90138fc5136SShawn Tu 	{0x5b69, 0x75},
90238fc5136SShawn Tu 	{0x5b6a, 0x75},
90338fc5136SShawn Tu 	{0x5b6b, 0x75},
90438fc5136SShawn Tu 	{0x5b6c, 0x75},
90538fc5136SShawn Tu 	{0x5b6d, 0x75},
90638fc5136SShawn Tu 	{0x5b6e, 0x75},
90738fc5136SShawn Tu 	{0x5b6f, 0x75},
90838fc5136SShawn Tu 	{0x5b70, 0x75},
90938fc5136SShawn Tu 	{0x5b71, 0x75},
91038fc5136SShawn Tu 	{0x5b72, 0x75},
91138fc5136SShawn Tu 	{0x5b73, 0x75},
91238fc5136SShawn Tu 	{0x5b74, 0x75},
91338fc5136SShawn Tu 	{0x5b75, 0x75},
91438fc5136SShawn Tu 	{0x5b76, 0x75},
91538fc5136SShawn Tu 	{0x5b77, 0x75},
91638fc5136SShawn Tu 	{0x5b78, 0x75},
91738fc5136SShawn Tu 	{0x5b79, 0x75},
91838fc5136SShawn Tu 	{0x5b7a, 0x75},
91938fc5136SShawn Tu 	{0x5b7b, 0x75},
92038fc5136SShawn Tu 	{0x5b7c, 0x75},
92138fc5136SShawn Tu 	{0x5b7d, 0x75},
92238fc5136SShawn Tu 	{0x5b7e, 0x75},
92338fc5136SShawn Tu 	{0x5b7f, 0x75},
92438fc5136SShawn Tu 	{0x5b80, 0x75},
92538fc5136SShawn Tu 	{0x5b81, 0x75},
92638fc5136SShawn Tu 	{0x5b82, 0x75},
92738fc5136SShawn Tu 	{0x5b83, 0x75},
92838fc5136SShawn Tu 	{0x5b84, 0x75},
92938fc5136SShawn Tu 	{0x5b85, 0x75},
93038fc5136SShawn Tu 	{0x5b86, 0x75},
93138fc5136SShawn Tu 	{0x5b87, 0x75},
93238fc5136SShawn Tu 	{0x5b88, 0x75},
93338fc5136SShawn Tu 	{0x5b89, 0x75},
93438fc5136SShawn Tu 	{0x5b8a, 0x75},
93538fc5136SShawn Tu 	{0x5b8b, 0x75},
93638fc5136SShawn Tu 	{0x5b8c, 0x75},
93738fc5136SShawn Tu 	{0x5b8d, 0x75},
93838fc5136SShawn Tu 	{0x5b8e, 0x75},
93938fc5136SShawn Tu 	{0x5b8f, 0x75},
94038fc5136SShawn Tu 	{0x5b90, 0x75},
94138fc5136SShawn Tu 	{0x5b91, 0x75},
94238fc5136SShawn Tu 	{0x5b92, 0x75},
94338fc5136SShawn Tu 	{0x5b93, 0x75},
94438fc5136SShawn Tu 	{0x5b94, 0x75},
94538fc5136SShawn Tu 	{0x5b95, 0x75},
94638fc5136SShawn Tu 	{0x5b96, 0x75},
94738fc5136SShawn Tu 	{0x5b97, 0x75},
94838fc5136SShawn Tu 	{0x5b98, 0x75},
94938fc5136SShawn Tu 	{0x5b99, 0x75},
95038fc5136SShawn Tu 	{0x5b9a, 0x75},
95138fc5136SShawn Tu 	{0x5b9b, 0x75},
95238fc5136SShawn Tu 	{0x5b9c, 0x75},
95338fc5136SShawn Tu 	{0x5b9d, 0x75},
95438fc5136SShawn Tu 	{0x5b9e, 0x75},
95538fc5136SShawn Tu 	{0x5b9f, 0x75},
95638fc5136SShawn Tu 	{0x5bc0, 0x75},
95738fc5136SShawn Tu 	{0x5bc1, 0x75},
95838fc5136SShawn Tu 	{0x5bc2, 0x75},
95938fc5136SShawn Tu 	{0x5bc3, 0x75},
96038fc5136SShawn Tu 	{0x5bc4, 0x75},
96138fc5136SShawn Tu 	{0x5bc5, 0x75},
96238fc5136SShawn Tu 	{0x5bc6, 0x75},
96338fc5136SShawn Tu 	{0x5bc7, 0x75},
96438fc5136SShawn Tu 	{0x5bc8, 0x75},
96538fc5136SShawn Tu 	{0x5bc9, 0x75},
96638fc5136SShawn Tu 	{0x5bca, 0x75},
96738fc5136SShawn Tu 	{0x5bcb, 0x75},
96838fc5136SShawn Tu 	{0x5bcc, 0x75},
96938fc5136SShawn Tu 	{0x5bcd, 0x75},
97038fc5136SShawn Tu 	{0x5bce, 0x75},
97138fc5136SShawn Tu 	{0x5bcf, 0x75},
97238fc5136SShawn Tu 	{0x5bd0, 0x75},
97338fc5136SShawn Tu 	{0x5bd1, 0x75},
97438fc5136SShawn Tu 	{0x5bd2, 0x75},
97538fc5136SShawn Tu 	{0x5bd3, 0x75},
97638fc5136SShawn Tu 	{0x5bd4, 0x75},
97738fc5136SShawn Tu 	{0x5bd5, 0x75},
97838fc5136SShawn Tu 	{0x5bd6, 0x75},
97938fc5136SShawn Tu 	{0x5bd7, 0x75},
98038fc5136SShawn Tu 	{0x5bd8, 0x75},
98138fc5136SShawn Tu 	{0x5bd9, 0x75},
98238fc5136SShawn Tu 	{0x5bda, 0x75},
98338fc5136SShawn Tu 	{0x5bdb, 0x75},
98438fc5136SShawn Tu 	{0x5bdc, 0x75},
98538fc5136SShawn Tu 	{0x5bdd, 0x75},
98638fc5136SShawn Tu 	{0x5bde, 0x75},
98738fc5136SShawn Tu 	{0x5bdf, 0x75},
98838fc5136SShawn Tu 	{0x5be0, 0x75},
98938fc5136SShawn Tu 	{0x5be1, 0x75},
99038fc5136SShawn Tu 	{0x5be2, 0x75},
99138fc5136SShawn Tu 	{0x5be3, 0x75},
99238fc5136SShawn Tu 	{0x5be4, 0x75},
99338fc5136SShawn Tu 	{0x5be5, 0x75},
99438fc5136SShawn Tu 	{0x5be6, 0x75},
99538fc5136SShawn Tu 	{0x5be7, 0x75},
99638fc5136SShawn Tu 	{0x5be8, 0x75},
99738fc5136SShawn Tu 	{0x5be9, 0x75},
99838fc5136SShawn Tu 	{0x5bea, 0x75},
99938fc5136SShawn Tu 	{0x5beb, 0x75},
100038fc5136SShawn Tu 	{0x5bec, 0x75},
100138fc5136SShawn Tu 	{0x5bed, 0x75},
100238fc5136SShawn Tu 	{0x5bee, 0x75},
100338fc5136SShawn Tu 	{0x5bef, 0x75},
100438fc5136SShawn Tu 	{0x5bf0, 0x75},
100538fc5136SShawn Tu 	{0x5bf1, 0x75},
100638fc5136SShawn Tu 	{0x5bf2, 0x75},
100738fc5136SShawn Tu 	{0x5bf3, 0x75},
100838fc5136SShawn Tu 	{0x5bf4, 0x75},
100938fc5136SShawn Tu 	{0x5bf5, 0x75},
101038fc5136SShawn Tu 	{0x5bf6, 0x75},
101138fc5136SShawn Tu 	{0x5bf7, 0x75},
101238fc5136SShawn Tu 	{0x5bf8, 0x75},
101338fc5136SShawn Tu 	{0x5bf9, 0x75},
101438fc5136SShawn Tu 	{0x5bfa, 0x75},
101538fc5136SShawn Tu 	{0x5bfb, 0x75},
101638fc5136SShawn Tu 	{0x5bfc, 0x75},
101738fc5136SShawn Tu 	{0x5bfd, 0x75},
101838fc5136SShawn Tu 	{0x5bfe, 0x75},
101938fc5136SShawn Tu 	{0x5bff, 0x75},
102038fc5136SShawn Tu 	{0x5c00, 0x75},
102138fc5136SShawn Tu 	{0x5c01, 0x75},
102238fc5136SShawn Tu 	{0x5c02, 0x75},
102338fc5136SShawn Tu 	{0x5c03, 0x75},
102438fc5136SShawn Tu 	{0x5c04, 0x75},
102538fc5136SShawn Tu 	{0x5c05, 0x75},
102638fc5136SShawn Tu 	{0x5c06, 0x75},
102738fc5136SShawn Tu 	{0x5c07, 0x75},
102838fc5136SShawn Tu 	{0x5c08, 0x75},
102938fc5136SShawn Tu 	{0x5c09, 0x75},
103038fc5136SShawn Tu 	{0x5c0a, 0x75},
103138fc5136SShawn Tu 	{0x5c0b, 0x75},
103238fc5136SShawn Tu 	{0x5c0c, 0x75},
103338fc5136SShawn Tu 	{0x5c0d, 0x75},
103438fc5136SShawn Tu 	{0x5c0e, 0x75},
103538fc5136SShawn Tu 	{0x5c0f, 0x75},
103638fc5136SShawn Tu 	{0x5c10, 0x75},
103738fc5136SShawn Tu 	{0x5c11, 0x75},
103838fc5136SShawn Tu 	{0x5c12, 0x75},
103938fc5136SShawn Tu 	{0x5c13, 0x75},
104038fc5136SShawn Tu 	{0x5c14, 0x75},
104138fc5136SShawn Tu 	{0x5c15, 0x75},
104238fc5136SShawn Tu 	{0x5c16, 0x75},
104338fc5136SShawn Tu 	{0x5c17, 0x75},
104438fc5136SShawn Tu 	{0x5c18, 0x75},
104538fc5136SShawn Tu 	{0x5c19, 0x75},
104638fc5136SShawn Tu 	{0x5c1a, 0x75},
104738fc5136SShawn Tu 	{0x5c1b, 0x75},
104838fc5136SShawn Tu 	{0x5c1c, 0x75},
104938fc5136SShawn Tu 	{0x5c1d, 0x75},
105038fc5136SShawn Tu 	{0x5c1e, 0x75},
105138fc5136SShawn Tu 	{0x5c1f, 0x75},
105238fc5136SShawn Tu 	{0x5c20, 0x75},
105338fc5136SShawn Tu 	{0x5c21, 0x75},
105438fc5136SShawn Tu 	{0x5c22, 0x75},
105538fc5136SShawn Tu 	{0x5c23, 0x75},
105638fc5136SShawn Tu 	{0x5c24, 0x75},
105738fc5136SShawn Tu 	{0x5c25, 0x75},
105838fc5136SShawn Tu 	{0x5c26, 0x75},
105938fc5136SShawn Tu 	{0x5c27, 0x75},
106038fc5136SShawn Tu 	{0x5c28, 0x75},
106138fc5136SShawn Tu 	{0x5c29, 0x75},
106238fc5136SShawn Tu 	{0x5c2a, 0x75},
106338fc5136SShawn Tu 	{0x5c2b, 0x75},
106438fc5136SShawn Tu 	{0x5c2c, 0x75},
106538fc5136SShawn Tu 	{0x5c2d, 0x75},
106638fc5136SShawn Tu 	{0x5c2e, 0x75},
106738fc5136SShawn Tu 	{0x5c2f, 0x75},
106838fc5136SShawn Tu 	{0x5c30, 0x75},
106938fc5136SShawn Tu 	{0x5c31, 0x75},
107038fc5136SShawn Tu 	{0x5c32, 0x75},
107138fc5136SShawn Tu 	{0x5c33, 0x75},
107238fc5136SShawn Tu 	{0x5c34, 0x75},
107338fc5136SShawn Tu 	{0x5c35, 0x75},
107438fc5136SShawn Tu 	{0x5c36, 0x75},
107538fc5136SShawn Tu 	{0x5c37, 0x75},
107638fc5136SShawn Tu 	{0x5c38, 0x75},
107738fc5136SShawn Tu 	{0x5c39, 0x75},
107838fc5136SShawn Tu 	{0x5c3a, 0x75},
107938fc5136SShawn Tu 	{0x5c3b, 0x75},
108038fc5136SShawn Tu 	{0x5c3c, 0x75},
108138fc5136SShawn Tu 	{0x5c3d, 0x75},
108238fc5136SShawn Tu 	{0x5c3e, 0x75},
108338fc5136SShawn Tu 	{0x5c3f, 0x75},
108438fc5136SShawn Tu 	{0x5c40, 0x75},
108538fc5136SShawn Tu 	{0x5c41, 0x75},
108638fc5136SShawn Tu 	{0x5c42, 0x75},
108738fc5136SShawn Tu 	{0x5c43, 0x75},
108838fc5136SShawn Tu 	{0x5c44, 0x75},
108938fc5136SShawn Tu 	{0x5c45, 0x75},
109038fc5136SShawn Tu 	{0x5c46, 0x75},
109138fc5136SShawn Tu 	{0x5c47, 0x75},
109238fc5136SShawn Tu 	{0x5c48, 0x75},
109338fc5136SShawn Tu 	{0x5c49, 0x75},
109438fc5136SShawn Tu 	{0x5c4a, 0x75},
109538fc5136SShawn Tu 	{0x5c4b, 0x75},
109638fc5136SShawn Tu 	{0x5c4c, 0x75},
109738fc5136SShawn Tu 	{0x5c4d, 0x75},
109838fc5136SShawn Tu 	{0x5c4e, 0x75},
109938fc5136SShawn Tu 	{0x5c4f, 0x75},
110038fc5136SShawn Tu 	{0x5c50, 0x75},
110138fc5136SShawn Tu 	{0x5c51, 0x75},
110238fc5136SShawn Tu 	{0x5c52, 0x75},
110338fc5136SShawn Tu 	{0x5c53, 0x75},
110438fc5136SShawn Tu 	{0x5c54, 0x75},
110538fc5136SShawn Tu 	{0x5c55, 0x75},
110638fc5136SShawn Tu 	{0x5c56, 0x75},
110738fc5136SShawn Tu 	{0x5c57, 0x75},
110838fc5136SShawn Tu 	{0x5c58, 0x75},
110938fc5136SShawn Tu 	{0x5c59, 0x75},
111038fc5136SShawn Tu 	{0x5c5a, 0x75},
111138fc5136SShawn Tu 	{0x5c5b, 0x75},
111238fc5136SShawn Tu 	{0x5c5c, 0x75},
111338fc5136SShawn Tu 	{0x5c5d, 0x75},
111438fc5136SShawn Tu 	{0x5c5e, 0x75},
111538fc5136SShawn Tu 	{0x5c5f, 0x75},
111638fc5136SShawn Tu 	{0x5c60, 0x75},
111738fc5136SShawn Tu 	{0x5c61, 0x75},
111838fc5136SShawn Tu 	{0x5c62, 0x75},
111938fc5136SShawn Tu 	{0x5c63, 0x75},
112038fc5136SShawn Tu 	{0x5c64, 0x75},
112138fc5136SShawn Tu 	{0x5c65, 0x75},
112238fc5136SShawn Tu 	{0x5c66, 0x75},
112338fc5136SShawn Tu 	{0x5c67, 0x75},
112438fc5136SShawn Tu 	{0x5c68, 0x75},
112538fc5136SShawn Tu 	{0x5c69, 0x75},
112638fc5136SShawn Tu 	{0x5c6a, 0x75},
112738fc5136SShawn Tu 	{0x5c6b, 0x75},
112838fc5136SShawn Tu 	{0x5c6c, 0x75},
112938fc5136SShawn Tu 	{0x5c6d, 0x75},
113038fc5136SShawn Tu 	{0x5c6e, 0x75},
113138fc5136SShawn Tu 	{0x5c6f, 0x75},
113238fc5136SShawn Tu 	{0x5c70, 0x75},
113338fc5136SShawn Tu 	{0x5c71, 0x75},
113438fc5136SShawn Tu 	{0x5c72, 0x75},
113538fc5136SShawn Tu 	{0x5c73, 0x75},
113638fc5136SShawn Tu 	{0x5c74, 0x75},
113738fc5136SShawn Tu 	{0x5c75, 0x75},
113838fc5136SShawn Tu 	{0x5c76, 0x75},
113938fc5136SShawn Tu 	{0x5c77, 0x75},
114038fc5136SShawn Tu 	{0x5c78, 0x75},
114138fc5136SShawn Tu 	{0x5c79, 0x75},
114238fc5136SShawn Tu 	{0x5c7a, 0x75},
114338fc5136SShawn Tu 	{0x5c7b, 0x75},
114438fc5136SShawn Tu 	{0x5c7c, 0x75},
114538fc5136SShawn Tu 	{0x5c7d, 0x75},
114638fc5136SShawn Tu 	{0x5c7e, 0x75},
114738fc5136SShawn Tu 	{0x5c7f, 0x75},
114838fc5136SShawn Tu 	{0x5c80, 0x75},
114938fc5136SShawn Tu 	{0x5c81, 0x75},
115038fc5136SShawn Tu 	{0x5c82, 0x75},
115138fc5136SShawn Tu 	{0x5c83, 0x75},
115238fc5136SShawn Tu 	{0x5c84, 0x75},
115338fc5136SShawn Tu 	{0x5c85, 0x75},
115438fc5136SShawn Tu 	{0x5c86, 0x75},
115538fc5136SShawn Tu 	{0x5c87, 0x75},
115638fc5136SShawn Tu 	{0x5c88, 0x75},
115738fc5136SShawn Tu 	{0x5c89, 0x75},
115838fc5136SShawn Tu 	{0x5c8a, 0x75},
115938fc5136SShawn Tu 	{0x5c8b, 0x75},
116038fc5136SShawn Tu 	{0x5c8c, 0x75},
116138fc5136SShawn Tu 	{0x5c8d, 0x75},
116238fc5136SShawn Tu 	{0x5c8e, 0x75},
116338fc5136SShawn Tu 	{0x5c8f, 0x75},
116438fc5136SShawn Tu 	{0x5c90, 0x75},
116538fc5136SShawn Tu 	{0x5c91, 0x75},
116638fc5136SShawn Tu 	{0x5c92, 0x75},
116738fc5136SShawn Tu 	{0x5c93, 0x75},
116838fc5136SShawn Tu 	{0x5c94, 0x75},
116938fc5136SShawn Tu 	{0x5c95, 0x75},
117038fc5136SShawn Tu 	{0x5c96, 0x75},
117138fc5136SShawn Tu 	{0x5c97, 0x75},
117238fc5136SShawn Tu 	{0x5c98, 0x75},
117338fc5136SShawn Tu 	{0x5c99, 0x75},
117438fc5136SShawn Tu 	{0x5c9a, 0x75},
117538fc5136SShawn Tu 	{0x5c9b, 0x75},
117638fc5136SShawn Tu 	{0x5c9c, 0x75},
117738fc5136SShawn Tu 	{0x5c9d, 0x75},
117838fc5136SShawn Tu 	{0x5c9e, 0x75},
117938fc5136SShawn Tu 	{0x5c9f, 0x75},
118038fc5136SShawn Tu 	{0x5ca0, 0x75},
118138fc5136SShawn Tu 	{0x5ca1, 0x75},
118238fc5136SShawn Tu 	{0x5ca2, 0x75},
118338fc5136SShawn Tu 	{0x5ca3, 0x75},
118438fc5136SShawn Tu 	{0x5ca4, 0x75},
118538fc5136SShawn Tu 	{0x5ca5, 0x75},
118638fc5136SShawn Tu 	{0x5ca6, 0x75},
118738fc5136SShawn Tu 	{0x5ca7, 0x75},
118838fc5136SShawn Tu 	{0x5ca8, 0x75},
118938fc5136SShawn Tu 	{0x5ca9, 0x75},
119038fc5136SShawn Tu 	{0x5caa, 0x75},
119138fc5136SShawn Tu 	{0x5cab, 0x75},
119238fc5136SShawn Tu 	{0x5cac, 0x75},
119338fc5136SShawn Tu 	{0x5cad, 0x75},
119438fc5136SShawn Tu 	{0x5cae, 0x75},
119538fc5136SShawn Tu 	{0x5caf, 0x75},
119638fc5136SShawn Tu 	{0x5cb0, 0x75},
119738fc5136SShawn Tu 	{0x5cb1, 0x75},
119838fc5136SShawn Tu 	{0x5cb2, 0x75},
119938fc5136SShawn Tu 	{0x5cb3, 0x75},
120038fc5136SShawn Tu 	{0x5cb4, 0x75},
120138fc5136SShawn Tu 	{0x5cb5, 0x75},
120238fc5136SShawn Tu 	{0x5cb6, 0x75},
120338fc5136SShawn Tu 	{0x5cb7, 0x75},
120438fc5136SShawn Tu 	{0x5cb8, 0x75},
120538fc5136SShawn Tu 	{0x5cb9, 0x75},
120638fc5136SShawn Tu 	{0x5cba, 0x75},
120738fc5136SShawn Tu 	{0x5cbb, 0x75},
120838fc5136SShawn Tu 	{0x5cbc, 0x75},
120938fc5136SShawn Tu 	{0x5cbd, 0x75},
121038fc5136SShawn Tu 	{0x5cbe, 0x75},
121138fc5136SShawn Tu 	{0x5cbf, 0x75},
121238fc5136SShawn Tu 	{0x5cc0, 0x75},
121338fc5136SShawn Tu 	{0x5cc1, 0x75},
121438fc5136SShawn Tu 	{0x5cc2, 0x75},
121538fc5136SShawn Tu 	{0x5cc3, 0x75},
121638fc5136SShawn Tu 	{0x5cc4, 0x75},
121738fc5136SShawn Tu 	{0x5cc5, 0x75},
121838fc5136SShawn Tu 	{0x5cc6, 0x75},
121938fc5136SShawn Tu 	{0x5cc7, 0x75},
122038fc5136SShawn Tu 	{0x5cc8, 0x75},
122138fc5136SShawn Tu 	{0x5cc9, 0x75},
122238fc5136SShawn Tu 	{0x5cca, 0x75},
122338fc5136SShawn Tu 	{0x5ccb, 0x75},
122438fc5136SShawn Tu 	{0x5ccc, 0x75},
122538fc5136SShawn Tu 	{0x5ccd, 0x75},
122638fc5136SShawn Tu 	{0x5cce, 0x75},
122738fc5136SShawn Tu 	{0x5ccf, 0x75},
122838fc5136SShawn Tu 	{0x5cd0, 0x75},
122938fc5136SShawn Tu 	{0x5cd1, 0x75},
123038fc5136SShawn Tu 	{0x5cd2, 0x75},
123138fc5136SShawn Tu 	{0x5cd3, 0x75},
123238fc5136SShawn Tu 	{0x5cd4, 0x75},
123338fc5136SShawn Tu 	{0x5cd5, 0x75},
123438fc5136SShawn Tu 	{0x5cd6, 0x75},
123538fc5136SShawn Tu 	{0x5cd7, 0x75},
123638fc5136SShawn Tu 	{0x5cd8, 0x75},
123738fc5136SShawn Tu 	{0x5cd9, 0x75},
123838fc5136SShawn Tu 	{0x5cda, 0x75},
123938fc5136SShawn Tu 	{0x5cdb, 0x75},
124038fc5136SShawn Tu 	{0x5cdc, 0x75},
124138fc5136SShawn Tu 	{0x5cdd, 0x75},
124238fc5136SShawn Tu 	{0x5cde, 0x75},
124338fc5136SShawn Tu 	{0x5cdf, 0x75},
124438fc5136SShawn Tu 	{0x5ce0, 0x75},
124538fc5136SShawn Tu 	{0x5ce1, 0x75},
124638fc5136SShawn Tu 	{0x5ce2, 0x75},
124738fc5136SShawn Tu 	{0x5ce3, 0x75},
124838fc5136SShawn Tu 	{0x5ce4, 0x75},
124938fc5136SShawn Tu 	{0x5ce5, 0x75},
125038fc5136SShawn Tu 	{0x5ce6, 0x75},
125138fc5136SShawn Tu 	{0x5ce7, 0x75},
125238fc5136SShawn Tu 	{0x5ce8, 0x75},
125338fc5136SShawn Tu 	{0x5ce9, 0x75},
125438fc5136SShawn Tu 	{0x5cea, 0x75},
125538fc5136SShawn Tu 	{0x5ceb, 0x75},
125638fc5136SShawn Tu 	{0x5cec, 0x75},
125738fc5136SShawn Tu 	{0x5ced, 0x75},
125838fc5136SShawn Tu 	{0x5cee, 0x75},
125938fc5136SShawn Tu 	{0x5cef, 0x75},
126038fc5136SShawn Tu 	{0x5cf0, 0x75},
126138fc5136SShawn Tu 	{0x5cf1, 0x75},
126238fc5136SShawn Tu 	{0x5cf2, 0x75},
126338fc5136SShawn Tu 	{0x5cf3, 0x75},
126438fc5136SShawn Tu 	{0x5cf4, 0x75},
126538fc5136SShawn Tu 	{0x5cf5, 0x75},
126638fc5136SShawn Tu 	{0x5cf6, 0x75},
126738fc5136SShawn Tu 	{0x5cf7, 0x75},
126838fc5136SShawn Tu 	{0x5cf8, 0x75},
126938fc5136SShawn Tu 	{0x5cf9, 0x75},
127038fc5136SShawn Tu 	{0x5cfa, 0x75},
127138fc5136SShawn Tu 	{0x5cfb, 0x75},
127238fc5136SShawn Tu 	{0x5cfc, 0x75},
127338fc5136SShawn Tu 	{0x5cfd, 0x75},
127438fc5136SShawn Tu 	{0x5cfe, 0x75},
127538fc5136SShawn Tu 	{0x5cff, 0x75},
127638fc5136SShawn Tu 	{0x5d00, 0x75},
127738fc5136SShawn Tu 	{0x5d01, 0x75},
127838fc5136SShawn Tu 	{0x5d02, 0x75},
127938fc5136SShawn Tu 	{0x5d03, 0x75},
128038fc5136SShawn Tu 	{0x5d04, 0x75},
128138fc5136SShawn Tu 	{0x5d05, 0x75},
128238fc5136SShawn Tu 	{0x5d06, 0x75},
128338fc5136SShawn Tu 	{0x5d07, 0x75},
128438fc5136SShawn Tu 	{0x5d08, 0x75},
128538fc5136SShawn Tu 	{0x5d09, 0x75},
128638fc5136SShawn Tu 	{0x5d0a, 0x75},
128738fc5136SShawn Tu 	{0x5d0b, 0x75},
128838fc5136SShawn Tu 	{0x5d0c, 0x75},
128938fc5136SShawn Tu 	{0x5d0d, 0x75},
129038fc5136SShawn Tu 	{0x5d0e, 0x75},
129138fc5136SShawn Tu 	{0x5d0f, 0x75},
129238fc5136SShawn Tu 	{0x5d10, 0x75},
129338fc5136SShawn Tu 	{0x5d11, 0x75},
129438fc5136SShawn Tu 	{0x5d12, 0x75},
129538fc5136SShawn Tu 	{0x5d13, 0x75},
129638fc5136SShawn Tu 	{0x5d14, 0x75},
129738fc5136SShawn Tu 	{0x5d15, 0x75},
129838fc5136SShawn Tu 	{0x5d16, 0x75},
129938fc5136SShawn Tu 	{0x5d17, 0x75},
130038fc5136SShawn Tu 	{0x5d18, 0x75},
130138fc5136SShawn Tu 	{0x5d19, 0x75},
130238fc5136SShawn Tu 	{0x5d1a, 0x75},
130338fc5136SShawn Tu 	{0x5d1b, 0x75},
130438fc5136SShawn Tu 	{0x5d1c, 0x75},
130538fc5136SShawn Tu 	{0x5d1d, 0x75},
130638fc5136SShawn Tu 	{0x5d1e, 0x75},
130738fc5136SShawn Tu 	{0x5d1f, 0x75},
130838fc5136SShawn Tu 	{0x5d20, 0x75},
130938fc5136SShawn Tu 	{0x5d21, 0x75},
131038fc5136SShawn Tu 	{0x5d22, 0x75},
131138fc5136SShawn Tu 	{0x5d23, 0x75},
131238fc5136SShawn Tu 	{0x5d24, 0x75},
131338fc5136SShawn Tu 	{0x5d25, 0x75},
131438fc5136SShawn Tu 	{0x5d26, 0x75},
131538fc5136SShawn Tu 	{0x5d27, 0x75},
131638fc5136SShawn Tu 	{0x5d28, 0x75},
131738fc5136SShawn Tu 	{0x5d29, 0x75},
131838fc5136SShawn Tu 	{0x5d2a, 0x75},
131938fc5136SShawn Tu 	{0x5d2b, 0x75},
132038fc5136SShawn Tu 	{0x5d2c, 0x75},
132138fc5136SShawn Tu 	{0x5d2d, 0x75},
132238fc5136SShawn Tu 	{0x5d2e, 0x75},
132338fc5136SShawn Tu 	{0x5d2f, 0x75},
132438fc5136SShawn Tu 	{0x5d30, 0x75},
132538fc5136SShawn Tu 	{0x5d31, 0x75},
132638fc5136SShawn Tu 	{0x5d32, 0x75},
132738fc5136SShawn Tu 	{0x5d33, 0x75},
132838fc5136SShawn Tu 	{0x5d34, 0x75},
132938fc5136SShawn Tu 	{0x5d35, 0x75},
133038fc5136SShawn Tu 	{0x5d36, 0x75},
133138fc5136SShawn Tu 	{0x5d37, 0x75},
133238fc5136SShawn Tu 	{0x5d38, 0x75},
133338fc5136SShawn Tu 	{0x5d39, 0x75},
133438fc5136SShawn Tu 	{0x5d3a, 0x75},
133538fc5136SShawn Tu 	{0x5d3b, 0x75},
133638fc5136SShawn Tu 	{0x5d3c, 0x75},
133738fc5136SShawn Tu 	{0x5d3d, 0x75},
133838fc5136SShawn Tu 	{0x5d3e, 0x75},
133938fc5136SShawn Tu 	{0x5d3f, 0x75},
134038fc5136SShawn Tu 	{0x5d40, 0x75},
134138fc5136SShawn Tu 	{0x5d41, 0x75},
134238fc5136SShawn Tu 	{0x5d42, 0x75},
134338fc5136SShawn Tu 	{0x5d43, 0x75},
134438fc5136SShawn Tu 	{0x5d44, 0x75},
134538fc5136SShawn Tu 	{0x5d45, 0x75},
134638fc5136SShawn Tu 	{0x5d46, 0x75},
134738fc5136SShawn Tu 	{0x5d47, 0x75},
134838fc5136SShawn Tu 	{0x5d48, 0x75},
134938fc5136SShawn Tu 	{0x5d49, 0x75},
135038fc5136SShawn Tu 	{0x5d4a, 0x75},
135138fc5136SShawn Tu 	{0x5d4b, 0x75},
135238fc5136SShawn Tu 	{0x5d4c, 0x75},
135338fc5136SShawn Tu 	{0x5d4d, 0x75},
135438fc5136SShawn Tu 	{0x5d4e, 0x75},
135538fc5136SShawn Tu 	{0x5d4f, 0x75},
135638fc5136SShawn Tu 	{0x5d50, 0x75},
135738fc5136SShawn Tu 	{0x5d51, 0x75},
135838fc5136SShawn Tu 	{0x5d52, 0x75},
135938fc5136SShawn Tu 	{0x5d53, 0x75},
136038fc5136SShawn Tu 	{0x5d54, 0x75},
136138fc5136SShawn Tu 	{0x5d55, 0x75},
136238fc5136SShawn Tu 	{0x5d56, 0x75},
136338fc5136SShawn Tu 	{0x5d57, 0x75},
136438fc5136SShawn Tu 	{0x5d58, 0x75},
136538fc5136SShawn Tu 	{0x5d59, 0x75},
136638fc5136SShawn Tu 	{0x5d5a, 0x75},
136738fc5136SShawn Tu 	{0x5d5b, 0x75},
136838fc5136SShawn Tu 	{0x5d5c, 0x75},
136938fc5136SShawn Tu 	{0x5d5d, 0x75},
137038fc5136SShawn Tu 	{0x5d5e, 0x75},
137138fc5136SShawn Tu 	{0x5d5f, 0x75},
137238fc5136SShawn Tu 	{0x5d60, 0x75},
137338fc5136SShawn Tu 	{0x5d61, 0x75},
137438fc5136SShawn Tu 	{0x5d62, 0x75},
137538fc5136SShawn Tu 	{0x5d63, 0x75},
137638fc5136SShawn Tu 	{0x5d64, 0x75},
137738fc5136SShawn Tu 	{0x5d65, 0x75},
137838fc5136SShawn Tu 	{0x5d66, 0x75},
137938fc5136SShawn Tu 	{0x5d67, 0x75},
138038fc5136SShawn Tu 	{0x5d68, 0x75},
138138fc5136SShawn Tu 	{0x5d69, 0x75},
138238fc5136SShawn Tu 	{0x5d6a, 0x75},
138338fc5136SShawn Tu 	{0x5d6b, 0x75},
138438fc5136SShawn Tu 	{0x5d6c, 0x75},
138538fc5136SShawn Tu 	{0x5d6d, 0x75},
138638fc5136SShawn Tu 	{0x5d6e, 0x75},
138738fc5136SShawn Tu 	{0x5d6f, 0x75},
138838fc5136SShawn Tu 	{0x5d70, 0x75},
138938fc5136SShawn Tu 	{0x5d71, 0x75},
139038fc5136SShawn Tu 	{0x5d72, 0x75},
139138fc5136SShawn Tu 	{0x5d73, 0x75},
139238fc5136SShawn Tu 	{0x5d74, 0x75},
139338fc5136SShawn Tu 	{0x5d75, 0x75},
139438fc5136SShawn Tu 	{0x5d76, 0x75},
139538fc5136SShawn Tu 	{0x5d77, 0x75},
139638fc5136SShawn Tu 	{0x5d78, 0x75},
139738fc5136SShawn Tu 	{0x5d79, 0x75},
139838fc5136SShawn Tu 	{0x5d7a, 0x75},
139938fc5136SShawn Tu 	{0x5d7b, 0x75},
140038fc5136SShawn Tu 	{0x5d7c, 0x75},
140138fc5136SShawn Tu 	{0x5d7d, 0x75},
140238fc5136SShawn Tu 	{0x5d7e, 0x75},
140338fc5136SShawn Tu 	{0x5d7f, 0x75},
140438fc5136SShawn Tu 	{0x5d80, 0x75},
140538fc5136SShawn Tu 	{0x5d81, 0x75},
140638fc5136SShawn Tu 	{0x5d82, 0x75},
140738fc5136SShawn Tu 	{0x5d83, 0x75},
140838fc5136SShawn Tu 	{0x5d84, 0x75},
140938fc5136SShawn Tu 	{0x5d85, 0x75},
141038fc5136SShawn Tu 	{0x5d86, 0x75},
141138fc5136SShawn Tu 	{0x5d87, 0x75},
141238fc5136SShawn Tu 	{0x5d88, 0x75},
141338fc5136SShawn Tu 	{0x5d89, 0x75},
141438fc5136SShawn Tu 	{0x5d8a, 0x75},
141538fc5136SShawn Tu 	{0x5d8b, 0x75},
141638fc5136SShawn Tu 	{0x5d8c, 0x75},
141738fc5136SShawn Tu 	{0x5d8d, 0x75},
141838fc5136SShawn Tu 	{0x5d8e, 0x75},
141938fc5136SShawn Tu 	{0x5d8f, 0x75},
142038fc5136SShawn Tu 	{0x5d90, 0x75},
142138fc5136SShawn Tu 	{0x5d91, 0x75},
142238fc5136SShawn Tu 	{0x5d92, 0x75},
142338fc5136SShawn Tu 	{0x5d93, 0x75},
142438fc5136SShawn Tu 	{0x5d94, 0x75},
142538fc5136SShawn Tu 	{0x5d95, 0x75},
142638fc5136SShawn Tu 	{0x5d96, 0x75},
142738fc5136SShawn Tu 	{0x5d97, 0x75},
142838fc5136SShawn Tu 	{0x5d98, 0x75},
142938fc5136SShawn Tu 	{0x5d99, 0x75},
143038fc5136SShawn Tu 	{0x5d9a, 0x75},
143138fc5136SShawn Tu 	{0x5d9b, 0x75},
143238fc5136SShawn Tu 	{0x5d9c, 0x75},
143338fc5136SShawn Tu 	{0x5d9d, 0x75},
143438fc5136SShawn Tu 	{0x5d9e, 0x75},
143538fc5136SShawn Tu 	{0x5d9f, 0x75},
143638fc5136SShawn Tu 	{0x5da0, 0x75},
143738fc5136SShawn Tu 	{0x5da1, 0x75},
143838fc5136SShawn Tu 	{0x5da2, 0x75},
143938fc5136SShawn Tu 	{0x5da3, 0x75},
144038fc5136SShawn Tu 	{0x5da4, 0x75},
144138fc5136SShawn Tu 	{0x5da5, 0x75},
144238fc5136SShawn Tu 	{0x5da6, 0x75},
144338fc5136SShawn Tu 	{0x5da7, 0x75},
144438fc5136SShawn Tu 	{0x5da8, 0x75},
144538fc5136SShawn Tu 	{0x5da9, 0x75},
144638fc5136SShawn Tu 	{0x5daa, 0x75},
144738fc5136SShawn Tu 	{0x5dab, 0x75},
144838fc5136SShawn Tu 	{0x5dac, 0x75},
144938fc5136SShawn Tu 	{0x5dad, 0x75},
145038fc5136SShawn Tu 	{0x5dae, 0x75},
145138fc5136SShawn Tu 	{0x5daf, 0x75},
145238fc5136SShawn Tu 	{0x5db0, 0x75},
145338fc5136SShawn Tu 	{0x5db1, 0x75},
145438fc5136SShawn Tu 	{0x5db2, 0x75},
145538fc5136SShawn Tu 	{0x5db3, 0x75},
145638fc5136SShawn Tu 	{0x5db4, 0x75},
145738fc5136SShawn Tu 	{0x5db5, 0x75},
145838fc5136SShawn Tu 	{0x5db6, 0x75},
145938fc5136SShawn Tu 	{0x5db7, 0x75},
146038fc5136SShawn Tu 	{0x5db8, 0x75},
146138fc5136SShawn Tu 	{0x5db9, 0x75},
146238fc5136SShawn Tu 	{0x5dba, 0x75},
146338fc5136SShawn Tu 	{0x5dbb, 0x75},
146438fc5136SShawn Tu 	{0x5dbc, 0x75},
146538fc5136SShawn Tu 	{0x5dbd, 0x75},
146638fc5136SShawn Tu 	{0x5dbe, 0x75},
146738fc5136SShawn Tu 	{0x5dbf, 0x75},
146838fc5136SShawn Tu 	{0x5dc0, 0x75},
146938fc5136SShawn Tu 	{0x5dc1, 0x75},
147038fc5136SShawn Tu 	{0x5dc2, 0x75},
147138fc5136SShawn Tu 	{0x5dc3, 0x75},
147238fc5136SShawn Tu 	{0x5dc4, 0x75},
147338fc5136SShawn Tu 	{0x5dc5, 0x75},
147438fc5136SShawn Tu 	{0x5dc6, 0x75},
147538fc5136SShawn Tu 	{0x5dc7, 0x75},
147638fc5136SShawn Tu 	{0x5dc8, 0x75},
147738fc5136SShawn Tu 	{0x5dc9, 0x75},
147838fc5136SShawn Tu 	{0x5dca, 0x75},
147938fc5136SShawn Tu 	{0x5dcb, 0x75},
148038fc5136SShawn Tu 	{0x5dcc, 0x75},
148138fc5136SShawn Tu 	{0x5dcd, 0x75},
148238fc5136SShawn Tu 	{0x5dce, 0x75},
148338fc5136SShawn Tu 	{0x5dcf, 0x75},
148438fc5136SShawn Tu 	{0x5dd0, 0x75},
148538fc5136SShawn Tu 	{0x5dd1, 0x75},
148638fc5136SShawn Tu 	{0x5dd2, 0x75},
148738fc5136SShawn Tu 	{0x5dd3, 0x75},
148838fc5136SShawn Tu 	{0x5dd4, 0x75},
148938fc5136SShawn Tu 	{0x5dd5, 0x75},
149038fc5136SShawn Tu 	{0x5dd6, 0x75},
149138fc5136SShawn Tu 	{0x5dd7, 0x75},
149238fc5136SShawn Tu 	{0x5dd8, 0x75},
149338fc5136SShawn Tu 	{0x5dd9, 0x75},
149438fc5136SShawn Tu 	{0x5dda, 0x75},
149538fc5136SShawn Tu 	{0x5ddb, 0x75},
149638fc5136SShawn Tu 	{0x5ddc, 0x75},
149738fc5136SShawn Tu 	{0x5ddd, 0x75},
149838fc5136SShawn Tu 	{0x5dde, 0x75},
149938fc5136SShawn Tu 	{0x5ddf, 0x75},
150038fc5136SShawn Tu 	{0x5de0, 0x75},
150138fc5136SShawn Tu 	{0x5de1, 0x75},
150238fc5136SShawn Tu 	{0x5de2, 0x75},
150338fc5136SShawn Tu 	{0x5de3, 0x75},
150438fc5136SShawn Tu 	{0x5de4, 0x75},
150538fc5136SShawn Tu 	{0x5de5, 0x75},
150638fc5136SShawn Tu 	{0x5de6, 0x75},
150738fc5136SShawn Tu 	{0x5de7, 0x75},
150838fc5136SShawn Tu 	{0x5de8, 0x75},
150938fc5136SShawn Tu 	{0x5de9, 0x75},
151038fc5136SShawn Tu 	{0x5dea, 0x75},
151138fc5136SShawn Tu 	{0x5deb, 0x75},
151238fc5136SShawn Tu 	{0x5dec, 0x75},
151338fc5136SShawn Tu 	{0x5ded, 0x75},
151438fc5136SShawn Tu 	{0x5dee, 0x75},
151538fc5136SShawn Tu 	{0x5def, 0x75},
151638fc5136SShawn Tu 	{0x5df0, 0x75},
151738fc5136SShawn Tu 	{0x5df1, 0x75},
151838fc5136SShawn Tu 	{0x5df2, 0x75},
151938fc5136SShawn Tu 	{0x5df3, 0x75},
152038fc5136SShawn Tu 	{0x5df4, 0x75},
152138fc5136SShawn Tu 	{0x5df5, 0x75},
152238fc5136SShawn Tu 	{0x5df6, 0x75},
152338fc5136SShawn Tu 	{0x5df7, 0x75},
152438fc5136SShawn Tu 	{0x5df8, 0x75},
152538fc5136SShawn Tu 	{0x5df9, 0x75},
152638fc5136SShawn Tu 	{0x5dfa, 0x75},
152738fc5136SShawn Tu 	{0x5dfb, 0x75},
152838fc5136SShawn Tu 	{0x5dfc, 0x75},
152938fc5136SShawn Tu 	{0x5dfd, 0x75},
153038fc5136SShawn Tu 	{0x5dfe, 0x75},
153138fc5136SShawn Tu 	{0x5dff, 0x75},
153238fc5136SShawn Tu 	{0x5e00, 0x75},
153338fc5136SShawn Tu 	{0x5e01, 0x75},
153438fc5136SShawn Tu 	{0x5e02, 0x75},
153538fc5136SShawn Tu 	{0x5e03, 0x75},
153638fc5136SShawn Tu 	{0x5e04, 0x75},
153738fc5136SShawn Tu 	{0x5e05, 0x75},
153838fc5136SShawn Tu 	{0x5e06, 0x75},
153938fc5136SShawn Tu 	{0x5e07, 0x75},
154038fc5136SShawn Tu 	{0x5e08, 0x75},
154138fc5136SShawn Tu 	{0x5e09, 0x75},
154238fc5136SShawn Tu 	{0x5e0a, 0x75},
154338fc5136SShawn Tu 	{0x5e0b, 0x75},
154438fc5136SShawn Tu 	{0x5e0c, 0x75},
154538fc5136SShawn Tu 	{0x5e0d, 0x75},
154638fc5136SShawn Tu 	{0x5e0e, 0x75},
154738fc5136SShawn Tu 	{0x5e0f, 0x75},
154838fc5136SShawn Tu 	{0x5e10, 0x75},
154938fc5136SShawn Tu 	{0x5e11, 0x75},
155038fc5136SShawn Tu 	{0x5e12, 0x75},
155138fc5136SShawn Tu 	{0x5e13, 0x75},
155238fc5136SShawn Tu 	{0x5e14, 0x75},
155338fc5136SShawn Tu 	{0x5e15, 0x75},
155438fc5136SShawn Tu 	{0x5e16, 0x75},
155538fc5136SShawn Tu 	{0x5e17, 0x75},
155638fc5136SShawn Tu 	{0x5e18, 0x75},
155738fc5136SShawn Tu 	{0x5e19, 0x75},
155838fc5136SShawn Tu 	{0x5e1a, 0x75},
155938fc5136SShawn Tu 	{0x5e1b, 0x75},
156038fc5136SShawn Tu 	{0x5e1c, 0x75},
156138fc5136SShawn Tu 	{0x5e1d, 0x75},
156238fc5136SShawn Tu 	{0x5e1e, 0x75},
156338fc5136SShawn Tu 	{0x5e1f, 0x75},
156438fc5136SShawn Tu 	{0x5e20, 0x75},
156538fc5136SShawn Tu 	{0x5e21, 0x75},
156638fc5136SShawn Tu 	{0x5e22, 0x75},
156738fc5136SShawn Tu 	{0x5e23, 0x75},
156838fc5136SShawn Tu 	{0x5e24, 0x75},
156938fc5136SShawn Tu 	{0x5e25, 0x75},
157038fc5136SShawn Tu 	{0x5e26, 0x75},
157138fc5136SShawn Tu 	{0x5e27, 0x75},
157238fc5136SShawn Tu 	{0x5e28, 0x75},
157338fc5136SShawn Tu 	{0x5e29, 0x75},
157438fc5136SShawn Tu 	{0x5e2a, 0x75},
157538fc5136SShawn Tu 	{0x5e2b, 0x75},
157638fc5136SShawn Tu 	{0x5e2c, 0x75},
157738fc5136SShawn Tu 	{0x5e2d, 0x75},
157838fc5136SShawn Tu 	{0x5e2e, 0x75},
157938fc5136SShawn Tu 	{0x5e2f, 0x75},
158038fc5136SShawn Tu 	{0x5e30, 0x75},
158138fc5136SShawn Tu 	{0x5e31, 0x75},
158238fc5136SShawn Tu 	{0x5e32, 0x75},
158338fc5136SShawn Tu 	{0x5e33, 0x75},
158438fc5136SShawn Tu 	{0x5e34, 0x75},
158538fc5136SShawn Tu 	{0x5e35, 0x75},
158638fc5136SShawn Tu 	{0x5e36, 0x75},
158738fc5136SShawn Tu 	{0x5e37, 0x75},
158838fc5136SShawn Tu 	{0x5e38, 0x75},
158938fc5136SShawn Tu 	{0x5e39, 0x75},
159038fc5136SShawn Tu 	{0x5e3a, 0x75},
159138fc5136SShawn Tu 	{0x5e3b, 0x75},
159238fc5136SShawn Tu 	{0x5e3c, 0x75},
159338fc5136SShawn Tu 	{0x5e3d, 0x75},
159438fc5136SShawn Tu 	{0x5e3e, 0x75},
159538fc5136SShawn Tu 	{0x5e3f, 0x75},
159638fc5136SShawn Tu 	{0x5e40, 0x75},
159738fc5136SShawn Tu 	{0x5e41, 0x75},
159838fc5136SShawn Tu 	{0x5e42, 0x75},
159938fc5136SShawn Tu 	{0x5e43, 0x75},
160038fc5136SShawn Tu 	{0x5e44, 0x75},
160138fc5136SShawn Tu 	{0x5e45, 0x75},
160238fc5136SShawn Tu 	{0x5e46, 0x75},
160338fc5136SShawn Tu 	{0x5e47, 0x75},
160438fc5136SShawn Tu 	{0x5e48, 0x75},
160538fc5136SShawn Tu 	{0x5e49, 0x75},
160638fc5136SShawn Tu 	{0x5e4a, 0x75},
160738fc5136SShawn Tu 	{0x5e4b, 0x75},
160838fc5136SShawn Tu 	{0x5e4c, 0x75},
160938fc5136SShawn Tu 	{0x5e4d, 0x75},
161038fc5136SShawn Tu 	{0x5e4e, 0x75},
161138fc5136SShawn Tu 	{0x5e4f, 0x75},
161238fc5136SShawn Tu 	{0x5e50, 0x75},
161338fc5136SShawn Tu 	{0x5e51, 0x75},
161438fc5136SShawn Tu 	{0x5e52, 0x75},
161538fc5136SShawn Tu 	{0x5e53, 0x75},
161638fc5136SShawn Tu 	{0x5e54, 0x75},
161738fc5136SShawn Tu 	{0x5e55, 0x75},
161838fc5136SShawn Tu 	{0x5e56, 0x75},
161938fc5136SShawn Tu 	{0x5e57, 0x75},
162038fc5136SShawn Tu 	{0x5e58, 0x75},
162138fc5136SShawn Tu 	{0x5e59, 0x75},
162238fc5136SShawn Tu 	{0x5e5a, 0x75},
162338fc5136SShawn Tu 	{0x5e5b, 0x75},
162438fc5136SShawn Tu 	{0x5e5c, 0x75},
162538fc5136SShawn Tu 	{0x5e5d, 0x75},
162638fc5136SShawn Tu 	{0x5e5e, 0x75},
162738fc5136SShawn Tu 	{0x5e5f, 0x75},
162838fc5136SShawn Tu 	{0x5e60, 0x75},
162938fc5136SShawn Tu 	{0x5e61, 0x75},
163038fc5136SShawn Tu 	{0x5e62, 0x75},
163138fc5136SShawn Tu 	{0x5e63, 0x75},
163238fc5136SShawn Tu 	{0x5e64, 0x75},
163338fc5136SShawn Tu 	{0x5e65, 0x75},
163438fc5136SShawn Tu 	{0x5e66, 0x75},
163538fc5136SShawn Tu 	{0x5e67, 0x75},
163638fc5136SShawn Tu 	{0x5e68, 0x75},
163738fc5136SShawn Tu 	{0x5e69, 0x75},
163838fc5136SShawn Tu 	{0x5e6a, 0x75},
163938fc5136SShawn Tu 	{0x5e6b, 0x75},
164038fc5136SShawn Tu 	{0x5e6c, 0x75},
164138fc5136SShawn Tu 	{0x5e6d, 0x75},
164238fc5136SShawn Tu 	{0x5e6e, 0x75},
164338fc5136SShawn Tu 	{0x5e6f, 0x75},
164438fc5136SShawn Tu 	{0x5e70, 0x75},
164538fc5136SShawn Tu 	{0x5e71, 0x75},
164638fc5136SShawn Tu 	{0x5e72, 0x75},
164738fc5136SShawn Tu 	{0x5e73, 0x75},
164838fc5136SShawn Tu 	{0x5e74, 0x75},
164938fc5136SShawn Tu 	{0x5e75, 0x75},
165038fc5136SShawn Tu 	{0x5e76, 0x75},
165138fc5136SShawn Tu 	{0x5e77, 0x75},
165238fc5136SShawn Tu 	{0x5e78, 0x75},
165338fc5136SShawn Tu 	{0x5e79, 0x75},
165438fc5136SShawn Tu 	{0x5e7a, 0x75},
165538fc5136SShawn Tu 	{0x5e7b, 0x75},
165638fc5136SShawn Tu 	{0x5e7c, 0x75},
165738fc5136SShawn Tu 	{0x5e7d, 0x75},
165838fc5136SShawn Tu 	{0x5e7e, 0x75},
165938fc5136SShawn Tu 	{0x5e7f, 0x75},
166038fc5136SShawn Tu 	{0x5e80, 0x75},
166138fc5136SShawn Tu 	{0x5e81, 0x75},
166238fc5136SShawn Tu 	{0x5e82, 0x75},
166338fc5136SShawn Tu 	{0x5e83, 0x75},
166438fc5136SShawn Tu 	{0x5e84, 0x75},
166538fc5136SShawn Tu 	{0x5e85, 0x75},
166638fc5136SShawn Tu 	{0x5e86, 0x75},
166738fc5136SShawn Tu 	{0x5e87, 0x75},
166838fc5136SShawn Tu 	{0x5e88, 0x75},
166938fc5136SShawn Tu 	{0x5e89, 0x75},
167038fc5136SShawn Tu 	{0x5e8a, 0x75},
167138fc5136SShawn Tu 	{0x5e8b, 0x75},
167238fc5136SShawn Tu 	{0x5e8c, 0x75},
167338fc5136SShawn Tu 	{0x5e8d, 0x75},
167438fc5136SShawn Tu 	{0x5e8e, 0x75},
167538fc5136SShawn Tu 	{0x5e8f, 0x75},
167638fc5136SShawn Tu 	{0x5e90, 0x75},
167738fc5136SShawn Tu 	{0x5e91, 0x75},
167838fc5136SShawn Tu 	{0x5e92, 0x75},
167938fc5136SShawn Tu 	{0x5e93, 0x75},
168038fc5136SShawn Tu 	{0x5e94, 0x75},
168138fc5136SShawn Tu 	{0x5e95, 0x75},
168238fc5136SShawn Tu 	{0x5e96, 0x75},
168338fc5136SShawn Tu 	{0x5e97, 0x75},
168438fc5136SShawn Tu 	{0x5e98, 0x75},
168538fc5136SShawn Tu 	{0x5e99, 0x75},
168638fc5136SShawn Tu 	{0x5e9a, 0x75},
168738fc5136SShawn Tu 	{0x5e9b, 0x75},
168838fc5136SShawn Tu 	{0x5e9c, 0x75},
168938fc5136SShawn Tu 	{0x5e9d, 0x75},
169038fc5136SShawn Tu 	{0x5e9e, 0x75},
169138fc5136SShawn Tu 	{0x5e9f, 0x75},
169238fc5136SShawn Tu 	{0x5ea0, 0x75},
169338fc5136SShawn Tu 	{0x5ea1, 0x75},
169438fc5136SShawn Tu 	{0x5ea2, 0x75},
169538fc5136SShawn Tu 	{0x5ea3, 0x75},
169638fc5136SShawn Tu 	{0x5ea4, 0x75},
169738fc5136SShawn Tu 	{0x5ea5, 0x75},
169838fc5136SShawn Tu 	{0x5ea6, 0x75},
169938fc5136SShawn Tu 	{0x5ea7, 0x75},
170038fc5136SShawn Tu 	{0x5ea8, 0x75},
170138fc5136SShawn Tu 	{0x5ea9, 0x75},
170238fc5136SShawn Tu 	{0x5eaa, 0x75},
170338fc5136SShawn Tu 	{0x5eab, 0x75},
170438fc5136SShawn Tu 	{0x5eac, 0x75},
170538fc5136SShawn Tu 	{0x5ead, 0x75},
170638fc5136SShawn Tu 	{0x5eae, 0x75},
170738fc5136SShawn Tu 	{0x5eaf, 0x75},
170838fc5136SShawn Tu 	{0x5eb0, 0x75},
170938fc5136SShawn Tu 	{0x5eb1, 0x75},
171038fc5136SShawn Tu 	{0x5eb2, 0x75},
171138fc5136SShawn Tu 	{0x5eb3, 0x75},
171238fc5136SShawn Tu 	{0x5eb4, 0x75},
171338fc5136SShawn Tu 	{0x5eb5, 0x75},
171438fc5136SShawn Tu 	{0x5eb6, 0x75},
171538fc5136SShawn Tu 	{0x5eb7, 0x75},
171638fc5136SShawn Tu 	{0x5eb8, 0x75},
171738fc5136SShawn Tu 	{0x5eb9, 0x75},
171838fc5136SShawn Tu 	{0x5eba, 0x75},
171938fc5136SShawn Tu 	{0x5ebb, 0x75},
172038fc5136SShawn Tu 	{0x5ebc, 0x75},
172138fc5136SShawn Tu 	{0x5ebd, 0x75},
172238fc5136SShawn Tu 	{0x5ebe, 0x75},
172338fc5136SShawn Tu 	{0x5ebf, 0x75},
172438fc5136SShawn Tu 	{0x5ec0, 0x75},
172538fc5136SShawn Tu 	{0x5ec1, 0x75},
172638fc5136SShawn Tu 	{0x5ec2, 0x75},
172738fc5136SShawn Tu 	{0x5ec3, 0x75},
172838fc5136SShawn Tu 	{0x5ec4, 0x75},
172938fc5136SShawn Tu 	{0x5ec5, 0x75},
173038fc5136SShawn Tu 	{0x5ec6, 0x75},
173138fc5136SShawn Tu 	{0x5ec7, 0x75},
173238fc5136SShawn Tu 	{0x5ec8, 0x75},
173338fc5136SShawn Tu 	{0x5ec9, 0x75},
173438fc5136SShawn Tu 	{0x5eca, 0x75},
173538fc5136SShawn Tu 	{0x5ecb, 0x75},
173638fc5136SShawn Tu 	{0x5ecc, 0x75},
173738fc5136SShawn Tu 	{0x5ecd, 0x75},
173838fc5136SShawn Tu 	{0x5ece, 0x75},
173938fc5136SShawn Tu 	{0x5ecf, 0x75},
174038fc5136SShawn Tu 	{0x5ed0, 0x75},
174138fc5136SShawn Tu 	{0x5ed1, 0x75},
174238fc5136SShawn Tu 	{0x5ed2, 0x75},
174338fc5136SShawn Tu 	{0x5ed3, 0x75},
174438fc5136SShawn Tu 	{0x5ed4, 0x75},
174538fc5136SShawn Tu 	{0x5ed5, 0x75},
174638fc5136SShawn Tu 	{0x5ed6, 0x75},
174738fc5136SShawn Tu 	{0x5ed7, 0x75},
174838fc5136SShawn Tu 	{0x5ed8, 0x75},
174938fc5136SShawn Tu 	{0x5ed9, 0x75},
175038fc5136SShawn Tu 	{0x5eda, 0x75},
175138fc5136SShawn Tu 	{0x5edb, 0x75},
175238fc5136SShawn Tu 	{0x5edc, 0x75},
175338fc5136SShawn Tu 	{0x5edd, 0x75},
175438fc5136SShawn Tu 	{0x5ede, 0x75},
175538fc5136SShawn Tu 	{0x5edf, 0x75},
175638fc5136SShawn Tu 	{0x5ee0, 0x75},
175738fc5136SShawn Tu 	{0x5ee1, 0x75},
175838fc5136SShawn Tu 	{0x5ee2, 0x75},
175938fc5136SShawn Tu 	{0x5ee3, 0x75},
176038fc5136SShawn Tu 	{0x5ee4, 0x75},
176138fc5136SShawn Tu 	{0x5ee5, 0x75},
176238fc5136SShawn Tu 	{0x5ee6, 0x75},
176338fc5136SShawn Tu 	{0x5ee7, 0x75},
176438fc5136SShawn Tu 	{0x5ee8, 0x75},
176538fc5136SShawn Tu 	{0x5ee9, 0x75},
176638fc5136SShawn Tu 	{0x5eea, 0x75},
176738fc5136SShawn Tu 	{0x5eeb, 0x75},
176838fc5136SShawn Tu 	{0x5eec, 0x75},
176938fc5136SShawn Tu 	{0x5eed, 0x75},
177038fc5136SShawn Tu 	{0x5eee, 0x75},
177138fc5136SShawn Tu 	{0x5eef, 0x75},
177238fc5136SShawn Tu 	{0x5ef0, 0x75},
177338fc5136SShawn Tu 	{0x5ef1, 0x75},
177438fc5136SShawn Tu 	{0x5ef2, 0x75},
177538fc5136SShawn Tu 	{0x5ef3, 0x75},
177638fc5136SShawn Tu 	{0x5ef4, 0x75},
177738fc5136SShawn Tu 	{0x5ef5, 0x75},
177838fc5136SShawn Tu 	{0x5ef6, 0x75},
177938fc5136SShawn Tu 	{0x5ef7, 0x75},
178038fc5136SShawn Tu 	{0x5ef8, 0x75},
178138fc5136SShawn Tu 	{0x5ef9, 0x75},
178238fc5136SShawn Tu 	{0x5efa, 0x75},
178338fc5136SShawn Tu 	{0x5efb, 0x75},
178438fc5136SShawn Tu 	{0x5efc, 0x75},
178538fc5136SShawn Tu 	{0x5efd, 0x75},
178638fc5136SShawn Tu 	{0x5efe, 0x75},
178738fc5136SShawn Tu 	{0x5eff, 0x75},
178838fc5136SShawn Tu 	{0x5f00, 0x75},
178938fc5136SShawn Tu 	{0x5f01, 0x75},
179038fc5136SShawn Tu 	{0x5f02, 0x75},
179138fc5136SShawn Tu 	{0x5f03, 0x75},
179238fc5136SShawn Tu 	{0x5f04, 0x75},
179338fc5136SShawn Tu 	{0x5f05, 0x75},
179438fc5136SShawn Tu 	{0x5f06, 0x75},
179538fc5136SShawn Tu 	{0x5f07, 0x75},
179638fc5136SShawn Tu 	{0x5f08, 0x75},
179738fc5136SShawn Tu 	{0x5f09, 0x75},
179838fc5136SShawn Tu 	{0x5f0a, 0x75},
179938fc5136SShawn Tu 	{0x5f0b, 0x75},
180038fc5136SShawn Tu 	{0x5f0c, 0x75},
180138fc5136SShawn Tu 	{0x5f0d, 0x75},
180238fc5136SShawn Tu 	{0x5f0e, 0x75},
180338fc5136SShawn Tu 	{0x5f0f, 0x75},
180438fc5136SShawn Tu 	{0x5f10, 0x75},
180538fc5136SShawn Tu 	{0x5f11, 0x75},
180638fc5136SShawn Tu 	{0x5f12, 0x75},
180738fc5136SShawn Tu 	{0x5f13, 0x75},
180838fc5136SShawn Tu 	{0x5f14, 0x75},
180938fc5136SShawn Tu 	{0x5f15, 0x75},
181038fc5136SShawn Tu 	{0x5f16, 0x75},
181138fc5136SShawn Tu 	{0x5f17, 0x75},
181238fc5136SShawn Tu 	{0x5f18, 0x75},
181338fc5136SShawn Tu 	{0x5f19, 0x75},
181438fc5136SShawn Tu 	{0x5f1a, 0x75},
181538fc5136SShawn Tu 	{0x5f1b, 0x75},
181638fc5136SShawn Tu 	{0x5f1c, 0x75},
181738fc5136SShawn Tu 	{0x5f1d, 0x75},
181838fc5136SShawn Tu 	{0x5f1e, 0x75},
181938fc5136SShawn Tu 	{0x5f1f, 0x75},
182038fc5136SShawn Tu };
182138fc5136SShawn Tu 
182238fc5136SShawn Tu static const struct ov08x40_reg mode_1928x1208_regs[] = {
182338fc5136SShawn Tu 	{0x5000, 0x55},
182438fc5136SShawn Tu 	{0x5001, 0x00},
182538fc5136SShawn Tu 	{0x5008, 0xb0},
182638fc5136SShawn Tu 	{0x50c1, 0x00},
182738fc5136SShawn Tu 	{0x53c1, 0x00},
182838fc5136SShawn Tu 	{0x5f40, 0x00},
182938fc5136SShawn Tu 	{0x5f41, 0x40},
183038fc5136SShawn Tu 	{0x0300, 0x3a},
183138fc5136SShawn Tu 	{0x0301, 0xc8},
183238fc5136SShawn Tu 	{0x0302, 0x31},
183338fc5136SShawn Tu 	{0x0303, 0x03},
183438fc5136SShawn Tu 	{0x0304, 0x01},
183538fc5136SShawn Tu 	{0x0305, 0xa1},
183638fc5136SShawn Tu 	{0x0306, 0x04},
183738fc5136SShawn Tu 	{0x0307, 0x01},
183838fc5136SShawn Tu 	{0x0308, 0x03},
183938fc5136SShawn Tu 	{0x0309, 0x03},
184038fc5136SShawn Tu 	{0x0310, 0x0a},
184138fc5136SShawn Tu 	{0x0311, 0x02},
184238fc5136SShawn Tu 	{0x0312, 0x01},
184338fc5136SShawn Tu 	{0x0313, 0x08},
184438fc5136SShawn Tu 	{0x0314, 0x66},
184538fc5136SShawn Tu 	{0x0315, 0x00},
184638fc5136SShawn Tu 	{0x0316, 0x34},
184738fc5136SShawn Tu 	{0x0320, 0x02},
184838fc5136SShawn Tu 	{0x0321, 0x03},
184938fc5136SShawn Tu 	{0x0323, 0x05},
185038fc5136SShawn Tu 	{0x0324, 0x01},
185138fc5136SShawn Tu 	{0x0325, 0xb8},
185238fc5136SShawn Tu 	{0x0326, 0x4a},
185338fc5136SShawn Tu 	{0x0327, 0x04},
185438fc5136SShawn Tu 	{0x0329, 0x00},
185538fc5136SShawn Tu 	{0x032a, 0x05},
185638fc5136SShawn Tu 	{0x032b, 0x00},
185738fc5136SShawn Tu 	{0x032c, 0x00},
185838fc5136SShawn Tu 	{0x032d, 0x00},
185938fc5136SShawn Tu 	{0x032e, 0x02},
186038fc5136SShawn Tu 	{0x032f, 0xa0},
186138fc5136SShawn Tu 	{0x0350, 0x00},
186238fc5136SShawn Tu 	{0x0360, 0x01},
186338fc5136SShawn Tu 	{0x1216, 0x60},
186438fc5136SShawn Tu 	{0x1217, 0x5b},
186538fc5136SShawn Tu 	{0x1218, 0x00},
186638fc5136SShawn Tu 	{0x1220, 0x24},
186738fc5136SShawn Tu 	{0x198a, 0x00},
186838fc5136SShawn Tu 	{0x198b, 0x01},
186938fc5136SShawn Tu 	{0x198e, 0x00},
187038fc5136SShawn Tu 	{0x198f, 0x01},
187138fc5136SShawn Tu 	{0x3009, 0x04},
187238fc5136SShawn Tu 	{0x3012, 0x41},
187338fc5136SShawn Tu 	{0x3015, 0x00},
187438fc5136SShawn Tu 	{0x3016, 0xb0},
187538fc5136SShawn Tu 	{0x3017, 0xf0},
187638fc5136SShawn Tu 	{0x3018, 0xf0},
187738fc5136SShawn Tu 	{0x3019, 0xd2},
187838fc5136SShawn Tu 	{0x301a, 0xb0},
187938fc5136SShawn Tu 	{0x301c, 0x81},
188038fc5136SShawn Tu 	{0x301d, 0x02},
188138fc5136SShawn Tu 	{0x301e, 0x80},
188238fc5136SShawn Tu 	{0x3022, 0xf0},
188338fc5136SShawn Tu 	{0x3025, 0x89},
188438fc5136SShawn Tu 	{0x3030, 0x03},
188538fc5136SShawn Tu 	{0x3044, 0xc2},
188638fc5136SShawn Tu 	{0x3050, 0x35},
188738fc5136SShawn Tu 	{0x3051, 0x60},
188838fc5136SShawn Tu 	{0x3052, 0x25},
188938fc5136SShawn Tu 	{0x3053, 0x00},
189038fc5136SShawn Tu 	{0x3054, 0x00},
189138fc5136SShawn Tu 	{0x3055, 0x02},
189238fc5136SShawn Tu 	{0x3056, 0x80},
189338fc5136SShawn Tu 	{0x3057, 0x80},
189438fc5136SShawn Tu 	{0x3058, 0x80},
189538fc5136SShawn Tu 	{0x3059, 0x00},
189638fc5136SShawn Tu 	{0x3107, 0x86},
189738fc5136SShawn Tu 	{0x3400, 0x1c},
189838fc5136SShawn Tu 	{0x3401, 0x80},
189938fc5136SShawn Tu 	{0x3402, 0x8c},
190038fc5136SShawn Tu 	{0x3419, 0x08},
190138fc5136SShawn Tu 	{0x341a, 0xaf},
190238fc5136SShawn Tu 	{0x341b, 0x30},
190338fc5136SShawn Tu 	{0x3420, 0x00},
190438fc5136SShawn Tu 	{0x3421, 0x00},
190538fc5136SShawn Tu 	{0x3422, 0x00},
190638fc5136SShawn Tu 	{0x3423, 0x00},
190738fc5136SShawn Tu 	{0x3424, 0x00},
190838fc5136SShawn Tu 	{0x3425, 0x00},
190938fc5136SShawn Tu 	{0x3426, 0x00},
191038fc5136SShawn Tu 	{0x3427, 0x00},
191138fc5136SShawn Tu 	{0x3428, 0x0f},
191238fc5136SShawn Tu 	{0x3429, 0x00},
191338fc5136SShawn Tu 	{0x342a, 0x00},
191438fc5136SShawn Tu 	{0x342b, 0x00},
191538fc5136SShawn Tu 	{0x342c, 0x00},
191638fc5136SShawn Tu 	{0x342d, 0x00},
191738fc5136SShawn Tu 	{0x342e, 0x00},
191838fc5136SShawn Tu 	{0x342f, 0x11},
191938fc5136SShawn Tu 	{0x3430, 0x11},
192038fc5136SShawn Tu 	{0x3431, 0x10},
192138fc5136SShawn Tu 	{0x3432, 0x00},
192238fc5136SShawn Tu 	{0x3433, 0x00},
192338fc5136SShawn Tu 	{0x3434, 0x00},
192438fc5136SShawn Tu 	{0x3435, 0x00},
192538fc5136SShawn Tu 	{0x3436, 0x00},
192638fc5136SShawn Tu 	{0x3437, 0x00},
192738fc5136SShawn Tu 	{0x3442, 0x02},
192838fc5136SShawn Tu 	{0x3443, 0x02},
192938fc5136SShawn Tu 	{0x3444, 0x07},
193038fc5136SShawn Tu 	{0x3450, 0x00},
193138fc5136SShawn Tu 	{0x3451, 0x00},
193238fc5136SShawn Tu 	{0x3452, 0x18},
193338fc5136SShawn Tu 	{0x3453, 0x18},
193438fc5136SShawn Tu 	{0x3454, 0x00},
193538fc5136SShawn Tu 	{0x3455, 0x80},
193638fc5136SShawn Tu 	{0x3456, 0x08},
193738fc5136SShawn Tu 	{0x3500, 0x00},
193838fc5136SShawn Tu 	{0x3501, 0x02},
193938fc5136SShawn Tu 	{0x3502, 0x00},
194038fc5136SShawn Tu 	{0x3504, 0x4c},
194138fc5136SShawn Tu 	{0x3506, 0x30},
194238fc5136SShawn Tu 	{0x3507, 0x00},
194338fc5136SShawn Tu 	{0x3508, 0x01},
194438fc5136SShawn Tu 	{0x3509, 0x00},
194538fc5136SShawn Tu 	{0x350a, 0x01},
194638fc5136SShawn Tu 	{0x350b, 0x00},
194738fc5136SShawn Tu 	{0x350c, 0x00},
194838fc5136SShawn Tu 	{0x3540, 0x00},
194938fc5136SShawn Tu 	{0x3541, 0x01},
195038fc5136SShawn Tu 	{0x3542, 0x00},
195138fc5136SShawn Tu 	{0x3544, 0x4c},
195238fc5136SShawn Tu 	{0x3546, 0x30},
195338fc5136SShawn Tu 	{0x3547, 0x00},
195438fc5136SShawn Tu 	{0x3548, 0x01},
195538fc5136SShawn Tu 	{0x3549, 0x00},
195638fc5136SShawn Tu 	{0x354a, 0x01},
195738fc5136SShawn Tu 	{0x354b, 0x00},
195838fc5136SShawn Tu 	{0x354c, 0x00},
195938fc5136SShawn Tu 	{0x3688, 0x02},
196038fc5136SShawn Tu 	{0x368a, 0x2e},
196138fc5136SShawn Tu 	{0x368e, 0x71},
196238fc5136SShawn Tu 	{0x3696, 0xd1},
196338fc5136SShawn Tu 	{0x3699, 0x00},
196438fc5136SShawn Tu 	{0x369a, 0x00},
196538fc5136SShawn Tu 	{0x36a4, 0x00},
196638fc5136SShawn Tu 	{0x36a6, 0x00},
196738fc5136SShawn Tu 	{0x3711, 0x00},
196838fc5136SShawn Tu 	{0x3712, 0x50},
196938fc5136SShawn Tu 	{0x3713, 0x00},
197038fc5136SShawn Tu 	{0x3714, 0x21},
197138fc5136SShawn Tu 	{0x3716, 0x00},
197238fc5136SShawn Tu 	{0x3718, 0x07},
197338fc5136SShawn Tu 	{0x371a, 0x1c},
197438fc5136SShawn Tu 	{0x371b, 0x00},
197538fc5136SShawn Tu 	{0x3720, 0x08},
197638fc5136SShawn Tu 	{0x3725, 0x32},
197738fc5136SShawn Tu 	{0x3727, 0x05},
197838fc5136SShawn Tu 	{0x3760, 0x02},
197938fc5136SShawn Tu 	{0x3761, 0x28},
198038fc5136SShawn Tu 	{0x3762, 0x02},
198138fc5136SShawn Tu 	{0x3763, 0x02},
198238fc5136SShawn Tu 	{0x3764, 0x02},
198338fc5136SShawn Tu 	{0x3765, 0x2c},
198438fc5136SShawn Tu 	{0x3766, 0x04},
198538fc5136SShawn Tu 	{0x3767, 0x2c},
198638fc5136SShawn Tu 	{0x3768, 0x02},
198738fc5136SShawn Tu 	{0x3769, 0x00},
198838fc5136SShawn Tu 	{0x376b, 0x20},
198938fc5136SShawn Tu 	{0x376e, 0x07},
199038fc5136SShawn Tu 	{0x37b0, 0x01},
199138fc5136SShawn Tu 	{0x37b1, 0x0f},
199238fc5136SShawn Tu 	{0x37b2, 0x01},
199338fc5136SShawn Tu 	{0x37b3, 0xd6},
199438fc5136SShawn Tu 	{0x37b4, 0x01},
199538fc5136SShawn Tu 	{0x37b5, 0x48},
199638fc5136SShawn Tu 	{0x37b6, 0x02},
199738fc5136SShawn Tu 	{0x37b7, 0x40},
199838fc5136SShawn Tu 	{0x3800, 0x00},
199938fc5136SShawn Tu 	{0x3801, 0x00},
200038fc5136SShawn Tu 	{0x3802, 0x00},
200138fc5136SShawn Tu 	{0x3803, 0x00},
200238fc5136SShawn Tu 	{0x3804, 0x0f},
200338fc5136SShawn Tu 	{0x3805, 0x1f},
200438fc5136SShawn Tu 	{0x3806, 0x09},
200538fc5136SShawn Tu 	{0x3807, 0x7f},
200638fc5136SShawn Tu 	{0x3808, 0x07},
200738fc5136SShawn Tu 	{0x3809, 0x88},
200838fc5136SShawn Tu 	{0x380a, 0x04},
200938fc5136SShawn Tu 	{0x380b, 0xb8},
201038fc5136SShawn Tu 	{0x380c, 0x02},
201138fc5136SShawn Tu 	{0x380d, 0xd0},
201238fc5136SShawn Tu 	{0x380e, 0x11},
201338fc5136SShawn Tu 	{0x380f, 0x5c},
201438fc5136SShawn Tu 	{0x3810, 0x00},
201538fc5136SShawn Tu 	{0x3811, 0x04},
201638fc5136SShawn Tu 	{0x3812, 0x00},
201738fc5136SShawn Tu 	{0x3813, 0x03},
201838fc5136SShawn Tu 	{0x3814, 0x11},
201938fc5136SShawn Tu 	{0x3815, 0x11},
202038fc5136SShawn Tu 	{0x3820, 0x02},
202138fc5136SShawn Tu 	{0x3821, 0x14},
202238fc5136SShawn Tu 	{0x3822, 0x00},
202338fc5136SShawn Tu 	{0x3823, 0x04},
202438fc5136SShawn Tu 	{0x3828, 0x0f},
202538fc5136SShawn Tu 	{0x382a, 0x80},
202638fc5136SShawn Tu 	{0x382e, 0x41},
202738fc5136SShawn Tu 	{0x3837, 0x08},
202838fc5136SShawn Tu 	{0x383a, 0x81},
202938fc5136SShawn Tu 	{0x383b, 0x81},
203038fc5136SShawn Tu 	{0x383c, 0x11},
203138fc5136SShawn Tu 	{0x383d, 0x11},
203238fc5136SShawn Tu 	{0x383e, 0x00},
203338fc5136SShawn Tu 	{0x383f, 0x38},
203438fc5136SShawn Tu 	{0x3840, 0x00},
203538fc5136SShawn Tu 	{0x3847, 0x00},
203638fc5136SShawn Tu 	{0x384a, 0x00},
203738fc5136SShawn Tu 	{0x384c, 0x02},
203838fc5136SShawn Tu 	{0x384d, 0xd0},
203938fc5136SShawn Tu 	{0x3856, 0x50},
204038fc5136SShawn Tu 	{0x3857, 0x30},
204138fc5136SShawn Tu 	{0x3858, 0x80},
204238fc5136SShawn Tu 	{0x3859, 0x40},
204338fc5136SShawn Tu 	{0x3860, 0x00},
204438fc5136SShawn Tu 	{0x3888, 0x00},
204538fc5136SShawn Tu 	{0x3889, 0x00},
204638fc5136SShawn Tu 	{0x388a, 0x00},
204738fc5136SShawn Tu 	{0x388b, 0x00},
204838fc5136SShawn Tu 	{0x388c, 0x00},
204938fc5136SShawn Tu 	{0x388d, 0x00},
205038fc5136SShawn Tu 	{0x388e, 0x00},
205138fc5136SShawn Tu 	{0x388f, 0x00},
205238fc5136SShawn Tu 	{0x3894, 0x00},
205338fc5136SShawn Tu 	{0x3895, 0x00},
205438fc5136SShawn Tu 	{0x3c84, 0x00},
205538fc5136SShawn Tu 	{0x3d85, 0x8b},
205638fc5136SShawn Tu 	{0x3daa, 0x80},
205738fc5136SShawn Tu 	{0x3dab, 0x14},
205838fc5136SShawn Tu 	{0x3dac, 0x80},
205938fc5136SShawn Tu 	{0x3dad, 0xc8},
206038fc5136SShawn Tu 	{0x3dae, 0x81},
206138fc5136SShawn Tu 	{0x3daf, 0x7b},
206238fc5136SShawn Tu 	{0x3f00, 0x10},
206338fc5136SShawn Tu 	{0x3f01, 0x11},
206438fc5136SShawn Tu 	{0x3f06, 0x0d},
206538fc5136SShawn Tu 	{0x3f07, 0x0b},
206638fc5136SShawn Tu 	{0x3f08, 0x0d},
206738fc5136SShawn Tu 	{0x3f09, 0x0b},
206838fc5136SShawn Tu 	{0x3f0a, 0x01},
206938fc5136SShawn Tu 	{0x3f0b, 0x11},
207038fc5136SShawn Tu 	{0x3f0c, 0x33},
207138fc5136SShawn Tu 	{0x4001, 0x07},
207238fc5136SShawn Tu 	{0x4007, 0x20},
207338fc5136SShawn Tu 	{0x4008, 0x00},
207438fc5136SShawn Tu 	{0x4009, 0x05},
207538fc5136SShawn Tu 	{0x400a, 0x00},
207638fc5136SShawn Tu 	{0x400b, 0x04},
207738fc5136SShawn Tu 	{0x400c, 0x00},
207838fc5136SShawn Tu 	{0x400d, 0x04},
207938fc5136SShawn Tu 	{0x400e, 0x14},
208038fc5136SShawn Tu 	{0x4010, 0xf4},
208138fc5136SShawn Tu 	{0x4011, 0x03},
208238fc5136SShawn Tu 	{0x4012, 0x55},
208338fc5136SShawn Tu 	{0x4015, 0x00},
208438fc5136SShawn Tu 	{0x4016, 0x27},
208538fc5136SShawn Tu 	{0x4017, 0x00},
208638fc5136SShawn Tu 	{0x4018, 0x0f},
208738fc5136SShawn Tu 	{0x401b, 0x08},
208838fc5136SShawn Tu 	{0x401c, 0x00},
208938fc5136SShawn Tu 	{0x401d, 0x10},
209038fc5136SShawn Tu 	{0x401e, 0x02},
209138fc5136SShawn Tu 	{0x401f, 0x00},
209238fc5136SShawn Tu 	{0x4050, 0x06},
209338fc5136SShawn Tu 	{0x4051, 0xff},
209438fc5136SShawn Tu 	{0x4052, 0xff},
209538fc5136SShawn Tu 	{0x4053, 0xff},
209638fc5136SShawn Tu 	{0x4054, 0xff},
209738fc5136SShawn Tu 	{0x4055, 0xff},
209838fc5136SShawn Tu 	{0x4056, 0xff},
209938fc5136SShawn Tu 	{0x4057, 0x7f},
210038fc5136SShawn Tu 	{0x4058, 0x00},
210138fc5136SShawn Tu 	{0x4059, 0x00},
210238fc5136SShawn Tu 	{0x405a, 0x00},
210338fc5136SShawn Tu 	{0x405b, 0x00},
210438fc5136SShawn Tu 	{0x405c, 0x07},
210538fc5136SShawn Tu 	{0x405d, 0xff},
210638fc5136SShawn Tu 	{0x405e, 0x07},
210738fc5136SShawn Tu 	{0x405f, 0xff},
210838fc5136SShawn Tu 	{0x4080, 0x78},
210938fc5136SShawn Tu 	{0x4081, 0x78},
211038fc5136SShawn Tu 	{0x4082, 0x78},
211138fc5136SShawn Tu 	{0x4083, 0x78},
211238fc5136SShawn Tu 	{0x4019, 0x00},
211338fc5136SShawn Tu 	{0x401a, 0x40},
211438fc5136SShawn Tu 	{0x4020, 0x04},
211538fc5136SShawn Tu 	{0x4021, 0x00},
211638fc5136SShawn Tu 	{0x4022, 0x04},
211738fc5136SShawn Tu 	{0x4023, 0x00},
211838fc5136SShawn Tu 	{0x4024, 0x04},
211938fc5136SShawn Tu 	{0x4025, 0x00},
212038fc5136SShawn Tu 	{0x4026, 0x04},
212138fc5136SShawn Tu 	{0x4027, 0x00},
212238fc5136SShawn Tu 	{0x4030, 0x00},
212338fc5136SShawn Tu 	{0x4031, 0x00},
212438fc5136SShawn Tu 	{0x4032, 0x00},
212538fc5136SShawn Tu 	{0x4033, 0x00},
212638fc5136SShawn Tu 	{0x4034, 0x00},
212738fc5136SShawn Tu 	{0x4035, 0x00},
212838fc5136SShawn Tu 	{0x4036, 0x00},
212938fc5136SShawn Tu 	{0x4037, 0x00},
213038fc5136SShawn Tu 	{0x4040, 0x00},
213138fc5136SShawn Tu 	{0x4041, 0x80},
213238fc5136SShawn Tu 	{0x4042, 0x00},
213338fc5136SShawn Tu 	{0x4043, 0x80},
213438fc5136SShawn Tu 	{0x4044, 0x00},
213538fc5136SShawn Tu 	{0x4045, 0x80},
213638fc5136SShawn Tu 	{0x4046, 0x00},
213738fc5136SShawn Tu 	{0x4047, 0x80},
213838fc5136SShawn Tu 	{0x4060, 0x00},
213938fc5136SShawn Tu 	{0x4061, 0x00},
214038fc5136SShawn Tu 	{0x4062, 0x00},
214138fc5136SShawn Tu 	{0x4063, 0x00},
214238fc5136SShawn Tu 	{0x4064, 0x00},
214338fc5136SShawn Tu 	{0x4065, 0x00},
214438fc5136SShawn Tu 	{0x4066, 0x00},
214538fc5136SShawn Tu 	{0x4067, 0x00},
214638fc5136SShawn Tu 	{0x4068, 0x00},
214738fc5136SShawn Tu 	{0x4069, 0x00},
214838fc5136SShawn Tu 	{0x406a, 0x00},
214938fc5136SShawn Tu 	{0x406b, 0x00},
215038fc5136SShawn Tu 	{0x406c, 0x00},
215138fc5136SShawn Tu 	{0x406d, 0x00},
215238fc5136SShawn Tu 	{0x406e, 0x00},
215338fc5136SShawn Tu 	{0x406f, 0x00},
215438fc5136SShawn Tu 	{0x4070, 0x00},
215538fc5136SShawn Tu 	{0x4071, 0x00},
215638fc5136SShawn Tu 	{0x4072, 0x00},
215738fc5136SShawn Tu 	{0x4073, 0x00},
215838fc5136SShawn Tu 	{0x4074, 0x00},
215938fc5136SShawn Tu 	{0x4075, 0x00},
216038fc5136SShawn Tu 	{0x4076, 0x00},
216138fc5136SShawn Tu 	{0x4077, 0x00},
216238fc5136SShawn Tu 	{0x4078, 0x00},
216338fc5136SShawn Tu 	{0x4079, 0x00},
216438fc5136SShawn Tu 	{0x407a, 0x00},
216538fc5136SShawn Tu 	{0x407b, 0x00},
216638fc5136SShawn Tu 	{0x407c, 0x00},
216738fc5136SShawn Tu 	{0x407d, 0x00},
216838fc5136SShawn Tu 	{0x407e, 0x00},
216938fc5136SShawn Tu 	{0x407f, 0x00},
217038fc5136SShawn Tu 	{0x40e0, 0x00},
217138fc5136SShawn Tu 	{0x40e1, 0x00},
217238fc5136SShawn Tu 	{0x40e2, 0x00},
217338fc5136SShawn Tu 	{0x40e3, 0x00},
217438fc5136SShawn Tu 	{0x40e4, 0x00},
217538fc5136SShawn Tu 	{0x40e5, 0x00},
217638fc5136SShawn Tu 	{0x40e6, 0x00},
217738fc5136SShawn Tu 	{0x40e7, 0x00},
217838fc5136SShawn Tu 	{0x40e8, 0x00},
217938fc5136SShawn Tu 	{0x40e9, 0x80},
218038fc5136SShawn Tu 	{0x40ea, 0x00},
218138fc5136SShawn Tu 	{0x40eb, 0x80},
218238fc5136SShawn Tu 	{0x40ec, 0x00},
218338fc5136SShawn Tu 	{0x40ed, 0x80},
218438fc5136SShawn Tu 	{0x40ee, 0x00},
218538fc5136SShawn Tu 	{0x40ef, 0x80},
218638fc5136SShawn Tu 	{0x40f0, 0x02},
218738fc5136SShawn Tu 	{0x40f1, 0x04},
218838fc5136SShawn Tu 	{0x4300, 0x00},
218938fc5136SShawn Tu 	{0x4301, 0x00},
219038fc5136SShawn Tu 	{0x4302, 0x00},
219138fc5136SShawn Tu 	{0x4303, 0x00},
219238fc5136SShawn Tu 	{0x4304, 0x00},
219338fc5136SShawn Tu 	{0x4305, 0x00},
219438fc5136SShawn Tu 	{0x4306, 0x00},
219538fc5136SShawn Tu 	{0x4307, 0x00},
219638fc5136SShawn Tu 	{0x4308, 0x00},
219738fc5136SShawn Tu 	{0x4309, 0x00},
219838fc5136SShawn Tu 	{0x430a, 0x00},
219938fc5136SShawn Tu 	{0x430b, 0xff},
220038fc5136SShawn Tu 	{0x430c, 0xff},
220138fc5136SShawn Tu 	{0x430d, 0x00},
220238fc5136SShawn Tu 	{0x430e, 0x00},
220338fc5136SShawn Tu 	{0x4315, 0x00},
220438fc5136SShawn Tu 	{0x4316, 0x00},
220538fc5136SShawn Tu 	{0x4317, 0x00},
220638fc5136SShawn Tu 	{0x4318, 0x00},
220738fc5136SShawn Tu 	{0x4319, 0x00},
220838fc5136SShawn Tu 	{0x431a, 0x00},
220938fc5136SShawn Tu 	{0x431b, 0x00},
221038fc5136SShawn Tu 	{0x431c, 0x00},
221138fc5136SShawn Tu 	{0x4500, 0x07},
221238fc5136SShawn Tu 	{0x4501, 0x10},
221338fc5136SShawn Tu 	{0x4502, 0x00},
221438fc5136SShawn Tu 	{0x4503, 0x0f},
221538fc5136SShawn Tu 	{0x4504, 0x80},
221638fc5136SShawn Tu 	{0x4506, 0x01},
221738fc5136SShawn Tu 	{0x4509, 0x05},
221838fc5136SShawn Tu 	{0x450c, 0x00},
221938fc5136SShawn Tu 	{0x450d, 0x20},
222038fc5136SShawn Tu 	{0x450e, 0x00},
222138fc5136SShawn Tu 	{0x450f, 0x00},
222238fc5136SShawn Tu 	{0x4510, 0x00},
222338fc5136SShawn Tu 	{0x4523, 0x00},
222438fc5136SShawn Tu 	{0x4526, 0x00},
222538fc5136SShawn Tu 	{0x4542, 0x00},
222638fc5136SShawn Tu 	{0x4543, 0x00},
222738fc5136SShawn Tu 	{0x4544, 0x00},
222838fc5136SShawn Tu 	{0x4545, 0x00},
222938fc5136SShawn Tu 	{0x4546, 0x00},
223038fc5136SShawn Tu 	{0x4547, 0x10},
223138fc5136SShawn Tu 	{0x4602, 0x00},
223238fc5136SShawn Tu 	{0x4603, 0x15},
223338fc5136SShawn Tu 	{0x460b, 0x07},
223438fc5136SShawn Tu 	{0x4680, 0x11},
223538fc5136SShawn Tu 	{0x4686, 0x00},
223638fc5136SShawn Tu 	{0x4687, 0x00},
223738fc5136SShawn Tu 	{0x4700, 0x00},
223838fc5136SShawn Tu 	{0x4800, 0x64},
223938fc5136SShawn Tu 	{0x4806, 0x40},
224038fc5136SShawn Tu 	{0x480b, 0x10},
224138fc5136SShawn Tu 	{0x480c, 0x80},
224238fc5136SShawn Tu 	{0x480f, 0x32},
224338fc5136SShawn Tu 	{0x4813, 0xe4},
224438fc5136SShawn Tu 	{0x4837, 0x14},
224538fc5136SShawn Tu 	{0x4850, 0x42},
224638fc5136SShawn Tu 	{0x4884, 0x04},
224738fc5136SShawn Tu 	{0x4c00, 0xf8},
224838fc5136SShawn Tu 	{0x4c01, 0x44},
224938fc5136SShawn Tu 	{0x4c03, 0x00},
225038fc5136SShawn Tu 	{0x4d00, 0x00},
225138fc5136SShawn Tu 	{0x4d01, 0x16},
225238fc5136SShawn Tu 	{0x4d04, 0x10},
225338fc5136SShawn Tu 	{0x4d05, 0x00},
225438fc5136SShawn Tu 	{0x4d06, 0x0c},
225538fc5136SShawn Tu 	{0x4d07, 0x00},
225638fc5136SShawn Tu 	{0x3d84, 0x04},
225738fc5136SShawn Tu 	{0x3680, 0xa4},
225838fc5136SShawn Tu 	{0x3682, 0x80},
225938fc5136SShawn Tu 	{0x3601, 0x40},
226038fc5136SShawn Tu 	{0x3602, 0x90},
226138fc5136SShawn Tu 	{0x3608, 0x0a},
226238fc5136SShawn Tu 	{0x3938, 0x09},
226338fc5136SShawn Tu 	{0x3a74, 0x84},
226438fc5136SShawn Tu 	{0x3a99, 0x84},
226538fc5136SShawn Tu 	{0x3ab9, 0xa6},
226638fc5136SShawn Tu 	{0x3aba, 0xba},
226738fc5136SShawn Tu 	{0x3b12, 0x84},
226838fc5136SShawn Tu 	{0x3b14, 0xbb},
226938fc5136SShawn Tu 	{0x3b15, 0xbf},
227038fc5136SShawn Tu 	{0x3a29, 0x26},
227138fc5136SShawn Tu 	{0x3a1f, 0x8a},
227238fc5136SShawn Tu 	{0x3a22, 0x91},
227338fc5136SShawn Tu 	{0x3a25, 0x96},
227438fc5136SShawn Tu 	{0x3a28, 0xb4},
227538fc5136SShawn Tu 	{0x3a2b, 0xba},
227638fc5136SShawn Tu 	{0x3a2e, 0xbf},
227738fc5136SShawn Tu 	{0x3a31, 0xc1},
227838fc5136SShawn Tu 	{0x3a20, 0x05},
227938fc5136SShawn Tu 	{0x3939, 0x6b},
228038fc5136SShawn Tu 	{0x3902, 0x10},
228138fc5136SShawn Tu 	{0x3903, 0x10},
228238fc5136SShawn Tu 	{0x3904, 0x10},
228338fc5136SShawn Tu 	{0x3905, 0x10},
228438fc5136SShawn Tu 	{0x3906, 0x01},
228538fc5136SShawn Tu 	{0x3907, 0x0b},
228638fc5136SShawn Tu 	{0x3908, 0x10},
228738fc5136SShawn Tu 	{0x3909, 0x13},
228838fc5136SShawn Tu 	{0x360f, 0x99},
228938fc5136SShawn Tu 	{0x390b, 0x11},
229038fc5136SShawn Tu 	{0x390c, 0x21},
229138fc5136SShawn Tu 	{0x390d, 0x32},
229238fc5136SShawn Tu 	{0x390e, 0x76},
229338fc5136SShawn Tu 	{0x3911, 0x90},
229438fc5136SShawn Tu 	{0x3913, 0x90},
229538fc5136SShawn Tu 	{0x3b3f, 0x9d},
229638fc5136SShawn Tu 	{0x3b45, 0x9d},
229738fc5136SShawn Tu 	{0x3b1b, 0xc9},
229838fc5136SShawn Tu 	{0x3b21, 0xc9},
229938fc5136SShawn Tu 	{0x3a1a, 0x1c},
230038fc5136SShawn Tu 	{0x3a23, 0x15},
230138fc5136SShawn Tu 	{0x3a26, 0x17},
230238fc5136SShawn Tu 	{0x3a2c, 0x50},
230338fc5136SShawn Tu 	{0x3a2f, 0x18},
230438fc5136SShawn Tu 	{0x3a32, 0x4f},
230538fc5136SShawn Tu 	{0x3ace, 0x01},
230638fc5136SShawn Tu 	{0x3ad2, 0x01},
230738fc5136SShawn Tu 	{0x3ad6, 0x01},
230838fc5136SShawn Tu 	{0x3ada, 0x01},
230938fc5136SShawn Tu 	{0x3ade, 0x01},
231038fc5136SShawn Tu 	{0x3ae2, 0x01},
231138fc5136SShawn Tu 	{0x3aee, 0x01},
231238fc5136SShawn Tu 	{0x3af2, 0x01},
231338fc5136SShawn Tu 	{0x3af6, 0x01},
231438fc5136SShawn Tu 	{0x3afa, 0x01},
231538fc5136SShawn Tu 	{0x3afe, 0x01},
231638fc5136SShawn Tu 	{0x3b02, 0x01},
231738fc5136SShawn Tu 	{0x3b06, 0x01},
231838fc5136SShawn Tu 	{0x3b0a, 0x01},
231938fc5136SShawn Tu 	{0x3b0b, 0x00},
232038fc5136SShawn Tu 	{0x3b0e, 0x01},
232138fc5136SShawn Tu 	{0x3b0f, 0x00},
232238fc5136SShawn Tu 	{0x392c, 0x02},
232338fc5136SShawn Tu 	{0x392d, 0x01},
232438fc5136SShawn Tu 	{0x392e, 0x04},
232538fc5136SShawn Tu 	{0x392f, 0x03},
232638fc5136SShawn Tu 	{0x3930, 0x09},
232738fc5136SShawn Tu 	{0x3931, 0x07},
232838fc5136SShawn Tu 	{0x3932, 0x10},
232938fc5136SShawn Tu 	{0x3933, 0x0d},
233038fc5136SShawn Tu 	{0x3609, 0x08},
233138fc5136SShawn Tu 	{0x3921, 0x0f},
233238fc5136SShawn Tu 	{0x3928, 0x15},
233338fc5136SShawn Tu 	{0x3929, 0x2a},
233438fc5136SShawn Tu 	{0x392a, 0x52},
233538fc5136SShawn Tu 	{0x392b, 0xa3},
233638fc5136SShawn Tu 	{0x340b, 0x1b},
233738fc5136SShawn Tu 	{0x3426, 0x10},
233838fc5136SShawn Tu 	{0x3407, 0x01},
233938fc5136SShawn Tu 	{0x3404, 0x01},
234038fc5136SShawn Tu 	{0x3500, 0x00},
234138fc5136SShawn Tu 	{0x3501, 0x08},
234238fc5136SShawn Tu 	{0x3502, 0x10},
234338fc5136SShawn Tu 	{0x3508, 0x04},
234438fc5136SShawn Tu 	{0x3509, 0x00},
234538fc5136SShawn Tu };
234638fc5136SShawn Tu 
234738fc5136SShawn Tu static const char * const ov08x40_test_pattern_menu[] = {
234838fc5136SShawn Tu 	"Disabled",
234938fc5136SShawn Tu 	"Vertical Color Bar Type 1",
235038fc5136SShawn Tu 	"Vertical Color Bar Type 2",
235138fc5136SShawn Tu 	"Vertical Color Bar Type 3",
235238fc5136SShawn Tu 	"Vertical Color Bar Type 4"
235338fc5136SShawn Tu };
235438fc5136SShawn Tu 
235538fc5136SShawn Tu /* Configurations for supported link frequencies */
235638fc5136SShawn Tu #define OV08X40_LINK_FREQ_400MHZ	400000000ULL
235738fc5136SShawn Tu 
235838fc5136SShawn Tu #define OV08X40_EXT_CLK			19200000
235938fc5136SShawn Tu #define OV08X40_DATA_LANES		4
236038fc5136SShawn Tu 
236138fc5136SShawn Tu /*
236238fc5136SShawn Tu  * pixel_rate = link_freq * data-rate * nr_of_lanes / bits_per_sample
236338fc5136SShawn Tu  * data rate => double data rate; number of lanes => 4; bits per pixel => 10
236438fc5136SShawn Tu  */
link_freq_to_pixel_rate(u64 f)236538fc5136SShawn Tu static u64 link_freq_to_pixel_rate(u64 f)
236638fc5136SShawn Tu {
236738fc5136SShawn Tu 	f *= 2 * OV08X40_DATA_LANES;
236838fc5136SShawn Tu 	do_div(f, 10);
236938fc5136SShawn Tu 
237038fc5136SShawn Tu 	return f;
237138fc5136SShawn Tu }
237238fc5136SShawn Tu 
237338fc5136SShawn Tu /* Menu items for LINK_FREQ V4L2 control */
237438fc5136SShawn Tu static const s64 link_freq_menu_items[] = {
237538fc5136SShawn Tu 	OV08X40_LINK_FREQ_400MHZ,
237638fc5136SShawn Tu };
237738fc5136SShawn Tu 
237838fc5136SShawn Tu /* Link frequency configs */
237938fc5136SShawn Tu static const struct ov08x40_link_freq_config link_freq_configs[] = {
238038fc5136SShawn Tu 	[OV08X40_LINK_FREQ_400MHZ_INDEX] = {
238138fc5136SShawn Tu 		.reg_list = {
238238fc5136SShawn Tu 			.num_of_regs = ARRAY_SIZE(mipi_data_rate_800mbps),
238338fc5136SShawn Tu 			.regs = mipi_data_rate_800mbps,
238438fc5136SShawn Tu 		}
238538fc5136SShawn Tu 	},
238638fc5136SShawn Tu };
238738fc5136SShawn Tu 
238838fc5136SShawn Tu /* Mode configs */
238938fc5136SShawn Tu static const struct ov08x40_mode supported_modes[] = {
239038fc5136SShawn Tu 	{
239138fc5136SShawn Tu 		.width = 3856,
239238fc5136SShawn Tu 		.height = 2416,
239338fc5136SShawn Tu 		.vts_def = OV08X40_VTS_30FPS,
239438fc5136SShawn Tu 		.vts_min = OV08X40_VTS_30FPS,
2395*2cd17b9bSJason Chen 		.hts = 640,
239638fc5136SShawn Tu 		.lanes = 4,
239738fc5136SShawn Tu 		.reg_list = {
239838fc5136SShawn Tu 			.num_of_regs = ARRAY_SIZE(mode_3856x2416_regs),
239938fc5136SShawn Tu 			.regs = mode_3856x2416_regs,
240038fc5136SShawn Tu 		},
240138fc5136SShawn Tu 		.link_freq_index = OV08X40_LINK_FREQ_400MHZ_INDEX,
240238fc5136SShawn Tu 	},
240338fc5136SShawn Tu 	{
240438fc5136SShawn Tu 		.width = 1928,
240538fc5136SShawn Tu 		.height = 1208,
240638fc5136SShawn Tu 		.vts_def = OV08X40_VTS_BIN_30FPS,
240738fc5136SShawn Tu 		.vts_min = OV08X40_VTS_BIN_30FPS,
2408*2cd17b9bSJason Chen 		.hts = 720,
240938fc5136SShawn Tu 		.lanes = 4,
241038fc5136SShawn Tu 		.reg_list = {
241138fc5136SShawn Tu 			.num_of_regs = ARRAY_SIZE(mode_1928x1208_regs),
241238fc5136SShawn Tu 			.regs = mode_1928x1208_regs,
241338fc5136SShawn Tu 		},
241438fc5136SShawn Tu 		.link_freq_index = OV08X40_LINK_FREQ_400MHZ_INDEX,
241538fc5136SShawn Tu 	},
241638fc5136SShawn Tu };
241738fc5136SShawn Tu 
241838fc5136SShawn Tu struct ov08x40 {
241938fc5136SShawn Tu 	struct v4l2_subdev sd;
242038fc5136SShawn Tu 	struct media_pad pad;
242138fc5136SShawn Tu 
242238fc5136SShawn Tu 	struct v4l2_ctrl_handler ctrl_handler;
242338fc5136SShawn Tu 	/* V4L2 Controls */
242438fc5136SShawn Tu 	struct v4l2_ctrl *link_freq;
242538fc5136SShawn Tu 	struct v4l2_ctrl *pixel_rate;
242638fc5136SShawn Tu 	struct v4l2_ctrl *vblank;
242738fc5136SShawn Tu 	struct v4l2_ctrl *hblank;
242838fc5136SShawn Tu 	struct v4l2_ctrl *exposure;
242938fc5136SShawn Tu 
243038fc5136SShawn Tu 	/* Current mode */
243138fc5136SShawn Tu 	const struct ov08x40_mode *cur_mode;
243238fc5136SShawn Tu 
243338fc5136SShawn Tu 	/* Mutex for serialized access */
243438fc5136SShawn Tu 	struct mutex mutex;
243538fc5136SShawn Tu 
243638fc5136SShawn Tu 	/* Streaming on/off */
243738fc5136SShawn Tu 	bool streaming;
243838fc5136SShawn Tu };
243938fc5136SShawn Tu 
244038fc5136SShawn Tu #define to_ov08x40(_sd)	container_of(_sd, struct ov08x40, sd)
244138fc5136SShawn Tu 
244238fc5136SShawn Tu /* Read registers up to 4 at a time */
ov08x40_read_reg(struct ov08x40 * ov08x,u16 reg,u32 len,u32 * val)244338fc5136SShawn Tu static int ov08x40_read_reg(struct ov08x40 *ov08x,
244438fc5136SShawn Tu 			    u16 reg, u32 len, u32 *val)
244538fc5136SShawn Tu {
244638fc5136SShawn Tu 	struct i2c_client *client = v4l2_get_subdevdata(&ov08x->sd);
244738fc5136SShawn Tu 	struct i2c_msg msgs[2];
244838fc5136SShawn Tu 	u8 *data_be_p;
244938fc5136SShawn Tu 	int ret;
245038fc5136SShawn Tu 	__be32 data_be = 0;
245138fc5136SShawn Tu 	__be16 reg_addr_be = cpu_to_be16(reg);
245238fc5136SShawn Tu 
245338fc5136SShawn Tu 	if (len > 4)
245438fc5136SShawn Tu 		return -EINVAL;
245538fc5136SShawn Tu 
245638fc5136SShawn Tu 	data_be_p = (u8 *)&data_be;
245738fc5136SShawn Tu 	/* Write register address */
245838fc5136SShawn Tu 	msgs[0].addr = client->addr;
245938fc5136SShawn Tu 	msgs[0].flags = 0;
246038fc5136SShawn Tu 	msgs[0].len = 2;
246138fc5136SShawn Tu 	msgs[0].buf = (u8 *)&reg_addr_be;
246238fc5136SShawn Tu 
246338fc5136SShawn Tu 	/* Read data from register */
246438fc5136SShawn Tu 	msgs[1].addr = client->addr;
246538fc5136SShawn Tu 	msgs[1].flags = I2C_M_RD;
246638fc5136SShawn Tu 	msgs[1].len = len;
246738fc5136SShawn Tu 	msgs[1].buf = &data_be_p[4 - len];
246838fc5136SShawn Tu 
246938fc5136SShawn Tu 	ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
247038fc5136SShawn Tu 	if (ret != ARRAY_SIZE(msgs))
247138fc5136SShawn Tu 		return -EIO;
247238fc5136SShawn Tu 
247338fc5136SShawn Tu 	*val = be32_to_cpu(data_be);
247438fc5136SShawn Tu 
247538fc5136SShawn Tu 	return 0;
247638fc5136SShawn Tu }
247738fc5136SShawn Tu 
247838fc5136SShawn Tu /* Write registers up to 4 at a time */
ov08x40_write_reg(struct ov08x40 * ov08x,u16 reg,u32 len,u32 __val)247938fc5136SShawn Tu static int ov08x40_write_reg(struct ov08x40 *ov08x,
248038fc5136SShawn Tu 			     u16 reg, u32 len, u32 __val)
248138fc5136SShawn Tu {
248238fc5136SShawn Tu 	struct i2c_client *client = v4l2_get_subdevdata(&ov08x->sd);
248338fc5136SShawn Tu 	int buf_i, val_i;
248438fc5136SShawn Tu 	u8 buf[6], *val_p;
248538fc5136SShawn Tu 	__be32 val;
248638fc5136SShawn Tu 
248738fc5136SShawn Tu 	if (len > 4)
248838fc5136SShawn Tu 		return -EINVAL;
248938fc5136SShawn Tu 
249038fc5136SShawn Tu 	buf[0] = reg >> 8;
249138fc5136SShawn Tu 	buf[1] = reg & 0xff;
249238fc5136SShawn Tu 
249338fc5136SShawn Tu 	val = cpu_to_be32(__val);
249438fc5136SShawn Tu 	val_p = (u8 *)&val;
249538fc5136SShawn Tu 	buf_i = 2;
249638fc5136SShawn Tu 	val_i = 4 - len;
249738fc5136SShawn Tu 
249838fc5136SShawn Tu 	while (val_i < 4)
249938fc5136SShawn Tu 		buf[buf_i++] = val_p[val_i++];
250038fc5136SShawn Tu 
250138fc5136SShawn Tu 	if (i2c_master_send(client, buf, len + 2) != len + 2)
250238fc5136SShawn Tu 		return -EIO;
250338fc5136SShawn Tu 
250438fc5136SShawn Tu 	return 0;
250538fc5136SShawn Tu }
250638fc5136SShawn Tu 
250738fc5136SShawn Tu /* Write a list of registers */
ov08x40_write_regs(struct ov08x40 * ov08x,const struct ov08x40_reg * regs,u32 len)250838fc5136SShawn Tu static int ov08x40_write_regs(struct ov08x40 *ov08x,
250938fc5136SShawn Tu 			      const struct ov08x40_reg *regs, u32 len)
251038fc5136SShawn Tu {
251138fc5136SShawn Tu 	struct i2c_client *client = v4l2_get_subdevdata(&ov08x->sd);
251238fc5136SShawn Tu 	int ret;
251338fc5136SShawn Tu 	u32 i;
251438fc5136SShawn Tu 
251538fc5136SShawn Tu 	for (i = 0; i < len; i++) {
251638fc5136SShawn Tu 		ret = ov08x40_write_reg(ov08x, regs[i].address, 1,
251738fc5136SShawn Tu 					regs[i].val);
251838fc5136SShawn Tu 
251938fc5136SShawn Tu 		if (ret) {
252038fc5136SShawn Tu 			dev_err_ratelimited(&client->dev,
252138fc5136SShawn Tu 					    "Failed to write reg 0x%4.4x. error = %d\n",
252238fc5136SShawn Tu 					    regs[i].address, ret);
252338fc5136SShawn Tu 
252438fc5136SShawn Tu 			return ret;
252538fc5136SShawn Tu 		}
252638fc5136SShawn Tu 	}
252738fc5136SShawn Tu 
252838fc5136SShawn Tu 	return 0;
252938fc5136SShawn Tu }
253038fc5136SShawn Tu 
ov08x40_write_reg_list(struct ov08x40 * ov08x,const struct ov08x40_reg_list * r_list)253138fc5136SShawn Tu static int ov08x40_write_reg_list(struct ov08x40 *ov08x,
253238fc5136SShawn Tu 				  const struct ov08x40_reg_list *r_list)
253338fc5136SShawn Tu {
253438fc5136SShawn Tu 	return ov08x40_write_regs(ov08x, r_list->regs, r_list->num_of_regs);
253538fc5136SShawn Tu }
253638fc5136SShawn Tu 
ov08x40_open(struct v4l2_subdev * sd,struct v4l2_subdev_fh * fh)253738fc5136SShawn Tu static int ov08x40_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
253838fc5136SShawn Tu {
253938fc5136SShawn Tu 	const struct ov08x40_mode *default_mode = &supported_modes[0];
254038fc5136SShawn Tu 	struct ov08x40 *ov08x = to_ov08x40(sd);
254138fc5136SShawn Tu 	struct v4l2_mbus_framefmt *try_fmt =
254238fc5136SShawn Tu 		v4l2_subdev_get_try_format(sd, fh->state, 0);
254338fc5136SShawn Tu 
254438fc5136SShawn Tu 	mutex_lock(&ov08x->mutex);
254538fc5136SShawn Tu 
254638fc5136SShawn Tu 	/* Initialize try_fmt */
254738fc5136SShawn Tu 	try_fmt->width = default_mode->width;
254838fc5136SShawn Tu 	try_fmt->height = default_mode->height;
254938fc5136SShawn Tu 	try_fmt->code = MEDIA_BUS_FMT_SGRBG10_1X10;
255038fc5136SShawn Tu 	try_fmt->field = V4L2_FIELD_NONE;
255138fc5136SShawn Tu 
255238fc5136SShawn Tu 	/* No crop or compose */
255338fc5136SShawn Tu 	mutex_unlock(&ov08x->mutex);
255438fc5136SShawn Tu 
255538fc5136SShawn Tu 	return 0;
255638fc5136SShawn Tu }
255738fc5136SShawn Tu 
ov08x40_update_digital_gain(struct ov08x40 * ov08x,u32 d_gain)255838fc5136SShawn Tu static int ov08x40_update_digital_gain(struct ov08x40 *ov08x, u32 d_gain)
255938fc5136SShawn Tu {
256038fc5136SShawn Tu 	int ret;
256138fc5136SShawn Tu 	u32 val;
256238fc5136SShawn Tu 
256338fc5136SShawn Tu 	/*
256438fc5136SShawn Tu 	 * 0x350C[1:0], 0x350B[7:0], 0x350A[4:0]
256538fc5136SShawn Tu 	 */
256638fc5136SShawn Tu 
256738fc5136SShawn Tu 	val = (d_gain & OV08X40_DGTL_GAIN_L_MASK) << OV08X40_DGTL_GAIN_L_SHIFT;
256838fc5136SShawn Tu 	ret = ov08x40_write_reg(ov08x, OV08X40_REG_DGTL_GAIN_L,
256938fc5136SShawn Tu 				OV08X40_REG_VALUE_08BIT, val);
257038fc5136SShawn Tu 	if (ret)
257138fc5136SShawn Tu 		return ret;
257238fc5136SShawn Tu 
257338fc5136SShawn Tu 	val = (d_gain >> OV08X40_DGTL_GAIN_M_SHIFT) & OV08X40_DGTL_GAIN_M_MASK;
257438fc5136SShawn Tu 	ret = ov08x40_write_reg(ov08x, OV08X40_REG_DGTL_GAIN_M,
257538fc5136SShawn Tu 				OV08X40_REG_VALUE_08BIT, val);
257638fc5136SShawn Tu 	if (ret)
257738fc5136SShawn Tu 		return ret;
257838fc5136SShawn Tu 
257938fc5136SShawn Tu 	val = (d_gain >> OV08X40_DGTL_GAIN_H_SHIFT) & OV08X40_DGTL_GAIN_H_MASK;
258038fc5136SShawn Tu 
258138fc5136SShawn Tu 	return ov08x40_write_reg(ov08x, OV08X40_REG_DGTL_GAIN_H,
258238fc5136SShawn Tu 				 OV08X40_REG_VALUE_08BIT, val);
258338fc5136SShawn Tu }
258438fc5136SShawn Tu 
ov08x40_enable_test_pattern(struct ov08x40 * ov08x,u32 pattern)258538fc5136SShawn Tu static int ov08x40_enable_test_pattern(struct ov08x40 *ov08x, u32 pattern)
258638fc5136SShawn Tu {
258738fc5136SShawn Tu 	int ret;
258838fc5136SShawn Tu 	u32 val;
258938fc5136SShawn Tu 
259038fc5136SShawn Tu 	ret = ov08x40_read_reg(ov08x, OV08X40_REG_TEST_PATTERN,
259138fc5136SShawn Tu 			       OV08X40_REG_VALUE_08BIT, &val);
259238fc5136SShawn Tu 	if (ret)
259338fc5136SShawn Tu 		return ret;
259438fc5136SShawn Tu 
259538fc5136SShawn Tu 	if (pattern) {
259638fc5136SShawn Tu 		ret = ov08x40_read_reg(ov08x, OV08X40_REG_ISP,
259738fc5136SShawn Tu 				       OV08X40_REG_VALUE_08BIT, &val);
259838fc5136SShawn Tu 		if (ret)
259938fc5136SShawn Tu 			return ret;
260038fc5136SShawn Tu 
260138fc5136SShawn Tu 		ret = ov08x40_write_reg(ov08x, OV08X40_REG_ISP,
260238fc5136SShawn Tu 					OV08X40_REG_VALUE_08BIT,
260338fc5136SShawn Tu 					val | BIT(1));
260438fc5136SShawn Tu 		if (ret)
260538fc5136SShawn Tu 			return ret;
260638fc5136SShawn Tu 
260738fc5136SShawn Tu 		ret = ov08x40_read_reg(ov08x, OV08X40_REG_SHORT_TEST_PATTERN,
260838fc5136SShawn Tu 				       OV08X40_REG_VALUE_08BIT, &val);
260938fc5136SShawn Tu 		if (ret)
261038fc5136SShawn Tu 			return ret;
261138fc5136SShawn Tu 
261238fc5136SShawn Tu 		ret = ov08x40_write_reg(ov08x, OV08X40_REG_SHORT_TEST_PATTERN,
261338fc5136SShawn Tu 					OV08X40_REG_VALUE_08BIT,
261438fc5136SShawn Tu 					val | BIT(0));
261538fc5136SShawn Tu 		if (ret)
261638fc5136SShawn Tu 			return ret;
261738fc5136SShawn Tu 
261838fc5136SShawn Tu 		ret = ov08x40_read_reg(ov08x, OV08X40_REG_TEST_PATTERN,
261938fc5136SShawn Tu 				       OV08X40_REG_VALUE_08BIT, &val);
262038fc5136SShawn Tu 		if (ret)
262138fc5136SShawn Tu 			return ret;
262238fc5136SShawn Tu 
262338fc5136SShawn Tu 		val &= OV08X40_TEST_PATTERN_MASK;
262438fc5136SShawn Tu 		val |= ((pattern - 1) << OV08X40_TEST_PATTERN_BAR_SHIFT) |
262538fc5136SShawn Tu 			OV08X40_TEST_PATTERN_ENABLE;
262638fc5136SShawn Tu 	} else {
262738fc5136SShawn Tu 		val &= ~OV08X40_TEST_PATTERN_ENABLE;
262838fc5136SShawn Tu 	}
262938fc5136SShawn Tu 
263038fc5136SShawn Tu 	return ov08x40_write_reg(ov08x, OV08X40_REG_TEST_PATTERN,
263138fc5136SShawn Tu 				 OV08X40_REG_VALUE_08BIT, val);
263238fc5136SShawn Tu }
263338fc5136SShawn Tu 
ov08x40_set_ctrl_hflip(struct ov08x40 * ov08x,u32 ctrl_val)263438fc5136SShawn Tu static int ov08x40_set_ctrl_hflip(struct ov08x40 *ov08x, u32 ctrl_val)
263538fc5136SShawn Tu {
263638fc5136SShawn Tu 	int ret;
263738fc5136SShawn Tu 	u32 val;
263838fc5136SShawn Tu 
263938fc5136SShawn Tu 	ret = ov08x40_read_reg(ov08x, OV08X40_REG_MIRROR,
264038fc5136SShawn Tu 			       OV08X40_REG_VALUE_08BIT, &val);
264138fc5136SShawn Tu 	if (ret)
264238fc5136SShawn Tu 		return ret;
264338fc5136SShawn Tu 
264438fc5136SShawn Tu 	return ov08x40_write_reg(ov08x, OV08X40_REG_MIRROR,
264538fc5136SShawn Tu 				 OV08X40_REG_VALUE_08BIT,
264638fc5136SShawn Tu 				 ctrl_val ? val | BIT(2) : val & ~BIT(2));
264738fc5136SShawn Tu }
264838fc5136SShawn Tu 
ov08x40_set_ctrl_vflip(struct ov08x40 * ov08x,u32 ctrl_val)264938fc5136SShawn Tu static int ov08x40_set_ctrl_vflip(struct ov08x40 *ov08x, u32 ctrl_val)
265038fc5136SShawn Tu {
265138fc5136SShawn Tu 	int ret;
265238fc5136SShawn Tu 	u32 val;
265338fc5136SShawn Tu 
265438fc5136SShawn Tu 	ret = ov08x40_read_reg(ov08x, OV08X40_REG_VFLIP,
265538fc5136SShawn Tu 			       OV08X40_REG_VALUE_08BIT, &val);
265638fc5136SShawn Tu 	if (ret)
265738fc5136SShawn Tu 		return ret;
265838fc5136SShawn Tu 
265938fc5136SShawn Tu 	return ov08x40_write_reg(ov08x, OV08X40_REG_VFLIP,
266038fc5136SShawn Tu 				 OV08X40_REG_VALUE_08BIT,
266138fc5136SShawn Tu 				 ctrl_val ? val | BIT(2) : val & ~BIT(2));
266238fc5136SShawn Tu }
266338fc5136SShawn Tu 
ov08x40_set_ctrl(struct v4l2_ctrl * ctrl)266438fc5136SShawn Tu static int ov08x40_set_ctrl(struct v4l2_ctrl *ctrl)
266538fc5136SShawn Tu {
266638fc5136SShawn Tu 	struct ov08x40 *ov08x = container_of(ctrl->handler,
266738fc5136SShawn Tu 					     struct ov08x40, ctrl_handler);
266838fc5136SShawn Tu 	struct i2c_client *client = v4l2_get_subdevdata(&ov08x->sd);
266938fc5136SShawn Tu 	s64 max;
267038fc5136SShawn Tu 	int ret = 0;
267138fc5136SShawn Tu 
267238fc5136SShawn Tu 	/* Propagate change of current control to all related controls */
267338fc5136SShawn Tu 	switch (ctrl->id) {
267438fc5136SShawn Tu 	case V4L2_CID_VBLANK:
267538fc5136SShawn Tu 		/* Update max exposure while meeting expected vblanking */
267638fc5136SShawn Tu 		max = ov08x->cur_mode->height + ctrl->val - OV08X40_EXPOSURE_MAX_MARGIN;
267738fc5136SShawn Tu 		__v4l2_ctrl_modify_range(ov08x->exposure,
267838fc5136SShawn Tu 					 ov08x->exposure->minimum,
267938fc5136SShawn Tu 					 max, ov08x->exposure->step, max);
268038fc5136SShawn Tu 		break;
268138fc5136SShawn Tu 	}
268238fc5136SShawn Tu 
268338fc5136SShawn Tu 	/*
268438fc5136SShawn Tu 	 * Applying V4L2 control value only happens
268538fc5136SShawn Tu 	 * when power is up for streaming
268638fc5136SShawn Tu 	 */
268738fc5136SShawn Tu 	if (!pm_runtime_get_if_in_use(&client->dev))
268838fc5136SShawn Tu 		return 0;
268938fc5136SShawn Tu 
269038fc5136SShawn Tu 	switch (ctrl->id) {
269138fc5136SShawn Tu 	case V4L2_CID_ANALOGUE_GAIN:
269238fc5136SShawn Tu 		ret = ov08x40_write_reg(ov08x, OV08X40_REG_ANALOG_GAIN,
269338fc5136SShawn Tu 					OV08X40_REG_VALUE_16BIT,
269438fc5136SShawn Tu 					ctrl->val << 1);
269538fc5136SShawn Tu 		break;
269638fc5136SShawn Tu 	case V4L2_CID_DIGITAL_GAIN:
269738fc5136SShawn Tu 		ret = ov08x40_update_digital_gain(ov08x, ctrl->val);
269838fc5136SShawn Tu 		break;
269938fc5136SShawn Tu 	case V4L2_CID_EXPOSURE:
270038fc5136SShawn Tu 		ret = ov08x40_write_reg(ov08x, OV08X40_REG_EXPOSURE,
270138fc5136SShawn Tu 					OV08X40_REG_VALUE_24BIT,
270238fc5136SShawn Tu 					ctrl->val);
270338fc5136SShawn Tu 		break;
270438fc5136SShawn Tu 	case V4L2_CID_VBLANK:
270538fc5136SShawn Tu 		ret = ov08x40_write_reg(ov08x, OV08X40_REG_VTS,
270638fc5136SShawn Tu 					OV08X40_REG_VALUE_16BIT,
270738fc5136SShawn Tu 					ov08x->cur_mode->height
270838fc5136SShawn Tu 					+ ctrl->val);
270938fc5136SShawn Tu 		break;
271038fc5136SShawn Tu 	case V4L2_CID_TEST_PATTERN:
271138fc5136SShawn Tu 		ret = ov08x40_enable_test_pattern(ov08x, ctrl->val);
271238fc5136SShawn Tu 		break;
271338fc5136SShawn Tu 	case V4L2_CID_HFLIP:
271438fc5136SShawn Tu 		ov08x40_set_ctrl_hflip(ov08x, ctrl->val);
271538fc5136SShawn Tu 		break;
271638fc5136SShawn Tu 	case V4L2_CID_VFLIP:
271738fc5136SShawn Tu 		ov08x40_set_ctrl_vflip(ov08x, ctrl->val);
271838fc5136SShawn Tu 		break;
271938fc5136SShawn Tu 	default:
272038fc5136SShawn Tu 		dev_info(&client->dev,
272138fc5136SShawn Tu 			 "ctrl(id:0x%x,val:0x%x) is not handled\n",
272238fc5136SShawn Tu 			 ctrl->id, ctrl->val);
272338fc5136SShawn Tu 		break;
272438fc5136SShawn Tu 	}
272538fc5136SShawn Tu 
272638fc5136SShawn Tu 	pm_runtime_put(&client->dev);
272738fc5136SShawn Tu 
272838fc5136SShawn Tu 	return ret;
272938fc5136SShawn Tu }
273038fc5136SShawn Tu 
273138fc5136SShawn Tu static const struct v4l2_ctrl_ops ov08x40_ctrl_ops = {
273238fc5136SShawn Tu 	.s_ctrl = ov08x40_set_ctrl,
273338fc5136SShawn Tu };
273438fc5136SShawn Tu 
ov08x40_enum_mbus_code(struct v4l2_subdev * sd,struct v4l2_subdev_state * sd_state,struct v4l2_subdev_mbus_code_enum * code)273538fc5136SShawn Tu static int ov08x40_enum_mbus_code(struct v4l2_subdev *sd,
273638fc5136SShawn Tu 				  struct v4l2_subdev_state *sd_state,
273738fc5136SShawn Tu 				  struct v4l2_subdev_mbus_code_enum *code)
273838fc5136SShawn Tu {
273938fc5136SShawn Tu 	/* Only one bayer order(GRBG) is supported */
274038fc5136SShawn Tu 	if (code->index > 0)
274138fc5136SShawn Tu 		return -EINVAL;
274238fc5136SShawn Tu 
274338fc5136SShawn Tu 	code->code = MEDIA_BUS_FMT_SGRBG10_1X10;
274438fc5136SShawn Tu 
274538fc5136SShawn Tu 	return 0;
274638fc5136SShawn Tu }
274738fc5136SShawn Tu 
ov08x40_enum_frame_size(struct v4l2_subdev * sd,struct v4l2_subdev_state * sd_state,struct v4l2_subdev_frame_size_enum * fse)274838fc5136SShawn Tu static int ov08x40_enum_frame_size(struct v4l2_subdev *sd,
274938fc5136SShawn Tu 				   struct v4l2_subdev_state *sd_state,
275038fc5136SShawn Tu 				   struct v4l2_subdev_frame_size_enum *fse)
275138fc5136SShawn Tu {
275238fc5136SShawn Tu 	if (fse->index >= ARRAY_SIZE(supported_modes))
275338fc5136SShawn Tu 		return -EINVAL;
275438fc5136SShawn Tu 
275538fc5136SShawn Tu 	if (fse->code != MEDIA_BUS_FMT_SGRBG10_1X10)
275638fc5136SShawn Tu 		return -EINVAL;
275738fc5136SShawn Tu 
275838fc5136SShawn Tu 	fse->min_width = supported_modes[fse->index].width;
275938fc5136SShawn Tu 	fse->max_width = fse->min_width;
276038fc5136SShawn Tu 	fse->min_height = supported_modes[fse->index].height;
276138fc5136SShawn Tu 	fse->max_height = fse->min_height;
276238fc5136SShawn Tu 
276338fc5136SShawn Tu 	return 0;
276438fc5136SShawn Tu }
276538fc5136SShawn Tu 
ov08x40_update_pad_format(const struct ov08x40_mode * mode,struct v4l2_subdev_format * fmt)276638fc5136SShawn Tu static void ov08x40_update_pad_format(const struct ov08x40_mode *mode,
276738fc5136SShawn Tu 				      struct v4l2_subdev_format *fmt)
276838fc5136SShawn Tu {
276938fc5136SShawn Tu 	fmt->format.width = mode->width;
277038fc5136SShawn Tu 	fmt->format.height = mode->height;
277138fc5136SShawn Tu 	fmt->format.code = MEDIA_BUS_FMT_SGRBG10_1X10;
277238fc5136SShawn Tu 	fmt->format.field = V4L2_FIELD_NONE;
277338fc5136SShawn Tu }
277438fc5136SShawn Tu 
ov08x40_do_get_pad_format(struct ov08x40 * ov08x,struct v4l2_subdev_state * sd_state,struct v4l2_subdev_format * fmt)277538fc5136SShawn Tu static int ov08x40_do_get_pad_format(struct ov08x40 *ov08x,
277638fc5136SShawn Tu 				     struct v4l2_subdev_state *sd_state,
277738fc5136SShawn Tu 				     struct v4l2_subdev_format *fmt)
277838fc5136SShawn Tu {
277938fc5136SShawn Tu 	struct v4l2_mbus_framefmt *framefmt;
278038fc5136SShawn Tu 	struct v4l2_subdev *sd = &ov08x->sd;
278138fc5136SShawn Tu 
278238fc5136SShawn Tu 	if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) {
278338fc5136SShawn Tu 		framefmt = v4l2_subdev_get_try_format(sd, sd_state, fmt->pad);
278438fc5136SShawn Tu 		fmt->format = *framefmt;
278538fc5136SShawn Tu 	} else {
278638fc5136SShawn Tu 		ov08x40_update_pad_format(ov08x->cur_mode, fmt);
278738fc5136SShawn Tu 	}
278838fc5136SShawn Tu 
278938fc5136SShawn Tu 	return 0;
279038fc5136SShawn Tu }
279138fc5136SShawn Tu 
ov08x40_get_pad_format(struct v4l2_subdev * sd,struct v4l2_subdev_state * sd_state,struct v4l2_subdev_format * fmt)279238fc5136SShawn Tu static int ov08x40_get_pad_format(struct v4l2_subdev *sd,
279338fc5136SShawn Tu 				  struct v4l2_subdev_state *sd_state,
279438fc5136SShawn Tu 				  struct v4l2_subdev_format *fmt)
279538fc5136SShawn Tu {
279638fc5136SShawn Tu 	struct ov08x40 *ov08x = to_ov08x40(sd);
279738fc5136SShawn Tu 	int ret;
279838fc5136SShawn Tu 
279938fc5136SShawn Tu 	mutex_lock(&ov08x->mutex);
280038fc5136SShawn Tu 	ret = ov08x40_do_get_pad_format(ov08x, sd_state, fmt);
280138fc5136SShawn Tu 	mutex_unlock(&ov08x->mutex);
280238fc5136SShawn Tu 
280338fc5136SShawn Tu 	return ret;
280438fc5136SShawn Tu }
280538fc5136SShawn Tu 
280638fc5136SShawn Tu static int
ov08x40_set_pad_format(struct v4l2_subdev * sd,struct v4l2_subdev_state * sd_state,struct v4l2_subdev_format * fmt)280738fc5136SShawn Tu ov08x40_set_pad_format(struct v4l2_subdev *sd,
280838fc5136SShawn Tu 		       struct v4l2_subdev_state *sd_state,
280938fc5136SShawn Tu 		       struct v4l2_subdev_format *fmt)
281038fc5136SShawn Tu {
281138fc5136SShawn Tu 	struct ov08x40 *ov08x = to_ov08x40(sd);
281238fc5136SShawn Tu 	const struct ov08x40_mode *mode;
281338fc5136SShawn Tu 	struct v4l2_mbus_framefmt *framefmt;
281438fc5136SShawn Tu 	s32 vblank_def;
281538fc5136SShawn Tu 	s32 vblank_min;
281638fc5136SShawn Tu 	s64 h_blank;
281738fc5136SShawn Tu 	s64 pixel_rate;
281838fc5136SShawn Tu 	s64 link_freq;
281938fc5136SShawn Tu 
282038fc5136SShawn Tu 	mutex_lock(&ov08x->mutex);
282138fc5136SShawn Tu 
282238fc5136SShawn Tu 	/* Only one raw bayer(GRBG) order is supported */
282338fc5136SShawn Tu 	if (fmt->format.code != MEDIA_BUS_FMT_SGRBG10_1X10)
282438fc5136SShawn Tu 		fmt->format.code = MEDIA_BUS_FMT_SGRBG10_1X10;
282538fc5136SShawn Tu 
282638fc5136SShawn Tu 	mode = v4l2_find_nearest_size(supported_modes,
282738fc5136SShawn Tu 				      ARRAY_SIZE(supported_modes),
282838fc5136SShawn Tu 				      width, height,
282938fc5136SShawn Tu 				      fmt->format.width, fmt->format.height);
283038fc5136SShawn Tu 	ov08x40_update_pad_format(mode, fmt);
283138fc5136SShawn Tu 	if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) {
283238fc5136SShawn Tu 		framefmt = v4l2_subdev_get_try_format(sd, sd_state, fmt->pad);
283338fc5136SShawn Tu 		*framefmt = fmt->format;
283438fc5136SShawn Tu 	} else {
283538fc5136SShawn Tu 		ov08x->cur_mode = mode;
283638fc5136SShawn Tu 		__v4l2_ctrl_s_ctrl(ov08x->link_freq, mode->link_freq_index);
283738fc5136SShawn Tu 		link_freq = link_freq_menu_items[mode->link_freq_index];
283838fc5136SShawn Tu 		pixel_rate = link_freq_to_pixel_rate(link_freq);
283938fc5136SShawn Tu 		__v4l2_ctrl_s_ctrl_int64(ov08x->pixel_rate, pixel_rate);
284038fc5136SShawn Tu 
284138fc5136SShawn Tu 		/* Update limits and set FPS to default */
284238fc5136SShawn Tu 		vblank_def = ov08x->cur_mode->vts_def -
284338fc5136SShawn Tu 			     ov08x->cur_mode->height;
284438fc5136SShawn Tu 		vblank_min = ov08x->cur_mode->vts_min -
284538fc5136SShawn Tu 			     ov08x->cur_mode->height;
284638fc5136SShawn Tu 		__v4l2_ctrl_modify_range(ov08x->vblank, vblank_min,
284738fc5136SShawn Tu 					 OV08X40_VTS_MAX
284838fc5136SShawn Tu 					 - ov08x->cur_mode->height,
284938fc5136SShawn Tu 					 1,
285038fc5136SShawn Tu 					 vblank_def);
285138fc5136SShawn Tu 		__v4l2_ctrl_s_ctrl(ov08x->vblank, vblank_def);
2852*2cd17b9bSJason Chen 		h_blank = ov08x->cur_mode->hts;
285338fc5136SShawn Tu 		__v4l2_ctrl_modify_range(ov08x->hblank, h_blank,
285438fc5136SShawn Tu 					 h_blank, 1, h_blank);
285538fc5136SShawn Tu 	}
285638fc5136SShawn Tu 
285738fc5136SShawn Tu 	mutex_unlock(&ov08x->mutex);
285838fc5136SShawn Tu 
285938fc5136SShawn Tu 	return 0;
286038fc5136SShawn Tu }
286138fc5136SShawn Tu 
ov08x40_start_streaming(struct ov08x40 * ov08x)286238fc5136SShawn Tu static int ov08x40_start_streaming(struct ov08x40 *ov08x)
286338fc5136SShawn Tu {
286438fc5136SShawn Tu 	struct i2c_client *client = v4l2_get_subdevdata(&ov08x->sd);
286538fc5136SShawn Tu 	const struct ov08x40_reg_list *reg_list;
286638fc5136SShawn Tu 	int ret, link_freq_index;
286738fc5136SShawn Tu 
286838fc5136SShawn Tu 	/* Get out of from software reset */
286938fc5136SShawn Tu 	ret = ov08x40_write_reg(ov08x, OV08X40_REG_SOFTWARE_RST,
287038fc5136SShawn Tu 				OV08X40_REG_VALUE_08BIT, OV08X40_SOFTWARE_RST);
287138fc5136SShawn Tu 	if (ret) {
287238fc5136SShawn Tu 		dev_err(&client->dev, "%s failed to set powerup registers\n",
287338fc5136SShawn Tu 			__func__);
287438fc5136SShawn Tu 		return ret;
287538fc5136SShawn Tu 	}
287638fc5136SShawn Tu 
287738fc5136SShawn Tu 	link_freq_index = ov08x->cur_mode->link_freq_index;
287838fc5136SShawn Tu 	reg_list = &link_freq_configs[link_freq_index].reg_list;
287938fc5136SShawn Tu 
288038fc5136SShawn Tu 	ret = ov08x40_write_reg_list(ov08x, reg_list);
288138fc5136SShawn Tu 	if (ret) {
288238fc5136SShawn Tu 		dev_err(&client->dev, "%s failed to set plls\n", __func__);
288338fc5136SShawn Tu 		return ret;
288438fc5136SShawn Tu 	}
288538fc5136SShawn Tu 
288638fc5136SShawn Tu 	/* Apply default values of current mode */
288738fc5136SShawn Tu 	reg_list = &ov08x->cur_mode->reg_list;
288838fc5136SShawn Tu 	ret = ov08x40_write_reg_list(ov08x, reg_list);
288938fc5136SShawn Tu 	if (ret) {
289038fc5136SShawn Tu 		dev_err(&client->dev, "%s failed to set mode\n", __func__);
289138fc5136SShawn Tu 		return ret;
289238fc5136SShawn Tu 	}
289338fc5136SShawn Tu 
289438fc5136SShawn Tu 	/* Apply customized values from user */
289538fc5136SShawn Tu 	ret =  __v4l2_ctrl_handler_setup(ov08x->sd.ctrl_handler);
289638fc5136SShawn Tu 	if (ret)
289738fc5136SShawn Tu 		return ret;
289838fc5136SShawn Tu 
289938fc5136SShawn Tu 	return ov08x40_write_reg(ov08x, OV08X40_REG_MODE_SELECT,
290038fc5136SShawn Tu 				 OV08X40_REG_VALUE_08BIT,
290138fc5136SShawn Tu 				 OV08X40_MODE_STREAMING);
290238fc5136SShawn Tu }
290338fc5136SShawn Tu 
290438fc5136SShawn Tu /* Stop streaming */
ov08x40_stop_streaming(struct ov08x40 * ov08x)290538fc5136SShawn Tu static int ov08x40_stop_streaming(struct ov08x40 *ov08x)
290638fc5136SShawn Tu {
290738fc5136SShawn Tu 	return ov08x40_write_reg(ov08x, OV08X40_REG_MODE_SELECT,
290838fc5136SShawn Tu 				 OV08X40_REG_VALUE_08BIT, OV08X40_MODE_STANDBY);
290938fc5136SShawn Tu }
291038fc5136SShawn Tu 
ov08x40_set_stream(struct v4l2_subdev * sd,int enable)291138fc5136SShawn Tu static int ov08x40_set_stream(struct v4l2_subdev *sd, int enable)
291238fc5136SShawn Tu {
291338fc5136SShawn Tu 	struct ov08x40 *ov08x = to_ov08x40(sd);
291438fc5136SShawn Tu 	struct i2c_client *client = v4l2_get_subdevdata(sd);
291538fc5136SShawn Tu 	int ret = 0;
291638fc5136SShawn Tu 
291738fc5136SShawn Tu 	mutex_lock(&ov08x->mutex);
291838fc5136SShawn Tu 	if (ov08x->streaming == enable) {
291938fc5136SShawn Tu 		mutex_unlock(&ov08x->mutex);
292038fc5136SShawn Tu 		return 0;
292138fc5136SShawn Tu 	}
292238fc5136SShawn Tu 
292338fc5136SShawn Tu 	if (enable) {
292438fc5136SShawn Tu 		ret = pm_runtime_resume_and_get(&client->dev);
292538fc5136SShawn Tu 		if (ret < 0)
292638fc5136SShawn Tu 			goto err_unlock;
292738fc5136SShawn Tu 
292838fc5136SShawn Tu 		/*
292938fc5136SShawn Tu 		 * Apply default & customized values
293038fc5136SShawn Tu 		 * and then start streaming.
293138fc5136SShawn Tu 		 */
293238fc5136SShawn Tu 		ret = ov08x40_start_streaming(ov08x);
293338fc5136SShawn Tu 		if (ret)
293438fc5136SShawn Tu 			goto err_rpm_put;
293538fc5136SShawn Tu 	} else {
293638fc5136SShawn Tu 		ov08x40_stop_streaming(ov08x);
293738fc5136SShawn Tu 		pm_runtime_put(&client->dev);
293838fc5136SShawn Tu 	}
293938fc5136SShawn Tu 
294038fc5136SShawn Tu 	ov08x->streaming = enable;
294138fc5136SShawn Tu 	mutex_unlock(&ov08x->mutex);
294238fc5136SShawn Tu 
294338fc5136SShawn Tu 	return ret;
294438fc5136SShawn Tu 
294538fc5136SShawn Tu err_rpm_put:
294638fc5136SShawn Tu 	pm_runtime_put(&client->dev);
294738fc5136SShawn Tu err_unlock:
294838fc5136SShawn Tu 	mutex_unlock(&ov08x->mutex);
294938fc5136SShawn Tu 
295038fc5136SShawn Tu 	return ret;
295138fc5136SShawn Tu }
295238fc5136SShawn Tu 
ov08x40_suspend(struct device * dev)295338fc5136SShawn Tu static int __maybe_unused ov08x40_suspend(struct device *dev)
295438fc5136SShawn Tu {
295538fc5136SShawn Tu 	struct v4l2_subdev *sd = dev_get_drvdata(dev);
295638fc5136SShawn Tu 	struct ov08x40 *ov08x = to_ov08x40(sd);
295738fc5136SShawn Tu 
295838fc5136SShawn Tu 	if (ov08x->streaming)
295938fc5136SShawn Tu 		ov08x40_stop_streaming(ov08x);
296038fc5136SShawn Tu 
296138fc5136SShawn Tu 	return 0;
296238fc5136SShawn Tu }
296338fc5136SShawn Tu 
ov08x40_resume(struct device * dev)296438fc5136SShawn Tu static int __maybe_unused ov08x40_resume(struct device *dev)
296538fc5136SShawn Tu {
296638fc5136SShawn Tu 	struct v4l2_subdev *sd = dev_get_drvdata(dev);
296738fc5136SShawn Tu 	struct ov08x40 *ov08x = to_ov08x40(sd);
296838fc5136SShawn Tu 	int ret;
296938fc5136SShawn Tu 
297038fc5136SShawn Tu 	if (ov08x->streaming) {
297138fc5136SShawn Tu 		ret = ov08x40_start_streaming(ov08x);
297238fc5136SShawn Tu 		if (ret)
297338fc5136SShawn Tu 			goto error;
297438fc5136SShawn Tu 	}
297538fc5136SShawn Tu 
297638fc5136SShawn Tu 	return 0;
297738fc5136SShawn Tu 
297838fc5136SShawn Tu error:
297938fc5136SShawn Tu 	ov08x40_stop_streaming(ov08x);
298038fc5136SShawn Tu 	ov08x->streaming = false;
298138fc5136SShawn Tu 	return ret;
298238fc5136SShawn Tu }
298338fc5136SShawn Tu 
298438fc5136SShawn Tu /* Verify chip ID */
ov08x40_identify_module(struct ov08x40 * ov08x)298538fc5136SShawn Tu static int ov08x40_identify_module(struct ov08x40 *ov08x)
298638fc5136SShawn Tu {
298738fc5136SShawn Tu 	struct i2c_client *client = v4l2_get_subdevdata(&ov08x->sd);
298838fc5136SShawn Tu 	int ret;
298938fc5136SShawn Tu 	u32 val;
299038fc5136SShawn Tu 
299138fc5136SShawn Tu 	ret = ov08x40_read_reg(ov08x, OV08X40_REG_CHIP_ID,
299238fc5136SShawn Tu 			       OV08X40_REG_VALUE_24BIT, &val);
299338fc5136SShawn Tu 	if (ret)
299438fc5136SShawn Tu 		return ret;
299538fc5136SShawn Tu 
299638fc5136SShawn Tu 	if (val != OV08X40_CHIP_ID) {
299738fc5136SShawn Tu 		dev_err(&client->dev, "chip id mismatch: %x!=%x\n",
299838fc5136SShawn Tu 			OV08X40_CHIP_ID, val);
299938fc5136SShawn Tu 		return -EIO;
300038fc5136SShawn Tu 	}
300138fc5136SShawn Tu 
300238fc5136SShawn Tu 	return 0;
300338fc5136SShawn Tu }
300438fc5136SShawn Tu 
300538fc5136SShawn Tu static const struct v4l2_subdev_video_ops ov08x40_video_ops = {
300638fc5136SShawn Tu 	.s_stream = ov08x40_set_stream,
300738fc5136SShawn Tu };
300838fc5136SShawn Tu 
300938fc5136SShawn Tu static const struct v4l2_subdev_pad_ops ov08x40_pad_ops = {
301038fc5136SShawn Tu 	.enum_mbus_code = ov08x40_enum_mbus_code,
301138fc5136SShawn Tu 	.get_fmt = ov08x40_get_pad_format,
301238fc5136SShawn Tu 	.set_fmt = ov08x40_set_pad_format,
301338fc5136SShawn Tu 	.enum_frame_size = ov08x40_enum_frame_size,
301438fc5136SShawn Tu };
301538fc5136SShawn Tu 
301638fc5136SShawn Tu static const struct v4l2_subdev_ops ov08x40_subdev_ops = {
301738fc5136SShawn Tu 	.video = &ov08x40_video_ops,
301838fc5136SShawn Tu 	.pad = &ov08x40_pad_ops,
301938fc5136SShawn Tu };
302038fc5136SShawn Tu 
302138fc5136SShawn Tu static const struct media_entity_operations ov08x40_subdev_entity_ops = {
302238fc5136SShawn Tu 	.link_validate = v4l2_subdev_link_validate,
302338fc5136SShawn Tu };
302438fc5136SShawn Tu 
302538fc5136SShawn Tu static const struct v4l2_subdev_internal_ops ov08x40_internal_ops = {
302638fc5136SShawn Tu 	.open = ov08x40_open,
302738fc5136SShawn Tu };
302838fc5136SShawn Tu 
ov08x40_init_controls(struct ov08x40 * ov08x)302938fc5136SShawn Tu static int ov08x40_init_controls(struct ov08x40 *ov08x)
303038fc5136SShawn Tu {
303138fc5136SShawn Tu 	struct i2c_client *client = v4l2_get_subdevdata(&ov08x->sd);
303238fc5136SShawn Tu 	struct v4l2_fwnode_device_properties props;
303338fc5136SShawn Tu 	struct v4l2_ctrl_handler *ctrl_hdlr;
303438fc5136SShawn Tu 	s64 exposure_max;
303538fc5136SShawn Tu 	s64 vblank_def;
303638fc5136SShawn Tu 	s64 vblank_min;
303738fc5136SShawn Tu 	s64 hblank;
303838fc5136SShawn Tu 	s64 pixel_rate_min;
303938fc5136SShawn Tu 	s64 pixel_rate_max;
304038fc5136SShawn Tu 	const struct ov08x40_mode *mode;
304138fc5136SShawn Tu 	u32 max;
304238fc5136SShawn Tu 	int ret;
304338fc5136SShawn Tu 
304438fc5136SShawn Tu 	ctrl_hdlr = &ov08x->ctrl_handler;
304538fc5136SShawn Tu 	ret = v4l2_ctrl_handler_init(ctrl_hdlr, 10);
304638fc5136SShawn Tu 	if (ret)
304738fc5136SShawn Tu 		return ret;
304838fc5136SShawn Tu 
304938fc5136SShawn Tu 	mutex_init(&ov08x->mutex);
305038fc5136SShawn Tu 	ctrl_hdlr->lock = &ov08x->mutex;
305138fc5136SShawn Tu 	max = ARRAY_SIZE(link_freq_menu_items) - 1;
305238fc5136SShawn Tu 	ov08x->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr,
305338fc5136SShawn Tu 						  &ov08x40_ctrl_ops,
305438fc5136SShawn Tu 						  V4L2_CID_LINK_FREQ,
305538fc5136SShawn Tu 						  max,
305638fc5136SShawn Tu 						  0,
305738fc5136SShawn Tu 						  link_freq_menu_items);
305838fc5136SShawn Tu 	if (ov08x->link_freq)
305938fc5136SShawn Tu 		ov08x->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
306038fc5136SShawn Tu 
306138fc5136SShawn Tu 	pixel_rate_max = link_freq_to_pixel_rate(link_freq_menu_items[0]);
306238fc5136SShawn Tu 	pixel_rate_min = 0;
306338fc5136SShawn Tu 	/* By default, PIXEL_RATE is read only */
306438fc5136SShawn Tu 	ov08x->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &ov08x40_ctrl_ops,
306538fc5136SShawn Tu 					      V4L2_CID_PIXEL_RATE,
306638fc5136SShawn Tu 					      pixel_rate_min, pixel_rate_max,
306738fc5136SShawn Tu 					      1, pixel_rate_max);
306838fc5136SShawn Tu 
306938fc5136SShawn Tu 	mode = ov08x->cur_mode;
307038fc5136SShawn Tu 	vblank_def = mode->vts_def - mode->height;
307138fc5136SShawn Tu 	vblank_min = mode->vts_min - mode->height;
307238fc5136SShawn Tu 	ov08x->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &ov08x40_ctrl_ops,
307338fc5136SShawn Tu 					  V4L2_CID_VBLANK,
307438fc5136SShawn Tu 					  vblank_min,
307538fc5136SShawn Tu 					  OV08X40_VTS_MAX - mode->height, 1,
307638fc5136SShawn Tu 					  vblank_def);
307738fc5136SShawn Tu 
3078*2cd17b9bSJason Chen 	hblank = ov08x->cur_mode->hts;
307938fc5136SShawn Tu 	ov08x->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &ov08x40_ctrl_ops,
308038fc5136SShawn Tu 					  V4L2_CID_HBLANK,
308138fc5136SShawn Tu 					  hblank, hblank, 1, hblank);
308238fc5136SShawn Tu 	if (ov08x->hblank)
308338fc5136SShawn Tu 		ov08x->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
308438fc5136SShawn Tu 
308538fc5136SShawn Tu 	exposure_max = mode->vts_def - OV08X40_EXPOSURE_MAX_MARGIN;
308638fc5136SShawn Tu 	ov08x->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &ov08x40_ctrl_ops,
308738fc5136SShawn Tu 					    V4L2_CID_EXPOSURE,
308838fc5136SShawn Tu 					    OV08X40_EXPOSURE_MIN,
308938fc5136SShawn Tu 					    exposure_max, OV08X40_EXPOSURE_STEP,
309038fc5136SShawn Tu 					    exposure_max);
309138fc5136SShawn Tu 
309238fc5136SShawn Tu 	v4l2_ctrl_new_std(ctrl_hdlr, &ov08x40_ctrl_ops, V4L2_CID_ANALOGUE_GAIN,
309338fc5136SShawn Tu 			  OV08X40_ANA_GAIN_MIN, OV08X40_ANA_GAIN_MAX,
309438fc5136SShawn Tu 			  OV08X40_ANA_GAIN_STEP, OV08X40_ANA_GAIN_DEFAULT);
309538fc5136SShawn Tu 
309638fc5136SShawn Tu 	/* Digital gain */
309738fc5136SShawn Tu 	v4l2_ctrl_new_std(ctrl_hdlr, &ov08x40_ctrl_ops, V4L2_CID_DIGITAL_GAIN,
309838fc5136SShawn Tu 			  OV08X40_DGTL_GAIN_MIN, OV08X40_DGTL_GAIN_MAX,
309938fc5136SShawn Tu 			  OV08X40_DGTL_GAIN_STEP, OV08X40_DGTL_GAIN_DEFAULT);
310038fc5136SShawn Tu 
310138fc5136SShawn Tu 	v4l2_ctrl_new_std_menu_items(ctrl_hdlr, &ov08x40_ctrl_ops,
310238fc5136SShawn Tu 				     V4L2_CID_TEST_PATTERN,
310338fc5136SShawn Tu 				     ARRAY_SIZE(ov08x40_test_pattern_menu) - 1,
310438fc5136SShawn Tu 				     0, 0, ov08x40_test_pattern_menu);
310538fc5136SShawn Tu 
310638fc5136SShawn Tu 	v4l2_ctrl_new_std(ctrl_hdlr, &ov08x40_ctrl_ops,
310738fc5136SShawn Tu 			  V4L2_CID_HFLIP, 0, 1, 1, 0);
310838fc5136SShawn Tu 	v4l2_ctrl_new_std(ctrl_hdlr, &ov08x40_ctrl_ops,
310938fc5136SShawn Tu 			  V4L2_CID_VFLIP, 0, 1, 1, 0);
311038fc5136SShawn Tu 
311138fc5136SShawn Tu 	if (ctrl_hdlr->error) {
311238fc5136SShawn Tu 		ret = ctrl_hdlr->error;
311338fc5136SShawn Tu 		dev_err(&client->dev, "%s control init failed (%d)\n",
311438fc5136SShawn Tu 			__func__, ret);
311538fc5136SShawn Tu 		goto error;
311638fc5136SShawn Tu 	}
311738fc5136SShawn Tu 
311838fc5136SShawn Tu 	ret = v4l2_fwnode_device_parse(&client->dev, &props);
311938fc5136SShawn Tu 	if (ret)
312038fc5136SShawn Tu 		goto error;
312138fc5136SShawn Tu 
312238fc5136SShawn Tu 	ret = v4l2_ctrl_new_fwnode_properties(ctrl_hdlr, &ov08x40_ctrl_ops,
312338fc5136SShawn Tu 					      &props);
312438fc5136SShawn Tu 	if (ret)
312538fc5136SShawn Tu 		goto error;
312638fc5136SShawn Tu 
312738fc5136SShawn Tu 	ov08x->sd.ctrl_handler = ctrl_hdlr;
312838fc5136SShawn Tu 
312938fc5136SShawn Tu 	return 0;
313038fc5136SShawn Tu 
313138fc5136SShawn Tu error:
313238fc5136SShawn Tu 	v4l2_ctrl_handler_free(ctrl_hdlr);
313338fc5136SShawn Tu 	mutex_destroy(&ov08x->mutex);
313438fc5136SShawn Tu 
313538fc5136SShawn Tu 	return ret;
313638fc5136SShawn Tu }
313738fc5136SShawn Tu 
ov08x40_free_controls(struct ov08x40 * ov08x)313838fc5136SShawn Tu static void ov08x40_free_controls(struct ov08x40 *ov08x)
313938fc5136SShawn Tu {
314038fc5136SShawn Tu 	v4l2_ctrl_handler_free(ov08x->sd.ctrl_handler);
314138fc5136SShawn Tu 	mutex_destroy(&ov08x->mutex);
314238fc5136SShawn Tu }
314338fc5136SShawn Tu 
ov08x40_check_hwcfg(struct device * dev)314438fc5136SShawn Tu static int ov08x40_check_hwcfg(struct device *dev)
314538fc5136SShawn Tu {
314638fc5136SShawn Tu 	struct v4l2_fwnode_endpoint bus_cfg = {
314738fc5136SShawn Tu 		.bus_type = V4L2_MBUS_CSI2_DPHY
314838fc5136SShawn Tu 	};
314938fc5136SShawn Tu 	struct fwnode_handle *ep;
315038fc5136SShawn Tu 	struct fwnode_handle *fwnode = dev_fwnode(dev);
315138fc5136SShawn Tu 	unsigned int i, j;
315238fc5136SShawn Tu 	int ret;
315338fc5136SShawn Tu 	u32 ext_clk;
315438fc5136SShawn Tu 
315538fc5136SShawn Tu 	if (!fwnode)
315638fc5136SShawn Tu 		return -ENXIO;
315738fc5136SShawn Tu 
315838fc5136SShawn Tu 	ret = fwnode_property_read_u32(dev_fwnode(dev), "clock-frequency",
315938fc5136SShawn Tu 				       &ext_clk);
316038fc5136SShawn Tu 	if (ret) {
316138fc5136SShawn Tu 		dev_err(dev, "can't get clock frequency");
316238fc5136SShawn Tu 		return ret;
316338fc5136SShawn Tu 	}
316438fc5136SShawn Tu 
316538fc5136SShawn Tu 	if (ext_clk != OV08X40_EXT_CLK) {
316638fc5136SShawn Tu 		dev_err(dev, "external clock %d is not supported",
316738fc5136SShawn Tu 			ext_clk);
316838fc5136SShawn Tu 		return -EINVAL;
316938fc5136SShawn Tu 	}
317038fc5136SShawn Tu 
317138fc5136SShawn Tu 	ep = fwnode_graph_get_next_endpoint(fwnode, NULL);
317238fc5136SShawn Tu 	if (!ep)
317338fc5136SShawn Tu 		return -ENXIO;
317438fc5136SShawn Tu 
317538fc5136SShawn Tu 	ret = v4l2_fwnode_endpoint_alloc_parse(ep, &bus_cfg);
317638fc5136SShawn Tu 	fwnode_handle_put(ep);
317738fc5136SShawn Tu 	if (ret)
317838fc5136SShawn Tu 		return ret;
317938fc5136SShawn Tu 
318038fc5136SShawn Tu 	if (bus_cfg.bus.mipi_csi2.num_data_lanes != OV08X40_DATA_LANES) {
318138fc5136SShawn Tu 		dev_err(dev, "number of CSI2 data lanes %d is not supported",
318238fc5136SShawn Tu 			bus_cfg.bus.mipi_csi2.num_data_lanes);
318338fc5136SShawn Tu 		ret = -EINVAL;
318438fc5136SShawn Tu 		goto out_err;
318538fc5136SShawn Tu 	}
318638fc5136SShawn Tu 
318738fc5136SShawn Tu 	if (!bus_cfg.nr_of_link_frequencies) {
318838fc5136SShawn Tu 		dev_err(dev, "no link frequencies defined");
318938fc5136SShawn Tu 		ret = -EINVAL;
319038fc5136SShawn Tu 		goto out_err;
319138fc5136SShawn Tu 	}
319238fc5136SShawn Tu 
319338fc5136SShawn Tu 	for (i = 0; i < ARRAY_SIZE(link_freq_menu_items); i++) {
319438fc5136SShawn Tu 		for (j = 0; j < bus_cfg.nr_of_link_frequencies; j++) {
319538fc5136SShawn Tu 			if (link_freq_menu_items[i] ==
319638fc5136SShawn Tu 				bus_cfg.link_frequencies[j])
319738fc5136SShawn Tu 				break;
319838fc5136SShawn Tu 		}
319938fc5136SShawn Tu 
320038fc5136SShawn Tu 		if (j == bus_cfg.nr_of_link_frequencies) {
320138fc5136SShawn Tu 			dev_err(dev, "no link frequency %lld supported",
320238fc5136SShawn Tu 				link_freq_menu_items[i]);
320338fc5136SShawn Tu 			ret = -EINVAL;
320438fc5136SShawn Tu 			goto out_err;
320538fc5136SShawn Tu 		}
320638fc5136SShawn Tu 	}
320738fc5136SShawn Tu 
320838fc5136SShawn Tu out_err:
320938fc5136SShawn Tu 	v4l2_fwnode_endpoint_free(&bus_cfg);
321038fc5136SShawn Tu 
321138fc5136SShawn Tu 	return ret;
321238fc5136SShawn Tu }
321338fc5136SShawn Tu 
ov08x40_probe(struct i2c_client * client)321438fc5136SShawn Tu static int ov08x40_probe(struct i2c_client *client)
321538fc5136SShawn Tu {
321638fc5136SShawn Tu 	struct ov08x40 *ov08x;
321738fc5136SShawn Tu 	int ret;
321838fc5136SShawn Tu 
321938fc5136SShawn Tu 	/* Check HW config */
322038fc5136SShawn Tu 	ret = ov08x40_check_hwcfg(&client->dev);
322138fc5136SShawn Tu 	if (ret) {
322238fc5136SShawn Tu 		dev_err(&client->dev, "failed to check hwcfg: %d", ret);
322338fc5136SShawn Tu 		return ret;
322438fc5136SShawn Tu 	}
322538fc5136SShawn Tu 
322638fc5136SShawn Tu 	ov08x = devm_kzalloc(&client->dev, sizeof(*ov08x), GFP_KERNEL);
322738fc5136SShawn Tu 	if (!ov08x)
322838fc5136SShawn Tu 		return -ENOMEM;
322938fc5136SShawn Tu 
323038fc5136SShawn Tu 	/* Initialize subdev */
323138fc5136SShawn Tu 	v4l2_i2c_subdev_init(&ov08x->sd, client, &ov08x40_subdev_ops);
323238fc5136SShawn Tu 
323338fc5136SShawn Tu 	/* Check module identity */
323438fc5136SShawn Tu 	ret = ov08x40_identify_module(ov08x);
323538fc5136SShawn Tu 	if (ret) {
323638fc5136SShawn Tu 		dev_err(&client->dev, "failed to find sensor: %d\n", ret);
323738fc5136SShawn Tu 		return ret;
323838fc5136SShawn Tu 	}
323938fc5136SShawn Tu 
324038fc5136SShawn Tu 	/* Set default mode to max resolution */
324138fc5136SShawn Tu 	ov08x->cur_mode = &supported_modes[0];
324238fc5136SShawn Tu 
324338fc5136SShawn Tu 	ret = ov08x40_init_controls(ov08x);
324438fc5136SShawn Tu 	if (ret)
324538fc5136SShawn Tu 		return ret;
324638fc5136SShawn Tu 
324738fc5136SShawn Tu 	/* Initialize subdev */
324838fc5136SShawn Tu 	ov08x->sd.internal_ops = &ov08x40_internal_ops;
324938fc5136SShawn Tu 	ov08x->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
325038fc5136SShawn Tu 	ov08x->sd.entity.ops = &ov08x40_subdev_entity_ops;
325138fc5136SShawn Tu 	ov08x->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
325238fc5136SShawn Tu 
325338fc5136SShawn Tu 	/* Initialize source pad */
325438fc5136SShawn Tu 	ov08x->pad.flags = MEDIA_PAD_FL_SOURCE;
325538fc5136SShawn Tu 	ret = media_entity_pads_init(&ov08x->sd.entity, 1, &ov08x->pad);
325638fc5136SShawn Tu 	if (ret) {
325738fc5136SShawn Tu 		dev_err(&client->dev, "%s failed:%d\n", __func__, ret);
325838fc5136SShawn Tu 		goto error_handler_free;
325938fc5136SShawn Tu 	}
326038fc5136SShawn Tu 
326138fc5136SShawn Tu 	ret = v4l2_async_register_subdev_sensor(&ov08x->sd);
326238fc5136SShawn Tu 	if (ret < 0)
326338fc5136SShawn Tu 		goto error_media_entity;
326438fc5136SShawn Tu 
326538fc5136SShawn Tu 	/*
326638fc5136SShawn Tu 	 * Device is already turned on by i2c-core with ACPI domain PM.
326738fc5136SShawn Tu 	 * Enable runtime PM and turn off the device.
326838fc5136SShawn Tu 	 */
326938fc5136SShawn Tu 	pm_runtime_set_active(&client->dev);
327038fc5136SShawn Tu 	pm_runtime_enable(&client->dev);
327138fc5136SShawn Tu 	pm_runtime_idle(&client->dev);
327238fc5136SShawn Tu 
327338fc5136SShawn Tu 	return 0;
327438fc5136SShawn Tu 
327538fc5136SShawn Tu error_media_entity:
327638fc5136SShawn Tu 	media_entity_cleanup(&ov08x->sd.entity);
327738fc5136SShawn Tu 
327838fc5136SShawn Tu error_handler_free:
327938fc5136SShawn Tu 	ov08x40_free_controls(ov08x);
328038fc5136SShawn Tu 
328138fc5136SShawn Tu 	return ret;
328238fc5136SShawn Tu }
328338fc5136SShawn Tu 
ov08x40_remove(struct i2c_client * client)3284f54f5fd0SKieran Bingham static void ov08x40_remove(struct i2c_client *client)
328538fc5136SShawn Tu {
328638fc5136SShawn Tu 	struct v4l2_subdev *sd = i2c_get_clientdata(client);
328738fc5136SShawn Tu 	struct ov08x40 *ov08x = to_ov08x40(sd);
328838fc5136SShawn Tu 
328938fc5136SShawn Tu 	v4l2_async_unregister_subdev(sd);
329038fc5136SShawn Tu 	media_entity_cleanup(&sd->entity);
329138fc5136SShawn Tu 	ov08x40_free_controls(ov08x);
329238fc5136SShawn Tu 
329338fc5136SShawn Tu 	pm_runtime_disable(&client->dev);
329438fc5136SShawn Tu 	pm_runtime_set_suspended(&client->dev);
329538fc5136SShawn Tu }
329638fc5136SShawn Tu 
329738fc5136SShawn Tu static const struct dev_pm_ops ov08x40_pm_ops = {
329838fc5136SShawn Tu 	SET_SYSTEM_SLEEP_PM_OPS(ov08x40_suspend, ov08x40_resume)
329938fc5136SShawn Tu };
330038fc5136SShawn Tu 
330138fc5136SShawn Tu #ifdef CONFIG_ACPI
330238fc5136SShawn Tu static const struct acpi_device_id ov08x40_acpi_ids[] = {
330338fc5136SShawn Tu 	{"OVTI08F4"},
330438fc5136SShawn Tu 	{ /* sentinel */ }
330538fc5136SShawn Tu };
330638fc5136SShawn Tu 
330738fc5136SShawn Tu MODULE_DEVICE_TABLE(acpi, ov08x40_acpi_ids);
330838fc5136SShawn Tu #endif
330938fc5136SShawn Tu 
331038fc5136SShawn Tu static struct i2c_driver ov08x40_i2c_driver = {
331138fc5136SShawn Tu 	.driver = {
331238fc5136SShawn Tu 		.name = "ov08x40",
331338fc5136SShawn Tu 		.pm = &ov08x40_pm_ops,
331438fc5136SShawn Tu 		.acpi_match_table = ACPI_PTR(ov08x40_acpi_ids),
331538fc5136SShawn Tu 	},
3316aaeb31c0SUwe Kleine-König 	.probe = ov08x40_probe,
331738fc5136SShawn Tu 	.remove = ov08x40_remove,
331838fc5136SShawn Tu };
331938fc5136SShawn Tu 
332038fc5136SShawn Tu module_i2c_driver(ov08x40_i2c_driver);
332138fc5136SShawn Tu 
332238fc5136SShawn Tu MODULE_AUTHOR("Jason Chen <jason.z.chen@intel.com>");
33234106cd72SSakari Ailus MODULE_AUTHOR("Shawn Tu");
332438fc5136SShawn Tu MODULE_DESCRIPTION("OmniVision OV08X40 sensor driver");
332538fc5136SShawn Tu MODULE_LICENSE("GPL");
3326