xref: /openbmc/linux/drivers/media/i2c/hi847.c (revision 4106cd72)
1da15b409SShawn Tu // SPDX-License-Identifier: GPL-2.0
2da15b409SShawn Tu // Copyright (c) 2022 Intel Corporation.
3da15b409SShawn Tu 
4da15b409SShawn Tu #include <asm/unaligned.h>
5da15b409SShawn Tu #include <linux/acpi.h>
6da15b409SShawn Tu #include <linux/delay.h>
7da15b409SShawn Tu #include <linux/i2c.h>
8da15b409SShawn Tu #include <linux/module.h>
9da15b409SShawn Tu #include <linux/pm_runtime.h>
10da15b409SShawn Tu #include <media/v4l2-ctrls.h>
11da15b409SShawn Tu #include <media/v4l2-device.h>
12da15b409SShawn Tu #include <media/v4l2-fwnode.h>
13da15b409SShawn Tu 
14da15b409SShawn Tu #define HI847_REG_VALUE_08BIT		1
15da15b409SShawn Tu #define HI847_REG_VALUE_16BIT		2
16da15b409SShawn Tu #define HI847_REG_VALUE_24BIT		3
17da15b409SShawn Tu 
18da15b409SShawn Tu #define HI847_LINK_FREQ_400MHZ		400000000ULL
19da15b409SShawn Tu #define HI847_LINK_FREQ_200MHZ		200000000ULL
20da15b409SShawn Tu #define HI847_SCLK			72000000ULL
21da15b409SShawn Tu #define HI847_MCLK			19200000
22da15b409SShawn Tu #define HI847_DATA_LANES		4
23da15b409SShawn Tu #define HI847_RGB_DEPTH			10
24da15b409SShawn Tu 
25da15b409SShawn Tu #define HI847_REG_CHIP_ID		0x0716
26da15b409SShawn Tu #define HI847_CHIP_ID			0x0847
27da15b409SShawn Tu 
28da15b409SShawn Tu #define HI847_REG_MODE_SELECT		0x0B00
29da15b409SShawn Tu #define HI847_MODE_STANDBY		0x0000
30da15b409SShawn Tu #define HI847_MODE_STREAMING		0x0100
31da15b409SShawn Tu 
32da15b409SShawn Tu #define HI847_REG_MODE_TG		0x027E
33da15b409SShawn Tu #define HI847_REG_MODE_TG_ENABLE	0x0100
34da15b409SShawn Tu #define HI847_REG_MODE_TG_DISABLE	0x0000
35da15b409SShawn Tu 
36da15b409SShawn Tu /* vertical-timings from sensor */
37da15b409SShawn Tu #define HI847_REG_FLL			0x020E
38da15b409SShawn Tu #define HI847_FLL_30FPS			0x0B51
39da15b409SShawn Tu #define HI847_FLL_30FPS_MIN		0x0B51
40da15b409SShawn Tu #define HI847_FLL_60FPS			0x05A9
41da15b409SShawn Tu #define HI847_FLL_60FPS_MIN		0x05A9
42da15b409SShawn Tu #define HI847_FLL_MAX			0x7fff
43da15b409SShawn Tu 
44da15b409SShawn Tu /* horizontal-timings from sensor */
45da15b409SShawn Tu #define HI847_REG_LLP			0x0206
46da15b409SShawn Tu 
47da15b409SShawn Tu /* Exposure controls from sensor */
48da15b409SShawn Tu #define HI847_REG_EXPOSURE		0x020A
49da15b409SShawn Tu #define HI847_EXPOSURE_MIN		4
50da15b409SShawn Tu #define HI847_EXPOSURE_MAX_MARGIN	4
51da15b409SShawn Tu #define HI847_EXPOSURE_STEP		1
52da15b409SShawn Tu 
53da15b409SShawn Tu /* Analog gain controls from sensor */
54da15b409SShawn Tu #define HI847_REG_ANALOG_GAIN		0x0212
55da15b409SShawn Tu #define HI847_ANAL_GAIN_MIN		0
56da15b409SShawn Tu #define HI847_ANAL_GAIN_MAX		240
57da15b409SShawn Tu #define HI847_ANAL_GAIN_STEP		1
58da15b409SShawn Tu 
59da15b409SShawn Tu /* Digital gain controls from sensor */
60da15b409SShawn Tu #define HI847_REG_MWB_GR_GAIN		0x0214
61da15b409SShawn Tu #define HI847_REG_MWB_GB_GAIN		0x0216
62da15b409SShawn Tu #define HI847_REG_MWB_R_GAIN		0x0218
63da15b409SShawn Tu #define HI847_REG_MWB_B_GAIN		0x021A
64da15b409SShawn Tu #define HI847_DGTL_GAIN_MIN		1
65da15b409SShawn Tu #define HI847_DGTL_GAIN_MAX		8191
66da15b409SShawn Tu #define HI847_DGTL_GAIN_STEP		1
67da15b409SShawn Tu #define HI847_DGTL_GAIN_DEFAULT		512
68da15b409SShawn Tu 
69da15b409SShawn Tu /* Test Pattern Control */
70da15b409SShawn Tu #define HI847_REG_ISP			0X0B04
71da15b409SShawn Tu #define HI847_REG_ISP_TPG_EN		0x0001
72da15b409SShawn Tu #define HI847_REG_TEST_PATTERN		0x0C0A
73da15b409SShawn Tu 
74da15b409SShawn Tu /* Flip Mirror Controls from sensor */
75da15b409SShawn Tu #define HI847_REG_MIRROR_FLIP	0x0202
76da15b409SShawn Tu 
77da15b409SShawn Tu #define HI847_REG_FORMAT_X	0x0F04
78da15b409SShawn Tu #define HI847_REG_FORMAT_Y	0x0F06
79da15b409SShawn Tu 
80da15b409SShawn Tu enum {
81da15b409SShawn Tu 	HI847_LINK_FREQ_400MHZ_INDEX,
82da15b409SShawn Tu 	HI847_LINK_FREQ_200MHZ_INDEX,
83da15b409SShawn Tu };
84da15b409SShawn Tu 
85da15b409SShawn Tu struct hi847_reg {
86da15b409SShawn Tu 	u16 address;
87da15b409SShawn Tu 	u16 val;
88da15b409SShawn Tu };
89da15b409SShawn Tu 
90da15b409SShawn Tu struct hi847_reg_list {
91da15b409SShawn Tu 	u32 num_of_regs;
92da15b409SShawn Tu 	const struct hi847_reg *regs;
93da15b409SShawn Tu };
94da15b409SShawn Tu 
95da15b409SShawn Tu struct hi847_link_freq_config {
96da15b409SShawn Tu 	const struct hi847_reg_list reg_list;
97da15b409SShawn Tu };
98da15b409SShawn Tu 
99da15b409SShawn Tu struct hi847_mode {
100da15b409SShawn Tu 	/* Frame width in pixels */
101da15b409SShawn Tu 	u32 width;
102da15b409SShawn Tu 
103da15b409SShawn Tu 	/* Frame height in pixels */
104da15b409SShawn Tu 	u32 height;
105da15b409SShawn Tu 
106da15b409SShawn Tu 	/* Horizontal timining size */
107da15b409SShawn Tu 	u32 llp;
108da15b409SShawn Tu 
109da15b409SShawn Tu 	/* Default vertical timining size */
110da15b409SShawn Tu 	u32 fll_def;
111da15b409SShawn Tu 
112da15b409SShawn Tu 	/* Min vertical timining size */
113da15b409SShawn Tu 	u32 fll_min;
114da15b409SShawn Tu 
115da15b409SShawn Tu 	/* Link frequency needed for this resolution */
116da15b409SShawn Tu 	u32 link_freq_index;
117da15b409SShawn Tu 
118da15b409SShawn Tu 	/* Sensor register settings for this resolution */
119da15b409SShawn Tu 	const struct hi847_reg_list reg_list;
120da15b409SShawn Tu };
121da15b409SShawn Tu 
122da15b409SShawn Tu #define to_hi847(_sd) container_of(_sd, struct hi847, sd)
123da15b409SShawn Tu 
124da15b409SShawn Tu //SENSOR_INITIALIZATION
125da15b409SShawn Tu static const struct hi847_reg mipi_data_rate_lane_4[] = {
126da15b409SShawn Tu 	{0x0790, 0x0100},
127da15b409SShawn Tu 	{0x2000, 0x0000},
128da15b409SShawn Tu 	{0x2002, 0x0058},
129da15b409SShawn Tu 	{0x2006, 0x40B2},
130da15b409SShawn Tu 	{0x2008, 0xB05C},
131da15b409SShawn Tu 	{0x200A, 0x8446},
132da15b409SShawn Tu 	{0x200C, 0x40B2},
133da15b409SShawn Tu 	{0x200E, 0xB082},
134da15b409SShawn Tu 	{0x2010, 0x8450},
135da15b409SShawn Tu 	{0x2012, 0x40B2},
136da15b409SShawn Tu 	{0x2014, 0xB0AE},
137da15b409SShawn Tu 	{0x2016, 0x84C6},
138da15b409SShawn Tu 	{0x2018, 0x40B2},
139da15b409SShawn Tu 	{0x201A, 0xB11A},
140da15b409SShawn Tu 	{0x201C, 0x84BC},
141da15b409SShawn Tu 	{0x201E, 0x40B2},
142da15b409SShawn Tu 	{0x2020, 0xB34A},
143da15b409SShawn Tu 	{0x2022, 0x84B4},
144da15b409SShawn Tu 	{0x2024, 0x40B2},
145da15b409SShawn Tu 	{0x2026, 0xB386},
146da15b409SShawn Tu 	{0x2028, 0x84B0},
147da15b409SShawn Tu 	{0x202A, 0x40B2},
148da15b409SShawn Tu 	{0x202C, 0xB3B4},
149da15b409SShawn Tu 	{0x202E, 0x84B8},
150da15b409SShawn Tu 	{0x2030, 0x40B2},
151da15b409SShawn Tu 	{0x2032, 0xB0F4},
152da15b409SShawn Tu 	{0x2034, 0x8470},
153da15b409SShawn Tu 	{0x2036, 0x40B2},
154da15b409SShawn Tu 	{0x2038, 0xB3EA},
155da15b409SShawn Tu 	{0x203A, 0x847C},
156da15b409SShawn Tu 	{0x203C, 0x40B2},
157da15b409SShawn Tu 	{0x203E, 0xB658},
158da15b409SShawn Tu 	{0x2040, 0x8478},
159da15b409SShawn Tu 	{0x2042, 0x40B2},
160da15b409SShawn Tu 	{0x2044, 0xB67E},
161da15b409SShawn Tu 	{0x2046, 0x847E},
162da15b409SShawn Tu 	{0x2048, 0x40B2},
163da15b409SShawn Tu 	{0x204A, 0xB78E},
164da15b409SShawn Tu 	{0x204C, 0x843A},
165da15b409SShawn Tu 	{0x204E, 0x40B2},
166da15b409SShawn Tu 	{0x2050, 0xB980},
167da15b409SShawn Tu 	{0x2052, 0x845C},
168da15b409SShawn Tu 	{0x2054, 0x40B2},
169da15b409SShawn Tu 	{0x2056, 0xB9B0},
170da15b409SShawn Tu 	{0x2058, 0x845E},
171da15b409SShawn Tu 	{0x205A, 0x4130},
172da15b409SShawn Tu 	{0x205C, 0x1292},
173da15b409SShawn Tu 	{0x205E, 0xD016},
174da15b409SShawn Tu 	{0x2060, 0xB3D2},
175da15b409SShawn Tu 	{0x2062, 0x0B00},
176da15b409SShawn Tu 	{0x2064, 0x2002},
177da15b409SShawn Tu 	{0x2066, 0xD2E2},
178da15b409SShawn Tu 	{0x2068, 0x0381},
179da15b409SShawn Tu 	{0x206A, 0x93C2},
180da15b409SShawn Tu 	{0x206C, 0x0263},
181da15b409SShawn Tu 	{0x206E, 0x2001},
182da15b409SShawn Tu 	{0x2070, 0x4130},
183da15b409SShawn Tu 	{0x2072, 0x422D},
184da15b409SShawn Tu 	{0x2074, 0x403E},
185da15b409SShawn Tu 	{0x2076, 0x888E},
186da15b409SShawn Tu 	{0x2078, 0x403F},
187da15b409SShawn Tu 	{0x207A, 0x192A},
188da15b409SShawn Tu 	{0x207C, 0x1292},
189da15b409SShawn Tu 	{0x207E, 0x843E},
190da15b409SShawn Tu 	{0x2080, 0x3FF7},
191da15b409SShawn Tu 	{0x2082, 0x422D},
192da15b409SShawn Tu 	{0x2084, 0x403E},
193da15b409SShawn Tu 	{0x2086, 0x192A},
194da15b409SShawn Tu 	{0x2088, 0x403F},
195da15b409SShawn Tu 	{0x208A, 0x888E},
196da15b409SShawn Tu 	{0x208C, 0x1292},
197da15b409SShawn Tu 	{0x208E, 0x843E},
198da15b409SShawn Tu 	{0x2090, 0xB3D2},
199da15b409SShawn Tu 	{0x2092, 0x0267},
200da15b409SShawn Tu 	{0x2094, 0x2403},
201da15b409SShawn Tu 	{0x2096, 0xD0F2},
202da15b409SShawn Tu 	{0x2098, 0x0040},
203da15b409SShawn Tu 	{0x209A, 0x0381},
204da15b409SShawn Tu 	{0x209C, 0x90F2},
205da15b409SShawn Tu 	{0x209E, 0x0010},
206da15b409SShawn Tu 	{0x20A0, 0x0260},
207da15b409SShawn Tu 	{0x20A2, 0x2002},
208da15b409SShawn Tu 	{0x20A4, 0x1292},
209da15b409SShawn Tu 	{0x20A6, 0x84BC},
210da15b409SShawn Tu 	{0x20A8, 0x1292},
211da15b409SShawn Tu 	{0x20AA, 0xD020},
212da15b409SShawn Tu 	{0x20AC, 0x4130},
213da15b409SShawn Tu 	{0x20AE, 0x1292},
214da15b409SShawn Tu 	{0x20B0, 0x8470},
215da15b409SShawn Tu 	{0x20B2, 0x1292},
216da15b409SShawn Tu 	{0x20B4, 0x8452},
217da15b409SShawn Tu 	{0x20B6, 0x0900},
218da15b409SShawn Tu 	{0x20B8, 0x7118},
219da15b409SShawn Tu 	{0x20BA, 0x1292},
220da15b409SShawn Tu 	{0x20BC, 0x848E},
221da15b409SShawn Tu 	{0x20BE, 0x0900},
222da15b409SShawn Tu 	{0x20C0, 0x7112},
223da15b409SShawn Tu 	{0x20C2, 0x0800},
224da15b409SShawn Tu 	{0x20C4, 0x7A20},
225da15b409SShawn Tu 	{0x20C6, 0x4292},
226da15b409SShawn Tu 	{0x20C8, 0x87DE},
227da15b409SShawn Tu 	{0x20CA, 0x7334},
228da15b409SShawn Tu 	{0x20CC, 0x0F00},
229da15b409SShawn Tu 	{0x20CE, 0x7304},
230da15b409SShawn Tu 	{0x20D0, 0x421F},
231da15b409SShawn Tu 	{0x20D2, 0x8718},
232da15b409SShawn Tu 	{0x20D4, 0x1292},
233da15b409SShawn Tu 	{0x20D6, 0x846E},
234da15b409SShawn Tu 	{0x20D8, 0x1292},
235da15b409SShawn Tu 	{0x20DA, 0x8488},
236da15b409SShawn Tu 	{0x20DC, 0x0B00},
237da15b409SShawn Tu 	{0x20DE, 0x7114},
238da15b409SShawn Tu 	{0x20E0, 0x0002},
239da15b409SShawn Tu 	{0x20E2, 0x1292},
240da15b409SShawn Tu 	{0x20E4, 0x848C},
241da15b409SShawn Tu 	{0x20E6, 0x1292},
242da15b409SShawn Tu 	{0x20E8, 0x8454},
243da15b409SShawn Tu 	{0x20EA, 0x43C2},
244da15b409SShawn Tu 	{0x20EC, 0x86EE},
245da15b409SShawn Tu 	{0x20EE, 0x1292},
246da15b409SShawn Tu 	{0x20F0, 0x8444},
247da15b409SShawn Tu 	{0x20F2, 0x4130},
248da15b409SShawn Tu 	{0x20F4, 0x4392},
249da15b409SShawn Tu 	{0x20F6, 0x7360},
250da15b409SShawn Tu 	{0x20F8, 0xB3D2},
251da15b409SShawn Tu 	{0x20FA, 0x0B00},
252da15b409SShawn Tu 	{0x20FC, 0x2402},
253da15b409SShawn Tu 	{0x20FE, 0xC2E2},
254da15b409SShawn Tu 	{0x2100, 0x0381},
255da15b409SShawn Tu 	{0x2102, 0x0900},
256da15b409SShawn Tu 	{0x2104, 0x732C},
257da15b409SShawn Tu 	{0x2106, 0x4382},
258da15b409SShawn Tu 	{0x2108, 0x7360},
259da15b409SShawn Tu 	{0x210A, 0x422D},
260da15b409SShawn Tu 	{0x210C, 0x403E},
261da15b409SShawn Tu 	{0x210E, 0x87F0},
262da15b409SShawn Tu 	{0x2110, 0x403F},
263da15b409SShawn Tu 	{0x2112, 0x87E8},
264da15b409SShawn Tu 	{0x2114, 0x1292},
265da15b409SShawn Tu 	{0x2116, 0x843E},
266da15b409SShawn Tu 	{0x2118, 0x4130},
267da15b409SShawn Tu 	{0x211A, 0x120B},
268da15b409SShawn Tu 	{0x211C, 0x120A},
269da15b409SShawn Tu 	{0x211E, 0x4392},
270da15b409SShawn Tu 	{0x2120, 0x87FA},
271da15b409SShawn Tu 	{0x2122, 0x4392},
272da15b409SShawn Tu 	{0x2124, 0x760E},
273da15b409SShawn Tu 	{0x2126, 0x0900},
274da15b409SShawn Tu 	{0x2128, 0x760C},
275da15b409SShawn Tu 	{0x212A, 0x421B},
276da15b409SShawn Tu 	{0x212C, 0x760A},
277da15b409SShawn Tu 	{0x212E, 0x903B},
278da15b409SShawn Tu 	{0x2130, 0x0201},
279da15b409SShawn Tu 	{0x2132, 0x2408},
280da15b409SShawn Tu 	{0x2134, 0x903B},
281da15b409SShawn Tu 	{0x2136, 0x0102},
282da15b409SShawn Tu 	{0x2138, 0x2405},
283da15b409SShawn Tu 	{0x213A, 0x4292},
284da15b409SShawn Tu 	{0x213C, 0x030A},
285da15b409SShawn Tu 	{0x213E, 0x87F8},
286da15b409SShawn Tu 	{0x2140, 0x1292},
287da15b409SShawn Tu 	{0x2142, 0x849A},
288da15b409SShawn Tu 	{0x2144, 0x903B},
289da15b409SShawn Tu 	{0x2146, 0x0020},
290da15b409SShawn Tu 	{0x2148, 0x2010},
291da15b409SShawn Tu 	{0x214A, 0x403B},
292da15b409SShawn Tu 	{0x214C, 0x8498},
293da15b409SShawn Tu 	{0x214E, 0x422F},
294da15b409SShawn Tu 	{0x2150, 0x12AB},
295da15b409SShawn Tu 	{0x2152, 0x403F},
296da15b409SShawn Tu 	{0x2154, 0x0028},
297da15b409SShawn Tu 	{0x2156, 0x12AB},
298da15b409SShawn Tu 	{0x2158, 0x403B},
299da15b409SShawn Tu 	{0x215A, 0x84C4},
300da15b409SShawn Tu 	{0x215C, 0x407F},
301da15b409SShawn Tu 	{0x215E, 0xFFAA},
302da15b409SShawn Tu 	{0x2160, 0x12AB},
303da15b409SShawn Tu 	{0x2162, 0x407F},
304da15b409SShawn Tu 	{0x2164, 0x0055},
305da15b409SShawn Tu 	{0x2166, 0x12AB},
306da15b409SShawn Tu 	{0x2168, 0x3FDC},
307da15b409SShawn Tu 	{0x216A, 0x903B},
308da15b409SShawn Tu 	{0x216C, 0x0021},
309da15b409SShawn Tu 	{0x216E, 0x2890},
310da15b409SShawn Tu 	{0x2170, 0x903B},
311da15b409SShawn Tu 	{0x2172, 0x0100},
312da15b409SShawn Tu 	{0x2174, 0x200D},
313da15b409SShawn Tu 	{0x2176, 0x403F},
314da15b409SShawn Tu 	{0x2178, 0x0028},
315da15b409SShawn Tu 	{0x217A, 0x1292},
316da15b409SShawn Tu 	{0x217C, 0x8498},
317da15b409SShawn Tu 	{0x217E, 0x425F},
318da15b409SShawn Tu 	{0x2180, 0x0306},
319da15b409SShawn Tu 	{0x2182, 0x1292},
320da15b409SShawn Tu 	{0x2184, 0x84C4},
321da15b409SShawn Tu 	{0x2186, 0x4FC2},
322da15b409SShawn Tu 	{0x2188, 0x0318},
323da15b409SShawn Tu 	{0x218A, 0x0261},
324da15b409SShawn Tu 	{0x218C, 0x0000},
325da15b409SShawn Tu 	{0x218E, 0x3FC9},
326da15b409SShawn Tu 	{0x2190, 0x903B},
327da15b409SShawn Tu 	{0x2192, 0x0101},
328da15b409SShawn Tu 	{0x2194, 0x2858},
329da15b409SShawn Tu 	{0x2196, 0x903B},
330da15b409SShawn Tu 	{0x2198, 0x0200},
331da15b409SShawn Tu 	{0x219A, 0x2450},
332da15b409SShawn Tu 	{0x219C, 0x903B},
333da15b409SShawn Tu 	{0x219E, 0x0201},
334da15b409SShawn Tu 	{0x21A0, 0x2C47},
335da15b409SShawn Tu 	{0x21A2, 0x903B},
336da15b409SShawn Tu 	{0x21A4, 0x0102},
337da15b409SShawn Tu 	{0x21A6, 0x2041},
338da15b409SShawn Tu 	{0x21A8, 0x93E2},
339da15b409SShawn Tu 	{0x21AA, 0x0262},
340da15b409SShawn Tu 	{0x21AC, 0x240A},
341da15b409SShawn Tu 	{0x21AE, 0x425F},
342da15b409SShawn Tu 	{0x21B0, 0x0306},
343da15b409SShawn Tu 	{0x21B2, 0x1292},
344da15b409SShawn Tu 	{0x21B4, 0x84C4},
345da15b409SShawn Tu 	{0x21B6, 0x4F4E},
346da15b409SShawn Tu 	{0x21B8, 0x4EC2},
347da15b409SShawn Tu 	{0x21BA, 0x0318},
348da15b409SShawn Tu 	{0x21BC, 0x0260},
349da15b409SShawn Tu 	{0x21BE, 0x0000},
350da15b409SShawn Tu 	{0x21C0, 0x3FB0},
351da15b409SShawn Tu 	{0x21C2, 0x403A},
352da15b409SShawn Tu 	{0x21C4, 0x8030},
353da15b409SShawn Tu 	{0x21C6, 0x4382},
354da15b409SShawn Tu 	{0x21C8, 0x0326},
355da15b409SShawn Tu 	{0x21CA, 0x4382},
356da15b409SShawn Tu 	{0x21CC, 0x0328},
357da15b409SShawn Tu 	{0x21CE, 0x421B},
358da15b409SShawn Tu 	{0x21D0, 0x030C},
359da15b409SShawn Tu 	{0x21D2, 0x930B},
360da15b409SShawn Tu 	{0x21D4, 0x2420},
361da15b409SShawn Tu 	{0x21D6, 0x4A5F},
362da15b409SShawn Tu 	{0x21D8, 0x0001},
363da15b409SShawn Tu 	{0x21DA, 0x1292},
364da15b409SShawn Tu 	{0x21DC, 0x84C4},
365da15b409SShawn Tu 	{0x21DE, 0x4F4E},
366da15b409SShawn Tu 	{0x21E0, 0x4A5F},
367da15b409SShawn Tu 	{0x21E2, 0x0001},
368da15b409SShawn Tu 	{0x21E4, 0x9F0E},
369da15b409SShawn Tu 	{0x21E6, 0x2402},
370da15b409SShawn Tu 	{0x21E8, 0x5392},
371da15b409SShawn Tu 	{0x21EA, 0x0326},
372da15b409SShawn Tu 	{0x21EC, 0x4ECA},
373da15b409SShawn Tu 	{0x21EE, 0x0001},
374da15b409SShawn Tu 	{0x21F0, 0x533B},
375da15b409SShawn Tu 	{0x21F2, 0x2411},
376da15b409SShawn Tu 	{0x21F4, 0x4A6F},
377da15b409SShawn Tu 	{0x21F6, 0x1292},
378da15b409SShawn Tu 	{0x21F8, 0x84C4},
379da15b409SShawn Tu 	{0x21FA, 0x4F4E},
380da15b409SShawn Tu 	{0x21FC, 0x4A6F},
381da15b409SShawn Tu 	{0x21FE, 0x9F0E},
382da15b409SShawn Tu 	{0x2200, 0x2402},
383da15b409SShawn Tu 	{0x2202, 0x5392},
384da15b409SShawn Tu 	{0x2204, 0x0326},
385da15b409SShawn Tu 	{0x2206, 0x4ECA},
386da15b409SShawn Tu 	{0x2208, 0x0000},
387da15b409SShawn Tu 	{0x220A, 0x533B},
388da15b409SShawn Tu 	{0x220C, 0x532A},
389da15b409SShawn Tu 	{0x220E, 0x0260},
390da15b409SShawn Tu 	{0x2210, 0x0000},
391da15b409SShawn Tu 	{0x2212, 0x930B},
392da15b409SShawn Tu 	{0x2214, 0x23E0},
393da15b409SShawn Tu 	{0x2216, 0x40B2},
394da15b409SShawn Tu 	{0x2218, 0xAA55},
395da15b409SShawn Tu 	{0x221A, 0x0328},
396da15b409SShawn Tu 	{0x221C, 0xB0F2},
397da15b409SShawn Tu 	{0x221E, 0x0040},
398da15b409SShawn Tu 	{0x2220, 0x0381},
399da15b409SShawn Tu 	{0x2222, 0x277F},
400da15b409SShawn Tu 	{0x2224, 0xD3D2},
401da15b409SShawn Tu 	{0x2226, 0x0267},
402da15b409SShawn Tu 	{0x2228, 0x3F7C},
403da15b409SShawn Tu 	{0x222A, 0x0261},
404da15b409SShawn Tu 	{0x222C, 0x0000},
405da15b409SShawn Tu 	{0x222E, 0x3F79},
406da15b409SShawn Tu 	{0x2230, 0x903B},
407da15b409SShawn Tu 	{0x2232, 0x0201},
408da15b409SShawn Tu 	{0x2234, 0x23FA},
409da15b409SShawn Tu 	{0x2236, 0x1292},
410da15b409SShawn Tu 	{0x2238, 0x84C0},
411da15b409SShawn Tu 	{0x223A, 0x3F73},
412da15b409SShawn Tu 	{0x223C, 0x1292},
413da15b409SShawn Tu 	{0x223E, 0x84C0},
414da15b409SShawn Tu 	{0x2240, 0x0261},
415da15b409SShawn Tu 	{0x2242, 0x0000},
416da15b409SShawn Tu 	{0x2244, 0x3F6E},
417da15b409SShawn Tu 	{0x2246, 0x903B},
418da15b409SShawn Tu 	{0x2248, 0x0040},
419da15b409SShawn Tu 	{0x224A, 0x2018},
420da15b409SShawn Tu 	{0x224C, 0x422F},
421da15b409SShawn Tu 	{0x224E, 0x1292},
422da15b409SShawn Tu 	{0x2250, 0x8498},
423da15b409SShawn Tu 	{0x2252, 0x12B0},
424da15b409SShawn Tu 	{0x2254, 0xF0EA},
425da15b409SShawn Tu 	{0x2256, 0x907F},
426da15b409SShawn Tu 	{0x2258, 0xFFAA},
427da15b409SShawn Tu 	{0x225A, 0x240D},
428da15b409SShawn Tu 	{0x225C, 0x5392},
429da15b409SShawn Tu 	{0x225E, 0x0312},
430da15b409SShawn Tu 	{0x2260, 0x12B0},
431da15b409SShawn Tu 	{0x2262, 0xF0EA},
432da15b409SShawn Tu 	{0x2264, 0x907F},
433da15b409SShawn Tu 	{0x2266, 0x0055},
434da15b409SShawn Tu 	{0x2268, 0x2403},
435da15b409SShawn Tu 	{0x226A, 0x5392},
436da15b409SShawn Tu 	{0x226C, 0x0312},
437da15b409SShawn Tu 	{0x226E, 0x3F59},
438da15b409SShawn Tu 	{0x2270, 0x5392},
439da15b409SShawn Tu 	{0x2272, 0x0310},
440da15b409SShawn Tu 	{0x2274, 0x3F56},
441da15b409SShawn Tu 	{0x2276, 0x5392},
442da15b409SShawn Tu 	{0x2278, 0x0310},
443da15b409SShawn Tu 	{0x227A, 0x3FF2},
444da15b409SShawn Tu 	{0x227C, 0x903B},
445da15b409SShawn Tu 	{0x227E, 0x0080},
446da15b409SShawn Tu 	{0x2280, 0x23D4},
447da15b409SShawn Tu 	{0x2282, 0x4382},
448da15b409SShawn Tu 	{0x2284, 0x0312},
449da15b409SShawn Tu 	{0x2286, 0x4382},
450da15b409SShawn Tu 	{0x2288, 0x0310},
451da15b409SShawn Tu 	{0x228A, 0x0261},
452da15b409SShawn Tu 	{0x228C, 0x0000},
453da15b409SShawn Tu 	{0x228E, 0x3F49},
454da15b409SShawn Tu 	{0x2290, 0x932B},
455da15b409SShawn Tu 	{0x2292, 0x2005},
456da15b409SShawn Tu 	{0x2294, 0x403F},
457da15b409SShawn Tu 	{0x2296, 0x0028},
458da15b409SShawn Tu 	{0x2298, 0x1292},
459da15b409SShawn Tu 	{0x229A, 0x8498},
460da15b409SShawn Tu 	{0x229C, 0x3F42},
461da15b409SShawn Tu 	{0x229E, 0x903B},
462da15b409SShawn Tu 	{0x22A0, 0x0003},
463da15b409SShawn Tu 	{0x22A2, 0x284B},
464da15b409SShawn Tu 	{0x22A4, 0x923B},
465da15b409SShawn Tu 	{0x22A6, 0x2015},
466da15b409SShawn Tu 	{0x22A8, 0x403F},
467da15b409SShawn Tu 	{0x22AA, 0x0023},
468da15b409SShawn Tu 	{0x22AC, 0x1292},
469da15b409SShawn Tu 	{0x22AE, 0x8498},
470da15b409SShawn Tu 	{0x22B0, 0x421B},
471da15b409SShawn Tu 	{0x22B2, 0x87F8},
472da15b409SShawn Tu 	{0x22B4, 0x421F},
473da15b409SShawn Tu 	{0x22B6, 0x030C},
474da15b409SShawn Tu 	{0x22B8, 0x9F0B},
475da15b409SShawn Tu 	{0x22BA, 0x2F33},
476da15b409SShawn Tu 	{0x22BC, 0x1292},
477da15b409SShawn Tu 	{0x22BE, 0x84BA},
478da15b409SShawn Tu 	{0x22C0, 0x930F},
479da15b409SShawn Tu 	{0x22C2, 0x2004},
480da15b409SShawn Tu 	{0x22C4, 0x5392},
481da15b409SShawn Tu 	{0x22C6, 0x0312},
482da15b409SShawn Tu 	{0x22C8, 0x531B},
483da15b409SShawn Tu 	{0x22CA, 0x3FF4},
484da15b409SShawn Tu 	{0x22CC, 0x5392},
485da15b409SShawn Tu 	{0x22CE, 0x0310},
486da15b409SShawn Tu 	{0x22D0, 0x3FFB},
487da15b409SShawn Tu 	{0x22D2, 0x903B},
488da15b409SShawn Tu 	{0x22D4, 0x0009},
489da15b409SShawn Tu 	{0x22D6, 0x2818},
490da15b409SShawn Tu 	{0x22D8, 0x903B},
491da15b409SShawn Tu 	{0x22DA, 0x0010},
492da15b409SShawn Tu 	{0x22DC, 0x23A6},
493da15b409SShawn Tu 	{0x22DE, 0x403F},
494da15b409SShawn Tu 	{0x22E0, 0x0027},
495da15b409SShawn Tu 	{0x22E2, 0x1292},
496da15b409SShawn Tu 	{0x22E4, 0x8498},
497da15b409SShawn Tu 	{0x22E6, 0x421B},
498da15b409SShawn Tu 	{0x22E8, 0x87F8},
499da15b409SShawn Tu 	{0x22EA, 0x421F},
500da15b409SShawn Tu 	{0x22EC, 0x030C},
501da15b409SShawn Tu 	{0x22EE, 0x9F0B},
502da15b409SShawn Tu 	{0x22F0, 0x2F18},
503da15b409SShawn Tu 	{0x22F2, 0x1292},
504da15b409SShawn Tu 	{0x22F4, 0x84BA},
505da15b409SShawn Tu 	{0x22F6, 0x930F},
506da15b409SShawn Tu 	{0x22F8, 0x2004},
507da15b409SShawn Tu 	{0x22FA, 0x5392},
508da15b409SShawn Tu 	{0x22FC, 0x0312},
509da15b409SShawn Tu 	{0x22FE, 0x531B},
510da15b409SShawn Tu 	{0x2300, 0x3FF4},
511da15b409SShawn Tu 	{0x2302, 0x5392},
512da15b409SShawn Tu 	{0x2304, 0x0310},
513da15b409SShawn Tu 	{0x2306, 0x3FFB},
514da15b409SShawn Tu 	{0x2308, 0x922B},
515da15b409SShawn Tu 	{0x230A, 0x238F},
516da15b409SShawn Tu 	{0x230C, 0x421B},
517da15b409SShawn Tu 	{0x230E, 0x87F8},
518da15b409SShawn Tu 	{0x2310, 0x421F},
519da15b409SShawn Tu 	{0x2312, 0x030C},
520da15b409SShawn Tu 	{0x2314, 0x9F0B},
521da15b409SShawn Tu 	{0x2316, 0x2C0B},
522da15b409SShawn Tu 	{0x2318, 0x1292},
523da15b409SShawn Tu 	{0x231A, 0x84C2},
524da15b409SShawn Tu 	{0x231C, 0x934F},
525da15b409SShawn Tu 	{0x231E, 0x240A},
526da15b409SShawn Tu 	{0x2320, 0x5392},
527da15b409SShawn Tu 	{0x2322, 0x0312},
528da15b409SShawn Tu 	{0x2324, 0x531B},
529da15b409SShawn Tu 	{0x2326, 0x421F},
530da15b409SShawn Tu 	{0x2328, 0x030C},
531da15b409SShawn Tu 	{0x232A, 0x9F0B},
532da15b409SShawn Tu 	{0x232C, 0x2BF5},
533da15b409SShawn Tu 	{0x232E, 0x0261},
534da15b409SShawn Tu 	{0x2330, 0x0000},
535da15b409SShawn Tu 	{0x2332, 0x3EF7},
536da15b409SShawn Tu 	{0x2334, 0x5392},
537da15b409SShawn Tu 	{0x2336, 0x0310},
538da15b409SShawn Tu 	{0x2338, 0x3FF5},
539da15b409SShawn Tu 	{0x233A, 0x930B},
540da15b409SShawn Tu 	{0x233C, 0x277F},
541da15b409SShawn Tu 	{0x233E, 0x931B},
542da15b409SShawn Tu 	{0x2340, 0x277A},
543da15b409SShawn Tu 	{0x2342, 0x3F73},
544da15b409SShawn Tu 	{0x2344, 0x413A},
545da15b409SShawn Tu 	{0x2346, 0x413B},
546da15b409SShawn Tu 	{0x2348, 0x4130},
547da15b409SShawn Tu 	{0x234A, 0x4F0C},
548da15b409SShawn Tu 	{0x234C, 0x403F},
549da15b409SShawn Tu 	{0x234E, 0x0267},
550da15b409SShawn Tu 	{0x2350, 0xF0FF},
551da15b409SShawn Tu 	{0x2352, 0xFFDF},
552da15b409SShawn Tu 	{0x2354, 0x0000},
553da15b409SShawn Tu 	{0x2356, 0xF0FF},
554da15b409SShawn Tu 	{0x2358, 0xFFEF},
555da15b409SShawn Tu 	{0x235A, 0x0000},
556da15b409SShawn Tu 	{0x235C, 0x421D},
557da15b409SShawn Tu 	{0x235E, 0x84B0},
558da15b409SShawn Tu 	{0x2360, 0x403E},
559da15b409SShawn Tu 	{0x2362, 0x06F9},
560da15b409SShawn Tu 	{0x2364, 0x4C0F},
561da15b409SShawn Tu 	{0x2366, 0x1292},
562da15b409SShawn Tu 	{0x2368, 0x84AC},
563da15b409SShawn Tu 	{0x236A, 0x4F4E},
564da15b409SShawn Tu 	{0x236C, 0xB31E},
565da15b409SShawn Tu 	{0x236E, 0x2403},
566da15b409SShawn Tu 	{0x2370, 0xD0F2},
567da15b409SShawn Tu 	{0x2372, 0x0020},
568da15b409SShawn Tu 	{0x2374, 0x0267},
569da15b409SShawn Tu 	{0x2376, 0xB32E},
570da15b409SShawn Tu 	{0x2378, 0x2403},
571da15b409SShawn Tu 	{0x237A, 0xD0F2},
572da15b409SShawn Tu 	{0x237C, 0x0010},
573da15b409SShawn Tu 	{0x237E, 0x0267},
574da15b409SShawn Tu 	{0x2380, 0xC3E2},
575da15b409SShawn Tu 	{0x2382, 0x0267},
576da15b409SShawn Tu 	{0x2384, 0x4130},
577da15b409SShawn Tu 	{0x2386, 0x120B},
578da15b409SShawn Tu 	{0x2388, 0x120A},
579da15b409SShawn Tu 	{0x238A, 0x403A},
580da15b409SShawn Tu 	{0x238C, 0x1140},
581da15b409SShawn Tu 	{0x238E, 0x1292},
582da15b409SShawn Tu 	{0x2390, 0xD080},
583da15b409SShawn Tu 	{0x2392, 0x430B},
584da15b409SShawn Tu 	{0x2394, 0x4A0F},
585da15b409SShawn Tu 	{0x2396, 0x532A},
586da15b409SShawn Tu 	{0x2398, 0x1292},
587da15b409SShawn Tu 	{0x239A, 0x84A4},
588da15b409SShawn Tu 	{0x239C, 0x4F0E},
589da15b409SShawn Tu 	{0x239E, 0x430F},
590da15b409SShawn Tu 	{0x23A0, 0x5E82},
591da15b409SShawn Tu 	{0x23A2, 0x87FC},
592da15b409SShawn Tu 	{0x23A4, 0x6F82},
593da15b409SShawn Tu 	{0x23A6, 0x87FE},
594da15b409SShawn Tu 	{0x23A8, 0x531B},
595da15b409SShawn Tu 	{0x23AA, 0x923B},
596da15b409SShawn Tu 	{0x23AC, 0x2BF3},
597da15b409SShawn Tu 	{0x23AE, 0x413A},
598da15b409SShawn Tu 	{0x23B0, 0x413B},
599da15b409SShawn Tu 	{0x23B2, 0x4130},
600da15b409SShawn Tu 	{0x23B4, 0xF0F2},
601da15b409SShawn Tu 	{0x23B6, 0x007F},
602da15b409SShawn Tu 	{0x23B8, 0x0267},
603da15b409SShawn Tu 	{0x23BA, 0x421D},
604da15b409SShawn Tu 	{0x23BC, 0x84B6},
605da15b409SShawn Tu 	{0x23BE, 0x403E},
606da15b409SShawn Tu 	{0x23C0, 0x01F9},
607da15b409SShawn Tu 	{0x23C2, 0x1292},
608da15b409SShawn Tu 	{0x23C4, 0x84AC},
609da15b409SShawn Tu 	{0x23C6, 0x4F4E},
610da15b409SShawn Tu 	{0x23C8, 0xF35F},
611da15b409SShawn Tu 	{0x23CA, 0x2403},
612da15b409SShawn Tu 	{0x23CC, 0xD0F2},
613da15b409SShawn Tu 	{0x23CE, 0xFF80},
614da15b409SShawn Tu 	{0x23D0, 0x0267},
615da15b409SShawn Tu 	{0x23D2, 0xB36E},
616da15b409SShawn Tu 	{0x23D4, 0x2404},
617da15b409SShawn Tu 	{0x23D6, 0xD0F2},
618da15b409SShawn Tu 	{0x23D8, 0x0040},
619da15b409SShawn Tu 	{0x23DA, 0x0267},
620da15b409SShawn Tu 	{0x23DC, 0x3C03},
621da15b409SShawn Tu 	{0x23DE, 0xF0F2},
622da15b409SShawn Tu 	{0x23E0, 0xFFBF},
623da15b409SShawn Tu 	{0x23E2, 0x0267},
624da15b409SShawn Tu 	{0x23E4, 0xC2E2},
625da15b409SShawn Tu 	{0x23E6, 0x0267},
626da15b409SShawn Tu 	{0x23E8, 0x4130},
627da15b409SShawn Tu 	{0x23EA, 0x120B},
628da15b409SShawn Tu 	{0x23EC, 0x120A},
629da15b409SShawn Tu 	{0x23EE, 0x8231},
630da15b409SShawn Tu 	{0x23F0, 0x430B},
631da15b409SShawn Tu 	{0x23F2, 0x93C2},
632da15b409SShawn Tu 	{0x23F4, 0x0C0A},
633da15b409SShawn Tu 	{0x23F6, 0x2404},
634da15b409SShawn Tu 	{0x23F8, 0xB3D2},
635da15b409SShawn Tu 	{0x23FA, 0x0B05},
636da15b409SShawn Tu 	{0x23FC, 0x2401},
637da15b409SShawn Tu 	{0x23FE, 0x431B},
638da15b409SShawn Tu 	{0x2400, 0x422D},
639da15b409SShawn Tu 	{0x2402, 0x403E},
640da15b409SShawn Tu 	{0x2404, 0x192A},
641da15b409SShawn Tu 	{0x2406, 0x403F},
642da15b409SShawn Tu 	{0x2408, 0x888E},
643da15b409SShawn Tu 	{0x240A, 0x1292},
644da15b409SShawn Tu 	{0x240C, 0x843E},
645da15b409SShawn Tu 	{0x240E, 0x930B},
646da15b409SShawn Tu 	{0x2410, 0x20F4},
647da15b409SShawn Tu 	{0x2412, 0x93E2},
648da15b409SShawn Tu 	{0x2414, 0x0241},
649da15b409SShawn Tu 	{0x2416, 0x24EB},
650da15b409SShawn Tu 	{0x2418, 0x403A},
651da15b409SShawn Tu 	{0x241A, 0x0292},
652da15b409SShawn Tu 	{0x241C, 0x4AA2},
653da15b409SShawn Tu 	{0x241E, 0x0A00},
654da15b409SShawn Tu 	{0x2420, 0xB2E2},
655da15b409SShawn Tu 	{0x2422, 0x0361},
656da15b409SShawn Tu 	{0x2424, 0x2405},
657da15b409SShawn Tu 	{0x2426, 0x4A2F},
658da15b409SShawn Tu 	{0x2428, 0x1292},
659da15b409SShawn Tu 	{0x242A, 0x8474},
660da15b409SShawn Tu 	{0x242C, 0x4F82},
661da15b409SShawn Tu 	{0x242E, 0x0A1C},
662da15b409SShawn Tu 	{0x2430, 0x93C2},
663da15b409SShawn Tu 	{0x2432, 0x0360},
664da15b409SShawn Tu 	{0x2434, 0x34CD},
665da15b409SShawn Tu 	{0x2436, 0x430C},
666da15b409SShawn Tu 	{0x2438, 0x4C0F},
667da15b409SShawn Tu 	{0x243A, 0x5F0F},
668da15b409SShawn Tu 	{0x243C, 0x4F0D},
669da15b409SShawn Tu 	{0x243E, 0x510D},
670da15b409SShawn Tu 	{0x2440, 0x4F0E},
671da15b409SShawn Tu 	{0x2442, 0x5A0E},
672da15b409SShawn Tu 	{0x2444, 0x4E1E},
673da15b409SShawn Tu 	{0x2446, 0x0002},
674da15b409SShawn Tu 	{0x2448, 0x4F1F},
675da15b409SShawn Tu 	{0x244A, 0x192A},
676da15b409SShawn Tu 	{0x244C, 0x1202},
677da15b409SShawn Tu 	{0x244E, 0xC232},
678da15b409SShawn Tu 	{0x2450, 0x4303},
679da15b409SShawn Tu 	{0x2452, 0x4E82},
680da15b409SShawn Tu 	{0x2454, 0x0130},
681da15b409SShawn Tu 	{0x2456, 0x4F82},
682da15b409SShawn Tu 	{0x2458, 0x0138},
683da15b409SShawn Tu 	{0x245A, 0x421E},
684da15b409SShawn Tu 	{0x245C, 0x013A},
685da15b409SShawn Tu 	{0x245E, 0x421F},
686da15b409SShawn Tu 	{0x2460, 0x013C},
687da15b409SShawn Tu 	{0x2462, 0x4132},
688da15b409SShawn Tu 	{0x2464, 0x108E},
689da15b409SShawn Tu 	{0x2466, 0x108F},
690da15b409SShawn Tu 	{0x2468, 0xEF4E},
691da15b409SShawn Tu 	{0x246A, 0xEF0E},
692da15b409SShawn Tu 	{0x246C, 0xF37F},
693da15b409SShawn Tu 	{0x246E, 0xC312},
694da15b409SShawn Tu 	{0x2470, 0x100F},
695da15b409SShawn Tu 	{0x2472, 0x100E},
696da15b409SShawn Tu 	{0x2474, 0x4E8D},
697da15b409SShawn Tu 	{0x2476, 0x0000},
698da15b409SShawn Tu 	{0x2478, 0x531C},
699da15b409SShawn Tu 	{0x247A, 0x922C},
700da15b409SShawn Tu 	{0x247C, 0x2BDD},
701da15b409SShawn Tu 	{0x247E, 0xB3D2},
702da15b409SShawn Tu 	{0x2480, 0x1921},
703da15b409SShawn Tu 	{0x2482, 0x2403},
704da15b409SShawn Tu 	{0x2484, 0x410F},
705da15b409SShawn Tu 	{0x2486, 0x1292},
706da15b409SShawn Tu 	{0x2488, 0x847E},
707da15b409SShawn Tu 	{0x248A, 0x403B},
708da15b409SShawn Tu 	{0x248C, 0x843E},
709da15b409SShawn Tu 	{0x248E, 0x422D},
710da15b409SShawn Tu 	{0x2490, 0x410E},
711da15b409SShawn Tu 	{0x2492, 0x403F},
712da15b409SShawn Tu 	{0x2494, 0x1908},
713da15b409SShawn Tu 	{0x2496, 0x12AB},
714da15b409SShawn Tu 	{0x2498, 0x403D},
715da15b409SShawn Tu 	{0x249A, 0x0005},
716da15b409SShawn Tu 	{0x249C, 0x403E},
717da15b409SShawn Tu 	{0x249E, 0x0292},
718da15b409SShawn Tu 	{0x24A0, 0x403F},
719da15b409SShawn Tu 	{0x24A2, 0x86E4},
720da15b409SShawn Tu 	{0x24A4, 0x12AB},
721da15b409SShawn Tu 	{0x24A6, 0x421F},
722da15b409SShawn Tu 	{0x24A8, 0x060E},
723da15b409SShawn Tu 	{0x24AA, 0x9F82},
724da15b409SShawn Tu 	{0x24AC, 0x8720},
725da15b409SShawn Tu 	{0x24AE, 0x288D},
726da15b409SShawn Tu 	{0x24B0, 0x9382},
727da15b409SShawn Tu 	{0x24B2, 0x060E},
728da15b409SShawn Tu 	{0x24B4, 0x248A},
729da15b409SShawn Tu 	{0x24B6, 0x90BA},
730da15b409SShawn Tu 	{0x24B8, 0x0010},
731da15b409SShawn Tu 	{0x24BA, 0x0000},
732da15b409SShawn Tu 	{0x24BC, 0x2C0B},
733da15b409SShawn Tu 	{0x24BE, 0x93C2},
734da15b409SShawn Tu 	{0x24C0, 0x86EE},
735da15b409SShawn Tu 	{0x24C2, 0x2008},
736da15b409SShawn Tu 	{0x24C4, 0x403F},
737da15b409SShawn Tu 	{0x24C6, 0x06A7},
738da15b409SShawn Tu 	{0x24C8, 0xD0FF},
739da15b409SShawn Tu 	{0x24CA, 0x0007},
740da15b409SShawn Tu 	{0x24CC, 0x0000},
741da15b409SShawn Tu 	{0x24CE, 0xF0FF},
742da15b409SShawn Tu 	{0x24D0, 0xFFF8},
743da15b409SShawn Tu 	{0x24D2, 0x0000},
744da15b409SShawn Tu 	{0x24D4, 0x4392},
745da15b409SShawn Tu 	{0x24D6, 0x8720},
746da15b409SShawn Tu 	{0x24D8, 0x403F},
747da15b409SShawn Tu 	{0x24DA, 0x06A7},
748da15b409SShawn Tu 	{0x24DC, 0xD2EF},
749da15b409SShawn Tu 	{0x24DE, 0x0000},
750da15b409SShawn Tu 	{0x24E0, 0xC2EF},
751da15b409SShawn Tu 	{0x24E2, 0x0000},
752da15b409SShawn Tu 	{0x24E4, 0x93C2},
753da15b409SShawn Tu 	{0x24E6, 0x87D3},
754da15b409SShawn Tu 	{0x24E8, 0x2068},
755da15b409SShawn Tu 	{0x24EA, 0xB0F2},
756da15b409SShawn Tu 	{0x24EC, 0x0040},
757da15b409SShawn Tu 	{0x24EE, 0x0B05},
758da15b409SShawn Tu 	{0x24F0, 0x2461},
759da15b409SShawn Tu 	{0x24F2, 0xD3D2},
760da15b409SShawn Tu 	{0x24F4, 0x0410},
761da15b409SShawn Tu 	{0x24F6, 0xB3E2},
762da15b409SShawn Tu 	{0x24F8, 0x0381},
763da15b409SShawn Tu 	{0x24FA, 0x2089},
764da15b409SShawn Tu 	{0x24FC, 0x90B2},
765da15b409SShawn Tu 	{0x24FE, 0x0030},
766da15b409SShawn Tu 	{0x2500, 0x0A00},
767da15b409SShawn Tu 	{0x2502, 0x2C52},
768da15b409SShawn Tu 	{0x2504, 0x93C2},
769da15b409SShawn Tu 	{0x2506, 0x86EE},
770da15b409SShawn Tu 	{0x2508, 0x204F},
771da15b409SShawn Tu 	{0x250A, 0x430E},
772da15b409SShawn Tu 	{0x250C, 0x430C},
773da15b409SShawn Tu 	{0x250E, 0x4C0F},
774da15b409SShawn Tu 	{0x2510, 0x5F0F},
775da15b409SShawn Tu 	{0x2512, 0x5F0F},
776da15b409SShawn Tu 	{0x2514, 0x5F0F},
777da15b409SShawn Tu 	{0x2516, 0x4F1F},
778da15b409SShawn Tu 	{0x2518, 0x8668},
779da15b409SShawn Tu 	{0x251A, 0xF03F},
780da15b409SShawn Tu 	{0x251C, 0x07FF},
781da15b409SShawn Tu 	{0x251E, 0x903F},
782da15b409SShawn Tu 	{0x2520, 0x0400},
783da15b409SShawn Tu 	{0x2522, 0x343E},
784da15b409SShawn Tu 	{0x2524, 0x5F0E},
785da15b409SShawn Tu 	{0x2526, 0x531C},
786da15b409SShawn Tu 	{0x2528, 0x923C},
787da15b409SShawn Tu 	{0x252A, 0x2BF1},
788da15b409SShawn Tu 	{0x252C, 0x4E0F},
789da15b409SShawn Tu 	{0x252E, 0x930E},
790da15b409SShawn Tu 	{0x2530, 0x3834},
791da15b409SShawn Tu 	{0x2532, 0x110F},
792da15b409SShawn Tu 	{0x2534, 0x110F},
793da15b409SShawn Tu 	{0x2536, 0x110F},
794da15b409SShawn Tu 	{0x2538, 0x9382},
795da15b409SShawn Tu 	{0x253A, 0x86EE},
796da15b409SShawn Tu 	{0x253C, 0x2023},
797da15b409SShawn Tu 	{0x253E, 0x5F82},
798da15b409SShawn Tu 	{0x2540, 0x87D6},
799da15b409SShawn Tu 	{0x2542, 0x403B},
800da15b409SShawn Tu 	{0x2544, 0x87D6},
801da15b409SShawn Tu 	{0x2546, 0x4B2F},
802da15b409SShawn Tu 	{0x2548, 0x12B0},
803da15b409SShawn Tu 	{0x254A, 0xB624},
804da15b409SShawn Tu 	{0x254C, 0x4F8B},
805da15b409SShawn Tu 	{0x254E, 0x0000},
806da15b409SShawn Tu 	{0x2550, 0x430C},
807da15b409SShawn Tu 	{0x2552, 0x4C0D},
808da15b409SShawn Tu 	{0x2554, 0x5D0D},
809da15b409SShawn Tu 	{0x2556, 0x5D0D},
810da15b409SShawn Tu 	{0x2558, 0x5D0D},
811da15b409SShawn Tu 	{0x255A, 0x403A},
812da15b409SShawn Tu 	{0x255C, 0x87D8},
813da15b409SShawn Tu 	{0x255E, 0x421B},
814da15b409SShawn Tu 	{0x2560, 0x87D6},
815da15b409SShawn Tu 	{0x2562, 0x4B0F},
816da15b409SShawn Tu 	{0x2564, 0x8A2F},
817da15b409SShawn Tu 	{0x2566, 0x4F0E},
818da15b409SShawn Tu 	{0x2568, 0x4E0F},
819da15b409SShawn Tu 	{0x256A, 0x5F0F},
820da15b409SShawn Tu 	{0x256C, 0x7F0F},
821da15b409SShawn Tu 	{0x256E, 0xE33F},
822da15b409SShawn Tu 	{0x2570, 0x8E8D},
823da15b409SShawn Tu 	{0x2572, 0x8668},
824da15b409SShawn Tu 	{0x2574, 0x7F8D},
825da15b409SShawn Tu 	{0x2576, 0x866A},
826da15b409SShawn Tu 	{0x2578, 0x531C},
827da15b409SShawn Tu 	{0x257A, 0x923C},
828da15b409SShawn Tu 	{0x257C, 0x2BEA},
829da15b409SShawn Tu 	{0x257E, 0x4B8A},
830da15b409SShawn Tu 	{0x2580, 0x0000},
831da15b409SShawn Tu 	{0x2582, 0x3C45},
832da15b409SShawn Tu 	{0x2584, 0x9382},
833da15b409SShawn Tu 	{0x2586, 0x86F0},
834da15b409SShawn Tu 	{0x2588, 0x2005},
835da15b409SShawn Tu 	{0x258A, 0x4382},
836da15b409SShawn Tu 	{0x258C, 0x87D6},
837da15b409SShawn Tu 	{0x258E, 0x4382},
838da15b409SShawn Tu 	{0x2590, 0x87D8},
839da15b409SShawn Tu 	{0x2592, 0x3FD7},
840da15b409SShawn Tu 	{0x2594, 0x4F82},
841da15b409SShawn Tu 	{0x2596, 0x87D6},
842da15b409SShawn Tu 	{0x2598, 0x3FD4},
843da15b409SShawn Tu 	{0x259A, 0x503F},
844da15b409SShawn Tu 	{0x259C, 0x0007},
845da15b409SShawn Tu 	{0x259E, 0x3FC9},
846da15b409SShawn Tu 	{0x25A0, 0x5F0E},
847da15b409SShawn Tu 	{0x25A2, 0x503E},
848da15b409SShawn Tu 	{0x25A4, 0xF800},
849da15b409SShawn Tu 	{0x25A6, 0x3FBF},
850da15b409SShawn Tu 	{0x25A8, 0x430F},
851da15b409SShawn Tu 	{0x25AA, 0x12B0},
852da15b409SShawn Tu 	{0x25AC, 0xB624},
853da15b409SShawn Tu 	{0x25AE, 0x4382},
854da15b409SShawn Tu 	{0x25B0, 0x87D6},
855da15b409SShawn Tu 	{0x25B2, 0x3C2D},
856da15b409SShawn Tu 	{0x25B4, 0xC3D2},
857da15b409SShawn Tu 	{0x25B6, 0x0410},
858da15b409SShawn Tu 	{0x25B8, 0x3F9E},
859da15b409SShawn Tu 	{0x25BA, 0x430D},
860da15b409SShawn Tu 	{0x25BC, 0x403E},
861da15b409SShawn Tu 	{0x25BE, 0x0050},
862da15b409SShawn Tu 	{0x25C0, 0x403F},
863da15b409SShawn Tu 	{0x25C2, 0x85C8},
864da15b409SShawn Tu 	{0x25C4, 0x1292},
865da15b409SShawn Tu 	{0x25C6, 0x844E},
866da15b409SShawn Tu 	{0x25C8, 0x3F90},
867da15b409SShawn Tu 	{0x25CA, 0x5392},
868da15b409SShawn Tu 	{0x25CC, 0x8720},
869da15b409SShawn Tu 	{0x25CE, 0x3F84},
870da15b409SShawn Tu 	{0x25D0, 0x403B},
871da15b409SShawn Tu 	{0x25D2, 0x843E},
872da15b409SShawn Tu 	{0x25D4, 0x4A0F},
873da15b409SShawn Tu 	{0x25D6, 0x532F},
874da15b409SShawn Tu 	{0x25D8, 0x422D},
875da15b409SShawn Tu 	{0x25DA, 0x4F0E},
876da15b409SShawn Tu 	{0x25DC, 0x403F},
877da15b409SShawn Tu 	{0x25DE, 0x0E08},
878da15b409SShawn Tu 	{0x25E0, 0x12AB},
879da15b409SShawn Tu 	{0x25E2, 0x422D},
880da15b409SShawn Tu 	{0x25E4, 0x403E},
881da15b409SShawn Tu 	{0x25E6, 0x192A},
882da15b409SShawn Tu 	{0x25E8, 0x410F},
883da15b409SShawn Tu 	{0x25EA, 0x12AB},
884da15b409SShawn Tu 	{0x25EC, 0x3F48},
885da15b409SShawn Tu 	{0x25EE, 0x93C2},
886da15b409SShawn Tu 	{0x25F0, 0x86EE},
887da15b409SShawn Tu 	{0x25F2, 0x2312},
888da15b409SShawn Tu 	{0x25F4, 0x403A},
889da15b409SShawn Tu 	{0x25F6, 0x86E4},
890da15b409SShawn Tu 	{0x25F8, 0x3F11},
891da15b409SShawn Tu 	{0x25FA, 0x403D},
892da15b409SShawn Tu 	{0x25FC, 0x0200},
893da15b409SShawn Tu 	{0x25FE, 0x422E},
894da15b409SShawn Tu 	{0x2600, 0x403F},
895da15b409SShawn Tu 	{0x2602, 0x192A},
896da15b409SShawn Tu 	{0x2604, 0x1292},
897da15b409SShawn Tu 	{0x2606, 0x844E},
898da15b409SShawn Tu 	{0x2608, 0xC3D2},
899da15b409SShawn Tu 	{0x260A, 0x1921},
900da15b409SShawn Tu 	{0x260C, 0x3F02},
901da15b409SShawn Tu 	{0x260E, 0x422D},
902da15b409SShawn Tu 	{0x2610, 0x403E},
903da15b409SShawn Tu 	{0x2612, 0x888E},
904da15b409SShawn Tu 	{0x2614, 0x403F},
905da15b409SShawn Tu 	{0x2616, 0x192A},
906da15b409SShawn Tu 	{0x2618, 0x1292},
907da15b409SShawn Tu 	{0x261A, 0x843E},
908da15b409SShawn Tu 	{0x261C, 0x5231},
909da15b409SShawn Tu 	{0x261E, 0x413A},
910da15b409SShawn Tu 	{0x2620, 0x413B},
911da15b409SShawn Tu 	{0x2622, 0x4130},
912da15b409SShawn Tu 	{0x2624, 0x4382},
913da15b409SShawn Tu 	{0x2626, 0x052C},
914da15b409SShawn Tu 	{0x2628, 0x4F0D},
915da15b409SShawn Tu 	{0x262A, 0x930D},
916da15b409SShawn Tu 	{0x262C, 0x3402},
917da15b409SShawn Tu 	{0x262E, 0xE33D},
918da15b409SShawn Tu 	{0x2630, 0x531D},
919da15b409SShawn Tu 	{0x2632, 0xF03D},
920da15b409SShawn Tu 	{0x2634, 0x07F0},
921da15b409SShawn Tu 	{0x2636, 0x4D0E},
922da15b409SShawn Tu 	{0x2638, 0xC312},
923da15b409SShawn Tu 	{0x263A, 0x100E},
924da15b409SShawn Tu 	{0x263C, 0x110E},
925da15b409SShawn Tu 	{0x263E, 0x110E},
926da15b409SShawn Tu 	{0x2640, 0x110E},
927da15b409SShawn Tu 	{0x2642, 0x930F},
928da15b409SShawn Tu 	{0x2644, 0x3803},
929da15b409SShawn Tu 	{0x2646, 0x4EC2},
930da15b409SShawn Tu 	{0x2648, 0x052C},
931da15b409SShawn Tu 	{0x264A, 0x3C04},
932da15b409SShawn Tu 	{0x264C, 0x4EC2},
933da15b409SShawn Tu 	{0x264E, 0x052D},
934da15b409SShawn Tu 	{0x2650, 0xE33D},
935da15b409SShawn Tu 	{0x2652, 0x531D},
936da15b409SShawn Tu 	{0x2654, 0x4D0F},
937da15b409SShawn Tu 	{0x2656, 0x4130},
938da15b409SShawn Tu 	{0x2658, 0x1292},
939da15b409SShawn Tu 	{0x265A, 0xD048},
940da15b409SShawn Tu 	{0x265C, 0x93C2},
941da15b409SShawn Tu 	{0x265E, 0x86EE},
942da15b409SShawn Tu 	{0x2660, 0x200D},
943da15b409SShawn Tu 	{0x2662, 0xB0F2},
944da15b409SShawn Tu 	{0x2664, 0x0020},
945da15b409SShawn Tu 	{0x2666, 0x0381},
946da15b409SShawn Tu 	{0x2668, 0x2407},
947da15b409SShawn Tu 	{0x266A, 0x9292},
948da15b409SShawn Tu 	{0x266C, 0x8722},
949da15b409SShawn Tu 	{0x266E, 0x0384},
950da15b409SShawn Tu 	{0x2670, 0x2C03},
951da15b409SShawn Tu 	{0x2672, 0xD3D2},
952da15b409SShawn Tu 	{0x2674, 0x0649},
953da15b409SShawn Tu 	{0x2676, 0x4130},
954da15b409SShawn Tu 	{0x2678, 0xC3D2},
955da15b409SShawn Tu 	{0x267A, 0x0649},
956da15b409SShawn Tu 	{0x267C, 0x4130},
957da15b409SShawn Tu 	{0x267E, 0x120B},
958da15b409SShawn Tu 	{0x2680, 0x120A},
959da15b409SShawn Tu 	{0x2682, 0x1209},
960da15b409SShawn Tu 	{0x2684, 0x1208},
961da15b409SShawn Tu 	{0x2686, 0x1207},
962da15b409SShawn Tu 	{0x2688, 0x1206},
963da15b409SShawn Tu 	{0x268A, 0x1205},
964da15b409SShawn Tu 	{0x268C, 0x1204},
965da15b409SShawn Tu 	{0x268E, 0x8231},
966da15b409SShawn Tu 	{0x2690, 0x4F81},
967da15b409SShawn Tu 	{0x2692, 0x0000},
968da15b409SShawn Tu 	{0x2694, 0x4381},
969da15b409SShawn Tu 	{0x2696, 0x0002},
970da15b409SShawn Tu 	{0x2698, 0x4304},
971da15b409SShawn Tu 	{0x269A, 0x411C},
972da15b409SShawn Tu 	{0x269C, 0x0002},
973da15b409SShawn Tu 	{0x269E, 0x5C0C},
974da15b409SShawn Tu 	{0x26A0, 0x4C0F},
975da15b409SShawn Tu 	{0x26A2, 0x5F0F},
976da15b409SShawn Tu 	{0x26A4, 0x5F0F},
977da15b409SShawn Tu 	{0x26A6, 0x5F0F},
978da15b409SShawn Tu 	{0x26A8, 0x5F0F},
979da15b409SShawn Tu 	{0x26AA, 0x5F0F},
980da15b409SShawn Tu 	{0x26AC, 0x503F},
981da15b409SShawn Tu 	{0x26AE, 0x1980},
982da15b409SShawn Tu 	{0x26B0, 0x440D},
983da15b409SShawn Tu 	{0x26B2, 0x5D0D},
984da15b409SShawn Tu 	{0x26B4, 0x4D0E},
985da15b409SShawn Tu 	{0x26B6, 0x5F0E},
986da15b409SShawn Tu 	{0x26B8, 0x4E2E},
987da15b409SShawn Tu 	{0x26BA, 0x4D05},
988da15b409SShawn Tu 	{0x26BC, 0x5505},
989da15b409SShawn Tu 	{0x26BE, 0x5F05},
990da15b409SShawn Tu 	{0x26C0, 0x4516},
991da15b409SShawn Tu 	{0x26C2, 0x0008},
992da15b409SShawn Tu 	{0x26C4, 0x4517},
993da15b409SShawn Tu 	{0x26C6, 0x000A},
994da15b409SShawn Tu 	{0x26C8, 0x460A},
995da15b409SShawn Tu 	{0x26CA, 0x470B},
996da15b409SShawn Tu 	{0x26CC, 0xF30A},
997da15b409SShawn Tu 	{0x26CE, 0xF32B},
998da15b409SShawn Tu 	{0x26D0, 0x4A81},
999da15b409SShawn Tu 	{0x26D2, 0x0004},
1000da15b409SShawn Tu 	{0x26D4, 0x4B81},
1001da15b409SShawn Tu 	{0x26D6, 0x0006},
1002da15b409SShawn Tu 	{0x26D8, 0xB03E},
1003da15b409SShawn Tu 	{0x26DA, 0x2000},
1004da15b409SShawn Tu 	{0x26DC, 0x2404},
1005da15b409SShawn Tu 	{0x26DE, 0xF03E},
1006da15b409SShawn Tu 	{0x26E0, 0x1FFF},
1007da15b409SShawn Tu 	{0x26E2, 0xE33E},
1008da15b409SShawn Tu 	{0x26E4, 0x531E},
1009da15b409SShawn Tu 	{0x26E6, 0xF317},
1010da15b409SShawn Tu 	{0x26E8, 0x503E},
1011da15b409SShawn Tu 	{0x26EA, 0x2000},
1012da15b409SShawn Tu 	{0x26EC, 0x4E0F},
1013da15b409SShawn Tu 	{0x26EE, 0x5F0F},
1014da15b409SShawn Tu 	{0x26F0, 0x7F0F},
1015da15b409SShawn Tu 	{0x26F2, 0xE33F},
1016da15b409SShawn Tu 	{0x26F4, 0x512C},
1017da15b409SShawn Tu 	{0x26F6, 0x4C28},
1018da15b409SShawn Tu 	{0x26F8, 0x4309},
1019da15b409SShawn Tu 	{0x26FA, 0x4E0A},
1020da15b409SShawn Tu 	{0x26FC, 0x4F0B},
1021da15b409SShawn Tu 	{0x26FE, 0x480C},
1022da15b409SShawn Tu 	{0x2700, 0x490D},
1023da15b409SShawn Tu 	{0x2702, 0x1202},
1024da15b409SShawn Tu 	{0x2704, 0xC232},
1025da15b409SShawn Tu 	{0x2706, 0x12B0},
1026da15b409SShawn Tu 	{0x2708, 0xFFC0},
1027da15b409SShawn Tu 	{0x270A, 0x4132},
1028da15b409SShawn Tu 	{0x270C, 0x108E},
1029da15b409SShawn Tu 	{0x270E, 0x108F},
1030da15b409SShawn Tu 	{0x2710, 0xEF4E},
1031da15b409SShawn Tu 	{0x2712, 0xEF0E},
1032da15b409SShawn Tu 	{0x2714, 0xF37F},
1033da15b409SShawn Tu 	{0x2716, 0xC312},
1034da15b409SShawn Tu 	{0x2718, 0x100F},
1035da15b409SShawn Tu 	{0x271A, 0x100E},
1036da15b409SShawn Tu 	{0x271C, 0x4E85},
1037da15b409SShawn Tu 	{0x271E, 0x0018},
1038da15b409SShawn Tu 	{0x2720, 0x4F85},
1039da15b409SShawn Tu 	{0x2722, 0x001A},
1040da15b409SShawn Tu 	{0x2724, 0x480A},
1041da15b409SShawn Tu 	{0x2726, 0x490B},
1042da15b409SShawn Tu 	{0x2728, 0x460C},
1043da15b409SShawn Tu 	{0x272A, 0x470D},
1044da15b409SShawn Tu 	{0x272C, 0x1202},
1045da15b409SShawn Tu 	{0x272E, 0xC232},
1046da15b409SShawn Tu 	{0x2730, 0x12B0},
1047da15b409SShawn Tu 	{0x2732, 0xFFC0},
1048da15b409SShawn Tu 	{0x2734, 0x4132},
1049da15b409SShawn Tu 	{0x2736, 0x4E0C},
1050da15b409SShawn Tu 	{0x2738, 0x4F0D},
1051da15b409SShawn Tu 	{0x273A, 0x108C},
1052da15b409SShawn Tu 	{0x273C, 0x108D},
1053da15b409SShawn Tu 	{0x273E, 0xED4C},
1054da15b409SShawn Tu 	{0x2740, 0xED0C},
1055da15b409SShawn Tu 	{0x2742, 0xF37D},
1056da15b409SShawn Tu 	{0x2744, 0xC312},
1057da15b409SShawn Tu 	{0x2746, 0x100D},
1058da15b409SShawn Tu 	{0x2748, 0x100C},
1059da15b409SShawn Tu 	{0x274A, 0x411E},
1060da15b409SShawn Tu 	{0x274C, 0x0004},
1061da15b409SShawn Tu 	{0x274E, 0x411F},
1062da15b409SShawn Tu 	{0x2750, 0x0006},
1063da15b409SShawn Tu 	{0x2752, 0x5E0E},
1064da15b409SShawn Tu 	{0x2754, 0x6F0F},
1065da15b409SShawn Tu 	{0x2756, 0x5E0E},
1066da15b409SShawn Tu 	{0x2758, 0x6F0F},
1067da15b409SShawn Tu 	{0x275A, 0x5E0E},
1068da15b409SShawn Tu 	{0x275C, 0x6F0F},
1069da15b409SShawn Tu 	{0x275E, 0xDE0C},
1070da15b409SShawn Tu 	{0x2760, 0xDF0D},
1071da15b409SShawn Tu 	{0x2762, 0x4C85},
1072da15b409SShawn Tu 	{0x2764, 0x002C},
1073da15b409SShawn Tu 	{0x2766, 0x4D85},
1074da15b409SShawn Tu 	{0x2768, 0x002E},
1075da15b409SShawn Tu 	{0x276A, 0x5314},
1076da15b409SShawn Tu 	{0x276C, 0x9224},
1077da15b409SShawn Tu 	{0x276E, 0x2B95},
1078da15b409SShawn Tu 	{0x2770, 0x5391},
1079da15b409SShawn Tu 	{0x2772, 0x0002},
1080da15b409SShawn Tu 	{0x2774, 0x92A1},
1081da15b409SShawn Tu 	{0x2776, 0x0002},
1082da15b409SShawn Tu 	{0x2778, 0x2B8F},
1083da15b409SShawn Tu 	{0x277A, 0x5231},
1084da15b409SShawn Tu 	{0x277C, 0x4134},
1085da15b409SShawn Tu 	{0x277E, 0x4135},
1086da15b409SShawn Tu 	{0x2780, 0x4136},
1087da15b409SShawn Tu 	{0x2782, 0x4137},
1088da15b409SShawn Tu 	{0x2784, 0x4138},
1089da15b409SShawn Tu 	{0x2786, 0x4139},
1090da15b409SShawn Tu 	{0x2788, 0x413A},
1091da15b409SShawn Tu 	{0x278A, 0x413B},
1092da15b409SShawn Tu 	{0x278C, 0x4130},
1093da15b409SShawn Tu 	{0x278E, 0x120B},
1094da15b409SShawn Tu 	{0x2790, 0x120A},
1095da15b409SShawn Tu 	{0x2792, 0x1209},
1096da15b409SShawn Tu 	{0x2794, 0x8031},
1097da15b409SShawn Tu 	{0x2796, 0x000C},
1098da15b409SShawn Tu 	{0x2798, 0x425F},
1099da15b409SShawn Tu 	{0x279A, 0x0205},
1100da15b409SShawn Tu 	{0x279C, 0xC312},
1101da15b409SShawn Tu 	{0x279E, 0x104F},
1102da15b409SShawn Tu 	{0x27A0, 0x114F},
1103da15b409SShawn Tu 	{0x27A2, 0x114F},
1104da15b409SShawn Tu 	{0x27A4, 0x114F},
1105da15b409SShawn Tu 	{0x27A6, 0x114F},
1106da15b409SShawn Tu 	{0x27A8, 0x114F},
1107da15b409SShawn Tu 	{0x27AA, 0xF37F},
1108da15b409SShawn Tu 	{0x27AC, 0x4F0B},
1109da15b409SShawn Tu 	{0x27AE, 0xF31B},
1110da15b409SShawn Tu 	{0x27B0, 0x5B0B},
1111da15b409SShawn Tu 	{0x27B2, 0x5B0B},
1112da15b409SShawn Tu 	{0x27B4, 0x5B0B},
1113da15b409SShawn Tu 	{0x27B6, 0x503B},
1114da15b409SShawn Tu 	{0x27B8, 0xD194},
1115da15b409SShawn Tu 	{0x27BA, 0x4219},
1116da15b409SShawn Tu 	{0x27BC, 0x0508},
1117da15b409SShawn Tu 	{0x27BE, 0xF039},
1118da15b409SShawn Tu 	{0x27C0, 0x2000},
1119da15b409SShawn Tu 	{0x27C2, 0x4F0A},
1120da15b409SShawn Tu 	{0x27C4, 0xC312},
1121da15b409SShawn Tu 	{0x27C6, 0x100A},
1122da15b409SShawn Tu 	{0x27C8, 0xE31A},
1123da15b409SShawn Tu 	{0x27CA, 0x421F},
1124da15b409SShawn Tu 	{0x27CC, 0x87DE},
1125da15b409SShawn Tu 	{0x27CE, 0x503F},
1126da15b409SShawn Tu 	{0x27D0, 0xFF60},
1127da15b409SShawn Tu 	{0x27D2, 0x903F},
1128da15b409SShawn Tu 	{0x27D4, 0x00C8},
1129da15b409SShawn Tu 	{0x27D6, 0x2C02},
1130da15b409SShawn Tu 	{0x27D8, 0x403F},
1131da15b409SShawn Tu 	{0x27DA, 0x00C8},
1132da15b409SShawn Tu 	{0x27DC, 0x4F82},
1133da15b409SShawn Tu 	{0x27DE, 0x7322},
1134da15b409SShawn Tu 	{0x27E0, 0xB3D2},
1135da15b409SShawn Tu 	{0x27E2, 0x0381},
1136da15b409SShawn Tu 	{0x27E4, 0x2009},
1137da15b409SShawn Tu 	{0x27E6, 0x421F},
1138da15b409SShawn Tu 	{0x27E8, 0x86F0},
1139da15b409SShawn Tu 	{0x27EA, 0xD21F},
1140da15b409SShawn Tu 	{0x27EC, 0x86EE},
1141da15b409SShawn Tu 	{0x27EE, 0x930F},
1142da15b409SShawn Tu 	{0x27F0, 0x24B9},
1143da15b409SShawn Tu 	{0x27F2, 0x40F2},
1144da15b409SShawn Tu 	{0x27F4, 0xFF80},
1145da15b409SShawn Tu 	{0x27F6, 0x0619},
1146da15b409SShawn Tu 	{0x27F8, 0x1292},
1147da15b409SShawn Tu 	{0x27FA, 0xD00A},
1148da15b409SShawn Tu 	{0x27FC, 0xB3D2},
1149da15b409SShawn Tu 	{0x27FE, 0x0385},
1150da15b409SShawn Tu 	{0x2800, 0x2405},
1151da15b409SShawn Tu 	{0x2802, 0x421F},
1152da15b409SShawn Tu 	{0x2804, 0x880A},
1153da15b409SShawn Tu 	{0x2806, 0x4F92},
1154da15b409SShawn Tu 	{0x2808, 0x0002},
1155da15b409SShawn Tu 	{0x280A, 0x8714},
1156da15b409SShawn Tu 	{0x280C, 0x430D},
1157da15b409SShawn Tu 	{0x280E, 0x93C2},
1158da15b409SShawn Tu 	{0x2810, 0x87D0},
1159da15b409SShawn Tu 	{0x2812, 0x2003},
1160da15b409SShawn Tu 	{0x2814, 0xB2F2},
1161da15b409SShawn Tu 	{0x2816, 0x0360},
1162da15b409SShawn Tu 	{0x2818, 0x2001},
1163da15b409SShawn Tu 	{0x281A, 0x431D},
1164da15b409SShawn Tu 	{0x281C, 0x425F},
1165da15b409SShawn Tu 	{0x281E, 0x87D3},
1166da15b409SShawn Tu 	{0x2820, 0xD25F},
1167da15b409SShawn Tu 	{0x2822, 0x87D2},
1168da15b409SShawn Tu 	{0x2824, 0xF37F},
1169da15b409SShawn Tu 	{0x2826, 0x5F0F},
1170da15b409SShawn Tu 	{0x2828, 0x425E},
1171da15b409SShawn Tu 	{0x282A, 0x87CD},
1172da15b409SShawn Tu 	{0x282C, 0xDE0F},
1173da15b409SShawn Tu 	{0x282E, 0x5F0F},
1174da15b409SShawn Tu 	{0x2830, 0x5B0F},
1175da15b409SShawn Tu 	{0x2832, 0x4FA2},
1176da15b409SShawn Tu 	{0x2834, 0x0402},
1177da15b409SShawn Tu 	{0x2836, 0x930D},
1178da15b409SShawn Tu 	{0x2838, 0x2007},
1179da15b409SShawn Tu 	{0x283A, 0x930A},
1180da15b409SShawn Tu 	{0x283C, 0x248E},
1181da15b409SShawn Tu 	{0x283E, 0x4F5F},
1182da15b409SShawn Tu 	{0x2840, 0x0001},
1183da15b409SShawn Tu 	{0x2842, 0xF37F},
1184da15b409SShawn Tu 	{0x2844, 0x4FC2},
1185da15b409SShawn Tu 	{0x2846, 0x0403},
1186da15b409SShawn Tu 	{0x2848, 0x93C2},
1187da15b409SShawn Tu 	{0x284A, 0x87CD},
1188da15b409SShawn Tu 	{0x284C, 0x2483},
1189da15b409SShawn Tu 	{0x284E, 0xC2F2},
1190da15b409SShawn Tu 	{0x2850, 0x0400},
1191da15b409SShawn Tu 	{0x2852, 0xB2E2},
1192da15b409SShawn Tu 	{0x2854, 0x0265},
1193da15b409SShawn Tu 	{0x2856, 0x2407},
1194da15b409SShawn Tu 	{0x2858, 0x421F},
1195da15b409SShawn Tu 	{0x285A, 0x0508},
1196da15b409SShawn Tu 	{0x285C, 0xF03F},
1197da15b409SShawn Tu 	{0x285E, 0xFFDF},
1198da15b409SShawn Tu 	{0x2860, 0xD90F},
1199da15b409SShawn Tu 	{0x2862, 0x4F82},
1200da15b409SShawn Tu 	{0x2864, 0x0508},
1201da15b409SShawn Tu 	{0x2866, 0xB3D2},
1202da15b409SShawn Tu 	{0x2868, 0x0383},
1203da15b409SShawn Tu 	{0x286A, 0x2484},
1204da15b409SShawn Tu 	{0x286C, 0x403F},
1205da15b409SShawn Tu 	{0x286E, 0x0508},
1206da15b409SShawn Tu 	{0x2870, 0x4FB1},
1207da15b409SShawn Tu 	{0x2872, 0x0000},
1208da15b409SShawn Tu 	{0x2874, 0x4FB1},
1209da15b409SShawn Tu 	{0x2876, 0x0002},
1210da15b409SShawn Tu 	{0x2878, 0x4FB1},
1211da15b409SShawn Tu 	{0x287A, 0x0004},
1212da15b409SShawn Tu 	{0x287C, 0x403F},
1213da15b409SShawn Tu 	{0x287E, 0x0500},
1214da15b409SShawn Tu 	{0x2880, 0x4FB1},
1215da15b409SShawn Tu 	{0x2882, 0x0006},
1216da15b409SShawn Tu 	{0x2884, 0x4FB1},
1217da15b409SShawn Tu 	{0x2886, 0x0008},
1218da15b409SShawn Tu 	{0x2888, 0x4FB1},
1219da15b409SShawn Tu 	{0x288A, 0x000A},
1220da15b409SShawn Tu 	{0x288C, 0xB3E2},
1221da15b409SShawn Tu 	{0x288E, 0x0383},
1222da15b409SShawn Tu 	{0x2890, 0x2412},
1223da15b409SShawn Tu 	{0x2892, 0xC2E1},
1224da15b409SShawn Tu 	{0x2894, 0x0002},
1225da15b409SShawn Tu 	{0x2896, 0xB2E2},
1226da15b409SShawn Tu 	{0x2898, 0x0383},
1227da15b409SShawn Tu 	{0x289A, 0x434F},
1228da15b409SShawn Tu 	{0x289C, 0x634F},
1229da15b409SShawn Tu 	{0x289E, 0xF37F},
1230da15b409SShawn Tu 	{0x28A0, 0x4F4E},
1231da15b409SShawn Tu 	{0x28A2, 0x114E},
1232da15b409SShawn Tu 	{0x28A4, 0x434E},
1233da15b409SShawn Tu 	{0x28A6, 0x104E},
1234da15b409SShawn Tu 	{0x28A8, 0x415F},
1235da15b409SShawn Tu 	{0x28AA, 0x0007},
1236da15b409SShawn Tu 	{0x28AC, 0xF07F},
1237da15b409SShawn Tu 	{0x28AE, 0x007F},
1238da15b409SShawn Tu 	{0x28B0, 0xDE4F},
1239da15b409SShawn Tu 	{0x28B2, 0x4FC1},
1240da15b409SShawn Tu 	{0x28B4, 0x0007},
1241da15b409SShawn Tu 	{0x28B6, 0xB2F2},
1242da15b409SShawn Tu 	{0x28B8, 0x0383},
1243da15b409SShawn Tu 	{0x28BA, 0x2415},
1244da15b409SShawn Tu 	{0x28BC, 0xF0F1},
1245da15b409SShawn Tu 	{0x28BE, 0xFFBF},
1246da15b409SShawn Tu 	{0x28C0, 0x0000},
1247da15b409SShawn Tu 	{0x28C2, 0xB0F2},
1248da15b409SShawn Tu 	{0x28C4, 0x0010},
1249da15b409SShawn Tu 	{0x28C6, 0x0383},
1250da15b409SShawn Tu 	{0x28C8, 0x434E},
1251da15b409SShawn Tu 	{0x28CA, 0x634E},
1252da15b409SShawn Tu 	{0x28CC, 0x5E4E},
1253da15b409SShawn Tu 	{0x28CE, 0x5E4E},
1254da15b409SShawn Tu 	{0x28D0, 0x5E4E},
1255da15b409SShawn Tu 	{0x28D2, 0x5E4E},
1256da15b409SShawn Tu 	{0x28D4, 0x5E4E},
1257da15b409SShawn Tu 	{0x28D6, 0x5E4E},
1258da15b409SShawn Tu 	{0x28D8, 0x415F},
1259da15b409SShawn Tu 	{0x28DA, 0x0006},
1260da15b409SShawn Tu 	{0x28DC, 0xF07F},
1261da15b409SShawn Tu 	{0x28DE, 0xFFBF},
1262da15b409SShawn Tu 	{0x28E0, 0xDE4F},
1263da15b409SShawn Tu 	{0x28E2, 0x4FC1},
1264da15b409SShawn Tu 	{0x28E4, 0x0006},
1265da15b409SShawn Tu 	{0x28E6, 0xB0F2},
1266da15b409SShawn Tu 	{0x28E8, 0x0020},
1267da15b409SShawn Tu 	{0x28EA, 0x0383},
1268da15b409SShawn Tu 	{0x28EC, 0x2410},
1269da15b409SShawn Tu 	{0x28EE, 0xF0F1},
1270da15b409SShawn Tu 	{0x28F0, 0xFFDF},
1271da15b409SShawn Tu 	{0x28F2, 0x0002},
1272da15b409SShawn Tu 	{0x28F4, 0xB0F2},
1273da15b409SShawn Tu 	{0x28F6, 0x0040},
1274da15b409SShawn Tu 	{0x28F8, 0x0383},
1275da15b409SShawn Tu 	{0x28FA, 0x434E},
1276da15b409SShawn Tu 	{0x28FC, 0x634E},
1277da15b409SShawn Tu 	{0x28FE, 0x5E4E},
1278da15b409SShawn Tu 	{0x2900, 0x5E4E},
1279da15b409SShawn Tu 	{0x2902, 0x415F},
1280da15b409SShawn Tu 	{0x2904, 0x0008},
1281da15b409SShawn Tu 	{0x2906, 0xC26F},
1282da15b409SShawn Tu 	{0x2908, 0xDE4F},
1283da15b409SShawn Tu 	{0x290A, 0x4FC1},
1284da15b409SShawn Tu 	{0x290C, 0x0008},
1285da15b409SShawn Tu 	{0x290E, 0x93C2},
1286da15b409SShawn Tu 	{0x2910, 0x0383},
1287da15b409SShawn Tu 	{0x2912, 0x3412},
1288da15b409SShawn Tu 	{0x2914, 0xF0F1},
1289da15b409SShawn Tu 	{0x2916, 0xFFDF},
1290da15b409SShawn Tu 	{0x2918, 0x0000},
1291da15b409SShawn Tu 	{0x291A, 0x425E},
1292da15b409SShawn Tu 	{0x291C, 0x0382},
1293da15b409SShawn Tu 	{0x291E, 0xF35E},
1294da15b409SShawn Tu 	{0x2920, 0x5E4E},
1295da15b409SShawn Tu 	{0x2922, 0x5E4E},
1296da15b409SShawn Tu 	{0x2924, 0x5E4E},
1297da15b409SShawn Tu 	{0x2926, 0x5E4E},
1298da15b409SShawn Tu 	{0x2928, 0x5E4E},
1299da15b409SShawn Tu 	{0x292A, 0x415F},
1300da15b409SShawn Tu 	{0x292C, 0x0006},
1301da15b409SShawn Tu 	{0x292E, 0xF07F},
1302da15b409SShawn Tu 	{0x2930, 0xFFDF},
1303da15b409SShawn Tu 	{0x2932, 0xDE4F},
1304da15b409SShawn Tu 	{0x2934, 0x4FC1},
1305da15b409SShawn Tu 	{0x2936, 0x0006},
1306da15b409SShawn Tu 	{0x2938, 0x410F},
1307da15b409SShawn Tu 	{0x293A, 0x4FB2},
1308da15b409SShawn Tu 	{0x293C, 0x0508},
1309da15b409SShawn Tu 	{0x293E, 0x4FB2},
1310da15b409SShawn Tu 	{0x2940, 0x050A},
1311da15b409SShawn Tu 	{0x2942, 0x4FB2},
1312da15b409SShawn Tu 	{0x2944, 0x050C},
1313da15b409SShawn Tu 	{0x2946, 0x4FB2},
1314da15b409SShawn Tu 	{0x2948, 0x0500},
1315da15b409SShawn Tu 	{0x294A, 0x4FB2},
1316da15b409SShawn Tu 	{0x294C, 0x0502},
1317da15b409SShawn Tu 	{0x294E, 0x4FB2},
1318da15b409SShawn Tu 	{0x2950, 0x0504},
1319da15b409SShawn Tu 	{0x2952, 0x3C10},
1320da15b409SShawn Tu 	{0x2954, 0xD2F2},
1321da15b409SShawn Tu 	{0x2956, 0x0400},
1322da15b409SShawn Tu 	{0x2958, 0x3F7C},
1323da15b409SShawn Tu 	{0x295A, 0x4F6F},
1324da15b409SShawn Tu 	{0x295C, 0xF37F},
1325da15b409SShawn Tu 	{0x295E, 0x4FC2},
1326da15b409SShawn Tu 	{0x2960, 0x0402},
1327da15b409SShawn Tu 	{0x2962, 0x3F72},
1328da15b409SShawn Tu 	{0x2964, 0x90F2},
1329da15b409SShawn Tu 	{0x2966, 0x0011},
1330da15b409SShawn Tu 	{0x2968, 0x0619},
1331da15b409SShawn Tu 	{0x296A, 0x2B46},
1332da15b409SShawn Tu 	{0x296C, 0x50F2},
1333da15b409SShawn Tu 	{0x296E, 0xFFF0},
1334da15b409SShawn Tu 	{0x2970, 0x0619},
1335da15b409SShawn Tu 	{0x2972, 0x3F42},
1336da15b409SShawn Tu 	{0x2974, 0x5031},
1337da15b409SShawn Tu 	{0x2976, 0x000C},
1338da15b409SShawn Tu 	{0x2978, 0x4139},
1339da15b409SShawn Tu 	{0x297A, 0x413A},
1340da15b409SShawn Tu 	{0x297C, 0x413B},
1341da15b409SShawn Tu 	{0x297E, 0x4130},
1342da15b409SShawn Tu 	{0x2980, 0x0900},
1343da15b409SShawn Tu 	{0x2982, 0x7312},
1344da15b409SShawn Tu 	{0x2984, 0x421F},
1345da15b409SShawn Tu 	{0x2986, 0x0A08},
1346da15b409SShawn Tu 	{0x2988, 0xF03F},
1347da15b409SShawn Tu 	{0x298A, 0xF7FF},
1348da15b409SShawn Tu 	{0x298C, 0x4F82},
1349da15b409SShawn Tu 	{0x298E, 0x0A88},
1350da15b409SShawn Tu 	{0x2990, 0x0900},
1351da15b409SShawn Tu 	{0x2992, 0x7312},
1352da15b409SShawn Tu 	{0x2994, 0x421F},
1353da15b409SShawn Tu 	{0x2996, 0x0A0E},
1354da15b409SShawn Tu 	{0x2998, 0xF03F},
1355da15b409SShawn Tu 	{0x299A, 0x7FFF},
1356da15b409SShawn Tu 	{0x299C, 0x4F82},
1357da15b409SShawn Tu 	{0x299E, 0x0A8E},
1358da15b409SShawn Tu 	{0x29A0, 0x0900},
1359da15b409SShawn Tu 	{0x29A2, 0x7312},
1360da15b409SShawn Tu 	{0x29A4, 0x421F},
1361da15b409SShawn Tu 	{0x29A6, 0x0A1E},
1362da15b409SShawn Tu 	{0x29A8, 0xC31F},
1363da15b409SShawn Tu 	{0x29AA, 0x4F82},
1364da15b409SShawn Tu 	{0x29AC, 0x0A9E},
1365da15b409SShawn Tu 	{0x29AE, 0x4130},
1366da15b409SShawn Tu 	{0x29B0, 0x4292},
1367da15b409SShawn Tu 	{0x29B2, 0x0A08},
1368da15b409SShawn Tu 	{0x29B4, 0x0A88},
1369da15b409SShawn Tu 	{0x29B6, 0x0900},
1370da15b409SShawn Tu 	{0x29B8, 0x7312},
1371da15b409SShawn Tu 	{0x29BA, 0x4292},
1372da15b409SShawn Tu 	{0x29BC, 0x0A0E},
1373da15b409SShawn Tu 	{0x29BE, 0x0A8E},
1374da15b409SShawn Tu 	{0x29C0, 0x0900},
1375da15b409SShawn Tu 	{0x29C2, 0x7312},
1376da15b409SShawn Tu 	{0x29C4, 0x4292},
1377da15b409SShawn Tu 	{0x29C6, 0x0A1E},
1378da15b409SShawn Tu 	{0x29C8, 0x0A9E},
1379da15b409SShawn Tu 	{0x29CA, 0x4130},
1380da15b409SShawn Tu 	{0x29CC, 0x7400},
1381da15b409SShawn Tu 	{0x29CE, 0x8058},
1382da15b409SShawn Tu 	{0x29D0, 0x1807},
1383da15b409SShawn Tu 	{0x29D2, 0x00E0},
1384da15b409SShawn Tu 	{0x29D4, 0x7002},
1385da15b409SShawn Tu 	{0x29D6, 0x17C7},
1386da15b409SShawn Tu 	{0x29D8, 0x0045},
1387da15b409SShawn Tu 	{0x29DA, 0x0006},
1388da15b409SShawn Tu 	{0x29DC, 0x17CC},
1389da15b409SShawn Tu 	{0x29DE, 0x0015},
1390da15b409SShawn Tu 	{0x29E0, 0x1512},
1391da15b409SShawn Tu 	{0x29E2, 0x216F},
1392da15b409SShawn Tu 	{0x29E4, 0x005B},
1393da15b409SShawn Tu 	{0x29E6, 0x005D},
1394da15b409SShawn Tu 	{0x29E8, 0x00DE},
1395da15b409SShawn Tu 	{0x29EA, 0x00DD},
1396da15b409SShawn Tu 	{0x29EC, 0x5023},
1397da15b409SShawn Tu 	{0x29EE, 0x00DE},
1398da15b409SShawn Tu 	{0x29F0, 0x005B},
1399da15b409SShawn Tu 	{0x29F2, 0x0410},
1400da15b409SShawn Tu 	{0x29F4, 0x0091},
1401da15b409SShawn Tu 	{0x29F6, 0x0015},
1402da15b409SShawn Tu 	{0x29F8, 0x0040},
1403da15b409SShawn Tu 	{0x29FA, 0x7023},
1404da15b409SShawn Tu 	{0x29FC, 0x1653},
1405da15b409SShawn Tu 	{0x29FE, 0x0156},
1406da15b409SShawn Tu 	{0x2A00, 0x0001},
1407da15b409SShawn Tu 	{0x2A02, 0x2081},
1408da15b409SShawn Tu 	{0x2A04, 0x7020},
1409da15b409SShawn Tu 	{0x2A06, 0x2F99},
1410da15b409SShawn Tu 	{0x2A08, 0x005C},
1411da15b409SShawn Tu 	{0x2A0A, 0x0000},
1412da15b409SShawn Tu 	{0x2A0C, 0x5040},
1413da15b409SShawn Tu 	{0x2A0E, 0x0045},
1414da15b409SShawn Tu 	{0x2A10, 0x213A},
1415da15b409SShawn Tu 	{0x2A12, 0x0303},
1416da15b409SShawn Tu 	{0x2A14, 0x0148},
1417da15b409SShawn Tu 	{0x2A16, 0x0049},
1418da15b409SShawn Tu 	{0x2A18, 0x0045},
1419da15b409SShawn Tu 	{0x2A1A, 0x0046},
1420da15b409SShawn Tu 	{0x2A1C, 0x05DD},
1421da15b409SShawn Tu 	{0x2A1E, 0x00DE},
1422da15b409SShawn Tu 	{0x2A20, 0x00DD},
1423da15b409SShawn Tu 	{0x2A22, 0x00DC},
1424da15b409SShawn Tu 	{0x2A24, 0x00DE},
1425da15b409SShawn Tu 	{0x2A26, 0x04D6},
1426da15b409SShawn Tu 	{0x2A28, 0x2014},
1427da15b409SShawn Tu 	{0x2A2A, 0x2081},
1428da15b409SShawn Tu 	{0x2A2C, 0x7087},
1429da15b409SShawn Tu 	{0x2A2E, 0x2F99},
1430da15b409SShawn Tu 	{0x2A30, 0x005C},
1431da15b409SShawn Tu 	{0x2A32, 0x0002},
1432da15b409SShawn Tu 	{0x2A34, 0x5060},
1433da15b409SShawn Tu 	{0x2A36, 0x31C0},
1434da15b409SShawn Tu 	{0x2A38, 0x2122},
1435da15b409SShawn Tu 	{0x2A3A, 0x7800},
1436da15b409SShawn Tu 	{0x2A3C, 0xC08C},
1437da15b409SShawn Tu 	{0x2A3E, 0x0001},
1438da15b409SShawn Tu 	{0x2A40, 0x9038},
1439da15b409SShawn Tu 	{0x2A42, 0x59F7},
1440da15b409SShawn Tu 	{0x2A44, 0x907A},
1441da15b409SShawn Tu 	{0x2A46, 0x03D8},
1442da15b409SShawn Tu 	{0x2A48, 0x8D90},
1443da15b409SShawn Tu 	{0x2A4A, 0x01C0},
1444da15b409SShawn Tu 	{0x2A4C, 0x7400},
1445da15b409SShawn Tu 	{0x2A4E, 0x8058},
1446da15b409SShawn Tu 	{0x2A50, 0x1807},
1447da15b409SShawn Tu 	{0x2A52, 0x00E0},
1448da15b409SShawn Tu 	{0x2A54, 0x7002},
1449da15b409SShawn Tu 	{0x2A56, 0x17C7},
1450da15b409SShawn Tu 	{0x2A58, 0x0045},
1451da15b409SShawn Tu 	{0x2A5A, 0x0006},
1452da15b409SShawn Tu 	{0x2A5C, 0x17CC},
1453da15b409SShawn Tu 	{0x2A5E, 0x0015},
1454da15b409SShawn Tu 	{0x2A60, 0x1512},
1455da15b409SShawn Tu 	{0x2A62, 0x216F},
1456da15b409SShawn Tu 	{0x2A64, 0x005B},
1457da15b409SShawn Tu 	{0x2A66, 0x005D},
1458da15b409SShawn Tu 	{0x2A68, 0x00DE},
1459da15b409SShawn Tu 	{0x2A6A, 0x00DD},
1460da15b409SShawn Tu 	{0x2A6C, 0x5023},
1461da15b409SShawn Tu 	{0x2A6E, 0x00DE},
1462da15b409SShawn Tu 	{0x2A70, 0x005B},
1463da15b409SShawn Tu 	{0x2A72, 0x0410},
1464da15b409SShawn Tu 	{0x2A74, 0x0091},
1465da15b409SShawn Tu 	{0x2A76, 0x0015},
1466da15b409SShawn Tu 	{0x2A78, 0x0040},
1467da15b409SShawn Tu 	{0x2A7A, 0x7023},
1468da15b409SShawn Tu 	{0x2A7C, 0x1653},
1469da15b409SShawn Tu 	{0x2A7E, 0x0156},
1470da15b409SShawn Tu 	{0x2A80, 0x0001},
1471da15b409SShawn Tu 	{0x2A82, 0x2081},
1472da15b409SShawn Tu 	{0x2A84, 0x7020},
1473da15b409SShawn Tu 	{0x2A86, 0x2F99},
1474da15b409SShawn Tu 	{0x2A88, 0x005C},
1475da15b409SShawn Tu 	{0x2A8A, 0x0000},
1476da15b409SShawn Tu 	{0x2A8C, 0x5040},
1477da15b409SShawn Tu 	{0x2A8E, 0x0045},
1478da15b409SShawn Tu 	{0x2A90, 0x213A},
1479da15b409SShawn Tu 	{0x2A92, 0x0303},
1480da15b409SShawn Tu 	{0x2A94, 0x0148},
1481da15b409SShawn Tu 	{0x2A96, 0x0049},
1482da15b409SShawn Tu 	{0x2A98, 0x0045},
1483da15b409SShawn Tu 	{0x2A9A, 0x0046},
1484da15b409SShawn Tu 	{0x2A9C, 0x05DD},
1485da15b409SShawn Tu 	{0x2A9E, 0x00DE},
1486da15b409SShawn Tu 	{0x2AA0, 0x00DD},
1487da15b409SShawn Tu 	{0x2AA2, 0x00DC},
1488da15b409SShawn Tu 	{0x2AA4, 0x00DE},
1489da15b409SShawn Tu 	{0x2AA6, 0x0296},
1490da15b409SShawn Tu 	{0x2AA8, 0x2014},
1491da15b409SShawn Tu 	{0x2AAA, 0x2081},
1492da15b409SShawn Tu 	{0x2AAC, 0x7087},
1493da15b409SShawn Tu 	{0x2AAE, 0x2F99},
1494da15b409SShawn Tu 	{0x2AB0, 0x005C},
1495da15b409SShawn Tu 	{0x2AB2, 0x0002},
1496da15b409SShawn Tu 	{0x2AB4, 0x5060},
1497da15b409SShawn Tu 	{0x2AB6, 0x31C0},
1498da15b409SShawn Tu 	{0x2AB8, 0x2122},
1499da15b409SShawn Tu 	{0x2ABA, 0x7800},
1500da15b409SShawn Tu 	{0x2ABC, 0xC08C},
1501da15b409SShawn Tu 	{0x2ABE, 0x0001},
1502da15b409SShawn Tu 	{0x2AC0, 0x9038},
1503da15b409SShawn Tu 	{0x2AC2, 0x59F7},
1504da15b409SShawn Tu 	{0x2AC4, 0x907A},
1505da15b409SShawn Tu 	{0x2AC6, 0x03D8},
1506da15b409SShawn Tu 	{0x2AC8, 0x8D90},
1507da15b409SShawn Tu 	{0x2ACA, 0x01C0},
1508da15b409SShawn Tu 	{0x2ACC, 0x7400},
1509da15b409SShawn Tu 	{0x2ACE, 0x2002},
1510da15b409SShawn Tu 	{0x2AD0, 0x70DF},
1511da15b409SShawn Tu 	{0x2AD2, 0x2F21},
1512da15b409SShawn Tu 	{0x2AD4, 0x04C1},
1513da15b409SShawn Tu 	{0x2AD6, 0x0D80},
1514da15b409SShawn Tu 	{0x2AD8, 0x7800},
1515da15b409SShawn Tu 	{0x2ADA, 0x0041},
1516da15b409SShawn Tu 	{0x2ADC, 0x7400},
1517da15b409SShawn Tu 	{0x2ADE, 0x2004},
1518da15b409SShawn Tu 	{0x2AE0, 0x70DF},
1519da15b409SShawn Tu 	{0x2AE2, 0x2F21},
1520da15b409SShawn Tu 	{0x2AE4, 0x04C2},
1521da15b409SShawn Tu 	{0x2AE6, 0x0D80},
1522da15b409SShawn Tu 	{0x2AE8, 0x7800},
1523da15b409SShawn Tu 	{0x2AEA, 0x7400},
1524da15b409SShawn Tu 	{0x2AEC, 0x2008},
1525da15b409SShawn Tu 	{0x2AEE, 0x70DF},
1526da15b409SShawn Tu 	{0x2AF0, 0x2F21},
1527da15b409SShawn Tu 	{0x2AF2, 0x04C3},
1528da15b409SShawn Tu 	{0x2AF4, 0x0D80},
1529da15b409SShawn Tu 	{0x2AF6, 0x7800},
1530da15b409SShawn Tu 	{0x2AF8, 0x7400},
1531da15b409SShawn Tu 	{0x2AFA, 0x0004},
1532da15b409SShawn Tu 	{0x2AFC, 0x70DF},
1533da15b409SShawn Tu 	{0x2AFE, 0x2F22},
1534da15b409SShawn Tu 	{0x2B00, 0x7008},
1535da15b409SShawn Tu 	{0x2B02, 0x2F1F},
1536da15b409SShawn Tu 	{0x2B04, 0x7021},
1537da15b409SShawn Tu 	{0x2B06, 0x2F01},
1538da15b409SShawn Tu 	{0x2B08, 0x7800},
1539da15b409SShawn Tu 	{0x2B0A, 0x7400},
1540da15b409SShawn Tu 	{0x2B0C, 0x0002},
1541da15b409SShawn Tu 	{0x2B0E, 0x70DF},
1542da15b409SShawn Tu 	{0x2B10, 0x3F5F},
1543da15b409SShawn Tu 	{0x2B12, 0x703A},
1544da15b409SShawn Tu 	{0x2B14, 0x2F01},
1545da15b409SShawn Tu 	{0x2B16, 0x7800},
1546da15b409SShawn Tu 	{0x2B18, 0x7400},
1547da15b409SShawn Tu 	{0x2B1A, 0x2010},
1548da15b409SShawn Tu 	{0x2B1C, 0x70DF},
1549da15b409SShawn Tu 	{0x2B1E, 0x3F40},
1550da15b409SShawn Tu 	{0x2B20, 0x700A},
1551da15b409SShawn Tu 	{0x2B22, 0x0FC0},
1552da15b409SShawn Tu 	{0x2B24, 0x7800},
1553da15b409SShawn Tu 	{0x2B26, 0x7400},
1554da15b409SShawn Tu 	{0x2B28, 0x2004},
1555da15b409SShawn Tu 	{0x2B2A, 0x70DF},
1556da15b409SShawn Tu 	{0x2B2C, 0x2F21},
1557da15b409SShawn Tu 	{0x2B2E, 0x04C2},
1558da15b409SShawn Tu 	{0x2B30, 0x0D80},
1559da15b409SShawn Tu 	{0x2B32, 0x7800},
1560da15b409SShawn Tu 	{0x2B34, 0x0041},
1561da15b409SShawn Tu 	{0x2B36, 0x7400},
1562da15b409SShawn Tu 	{0x2B38, 0x2002},
1563da15b409SShawn Tu 	{0x2B3A, 0x70DF},
1564da15b409SShawn Tu 	{0x2B3C, 0x2F22},
1565da15b409SShawn Tu 	{0x2B3E, 0x04C1},
1566da15b409SShawn Tu 	{0x2B40, 0x0D80},
1567da15b409SShawn Tu 	{0x2B42, 0x7800},
1568da15b409SShawn Tu 	{0x2B44, 0x7400},
1569da15b409SShawn Tu 	{0x2B46, 0x0001},
1570da15b409SShawn Tu 	{0x2B48, 0x70DF},
1571da15b409SShawn Tu 	{0x2B4A, 0x3F5F},
1572da15b409SShawn Tu 	{0x2B4C, 0x703A},
1573da15b409SShawn Tu 	{0x2B4E, 0x2F01},
1574da15b409SShawn Tu 	{0x2B50, 0x7800},
1575da15b409SShawn Tu 	{0x2B52, 0x7400},
1576da15b409SShawn Tu 	{0x2B54, 0x200A},
1577da15b409SShawn Tu 	{0x2B56, 0x70DF},
1578da15b409SShawn Tu 	{0x2B58, 0x3F40},
1579da15b409SShawn Tu 	{0x2B5A, 0x700A},
1580da15b409SShawn Tu 	{0x2B5C, 0x0FC0},
1581da15b409SShawn Tu 	{0x2B5E, 0x7800},
1582da15b409SShawn Tu 	{0x2B60, 0x7400},
1583da15b409SShawn Tu 	{0x2B62, 0x2015},
1584da15b409SShawn Tu 	{0x2B64, 0x70DF},
1585da15b409SShawn Tu 	{0x2B66, 0x3F5F},
1586da15b409SShawn Tu 	{0x2B68, 0x703A},
1587da15b409SShawn Tu 	{0x2B6A, 0x2F01},
1588da15b409SShawn Tu 	{0x2B6C, 0x7800},
1589da15b409SShawn Tu 	{0x2B6E, 0x7400},
1590da15b409SShawn Tu 	{0x2B70, 0x7800},
1591da15b409SShawn Tu 	{0x2B72, 0x007F},
1592da15b409SShawn Tu 	{0x2B74, 0x0000},
1593da15b409SShawn Tu 	{0x2B76, 0xB9CC},
1594da15b409SShawn Tu 	{0x2B78, 0x0000},
1595da15b409SShawn Tu 	{0x2B7A, 0xB9CC},
1596da15b409SShawn Tu 	{0x2B7C, 0xBA3C},
1597da15b409SShawn Tu 	{0x2B7E, 0x0002},
1598da15b409SShawn Tu 	{0x2B80, 0x0000},
1599da15b409SShawn Tu 	{0x2B82, 0xBA4C},
1600da15b409SShawn Tu 	{0x2B84, 0x0000},
1601da15b409SShawn Tu 	{0x2B86, 0xBA4C},
1602da15b409SShawn Tu 	{0x2B88, 0xBABC},
1603da15b409SShawn Tu 	{0x2B8A, 0x0002},
1604da15b409SShawn Tu 	{0x2B8C, 0x0063},
1605da15b409SShawn Tu 	{0x2B8E, 0xBB26},
1606da15b409SShawn Tu 	{0x2B90, 0x0063},
1607da15b409SShawn Tu 	{0x2B92, 0xBB36},
1608da15b409SShawn Tu 	{0x2B94, 0x0063},
1609da15b409SShawn Tu 	{0x2B96, 0xBAEA},
1610da15b409SShawn Tu 	{0x2B98, 0x0063},
1611da15b409SShawn Tu 	{0x2B9A, 0xBAF8},
1612da15b409SShawn Tu 	{0x2B9C, 0xBADA},
1613da15b409SShawn Tu 	{0x2B9E, 0x0004},
1614da15b409SShawn Tu 	{0x2BA0, 0x0063},
1615da15b409SShawn Tu 	{0x2BA2, 0xBAEA},
1616da15b409SShawn Tu 	{0x2BA4, 0x0063},
1617da15b409SShawn Tu 	{0x2BA6, 0xBB18},
1618da15b409SShawn Tu 	{0x2BA8, 0x0063},
1619da15b409SShawn Tu 	{0x2BAA, 0xBB26},
1620da15b409SShawn Tu 	{0x2BAC, 0x0063},
1621da15b409SShawn Tu 	{0x2BAE, 0xBB44},
1622da15b409SShawn Tu 	{0x2BB0, 0xBADA},
1623da15b409SShawn Tu 	{0x2BB2, 0x0004},
1624da15b409SShawn Tu 	{0x2BB4, 0x0063},
1625da15b409SShawn Tu 	{0x2BB6, 0xBACC},
1626da15b409SShawn Tu 	{0x2BB8, 0x0063},
1627da15b409SShawn Tu 	{0x2BBA, 0xBADC},
1628da15b409SShawn Tu 	{0x2BBC, 0x0063},
1629da15b409SShawn Tu 	{0x2BBE, 0xBAEA},
1630da15b409SShawn Tu 	{0x2BC0, 0x0063},
1631da15b409SShawn Tu 	{0x2BC2, 0xBAF8},
1632da15b409SShawn Tu 	{0x2BC4, 0xBADA},
1633da15b409SShawn Tu 	{0x2BC6, 0x0004},
1634da15b409SShawn Tu 	{0x2BC8, 0x0063},
1635da15b409SShawn Tu 	{0x2BCA, 0xBAEA},
1636da15b409SShawn Tu 	{0x2BCC, 0x0063},
1637da15b409SShawn Tu 	{0x2BCE, 0xBB18},
1638da15b409SShawn Tu 	{0x2BD0, 0x0063},
1639da15b409SShawn Tu 	{0x2BD2, 0xBACC},
1640da15b409SShawn Tu 	{0x2BD4, 0x0063},
1641da15b409SShawn Tu 	{0x2BD6, 0xBB0A},
1642da15b409SShawn Tu 	{0x2BD8, 0xBADA},
1643da15b409SShawn Tu 	{0x2BDA, 0x0004},
1644da15b409SShawn Tu 	{0x2BDC, 0x0063},
1645da15b409SShawn Tu 	{0x2BDE, 0xBACC},
1646da15b409SShawn Tu 	{0x2BE0, 0x0063},
1647da15b409SShawn Tu 	{0x2BE2, 0xBADC},
1648da15b409SShawn Tu 	{0x2BE4, 0x0063},
1649da15b409SShawn Tu 	{0x2BE6, 0xBAEA},
1650da15b409SShawn Tu 	{0x2BE8, 0x0063},
1651da15b409SShawn Tu 	{0x2BEA, 0xBB18},
1652da15b409SShawn Tu 	{0x2BEC, 0xBADA},
1653da15b409SShawn Tu 	{0x2BEE, 0x0004},
1654da15b409SShawn Tu 	{0x2BF0, 0xFFFF},
1655da15b409SShawn Tu 	{0x2BF2, 0xBB6E},
1656da15b409SShawn Tu 	{0x2BF4, 0x0000},
1657da15b409SShawn Tu 	{0x2BF6, 0x0000},
1658da15b409SShawn Tu 	{0x2BF8, 0x0000},
1659da15b409SShawn Tu 	{0x2BFA, 0x0000},
1660da15b409SShawn Tu 	{0x2BFC, 0x0000},
1661da15b409SShawn Tu 	{0x2BFE, 0x0000},
1662da15b409SShawn Tu 	{0x2C00, 0xBB72},
1663da15b409SShawn Tu 	{0x2C02, 0x0001},
1664da15b409SShawn Tu 	{0x2C04, 0x0063},
1665da15b409SShawn Tu 	{0x2C06, 0xBB52},
1666da15b409SShawn Tu 	{0x2C08, 0x0063},
1667da15b409SShawn Tu 	{0x2C0A, 0xBB60},
1668da15b409SShawn Tu 	{0x2C0C, 0x0000},
1669da15b409SShawn Tu 	{0x2C0E, 0x0000},
1670da15b409SShawn Tu 	{0x2C10, 0x0000},
1671da15b409SShawn Tu 	{0x2C12, 0x0000},
1672da15b409SShawn Tu 	{0x2C14, 0xBADA},
1673da15b409SShawn Tu 	{0x2C16, 0x0002},
1674da15b409SShawn Tu 	{0x2C18, 0x0066},
1675da15b409SShawn Tu 	{0x2C1A, 0x0067},
1676da15b409SShawn Tu 	{0x2C1C, 0x00AF},
1677da15b409SShawn Tu 	{0x2C1E, 0x01CF},
1678da15b409SShawn Tu 	{0x2C20, 0x0087},
1679da15b409SShawn Tu 	{0x2C22, 0x0083},
1680da15b409SShawn Tu 	{0x2C24, 0x011B},
1681da15b409SShawn Tu 	{0x2C26, 0x035A},
1682da15b409SShawn Tu 	{0x2C28, 0x00FA},
1683da15b409SShawn Tu 	{0x2C2A, 0x00F2},
1684da15b409SShawn Tu 	{0x2C2C, 0x00A6},
1685da15b409SShawn Tu 	{0x2C2E, 0x00A4},
1686da15b409SShawn Tu 	{0x2C30, 0xFFFF},
1687da15b409SShawn Tu 	{0x2C32, 0x002C},
1688da15b409SShawn Tu 	{0x2C34, 0x0058},
1689da15b409SShawn Tu 	{0x2C36, 0x0000},
1690da15b409SShawn Tu 	{0x2C38, 0x0000},
1691da15b409SShawn Tu 	{0x2C3A, 0xBC18},
1692da15b409SShawn Tu 	{0x2C3C, 0xBB74},
1693da15b409SShawn Tu 	{0x2C3E, 0xBB80},
1694da15b409SShawn Tu 	{0x2C40, 0xBC32},
1695da15b409SShawn Tu 	{0x2C42, 0xBB8C},
1696da15b409SShawn Tu 	{0x2C44, 0xBBA0},
1697da15b409SShawn Tu 	{0x2C46, 0xBB8C},
1698da15b409SShawn Tu 	{0x2C48, 0xBBA0},
1699da15b409SShawn Tu 	{0x2C4A, 0xBC04},
1700da15b409SShawn Tu 	{0x2C4C, 0xBC04},
1701da15b409SShawn Tu 	{0x2C4E, 0xBBF0},
1702da15b409SShawn Tu 	{0x2C50, 0xBBF0},
1703da15b409SShawn Tu 	{0x2C52, 0xBBB4},
1704da15b409SShawn Tu 	{0x2C54, 0xBBC8},
1705da15b409SShawn Tu 	{0x2C56, 0xBBB4},
1706da15b409SShawn Tu 	{0x2C58, 0xBBC8},
1707da15b409SShawn Tu 	{0x2C5A, 0xBC04},
1708da15b409SShawn Tu 	{0x2C5C, 0xBC04},
1709da15b409SShawn Tu 	{0x2C5E, 0xBBF0},
1710da15b409SShawn Tu 	{0x2C60, 0xBBF0},
1711da15b409SShawn Tu 	{0x2C62, 0xBB8C},
1712da15b409SShawn Tu 	{0x2C64, 0xBBA0},
1713da15b409SShawn Tu 	{0x2C66, 0xBB8C},
1714da15b409SShawn Tu 	{0x2C68, 0xBBA0},
1715da15b409SShawn Tu 	{0x2C6A, 0xBC04},
1716da15b409SShawn Tu 	{0x2C6C, 0xBC04},
1717da15b409SShawn Tu 	{0x2C6E, 0xBBF0},
1718da15b409SShawn Tu 	{0x2C70, 0xBBF0},
1719da15b409SShawn Tu 	{0x2C72, 0xBBB4},
1720da15b409SShawn Tu 	{0x2C74, 0xBBC8},
1721da15b409SShawn Tu 	{0x2C76, 0xBBB4},
1722da15b409SShawn Tu 	{0x2C78, 0xBBC8},
1723da15b409SShawn Tu 	{0x2C7A, 0xBC04},
1724da15b409SShawn Tu 	{0x2C7C, 0xBC04},
1725da15b409SShawn Tu 	{0x2C7E, 0xBBF0},
1726da15b409SShawn Tu 	{0x2C80, 0xBBF0},
1727da15b409SShawn Tu 	{0x3800, 0x880E},
1728da15b409SShawn Tu 	{0x3802, 0xBC62},
1729da15b409SShawn Tu 	{0x3804, 0xBC40},
1730da15b409SShawn Tu 	{0x3806, 0xD13E},
1731da15b409SShawn Tu 	{0x3808, 0xBC42},
1732da15b409SShawn Tu 	{0x380A, 0xBC3C},
1733da15b409SShawn Tu 	{0x380C, 0x0000},
1734da15b409SShawn Tu 	{0x380E, 0x0040},
1735da15b409SShawn Tu 	{0x3810, 0x0040},
1736da15b409SShawn Tu 	{0x3812, 0x0040},
1737da15b409SShawn Tu 	{0x3814, 0x0043},
1738da15b409SShawn Tu 	{0x3816, 0x0046},
1739da15b409SShawn Tu 	{0x3818, 0x004B},
1740da15b409SShawn Tu 	{0x381A, 0x004D},
1741da15b409SShawn Tu 	{0x381C, 0x0051},
1742da15b409SShawn Tu 	{0x381E, 0x0055},
1743da15b409SShawn Tu 	{0x3820, 0x005A},
1744da15b409SShawn Tu 	{0x3822, 0x005E},
1745da15b409SShawn Tu 	{0x3824, 0x0062},
1746da15b409SShawn Tu 	{0x3826, 0x0067},
1747da15b409SShawn Tu 	{0x3828, 0x006C},
1748da15b409SShawn Tu 	{0x382A, 0x0070},
1749da15b409SShawn Tu 	{0x382C, 0x0078},
1750da15b409SShawn Tu 	{0x382E, 0x0086},
1751da15b409SShawn Tu 	{0x3830, 0x0090},
1752da15b409SShawn Tu 	{0x3832, 0x0096},
1753da15b409SShawn Tu 	{0x3834, 0x009D},
1754da15b409SShawn Tu 	{0x3836, 0x00A5},
1755da15b409SShawn Tu 	{0x3838, 0x00AD},
1756da15b409SShawn Tu 	{0x383A, 0x00B4},
1757da15b409SShawn Tu 	{0x383C, 0x00B9},
1758da15b409SShawn Tu 	{0x383E, 0x00BE},
1759da15b409SShawn Tu 	{0x3840, 0x00C3},
1760da15b409SShawn Tu 	{0x3842, 0x00C8},
1761da15b409SShawn Tu 	{0x3844, 0x00CD},
1762da15b409SShawn Tu 	{0x3846, 0x00D2},
1763da15b409SShawn Tu 	{0x3848, 0x00D7},
1764da15b409SShawn Tu 	{0x384A, 0x00DC},
1765da15b409SShawn Tu 	{0x384C, 0x00DC},
1766da15b409SShawn Tu 	{0x384E, 0x0000},
1767da15b409SShawn Tu 	{0x3850, 0x0000},
1768da15b409SShawn Tu 	{0x3852, 0x0000},
1769da15b409SShawn Tu 	{0x3854, 0x0000},
1770da15b409SShawn Tu 	{0x3856, 0x0000},
1771da15b409SShawn Tu 	{0x3858, 0x0000},
1772da15b409SShawn Tu 	{0x385A, 0x0000},
1773da15b409SShawn Tu 	{0x385C, 0x0000},
1774da15b409SShawn Tu 	{0x385E, 0x0000},
1775da15b409SShawn Tu 	{0x3860, 0x0000},
1776da15b409SShawn Tu 	{0x3862, 0x0000},
1777da15b409SShawn Tu 	{0x3864, 0x0000},
1778da15b409SShawn Tu 	{0x3866, 0x0000},
1779da15b409SShawn Tu 	{0x3868, 0x0000},
1780da15b409SShawn Tu 	{0x386A, 0x0000},
1781da15b409SShawn Tu 	{0x386C, 0x0000},
1782da15b409SShawn Tu 	{0x386E, 0x0000},
1783da15b409SShawn Tu 	{0x3870, 0x0000},
1784da15b409SShawn Tu 	{0x3872, 0x0000},
1785da15b409SShawn Tu 	{0x3874, 0x0000},
1786da15b409SShawn Tu 	{0x3876, 0x0000},
1787da15b409SShawn Tu 	{0x3878, 0x0000},
1788da15b409SShawn Tu 	{0x387A, 0x0000},
1789da15b409SShawn Tu 	{0x387C, 0x0000},
1790da15b409SShawn Tu 	{0x387E, 0x0000},
1791da15b409SShawn Tu 	{0x3880, 0x0000},
1792da15b409SShawn Tu 	{0x3882, 0x0000},
1793da15b409SShawn Tu 	{0x3884, 0x0000},
1794da15b409SShawn Tu 	{0x3886, 0x0000},
1795da15b409SShawn Tu 	{0x3888, 0x0000},
1796da15b409SShawn Tu 	{0x388A, 0x0000},
1797da15b409SShawn Tu 	{0x388C, 0x0000},
1798da15b409SShawn Tu 	{0x026A, 0xFFFF},
1799da15b409SShawn Tu 	{0x026C, 0x00FF},
1800da15b409SShawn Tu 	{0x026E, 0x0000},
1801da15b409SShawn Tu 	{0x0360, 0x1E8E},
1802da15b409SShawn Tu 	{0x040E, 0x01EB},
1803da15b409SShawn Tu 	{0x0600, 0x1130},
1804da15b409SShawn Tu 	{0x0602, 0x3112},
1805da15b409SShawn Tu 	{0x0604, 0x8048},
1806da15b409SShawn Tu 	{0x0606, 0x00E9},
1807da15b409SShawn Tu 	{0x067A, 0x0404},
1808da15b409SShawn Tu 	{0x067C, 0x0404},
1809da15b409SShawn Tu 	{0x06A8, 0x0240},
1810da15b409SShawn Tu 	{0x06AA, 0x00CA},
1811da15b409SShawn Tu 	{0x06AC, 0x0041},
1812da15b409SShawn Tu 	{0x06B4, 0x3FFF},
1813da15b409SShawn Tu 	{0x06DE, 0x0404},
1814da15b409SShawn Tu 	{0x06E0, 0x0404},
1815da15b409SShawn Tu 	{0x06E2, 0xFF00},
1816da15b409SShawn Tu 	{0x06E4, 0x8333},
1817da15b409SShawn Tu 	{0x06E6, 0x8333},
1818da15b409SShawn Tu 	{0x06E8, 0x8333},
1819da15b409SShawn Tu 	{0x06EA, 0x8333},
1820da15b409SShawn Tu 	{0x052A, 0x0000},
1821da15b409SShawn Tu 	{0x052C, 0x0000},
1822da15b409SShawn Tu 	{0x0F06, 0x0002},
1823da15b409SShawn Tu 	{0x0A04, 0xB4C5},
1824da15b409SShawn Tu 	{0x0A06, 0xC400},
1825da15b409SShawn Tu 	{0x0A08, 0x988A},
1826da15b409SShawn Tu 	{0x0A0A, 0xA387},
1827da15b409SShawn Tu 	{0x0A0E, 0xEEC0},
1828da15b409SShawn Tu 	{0x0A12, 0x0000},
1829da15b409SShawn Tu 	{0x0A18, 0x0010},
1830da15b409SShawn Tu 	{0x0A1C, 0x0040},
1831da15b409SShawn Tu 	{0x0A20, 0x0015},
1832da15b409SShawn Tu 	{0x0C00, 0x0021},
1833da15b409SShawn Tu 	{0x0C16, 0x0002},
1834da15b409SShawn Tu 	{0x0708, 0x6FC0},
1835da15b409SShawn Tu 	{0x070C, 0x0000},
1836da15b409SShawn Tu 	{0x120C, 0x1428},
1837da15b409SShawn Tu 	{0x121A, 0x0000},
1838da15b409SShawn Tu 	{0x121C, 0x1896},
1839da15b409SShawn Tu 	{0x121E, 0x0032},
1840da15b409SShawn Tu 	{0x1220, 0x0000},
1841da15b409SShawn Tu 	{0x1222, 0x96FF},
1842da15b409SShawn Tu 	{0x1244, 0x0000},
1843da15b409SShawn Tu 	{0x105C, 0x0F0B},
1844da15b409SShawn Tu 	{0x1958, 0x0000},
1845da15b409SShawn Tu 	{0x195A, 0x004C},
1846da15b409SShawn Tu 	{0x195C, 0x0097},
1847da15b409SShawn Tu 	{0x195E, 0x0221},
1848da15b409SShawn Tu 	{0x1960, 0x03FE},
1849da15b409SShawn Tu 	{0x1980, 0x00E0},
1850da15b409SShawn Tu 	{0x1982, 0x0010},
1851da15b409SShawn Tu 	{0x1984, 0x2018},
1852da15b409SShawn Tu 	{0x1986, 0x0008},
1853da15b409SShawn Tu 	{0x1988, 0x0000},
1854da15b409SShawn Tu 	{0x198A, 0x0000},
1855da15b409SShawn Tu 	{0x198C, 0x0880},
1856da15b409SShawn Tu 	{0x198E, 0x0000},
1857da15b409SShawn Tu 	{0x1990, 0x1A00},
1858da15b409SShawn Tu 	{0x1992, 0x0000},
1859da15b409SShawn Tu 	{0x1994, 0x2800},
1860da15b409SShawn Tu 	{0x1996, 0x0002},
1861da15b409SShawn Tu 	{0x1962, 0x0000},
1862da15b409SShawn Tu 	{0x1964, 0x004C},
1863da15b409SShawn Tu 	{0x1966, 0x0097},
1864da15b409SShawn Tu 	{0x1968, 0x0221},
1865da15b409SShawn Tu 	{0x196A, 0x03FE},
1866da15b409SShawn Tu 	{0x19C0, 0x00E0},
1867da15b409SShawn Tu 	{0x19C2, 0x0010},
1868da15b409SShawn Tu 	{0x19C4, 0x2018},
1869da15b409SShawn Tu 	{0x19C6, 0x0008},
1870da15b409SShawn Tu 	{0x19C8, 0x0000},
1871da15b409SShawn Tu 	{0x19CA, 0x0000},
1872da15b409SShawn Tu 	{0x19CC, 0x0880},
1873da15b409SShawn Tu 	{0x19CE, 0x0000},
1874da15b409SShawn Tu 	{0x19D0, 0x1A00},
1875da15b409SShawn Tu 	{0x19D2, 0x0000},
1876da15b409SShawn Tu 	{0x19D4, 0x2800},
1877da15b409SShawn Tu 	{0x19D6, 0x0002},
1878da15b409SShawn Tu 	{0x196C, 0x0000},
1879da15b409SShawn Tu 	{0x196E, 0x004C},
1880da15b409SShawn Tu 	{0x1970, 0x0097},
1881da15b409SShawn Tu 	{0x1972, 0x0221},
1882da15b409SShawn Tu 	{0x1974, 0x03FE},
1883da15b409SShawn Tu 	{0x1A00, 0x00E0},
1884da15b409SShawn Tu 	{0x1A02, 0x0010},
1885da15b409SShawn Tu 	{0x1A04, 0x2018},
1886da15b409SShawn Tu 	{0x1A06, 0x0008},
1887da15b409SShawn Tu 	{0x1A08, 0x0000},
1888da15b409SShawn Tu 	{0x1A0A, 0x0000},
1889da15b409SShawn Tu 	{0x1A0C, 0x0880},
1890da15b409SShawn Tu 	{0x1A0E, 0x0000},
1891da15b409SShawn Tu 	{0x1A10, 0x1A00},
1892da15b409SShawn Tu 	{0x1A12, 0x0000},
1893da15b409SShawn Tu 	{0x1A14, 0x2800},
1894da15b409SShawn Tu 	{0x1A16, 0x0002},
1895da15b409SShawn Tu 	{0x1976, 0x0000},
1896da15b409SShawn Tu 	{0x1978, 0x004C},
1897da15b409SShawn Tu 	{0x197A, 0x0097},
1898da15b409SShawn Tu 	{0x197C, 0x0221},
1899da15b409SShawn Tu 	{0x197E, 0x03FE},
1900da15b409SShawn Tu 	{0x1A40, 0x00E0},
1901da15b409SShawn Tu 	{0x1A42, 0x0010},
1902da15b409SShawn Tu 	{0x1A44, 0x2018},
1903da15b409SShawn Tu 	{0x1A46, 0x0008},
1904da15b409SShawn Tu 	{0x1A48, 0x0000},
1905da15b409SShawn Tu 	{0x1A4A, 0x0000},
1906da15b409SShawn Tu 	{0x1A4C, 0x0880},
1907da15b409SShawn Tu 	{0x1A4E, 0x0000},
1908da15b409SShawn Tu 	{0x1A50, 0x1A00},
1909da15b409SShawn Tu 	{0x1A52, 0x0000},
1910da15b409SShawn Tu 	{0x1A54, 0x2800},
1911da15b409SShawn Tu 	{0x1A56, 0x0002},
1912da15b409SShawn Tu 	{0x192A, 0x0201},
1913da15b409SShawn Tu 	{0x0384, 0x0001},
1914da15b409SShawn Tu 	{0x027E, 0x0100},
1915da15b409SShawn Tu };
1916da15b409SShawn Tu 
1917da15b409SShawn Tu static const struct hi847_reg mode_3264x2448_regs[] = {
1918da15b409SShawn Tu 	{0x0B00, 0x0000},
1919da15b409SShawn Tu 	{0x0204, 0x0000},
1920da15b409SShawn Tu 	{0x0206, 0x033C},
1921da15b409SShawn Tu 	{0x020A, 0x0B4D},
1922da15b409SShawn Tu 	{0x020E, 0x0B51},
1923da15b409SShawn Tu 	{0x0214, 0x0200},
1924da15b409SShawn Tu 	{0x0216, 0x0200},
1925da15b409SShawn Tu 	{0x0218, 0x0200},
1926da15b409SShawn Tu 	{0x021A, 0x0200},
1927da15b409SShawn Tu 	{0x0224, 0x002E},
1928da15b409SShawn Tu 	{0x022A, 0x0017},
1929da15b409SShawn Tu 	{0x022C, 0x0E1F},
1930da15b409SShawn Tu 	{0x022E, 0x09C1},
1931da15b409SShawn Tu 	{0x0234, 0x1111},
1932da15b409SShawn Tu 	{0x0236, 0x1111},
1933da15b409SShawn Tu 	{0x0238, 0x1111},
1934da15b409SShawn Tu 	{0x023A, 0x1111},
1935da15b409SShawn Tu 	{0x0250, 0x0000},
1936da15b409SShawn Tu 	{0x0252, 0x0006},
1937da15b409SShawn Tu 	{0x0254, 0x0000},
1938da15b409SShawn Tu 	{0x0256, 0x0000},
1939da15b409SShawn Tu 	{0x0258, 0x0000},
1940da15b409SShawn Tu 	{0x025A, 0x0000},
1941da15b409SShawn Tu 	{0x025C, 0x0000},
1942da15b409SShawn Tu 	{0x025E, 0x0202},
1943da15b409SShawn Tu 	{0x0268, 0x00CD},
1944da15b409SShawn Tu 	{0x0440, 0x0002},
1945da15b409SShawn Tu 	{0x0F00, 0x0000},
1946da15b409SShawn Tu 	{0x0F04, 0x0008},
1947da15b409SShawn Tu 	{0x0F06, 0x0002},
1948da15b409SShawn Tu 	{0x0B02, 0x0100},
1949da15b409SShawn Tu 	{0x0B04, 0x00DC},
1950da15b409SShawn Tu 	{0x0B12, 0x0CC0},
1951da15b409SShawn Tu 	{0x0B14, 0x0990},
1952da15b409SShawn Tu 	{0x0B20, 0x0100},
1953da15b409SShawn Tu 	{0x1100, 0x1100},
1954da15b409SShawn Tu 	{0x1102, 0x0008},
1955da15b409SShawn Tu 	{0x1108, 0x0202},
1956da15b409SShawn Tu 	{0x1118, 0x0000},
1957da15b409SShawn Tu 	{0x0A10, 0xB040},
1958da15b409SShawn Tu 	{0x0C14, 0x0008},
1959da15b409SShawn Tu 	{0x0C18, 0x0CC0},
1960da15b409SShawn Tu 	{0x0C1A, 0x0990},
1961da15b409SShawn Tu 	{0x0730, 0x0001},
1962da15b409SShawn Tu 	{0x0732, 0x0000},
1963da15b409SShawn Tu 	{0x0734, 0x0300},
1964da15b409SShawn Tu 	{0x0736, 0x004B},
1965da15b409SShawn Tu 	{0x0738, 0x0001},
1966da15b409SShawn Tu 	{0x073C, 0x0900},
1967da15b409SShawn Tu 	{0x0740, 0x0000},
1968da15b409SShawn Tu 	{0x0742, 0x0000},
1969da15b409SShawn Tu 	{0x0744, 0x0300},
1970da15b409SShawn Tu 	{0x0746, 0x007D},
1971da15b409SShawn Tu 	{0x0748, 0x0002},
1972da15b409SShawn Tu 	{0x074A, 0x0900},
1973da15b409SShawn Tu 	{0x074C, 0x0000},
1974da15b409SShawn Tu 	{0x074E, 0x0100},
1975da15b409SShawn Tu 	{0x0750, 0x0000},
1976da15b409SShawn Tu 	{0x1200, 0x0946},
1977da15b409SShawn Tu 	{0x1202, 0x1A00},
1978da15b409SShawn Tu 	{0x120E, 0x6027},
1979da15b409SShawn Tu 	{0x1210, 0x8027},
1980da15b409SShawn Tu 	{0x1246, 0x0105},
1981da15b409SShawn Tu 	{0x1000, 0x0300},
1982da15b409SShawn Tu 	{0x1002, 0xC311},
1983da15b409SShawn Tu 	{0x1004, 0x2BB0},
1984da15b409SShawn Tu 	{0x1010, 0x087B},
1985da15b409SShawn Tu 	{0x1012, 0x0040},
1986da15b409SShawn Tu 	{0x1014, 0x0020},
1987da15b409SShawn Tu 	{0x1016, 0x0020},
1988da15b409SShawn Tu 	{0x101A, 0x0020},
1989da15b409SShawn Tu 	{0x1020, 0xC107},
1990da15b409SShawn Tu 	{0x1022, 0x081E},
1991da15b409SShawn Tu 	{0x1024, 0x0509},
1992da15b409SShawn Tu 	{0x1026, 0x0B0A},
1993da15b409SShawn Tu 	{0x1028, 0x1409},
1994da15b409SShawn Tu 	{0x102A, 0x0B05},
1995da15b409SShawn Tu 	{0x102C, 0x1400},
1996da15b409SShawn Tu 	{0x1038, 0x0000},
1997da15b409SShawn Tu 	{0x103E, 0x0001},
1998da15b409SShawn Tu 	{0x1040, 0x0000},
1999da15b409SShawn Tu 	{0x1042, 0x0008},
2000da15b409SShawn Tu 	{0x1044, 0x0120},
2001da15b409SShawn Tu 	{0x1046, 0x01B0},
2002da15b409SShawn Tu 	{0x1048, 0x0090},
2003da15b409SShawn Tu 	{0x1066, 0x089C},
2004da15b409SShawn Tu 	{0x1600, 0x0000},
2005da15b409SShawn Tu 	{0x1608, 0x0028},
2006da15b409SShawn Tu 	{0x160A, 0x0C80},
2007da15b409SShawn Tu 	{0x160C, 0x001A},
2008da15b409SShawn Tu 	{0x160E, 0x0960},
2009da15b409SShawn Tu 	{0x0252, 0x0009},
2010da15b409SShawn Tu 	{0x0202, 0x0000},
2011da15b409SShawn Tu };
2012da15b409SShawn Tu 
2013da15b409SShawn Tu static const struct hi847_reg mode_1632x1224_regs[] = {
2014da15b409SShawn Tu 	{0x0B00, 0x0000},
2015da15b409SShawn Tu 	{0x0204, 0x0200},
2016da15b409SShawn Tu 	{0x0206, 0x033C},
2017da15b409SShawn Tu 	{0x020A, 0x05A5},
2018da15b409SShawn Tu 	{0x020E, 0x05A9},
2019da15b409SShawn Tu 	{0x0214, 0x0200},
2020da15b409SShawn Tu 	{0x0216, 0x0200},
2021da15b409SShawn Tu 	{0x0218, 0x0200},
2022da15b409SShawn Tu 	{0x021A, 0x0200},
2023da15b409SShawn Tu 	{0x0224, 0x002C},
2024da15b409SShawn Tu 	{0x022A, 0x0015},
2025da15b409SShawn Tu 	{0x022C, 0x0E2D},
2026da15b409SShawn Tu 	{0x022E, 0x09C1},
2027da15b409SShawn Tu 	{0x0234, 0x3311},
2028da15b409SShawn Tu 	{0x0236, 0x3311},
2029da15b409SShawn Tu 	{0x0238, 0x3311},
2030da15b409SShawn Tu 	{0x023A, 0x2222},
2031da15b409SShawn Tu 	{0x0250, 0x0000},
2032da15b409SShawn Tu 	{0x0252, 0x0006},
2033da15b409SShawn Tu 	{0x0254, 0x0000},
2034da15b409SShawn Tu 	{0x0256, 0x0000},
2035da15b409SShawn Tu 	{0x0258, 0x0000},
2036da15b409SShawn Tu 	{0x025A, 0x0000},
2037da15b409SShawn Tu 	{0x025C, 0x0000},
2038da15b409SShawn Tu 	{0x025E, 0x0202},
2039da15b409SShawn Tu 	{0x0268, 0x00CD},
2040da15b409SShawn Tu 	{0x0440, 0x0002},
2041da15b409SShawn Tu 	{0x0F00, 0x0400},
2042da15b409SShawn Tu 	{0x0F04, 0x0004},
2043da15b409SShawn Tu 	{0x0F06, 0x0002},
2044da15b409SShawn Tu 	{0x0B02, 0x0100},
2045da15b409SShawn Tu 	{0x0B04, 0x00FC},
2046da15b409SShawn Tu 	{0x0B12, 0x0660},
2047da15b409SShawn Tu 	{0x0B14, 0x04C8},
2048da15b409SShawn Tu 	{0x0B20, 0x0200},
2049da15b409SShawn Tu 	{0x1100, 0x1100},
2050da15b409SShawn Tu 	{0x1102, 0x0008},
2051da15b409SShawn Tu 	{0x1108, 0x0402},
2052da15b409SShawn Tu 	{0x1118, 0x0000},
2053da15b409SShawn Tu 	{0x0A10, 0xB060},
2054da15b409SShawn Tu 	{0x0C14, 0x0008},
2055da15b409SShawn Tu 	{0x0C18, 0x0CC0},
2056da15b409SShawn Tu 	{0x0C1A, 0x04C8},
2057da15b409SShawn Tu 	{0x0730, 0x0001},
2058da15b409SShawn Tu 	{0x0732, 0x0000},
2059da15b409SShawn Tu 	{0x0734, 0x0300},
2060da15b409SShawn Tu 	{0x0736, 0x004B},
2061da15b409SShawn Tu 	{0x0738, 0x0001},
2062da15b409SShawn Tu 	{0x073C, 0x0900},
2063da15b409SShawn Tu 	{0x0740, 0x0000},
2064da15b409SShawn Tu 	{0x0742, 0x0000},
2065da15b409SShawn Tu 	{0x0744, 0x0300},
2066da15b409SShawn Tu 	{0x0746, 0x007D},
2067da15b409SShawn Tu 	{0x0748, 0x0002},
2068da15b409SShawn Tu 	{0x074A, 0x0900},
2069da15b409SShawn Tu 	{0x074C, 0x0100},
2070da15b409SShawn Tu 	{0x074E, 0x0100},
2071da15b409SShawn Tu 	{0x0750, 0x0000},
2072da15b409SShawn Tu 	{0x1200, 0x0946},
2073da15b409SShawn Tu 	{0x1202, 0x1A00},
2074da15b409SShawn Tu 	{0x120E, 0x6027},
2075da15b409SShawn Tu 	{0x1210, 0x8027},
2076da15b409SShawn Tu 	{0x1246, 0x0105},
2077da15b409SShawn Tu 	{0x1000, 0x0300},
2078da15b409SShawn Tu 	{0x1002, 0xC311},
2079da15b409SShawn Tu 	{0x1004, 0x2BB0},
2080da15b409SShawn Tu 	{0x1010, 0x042B},
2081da15b409SShawn Tu 	{0x1012, 0x0012},
2082da15b409SShawn Tu 	{0x1014, 0x0020},
2083da15b409SShawn Tu 	{0x1016, 0x0020},
2084da15b409SShawn Tu 	{0x101A, 0x0020},
2085da15b409SShawn Tu 	{0x1020, 0xC103},
2086da15b409SShawn Tu 	{0x1022, 0x040F},
2087da15b409SShawn Tu 	{0x1024, 0x0304},
2088da15b409SShawn Tu 	{0x1026, 0x0607},
2089da15b409SShawn Tu 	{0x1028, 0x0D06},
2090da15b409SShawn Tu 	{0x102A, 0x0605},
2091da15b409SShawn Tu 	{0x102C, 0x0C00},
2092da15b409SShawn Tu 	{0x1038, 0x0000},
2093da15b409SShawn Tu 	{0x103E, 0x0101},
2094da15b409SShawn Tu 	{0x1040, 0x0000},
2095da15b409SShawn Tu 	{0x1042, 0x0008},
2096da15b409SShawn Tu 	{0x1044, 0x0120},
2097da15b409SShawn Tu 	{0x1046, 0x01B0},
2098da15b409SShawn Tu 	{0x1048, 0x0090},
2099da15b409SShawn Tu 	{0x1066, 0x043B},
2100da15b409SShawn Tu 	{0x1600, 0x0400},
2101da15b409SShawn Tu 	{0x1608, 0x0028},
2102da15b409SShawn Tu 	{0x160A, 0x0C80},
2103da15b409SShawn Tu 	{0x160C, 0x001A},
2104da15b409SShawn Tu 	{0x160E, 0x0960},
2105da15b409SShawn Tu 	{0x0252, 0x0009},
2106da15b409SShawn Tu 	{0x0202, 0x0000},
2107da15b409SShawn Tu };
2108da15b409SShawn Tu 
2109da15b409SShawn Tu static const char * const hi847_test_pattern_menu[] = {
2110da15b409SShawn Tu 	"No Pattern",
2111da15b409SShawn Tu 	"Solid Colour",
2112da15b409SShawn Tu 	"100% Colour Bars",
2113da15b409SShawn Tu 	"Fade To Grey Colour Bars",
2114da15b409SShawn Tu 	"PN9",
2115da15b409SShawn Tu 	"Horizontal Gradient Pattern",
2116da15b409SShawn Tu 	"Vertical Gradient Pattern",
2117da15b409SShawn Tu 	"Check Board",
2118da15b409SShawn Tu 	"Slant Pattern",
2119da15b409SShawn Tu };
2120da15b409SShawn Tu 
2121da15b409SShawn Tu static const s64 link_freq_menu_items[] = {
2122da15b409SShawn Tu 	HI847_LINK_FREQ_400MHZ,
2123da15b409SShawn Tu 	HI847_LINK_FREQ_200MHZ,
2124da15b409SShawn Tu };
2125da15b409SShawn Tu 
2126da15b409SShawn Tu static const struct hi847_link_freq_config link_freq_configs[] = {
2127da15b409SShawn Tu 	[HI847_LINK_FREQ_400MHZ_INDEX] = {
2128da15b409SShawn Tu 		.reg_list = {
2129da15b409SShawn Tu 			.num_of_regs = ARRAY_SIZE(mipi_data_rate_lane_4),
2130da15b409SShawn Tu 			.regs = mipi_data_rate_lane_4,
2131da15b409SShawn Tu 		}
2132da15b409SShawn Tu 	},
2133da15b409SShawn Tu 	[HI847_LINK_FREQ_200MHZ_INDEX] = {
2134da15b409SShawn Tu 		.reg_list = {
2135da15b409SShawn Tu 			.num_of_regs = ARRAY_SIZE(mipi_data_rate_lane_4),
2136da15b409SShawn Tu 			.regs = mipi_data_rate_lane_4,
2137da15b409SShawn Tu 		}
2138da15b409SShawn Tu 	}
2139da15b409SShawn Tu };
2140da15b409SShawn Tu 
2141da15b409SShawn Tu static const struct hi847_mode supported_modes[] = {
2142da15b409SShawn Tu 	{
2143da15b409SShawn Tu 		.width = 3264,
2144da15b409SShawn Tu 		.height = 2448,
2145da15b409SShawn Tu 		.fll_def = HI847_FLL_30FPS,
2146da15b409SShawn Tu 		.fll_min = HI847_FLL_30FPS_MIN,
2147da15b409SShawn Tu 		.llp = 0x033C,
2148da15b409SShawn Tu 		.reg_list = {
2149da15b409SShawn Tu 			.num_of_regs = ARRAY_SIZE(mode_3264x2448_regs),
2150da15b409SShawn Tu 			.regs = mode_3264x2448_regs,
2151da15b409SShawn Tu 		},
2152da15b409SShawn Tu 		.link_freq_index = HI847_LINK_FREQ_400MHZ_INDEX,
2153da15b409SShawn Tu 	},
2154da15b409SShawn Tu 	{
2155da15b409SShawn Tu 		.width = 1632,
2156da15b409SShawn Tu 		.height = 1224,
2157da15b409SShawn Tu 		.fll_def = HI847_FLL_60FPS,
2158da15b409SShawn Tu 		.fll_min = HI847_FLL_60FPS_MIN,
2159da15b409SShawn Tu 		.llp = 0x033C,
2160da15b409SShawn Tu 		.reg_list = {
2161da15b409SShawn Tu 			.num_of_regs = ARRAY_SIZE(mode_1632x1224_regs),
2162da15b409SShawn Tu 			.regs = mode_1632x1224_regs,
2163da15b409SShawn Tu 		},
2164da15b409SShawn Tu 		.link_freq_index = HI847_LINK_FREQ_200MHZ_INDEX,
2165da15b409SShawn Tu 	}
2166da15b409SShawn Tu };
2167da15b409SShawn Tu 
2168da15b409SShawn Tu struct hi847 {
2169da15b409SShawn Tu 	struct v4l2_subdev sd;
2170da15b409SShawn Tu 	struct media_pad pad;
2171da15b409SShawn Tu 	struct v4l2_ctrl_handler ctrl_handler;
2172da15b409SShawn Tu 
2173da15b409SShawn Tu 	/* V4L2 Controls */
2174da15b409SShawn Tu 	struct v4l2_ctrl *link_freq;
2175da15b409SShawn Tu 	struct v4l2_ctrl *pixel_rate;
2176da15b409SShawn Tu 	struct v4l2_ctrl *vblank;
2177da15b409SShawn Tu 	struct v4l2_ctrl *hblank;
2178da15b409SShawn Tu 	struct v4l2_ctrl *exposure;
2179da15b409SShawn Tu 	struct v4l2_ctrl *vflip;
2180da15b409SShawn Tu 	struct v4l2_ctrl *hflip;
2181da15b409SShawn Tu 
2182da15b409SShawn Tu 	/* Current mode */
2183da15b409SShawn Tu 	const struct hi847_mode *cur_mode;
2184da15b409SShawn Tu 
2185da15b409SShawn Tu 	/* To serialize asynchronus callbacks */
2186da15b409SShawn Tu 	struct mutex mutex;
2187da15b409SShawn Tu 
2188da15b409SShawn Tu 	/* Streaming on/off */
2189da15b409SShawn Tu 	bool streaming;
2190da15b409SShawn Tu };
2191da15b409SShawn Tu 
to_pixel_rate(u32 f_index)2192da15b409SShawn Tu static u64 to_pixel_rate(u32 f_index)
2193da15b409SShawn Tu {
2194da15b409SShawn Tu 	u64 pixel_rate = link_freq_menu_items[f_index] * 2 * HI847_DATA_LANES;
2195da15b409SShawn Tu 
2196da15b409SShawn Tu 	do_div(pixel_rate, HI847_RGB_DEPTH);
2197da15b409SShawn Tu 
2198da15b409SShawn Tu 	return pixel_rate;
2199da15b409SShawn Tu }
2200da15b409SShawn Tu 
hi847_read_reg(struct hi847 * hi847,u16 reg,u16 len,u32 * val)2201da15b409SShawn Tu static int hi847_read_reg(struct hi847 *hi847, u16 reg, u16 len, u32 *val)
2202da15b409SShawn Tu {
2203da15b409SShawn Tu 	struct i2c_client *client = v4l2_get_subdevdata(&hi847->sd);
2204da15b409SShawn Tu 	struct i2c_msg msgs[2];
2205da15b409SShawn Tu 	u8 addr_buf[2];
2206da15b409SShawn Tu 	u8 data_buf[4] = {0};
2207da15b409SShawn Tu 	int ret;
2208da15b409SShawn Tu 
2209da15b409SShawn Tu 	if (len > 4)
2210da15b409SShawn Tu 		return -EINVAL;
2211da15b409SShawn Tu 
2212da15b409SShawn Tu 	put_unaligned_be16(reg, addr_buf);
2213da15b409SShawn Tu 	msgs[0].addr = client->addr;
2214da15b409SShawn Tu 	msgs[0].flags = 0;
2215da15b409SShawn Tu 	msgs[0].len = sizeof(addr_buf);
2216da15b409SShawn Tu 	msgs[0].buf = addr_buf;
2217da15b409SShawn Tu 	msgs[1].addr = client->addr;
2218da15b409SShawn Tu 	msgs[1].flags = I2C_M_RD;
2219da15b409SShawn Tu 	msgs[1].len = len;
2220da15b409SShawn Tu 	msgs[1].buf = &data_buf[4 - len];
2221da15b409SShawn Tu 
2222da15b409SShawn Tu 	ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
2223da15b409SShawn Tu 	if (ret != ARRAY_SIZE(msgs))
2224da15b409SShawn Tu 		return -EIO;
2225da15b409SShawn Tu 
2226da15b409SShawn Tu 	*val = get_unaligned_be32(data_buf);
2227da15b409SShawn Tu 
2228da15b409SShawn Tu 	return 0;
2229da15b409SShawn Tu }
2230da15b409SShawn Tu 
hi847_write_reg(struct hi847 * hi847,u16 reg,u16 len,u32 val)2231da15b409SShawn Tu static int hi847_write_reg(struct hi847 *hi847, u16 reg, u16 len, u32 val)
2232da15b409SShawn Tu {
2233da15b409SShawn Tu 	struct i2c_client *client = v4l2_get_subdevdata(&hi847->sd);
2234da15b409SShawn Tu 	u8 buf[6];
2235da15b409SShawn Tu 
2236da15b409SShawn Tu 	if (len > 4)
2237da15b409SShawn Tu 		return -EINVAL;
2238da15b409SShawn Tu 
2239da15b409SShawn Tu 	put_unaligned_be16(reg, buf);
2240da15b409SShawn Tu 	put_unaligned_be32(val << 8 * (4 - len), buf + 2);
2241da15b409SShawn Tu 	if (i2c_master_send(client, buf, len + 2) != len + 2)
2242da15b409SShawn Tu 		return -EIO;
2243da15b409SShawn Tu 
2244da15b409SShawn Tu 	return 0;
2245da15b409SShawn Tu }
2246da15b409SShawn Tu 
hi847_write_reg_list(struct hi847 * hi847,const struct hi847_reg_list * r_list)2247da15b409SShawn Tu static int hi847_write_reg_list(struct hi847 *hi847,
2248da15b409SShawn Tu 				const struct hi847_reg_list *r_list)
2249da15b409SShawn Tu {
2250da15b409SShawn Tu 	struct i2c_client *client = v4l2_get_subdevdata(&hi847->sd);
2251da15b409SShawn Tu 	unsigned int i;
2252da15b409SShawn Tu 	int ret;
2253da15b409SShawn Tu 
2254da15b409SShawn Tu 	for (i = 0; i < r_list->num_of_regs; i++) {
2255da15b409SShawn Tu 		ret = hi847_write_reg(hi847, r_list->regs[i].address,
2256da15b409SShawn Tu 				      HI847_REG_VALUE_16BIT,
2257da15b409SShawn Tu 				      r_list->regs[i].val);
2258da15b409SShawn Tu 		if (ret) {
2259da15b409SShawn Tu 			dev_err_ratelimited(&client->dev,
2260da15b409SShawn Tu 					    "failed to write reg 0x%4.4x. error = %d",
2261da15b409SShawn Tu 					    r_list->regs[i].address, ret);
2262da15b409SShawn Tu 			return ret;
2263da15b409SShawn Tu 		}
2264da15b409SShawn Tu 	}
2265da15b409SShawn Tu 
2266da15b409SShawn Tu 	return 0;
2267da15b409SShawn Tu }
2268da15b409SShawn Tu 
hi847_update_digital_gain(struct hi847 * hi847,u32 d_gain)2269da15b409SShawn Tu static int hi847_update_digital_gain(struct hi847 *hi847, u32 d_gain)
2270da15b409SShawn Tu {
2271da15b409SShawn Tu 	int ret;
2272da15b409SShawn Tu 
2273da15b409SShawn Tu 	ret = hi847_write_reg(hi847, HI847_REG_MWB_GR_GAIN,
2274da15b409SShawn Tu 			      HI847_REG_VALUE_16BIT, d_gain);
2275da15b409SShawn Tu 	if (ret)
2276da15b409SShawn Tu 		return ret;
2277da15b409SShawn Tu 
2278da15b409SShawn Tu 	ret = hi847_write_reg(hi847, HI847_REG_MWB_GB_GAIN,
2279da15b409SShawn Tu 			      HI847_REG_VALUE_16BIT, d_gain);
2280da15b409SShawn Tu 	if (ret)
2281da15b409SShawn Tu 		return ret;
2282da15b409SShawn Tu 
2283da15b409SShawn Tu 	ret = hi847_write_reg(hi847, HI847_REG_MWB_R_GAIN,
2284da15b409SShawn Tu 			      HI847_REG_VALUE_16BIT, d_gain);
2285da15b409SShawn Tu 	if (ret)
2286da15b409SShawn Tu 		return ret;
2287da15b409SShawn Tu 
2288da15b409SShawn Tu 	return hi847_write_reg(hi847, HI847_REG_MWB_B_GAIN,
2289da15b409SShawn Tu 			       HI847_REG_VALUE_16BIT, d_gain);
2290da15b409SShawn Tu }
2291da15b409SShawn Tu 
hi847_test_pattern(struct hi847 * hi847,u32 pattern)2292da15b409SShawn Tu static int hi847_test_pattern(struct hi847 *hi847, u32 pattern)
2293da15b409SShawn Tu {
2294da15b409SShawn Tu 	int ret;
2295da15b409SShawn Tu 	u32 val;
2296da15b409SShawn Tu 
2297da15b409SShawn Tu 	if (pattern) {
2298da15b409SShawn Tu 		ret = hi847_read_reg(hi847, HI847_REG_ISP,
2299da15b409SShawn Tu 				     HI847_REG_VALUE_16BIT, &val);
2300da15b409SShawn Tu 		if (ret)
2301da15b409SShawn Tu 			return ret;
2302da15b409SShawn Tu 
2303da15b409SShawn Tu 		ret = hi847_write_reg(hi847, HI847_REG_ISP,
2304da15b409SShawn Tu 				      HI847_REG_VALUE_16BIT,
2305da15b409SShawn Tu 				      val | HI847_REG_ISP_TPG_EN);
2306da15b409SShawn Tu 		if (ret)
2307da15b409SShawn Tu 			return ret;
2308da15b409SShawn Tu 	}
2309da15b409SShawn Tu 
2310da15b409SShawn Tu 	ret = hi847_read_reg(hi847, HI847_REG_TEST_PATTERN,
2311da15b409SShawn Tu 			     HI847_REG_VALUE_16BIT, &val);
2312da15b409SShawn Tu 	if (ret)
2313da15b409SShawn Tu 		return ret;
2314da15b409SShawn Tu 
2315da15b409SShawn Tu 	return hi847_write_reg(hi847, HI847_REG_TEST_PATTERN,
2316da15b409SShawn Tu 			       HI847_REG_VALUE_16BIT, val | pattern << 8);
2317da15b409SShawn Tu }
2318da15b409SShawn Tu 
hi847_grbg_shift(struct hi847 * hi847)2319da15b409SShawn Tu static int hi847_grbg_shift(struct hi847 *hi847)
2320da15b409SShawn Tu {
2321da15b409SShawn Tu 	int ret;
2322da15b409SShawn Tu 	int hflip, vflip;
2323da15b409SShawn Tu 
2324da15b409SShawn Tu 	/* regs shift for full size */
2325da15b409SShawn Tu 	static const u32 FORMAT_X_SHIFT_1[2][2] = {
2326da15b409SShawn Tu 		{ 0x0008, 0x0007, },
2327da15b409SShawn Tu 		{ 0x0008, 0x0007, },
2328da15b409SShawn Tu 	};
2329da15b409SShawn Tu 
2330da15b409SShawn Tu 	static const u32 FORMAT_Y_SHIFT_1[2][2] = {
2331da15b409SShawn Tu 		{ 0x0002, 0x0002, },
2332da15b409SShawn Tu 		{ 0x0001, 0x0001, },
2333da15b409SShawn Tu 	};
2334da15b409SShawn Tu 
2335da15b409SShawn Tu 	/* regs shift for binning size */
2336da15b409SShawn Tu 	static const u32 FORMAT_X_SHIFT_2[2][2] = {
2337da15b409SShawn Tu 		{ 0x0004, 0x0003, },
2338da15b409SShawn Tu 		{ 0x0004, 0x0003, },
2339da15b409SShawn Tu 	};
2340da15b409SShawn Tu 
2341da15b409SShawn Tu 	static const u32 FORMAT_Y_SHIFT_2[2][2] = {
2342da15b409SShawn Tu 		{ 0x0002, 0x0002, },
2343da15b409SShawn Tu 		{ 0x0001, 0x0001, },
2344da15b409SShawn Tu 	};
2345da15b409SShawn Tu 
2346da15b409SShawn Tu 	hflip = hi847->hflip->val;
2347da15b409SShawn Tu 	vflip = hi847->vflip->val;
2348da15b409SShawn Tu 
2349da15b409SShawn Tu 	if (hi847->cur_mode->width == 3264) {
2350da15b409SShawn Tu 		ret = hi847_write_reg(hi847, HI847_REG_FORMAT_X,
2351da15b409SShawn Tu 				      HI847_REG_VALUE_16BIT,
2352da15b409SShawn Tu 				      FORMAT_X_SHIFT_1[vflip][hflip]);
2353da15b409SShawn Tu 		if (ret)
2354da15b409SShawn Tu 			return ret;
2355da15b409SShawn Tu 
2356da15b409SShawn Tu 		return hi847_write_reg(hi847, HI847_REG_FORMAT_Y,
2357da15b409SShawn Tu 				       HI847_REG_VALUE_16BIT,
2358da15b409SShawn Tu 				       FORMAT_Y_SHIFT_1[vflip][hflip]);
2359da15b409SShawn Tu 	} else {
2360da15b409SShawn Tu 		ret = hi847_write_reg(hi847, HI847_REG_FORMAT_X,
2361da15b409SShawn Tu 				      HI847_REG_VALUE_16BIT,
2362da15b409SShawn Tu 				      FORMAT_X_SHIFT_2[vflip][hflip]);
2363da15b409SShawn Tu 		if (ret)
2364da15b409SShawn Tu 			return ret;
2365da15b409SShawn Tu 
2366da15b409SShawn Tu 		return hi847_write_reg(hi847, HI847_REG_FORMAT_Y,
2367da15b409SShawn Tu 				       HI847_REG_VALUE_16BIT,
2368da15b409SShawn Tu 				       FORMAT_Y_SHIFT_2[vflip][hflip]);
2369da15b409SShawn Tu 	}
2370da15b409SShawn Tu }
2371da15b409SShawn Tu 
hi847_set_ctrl_hflip(struct hi847 * hi847,u32 ctrl_val)2372da15b409SShawn Tu static int hi847_set_ctrl_hflip(struct hi847 *hi847, u32 ctrl_val)
2373da15b409SShawn Tu {
2374da15b409SShawn Tu 	int ret;
2375da15b409SShawn Tu 	u32 val;
2376da15b409SShawn Tu 
2377da15b409SShawn Tu 	ret = hi847_read_reg(hi847, HI847_REG_MIRROR_FLIP,
2378da15b409SShawn Tu 			     HI847_REG_VALUE_16BIT, &val);
2379da15b409SShawn Tu 	if (ret)
2380da15b409SShawn Tu 		return ret;
2381da15b409SShawn Tu 
2382da15b409SShawn Tu 	ret = hi847_grbg_shift(hi847);
2383da15b409SShawn Tu 	if (ret)
2384da15b409SShawn Tu 		return ret;
2385da15b409SShawn Tu 
2386da15b409SShawn Tu 	return hi847_write_reg(hi847, HI847_REG_MIRROR_FLIP,
2387da15b409SShawn Tu 			       HI847_REG_VALUE_16BIT,
2388da15b409SShawn Tu 			       ctrl_val ? val | BIT(8) : val & ~BIT(8));
2389da15b409SShawn Tu }
2390da15b409SShawn Tu 
hi847_set_ctrl_vflip(struct hi847 * hi847,u8 ctrl_val)2391da15b409SShawn Tu static int hi847_set_ctrl_vflip(struct hi847 *hi847, u8 ctrl_val)
2392da15b409SShawn Tu {
2393da15b409SShawn Tu 	int ret;
2394da15b409SShawn Tu 	u32 val;
2395da15b409SShawn Tu 
2396da15b409SShawn Tu 	ret = hi847_read_reg(hi847, HI847_REG_MIRROR_FLIP,
2397da15b409SShawn Tu 			     HI847_REG_VALUE_16BIT, &val);
2398da15b409SShawn Tu 	if (ret)
2399da15b409SShawn Tu 		return ret;
2400da15b409SShawn Tu 
2401da15b409SShawn Tu 	ret = hi847_grbg_shift(hi847);
2402da15b409SShawn Tu 	if (ret)
2403da15b409SShawn Tu 		return ret;
2404da15b409SShawn Tu 
2405da15b409SShawn Tu 	return hi847_write_reg(hi847, HI847_REG_MIRROR_FLIP,
2406da15b409SShawn Tu 			       HI847_REG_VALUE_16BIT,
2407da15b409SShawn Tu 			       ctrl_val ? val | BIT(9) : val & ~BIT(9));
2408da15b409SShawn Tu }
2409da15b409SShawn Tu 
hi847_set_ctrl(struct v4l2_ctrl * ctrl)2410da15b409SShawn Tu static int hi847_set_ctrl(struct v4l2_ctrl *ctrl)
2411da15b409SShawn Tu {
2412da15b409SShawn Tu 	struct hi847 *hi847 = container_of(ctrl->handler,
2413da15b409SShawn Tu 					     struct hi847, ctrl_handler);
2414da15b409SShawn Tu 	struct i2c_client *client = v4l2_get_subdevdata(&hi847->sd);
2415da15b409SShawn Tu 	s64 exposure_max;
2416da15b409SShawn Tu 	int ret = 0;
2417da15b409SShawn Tu 
2418da15b409SShawn Tu 	/* Propagate change of current control to all related controls */
2419da15b409SShawn Tu 	if (ctrl->id == V4L2_CID_VBLANK) {
2420da15b409SShawn Tu 		/* Update max exposure while meeting expected vblanking */
2421da15b409SShawn Tu 		exposure_max = hi847->cur_mode->height + ctrl->val -
2422da15b409SShawn Tu 			       HI847_EXPOSURE_MAX_MARGIN;
2423da15b409SShawn Tu 		__v4l2_ctrl_modify_range(hi847->exposure,
2424da15b409SShawn Tu 					 hi847->exposure->minimum,
2425da15b409SShawn Tu 					 exposure_max, hi847->exposure->step,
2426da15b409SShawn Tu 					 exposure_max);
2427da15b409SShawn Tu 	}
2428da15b409SShawn Tu 
2429da15b409SShawn Tu 	/* V4L2 controls values will be applied only when power is already up */
2430da15b409SShawn Tu 	if (!pm_runtime_get_if_in_use(&client->dev))
2431da15b409SShawn Tu 		return 0;
2432da15b409SShawn Tu 
2433da15b409SShawn Tu 	switch (ctrl->id) {
2434da15b409SShawn Tu 	case V4L2_CID_ANALOGUE_GAIN:
2435da15b409SShawn Tu 		ret = hi847_write_reg(hi847, HI847_REG_ANALOG_GAIN,
2436da15b409SShawn Tu 				      HI847_REG_VALUE_16BIT, ctrl->val);
2437da15b409SShawn Tu 		break;
2438da15b409SShawn Tu 
2439da15b409SShawn Tu 	case V4L2_CID_DIGITAL_GAIN:
2440da15b409SShawn Tu 		ret = hi847_update_digital_gain(hi847, ctrl->val);
2441da15b409SShawn Tu 		break;
2442da15b409SShawn Tu 
2443da15b409SShawn Tu 	case V4L2_CID_EXPOSURE:
2444da15b409SShawn Tu 		ret = hi847_write_reg(hi847, HI847_REG_EXPOSURE,
2445da15b409SShawn Tu 				      HI847_REG_VALUE_16BIT, ctrl->val);
2446da15b409SShawn Tu 		break;
2447da15b409SShawn Tu 
2448da15b409SShawn Tu 	case V4L2_CID_VBLANK:
2449da15b409SShawn Tu 		/* Update FLL that meets expected vertical blanking */
2450da15b409SShawn Tu 		ret = hi847_write_reg(hi847, HI847_REG_FLL,
2451da15b409SShawn Tu 				      HI847_REG_VALUE_16BIT,
2452da15b409SShawn Tu 				      hi847->cur_mode->height + ctrl->val);
2453da15b409SShawn Tu 		break;
2454da15b409SShawn Tu 
2455da15b409SShawn Tu 	case V4L2_CID_TEST_PATTERN:
2456da15b409SShawn Tu 		ret = hi847_test_pattern(hi847, ctrl->val);
2457da15b409SShawn Tu 		break;
2458da15b409SShawn Tu 
2459da15b409SShawn Tu 	case V4L2_CID_HFLIP:
2460da15b409SShawn Tu 		hi847_set_ctrl_hflip(hi847, ctrl->val);
2461da15b409SShawn Tu 		break;
2462da15b409SShawn Tu 
2463da15b409SShawn Tu 	case V4L2_CID_VFLIP:
2464da15b409SShawn Tu 		hi847_set_ctrl_vflip(hi847, ctrl->val);
2465da15b409SShawn Tu 		break;
2466da15b409SShawn Tu 
2467da15b409SShawn Tu 	default:
2468da15b409SShawn Tu 		ret = -EINVAL;
2469da15b409SShawn Tu 		break;
2470da15b409SShawn Tu 	}
2471da15b409SShawn Tu 
2472da15b409SShawn Tu 	pm_runtime_put(&client->dev);
2473da15b409SShawn Tu 
2474da15b409SShawn Tu 	return ret;
2475da15b409SShawn Tu }
2476da15b409SShawn Tu 
2477da15b409SShawn Tu static const struct v4l2_ctrl_ops hi847_ctrl_ops = {
2478da15b409SShawn Tu 	.s_ctrl = hi847_set_ctrl,
2479da15b409SShawn Tu };
2480da15b409SShawn Tu 
hi847_init_controls(struct hi847 * hi847)2481da15b409SShawn Tu static int hi847_init_controls(struct hi847 *hi847)
2482da15b409SShawn Tu {
2483da15b409SShawn Tu 	struct v4l2_ctrl_handler *ctrl_hdlr;
2484da15b409SShawn Tu 	s64 exposure_max, h_blank;
2485da15b409SShawn Tu 	int ret;
2486da15b409SShawn Tu 
2487da15b409SShawn Tu 	ctrl_hdlr = &hi847->ctrl_handler;
2488da15b409SShawn Tu 	ret = v4l2_ctrl_handler_init(ctrl_hdlr, 8);
2489da15b409SShawn Tu 	if (ret)
2490da15b409SShawn Tu 		return ret;
2491da15b409SShawn Tu 
2492da15b409SShawn Tu 	ctrl_hdlr->lock = &hi847->mutex;
2493da15b409SShawn Tu 	hi847->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr, &hi847_ctrl_ops,
2494da15b409SShawn Tu 						  V4L2_CID_LINK_FREQ,
2495da15b409SShawn Tu 					ARRAY_SIZE(link_freq_menu_items) - 1,
2496da15b409SShawn Tu 					0, link_freq_menu_items);
2497da15b409SShawn Tu 	if (hi847->link_freq)
2498da15b409SShawn Tu 		hi847->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
2499da15b409SShawn Tu 
2500da15b409SShawn Tu 	hi847->pixel_rate = v4l2_ctrl_new_std
2501da15b409SShawn Tu 			    (ctrl_hdlr, &hi847_ctrl_ops,
2502da15b409SShawn Tu 			     V4L2_CID_PIXEL_RATE, 0,
2503da15b409SShawn Tu 			     to_pixel_rate(HI847_LINK_FREQ_400MHZ_INDEX),
2504da15b409SShawn Tu 			     1,
2505da15b409SShawn Tu 			     to_pixel_rate(HI847_LINK_FREQ_400MHZ_INDEX));
2506da15b409SShawn Tu 	hi847->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &hi847_ctrl_ops,
2507da15b409SShawn Tu 					  V4L2_CID_VBLANK,
2508da15b409SShawn Tu 					  hi847->cur_mode->fll_min -
2509da15b409SShawn Tu 					  hi847->cur_mode->height,
2510da15b409SShawn Tu 					  HI847_FLL_MAX -
2511da15b409SShawn Tu 					  hi847->cur_mode->height, 1,
2512da15b409SShawn Tu 					  hi847->cur_mode->fll_def -
2513da15b409SShawn Tu 					  hi847->cur_mode->height);
2514da15b409SShawn Tu 
2515da15b409SShawn Tu 	h_blank = hi847->cur_mode->llp - hi847->cur_mode->width;
2516da15b409SShawn Tu 
2517da15b409SShawn Tu 	hi847->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &hi847_ctrl_ops,
2518da15b409SShawn Tu 					  V4L2_CID_HBLANK, h_blank, h_blank, 1,
2519da15b409SShawn Tu 					  h_blank);
2520da15b409SShawn Tu 	if (hi847->hblank)
2521da15b409SShawn Tu 		hi847->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
2522da15b409SShawn Tu 
2523da15b409SShawn Tu 	v4l2_ctrl_new_std(ctrl_hdlr, &hi847_ctrl_ops, V4L2_CID_ANALOGUE_GAIN,
2524da15b409SShawn Tu 			  HI847_ANAL_GAIN_MIN, HI847_ANAL_GAIN_MAX,
2525da15b409SShawn Tu 			  HI847_ANAL_GAIN_STEP, HI847_ANAL_GAIN_MIN);
2526da15b409SShawn Tu 	v4l2_ctrl_new_std(ctrl_hdlr, &hi847_ctrl_ops, V4L2_CID_DIGITAL_GAIN,
2527da15b409SShawn Tu 			  HI847_DGTL_GAIN_MIN, HI847_DGTL_GAIN_MAX,
2528da15b409SShawn Tu 			  HI847_DGTL_GAIN_STEP, HI847_DGTL_GAIN_DEFAULT);
2529da15b409SShawn Tu 	exposure_max = hi847->cur_mode->fll_def - HI847_EXPOSURE_MAX_MARGIN;
2530da15b409SShawn Tu 	hi847->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &hi847_ctrl_ops,
2531da15b409SShawn Tu 					    V4L2_CID_EXPOSURE,
2532da15b409SShawn Tu 					    HI847_EXPOSURE_MIN, exposure_max,
2533da15b409SShawn Tu 					    HI847_EXPOSURE_STEP,
2534da15b409SShawn Tu 					    exposure_max);
2535da15b409SShawn Tu 	v4l2_ctrl_new_std_menu_items(ctrl_hdlr, &hi847_ctrl_ops,
2536da15b409SShawn Tu 				     V4L2_CID_TEST_PATTERN,
2537da15b409SShawn Tu 				     ARRAY_SIZE(hi847_test_pattern_menu) - 1,
2538da15b409SShawn Tu 				     0, 0, hi847_test_pattern_menu);
2539da15b409SShawn Tu 	hi847->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &hi847_ctrl_ops,
2540da15b409SShawn Tu 					 V4L2_CID_HFLIP, 0, 1, 1, 0);
2541da15b409SShawn Tu 	hi847->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &hi847_ctrl_ops,
2542da15b409SShawn Tu 					 V4L2_CID_VFLIP, 0, 1, 1, 0);
2543da15b409SShawn Tu 
2544da15b409SShawn Tu 	if (ctrl_hdlr->error)
2545da15b409SShawn Tu 		return ctrl_hdlr->error;
2546da15b409SShawn Tu 
2547da15b409SShawn Tu 	hi847->sd.ctrl_handler = ctrl_hdlr;
2548da15b409SShawn Tu 
2549da15b409SShawn Tu 	return 0;
2550da15b409SShawn Tu }
2551da15b409SShawn Tu 
hi847_assign_pad_format(const struct hi847_mode * mode,struct v4l2_mbus_framefmt * fmt)2552da15b409SShawn Tu static void hi847_assign_pad_format(const struct hi847_mode *mode,
2553da15b409SShawn Tu 				    struct v4l2_mbus_framefmt *fmt)
2554da15b409SShawn Tu {
2555da15b409SShawn Tu 	fmt->width = mode->width;
2556da15b409SShawn Tu 	fmt->height = mode->height;
2557da15b409SShawn Tu 	fmt->code = MEDIA_BUS_FMT_SGRBG10_1X10;
2558da15b409SShawn Tu 	fmt->field = V4L2_FIELD_NONE;
2559da15b409SShawn Tu }
2560da15b409SShawn Tu 
hi847_start_streaming(struct hi847 * hi847)2561da15b409SShawn Tu static int hi847_start_streaming(struct hi847 *hi847)
2562da15b409SShawn Tu {
2563da15b409SShawn Tu 	struct i2c_client *client = v4l2_get_subdevdata(&hi847->sd);
2564da15b409SShawn Tu 	const struct hi847_reg_list *reg_list;
2565da15b409SShawn Tu 	int link_freq_index, ret;
2566da15b409SShawn Tu 
2567da15b409SShawn Tu 	link_freq_index = hi847->cur_mode->link_freq_index;
2568da15b409SShawn Tu 	reg_list = &link_freq_configs[link_freq_index].reg_list;
2569da15b409SShawn Tu 	ret = hi847_write_reg_list(hi847, reg_list);
2570da15b409SShawn Tu 	if (ret) {
2571da15b409SShawn Tu 		dev_err(&client->dev, "failed to set plls");
2572da15b409SShawn Tu 		return ret;
2573da15b409SShawn Tu 	}
2574da15b409SShawn Tu 
2575da15b409SShawn Tu 	reg_list = &hi847->cur_mode->reg_list;
2576da15b409SShawn Tu 	ret = hi847_write_reg_list(hi847, reg_list);
2577da15b409SShawn Tu 	if (ret) {
2578da15b409SShawn Tu 		dev_err(&client->dev, "failed to set mode");
2579da15b409SShawn Tu 		return ret;
2580da15b409SShawn Tu 	}
2581da15b409SShawn Tu 
2582da15b409SShawn Tu 	ret = __v4l2_ctrl_handler_setup(hi847->sd.ctrl_handler);
2583da15b409SShawn Tu 	if (ret)
2584da15b409SShawn Tu 		return ret;
2585da15b409SShawn Tu 
2586da15b409SShawn Tu 	ret = hi847_write_reg(hi847, HI847_REG_MODE_TG,
2587da15b409SShawn Tu 			      HI847_REG_VALUE_16BIT, HI847_REG_MODE_TG_ENABLE);
2588da15b409SShawn Tu 
2589da15b409SShawn Tu 	ret = hi847_write_reg(hi847, HI847_REG_MODE_SELECT,
2590da15b409SShawn Tu 			      HI847_REG_VALUE_16BIT, HI847_MODE_STREAMING);
2591da15b409SShawn Tu 
2592da15b409SShawn Tu 	if (ret) {
2593da15b409SShawn Tu 		dev_err(&client->dev, "failed to set stream");
2594da15b409SShawn Tu 		return ret;
2595da15b409SShawn Tu 	}
2596da15b409SShawn Tu 
2597da15b409SShawn Tu 	return 0;
2598da15b409SShawn Tu }
2599da15b409SShawn Tu 
hi847_stop_streaming(struct hi847 * hi847)2600da15b409SShawn Tu static void hi847_stop_streaming(struct hi847 *hi847)
2601da15b409SShawn Tu {
2602da15b409SShawn Tu 	struct i2c_client *client = v4l2_get_subdevdata(&hi847->sd);
2603da15b409SShawn Tu 
2604da15b409SShawn Tu 	if (hi847_write_reg(hi847, HI847_REG_MODE_TG,
2605da15b409SShawn Tu 			    HI847_REG_VALUE_16BIT, HI847_REG_MODE_TG_DISABLE))
2606da15b409SShawn Tu 		dev_err(&client->dev, "failed to set stream 0x%x",
2607da15b409SShawn Tu 			HI847_REG_MODE_TG);
2608da15b409SShawn Tu 
2609da15b409SShawn Tu 	if (hi847_write_reg(hi847, HI847_REG_MODE_SELECT,
2610da15b409SShawn Tu 			    HI847_REG_VALUE_16BIT, HI847_MODE_STANDBY))
2611da15b409SShawn Tu 		dev_err(&client->dev, "failed to set stream 0x%x",
2612da15b409SShawn Tu 		HI847_REG_MODE_SELECT);
2613da15b409SShawn Tu }
2614da15b409SShawn Tu 
hi847_set_stream(struct v4l2_subdev * sd,int enable)2615da15b409SShawn Tu static int hi847_set_stream(struct v4l2_subdev *sd, int enable)
2616da15b409SShawn Tu {
2617da15b409SShawn Tu 	struct hi847 *hi847 = to_hi847(sd);
2618da15b409SShawn Tu 	struct i2c_client *client = v4l2_get_subdevdata(sd);
2619da15b409SShawn Tu 	int ret = 0;
2620da15b409SShawn Tu 
2621da15b409SShawn Tu 	if (hi847->streaming == enable)
2622da15b409SShawn Tu 		return 0;
2623da15b409SShawn Tu 
2624da15b409SShawn Tu 	mutex_lock(&hi847->mutex);
2625da15b409SShawn Tu 	if (enable) {
2626da15b409SShawn Tu 		ret = pm_runtime_get_sync(&client->dev);
2627da15b409SShawn Tu 		if (ret < 0) {
2628da15b409SShawn Tu 			pm_runtime_put_noidle(&client->dev);
2629da15b409SShawn Tu 			mutex_unlock(&hi847->mutex);
2630da15b409SShawn Tu 			return ret;
2631da15b409SShawn Tu 		}
2632da15b409SShawn Tu 
2633da15b409SShawn Tu 		ret = hi847_start_streaming(hi847);
2634da15b409SShawn Tu 		if (ret) {
2635da15b409SShawn Tu 			enable = 0;
2636da15b409SShawn Tu 			hi847_stop_streaming(hi847);
2637da15b409SShawn Tu 			pm_runtime_put(&client->dev);
2638da15b409SShawn Tu 		}
2639da15b409SShawn Tu 	} else {
2640da15b409SShawn Tu 		hi847_stop_streaming(hi847);
2641da15b409SShawn Tu 		pm_runtime_put(&client->dev);
2642da15b409SShawn Tu 	}
2643da15b409SShawn Tu 
2644da15b409SShawn Tu 	hi847->streaming = enable;
2645da15b409SShawn Tu 	mutex_unlock(&hi847->mutex);
2646da15b409SShawn Tu 
2647da15b409SShawn Tu 	return ret;
2648da15b409SShawn Tu }
2649da15b409SShawn Tu 
hi847_suspend(struct device * dev)2650da15b409SShawn Tu static int __maybe_unused hi847_suspend(struct device *dev)
2651da15b409SShawn Tu {
2652da15b409SShawn Tu 	struct i2c_client *client = to_i2c_client(dev);
2653da15b409SShawn Tu 	struct v4l2_subdev *sd = i2c_get_clientdata(client);
2654da15b409SShawn Tu 	struct hi847 *hi847 = to_hi847(sd);
2655da15b409SShawn Tu 
2656da15b409SShawn Tu 	mutex_lock(&hi847->mutex);
2657da15b409SShawn Tu 	if (hi847->streaming)
2658da15b409SShawn Tu 		hi847_stop_streaming(hi847);
2659da15b409SShawn Tu 
2660da15b409SShawn Tu 	mutex_unlock(&hi847->mutex);
2661da15b409SShawn Tu 
2662da15b409SShawn Tu 	return 0;
2663da15b409SShawn Tu }
2664da15b409SShawn Tu 
hi847_resume(struct device * dev)2665da15b409SShawn Tu static int __maybe_unused hi847_resume(struct device *dev)
2666da15b409SShawn Tu {
2667da15b409SShawn Tu 	struct i2c_client *client = to_i2c_client(dev);
2668da15b409SShawn Tu 	struct v4l2_subdev *sd = i2c_get_clientdata(client);
2669da15b409SShawn Tu 	struct hi847 *hi847 = to_hi847(sd);
2670da15b409SShawn Tu 	int ret;
2671da15b409SShawn Tu 
2672da15b409SShawn Tu 	mutex_lock(&hi847->mutex);
2673da15b409SShawn Tu 	if (hi847->streaming) {
2674da15b409SShawn Tu 		ret = hi847_start_streaming(hi847);
2675da15b409SShawn Tu 		if (ret)
2676da15b409SShawn Tu 			goto error;
2677da15b409SShawn Tu 	}
2678da15b409SShawn Tu 
2679da15b409SShawn Tu 	mutex_unlock(&hi847->mutex);
2680da15b409SShawn Tu 
2681da15b409SShawn Tu 	return 0;
2682da15b409SShawn Tu 
2683da15b409SShawn Tu error:
2684da15b409SShawn Tu 	hi847_stop_streaming(hi847);
2685da15b409SShawn Tu 	hi847->streaming = 0;
2686da15b409SShawn Tu 	mutex_unlock(&hi847->mutex);
2687da15b409SShawn Tu 	return ret;
2688da15b409SShawn Tu }
2689da15b409SShawn Tu 
hi847_set_format(struct v4l2_subdev * sd,struct v4l2_subdev_state * sd_state,struct v4l2_subdev_format * fmt)2690da15b409SShawn Tu static int hi847_set_format(struct v4l2_subdev *sd,
2691da15b409SShawn Tu 			    struct v4l2_subdev_state *sd_state,
2692da15b409SShawn Tu 			    struct v4l2_subdev_format *fmt)
2693da15b409SShawn Tu {
2694da15b409SShawn Tu 	struct hi847 *hi847 = to_hi847(sd);
2695da15b409SShawn Tu 	const struct hi847_mode *mode;
2696da15b409SShawn Tu 	s32 vblank_def, h_blank;
2697da15b409SShawn Tu 
2698da15b409SShawn Tu 	mode = v4l2_find_nearest_size(supported_modes,
2699da15b409SShawn Tu 				      ARRAY_SIZE(supported_modes), width,
2700da15b409SShawn Tu 				      height, fmt->format.width,
2701da15b409SShawn Tu 				      fmt->format.height);
2702da15b409SShawn Tu 
2703da15b409SShawn Tu 	mutex_lock(&hi847->mutex);
2704da15b409SShawn Tu 	hi847_assign_pad_format(mode, &fmt->format);
2705da15b409SShawn Tu 	if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) {
2706da15b409SShawn Tu 		*v4l2_subdev_get_try_format(sd, sd_state, fmt->pad) =
2707da15b409SShawn Tu 			fmt->format;
2708da15b409SShawn Tu 	} else {
2709da15b409SShawn Tu 		hi847->cur_mode = mode;
2710da15b409SShawn Tu 		__v4l2_ctrl_s_ctrl(hi847->link_freq, mode->link_freq_index);
2711da15b409SShawn Tu 		__v4l2_ctrl_s_ctrl_int64(hi847->pixel_rate,
2712da15b409SShawn Tu 					 to_pixel_rate(mode->link_freq_index));
2713da15b409SShawn Tu 
2714da15b409SShawn Tu 		/* Update limits and set FPS to default */
2715da15b409SShawn Tu 		vblank_def = mode->fll_def - mode->height;
2716da15b409SShawn Tu 		__v4l2_ctrl_modify_range(hi847->vblank,
2717da15b409SShawn Tu 					 mode->fll_min - mode->height,
2718da15b409SShawn Tu 					 HI847_FLL_MAX - mode->height, 1,
2719da15b409SShawn Tu 					 vblank_def);
2720da15b409SShawn Tu 		__v4l2_ctrl_s_ctrl(hi847->vblank, vblank_def);
2721da15b409SShawn Tu 
2722da15b409SShawn Tu 		h_blank = hi847->cur_mode->llp - hi847->cur_mode->width;
2723da15b409SShawn Tu 
2724da15b409SShawn Tu 		__v4l2_ctrl_modify_range(hi847->hblank, h_blank, h_blank, 1,
2725da15b409SShawn Tu 					 h_blank);
2726da15b409SShawn Tu 	}
2727da15b409SShawn Tu 
2728da15b409SShawn Tu 	mutex_unlock(&hi847->mutex);
2729da15b409SShawn Tu 
2730da15b409SShawn Tu 	return 0;
2731da15b409SShawn Tu }
2732da15b409SShawn Tu 
hi847_get_format(struct v4l2_subdev * sd,struct v4l2_subdev_state * sd_state,struct v4l2_subdev_format * fmt)2733da15b409SShawn Tu static int hi847_get_format(struct v4l2_subdev *sd,
2734da15b409SShawn Tu 			    struct v4l2_subdev_state *sd_state,
2735da15b409SShawn Tu 			    struct v4l2_subdev_format *fmt)
2736da15b409SShawn Tu {
2737da15b409SShawn Tu 	struct hi847 *hi847 = to_hi847(sd);
2738da15b409SShawn Tu 
2739da15b409SShawn Tu 	mutex_lock(&hi847->mutex);
2740da15b409SShawn Tu 	if (fmt->which == V4L2_SUBDEV_FORMAT_TRY)
2741da15b409SShawn Tu 		fmt->format = *v4l2_subdev_get_try_format(&hi847->sd,
2742da15b409SShawn Tu 							  sd_state,
2743da15b409SShawn Tu 							  fmt->pad);
2744da15b409SShawn Tu 	else
2745da15b409SShawn Tu 		hi847_assign_pad_format(hi847->cur_mode, &fmt->format);
2746da15b409SShawn Tu 
2747da15b409SShawn Tu 	mutex_unlock(&hi847->mutex);
2748da15b409SShawn Tu 
2749da15b409SShawn Tu 	return 0;
2750da15b409SShawn Tu }
2751da15b409SShawn Tu 
hi847_enum_mbus_code(struct v4l2_subdev * sd,struct v4l2_subdev_state * sd_state,struct v4l2_subdev_mbus_code_enum * code)2752da15b409SShawn Tu static int hi847_enum_mbus_code(struct v4l2_subdev *sd,
2753da15b409SShawn Tu 				struct v4l2_subdev_state *sd_state,
2754da15b409SShawn Tu 				struct v4l2_subdev_mbus_code_enum *code)
2755da15b409SShawn Tu {
2756da15b409SShawn Tu 	if (code->index > 0)
2757da15b409SShawn Tu 		return -EINVAL;
2758da15b409SShawn Tu 
2759da15b409SShawn Tu 	code->code = MEDIA_BUS_FMT_SGRBG10_1X10;
2760da15b409SShawn Tu 
2761da15b409SShawn Tu 	return 0;
2762da15b409SShawn Tu }
2763da15b409SShawn Tu 
hi847_enum_frame_size(struct v4l2_subdev * sd,struct v4l2_subdev_state * sd_state,struct v4l2_subdev_frame_size_enum * fse)2764da15b409SShawn Tu static int hi847_enum_frame_size(struct v4l2_subdev *sd,
2765da15b409SShawn Tu 				 struct v4l2_subdev_state *sd_state,
2766da15b409SShawn Tu 				 struct v4l2_subdev_frame_size_enum *fse)
2767da15b409SShawn Tu {
2768da15b409SShawn Tu 	if (fse->index >= ARRAY_SIZE(supported_modes))
2769da15b409SShawn Tu 		return -EINVAL;
2770da15b409SShawn Tu 
2771da15b409SShawn Tu 	if (fse->code != MEDIA_BUS_FMT_SGRBG10_1X10)
2772da15b409SShawn Tu 		return -EINVAL;
2773da15b409SShawn Tu 
2774da15b409SShawn Tu 	fse->min_width = supported_modes[fse->index].width;
2775da15b409SShawn Tu 	fse->max_width = fse->min_width;
2776da15b409SShawn Tu 	fse->min_height = supported_modes[fse->index].height;
2777da15b409SShawn Tu 	fse->max_height = fse->min_height;
2778da15b409SShawn Tu 
2779da15b409SShawn Tu 	return 0;
2780da15b409SShawn Tu }
2781da15b409SShawn Tu 
hi847_open(struct v4l2_subdev * sd,struct v4l2_subdev_fh * fh)2782da15b409SShawn Tu static int hi847_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
2783da15b409SShawn Tu {
2784da15b409SShawn Tu 	struct hi847 *hi847 = to_hi847(sd);
2785da15b409SShawn Tu 
2786da15b409SShawn Tu 	mutex_lock(&hi847->mutex);
2787da15b409SShawn Tu 	hi847_assign_pad_format(&supported_modes[0],
2788da15b409SShawn Tu 				v4l2_subdev_get_try_format(sd, fh->state, 0));
2789da15b409SShawn Tu 	mutex_unlock(&hi847->mutex);
2790da15b409SShawn Tu 
2791da15b409SShawn Tu 	return 0;
2792da15b409SShawn Tu }
2793da15b409SShawn Tu 
2794da15b409SShawn Tu static const struct v4l2_subdev_video_ops hi847_video_ops = {
2795da15b409SShawn Tu 	.s_stream = hi847_set_stream,
2796da15b409SShawn Tu };
2797da15b409SShawn Tu 
2798da15b409SShawn Tu static const struct v4l2_subdev_pad_ops hi847_pad_ops = {
2799da15b409SShawn Tu 	.set_fmt = hi847_set_format,
2800da15b409SShawn Tu 	.get_fmt = hi847_get_format,
2801da15b409SShawn Tu 	.enum_mbus_code = hi847_enum_mbus_code,
2802da15b409SShawn Tu 	.enum_frame_size = hi847_enum_frame_size,
2803da15b409SShawn Tu };
2804da15b409SShawn Tu 
2805da15b409SShawn Tu static const struct v4l2_subdev_ops hi847_subdev_ops = {
2806da15b409SShawn Tu 	.video = &hi847_video_ops,
2807da15b409SShawn Tu 	.pad = &hi847_pad_ops,
2808da15b409SShawn Tu };
2809da15b409SShawn Tu 
2810da15b409SShawn Tu static const struct media_entity_operations hi847_subdev_entity_ops = {
2811da15b409SShawn Tu 	.link_validate = v4l2_subdev_link_validate,
2812da15b409SShawn Tu };
2813da15b409SShawn Tu 
2814da15b409SShawn Tu static const struct v4l2_subdev_internal_ops hi847_internal_ops = {
2815da15b409SShawn Tu 	.open = hi847_open,
2816da15b409SShawn Tu };
2817da15b409SShawn Tu 
hi847_identify_module(struct hi847 * hi847)2818da15b409SShawn Tu static int hi847_identify_module(struct hi847 *hi847)
2819da15b409SShawn Tu {
2820da15b409SShawn Tu 	struct i2c_client *client = v4l2_get_subdevdata(&hi847->sd);
2821da15b409SShawn Tu 	int ret;
2822da15b409SShawn Tu 	u32 val;
2823da15b409SShawn Tu 
2824da15b409SShawn Tu 	ret = hi847_read_reg(hi847, HI847_REG_CHIP_ID,
2825da15b409SShawn Tu 			     HI847_REG_VALUE_16BIT, &val);
2826da15b409SShawn Tu 	if (ret)
2827da15b409SShawn Tu 		return ret;
2828da15b409SShawn Tu 
2829da15b409SShawn Tu 	if (val != HI847_CHIP_ID) {
2830da15b409SShawn Tu 		dev_err(&client->dev, "chip id mismatch: %x!=%x",
2831da15b409SShawn Tu 			HI847_CHIP_ID, val);
2832da15b409SShawn Tu 		return -ENXIO;
2833da15b409SShawn Tu 	}
2834da15b409SShawn Tu 
2835da15b409SShawn Tu 	return 0;
2836da15b409SShawn Tu }
2837da15b409SShawn Tu 
hi847_check_hwcfg(struct device * dev)2838da15b409SShawn Tu static int hi847_check_hwcfg(struct device *dev)
2839da15b409SShawn Tu {
2840da15b409SShawn Tu 	struct fwnode_handle *ep;
2841da15b409SShawn Tu 	struct fwnode_handle *fwnode = dev_fwnode(dev);
2842da15b409SShawn Tu 	struct v4l2_fwnode_endpoint bus_cfg = {
2843da15b409SShawn Tu 		.bus_type = V4L2_MBUS_CSI2_DPHY
2844da15b409SShawn Tu 	};
2845da15b409SShawn Tu 	u32 mclk;
2846da15b409SShawn Tu 	int ret;
2847da15b409SShawn Tu 	unsigned int i, j;
2848da15b409SShawn Tu 
2849da15b409SShawn Tu 	if (!fwnode)
2850da15b409SShawn Tu 		return -ENXIO;
2851da15b409SShawn Tu 
2852da15b409SShawn Tu 	ret = fwnode_property_read_u32(fwnode, "clock-frequency", &mclk);
2853da15b409SShawn Tu 	if (ret) {
2854da15b409SShawn Tu 		dev_err(dev, "can't get clock frequency");
2855da15b409SShawn Tu 		return ret;
2856da15b409SShawn Tu 	}
2857da15b409SShawn Tu 
2858da15b409SShawn Tu 	if (mclk != HI847_MCLK) {
2859da15b409SShawn Tu 		dev_err(dev, "external clock %d is not supported", mclk);
2860da15b409SShawn Tu 		return -EINVAL;
2861da15b409SShawn Tu 	}
2862da15b409SShawn Tu 
2863da15b409SShawn Tu 	ep = fwnode_graph_get_next_endpoint(fwnode, NULL);
2864da15b409SShawn Tu 	if (!ep)
2865da15b409SShawn Tu 		return -ENXIO;
2866da15b409SShawn Tu 
2867da15b409SShawn Tu 	ret = v4l2_fwnode_endpoint_alloc_parse(ep, &bus_cfg);
2868da15b409SShawn Tu 	fwnode_handle_put(ep);
2869da15b409SShawn Tu 	if (ret)
2870da15b409SShawn Tu 		return ret;
2871da15b409SShawn Tu 
2872da15b409SShawn Tu 	if (bus_cfg.bus.mipi_csi2.num_data_lanes != HI847_DATA_LANES) {
2873da15b409SShawn Tu 		dev_err(dev, "number of CSI2 data lanes %d is not supported",
2874da15b409SShawn Tu 			bus_cfg.bus.mipi_csi2.num_data_lanes);
2875da15b409SShawn Tu 		ret = -EINVAL;
2876da15b409SShawn Tu 		goto check_hwcfg_error;
2877da15b409SShawn Tu 	}
2878da15b409SShawn Tu 
2879da15b409SShawn Tu 	if (!bus_cfg.nr_of_link_frequencies) {
2880da15b409SShawn Tu 		dev_err(dev, "no link frequencies defined");
2881da15b409SShawn Tu 		ret = -EINVAL;
2882da15b409SShawn Tu 		goto check_hwcfg_error;
2883da15b409SShawn Tu 	}
2884da15b409SShawn Tu 
2885da15b409SShawn Tu 	for (i = 0; i < ARRAY_SIZE(link_freq_menu_items); i++) {
2886da15b409SShawn Tu 		for (j = 0; j < bus_cfg.nr_of_link_frequencies; j++) {
2887da15b409SShawn Tu 			if (link_freq_menu_items[i] ==
2888da15b409SShawn Tu 				bus_cfg.link_frequencies[j])
2889da15b409SShawn Tu 				break;
2890da15b409SShawn Tu 		}
2891da15b409SShawn Tu 
2892da15b409SShawn Tu 		if (j == bus_cfg.nr_of_link_frequencies) {
2893da15b409SShawn Tu 			dev_err(dev, "no link frequency %lld supported",
2894da15b409SShawn Tu 				link_freq_menu_items[i]);
2895da15b409SShawn Tu 			ret = -EINVAL;
2896da15b409SShawn Tu 			goto check_hwcfg_error;
2897da15b409SShawn Tu 		}
2898da15b409SShawn Tu 	}
2899da15b409SShawn Tu 
2900da15b409SShawn Tu check_hwcfg_error:
2901da15b409SShawn Tu 	v4l2_fwnode_endpoint_free(&bus_cfg);
2902da15b409SShawn Tu 
2903da15b409SShawn Tu 	return ret;
2904da15b409SShawn Tu }
2905da15b409SShawn Tu 
hi847_remove(struct i2c_client * client)2906ed5c2f5fSUwe Kleine-König static void hi847_remove(struct i2c_client *client)
2907da15b409SShawn Tu {
2908da15b409SShawn Tu 	struct v4l2_subdev *sd = i2c_get_clientdata(client);
2909da15b409SShawn Tu 	struct hi847 *hi847 = to_hi847(sd);
2910da15b409SShawn Tu 
2911da15b409SShawn Tu 	v4l2_async_unregister_subdev(sd);
2912da15b409SShawn Tu 	media_entity_cleanup(&sd->entity);
2913da15b409SShawn Tu 	v4l2_ctrl_handler_free(sd->ctrl_handler);
2914da15b409SShawn Tu 	pm_runtime_disable(&client->dev);
2915da15b409SShawn Tu 	mutex_destroy(&hi847->mutex);
2916da15b409SShawn Tu }
2917da15b409SShawn Tu 
hi847_probe(struct i2c_client * client)2918da15b409SShawn Tu static int hi847_probe(struct i2c_client *client)
2919da15b409SShawn Tu {
2920da15b409SShawn Tu 	struct hi847 *hi847;
2921da15b409SShawn Tu 	int ret;
2922da15b409SShawn Tu 
2923da15b409SShawn Tu 	hi847 = devm_kzalloc(&client->dev, sizeof(*hi847), GFP_KERNEL);
2924da15b409SShawn Tu 	if (!hi847)
2925da15b409SShawn Tu 		return -ENOMEM;
2926da15b409SShawn Tu 
2927da15b409SShawn Tu 	ret = hi847_check_hwcfg(&client->dev);
2928da15b409SShawn Tu 	if (ret) {
2929da15b409SShawn Tu 		dev_err(&client->dev, "failed to get HW configuration: %d",
2930da15b409SShawn Tu 			ret);
2931da15b409SShawn Tu 		return ret;
2932da15b409SShawn Tu 	}
2933da15b409SShawn Tu 
2934da15b409SShawn Tu 	v4l2_i2c_subdev_init(&hi847->sd, client, &hi847_subdev_ops);
2935da15b409SShawn Tu 	ret = hi847_identify_module(hi847);
2936da15b409SShawn Tu 	if (ret) {
2937da15b409SShawn Tu 		dev_err(&client->dev, "failed to find sensor: %d", ret);
2938da15b409SShawn Tu 		return ret;
2939da15b409SShawn Tu 	}
2940da15b409SShawn Tu 
2941da15b409SShawn Tu 	mutex_init(&hi847->mutex);
2942da15b409SShawn Tu 	hi847->cur_mode = &supported_modes[0];
2943da15b409SShawn Tu 	ret = hi847_init_controls(hi847);
2944da15b409SShawn Tu 	if (ret) {
2945da15b409SShawn Tu 		dev_err(&client->dev, "failed to init controls: %d", ret);
2946da15b409SShawn Tu 		goto probe_error_v4l2_ctrl_handler_free;
2947da15b409SShawn Tu 	}
2948da15b409SShawn Tu 
2949da15b409SShawn Tu 	hi847->sd.internal_ops = &hi847_internal_ops;
2950da15b409SShawn Tu 	hi847->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
2951da15b409SShawn Tu 	hi847->sd.entity.ops = &hi847_subdev_entity_ops;
2952da15b409SShawn Tu 	hi847->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
2953da15b409SShawn Tu 	hi847->pad.flags = MEDIA_PAD_FL_SOURCE;
2954da15b409SShawn Tu 	ret = media_entity_pads_init(&hi847->sd.entity, 1, &hi847->pad);
2955da15b409SShawn Tu 	if (ret) {
2956da15b409SShawn Tu 		dev_err(&client->dev, "failed to init entity pads: %d", ret);
2957da15b409SShawn Tu 		goto probe_error_v4l2_ctrl_handler_free;
2958da15b409SShawn Tu 	}
2959da15b409SShawn Tu 
2960da15b409SShawn Tu 	ret = v4l2_async_register_subdev_sensor(&hi847->sd);
2961da15b409SShawn Tu 	if (ret < 0) {
2962da15b409SShawn Tu 		dev_err(&client->dev, "failed to register V4L2 subdev: %d",
2963da15b409SShawn Tu 			ret);
2964da15b409SShawn Tu 		goto probe_error_media_entity_cleanup;
2965da15b409SShawn Tu 	}
2966da15b409SShawn Tu 
2967da15b409SShawn Tu 	pm_runtime_set_active(&client->dev);
2968da15b409SShawn Tu 	pm_runtime_enable(&client->dev);
2969da15b409SShawn Tu 	pm_runtime_idle(&client->dev);
2970da15b409SShawn Tu 
2971da15b409SShawn Tu 	return 0;
2972da15b409SShawn Tu 
2973da15b409SShawn Tu probe_error_media_entity_cleanup:
2974da15b409SShawn Tu 	media_entity_cleanup(&hi847->sd.entity);
2975da15b409SShawn Tu 
2976da15b409SShawn Tu probe_error_v4l2_ctrl_handler_free:
2977da15b409SShawn Tu 	v4l2_ctrl_handler_free(hi847->sd.ctrl_handler);
2978da15b409SShawn Tu 	mutex_destroy(&hi847->mutex);
2979da15b409SShawn Tu 
2980da15b409SShawn Tu 	return ret;
2981da15b409SShawn Tu }
2982da15b409SShawn Tu 
2983da15b409SShawn Tu static const struct dev_pm_ops hi847_pm_ops = {
2984da15b409SShawn Tu 	SET_SYSTEM_SLEEP_PM_OPS(hi847_suspend, hi847_resume)
2985da15b409SShawn Tu };
2986da15b409SShawn Tu 
2987da15b409SShawn Tu #ifdef CONFIG_ACPI
2988da15b409SShawn Tu static const struct acpi_device_id hi847_acpi_ids[] = {
2989da15b409SShawn Tu 	{"HYV0847"},
2990da15b409SShawn Tu 	{}
2991da15b409SShawn Tu };
2992da15b409SShawn Tu 
2993da15b409SShawn Tu MODULE_DEVICE_TABLE(acpi, hi847_acpi_ids);
2994da15b409SShawn Tu #endif
2995da15b409SShawn Tu 
2996da15b409SShawn Tu static struct i2c_driver hi847_i2c_driver = {
2997da15b409SShawn Tu 	.driver = {
2998da15b409SShawn Tu 		.name = "hi847",
2999da15b409SShawn Tu 		.pm = &hi847_pm_ops,
3000da15b409SShawn Tu 		.acpi_match_table = ACPI_PTR(hi847_acpi_ids),
3001da15b409SShawn Tu 	},
3002aaeb31c0SUwe Kleine-König 	.probe = hi847_probe,
3003da15b409SShawn Tu 	.remove = hi847_remove,
3004da15b409SShawn Tu };
3005da15b409SShawn Tu 
3006da15b409SShawn Tu module_i2c_driver(hi847_i2c_driver);
3007da15b409SShawn Tu 
3008*4106cd72SSakari Ailus MODULE_AUTHOR("Shawn Tu");
3009da15b409SShawn Tu MODULE_DESCRIPTION("Hynix HI847 sensor driver");
3010da15b409SShawn Tu MODULE_LICENSE("GPL v2");
3011