Merge remote-tracking branch 'aosp/android-3.0' into develop-3.0
[firefly-linux-kernel-4.4.55.git] / drivers / media / video / gc2035.c
1 /*\r
2 o* Driver for MT9M001 CMOS Image Sensor from Micron\r
3  *\r
4  * Copyright (C) 2008, Guennadi Liakhovetski <kernel@pengutronix.de>\r
5  *\r
6  * This program is free software; you can redistribute it and/or modify\r
7  * it under the terms of the GNU General Public License version 2 as\r
8  * published by the Free Software Foundation.\r
9  */\r
10 \r
11 #include <linux/videodev2.h>\r
12 #include <linux/slab.h>\r
13 #include <linux/i2c.h>\r
14 #include <linux/log2.h>\r
15 #include <linux/platform_device.h>\r
16 #include <linux/delay.h>\r
17 #include <linux/circ_buf.h>\r
18 #include <linux/miscdevice.h>\r
19 #include <media/v4l2-common.h>\r
20 #include <media/v4l2-chip-ident.h>\r
21 #include <media/soc_camera.h>\r
22 #include <plat/rk_camera.h>\r
23 \r
24 static int debug;\r
25 module_param(debug, int, S_IRUGO|S_IWUSR);\r
26 \r
27 #define dprintk(level, fmt, arg...) do {                        \\r
28         if (debug >= level)                                     \\r
29         printk(KERN_WARNING fmt , ## arg); } while (0)\r
30 \r
31 #define SENSOR_TR(format, ...) printk(KERN_ERR format, ## __VA_ARGS__)\r
32 #define SENSOR_DG(format, ...) dprintk(1, format, ## __VA_ARGS__)\r
33 \r
34 \r
35 #define _CONS(a,b) a##b\r
36 #define CONS(a,b) _CONS(a,b)\r
37 \r
38 #define __STR(x) #x\r
39 #define _STR(x) __STR(x)\r
40 #define STR(x) _STR(x)\r
41 \r
42 #define MIN(x,y)   ((x<y) ? x: y)\r
43 #define MAX(x,y)    ((x>y) ? x: y)\r
44 \r
45 /* Sensor Driver Configuration */\r
46 #define SENSOR_NAME RK29_CAM_SENSOR_GC2035\r
47 #define SENSOR_V4L2_IDENT  V4L2_IDENT_GC2035\r
48 #define SENSOR_ID 0x2035\r
49 #define SENSOR_MIN_WIDTH    640\r
50 #define SENSOR_MIN_HEIGHT   480\r
51 #define SENSOR_MAX_WIDTH    1600\r
52 #define SENSOR_MAX_HEIGHT   1200\r
53 #define SENSOR_INIT_WIDTH       640                     /* Sensor pixel size for sensor_init_data array */\r
54 #define SENSOR_INIT_HEIGHT  480\r
55 #define SENSOR_INIT_WINSEQADR sensor_vga\r
56 #define SENSOR_INIT_PIXFMT V4L2_MBUS_FMT_UYVY8_2X8\r
57 \r
58 #define CONFIG_SENSOR_WhiteBalance      1\r
59 #define CONFIG_SENSOR_Brightness        0\r
60 #define CONFIG_SENSOR_Contrast      0\r
61 #define CONFIG_SENSOR_Saturation    0\r
62 #define CONFIG_SENSOR_Effect        1\r
63 #define CONFIG_SENSOR_Scene         1\r
64 #define CONFIG_SENSOR_DigitalZoom   0\r
65 #define CONFIG_SENSOR_Focus         0\r
66 #define CONFIG_SENSOR_Exposure      0\r
67 #define CONFIG_SENSOR_Flash         1\r
68 #define CONFIG_SENSOR_Mirror        0\r
69 #define CONFIG_SENSOR_Flip          0\r
70 \r
71 #define CONFIG_SENSOR_I2C_SPEED     250000       /* Hz */\r
72 /* Sensor write register continues by preempt_disable/preempt_enable for current process not be scheduled */\r
73 #define CONFIG_SENSOR_I2C_NOSCHED   0\r
74 #define CONFIG_SENSOR_I2C_RDWRCHK   0\r
75 \r
76 #define SENSOR_BUS_PARAM  (SOCAM_MASTER | SOCAM_PCLK_SAMPLE_RISING |\\r
77                           SOCAM_HSYNC_ACTIVE_HIGH | SOCAM_VSYNC_ACTIVE_HIGH |\\r
78                           SOCAM_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8  |SOCAM_MCLK_24MHZ)\r
79 \r
80 #define COLOR_TEMPERATURE_CLOUDY_DN  6500\r
81 #define COLOR_TEMPERATURE_CLOUDY_UP    8000\r
82 #define COLOR_TEMPERATURE_CLEARDAY_DN  5000\r
83 #define COLOR_TEMPERATURE_CLEARDAY_UP    6500\r
84 #define COLOR_TEMPERATURE_OFFICE_DN     3500\r
85 #define COLOR_TEMPERATURE_OFFICE_UP     5000\r
86 #define COLOR_TEMPERATURE_HOME_DN       2500\r
87 #define COLOR_TEMPERATURE_HOME_UP       3500\r
88 \r
89 #define SENSOR_NAME_STRING(a) STR(CONS(SENSOR_NAME, a))\r
90 #define SENSOR_NAME_VARFUN(a) CONS(SENSOR_NAME, a)\r
91 \r
92 #define SENSOR_AF_IS_ERR    (0x00<<0)\r
93 #define SENSOR_AF_IS_OK         (0x01<<0)\r
94 #define SENSOR_INIT_IS_ERR   (0x00<<28)\r
95 #define SENSOR_INIT_IS_OK    (0x01<<28)\r
96 \r
97 struct reginfo\r
98 {\r
99     u8 reg;\r
100     u8 val;\r
101 };\r
102 \r
103 //flash off in fixed time to prevent from too hot , zyc\r
104 struct  flash_timer{\r
105     struct soc_camera_device *icd;\r
106         struct hrtimer timer;\r
107 };\r
108 static enum hrtimer_restart flash_off_func(struct hrtimer *timer);\r
109 \r
110 static struct  flash_timer flash_off_timer;\r
111 //for user defined if user want to customize the series , zyc\r
112 #ifdef CONFIG_GC2035_USER_DEFINED_SERIES\r
113 #include "gc2035_user_series.c"\r
114 #else\r
115 /* init 352X288 SVGA */\r
116 static struct reginfo sensor_init_data[] ={\r
117 {0xfe,0x80},\r
118 {0xfe,0x80},\r
119 {0xfe,0x80},\r
120 {0xfe,0x80},\r
121 {0xfc,0x06},\r
122 {0xf9,0xfe}, //[0] pll enable\r
123 {0xfa,0x00},\r
124 {0xf6,0x00},\r
125 {0xf7,0x17}, //pll enable\r
126 {0xf8,0x00},\r
127 {0xfe,0x00},\r
128 {0x82,0x00},\r
129 {0xb3,0x60},\r
130 {0xb4,0x40},\r
131 {0xb5,0x60},\r
132 {0x03,0x05},\r
133 {0x04,0x2e},\r
134 \r
135 //measure window\r
136 {0xfe,0x00},\r
137 {0xec,0x04},\r
138 {0xed,0x04},\r
139 {0xee,0x60},\r
140 {0xef,0x90},\r
141 \r
142 \r
143 \r
144 {0x0a,0x00}, //row start\r
145 {0x0c,0x00}, //col start\r
146 \r
147 {0x0d,0x04},\r
148 {0x0e,0xc0},\r
149 {0x0f,0x06}, //Window setting\r
150 {0x10,0x58},// \r
151 \r
152 {0x17,0x14}, //[0]mirror [1]flip\r
153 {0x18,0x0a}, //sdark 4 row in even frame??\r
154 {0x19,0x0a}, //AD pipe number\r
155 \r
156 {0x1a,0x01}, //CISCTL mode4\r
157 {0x1b,0x48},\r
158 {0x1e,0x88}, //analog mode1 [7] tx-high en\r
159 {0x1f,0x0f}, //analog mode2\r
160 \r
161 {0x20,0x05}, //[0]adclk mode  [1]rowclk_MODE [2]rsthigh_en\r
162 {0x21,0x0f}, //[3]txlow_en\r
163 {0x22,0xf0}, //[3:0]vref\r
164 {0x23,0xc3}, //f3//ADC_r\r
165 {0x24,0x16}, //pad drive\r
166 \r
167 //==============================aec\r
168 //AEC\r
169 {0xfe,0x01},\r
170 {0x09,0x00},\r
171 \r
172 {0x11,0x10},\r
173 {0x47,0x30},\r
174 {0x0b,0x90},\r
175 {0x13,0x85}, //0x75 0x80\r
176 {0x1f,0xc0},//addd\r
177 {0x20,0x56},//add  0x60\r
178 {0xfe,0x00},\r
179 {0xf7,0x17}, //pll enable\r
180 {0xf8,0x00},\r
181 {0x05,0x01},\r
182 {0x06,0x18},\r
183 {0x07,0x00},\r
184 {0x08,0x48},\r
185 {0xfe,0x01},\r
186 {0x27,0x00},\r
187 {0x28,0x6a},\r
188 {0x29,0x03},\r
189 {0x2a,0x50},//8fps\r
190 {0x2b,0x04},\r
191 {0x2c,0xf8},\r
192 {0x2d,0x06},\r
193 {0x2e,0xa0},//6fps\r
194 {0x3e,0x00},//0x40                   \r
195 {0xfe,0x00},           \r
196 {0xb6,0x03}, //AEC enable\r
197 {0xfe,0x00},\r
198 \r
199 ///////BLK\r
200 \r
201 {0x3f,0x00}, //prc close???\r
202 {0x40,0x77}, // a7 77\r
203 {0x42,0x7f},\r
204 {0x43,0x2b},//0x30 \r
205 \r
206 {0x5c,0x08},\r
207 //{0x6c  3a //manual_offset ,real B channel\r
208 //{0x6d  3a//manual_offset ,real B channel\r
209 //{0x6e  36//manual_offset ,real R channel\r
210 //{0x6f  36//manual_offset ,real R channel\r
211 {0x5e,0x1f},//0x20\r
212 {0x5f,0x1f},//0x20\r
213 {0x60,0x20},\r
214 {0x61,0x20},\r
215 {0x62,0x20},\r
216 {0x63,0x20},\r
217 {0x64,0x20},\r
218 {0x65,0x20},\r
219 {0x66,0x20},\r
220 {0x67,0x20},\r
221 {0x68,0x20},\r
222 {0x69,0x20},\r
223 \r
224 /////crop// \r
225 {0x90,0x01},  //crop enable\r
226 {0x95,0x04},  //1600x1200\r
227 {0x96,0xb0},\r
228 {0x97,0x06},\r
229 {0x98,0x40},\r
230 \r
231 {0xfe,0x03},\r
232 {0x42,0x80}, \r
233 {0x43,0x06}, //output buf width //buf widthÕâÒ»¿éµÄÅäÖû¹ÐèÒª¸ãÇå³þ\r
234 {0x41,0x00}, // delay\r
235 {0x40,0x00}, //fifo half full trig\r
236 {0x17,0x01}, //wid mipi²¿·ÖµÄ·ÖƵÊÇΪʲôv£¿\r
237 {0xfe,0x00},\r
238 \r
239 {0x80,0xff},//block enable 0xff\r
240 {0x81,0x26},//38  //skin_Y 8c_debug\r
241 \r
242 {0x03,0x05},\r
243 {0x04,0x2e}, \r
244 {0x84,0x00}, //output put foramat\r
245 {0x86,0x03}, //sync plority\r
246 {0x87,0x80}, //middle gamma on\r
247 {0x8b,0xbc},//debug modeÐèÒª¸ãÇå³þÒ»ÏÂ\r
248 {0xa7,0x80},//B_channel_gain\r
249 {0xa8,0x80},//B_channel_gain\r
250 {0xb0,0x80}, //globle gain\r
251 {0xc0,0x40},\r
252 \r
253 #if 0\r
254 //lsc,\r
255 {0xfe,0x01},\r
256 {0xc2,0x3a},\r
257 {0xc3,0x27},\r
258 {0xc4,0x21},\r
259 {0xc8,0x2a},\r
260 {0xc9,0x2a},\r
261 {0xca,0x1b},\r
262 {0xbc,0x4d},\r
263 {0xbd,0x2c},\r
264 {0xbe,0x28},\r
265 {0xb6,0x5a},\r
266 {0xb7,0x4e},\r
267 {0xb8,0x2a},\r
268 {0xc5,0x00},\r
269 {0xc6,0x00},\r
270 {0xc7,0x06},\r
271 {0xcb,0x00},\r
272 {0xcc,0x1e},\r
273 {0xcd,0x00},\r
274 {0xbf,0x08},\r
275 {0xc0,0x00},\r
276 {0xc1,0x05},\r
277 {0xb9,0x07},\r
278 {0xba,0x22},\r
279 {0xbb,0x06},\r
280 {0xaa,0x0b},\r
281 {0xab,0x07},\r
282 {0xac,0x04},\r
283 {0xad,0x0f},\r
284 {0xae,0x00},\r
285 {0xaf,0x09},\r
286 {0xb0,0x17},\r
287 {0xb1,0x06},\r
288 {0xb2,0x04},\r
289 {0xb3,0x14},\r
290 {0xb4,0x01},\r
291 {0xb5,0x00},\r
292 {0xd0,0x17},\r
293 {0xd2,0x22},\r
294 {0xd3,0x33},\r
295 {0xd8,0x41},\r
296 {0xda,0x0d},\r
297 {0xdb,0x0b},\r
298 {0xdc,0x29},\r
299 {0xde,0x00},\r
300 {0xdf,0x15},\r
301 {0xd4,0x09},\r
302 {0xd6,0x1e},\r
303 {0xd7,0x3a},\r
304 {0xa4,0x30},\r
305 {0xa5,0x00},\r
306 {0xa6,0x60},\r
307 {0xa7,0x12},\r
308 {0xa8,0x44},\r
309 {0xa9,0x74},\r
310 {0xa1,0x80},\r
311 {0xa2,0x80},\r
312 \r
313 {0xfe,0x02},\r
314 {0xa4,0x00},\r
315 {0xfe,0x00},\r
316 \r
317 {0xfe,0x02},\r
318 {0xc0,0x01},\r
319 {0xc1,0x40},  //Green_cc\r
320 {0xc2,0xfc},\r
321 {0xc3,0x05},\r
322 {0xc4,0xec},\r
323 {0xc5,0x42},\r
324 {0xc6,0xf8},\r
325 {0xc7,0x46},\r
326 {0xc8,0xfd},\r
327 {0xc9,0xfd},\r
328 {0xca,0xfd},\r
329 {0xcb,0x46},\r
330 {0xcc,0xfd},\r
331 {0xcd,0x46},\r
332 {0xce,0xfd},\r
333 {0xcf,0xfd},\r
334 {0xe3,0xfd},\r
335 {0xe4,0x46},\r
336 {0xe5,0xfd},\r
337 {0xfe,0x00},\r
338 //awb\r
339 {0xfe,0x01},\r
340 {0x4f,0x00}, \r
341 {0x4d,0x10}, ////////////////10\r
342 {0x4e,0x00},\r
343 {0x4e,0x00},\r
344 {0x4e,0x00},\r
345 {0x4e,0x00},\r
346 {0x4e,0x00},\r
347 {0x4e,0x00},\r
348 {0x4e,0x00},\r
349 {0x4e,0x00},\r
350 {0x4e,0x00},\r
351 {0x4e,0x00},\r
352 {0x4e,0x00},\r
353 {0x4e,0x00},\r
354 {0x4e,0x00},\r
355 {0x4e,0x00},\r
356 {0x4e,0x00},\r
357 {0x4e,0x00},\r
358 {0x4d,0x20},  ///////////////20\r
359 {0x4e,0x00},\r
360 {0x4e,0x00},\r
361 {0x4e,0x00},\r
362 {0x4e,0x00},\r
363 {0x4e,0x00},\r
364 {0x4e,0x00},\r
365 {0x4e,0x00},\r
366 {0x4e,0x00},\r
367 {0x4e,0x00},\r
368 {0x4e,0x00},\r
369 {0x4e,0x00},\r
370 {0x4e,0x00},\r
371 {0x4e,0x00},\r
372 {0x4e,0x00},\r
373 {0x4e,0x00},\r
374 {0x4e,0x00},\r
375 {0x4d,0x30}, //////////////////30\r
376 {0x4e,0x00},\r
377 {0x4e,0x00},\r
378 {0x4e,0x00},\r
379 {0x4e,0x00},\r
380 {0x4e,0x00},   \r
381 {0x4e,0x04},  //d50\r
382 {0x4e,0x02},  // d65\r
383 {0x4e,0x00},\r
384 {0x4e,0x00},\r
385 {0x4e,0x00},\r
386 {0x4e,0x00},\r
387 {0x4e,0x00},\r
388 {0x4e,0x00},\r
389 {0x4e,0x00},\r
390 {0x4e,0x00},\r
391 {0x4e,0x00},\r
392 {0x4e,0x00},\r
393 {0x4d,0x40},  //////////////////////40\r
394 {0x4e,0x00},\r
395 {0x4e,0x00},\r
396 {0x4e,0x08},  //cwf\r
397 {0x4e,0x08},  // cwf \r
398 {0x4e,0x00},\r
399 {0x4e,0x00},\r
400 {0x4e,0x00},\r
401 {0x4e,0x00},\r
402 {0x4e,0x00},\r
403 {0x4e,0x00},\r
404 {0x4e,0x00},\r
405 {0x4e,0x00},\r
406 {0x4e,0x00},\r
407 {0x4e,0x00},\r
408 {0x4e,0x00},\r
409 {0x4e,0x00},\r
410 {0x4d,0x50}, //////////////////50\r
411 {0x4e,0x00},  \r
412 {0x4e,0x00},\r
413 {0x4e,0x00},  \r
414 {0x4e,0x10},  // tl84 \r
415 {0x4e,0x00},\r
416 {0x4e,0x00},\r
417 {0x4e,0x00},\r
418 {0x4e,0x00},\r
419 {0x4e,0x00},\r
420 {0x4e,0x00},\r
421 {0x4e,0x00},\r
422 {0x4e,0x00},\r
423 {0x4e,0x00},\r
424 {0x4e,0x00},\r
425 {0x4e,0x00},\r
426 {0x4e,0x00},\r
427 {0x4d,0x60}, /////////////////60\r
428 {0x4e,0x00},    \r
429 {0x4e,0x00},      \r
430 {0x4e,0x00},  \r
431 {0x4e,0x00},\r
432 {0x4e,0x00},\r
433 {0x4e,0x00},\r
434 {0x4e,0x00},\r
435 {0x4e,0x00},\r
436 {0x4e,0x00},\r
437 {0x4e,0x00},\r
438 {0x4e,0x00},\r
439 {0x4e,0x00},\r
440 {0x4e,0x00},\r
441 {0x4e,0x00},\r
442 {0x4e,0x00},\r
443 {0x4e,0x00},\r
444 {0x4d,0x70}, ///////////////////70\r
445 {0x4e,0x00},  \r
446 {0x4e,0x00},  \r
447 {0x4e,0x20},  // a \r
448 {0x4e,0x00},\r
449 {0x4e,0x00},\r
450 {0x4e,0x00},\r
451 {0x4e,0x00},\r
452 {0x4e,0x00},\r
453 {0x4e,0x00},\r
454 {0x4e,0x00},\r
455 {0x4e,0x00},\r
456 {0x4e,0x00},\r
457 {0x4e,0x00},\r
458 {0x4e,0x00},\r
459 {0x4e,0x00},\r
460 {0x4e,0x00},\r
461 {0x4d,0x80}, /////////////////////80\r
462 {0x4e,0x40}, //H\r
463 {0x4e,0x40},  // h\r
464 {0x4e,0x20},  //A\r
465 {0x4e,0x00},\r
466 {0x4e,0x00},\r
467 {0x4e,0x00},\r
468 {0x4e,0x00},\r
469 {0x4e,0x00},\r
470 {0x4e,0x00},\r
471 {0x4e,0x00},\r
472 {0x4e,0x00},\r
473 {0x4e,0x00},\r
474 {0x4e,0x00},\r
475 {0x4e,0x00},\r
476 {0x4e,0x00},\r
477 {0x4e,0x00},\r
478 {0x4d,0x90}, //////////////////////90\r
479 {0x4e,0x00},  // h\r
480 {0x4e,0x00},\r
481 {0x4e,0x00}, \r
482 {0x4e,0x00},\r
483 {0x4e,0x00},\r
484 {0x4e,0x00},\r
485 {0x4e,0x00},\r
486 {0x4e,0x00},\r
487 {0x4e,0x00},\r
488 {0x4e,0x00},\r
489 {0x4e,0x00},\r
490 {0x4e,0x00},\r
491 {0x4e,0x00},\r
492 {0x4e,0x00},\r
493 {0x4e,0x00},\r
494 {0x4e,0x00},\r
495 {0x4d,0xa0}, /////////////////a0\r
496 {0x4e,0x00},\r
497 {0x4e,0x00},\r
498 {0x4e,0x00},\r
499 {0x4e,0x00},\r
500 {0x4e,0x00},\r
501 {0x4e,0x00},\r
502 {0x4e,0x00},\r
503 {0x4e,0x00},\r
504 {0x4e,0x00},\r
505 {0x4e,0x00},\r
506 {0x4e,0x00},\r
507 {0x4e,0x00},\r
508 {0x4e,0x00},\r
509 {0x4e,0x00},\r
510 {0x4e,0x00},\r
511 {0x4e,0x00},\r
512 {0x4d,0xb0}, //////////////////////////////////b0\r
513 {0x4e,0x00},\r
514 {0x4e,0x00},\r
515 {0x4e,0x00},\r
516 {0x4e,0x00}, \r
517 {0x4e,0x00},\r
518 {0x4e,0x00},\r
519 {0x4e,0x00},\r
520 {0x4e,0x00},\r
521 {0x4e,0x00},\r
522 {0x4e,0x00},\r
523 {0x4e,0x00},\r
524 {0x4e,0x00},\r
525 {0x4e,0x00},\r
526 {0x4e,0x00},\r
527 {0x4e,0x00},\r
528 {0x4e,0x00},\r
529 {0x4d,0xc0}, //////////////////////////////////c0\r
530 {0x4e,0x00},\r
531 {0x4e,0x00},\r
532 {0x4e,0x00}, \r
533 {0x4e,0x00}, \r
534 {0x4e,0x00},\r
535 {0x4e,0x00},\r
536 {0x4e,0x00},\r
537 {0x4e,0x00},\r
538 {0x4e,0x00},\r
539 {0x4e,0x00},\r
540 {0x4e,0x00},\r
541 {0x4e,0x00},\r
542 {0x4e,0x00},\r
543 {0x4e,0x00},\r
544 {0x4e,0x00},\r
545 {0x4e,0x00},\r
546 {0x4d,0xd0}, ////////////////////////////d0\r
547 {0x4e,0x00},\r
548 {0x4e,0x00},\r
549 {0x4e,0x00}, \r
550 {0x4e,0x00},\r
551 {0x4e,0x00},\r
552 {0x4e,0x00},\r
553 {0x4e,0x00},\r
554 {0x4e,0x00},\r
555 {0x4e,0x00},\r
556 {0x4e,0x00},\r
557 {0x4e,0x00},\r
558 {0x4e,0x00},\r
559 {0x4e,0x00},\r
560 {0x4e,0x00},\r
561 {0x4e,0x00},\r
562 {0x4e,0x00}, \r
563 {0x4d,0xe0}, /////////////////////////////////e0\r
564 {0x4e,0x00},\r
565 {0x4e,0x00},\r
566 {0x4e,0x00}, \r
567 {0x4e,0x00}, \r
568 {0x4e,0x00},\r
569 {0x4e,0x00},\r
570 {0x4e,0x00},\r
571 {0x4e,0x00},\r
572 {0x4e,0x00},\r
573 {0x4e,0x00},\r
574 {0x4e,0x00},\r
575 {0x4e,0x00},\r
576 {0x4e,0x00},\r
577 {0x4e,0x00},\r
578 {0x4e,0x00},\r
579 {0x4e,0x00},\r
580 {0x4d,0xf0}, /////////////////////////////////f0\r
581 {0x4e,0x00},\r
582 {0x4e,0x00},\r
583 {0x4e,0x00}, \r
584 {0x4e,0x00}, \r
585 {0x4e,0x00},\r
586 {0x4e,0x00},\r
587 {0x4e,0x00},\r
588 {0x4e,0x00},\r
589 {0x4e,0x00},\r
590 {0x4e,0x00},\r
591 {0x4e,0x00},\r
592 {0x4e,0x00},\r
593 {0x4e,0x00},\r
594 {0x4e,0x00},\r
595 {0x4e,0x00},\r
596 {0x4e,0x00},\r
597 {0x4f,0x01},\r
598 #endif\r
599 //lsc,\r
600 #if 1\r
601 ////ba-wang///\r
602 {0xfe,0x01},\r
603 {0xc2,0x10},//0x1f\r
604 {0xc3,0x04},//0x07\r
605 {0xc4,0x01},//0x03\r
606 {0xc8,0x08},//10\r
607 {0xc9,0x04},//0x0a\r
608 {0xca,0x02},//0x08\r
609 {0xbc,0x16},//0x4a\r
610 {0xbd,0x10},//0x1c\r
611 {0xbe,0x10},//0x1a\r
612 {0xb6,0x10},//0x30\r
613 {0xb7,0x08},//0x1c\r
614 {0xb8,0x06},//0x15\r
615 {0xc5,0x00},\r
616 {0xc6,0x00},\r
617 {0xc7,0x00},\r
618 {0xcb,0x00},\r
619 {0xcc,0x00},\r
620 {0xcd,0x00},\r
621 {0xbf,0x04},//0x0c\r
622 {0xc0,0x00},//0x04\r
623 {0xc1,0x00},\r
624 {0xb9,0x00},\r
625 {0xba,0x00},\r
626 {0xbb,0x00},\r
627 {0xaa,0x00},\r
628 {0xab,0x00},\r
629 {0xac,0x00},\r
630 {0xad,0x00},\r
631 {0xae,0x00},\r
632 {0xaf,0x00},\r
633 {0xb0,0x00},\r
634 {0xb1,0x00},\r
635 {0xb2,0x00},\r
636 {0xb3,0x00},\r
637 {0xb4,0x00},\r
638 {0xb5,0x00},\r
639 {0xd0,0x01},\r
640 {0xd2,0x00},\r
641 {0xd3,0x00},\r
642 {0xd8,0x00},\r
643 {0xda,0x00},\r
644 {0xdb,0x00},\r
645 {0xdc,0x00},\r
646 {0xde,0x00},//0x07\r
647 {0xdf,0x00},\r
648 {0xd4,0x00},\r
649 {0xd6,0x00},\r
650 {0xd7,0x00},\r
651 {0xa4,0x00},\r
652 {0xa5,0x00},\r
653 {0xa6,0x04},\r
654 {0xa7,0x00},\r
655 {0xa8,0x00},\r
656 {0xa9,0x00},\r
657 {0xa1,0x80},\r
658 {0xa2,0x80},\r
659 /*************\r
660 ////ba-wang///\r
661 {0xfe,0x01},\r
662 {0xc2,0x30},//0x44\r
663 {0xc3,0x2e},\r
664 {0xc4,0x2a},\r
665 {0xc8,0x35},\r
666 {0xc9,0x2e},\r
667 {0xca,0x24},\r
668 {0xbc,0x48},//5e\r
669 {0xbd,0x45},\r
670 {0xbe,0x43},\r
671 {0xb6,0x5f},\r
672 {0xb7,0x3e},\r
673 {0xb8,0x2b},\r
674 {0xc5,0x00},\r
675 {0xc6,0x00},\r
676 {0xc7,0x00},\r
677 {0xcb,0x00},\r
678 {0xcc,0x00},\r
679 {0xcd,0x00},\r
680 {0xbf,0x04},//0a\r
681 {0xc0,0x09},\r
682 {0xc1,0x08},\r
683 {0xb9,0x0a},\r
684 {0xba,0x07},\r
685 {0xbb,0x12},\r
686 {0xaa,0x08},// q1 red 19\r
687 {0xab,0x00},//0x03\r
688 {0xac,0x01},\r
689 {0xad,0x06},//0d\r
690 {0xae,0x03},//07\r
691 {0xaf,0x00},\r
692 {0xb0,0x02},//0x05\r
693 {0xb1,0x04},//09\r
694 {0xb2,0x00},\r
695 {0xb3,0x08},//13\r
696 {0xb4,0x06},//0c\r
697 {0xb5,0x00},\r
698 {0xd0,0x20},//54\r
699 {0xd2,0x00},\r
700 {0xd3,0x00},\r
701 {0xd8,0x2f},\r
702 {0xda,0x00},\r
703 {0xdb,0x00},\r
704 {0xdc,0x00},\r
705 {0xde,0x07},\r
706 {0xdf,0x00},\r
707 {0xd4,0x29},\r
708 {0xd6,0x00},\r
709 {0xd7,0x02},\r
710 {0xa4,0x00},\r
711 {0xa5,0x00},\r
712 {0xa6,0x00},\r
713 {0xa7,0x00},\r
714 {0xa8,0x44},\r
715 {0xa9,0x40},\r
716 {0xa1,0x80},\r
717 {0xa2,0x80},\r
718 **************/\r
719 {0xfe,0x02},\r
720 {0xa4,0x00},\r
721 {0xfe,0x00},\r
722 \r
723 {0xfe,0x02},\r
724 {0xc0,0x00},   //0x01\r
725 {0xc1,0x3c},  //0x40 Green_cc\r
726 {0xc2,0xfc},\r
727 {0xc3,0xfd},//0x05\r
728 {0xc4,0x00},//0xec\r
729 {0xc5,0x42},//0x42\r
730 {0xc6,0x00},//0xf8\r
731 \r
732 {0xc7,0x3c},\r
733 {0xc8,0xfc},\r
734 {0xc9,0xfd},\r
735 {0xca,0x00},\r
736 {0xcb,0x42},\r
737 {0xcc,0x00},\r
738 \r
739 {0xcd,0x3c},\r
740 {0xce,0xfc},\r
741 {0xcf,0xfd},\r
742 {0xe3,0x00},\r
743 {0xe4,0x42},\r
744 {0xe5,0x00},\r
745 \r
746 /***\r
747 {0xc7,0x46},\r
748 {0xc8,0xfd},\r
749 {0xc9,0xfd},\r
750 {0xca,0xfd},\r
751 {0xcb,0x46},\r
752 {0xcc,0xfd},\r
753 {0xcd,0x46},\r
754 {0xce,0xfd},\r
755 {0xcf,0xfd},\r
756 {0xe3,0xfd},\r
757 {0xe4,0x46},\r
758 {0xe5,0xfd},\r
759 ***/\r
760 \r
761 {0xfe,0x00},\r
762 //awb\r
763 {0xfe,0x01},\r
764 {0x4f,0x00}, \r
765 {0x4d,0x10}, ////////////////10\r
766 {0x4e,0x00},\r
767 {0x4e,0x00},\r
768 {0x4e,0x00},\r
769 {0x4e,0x00},\r
770 {0x4e,0x00},\r
771 {0x4e,0x00},\r
772 {0x4e,0x00},\r
773 {0x4e,0x00},\r
774 {0x4e,0x00},\r
775 {0x4e,0x00},\r
776 {0x4e,0x00},\r
777 {0x4e,0x00},\r
778 {0x4e,0x00},\r
779 {0x4e,0x00},\r
780 {0x4e,0x00},\r
781 {0x4e,0x00},\r
782 {0x4d,0x20},  ///////////////20\r
783 {0x4e,0x00},\r
784 {0x4e,0x00},\r
785 {0x4e,0x00},\r
786 {0x4e,0x00},\r
787 {0x4e,0x00},\r
788 {0x4e,0x00},\r
789 {0x4e,0x00},\r
790 {0x4e,0x00},\r
791 {0x4e,0x00},\r
792 {0x4e,0x00},\r
793 {0x4e,0x00},\r
794 {0x4e,0x00},\r
795 {0x4e,0x00},\r
796 {0x4e,0x00},\r
797 {0x4e,0x00},\r
798 {0x4e,0x00},\r
799 {0x4d,0x30}, //////////////////30\r
800 {0x4e,0x00},\r
801 {0x4e,0x00},\r
802 {0x4e,0x00},\r
803 {0x4e,0x04},  // office\r
804 {0x4e,0x00},   \r
805 {0x4e,0x02},  // d65\r
806 {0x4e,0x00},\r
807 {0x4e,0x00},\r
808 {0x4e,0x00},\r
809 {0x4e,0x00},\r
810 {0x4e,0x00},\r
811 {0x4e,0x00},\r
812 {0x4e,0x00},\r
813 {0x4e,0x00},\r
814 {0x4e,0x00},\r
815 {0x4e,0x00},\r
816 {0x4d,0x40},  //////////////////////40\r
817 {0x4e,0x00},\r
818 {0x4e,0x00},\r
819 {0x4e,0x00},  // cwf    \r
820 {0x4e,0x08},  // cwf \r
821 {0x4e,0x04},  // d50\r
822 {0x4e,0x00},\r
823 {0x4e,0x00},\r
824 {0x4e,0x00},\r
825 {0x4e,0x00},\r
826 {0x4e,0x00},\r
827 {0x4e,0x00},\r
828 {0x4e,0x00},\r
829 {0x4e,0x00},\r
830 {0x4e,0x00},\r
831 {0x4e,0x00},\r
832 {0x4e,0x00},\r
833 {0x4d,0x50}, //////////////////50\r
834 {0x4e,0x00},  \r
835 {0x4e,0x00},\r
836 {0x4e,0x00},  \r
837 {0x4e,0x10},  // tl84 \r
838 {0x4e,0x00},\r
839 {0x4e,0x00},\r
840 {0x4e,0x00},\r
841 {0x4e,0x00},\r
842 {0x4e,0x00},\r
843 {0x4e,0x00},\r
844 {0x4e,0x00},\r
845 {0x4e,0x00},\r
846 {0x4e,0x00},\r
847 {0x4e,0x00},\r
848 {0x4e,0x00},\r
849 {0x4e,0x00},\r
850 {0x4d,0x60}, /////////////////60\r
851 {0x4e,0x00},    \r
852 {0x4e,0x00},      \r
853 {0x4e,0x00},  \r
854 {0x4e,0x00},\r
855 {0x4e,0x00},\r
856 {0x4e,0x00},\r
857 {0x4e,0x00},\r
858 {0x4e,0x00},\r
859 {0x4e,0x00},\r
860 {0x4e,0x00},\r
861 {0x4e,0x00},\r
862 {0x4e,0x00},\r
863 {0x4e,0x00},\r
864 {0x4e,0x00},\r
865 {0x4e,0x00},\r
866 {0x4e,0x00},\r
867 {0x4d,0x70}, ///////////////////70\r
868 {0x4e,0x00},  \r
869 {0x4e,0x00},  \r
870 {0x4e,0x20},  // a \r
871 {0x4e,0x00},\r
872 {0x4e,0x00},\r
873 {0x4e,0x00},\r
874 {0x4e,0x00},\r
875 {0x4e,0x00},\r
876 {0x4e,0x00},\r
877 {0x4e,0x00},\r
878 {0x4e,0x00},\r
879 {0x4e,0x00},\r
880 {0x4e,0x00},\r
881 {0x4e,0x00},\r
882 {0x4e,0x00},\r
883 {0x4e,0x00},\r
884 {0x4d,0x80}, /////////////////////80\r
885 {0x4e,0x00}, \r
886 {0x4e,0x40},  // h\r
887 {0x4e,0x00}, \r
888 {0x4e,0x00},\r
889 {0x4e,0x00},\r
890 {0x4e,0x00},\r
891 {0x4e,0x00},\r
892 {0x4e,0x00},\r
893 {0x4e,0x00},\r
894 {0x4e,0x00},\r
895 {0x4e,0x00},\r
896 {0x4e,0x00},\r
897 {0x4e,0x00},\r
898 {0x4e,0x00},\r
899 {0x4e,0x00},\r
900 {0x4e,0x00},\r
901 {0x4d,0x90}, //////////////////////90\r
902 {0x4e,0x00},  // h\r
903 {0x4e,0x40},  // h\r
904 {0x4e,0x40},  // h \r
905 {0x4e,0x00},\r
906 {0x4e,0x00},\r
907 {0x4e,0x00},\r
908 {0x4e,0x00},\r
909 {0x4e,0x00},\r
910 {0x4e,0x00},\r
911 {0x4e,0x00},\r
912 {0x4e,0x00},\r
913 {0x4e,0x00},\r
914 {0x4e,0x00},\r
915 {0x4e,0x00},\r
916 {0x4e,0x00},\r
917 {0x4e,0x00},\r
918 {0x4d,0xa0}, /////////////////a0\r
919 {0x4e,0x00},\r
920 {0x4e,0x00},\r
921 {0x4e,0x00},\r
922 {0x4e,0x00},\r
923 {0x4e,0x00},\r
924 {0x4e,0x00},\r
925 {0x4e,0x00},\r
926 {0x4e,0x00},\r
927 {0x4e,0x00},\r
928 {0x4e,0x00},\r
929 {0x4e,0x00},\r
930 {0x4e,0x00},\r
931 {0x4e,0x00},\r
932 {0x4e,0x00},\r
933 {0x4e,0x00},\r
934 {0x4e,0x00},\r
935 {0x4d,0xb0}, //////////////////////////////////b0\r
936 {0x4e,0x00},\r
937 {0x4e,0x00},\r
938 {0x4e,0x00},\r
939 {0x4e,0x00}, \r
940 {0x4e,0x00},\r
941 {0x4e,0x00},\r
942 {0x4e,0x00},\r
943 {0x4e,0x00},\r
944 {0x4e,0x00},\r
945 {0x4e,0x00},\r
946 {0x4e,0x00},\r
947 {0x4e,0x00},\r
948 {0x4e,0x00},\r
949 {0x4e,0x00},\r
950 {0x4e,0x00},\r
951 {0x4e,0x00},\r
952 {0x4d,0xc0}, //////////////////////////////////c0\r
953 {0x4e,0x00},\r
954 {0x4e,0x00},\r
955 {0x4e,0x00}, \r
956 {0x4e,0x00}, \r
957 {0x4e,0x00},\r
958 {0x4e,0x00},\r
959 {0x4e,0x00},\r
960 {0x4e,0x00},\r
961 {0x4e,0x00},\r
962 {0x4e,0x00},\r
963 {0x4e,0x00},\r
964 {0x4e,0x00},\r
965 {0x4e,0x00},\r
966 {0x4e,0x00},\r
967 {0x4e,0x00},\r
968 {0x4e,0x00},\r
969 {0x4d,0xd0}, ////////////////////////////d0\r
970 {0x4e,0x00},\r
971 {0x4e,0x00},\r
972 {0x4e,0x00}, \r
973 {0x4e,0x00},\r
974 {0x4e,0x00},\r
975 {0x4e,0x00},\r
976 {0x4e,0x00},\r
977 {0x4e,0x00},\r
978 {0x4e,0x00},\r
979 {0x4e,0x00},\r
980 {0x4e,0x00},\r
981 {0x4e,0x00},\r
982 {0x4e,0x00},\r
983 {0x4e,0x00},\r
984 {0x4e,0x00},\r
985 {0x4e,0x00}, \r
986 {0x4d,0xe0}, /////////////////////////////////e0\r
987 {0x4e,0x00},\r
988 {0x4e,0x00},\r
989 {0x4e,0x00}, \r
990 {0x4e,0x00}, \r
991 {0x4e,0x00},\r
992 {0x4e,0x00},\r
993 {0x4e,0x00},\r
994 {0x4e,0x00},\r
995 {0x4e,0x00},\r
996 {0x4e,0x00},\r
997 {0x4e,0x00},\r
998 {0x4e,0x00},\r
999 {0x4e,0x00},\r
1000 {0x4e,0x00},\r
1001 {0x4e,0x00},\r
1002 {0x4e,0x00},\r
1003 {0x4d,0xf0}, /////////////////////////////////f0\r
1004 {0x4e,0x00},\r
1005 {0x4e,0x00},\r
1006 {0x4e,0x00}, \r
1007 {0x4e,0x00}, \r
1008 {0x4e,0x00},\r
1009 {0x4e,0x00},\r
1010 {0x4e,0x00},\r
1011 {0x4e,0x00},\r
1012 {0x4e,0x00},\r
1013 {0x4e,0x00},\r
1014 {0x4e,0x00},\r
1015 {0x4e,0x00},\r
1016 {0x4e,0x00},\r
1017 {0x4e,0x00},\r
1018 {0x4e,0x00},\r
1019 {0x4e,0x00},\r
1020 {0x4f,0x01},\r
1021 #endif\r
1022 {0xfe,0x01},\r
1023 {0x50,0xc8},\r
1024 {0x52,0x40},\r
1025 {0x54,0x60},\r
1026 {0x56,0x06},\r
1027 {0x57,0x20}, //pre adjust\r
1028 {0x58,0x01}, \r
1029 {0x5c,0xf0},\r
1030 {0x5d,0x40},\r
1031 {0x5b,0x02}, //AWB_gain_delta\r
1032 {0x61,0xaa},//R/G stand\r
1033 {0x62,0xaa},//R/G stand\r
1034 {0x71,0x00},\r
1035 {0x74,0x10},  //AWB_C_max\r
1036 {0x77,0x08},  //AWB_p2_x\r
1037 {0x78,0xfd}, //AWB_p2_y\r
1038 {0x86,0x30},\r
1039 {0x87,0x00},\r
1040 {0x88,0x06},//04\r
1041 {0x8a,0xc0},//awb move mode\r
1042 {0x89,0x75},\r
1043 {0x84,0x08},  //auto_window\r
1044 {0x8b,0x00},  //awb compare luma\r
1045 {0x8d,0x70}, //awb gain limit R \r
1046 {0x8e,0x70},//G\r
1047 {0x8f,0xf4},//B\r
1048 {0x5e,0xa4},\r
1049 {0x5f,0x60},\r
1050 {0x92,0x58},\r
1051 {0xfe,0x00},\r
1052 {0x82,0x02},//awb_en\r
1053 \r
1054 //{0xfe ,0xec}, luma_value\r
1055 \r
1056 {0xfe,0x01},\r
1057 {0x9c,0x02}, //add abs slope\r
1058 {0x21,0xbf},\r
1059 {0xfe,0x02},\r
1060 {0xa5,0x60}, //lsc_th //40\r
1061 {0xa2,0xc0}, //lsc_dec_slope 0xa0\r
1062 {0xa3,0x30}, //when total gain is bigger than the value, enter dark light mode  0x20 added\r
1063 {0xa4,0x04},//add \r
1064 {0xa6,0x50}, //dd_th\r
1065 {0xa7,0x80}, //ot_th   30\r
1066 {0xab,0x31}, //[0]b_dn_effect_dark_inc_or_dec\r
1067 {0x88,0x15}, //[5:0]b_base\r
1068 {0xa9,0x6c}, //[7:4] ASDE_DN_b_slope_high  0x6c 0x6f\r
1069 \r
1070 {0xb0,0x88},  //6edge effect slope 0x66 0x88 0x99\r
1071 \r
1072 {0xb3,0xa0}, //saturation dec slope  //0x70   0x40\r
1073 {0xb4,0x32},//0x32 0x42\r
1074 {0x8c,0xf6}, //[2]b_in_dark_inc\r
1075 {0x89,0x03}, //dn_c_weight 0x03\r
1076 \r
1077 {0xde,0xb6},  //b6[7]asde_autogray [3:0]auto_gray_value  0xb9\r
1078 {0x38,0x09},  //0aasde_autogray_slope 0x08 0x05 0x06 0x0a\r
1079 {0x39,0x80},  //50asde_autogray_threshold  0x50     0x30\r
1080 \r
1081 {0xfe,0x00},\r
1082 {0x81,0x26},\r
1083 {0x87,0xb0}, //[5:4]first_dn_en first_dd_en  enable 0x80\r
1084 {0xfe,0x02},\r
1085 {0x83,0x00},//[6]green_bks_auto [5]gobal_green_bks\r
1086 {0x84,0x45},//RB offset\r
1087 {0xd1,0x40},  //saturation_cb  0x3a\r
1088 {0xd2,0x3a},  //saturation_Cr  0x38\r
1089 {0xdc,0x30},\r
1090 {0xdd,0xb8},  //edge_sa_g,b\r
1091 {0xfe,0x00},\r
1092 \r
1093 /***\r
1094 {0x16,0x18},// 7\r
1095 {0x17,0x1c},\r
1096 {0x18,0x22},\r
1097 {0x19,0x2a},\r
1098 {0x1a,0x37},\r
1099 {0x1b,0x44},\r
1100 {0x1c,0x4d},\r
1101 {0x1d,0x67},\r
1102 {0x1e,0x79},\r
1103 {0x1f,0x8c},\r
1104 {0x20,0x9a},\r
1105 {0x21,0xa8},\r
1106 {0x22,0xbd},\r
1107 {0x23,0xca},\r
1108 {0x24,0xd5},\r
1109 {0x25,0xdf},\r
1110 {0x26,0xea},\r
1111 {0x27,0xf3},\r
1112 {0x28,0xfa},\r
1113 {0x29,0xfd},\r
1114 *****/\r
1115 //gmma-curve4-low strech\r
1116 {0xfe,0x02},\r
1117 {0x15,0x0f},\r
1118 {0x16,0x15},\r
1119 {0x17,0x1a},\r
1120 {0x18,0x20},\r
1121 {0x19,0x2a},\r
1122 {0x1a,0x32},\r
1123 {0x1b,0x38},\r
1124 {0x1c,0x40},\r
1125 {0x1d,0x4d},\r
1126 {0x1e,0x59},\r
1127 {0x1f,0x66},\r
1128 {0x20,0x70},\r
1129 {0x21,0x7b},\r
1130 {0x22,0x8f},\r
1131 {0x23,0xa2},\r
1132 {0x24,0xb0},\r
1133 {0x25,0xbb},\r
1134 {0x26,0xcf},\r
1135 {0x27,0xdf},\r
1136 {0x28,0xef},\r
1137 {0x29,0xfd},\r
1138 {0xfe,0x02},\r
1139 {0x15,0x0c},  \r
1140 {0x16,0x12},  \r
1141 {0x17,0x17},  \r
1142 {0x18,0x1c},  \r
1143 {0x19,0x24},  \r
1144 {0x1a,0x2c},  \r
1145 {0x1b,0x34},  \r
1146 {0x1c,0x3c},  \r
1147 {0x1d,0x4d},\r
1148 {0x1e,0x59},\r
1149 {0x1f,0x66},\r
1150 {0x20,0x70},\r
1151 {0x21,0x7b},\r
1152 {0x22,0x8f},\r
1153 {0x23,0xa2},\r
1154 {0x24,0xb0},\r
1155 {0x25,0xbb},\r
1156 {0x26,0xcf},\r
1157 {0x27,0xdf},\r
1158 {0x28,0xef},\r
1159 {0x29,0xfd},\r
1160 {0xfe,0x02},  \r
1161 {0x15,0x15},  \r
1162 {0x16,0x24},  \r
1163 {0x17,0x2a},  \r
1164 {0x18,0x32},  \r
1165 {0x19,0x3d},  \r
1166 {0x1a,0x48},  \r
1167 {0x1b,0x50},  \r
1168 {0x1c,0x57},  \r
1169 {0x1d,0x64},  \r
1170 {0x1e,0x6d},  \r
1171 {0x1f,0x78},  \r
1172 {0x20,0x80},  \r
1173 {0x21,0x89},  \r
1174 {0x22,0x94},  \r
1175 {0x23,0xa3},  \r
1176 {0x24,0xaf},  \r
1177 {0x25,0xbc},  \r
1178 {0x26,0xce},  \r
1179 {0x27,0xdf},  \r
1180 {0x28,0xee},  \r
1181 {0x29,0xff},  \r
1182 #if 0\r
1183 ////Gamma  curve4+curve6   \r
1184 {0xfe,0x02},  \r
1185 {0x15,0x0f},  \r
1186 {0x16,0x16},  \r
1187 {0x17,0x1f},  \r
1188 {0x18,0x27},  \r
1189 {0x19,0x2c},  \r
1190 {0x1a,0x34},  \r
1191 {0x1b,0x3b},  \r
1192 {0x1c,0x43},  \r
1193 {0x1d,0x4f},  \r
1194 {0x1e,0x5a},  \r
1195 {0x1f,0x64},  \r
1196 {0x20,0x6e},  \r
1197 {0x21,0x74},  \r
1198 {0x22,0x8d},  \r
1199 {0x23,0xa5},  \r
1200 {0x24,0xb8},  \r
1201 {0x25,0xca},  \r
1202 {0x26,0xe0},  \r
1203 {0x27,0xed},  \r
1204 {0x28,0xf7},  \r
1205 {0x29,0xfd},  \r
1206 \r
1207 /*******\r
1208 gamma-curve6\r
1209 0xfe,0x02}, \r
1210 0x15,0x06}, \r
1211 0x16,0x0a}, \r
1212 0x17,0x0d}, \r
1213 0x18,0x10}, \r
1214 0x19,0x14}, \r
1215 0x1a,0x1e}, \r
1216 0x1b,0x28}, \r
1217 0x1c,0x31}, \r
1218 0x1d,0x44}, \r
1219 0x1e,0x50}, \r
1220 0x1f,0x5f}, \r
1221 0x20,0x6b}, \r
1222 0x21,0x79}, \r
1223 0x22,0x8f}, \r
1224 0x23,0xa5}, \r
1225 0x24,0xb8}, \r
1226 0x25,0xca}, \r
1227 0x26,0xe0}, \r
1228 0x27,0xed}, \r
1229 0x28,0xf7}, \r
1230 0x29,0xfd}, \r
1231 /*****\r
1232 //gamma-new\r
1233 {0xfe,0x02},\r
1234 {0x15,0x14},\r
1235 {0x16,0x28},\r
1236 {0x17,0x48},\r
1237 {0x18,0x60},\r
1238 {0x19,0x7c},\r
1239 {0x1a,0x90},\r
1240 {0x1b,0xa2},\r
1241 {0x1c,0xb2},\r
1242 {0x1d,0xc0},\r
1243 {0x1e,0xce},\r
1244 {0x1f,0xda},\r
1245 {0x20,0xe4},\r
1246 {0x21,0xec},\r
1247 {0x22,0xf4},\r
1248 {0x23,0xca},\r
1249 {0x24,0xd5},\r
1250 {0x25,0xfa},\r
1251 {0x26,0xfb},\r
1252 {0x27,0xfd},\r
1253 {0x28,0xff},\r
1254 {0x29,0xff},\r
1255 \r
1256         {0x24,0xd5},\r
1257         {0x25,0xdf},\r
1258         {0x26,0xea},\r
1259         {0x27,0xf3},\r
1260         {0x28,0xfa},\r
1261         {0x29,0xfd},\r
1262 \r
1263 \r
1264 {0x16,0x18},// 7\r
1265 {0x17,0x1c},\r
1266 {0x18,0x22},\r
1267 {0x19,0x2a},\r
1268 {0x1a,0x37},\r
1269 {0x1b,0x44},\r
1270 {0x1c,0x4d},\r
1271 {0x1d,0x67},\r
1272 {0x1e,0x79},\r
1273 {0x1f,0x8c},\r
1274 {0x20,0x9a},\r
1275 {0x21,0xa8},\r
1276 {0x22,0xbd},\r
1277 {0x23,0xca},\r
1278 {0x24,0xd5},\r
1279 {0x25,0xdf},\r
1280 {0x26,0xea},\r
1281 {0x27,0xf3},\r
1282 {0x28,0xfa},\r
1283 {0x29,0xfd},\r
1284 \r
1285 \r
1286 //rgb-gamma\r
1287 {0x15,0x0a},\r
1288 {0x16,0x0c},\r
1289 {0x17,0x0b},\r
1290 {0x18,0x10},\r
1291 {0x19,0x13},\r
1292 {0x1a,0x21},\r
1293 {0x1b,0x2b},\r
1294 {0x1c,0x33},\r
1295 {0x1d,0x43},\r
1296 {0x1e,0x50},\r
1297 {0x1f,0x5f},\r
1298 {0x20,0x6b},\r
1299 {0x21,0x7a},\r
1300 {0x22,0x8e},\r
1301 {0x23,0xa4},\r
1302 {0x24,0xb8},\r
1303 {0x25,0xc8},\r
1304 {0x26,0xdf},\r
1305 {0x27,0xed},\r
1306 {0x28,0xf8},\r
1307 {0x29,0xff},\r
1308 ****************/\r
1309 #endif\r
1310 //y-gamma\r
1311 {0x2b,0x00},\r
1312 {0x2c,0x04},\r
1313 {0x2d,0x09},\r
1314 {0x2e,0x18},\r
1315 {0x2f,0x27},\r
1316 {0x30,0x37},\r
1317 {0x31,0x49},\r
1318 {0x32,0x5c},\r
1319 {0x33,0x7e},\r
1320 {0x34,0xa0},\r
1321 {0x35,0xc0},\r
1322 {0x36,0xe0},\r
1323 {0x37,0xff},\r
1324 {0xfe,0x00},\r
1325 \r
1326 // a-lsc\r
1327 {0xfe,0x01},\r
1328 {0xa0,0x03},//0f\r
1329 {0xe8,0x51},\r
1330 {0xea,0x42},\r
1331 {0xe6,0x71},\r
1332 {0xe4,0x80},\r
1333 {0xe9,0x1f},\r
1334 {0x4c,0x13},\r
1335 {0xeb,0x1e},\r
1336 {0x4d,0x13},\r
1337 {0xe7,0x20},\r
1338 {0x4b,0x15},\r
1339 {0xe5,0x1c},\r
1340 {0x4a,0x15},\r
1341 {0xe0,0x20},\r
1342 {0xe1,0x20},\r
1343 {0xe2,0x20},\r
1344 {0xe3,0x20},\r
1345 {0xd1,0x74},\r
1346 {0x4e,0x0e},\r
1347 {0xd9,0x91},\r
1348 {0x4f,0x27},\r
1349 {0xdd,0x78},\r
1350 {0xce,0x31},\r
1351 {0xd5,0x71},\r
1352 {0xcf,0x39},\r
1353 {0xa4,0x00},\r
1354 {0xa5,0x00},\r
1355 {0xa6,0x00},\r
1356 {0xa7,0x00},\r
1357 {0xa8,0x66},\r
1358 {0xa9,0x66},\r
1359 {0xa1,0x80},\r
1360 {0xa2,0x80},\r
1361 {0xfe,0x00},\r
1362 \r
1363 {0x82,0xfe},\r
1364 //sleep  400\r
1365 {0xf2,0x70},\r
1366 {0xf3,0xff},\r
1367 {0xf4,0x00},\r
1368 {0xf5,0x30},\r
1369 {0xfe,0x01},\r
1370 {0x0b,0x90},\r
1371 {0x87,0x00},//0x10\r
1372 {0xfe,0x00},\r
1373 \r
1374 /////,0xup},date\r
1375 //ÈÈ?0x  },\r
1376 {0xfe,0x02},\r
1377 {0xa6,0x80}, //dd_th\r
1378 {0xa7,0x60}, //ot_th //0x80\r
1379 {0xa9,0x66}, //6f[7:4] ASDE_DN_b_slope_high 0x68\r
1380 {0xb0,0x88},  //edge effect slope 0x99\r
1381 {0x38,0x0b},  //asde_autogray_slope 0x08   0x0f  0x0a\r
1382 {0x39,0x50},  //asde_autogray_threshold  0x60\r
1383 {0xfe,0x00},\r
1384 {0x87,0xb0}, //[5:4]first_dn_en first_dd_en      0x90\r
1385 \r
1386 {0xfe,0x00},\r
1387 {0x90,0x01},\r
1388 {0x95,0x01},\r
1389 {0x96,0xe4},\r
1390 {0x97,0x02},\r
1391 {0x98,0x82},\r
1392 {0xc8,0x14},\r
1393 {0xf7,0x0D},\r
1394 {0xf8,0x83},\r
1395 {0xfa,0x00},//pll=4\r
1396 {0x05,0x00},\r
1397 {0x06,0xc4},\r
1398 {0x07,0x00},\r
1399 {0x08,0xae},  \r
1400 {0xfe,0x01},\r
1401 {0x27,0x00},\r
1402 {0x28,0xe5},\r
1403 {0x29,0x05},\r
1404 {0x2a,0x5e},//18fps\r
1405 {0x2b,0x07},\r
1406 {0x2c,0x28},//12.5fps\r
1407 {0x2d,0x0a},\r
1408 {0x2e,0xbc},//8fps\r
1409 {0x3e,0x00},//0x40 0x00\r
1410 {0xfe,0x03},\r
1411 {0x42,0x04}, \r
1412 {0x43,0x05}, //output buf width\r
1413 {0x41,0x02}, // delay\r
1414 {0x40,0x40}, //fifo half full trig\r
1415 {0x17,0x00}, //widv is 0\r
1416 {0xfe,0x00},\r
1417 {0xc8,0x55}, \r
1418 \r
1419 {0x00,0x00}, \r
1420 };\r
1421         \r
1422 \r
1423 \r
1424 /* 1600X1200 UXGA */\r
1425 static struct reginfo sensor_uxga[] = \r
1426 {\r
1427  \r
1428  \r
1429         {0xfe , 0x00},\r
1430         {0x0a , 0x00}, //row start\r
1431         {0x0c , 0x00}, //col start\r
1432 \r
1433         {0x0d , 0x04},\r
1434         {0x0e , 0xc0},\r
1435         {0x0f , 0x06}, //Window setting\r
1436         {0x10 , 0x58},// \r
1437 \r
1438 \r
1439 \r
1440 \r
1441 \r
1442         {0x90 , 0x01},  //crop enable\r
1443         {0x95 , 0x04},\r
1444         {0x96 , 0xb0},\r
1445         {0x97 , 0x06},\r
1446         {0x98 , 0x40},\r
1447         {0x99 , 0x11},\r
1448         {0xc8 , 0x00},\r
1449  \r
1450         {0xfa , 0x11},\r
1451 \r
1452 \r
1453         {0xfe , 0x03},\r
1454         {0x42 , 0x80}, \r
1455         {0x43 , 0x06}, //output buf width\r
1456         {0x41 , 0x00}, // delay\r
1457         {0x40 , 0x00}, //fifo half full trig\r
1458         {0x17 , 0x01}, //widv \r
1459         {0xfe , 0x00},\r
1460         {0xc8 , 0x00},\r
1461 \r
1462         {0x00 , 0x00}, \r
1463 \r
1464 \r
1465 };\r
1466 \r
1467         \r
1468 \r
1469 /* 1280X1024 SXGA */\r
1470 static struct reginfo sensor_sxga[] =\r
1471 {\r
1472         \r
1473         {0x0, 0x0},\r
1474 };\r
1475 \r
1476 /* 800X600 SVGA*/\r
1477 static struct reginfo sensor_svga[] =\r
1478 {       \r
1479         \r
1480         {0x0, 0x0},\r
1481 };\r
1482         \r
1483         \r
1484 \r
1485 /* 640X480 VGA */\r
1486 static struct reginfo sensor_vga[] =\r
1487 {\r
1488         {0xfe , 0x00},\r
1489 \r
1490         {0x0a , 0x00}, //row start\r
1491         {0x0c , 0x00}, //col start\r
1492 \r
1493         {0x0d , 0x04},\r
1494         {0x0e , 0xc0},\r
1495         {0x0f , 0x06}, //Window setting\r
1496         {0x10 , 0x58},// \r
1497 \r
1498 \r
1499 \r
1500 \r
1501         \r
1502         {0x90 , 0x01},\r
1503         {0x95 , 0x01},\r
1504         {0x96 , 0xe0},\r
1505         {0x97 , 0x02},\r
1506         {0x98 , 0x80},\r
1507         {0xc8 , 0x15},\r
1508 \r
1509 \r
1510 \r
1511         {0xfa , 0x00}, \r
1512 \r
1513 \r
1514         {0xfe , 0x03},\r
1515         {0x42 , 0x04}, \r
1516         {0x43 , 0x05}, //output buf width\r
1517         {0x41 , 0x02}, // delay\r
1518         {0x40 , 0x40}, //fifo half full trig\r
1519         {0x17 , 0x00}, //widv is 0\r
1520 \r
1521         {0xfe , 0x00},\r
1522         {0xc8 , 0x55}, \r
1523         {0xb6 , 0x03},//aec on\r
1524         {0x00 , 0x00},\r
1525 \r
1526 };\r
1527 \r
1528 /* 352X288 CIF */\r
1529 static struct reginfo sensor_cif[] =\r
1530 {\r
1531     {0x0, 0x0},\r
1532 };\r
1533 \r
1534 /* 320*240 QVGA */\r
1535 static  struct reginfo sensor_qvga[] =\r
1536 {\r
1537     \r
1538 \r
1539     {0x0, 0x0},\r
1540 };\r
1541 \r
1542 /* 176X144 QCIF*/\r
1543 static struct reginfo sensor_qcif[] =\r
1544 {\r
1545         \r
1546     {0x0, 0x0},\r
1547 };\r
1548 #endif\r
1549 \r
1550 static  struct reginfo sensor_ClrFmt_YUYV[]=\r
1551 {\r
1552    \r
1553          {0x0, 0x0},\r
1554 };\r
1555 \r
1556 static  struct reginfo sensor_ClrFmt_UYVY[]=\r
1557 {\r
1558            {0x0, 0x0},\r
1559 };\r
1560 \r
1561 #if CONFIG_SENSOR_WhiteBalance\r
1562 static  struct reginfo sensor_WhiteB_Auto[]=\r
1563 {\r
1564                         {0xb3, 0x61},\r
1565                         {0xb4, 0x40},\r
1566                         {0xb5, 0x61},\r
1567                         {0x82, 0xfe},\r
1568                       {0x0, 0x0},\r
1569 };\r
1570 /* Cloudy Colour Temperature : 6500K - 8000K  */\r
1571 static  struct reginfo sensor_WhiteB_Cloudy[]=\r
1572 {\r
1573                         {0x82, 0xfc},\r
1574                         {0xb3, 0x58},\r
1575                         {0xb4, 0x40},\r
1576                         {0xb5, 0x50},   \r
1577                       {0x0, 0x0},\r
1578 };\r
1579 /* ClearDay Colour Temperature : 5000K - 6500K  */\r
1580 static  struct reginfo sensor_WhiteB_ClearDay[]=\r
1581 {\r
1582     //Sunny\r
1583                         {0x82, 0xfc},\r
1584                         {0xb3, 0x58},\r
1585                         {0xb4, 0x40},\r
1586                         {0xb5, 0x50},\r
1587                       {0x0, 0x0},\r
1588 };\r
1589 /* Office Colour Temperature : 3500K - 5000K  */\r
1590 static  struct reginfo sensor_WhiteB_TungstenLamp1[]=\r
1591 {\r
1592     //Office\r
1593                         {0x82, 0xfc},\r
1594                         {0xb3, 0x50},\r
1595                         {0xb4, 0x40},\r
1596                         {0xb5, 0xa8},\r
1597                         {0x0, 0x0},\r
1598 \r
1599 };\r
1600 /* Home Colour Temperature : 2500K - 3500K  */\r
1601 static  struct reginfo sensor_WhiteB_TungstenLamp2[]=\r
1602 {\r
1603     //Home\r
1604                         {0x82, 0xfc},\r
1605                         {0xb3, 0xa0},\r
1606                         {0xb4, 0x45},\r
1607                         {0xb5, 0x40},\r
1608                        {0x0, 0x0},\r
1609 };\r
1610 static struct reginfo *sensor_WhiteBalanceSeqe[] = {sensor_WhiteB_Auto, sensor_WhiteB_TungstenLamp1,sensor_WhiteB_TungstenLamp2,\r
1611     sensor_WhiteB_ClearDay, sensor_WhiteB_Cloudy,NULL,\r
1612 };\r
1613 #endif\r
1614 \r
1615 #if CONFIG_SENSOR_Brightness\r
1616 static  struct reginfo sensor_Brightness0[]=\r
1617 {\r
1618     // Brightness -2\r
1619   \r
1620         {0xfe, 0x01},\r
1621         {0x13, 0x40},\r
1622         {0xfe, 0x02},\r
1623         {0xd5, 0xe0},\r
1624        {0x00, 0x00},\r
1625 };\r
1626 \r
1627 static  struct reginfo sensor_Brightness1[]=\r
1628 {\r
1629     // Brightness -1\r
1630  \r
1631         {0xfe, 0x01},\r
1632         {0x13, 0x48},\r
1633         {0xfe, 0x02},\r
1634         {0xd5, 0xf0},\r
1635        {0x00, 0x00}\r
1636 };\r
1637 \r
1638 static  struct reginfo sensor_Brightness2[]=\r
1639 {\r
1640     //  Brightness 0\r
1641 \r
1642         {0xfe, 0x01},\r
1643         {0x13, 0x58},\r
1644         {0xfe, 0x02},\r
1645         {0xd5, 0x00},\r
1646        {0x00, 0x00}\r
1647 };\r
1648 \r
1649 static  struct reginfo sensor_Brightness3[]=\r
1650 {\r
1651     // Brightness +1\r
1652         {0xfe, 0x01},\r
1653         {0x13, 0x60},\r
1654         {0xfe, 0x02},\r
1655         {0xd5, 0x10},\r
1656        {0x00, 0x00}\r
1657 };\r
1658 \r
1659 static  struct reginfo sensor_Brightness4[]=\r
1660 {\r
1661     //  Brightness +2\r
1662         {0xfe, 0x01},\r
1663         {0x13, 0x68},\r
1664         {0xfe, 0x02},\r
1665         {0xd5, 0x20},\r
1666        {0x00, 0x00}\r
1667 };\r
1668 \r
1669 static  struct reginfo sensor_Brightness5[]=\r
1670 {\r
1671     //  Brightness +3\r
1672         {0xfe, 0x01},\r
1673         {0x13, 0x78},\r
1674         {0xfe, 0x02},\r
1675         {0xd5, 0x30},\r
1676 \r
1677         {0x00, 0x00}\r
1678 };\r
1679 static struct reginfo *sensor_BrightnessSeqe[] = {sensor_Brightness0, sensor_Brightness1, sensor_Brightness2, sensor_Brightness3,\r
1680     sensor_Brightness4, sensor_Brightness5,NULL,\r
1681 };\r
1682 \r
1683 #endif\r
1684 \r
1685 #if CONFIG_SENSOR_Effect\r
1686 static  struct reginfo sensor_Effect_Normal[] =\r
1687 {\r
1688         {0xfe, 0x00},\r
1689         {0x83, 0xe0},\r
1690         {0x00, 0x00}            \r
1691 };\r
1692 \r
1693 static  struct reginfo sensor_Effect_WandB[] =\r
1694 {\r
1695         {0xfe, 0x00},\r
1696         {0x83, 0x12},                   \r
1697         {0x00, 0x00}\r
1698 };\r
1699 \r
1700 static  struct reginfo sensor_Effect_Sepia[] =\r
1701 {\r
1702         {0xfe, 0x00},\r
1703         {0x83, 0x82},\r
1704         {0x00, 0x00}\r
1705 };\r
1706 \r
1707 static  struct reginfo sensor_Effect_Negative[] =\r
1708 {\r
1709     //Negative\r
1710         {0xfe, 0x00},\r
1711         {0x83, 0x01},\r
1712         {0x00, 0x00}\r
1713 };\r
1714 static  struct reginfo sensor_Effect_Bluish[] =\r
1715 {\r
1716     // Bluish\r
1717         {0xfe, 0x00},\r
1718         {0x83, 0x62},\r
1719         {0x00, 0x00}\r
1720 };\r
1721 \r
1722 static  struct reginfo sensor_Effect_Green[] =\r
1723 {\r
1724     //  Greenish\r
1725         {0xfe, 0x00},\r
1726         {0x83, 0x52},\r
1727         {0x00, 0x00}\r
1728 };\r
1729 static struct reginfo *sensor_EffectSeqe[] = {sensor_Effect_Normal, sensor_Effect_WandB, sensor_Effect_Negative,sensor_Effect_Sepia,\r
1730     sensor_Effect_Bluish, sensor_Effect_Green,NULL,\r
1731 };\r
1732 #endif\r
1733 #if CONFIG_SENSOR_Exposure\r
1734 static  struct reginfo sensor_Exposure0[]=\r
1735 {\r
1736     //-3\r
1737  \r
1738     {0x00, 0x00}\r
1739 };\r
1740 \r
1741 static  struct reginfo sensor_Exposure1[]=\r
1742 {\r
1743     //-2\r
1744  \r
1745     {0x00, 0x00}\r
1746 };\r
1747 \r
1748 static  struct reginfo sensor_Exposure2[]=\r
1749 {\r
1750     //-0.3EV\r
1751 \r
1752     {0x00, 0x00}\r
1753 };\r
1754 \r
1755 static  struct reginfo sensor_Exposure3[]=\r
1756 {\r
1757     //default\r
1758    \r
1759     {0x00, 0x00}\r
1760 };\r
1761 \r
1762 static  struct reginfo sensor_Exposure4[]=\r
1763 {\r
1764     // 1\r
1765 \r
1766     {0x00, 0x00}\r
1767 };\r
1768 \r
1769 static  struct reginfo sensor_Exposure5[]=\r
1770 {\r
1771     // 2\r
1772   \r
1773     {0x00, 0x00}\r
1774 };\r
1775 \r
1776 static  struct reginfo sensor_Exposure6[]=\r
1777 {\r
1778     // 3\r
1779     \r
1780     {0x00, 0x00}\r
1781 };\r
1782 \r
1783 static struct reginfo *sensor_ExposureSeqe[] = {sensor_Exposure0, sensor_Exposure1, sensor_Exposure2, sensor_Exposure3,\r
1784     sensor_Exposure4, sensor_Exposure5,sensor_Exposure6,NULL,\r
1785 };\r
1786 #endif\r
1787 #if CONFIG_SENSOR_Saturation\r
1788 static  struct reginfo sensor_Saturation0[]=\r
1789 {\r
1790 \r
1791     {0x00, 0x00}\r
1792 };\r
1793 \r
1794 static  struct reginfo sensor_Saturation1[]=\r
1795 {\r
1796     {0x00, 0x00}\r
1797 };\r
1798 \r
1799 static  struct reginfo sensor_Saturation2[]=\r
1800 {\r
1801     {0x00, 0x00}\r
1802 };\r
1803 static struct reginfo *sensor_SaturationSeqe[] = {sensor_Saturation0, sensor_Saturation1, sensor_Saturation2, NULL,};\r
1804 \r
1805 #endif\r
1806 #if CONFIG_SENSOR_Contrast\r
1807 static  struct reginfo sensor_Contrast0[]=\r
1808 {\r
1809     //Contrast -3\r
1810     {0x00, 0x00}\r
1811 };\r
1812 \r
1813 static  struct reginfo sensor_Contrast1[]=\r
1814 {\r
1815     //Contrast -2\r
1816     {0x00, 0x00}\r
1817 };\r
1818 \r
1819 static  struct reginfo sensor_Contrast2[]=\r
1820 {\r
1821     // Contrast -1\r
1822     {0x00, 0x00}\r
1823 };\r
1824 \r
1825 static  struct reginfo sensor_Contrast3[]=\r
1826 {\r
1827     //Contrast 0\r
1828     {0x00, 0x00}\r
1829 };\r
1830 \r
1831 static  struct reginfo sensor_Contrast4[]=\r
1832 {\r
1833     //Contrast +1\r
1834     {0x00, 0x00}\r
1835 };\r
1836 \r
1837 \r
1838 static  struct reginfo sensor_Contrast5[]=\r
1839 {\r
1840     //Contrast +2\r
1841     {0x00, 0x00}\r
1842 };\r
1843 \r
1844 static  struct reginfo sensor_Contrast6[]=\r
1845 {\r
1846    \r
1847     //Contrast +3\r
1848     {0x00, 0x00}\r
1849 \r
1850 };\r
1851 static struct reginfo *sensor_ContrastSeqe[] = {sensor_Contrast0, sensor_Contrast1, sensor_Contrast2, sensor_Contrast3,\r
1852     sensor_Contrast4, sensor_Contrast5, sensor_Contrast6, NULL,\r
1853 };\r
1854 \r
1855 #endif\r
1856 #if CONFIG_SENSOR_Mirror\r
1857 static  struct reginfo sensor_MirrorOn[]=\r
1858 {\r
1859     {0x17 , 0x14},\r
1860     {0x00 , 0x00}\r
1861 };\r
1862 \r
1863 static  struct reginfo sensor_MirrorOff[]=\r
1864 {\r
1865     {0x17 , 0x15},\r
1866     {0x00 , 0x00}\r
1867 };\r
1868 static struct reginfo *sensor_MirrorSeqe[] = {sensor_MirrorOff, sensor_MirrorOn,NULL,};\r
1869 #endif\r
1870 #if CONFIG_SENSOR_Flip\r
1871 static  struct reginfo sensor_FlipOn[]=\r
1872 {\r
1873     {0x17 , 0x16},\r
1874     {0x00 , 0x00}\r
1875 };\r
1876 \r
1877 static  struct reginfo sensor_FlipOff[]=\r
1878 {\r
1879     {0x17 , 0x17},\r
1880     {0x00 , 0x00}\r
1881 };\r
1882 static struct reginfo *sensor_FlipSeqe[] = {sensor_FlipOff, sensor_FlipOn,NULL,};\r
1883 \r
1884 #endif\r
1885 #if CONFIG_SENSOR_Scene\r
1886 static  struct reginfo sensor_SceneAuto[] =\r
1887 {\r
1888 {0xfe,0x01},\r
1889 \r
1890 {0x3e,0x40},    \r
1891 {0xfe,0x00},\r
1892 \r
1893 {0x00, 0x00}\r
1894 };\r
1895 \r
1896 static  struct reginfo sensor_SceneNight[] =\r
1897 {\r
1898 \r
1899 \r
1900 \r
1901 {0xfe,0x01},\r
1902 \r
1903 {0x3e,0x60},    \r
1904 {0xfe,0x00},\r
1905 {0x00, 0x00}\r
1906 \r
1907 };\r
1908 static struct reginfo *sensor_SceneSeqe[] = {sensor_SceneAuto, sensor_SceneNight,NULL,};\r
1909 \r
1910 #endif\r
1911 #if CONFIG_SENSOR_DigitalZoom\r
1912 static struct reginfo sensor_Zoom0[] =\r
1913 {\r
1914     {0x0, 0x0},\r
1915 };\r
1916 \r
1917 static struct reginfo sensor_Zoom1[] =\r
1918 {\r
1919      {0x0, 0x0},\r
1920 };\r
1921 \r
1922 static struct reginfo sensor_Zoom2[] =\r
1923 {\r
1924     {0x0, 0x0},\r
1925 };\r
1926 \r
1927 \r
1928 static struct reginfo sensor_Zoom3[] =\r
1929 {\r
1930     {0x0, 0x0},\r
1931 };\r
1932 static struct reginfo *sensor_ZoomSeqe[] = {sensor_Zoom0, sensor_Zoom1, sensor_Zoom2, sensor_Zoom3, NULL,};\r
1933 #endif\r
1934 static const struct v4l2_querymenu sensor_menus[] =\r
1935 {\r
1936         #if CONFIG_SENSOR_WhiteBalance\r
1937     { .id = V4L2_CID_DO_WHITE_BALANCE,  .index = 0,  .name = "auto",  .reserved = 0, }, {  .id = V4L2_CID_DO_WHITE_BALANCE,  .index = 1, .name = "incandescent",  .reserved = 0,},\r
1938     { .id = V4L2_CID_DO_WHITE_BALANCE,  .index = 2,  .name = "fluorescent", .reserved = 0,}, {  .id = V4L2_CID_DO_WHITE_BALANCE, .index = 3,  .name = "daylight", .reserved = 0,},\r
1939     { .id = V4L2_CID_DO_WHITE_BALANCE,  .index = 4,  .name = "cloudy-daylight", .reserved = 0,},\r
1940     #endif\r
1941 \r
1942         #if CONFIG_SENSOR_Effect\r
1943     { .id = V4L2_CID_EFFECT,  .index = 0,  .name = "none",  .reserved = 0, }, {  .id = V4L2_CID_EFFECT,  .index = 1, .name = "mono",  .reserved = 0,},\r
1944     { .id = V4L2_CID_EFFECT,  .index = 2,  .name = "negative", .reserved = 0,}, {  .id = V4L2_CID_EFFECT, .index = 3,  .name = "sepia", .reserved = 0,},\r
1945     { .id = V4L2_CID_EFFECT,  .index = 4, .name = "posterize", .reserved = 0,} ,{ .id = V4L2_CID_EFFECT,  .index = 5,  .name = "aqua", .reserved = 0,},\r
1946     #endif\r
1947 \r
1948         #if CONFIG_SENSOR_Scene\r
1949     { .id = V4L2_CID_SCENE,  .index = 0, .name = "auto", .reserved = 0,} ,{ .id = V4L2_CID_SCENE,  .index = 1,  .name = "night", .reserved = 0,},\r
1950     #endif\r
1951 \r
1952         #if CONFIG_SENSOR_Flash\r
1953     { .id = V4L2_CID_FLASH,  .index = 0,  .name = "off",  .reserved = 0, }, {  .id = V4L2_CID_FLASH,  .index = 1, .name = "auto",  .reserved = 0,},\r
1954     { .id = V4L2_CID_FLASH,  .index = 2,  .name = "on", .reserved = 0,}, {  .id = V4L2_CID_FLASH, .index = 3,  .name = "torch", .reserved = 0,},\r
1955     #endif\r
1956 };\r
1957 \r
1958 static  struct v4l2_queryctrl sensor_controls[] =\r
1959 {\r
1960         #if CONFIG_SENSOR_WhiteBalance\r
1961     {\r
1962         .id             = V4L2_CID_DO_WHITE_BALANCE,\r
1963         .type           = V4L2_CTRL_TYPE_MENU,\r
1964         .name           = "White Balance Control",\r
1965         .minimum        = 0,\r
1966         .maximum        = 4,\r
1967         .step           = 1,\r
1968         .default_value = 0,\r
1969     },\r
1970     #endif\r
1971 \r
1972         #if CONFIG_SENSOR_Brightness\r
1973         {\r
1974         .id             = V4L2_CID_BRIGHTNESS,\r
1975         .type           = V4L2_CTRL_TYPE_INTEGER,\r
1976         .name           = "Brightness Control",\r
1977         .minimum        = -3,\r
1978         .maximum        = 2,\r
1979         .step           = 1,\r
1980         .default_value = 0,\r
1981     },\r
1982     #endif\r
1983 \r
1984         #if CONFIG_SENSOR_Effect\r
1985         {\r
1986         .id             = V4L2_CID_EFFECT,\r
1987         .type           = V4L2_CTRL_TYPE_MENU,\r
1988         .name           = "Effect Control",\r
1989         .minimum        = 0,\r
1990         .maximum        = 5,\r
1991         .step           = 1,\r
1992         .default_value = 0,\r
1993     },\r
1994         #endif\r
1995 \r
1996         #if CONFIG_SENSOR_Exposure\r
1997         {\r
1998         .id             = V4L2_CID_EXPOSURE,\r
1999         .type           = V4L2_CTRL_TYPE_INTEGER,\r
2000         .name           = "Exposure Control",\r
2001         .minimum        = 0,\r
2002         .maximum        = 6,\r
2003         .step           = 1,\r
2004         .default_value = 0,\r
2005     },\r
2006         #endif\r
2007 \r
2008         #if CONFIG_SENSOR_Saturation\r
2009         {\r
2010         .id             = V4L2_CID_SATURATION,\r
2011         .type           = V4L2_CTRL_TYPE_INTEGER,\r
2012         .name           = "Saturation Control",\r
2013         .minimum        = 0,\r
2014         .maximum        = 2,\r
2015         .step           = 1,\r
2016         .default_value = 0,\r
2017     },\r
2018     #endif\r
2019 \r
2020         #if CONFIG_SENSOR_Contrast\r
2021         {\r
2022         .id             = V4L2_CID_CONTRAST,\r
2023         .type           = V4L2_CTRL_TYPE_INTEGER,\r
2024         .name           = "Contrast Control",\r
2025         .minimum        = -3,\r
2026         .maximum        = 3,\r
2027         .step           = 1,\r
2028         .default_value = 0,\r
2029     },\r
2030         #endif\r
2031 \r
2032         #if CONFIG_SENSOR_Mirror\r
2033         {\r
2034         .id             = V4L2_CID_HFLIP,\r
2035         .type           = V4L2_CTRL_TYPE_BOOLEAN,\r
2036         .name           = "Mirror Control",\r
2037         .minimum        = 0,\r
2038         .maximum        = 1,\r
2039         .step           = 1,\r
2040         .default_value = 1,\r
2041     },\r
2042     #endif\r
2043 \r
2044         #if CONFIG_SENSOR_Flip\r
2045         {\r
2046         .id             = V4L2_CID_VFLIP,\r
2047         .type           = V4L2_CTRL_TYPE_BOOLEAN,\r
2048         .name           = "Flip Control",\r
2049         .minimum        = 0,\r
2050         .maximum        = 1,\r
2051         .step           = 1,\r
2052         .default_value = 1,\r
2053     },\r
2054     #endif\r
2055 \r
2056         #if CONFIG_SENSOR_Scene\r
2057     {\r
2058         .id             = V4L2_CID_SCENE,\r
2059         .type           = V4L2_CTRL_TYPE_MENU,\r
2060         .name           = "Scene Control",\r
2061         .minimum        = 0,\r
2062         .maximum        = 1,\r
2063         .step           = 1,\r
2064         .default_value = 0,\r
2065     },\r
2066     #endif\r
2067 \r
2068         #if CONFIG_SENSOR_DigitalZoom\r
2069     {\r
2070         .id             = V4L2_CID_ZOOM_RELATIVE,\r
2071         .type           = V4L2_CTRL_TYPE_INTEGER,\r
2072         .name           = "DigitalZoom Control",\r
2073         .minimum        = -1,\r
2074         .maximum        = 1,\r
2075         .step           = 1,\r
2076         .default_value = 0,\r
2077     }, {\r
2078         .id             = V4L2_CID_ZOOM_ABSOLUTE,\r
2079         .type           = V4L2_CTRL_TYPE_INTEGER,\r
2080         .name           = "DigitalZoom Control",\r
2081         .minimum        = 0,\r
2082         .maximum        = 3,\r
2083         .step           = 1,\r
2084         .default_value = 0,\r
2085     },\r
2086     #endif\r
2087 \r
2088         #if CONFIG_SENSOR_Focus\r
2089         {\r
2090         .id             = V4L2_CID_FOCUS_RELATIVE,\r
2091         .type           = V4L2_CTRL_TYPE_INTEGER,\r
2092         .name           = "Focus Control",\r
2093         .minimum        = -1,\r
2094         .maximum        = 1,\r
2095         .step           = 1,\r
2096         .default_value = 0,\r
2097     }, {\r
2098         .id             = V4L2_CID_FOCUS_ABSOLUTE,\r
2099         .type           = V4L2_CTRL_TYPE_INTEGER,\r
2100         .name           = "Focus Control",\r
2101         .minimum        = 0,\r
2102         .maximum        = 255,\r
2103         .step           = 1,\r
2104         .default_value = 125,\r
2105     },\r
2106     #endif\r
2107 \r
2108         #if CONFIG_SENSOR_Flash\r
2109         {\r
2110         .id             = V4L2_CID_FLASH,\r
2111         .type           = V4L2_CTRL_TYPE_MENU,\r
2112         .name           = "Flash Control",\r
2113         .minimum        = 0,\r
2114         .maximum        = 3,\r
2115         .step           = 1,\r
2116         .default_value = 0,\r
2117     },\r
2118         #endif\r
2119 };\r
2120 \r
2121 static int sensor_probe(struct i2c_client *client, const struct i2c_device_id *did);\r
2122 static int sensor_video_probe(struct soc_camera_device *icd, struct i2c_client *client);\r
2123 static int sensor_g_control(struct v4l2_subdev *sd, struct v4l2_control *ctrl);\r
2124 static int sensor_s_control(struct v4l2_subdev *sd, struct v4l2_control *ctrl);\r
2125 static int sensor_g_ext_controls(struct v4l2_subdev *sd,  struct v4l2_ext_controls *ext_ctrl);\r
2126 static int sensor_s_ext_controls(struct v4l2_subdev *sd,  struct v4l2_ext_controls *ext_ctrl);\r
2127 static int sensor_suspend(struct soc_camera_device *icd, pm_message_t pm_msg);\r
2128 static int sensor_resume(struct soc_camera_device *icd);\r
2129 static int sensor_set_bus_param(struct soc_camera_device *icd,unsigned long flags);\r
2130 static unsigned long sensor_query_bus_param(struct soc_camera_device *icd);\r
2131 static int sensor_set_effect(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value);\r
2132 static int sensor_set_whiteBalance(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value);\r
2133 static int sensor_deactivate(struct i2c_client *client);\r
2134 \r
2135 static struct soc_camera_ops sensor_ops =\r
2136 {\r
2137     .suspend                     = sensor_suspend,\r
2138     .resume                       = sensor_resume,\r
2139     .set_bus_param              = sensor_set_bus_param,\r
2140     .query_bus_param    = sensor_query_bus_param,\r
2141     .controls           = sensor_controls,\r
2142     .menus                         = sensor_menus,\r
2143     .num_controls               = ARRAY_SIZE(sensor_controls),\r
2144     .num_menus          = ARRAY_SIZE(sensor_menus),\r
2145 };\r
2146 \r
2147 /* only one fixed colorspace per pixelcode */\r
2148 struct sensor_datafmt {\r
2149         enum v4l2_mbus_pixelcode code;\r
2150         enum v4l2_colorspace colorspace;\r
2151 };\r
2152 \r
2153 /* Find a data format by a pixel code in an array */\r
2154 static const struct sensor_datafmt *sensor_find_datafmt(\r
2155         enum v4l2_mbus_pixelcode code, const struct sensor_datafmt *fmt,\r
2156         int n)\r
2157 {\r
2158         int i;\r
2159         for (i = 0; i < n; i++)\r
2160                 if (fmt[i].code == code)\r
2161                         return fmt + i;\r
2162 \r
2163         return NULL;\r
2164 }\r
2165 \r
2166 static const struct sensor_datafmt sensor_colour_fmts[] = {\r
2167         {V4L2_MBUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG},\r
2168     {V4L2_MBUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG},    \r
2169     \r
2170     \r
2171 };\r
2172 \r
2173 typedef struct sensor_info_priv_s\r
2174 {\r
2175     int whiteBalance;\r
2176     int brightness;\r
2177     int contrast;\r
2178     int saturation;\r
2179     int effect;\r
2180     int scene;\r
2181     int digitalzoom;\r
2182     int focus;\r
2183     int flash;\r
2184     int exposure;\r
2185         bool snap2preview;\r
2186         bool video2preview;\r
2187     unsigned char mirror;                                        /* HFLIP */\r
2188     unsigned char flip;                                          /* VFLIP */\r
2189     unsigned int winseqe_cur_addr;\r
2190     struct sensor_datafmt fmt;\r
2191     unsigned int funmodule_state;\r
2192 } sensor_info_priv_t;\r
2193 \r
2194 struct sensor\r
2195 {\r
2196     struct v4l2_subdev subdev;\r
2197     struct i2c_client *client;\r
2198     sensor_info_priv_t info_priv;\r
2199     int model;  /* V4L2_IDENT_OV* codes from v4l2-chip-ident.h */\r
2200 #if CONFIG_SENSOR_I2C_NOSCHED\r
2201         atomic_t tasklock_cnt;\r
2202 #endif\r
2203         struct rk29camera_platform_data *sensor_io_request;\r
2204     struct rk29camera_gpio_res *sensor_gpio_res;\r
2205 };\r
2206 \r
2207 static struct sensor* to_sensor(const struct i2c_client *client)\r
2208 {\r
2209     return container_of(i2c_get_clientdata(client), struct sensor, subdev);\r
2210 }\r
2211 \r
2212 static int sensor_task_lock(struct i2c_client *client, int lock)\r
2213 {\r
2214 #if CONFIG_SENSOR_I2C_NOSCHED\r
2215         int cnt = 3;\r
2216     struct sensor *sensor = to_sensor(client);\r
2217 \r
2218         if (lock) {\r
2219                 if (atomic_read(&sensor->tasklock_cnt) == 0) {\r
2220                         while ((atomic_read(&client->adapter->bus_lock.count) < 1) && (cnt>0)) {\r
2221                                 SENSOR_TR("\n %s will obtain i2c in atomic, but i2c bus is locked! Wait...\n",SENSOR_NAME_STRING());\r
2222                                 msleep(35);\r
2223                                 cnt--;\r
2224                         }\r
2225                         if ((atomic_read(&client->adapter->bus_lock.count) < 1) && (cnt<=0)) {\r
2226                                 SENSOR_TR("\n %s obtain i2c fail in atomic!!\n",SENSOR_NAME_STRING());\r
2227                                 goto sensor_task_lock_err;\r
2228                         }\r
2229                         preempt_disable();\r
2230                 }\r
2231 \r
2232                 atomic_add(1, &sensor->tasklock_cnt);\r
2233         } else {\r
2234                 if (atomic_read(&sensor->tasklock_cnt) > 0) {\r
2235                         atomic_sub(1, &sensor->tasklock_cnt);\r
2236 \r
2237                         if (atomic_read(&sensor->tasklock_cnt) == 0)\r
2238                                 preempt_enable();\r
2239                 }\r
2240         }\r
2241         return 0;\r
2242 sensor_task_lock_err:\r
2243         return -1; \r
2244 #else\r
2245     return 0;\r
2246 #endif\r
2247 \r
2248 }\r
2249 \r
2250 /* sensor register write */\r
2251 static int sensor_write(struct i2c_client *client, u8 reg, u8 val)\r
2252 {\r
2253     int err,cnt;\r
2254     u8 buf[2];\r
2255     struct i2c_msg msg[1];\r
2256 \r
2257     buf[0] = reg;\r
2258     buf[1] = val;\r
2259 \r
2260 \r
2261     msg->addr = client->addr;\r
2262     msg->flags = client->flags;\r
2263     msg->buf = buf;\r
2264     msg->len = sizeof(buf);\r
2265     msg->scl_rate = CONFIG_SENSOR_I2C_SPEED;         /* ddl@rock-chips.com : 100kHz */\r
2266     msg->read_type = 0;               /* fpga i2c:0==I2C_NORMAL : direct use number not enum for don't want include spi_fpga.h */\r
2267 \r
2268     cnt = 3;\r
2269     err = -EAGAIN;\r
2270 \r
2271     while ((cnt-- > 0) && (err < 0)) {                       /* ddl@rock-chips.com :  Transfer again if transent is failed   */\r
2272         err = i2c_transfer(client->adapter, msg, 1);\r
2273 \r
2274         if (err >= 0) {\r
2275             return 0;\r
2276         } else {\r
2277                 SENSOR_TR("\n %s write reg(0x%x, val:0x%x) failed, try to write again!\n",SENSOR_NAME_STRING(),reg, val);\r
2278             udelay(10);\r
2279         }\r
2280     }\r
2281 \r
2282     return err;\r
2283 }\r
2284 \r
2285 /* sensor register read */\r
2286 static int sensor_read(struct i2c_client *client, u8 reg, u8 *val)\r
2287 {\r
2288     int err,cnt;\r
2289     u8 buf[1];\r
2290     struct i2c_msg msg[2];\r
2291 \r
2292     buf[0] = reg ;\r
2293 \r
2294     msg[0].addr = client->addr;\r
2295     msg[0].flags = client->flags;\r
2296     msg[0].buf = buf;\r
2297     msg[0].len = sizeof(buf);\r
2298     msg[0].scl_rate = CONFIG_SENSOR_I2C_SPEED;       /* ddl@rock-chips.com : 100kHz */\r
2299     msg[0].read_type = 2;   /* fpga i2c:0==I2C_NO_STOP : direct use number not enum for don't want include spi_fpga.h */\r
2300 \r
2301     msg[1].addr = client->addr;\r
2302     msg[1].flags = client->flags|I2C_M_RD;\r
2303     msg[1].buf = buf;\r
2304     msg[1].len = 1;\r
2305     msg[1].scl_rate = CONFIG_SENSOR_I2C_SPEED;                       /* ddl@rock-chips.com : 100kHz */\r
2306     msg[1].read_type = 2;                             /* fpga i2c:0==I2C_NO_STOP : direct use number not enum for don't want include spi_fpga.h */\r
2307 \r
2308     cnt = 3;\r
2309     err = -EAGAIN;\r
2310     while ((cnt-- > 0) && (err < 0)) {                       /* ddl@rock-chips.com :  Transfer again if transent is failed   */\r
2311         err = i2c_transfer(client->adapter, msg, 2);\r
2312 \r
2313         if (err >= 0) {\r
2314             *val = buf[0];\r
2315             return 0;\r
2316         } else {\r
2317                 SENSOR_TR("\n %s read reg(0x%x val:0x%x) failed, try to read again! \n",SENSOR_NAME_STRING(),reg, *val);\r
2318             udelay(10);\r
2319         }\r
2320     }\r
2321 \r
2322     return err;\r
2323 }\r
2324 \r
2325 /* write a array of registers  */\r
2326 static int sensor_write_array(struct i2c_client *client, struct reginfo *regarray)\r
2327 {\r
2328     int err = 0, cnt;\r
2329     int i = 0;\r
2330 #if CONFIG_SENSOR_I2C_RDWRCHK    \r
2331         char valchk;\r
2332 #endif\r
2333 \r
2334         cnt = 0;\r
2335         if (sensor_task_lock(client, 1) < 0)\r
2336                 goto sensor_write_array_end;\r
2337 \r
2338     while (regarray[i].reg != 0)\r
2339     {\r
2340         err = sensor_write(client, regarray[i].reg, regarray[i].val);\r
2341         if (err < 0)\r
2342         {\r
2343             if (cnt-- > 0) {\r
2344                             SENSOR_TR("%s..write failed current reg:0x%x, Write array again !\n", SENSOR_NAME_STRING(),regarray[i].reg);\r
2345                                 i = 0;\r
2346                                 continue;\r
2347             } else {\r
2348                 SENSOR_TR("%s..write array failed!!!\n", SENSOR_NAME_STRING());\r
2349                 err = -EPERM;\r
2350                                 goto sensor_write_array_end;\r
2351             }\r
2352         } else {\r
2353         #if CONFIG_SENSOR_I2C_RDWRCHK\r
2354                         sensor_read(client, regarray[i].reg, &valchk);\r
2355                         if (valchk != regarray[i].val)\r
2356                                 SENSOR_TR("%s Reg:0x%x write(0x%x, 0x%x) fail\n",SENSOR_NAME_STRING(), regarray[i].reg, regarray[i].val, valchk);\r
2357                 #endif\r
2358         }\r
2359         i++;\r
2360     }\r
2361 \r
2362 sensor_write_array_end:\r
2363         sensor_task_lock(client,0);\r
2364         return err;\r
2365 }\r
2366 \r
2367 #if CONFIG_SENSOR_I2C_RDWRCHK\r
2368 static int sensor_check_array(struct i2c_client *client, struct reginfo *regarray)\r
2369 {\r
2370     int cnt;\r
2371     int i = 0;\r
2372         char valchk;\r
2373 \r
2374         cnt = 0;\r
2375         valchk = 0;\r
2376     while (regarray[i].reg != 0)\r
2377     {\r
2378                 sensor_read(client, regarray[i].reg, &valchk);\r
2379                 if (valchk != regarray[i].val)\r
2380                         SENSOR_TR("%s Reg:0x%x read(0x%x, 0x%x) error\n",SENSOR_NAME_STRING(), regarray[i].reg, regarray[i].val, valchk);\r
2381 \r
2382         i++;\r
2383     }\r
2384     return 0;\r
2385 }\r
2386 #endif\r
2387 static int sensor_ioctrl(struct soc_camera_device *icd,enum rk29sensor_power_cmd cmd, int on)\r
2388 {\r
2389         struct soc_camera_link *icl = to_soc_camera_link(icd);\r
2390         int ret = 0;\r
2391 \r
2392     SENSOR_DG("%s %s  cmd(%d) on(%d)\n",SENSOR_NAME_STRING(),__FUNCTION__,cmd,on);\r
2393         switch (cmd)\r
2394         {       \r
2395                 case Sensor_PowerDown:\r
2396                 {\r
2397            // honghaishen_test\r
2398                         if (icl->powerdown) {\r
2399                                 ret = icl->powerdown(icd->pdev, on);\r
2400                                 if (ret == RK29_CAM_IO_SUCCESS) {\r
2401                                         if (on == 0) {\r
2402                                                 mdelay(2);\r
2403                                                 if (icl->reset)\r
2404                                                         icl->reset(icd->pdev);\r
2405                                         }\r
2406                                 } else if (ret == RK29_CAM_EIO_REQUESTFAIL) {\r
2407                                         ret = -ENODEV;\r
2408                                         goto sensor_power_end;\r
2409                                 }\r
2410                         }\r
2411  \r
2412                         break;\r
2413                         \r
2414                 }\r
2415                 case Sensor_Flash:\r
2416                 {\r
2417                         struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
2418                 struct sensor *sensor = to_sensor(client);\r
2419 \r
2420                         if (sensor->sensor_io_request && sensor->sensor_io_request->sensor_ioctrl) {\r
2421                                 sensor->sensor_io_request->sensor_ioctrl(icd->pdev,Cam_Flash, on);\r
2422                 if(on){\r
2423                     //flash off after 2 secs\r
2424                         hrtimer_cancel(&(flash_off_timer.timer));\r
2425                         hrtimer_start(&(flash_off_timer.timer),ktime_set(0, 800*1000*1000),HRTIMER_MODE_REL);\r
2426                     }\r
2427                         }\r
2428             break;\r
2429                 }\r
2430                 default:\r
2431                 {\r
2432                         SENSOR_TR("%s %s cmd(0x%x) is unknown!",SENSOR_NAME_STRING(),__FUNCTION__,cmd);\r
2433                         break;\r
2434                 }\r
2435         }\r
2436 sensor_power_end:\r
2437         return ret;\r
2438 }\r
2439 static enum hrtimer_restart flash_off_func(struct hrtimer *timer){\r
2440         struct flash_timer *fps_timer = container_of(timer, struct flash_timer, timer);\r
2441     sensor_ioctrl(fps_timer->icd,Sensor_Flash,0);\r
2442         SENSOR_DG("%s %s !!!!!!",SENSOR_NAME_STRING(),__FUNCTION__);\r
2443     return 0;\r
2444     \r
2445 }\r
2446 static int sensor_init(struct v4l2_subdev *sd, u32 val)\r
2447 {\r
2448     struct i2c_client *client = v4l2_get_subdevdata(sd);\r
2449     struct soc_camera_device *icd = client->dev.platform_data;\r
2450     struct sensor *sensor = to_sensor(client);\r
2451         const struct v4l2_queryctrl *qctrl;\r
2452     const struct sensor_datafmt *fmt;\r
2453     char value;\r
2454     int ret,pid = 0;\r
2455 \r
2456     SENSOR_DG("\n%s..%s.. \n",SENSOR_NAME_STRING(),__FUNCTION__);\r
2457 \r
2458         if (sensor_ioctrl(icd, Sensor_PowerDown, 0) < 0) {\r
2459                 ret = -ENODEV;\r
2460                 goto sensor_INIT_ERR;\r
2461         }\r
2462 \r
2463     /* soft reset */\r
2464         if (sensor_task_lock(client,1)<0)\r
2465                 goto sensor_INIT_ERR;\r
2466         /* check if it is an sensor sensor */\r
2467     ret = sensor_read(client, 0xf0, &value);\r
2468     if (ret != 0) {\r
2469         SENSOR_TR("read chip id high byte failed\n");\r
2470         ret = -ENODEV;\r
2471         goto sensor_INIT_ERR;\r
2472     }\r
2473 \r
2474     pid |= (value << 8);\r
2475 \r
2476     ret = sensor_read(client, 0xf1, &value);\r
2477     if (ret != 0) {\r
2478         SENSOR_TR("read chip id low byte failed\n");\r
2479         ret = -ENODEV;\r
2480         goto sensor_INIT_ERR;\r
2481     }\r
2482 \r
2483     pid |= (value & 0xff);\r
2484     SENSOR_DG("\n %s  pid = 0x%x\n", SENSOR_NAME_STRING(), pid);\r
2485     if (pid == SENSOR_ID) {\r
2486         sensor->model = SENSOR_V4L2_IDENT;\r
2487     } else {\r
2488         SENSOR_TR("error: %s mismatched   pid = 0x%x\n", SENSOR_NAME_STRING(), pid);\r
2489         ret = -ENODEV;\r
2490         goto sensor_INIT_ERR;\r
2491     }\r
2492 \r
2493     ret = sensor_write_array(client, sensor_init_data);\r
2494         \r
2495     if (ret != 0)\r
2496     {\r
2497         SENSOR_TR("error: %s initial failed\n",SENSOR_NAME_STRING());\r
2498         goto sensor_INIT_ERR;\r
2499     }\r
2500         sensor_task_lock(client,0);\r
2501     \r
2502     sensor->info_priv.winseqe_cur_addr  = (int)SENSOR_INIT_WINSEQADR;\r
2503     fmt = sensor_find_datafmt(SENSOR_INIT_PIXFMT,sensor_colour_fmts, ARRAY_SIZE(sensor_colour_fmts));\r
2504     if (!fmt) {\r
2505         SENSOR_TR("error: %s initial array colour fmts is not support!!",SENSOR_NAME_STRING());\r
2506         ret = -EINVAL;\r
2507         goto sensor_INIT_ERR;\r
2508     }\r
2509         sensor->info_priv.fmt = *fmt;\r
2510 \r
2511     /* sensor sensor information for initialization  */\r
2512         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_DO_WHITE_BALANCE);\r
2513         if (qctrl)\r
2514         sensor->info_priv.whiteBalance = qctrl->default_value;\r
2515         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_BRIGHTNESS);\r
2516         if (qctrl)\r
2517         sensor->info_priv.brightness = qctrl->default_value;\r
2518         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);\r
2519         if (qctrl)\r
2520         sensor->info_priv.effect = qctrl->default_value;\r
2521         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EXPOSURE);\r
2522         if (qctrl)\r
2523         sensor->info_priv.exposure = qctrl->default_value;\r
2524 \r
2525         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_SATURATION);\r
2526         if (qctrl)\r
2527         sensor->info_priv.saturation = qctrl->default_value;\r
2528         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_CONTRAST);\r
2529         if (qctrl)\r
2530         sensor->info_priv.contrast = qctrl->default_value;\r
2531         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_HFLIP);\r
2532         if (qctrl)\r
2533         sensor->info_priv.mirror = qctrl->default_value;\r
2534         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_VFLIP);\r
2535         if (qctrl)\r
2536         sensor->info_priv.flip = qctrl->default_value;\r
2537         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_SCENE);\r
2538         if (qctrl)\r
2539         sensor->info_priv.scene = qctrl->default_value;\r
2540         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_ZOOM_ABSOLUTE);\r
2541         if (qctrl)\r
2542         sensor->info_priv.digitalzoom = qctrl->default_value;\r
2543 \r
2544     /* ddl@rock-chips.com : if sensor support auto focus and flash, programer must run focus and flash code  */\r
2545         #if CONFIG_SENSOR_Focus\r
2546     sensor_set_focus();\r
2547     qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_FOCUS_ABSOLUTE);\r
2548         if (qctrl)\r
2549         sensor->info_priv.focus = qctrl->default_value;\r
2550         #endif\r
2551 \r
2552         #if CONFIG_SENSOR_Flash \r
2553         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_FLASH);\r
2554         if (qctrl)\r
2555         sensor->info_priv.flash = qctrl->default_value;\r
2556     flash_off_timer.icd = icd;\r
2557         flash_off_timer.timer.function = flash_off_func;\r
2558     #endif\r
2559 \r
2560     SENSOR_DG("\n%s..%s.. icd->width = %d.. icd->height %d\n",SENSOR_NAME_STRING(),((val == 0)?__FUNCTION__:"sensor_reinit"),icd->user_width,icd->user_height);\r
2561     sensor->info_priv.funmodule_state |= SENSOR_INIT_IS_OK;\r
2562     return 0;\r
2563 sensor_INIT_ERR:\r
2564     sensor->info_priv.funmodule_state &= ~SENSOR_INIT_IS_OK;\r
2565         sensor_task_lock(client,0);\r
2566         sensor_deactivate(client);\r
2567     return ret;\r
2568 }\r
2569 \r
2570 static int sensor_deactivate(struct i2c_client *client)\r
2571 {\r
2572         struct soc_camera_device *icd = client->dev.platform_data;\r
2573 \r
2574     struct sensor *sensor = to_sensor(client);\r
2575         SENSOR_DG("\n%s..%s.. Enter\n",SENSOR_NAME_STRING(),__FUNCTION__);\r
2576 \r
2577         /* ddl@rock-chips.com : all sensor output pin must change to input for other sensor */\r
2578     if (sensor->info_priv.funmodule_state & SENSOR_INIT_IS_OK) {\r
2579     }\r
2580         sensor_ioctrl(icd, Sensor_PowerDown, 1);\r
2581     msleep(100); \r
2582 \r
2583         /* ddl@rock-chips.com : sensor config init width , because next open sensor quickly(soc_camera_open -> Try to configure with default parameters) */\r
2584         icd->user_width = SENSOR_INIT_WIDTH;\r
2585     icd->user_height = SENSOR_INIT_HEIGHT;\r
2586     sensor->info_priv.funmodule_state &= ~SENSOR_INIT_IS_OK;\r
2587         \r
2588         return 0;\r
2589 }\r
2590 \r
2591 static  struct reginfo sensor_power_down_sequence[]=\r
2592 {\r
2593 \r
2594     {0x00,0x00}\r
2595 };\r
2596 static int sensor_suspend(struct soc_camera_device *icd, pm_message_t pm_msg)\r
2597 {\r
2598     int ret;\r
2599     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
2600 \r
2601     if (pm_msg.event == PM_EVENT_SUSPEND) {\r
2602         SENSOR_DG("\n %s Enter Suspend.. \n", SENSOR_NAME_STRING());\r
2603         ret = sensor_write_array(client, sensor_power_down_sequence) ;\r
2604         if (ret != 0) {\r
2605             SENSOR_TR("\n %s..%s WriteReg Fail.. \n", SENSOR_NAME_STRING(),__FUNCTION__);\r
2606             return ret;\r
2607         } else {\r
2608             ret = sensor_ioctrl(icd, Sensor_PowerDown, 1);\r
2609             if (ret < 0) {\r
2610                             SENSOR_TR("\n %s suspend fail for turn on power!\n", SENSOR_NAME_STRING());\r
2611                 return -EINVAL;\r
2612             }\r
2613         }\r
2614     } else {\r
2615         SENSOR_TR("\n %s cann't suppout Suspend..\n",SENSOR_NAME_STRING());\r
2616         return -EINVAL;\r
2617     }\r
2618     return 0;\r
2619 }\r
2620 \r
2621 static int sensor_resume(struct soc_camera_device *icd)\r
2622 {\r
2623         int ret;\r
2624 \r
2625     ret = sensor_ioctrl(icd, Sensor_PowerDown, 0);\r
2626     if (ret < 0) {\r
2627                 SENSOR_TR("\n %s resume fail for turn on power!\n", SENSOR_NAME_STRING());\r
2628         return -EINVAL;\r
2629     }\r
2630 \r
2631         SENSOR_DG("\n %s Enter Resume.. \n", SENSOR_NAME_STRING());\r
2632 \r
2633     return 0;\r
2634 \r
2635 }\r
2636 \r
2637 static int sensor_set_bus_param(struct soc_camera_device *icd,\r
2638                                 unsigned long flags)\r
2639 {\r
2640 \r
2641     return 0;\r
2642 }\r
2643 \r
2644 static unsigned long sensor_query_bus_param(struct soc_camera_device *icd)\r
2645 {\r
2646     struct soc_camera_link *icl = to_soc_camera_link(icd);\r
2647     unsigned long flags = SENSOR_BUS_PARAM;\r
2648 \r
2649     return soc_camera_apply_sensor_flags(icl, flags);\r
2650 }\r
2651 \r
2652 static int sensor_g_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)\r
2653 {\r
2654     struct i2c_client *client = v4l2_get_subdevdata(sd);\r
2655     struct soc_camera_device *icd = client->dev.platform_data;\r
2656     struct sensor *sensor = to_sensor(client);\r
2657 \r
2658     mf->width   = icd->user_width;\r
2659         mf->height      = icd->user_height;\r
2660         mf->code        = sensor->info_priv.fmt.code;\r
2661         mf->colorspace  = sensor->info_priv.fmt.colorspace;\r
2662         mf->field       = V4L2_FIELD_NONE;\r
2663 \r
2664     return 0;\r
2665 }\r
2666 static bool sensor_fmt_capturechk(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)\r
2667 {\r
2668     bool ret = false;\r
2669 \r
2670         if ((mf->width == 1024) && (mf->height == 768)) {\r
2671                 ret = true;\r
2672         } else if ((mf->width == 1280) && (mf->height == 1024)) {\r
2673                 ret = true;\r
2674         } else if ((mf->width == 1600) && (mf->height == 1200)) {\r
2675                 ret = true;\r
2676         } else if ((mf->width == 2048) && (mf->height == 1536)) {\r
2677                 ret = true;\r
2678         } else if ((mf->width == 2592) && (mf->height == 1944)) {\r
2679                 ret = true;\r
2680         }\r
2681 \r
2682         if (ret == true)\r
2683                 SENSOR_DG("%s %dx%d is capture format\n", __FUNCTION__, mf->width, mf->height);\r
2684         return ret;\r
2685 }\r
2686 \r
2687 static bool sensor_fmt_videochk(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)\r
2688 {\r
2689     bool ret = false;\r
2690 \r
2691         if ((mf->width == 1280) && (mf->height == 720)) {\r
2692                 ret = true;\r
2693         } else if ((mf->width == 1920) && (mf->height == 1080)) {\r
2694                 ret = true;\r
2695         }\r
2696 \r
2697         if (ret == true)\r
2698                 SENSOR_DG("%s %dx%d is video format\n", __FUNCTION__, mf->width, mf->height);\r
2699         return ret;\r
2700 }\r
2701 static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)\r
2702 {\r
2703     int ret1;\r
2704 \r
2705     struct i2c_client *client = v4l2_get_subdevdata(sd);\r
2706     const struct sensor_datafmt *fmt;\r
2707     struct sensor *sensor = to_sensor(client);\r
2708         const struct v4l2_queryctrl *qctrl;\r
2709         struct soc_camera_device *icd = client->dev.platform_data;\r
2710     struct reginfo *winseqe_set_addr=NULL;\r
2711     int ret=0, set_w,set_h;\r
2712 \r
2713 \r
2714         /////////////////  \r
2715 #if  1\r
2716 char value;\r
2717 unsigned   int pid=0,shutter,temp_reg;\r
2718 \r
2719 #endif\r
2720 \r
2721 //////////////////\r
2722 \r
2723 \r
2724 \r
2725         fmt = sensor_find_datafmt(mf->code, sensor_colour_fmts,\r
2726                                    ARRAY_SIZE(sensor_colour_fmts));\r
2727         if (!fmt) {\r
2728         ret = -EINVAL;\r
2729         goto sensor_s_fmt_end;\r
2730     }\r
2731 \r
2732         if (sensor->info_priv.fmt.code != mf->code) {\r
2733                 switch (mf->code)\r
2734                 {\r
2735                         case V4L2_MBUS_FMT_YUYV8_2X8:\r
2736                         {\r
2737                                 winseqe_set_addr = sensor_ClrFmt_YUYV;\r
2738                                 break;\r
2739                         }\r
2740                         case V4L2_MBUS_FMT_UYVY8_2X8:\r
2741                         {\r
2742                                 winseqe_set_addr = sensor_ClrFmt_UYVY;\r
2743                                 break;\r
2744                         }\r
2745                         default:\r
2746                                 break;\r
2747                 }\r
2748                 if (winseqe_set_addr != NULL) {\r
2749             sensor_write_array(client, winseqe_set_addr);\r
2750                         sensor->info_priv.fmt.code = mf->code;\r
2751             sensor->info_priv.fmt.colorspace= mf->colorspace;            \r
2752                         SENSOR_DG("%s v4l2_mbus_code:%d set success!\n", SENSOR_NAME_STRING(),mf->code);\r
2753                 } else {\r
2754                         SENSOR_TR("%s v4l2_mbus_code:%d is invalidate!\n", SENSOR_NAME_STRING(),mf->code);\r
2755                 }\r
2756         }\r
2757 \r
2758     set_w = mf->width;\r
2759     set_h = mf->height;\r
2760 \r
2761         if (((set_w <= 176) && (set_h <= 144)) && sensor_qcif[0].reg)\r
2762         {\r
2763                 winseqe_set_addr = sensor_qcif;\r
2764         set_w = 176;\r
2765         set_h = 144;\r
2766         }\r
2767         else if (((set_w <= 320) && (set_h <= 240)) && sensor_qvga[0].reg)\r
2768     {\r
2769         winseqe_set_addr = sensor_qvga;\r
2770         set_w = 320;\r
2771         set_h = 240;\r
2772     }\r
2773     else if (((set_w <= 352) && (set_h<= 288)) && sensor_cif[0].reg)\r
2774     {\r
2775         winseqe_set_addr = sensor_cif;\r
2776         set_w = 352;\r
2777         set_h = 288;\r
2778     }\r
2779     else if (((set_w <= 640) && (set_h <= 480)) && sensor_vga[0].reg)\r
2780     {\r
2781         winseqe_set_addr = sensor_vga;\r
2782         set_w = 640;\r
2783         set_h = 480;\r
2784     }\r
2785     else if (((set_w <= 800) && (set_h <= 600)) && sensor_svga[0].reg)\r
2786     {\r
2787         winseqe_set_addr = sensor_svga;\r
2788         set_w = 800;\r
2789         set_h = 600;\r
2790     }\r
2791     else if (((set_w <= 1280) && (set_h <= 1024)) && sensor_sxga[0].reg)\r
2792     {\r
2793         winseqe_set_addr = sensor_sxga;\r
2794         set_w = 1280;\r
2795         set_h = 1024;\r
2796     }\r
2797     else if (((set_w <= 1600) && (set_h <= 1200)) && sensor_uxga[0].reg)\r
2798     {\r
2799         winseqe_set_addr = sensor_uxga;\r
2800         set_w = 1600;\r
2801         set_h = 1200;\r
2802     }\r
2803     else\r
2804     {\r
2805         winseqe_set_addr = SENSOR_INIT_WINSEQADR;               /* ddl@rock-chips.com : Sensor output smallest size if  isn't support app  */\r
2806         set_w = SENSOR_INIT_WIDTH;\r
2807         set_h = SENSOR_INIT_HEIGHT;\r
2808                 SENSOR_TR("\n %s..%s Format is Invalidate. pix->width = %d.. pix->height = %d\n",SENSOR_NAME_STRING(),__FUNCTION__,mf->width,mf->height);\r
2809     }\r
2810 \r
2811     if ((int)winseqe_set_addr  != sensor->info_priv.winseqe_cur_addr) {\r
2812         #if CONFIG_SENSOR_Flash\r
2813         if (sensor_fmt_capturechk(sd,mf) == true) {      /* ddl@rock-chips.com : Capture */\r
2814             if ((sensor->info_priv.flash == 1) || (sensor->info_priv.flash == 2)) {\r
2815                 sensor_ioctrl(icd, Sensor_Flash, Flash_On);\r
2816                 SENSOR_DG("%s flash on in capture!\n", SENSOR_NAME_STRING());\r
2817             }           \r
2818         } else {                                        /* ddl@rock-chips.com : Video */\r
2819             if ((sensor->info_priv.flash == 1) || (sensor->info_priv.flash == 2)) {\r
2820                 sensor_ioctrl(icd, Sensor_Flash, Flash_Off);\r
2821                 SENSOR_DG("%s flash off in preivew!\n", SENSOR_NAME_STRING());\r
2822             }\r
2823         }\r
2824         #endif\r
2825         ret |= sensor_write_array(client, winseqe_set_addr);\r
2826                 msleep(200);\r
2827 #if 1\r
2828                 if (winseqe_set_addr == sensor_uxga) { \r
2829 \r
2830 \r
2831                                 sensor_write(client, 0xfe, 0x00);\r
2832                                 sensor_write(client, 0xb6, 0x02);\r
2833 \r
2834 \r
2835                                 sensor_read(client, 0x03, &value);\r
2836                                 pid |= (value << 8);\r
2837                                sensor_read(client, 0x04, &value);\r
2838                                 pid |= (value & 0xff);\r
2839                                 shutter=pid;\r
2840 \r
2841 \r
2842                                 temp_reg= shutter /2;   // 2\r
2843 \r
2844                                 if(temp_reg < 1) temp_reg = 1;\r
2845 \r
2846 \r
2847                                 sensor_write(client, 0x03, ((temp_reg>>8)&0xff));\r
2848                                 sensor_write(client, 0x04, (temp_reg&0xff));\r
2849 \r
2850 \r
2851 \r
2852         }\r
2853                 \r
2854 \r
2855                 if ((winseqe_set_addr == sensor_svga)||(winseqe_set_addr == sensor_vga) ){\r
2856                         mdelay(50);//200\r
2857                         sensor_write(client, 0xB6, 0x03);\r
2858                         mdelay(300);\r
2859         } \r
2860 #endif   //james\r
2861 \r
2862         if (ret != 0) {\r
2863             SENSOR_TR("%s set format capability failed\n", SENSOR_NAME_STRING());\r
2864             #if CONFIG_SENSOR_Flash\r
2865             if (sensor_fmt_capturechk(sd,mf) == true) {\r
2866                 if ((sensor->info_priv.flash == 1) || (sensor->info_priv.flash == 2)) {\r
2867                     sensor_ioctrl(icd, Sensor_Flash, Flash_Off);\r
2868                     SENSOR_TR("%s Capture format set fail, flash off !\n", SENSOR_NAME_STRING());\r
2869                 }\r
2870             }\r
2871             #endif\r
2872             goto sensor_s_fmt_end;\r
2873         }\r
2874 \r
2875         sensor->info_priv.winseqe_cur_addr  = (int)winseqe_set_addr;\r
2876 \r
2877                 if (sensor_fmt_capturechk(sd,mf) == true) {                                 /* ddl@rock-chips.com : Capture */\r
2878                         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);\r
2879                         sensor_set_effect(icd, qctrl,sensor->info_priv.effect);\r
2880                         if (sensor->info_priv.whiteBalance != 0) {\r
2881                                 qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_DO_WHITE_BALANCE);\r
2882                                 sensor_set_whiteBalance(icd, qctrl,sensor->info_priv.whiteBalance);\r
2883                         }\r
2884                         sensor->info_priv.snap2preview = true;\r
2885                 } else if (sensor_fmt_videochk(sd,mf) == true) {                        /* ddl@rock-chips.com : Video */\r
2886                         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);\r
2887                         sensor_set_effect(icd, qctrl,sensor->info_priv.effect);\r
2888                         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_DO_WHITE_BALANCE);\r
2889                         sensor_set_whiteBalance(icd, qctrl,sensor->info_priv.whiteBalance);\r
2890                         sensor->info_priv.video2preview = true;\r
2891                 } else if ((sensor->info_priv.snap2preview == true) || (sensor->info_priv.video2preview == true)) {\r
2892                         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);\r
2893                         sensor_set_effect(icd, qctrl,sensor->info_priv.effect);\r
2894                         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_DO_WHITE_BALANCE);\r
2895                         sensor_set_whiteBalance(icd, qctrl,sensor->info_priv.whiteBalance);\r
2896                         sensor->info_priv.video2preview = false;\r
2897                         sensor->info_priv.snap2preview = false;\r
2898                 }\r
2899 \r
2900         SENSOR_DG("\n%s..%s.. icd->width = %d.. icd->height %d\n",SENSOR_NAME_STRING(),__FUNCTION__,set_w,set_h);\r
2901     }\r
2902     else\r
2903     {\r
2904         SENSOR_DG("\n %s .. Current Format is validate. icd->width = %d.. icd->height %d\n",SENSOR_NAME_STRING(),set_w,set_h);\r
2905     }\r
2906 \r
2907         mf->width = set_w;\r
2908     mf->height = set_h;\r
2909         msleep(100);\r
2910 \r
2911 sensor_s_fmt_end:\r
2912     return ret;\r
2913 }\r
2914 \r
2915 static int sensor_try_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)\r
2916 {\r
2917     struct i2c_client *client = v4l2_get_subdevdata(sd);\r
2918     struct sensor *sensor = to_sensor(client);\r
2919     const struct sensor_datafmt *fmt;\r
2920     int ret = 0,set_w,set_h;\r
2921    \r
2922         fmt = sensor_find_datafmt(mf->code, sensor_colour_fmts,\r
2923                                    ARRAY_SIZE(sensor_colour_fmts));\r
2924         if (fmt == NULL) {\r
2925                 fmt = &sensor->info_priv.fmt;\r
2926         mf->code = fmt->code;\r
2927         } \r
2928 \r
2929     if (mf->height > SENSOR_MAX_HEIGHT)\r
2930         mf->height = SENSOR_MAX_HEIGHT;\r
2931     else if (mf->height < SENSOR_MIN_HEIGHT)\r
2932         mf->height = SENSOR_MIN_HEIGHT;\r
2933 \r
2934     if (mf->width > SENSOR_MAX_WIDTH)\r
2935         mf->width = SENSOR_MAX_WIDTH;\r
2936     else if (mf->width < SENSOR_MIN_WIDTH)\r
2937         mf->width = SENSOR_MIN_WIDTH;\r
2938 \r
2939     set_w = mf->width;\r
2940     set_h = mf->height;\r
2941 \r
2942         if (((set_w <= 176) && (set_h <= 144)) && sensor_qcif[0].reg)\r
2943         {\r
2944         set_w = 176;\r
2945         set_h = 144;\r
2946         }\r
2947         else if (((set_w <= 320) && (set_h <= 240)) && sensor_qvga[0].reg)\r
2948     {\r
2949         set_w = 320;\r
2950         set_h = 240;\r
2951     }\r
2952     else if (((set_w <= 352) && (set_h<= 288)) && sensor_cif[0].reg)\r
2953     {\r
2954         set_w = 352;\r
2955         set_h = 288;\r
2956     }\r
2957     else if (((set_w <= 640) && (set_h <= 480)) && sensor_vga[0].reg)\r
2958     {\r
2959         set_w = 640;\r
2960         set_h = 480;\r
2961     }\r
2962     else if (((set_w <= 800) && (set_h <= 600)) && sensor_svga[0].reg)\r
2963     {\r
2964         set_w = 800;\r
2965         set_h = 600;\r
2966     }\r
2967     else if (((set_w <= 1280) && (set_h <= 1024)) && sensor_sxga[0].reg)\r
2968     {\r
2969         set_w = 1280;\r
2970         set_h = 1024;\r
2971     }\r
2972     else if (((set_w <= 1600) && (set_h <= 1200)) && sensor_uxga[0].reg)\r
2973     {\r
2974         set_w = 1600;\r
2975         set_h = 1200;\r
2976     }\r
2977     else\r
2978     {\r
2979         set_w = SENSOR_INIT_WIDTH;\r
2980         set_h = SENSOR_INIT_HEIGHT;\r
2981     }\r
2982 \r
2983         mf->width = set_w;\r
2984     mf->height = set_h;\r
2985     mf->colorspace = fmt->colorspace;\r
2986     \r
2987     return ret;\r
2988 }\r
2989 \r
2990  static int sensor_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *id)\r
2991 {\r
2992     struct i2c_client *client = v4l2_get_subdevdata(sd);\r
2993 \r
2994     if (id->match.type != V4L2_CHIP_MATCH_I2C_ADDR)\r
2995         return -EINVAL;\r
2996 \r
2997     if (id->match.addr != client->addr)\r
2998         return -ENODEV;\r
2999 \r
3000     id->ident = SENSOR_V4L2_IDENT;      /* ddl@rock-chips.com :  Return gc2035  identifier */\r
3001     id->revision = 0;\r
3002 \r
3003     return 0;\r
3004 }\r
3005 #if CONFIG_SENSOR_Brightness\r
3006 static int sensor_set_brightness(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
3007 {\r
3008     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
3009 \r
3010     if ((value >= qctrl->minimum) && (value <= qctrl->maximum))\r
3011     {\r
3012         if (sensor_BrightnessSeqe[value - qctrl->minimum] != NULL)\r
3013         {\r
3014             if (sensor_write_array(client, sensor_BrightnessSeqe[value - qctrl->minimum]) != 0)\r
3015             {\r
3016                 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
3017                 return -EINVAL;\r
3018             }\r
3019             SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
3020             return 0;\r
3021         }\r
3022     }\r
3023         SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
3024     return -EINVAL;\r
3025 }\r
3026 #endif\r
3027 #if CONFIG_SENSOR_Effect\r
3028 static int sensor_set_effect(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
3029 {\r
3030     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
3031 \r
3032     if ((value >= qctrl->minimum) && (value <= qctrl->maximum))\r
3033     {\r
3034         if (sensor_EffectSeqe[value - qctrl->minimum] != NULL)\r
3035         {\r
3036             if (sensor_write_array(client, sensor_EffectSeqe[value - qctrl->minimum]) != 0)\r
3037             {\r
3038                 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
3039                 return -EINVAL;\r
3040             }\r
3041             SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
3042             return 0;\r
3043         }\r
3044     }\r
3045         SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
3046     return -EINVAL;\r
3047 }\r
3048 #endif\r
3049 #if CONFIG_SENSOR_Exposure\r
3050 static int sensor_set_exposure(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
3051 {\r
3052     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
3053 \r
3054     if ((value >= qctrl->minimum) && (value <= qctrl->maximum))\r
3055     {\r
3056         if (sensor_ExposureSeqe[value - qctrl->minimum] != NULL)\r
3057         {\r
3058             if (sensor_write_array(client, sensor_ExposureSeqe[value - qctrl->minimum]) != 0)\r
3059             {\r
3060                 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
3061                 return -EINVAL;\r
3062             }\r
3063             SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
3064             return 0;\r
3065         }\r
3066     }\r
3067         SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
3068     return -EINVAL;\r
3069 }\r
3070 #endif\r
3071 #if CONFIG_SENSOR_Saturation\r
3072 static int sensor_set_saturation(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
3073 {\r
3074     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
3075 \r
3076     if ((value >= qctrl->minimum) && (value <= qctrl->maximum))\r
3077     {\r
3078         if (sensor_SaturationSeqe[value - qctrl->minimum] != NULL)\r
3079         {\r
3080             if (sensor_write_array(client, sensor_SaturationSeqe[value - qctrl->minimum]) != 0)\r
3081             {\r
3082                 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
3083                 return -EINVAL;\r
3084             }\r
3085             SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
3086             return 0;\r
3087         }\r
3088     }\r
3089     SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
3090     return -EINVAL;\r
3091 }\r
3092 #endif\r
3093 #if CONFIG_SENSOR_Contrast\r
3094 static int sensor_set_contrast(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
3095 {\r
3096     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
3097 \r
3098     if ((value >= qctrl->minimum) && (value <= qctrl->maximum))\r
3099     {\r
3100         if (sensor_ContrastSeqe[value - qctrl->minimum] != NULL)\r
3101         {\r
3102             if (sensor_write_array(client, sensor_ContrastSeqe[value - qctrl->minimum]) != 0)\r
3103             {\r
3104                 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
3105                 return -EINVAL;\r
3106             }\r
3107             SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
3108             return 0;\r
3109         }\r
3110     }\r
3111     SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
3112     return -EINVAL;\r
3113 }\r
3114 #endif\r
3115 #if CONFIG_SENSOR_Mirror\r
3116 static int sensor_set_mirror(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
3117 {\r
3118     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
3119 \r
3120     if ((value >= qctrl->minimum) && (value <= qctrl->maximum))\r
3121     {\r
3122         if (sensor_MirrorSeqe[value - qctrl->minimum] != NULL)\r
3123         {\r
3124             if (sensor_write_array(client, sensor_MirrorSeqe[value - qctrl->minimum]) != 0)\r
3125             {\r
3126                 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
3127                 return -EINVAL;\r
3128             }\r
3129             SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
3130             return 0;\r
3131         }\r
3132     }\r
3133     SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
3134     return -EINVAL;\r
3135 }\r
3136 #endif\r
3137 #if CONFIG_SENSOR_Flip\r
3138 static int sensor_set_flip(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
3139 {\r
3140     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
3141 \r
3142     if ((value >= qctrl->minimum) && (value <= qctrl->maximum))\r
3143     {\r
3144         if (sensor_FlipSeqe[value - qctrl->minimum] != NULL)\r
3145         {\r
3146             if (sensor_write_array(client, sensor_FlipSeqe[value - qctrl->minimum]) != 0)\r
3147             {\r
3148                 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
3149                 return -EINVAL;\r
3150             }\r
3151             SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
3152             return 0;\r
3153         }\r
3154     }\r
3155     SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
3156     return -EINVAL;\r
3157 }\r
3158 #endif\r
3159 #if CONFIG_SENSOR_Scene\r
3160 static int sensor_set_scene(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
3161 {\r
3162     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
3163 \r
3164     if ((value >= qctrl->minimum) && (value <= qctrl->maximum))\r
3165     {\r
3166         if (sensor_SceneSeqe[value - qctrl->minimum] != NULL)\r
3167         {\r
3168             if (sensor_write_array(client, sensor_SceneSeqe[value - qctrl->minimum]) != 0)\r
3169             {\r
3170                 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
3171                 return -EINVAL;\r
3172             }\r
3173             SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
3174             return 0;\r
3175         }\r
3176     }\r
3177     SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
3178     return -EINVAL;\r
3179 }\r
3180 #endif\r
3181 #if CONFIG_SENSOR_WhiteBalance\r
3182 static int sensor_set_whiteBalance(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
3183 {\r
3184     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
3185 \r
3186     if ((value >= qctrl->minimum) && (value <= qctrl->maximum))\r
3187     {\r
3188         if (sensor_WhiteBalanceSeqe[value - qctrl->minimum] != NULL)\r
3189         {\r
3190             if (sensor_write_array(client, sensor_WhiteBalanceSeqe[value - qctrl->minimum]) != 0)\r
3191             {\r
3192                 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
3193                 return -EINVAL;\r
3194             }\r
3195             SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
3196             return 0;\r
3197         }\r
3198     }\r
3199         SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
3200     return -EINVAL;\r
3201 }\r
3202 #endif\r
3203 #if CONFIG_SENSOR_DigitalZoom\r
3204 static int sensor_set_digitalzoom(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int *value)\r
3205 {\r
3206     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
3207     struct sensor *sensor = to_sensor(client);\r
3208         const struct v4l2_queryctrl *qctrl_info;\r
3209     int digitalzoom_cur, digitalzoom_total;\r
3210 \r
3211         qctrl_info = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_ZOOM_ABSOLUTE);\r
3212         if (qctrl_info)\r
3213                 return -EINVAL;\r
3214 \r
3215     digitalzoom_cur = sensor->info_priv.digitalzoom;\r
3216     digitalzoom_total = qctrl_info->maximum;\r
3217 \r
3218     if ((value > 0) && (digitalzoom_cur >= digitalzoom_total))\r
3219     {\r
3220         SENSOR_TR("%s digitalzoom is maximum - %x\n", SENSOR_NAME_STRING(), digitalzoom_cur);\r
3221         return -EINVAL;\r
3222     }\r
3223 \r
3224     if  ((value < 0) && (digitalzoom_cur <= qctrl_info->minimum))\r
3225     {\r
3226         SENSOR_TR("%s digitalzoom is minimum - %x\n", SENSOR_NAME_STRING(), digitalzoom_cur);\r
3227         return -EINVAL;\r
3228     }\r
3229 \r
3230     if ((value > 0) && ((digitalzoom_cur + value) > digitalzoom_total))\r
3231     {\r
3232         value = digitalzoom_total - digitalzoom_cur;\r
3233     }\r
3234 \r
3235     if ((value < 0) && ((digitalzoom_cur + value) < 0))\r
3236     {\r
3237         value = 0 - digitalzoom_cur;\r
3238     }\r
3239 \r
3240     digitalzoom_cur += value;\r
3241 \r
3242     if (sensor_ZoomSeqe[digitalzoom_cur] != NULL)\r
3243     {\r
3244         if (sensor_write_array(client, sensor_ZoomSeqe[digitalzoom_cur]) != 0)\r
3245         {\r
3246             SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
3247             return -EINVAL;\r
3248         }\r
3249         SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
3250         return 0;\r
3251     }\r
3252 \r
3253     return -EINVAL;\r
3254 }\r
3255 #endif\r
3256 #if CONFIG_SENSOR_Flash\r
3257 static int sensor_set_flash(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
3258 {    \r
3259     if ((value >= qctrl->minimum) && (value <= qctrl->maximum)) {\r
3260         if (value == 3) {       /* ddl@rock-chips.com: torch */\r
3261             sensor_ioctrl(icd, Sensor_Flash, Flash_Torch);   /* Flash On */\r
3262         } else {\r
3263             sensor_ioctrl(icd, Sensor_Flash, Flash_Off);\r
3264         }\r
3265         SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
3266         return 0;\r
3267     }\r
3268     \r
3269         SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
3270     return -EINVAL;\r
3271 }\r
3272 #endif\r
3273 \r
3274 static int sensor_g_control(struct v4l2_subdev *sd, struct v4l2_control *ctrl)\r
3275 {\r
3276     struct i2c_client *client = v4l2_get_subdevdata(sd);\r
3277     struct sensor *sensor = to_sensor(client);\r
3278     const struct v4l2_queryctrl *qctrl;\r
3279 \r
3280     qctrl = soc_camera_find_qctrl(&sensor_ops, ctrl->id);\r
3281 \r
3282     if (!qctrl)\r
3283     {\r
3284         SENSOR_TR("\n %s ioctrl id = %d  is invalidate \n", SENSOR_NAME_STRING(), ctrl->id);\r
3285         return -EINVAL;\r
3286     }\r
3287 \r
3288     switch (ctrl->id)\r
3289     {\r
3290         case V4L2_CID_BRIGHTNESS:\r
3291             {\r
3292                 ctrl->value = sensor->info_priv.brightness;\r
3293                 break;\r
3294             }\r
3295         case V4L2_CID_SATURATION:\r
3296             {\r
3297                 ctrl->value = sensor->info_priv.saturation;\r
3298                 break;\r
3299             }\r
3300         case V4L2_CID_CONTRAST:\r
3301             {\r
3302                 ctrl->value = sensor->info_priv.contrast;\r
3303                 break;\r
3304             }\r
3305         case V4L2_CID_DO_WHITE_BALANCE:\r
3306             {\r
3307                 ctrl->value = sensor->info_priv.whiteBalance;\r
3308                 break;\r
3309             }\r
3310         case V4L2_CID_EXPOSURE:\r
3311             {\r
3312                 ctrl->value = sensor->info_priv.exposure;\r
3313                 break;\r
3314             }\r
3315         case V4L2_CID_HFLIP:\r
3316             {\r
3317                 ctrl->value = sensor->info_priv.mirror;\r
3318                 break;\r
3319             }\r
3320         case V4L2_CID_VFLIP:\r
3321             {\r
3322                 ctrl->value = sensor->info_priv.flip;\r
3323                 break;\r
3324             }\r
3325         default :\r
3326                 break;\r
3327     }\r
3328     return 0;\r
3329 }\r
3330 \r
3331 \r
3332 \r
3333 static int sensor_s_control(struct v4l2_subdev *sd, struct v4l2_control *ctrl)\r
3334 {\r
3335     struct i2c_client *client = v4l2_get_subdevdata(sd);\r
3336     struct sensor *sensor = to_sensor(client);\r
3337     struct soc_camera_device *icd = client->dev.platform_data;\r
3338     const struct v4l2_queryctrl *qctrl;\r
3339 \r
3340 \r
3341     qctrl = soc_camera_find_qctrl(&sensor_ops, ctrl->id);\r
3342 \r
3343     if (!qctrl)\r
3344     {\r
3345         SENSOR_TR("\n %s ioctrl id = %d  is invalidate \n", SENSOR_NAME_STRING(), ctrl->id);\r
3346         return -EINVAL;\r
3347     }\r
3348 \r
3349     switch (ctrl->id)\r
3350     {\r
3351 #if CONFIG_SENSOR_Brightness\r
3352         case V4L2_CID_BRIGHTNESS:\r
3353             {\r
3354                 if (ctrl->value != sensor->info_priv.brightness)\r
3355                 {\r
3356                     if (sensor_set_brightness(icd, qctrl,ctrl->value) != 0)\r
3357                     {\r
3358                         return -EINVAL;\r
3359                     }\r
3360                     sensor->info_priv.brightness = ctrl->value;\r
3361                 }\r
3362                 break;\r
3363             }\r
3364 #endif\r
3365 #if CONFIG_SENSOR_Exposure\r
3366         case V4L2_CID_EXPOSURE:\r
3367             {\r
3368                 if (ctrl->value != sensor->info_priv.exposure)\r
3369                 {\r
3370                     if (sensor_set_exposure(icd, qctrl,ctrl->value) != 0)\r
3371                     {\r
3372                         return -EINVAL;\r
3373                     }\r
3374                     sensor->info_priv.exposure = ctrl->value;\r
3375                 }\r
3376                 break;\r
3377             }\r
3378 #endif\r
3379 #if CONFIG_SENSOR_Saturation\r
3380         case V4L2_CID_SATURATION:\r
3381             {\r
3382                 if (ctrl->value != sensor->info_priv.saturation)\r
3383                 {\r
3384                     if (sensor_set_saturation(icd, qctrl,ctrl->value) != 0)\r
3385                     {\r
3386                         return -EINVAL;\r
3387                     }\r
3388                     sensor->info_priv.saturation = ctrl->value;\r
3389                 }\r
3390                 break;\r
3391             }\r
3392 #endif\r
3393 #if CONFIG_SENSOR_Contrast\r
3394         case V4L2_CID_CONTRAST:\r
3395             {\r
3396                 if (ctrl->value != sensor->info_priv.contrast)\r
3397                 {\r
3398                     if (sensor_set_contrast(icd, qctrl,ctrl->value) != 0)\r
3399                     {\r
3400                         return -EINVAL;\r
3401                     }\r
3402                     sensor->info_priv.contrast = ctrl->value;\r
3403                 }\r
3404                 break;\r
3405             }\r
3406 #endif\r
3407 #if CONFIG_SENSOR_WhiteBalance\r
3408         case V4L2_CID_DO_WHITE_BALANCE:\r
3409             {\r
3410                 if (ctrl->value != sensor->info_priv.whiteBalance)\r
3411                 {\r
3412                     if (sensor_set_whiteBalance(icd, qctrl,ctrl->value) != 0)\r
3413                     {\r
3414                         return -EINVAL;\r
3415                     }\r
3416                     sensor->info_priv.whiteBalance = ctrl->value;\r
3417                 }\r
3418                 break;\r
3419             }\r
3420 #endif\r
3421 #if CONFIG_SENSOR_Mirror\r
3422         case V4L2_CID_HFLIP:\r
3423             {\r
3424                 if (ctrl->value != sensor->info_priv.mirror)\r
3425                 {\r
3426                     if (sensor_set_mirror(icd, qctrl,ctrl->value) != 0)\r
3427                         return -EINVAL;\r
3428                     sensor->info_priv.mirror = ctrl->value;\r
3429                 }\r
3430                 break;\r
3431             }\r
3432 #endif\r
3433 #if CONFIG_SENSOR_Flip\r
3434         case V4L2_CID_VFLIP:\r
3435             {\r
3436                 if (ctrl->value != sensor->info_priv.flip)\r
3437                 {\r
3438                     if (sensor_set_flip(icd, qctrl,ctrl->value) != 0)\r
3439                         return -EINVAL;\r
3440                     sensor->info_priv.flip = ctrl->value;\r
3441                 }\r
3442                 break;\r
3443             }\r
3444 #endif\r
3445         default:\r
3446             break;\r
3447     }\r
3448 \r
3449     return 0;\r
3450 }\r
3451 static int sensor_g_ext_control(struct soc_camera_device *icd , struct v4l2_ext_control *ext_ctrl)\r
3452 {\r
3453     const struct v4l2_queryctrl *qctrl;\r
3454     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
3455     struct sensor *sensor = to_sensor(client);\r
3456 \r
3457     qctrl = soc_camera_find_qctrl(&sensor_ops, ext_ctrl->id);\r
3458 \r
3459     if (!qctrl)\r
3460     {\r
3461         SENSOR_TR("\n %s ioctrl id = %d  is invalidate \n", SENSOR_NAME_STRING(), ext_ctrl->id);\r
3462         return -EINVAL;\r
3463     }\r
3464 \r
3465     switch (ext_ctrl->id)\r
3466     {\r
3467         case V4L2_CID_SCENE:\r
3468             {\r
3469                 ext_ctrl->value = sensor->info_priv.scene;\r
3470                 break;\r
3471             }\r
3472         case V4L2_CID_EFFECT:\r
3473             {\r
3474                 ext_ctrl->value = sensor->info_priv.effect;\r
3475                 break;\r
3476             }\r
3477         case V4L2_CID_ZOOM_ABSOLUTE:\r
3478             {\r
3479                 ext_ctrl->value = sensor->info_priv.digitalzoom;\r
3480                 break;\r
3481             }\r
3482         case V4L2_CID_ZOOM_RELATIVE:\r
3483             {\r
3484                 return -EINVAL;\r
3485             }\r
3486         case V4L2_CID_FOCUS_ABSOLUTE:\r
3487             {\r
3488                 ext_ctrl->value = sensor->info_priv.focus;\r
3489                 break;\r
3490             }\r
3491         case V4L2_CID_FOCUS_RELATIVE:\r
3492             {\r
3493                 return -EINVAL;\r
3494             }\r
3495         case V4L2_CID_FLASH:\r
3496             {\r
3497                 ext_ctrl->value = sensor->info_priv.flash;\r
3498                 break;\r
3499             }\r
3500         default :\r
3501             break;\r
3502     }\r
3503     return 0;\r
3504 }\r
3505 static int sensor_s_ext_control(struct soc_camera_device *icd, struct v4l2_ext_control *ext_ctrl)\r
3506 {\r
3507     const struct v4l2_queryctrl *qctrl;\r
3508     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
3509     struct sensor *sensor = to_sensor(client);\r
3510     int val_offset;\r
3511 \r
3512     qctrl = soc_camera_find_qctrl(&sensor_ops, ext_ctrl->id);\r
3513 \r
3514     if (!qctrl)\r
3515     {\r
3516         SENSOR_TR("\n %s ioctrl id = %d  is invalidate \n", SENSOR_NAME_STRING(), ext_ctrl->id);\r
3517         return -EINVAL;\r
3518     }\r
3519 \r
3520         val_offset = 0;\r
3521     switch (ext_ctrl->id)\r
3522     {\r
3523 #if CONFIG_SENSOR_Scene\r
3524         case V4L2_CID_SCENE:\r
3525             {\r
3526                 if (ext_ctrl->value != sensor->info_priv.scene)\r
3527                 {\r
3528                     if (sensor_set_scene(icd, qctrl,ext_ctrl->value) != 0)\r
3529                         return -EINVAL;\r
3530                     sensor->info_priv.scene = ext_ctrl->value;\r
3531                 }\r
3532                 break;\r
3533             }\r
3534 #endif\r
3535 #if CONFIG_SENSOR_Effect\r
3536         case V4L2_CID_EFFECT:\r
3537             {\r
3538                 if (ext_ctrl->value != sensor->info_priv.effect)\r
3539                 {\r
3540                     if (sensor_set_effect(icd, qctrl,ext_ctrl->value) != 0)\r
3541                         return -EINVAL;\r
3542                     sensor->info_priv.effect= ext_ctrl->value;\r
3543                 }\r
3544                 break;\r
3545             }\r
3546 #endif\r
3547 #if CONFIG_SENSOR_DigitalZoom\r
3548         case V4L2_CID_ZOOM_ABSOLUTE:\r
3549             {\r
3550                 if ((ext_ctrl->value < qctrl->minimum) || (ext_ctrl->value > qctrl->maximum))\r
3551                     return -EINVAL;\r
3552 \r
3553                 if (ext_ctrl->value != sensor->info_priv.digitalzoom)\r
3554                 {\r
3555                     val_offset = ext_ctrl->value -sensor->info_priv.digitalzoom;\r
3556 \r
3557                     if (sensor_set_digitalzoom(icd, qctrl,&val_offset) != 0)\r
3558                         return -EINVAL;\r
3559                     sensor->info_priv.digitalzoom += val_offset;\r
3560 \r
3561                     SENSOR_DG("%s digitalzoom is %x\n",SENSOR_NAME_STRING(),  sensor->info_priv.digitalzoom);\r
3562                 }\r
3563 \r
3564                 break;\r
3565             }\r
3566         case V4L2_CID_ZOOM_RELATIVE:\r
3567             {\r
3568                 if (ext_ctrl->value)\r
3569                 {\r
3570                     if (sensor_set_digitalzoom(icd, qctrl,&ext_ctrl->value) != 0)\r
3571                         return -EINVAL;\r
3572                     sensor->info_priv.digitalzoom += ext_ctrl->value;\r
3573 \r
3574                     SENSOR_DG("%s digitalzoom is %x\n", SENSOR_NAME_STRING(), sensor->info_priv.digitalzoom);\r
3575                 }\r
3576                 break;\r
3577             }\r
3578 #endif\r
3579 #if CONFIG_SENSOR_Focus\r
3580         case V4L2_CID_FOCUS_ABSOLUTE:\r
3581             {\r
3582                 if ((ext_ctrl->value < qctrl->minimum) || (ext_ctrl->value > qctrl->maximum))\r
3583                     return -EINVAL;\r
3584 \r
3585                 if (ext_ctrl->value != sensor->info_priv.focus)\r
3586                 {\r
3587                     val_offset = ext_ctrl->value -sensor->info_priv.focus;\r
3588 \r
3589                     sensor->info_priv.focus += val_offset;\r
3590                 }\r
3591 \r
3592                 break;\r
3593             }\r
3594         case V4L2_CID_FOCUS_RELATIVE:\r
3595             {\r
3596                 if (ext_ctrl->value)\r
3597                 {\r
3598                     sensor->info_priv.focus += ext_ctrl->value;\r
3599 \r
3600                     SENSOR_DG("%s focus is %x\n", SENSOR_NAME_STRING(), sensor->info_priv.focus);\r
3601                 }\r
3602                 break;\r
3603             }\r
3604 #endif\r
3605 #if CONFIG_SENSOR_Flash\r
3606         case V4L2_CID_FLASH:\r
3607             {\r
3608                 if (sensor_set_flash(icd, qctrl,ext_ctrl->value) != 0)\r
3609                     return -EINVAL;\r
3610                 sensor->info_priv.flash = ext_ctrl->value;\r
3611 \r
3612                 SENSOR_DG("%s flash is %x\n",SENSOR_NAME_STRING(), sensor->info_priv.flash);\r
3613                 break;\r
3614             }\r
3615 #endif\r
3616         default:\r
3617             break;\r
3618     }\r
3619 \r
3620     return 0;\r
3621 }\r
3622 \r
3623 static int sensor_g_ext_controls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ext_ctrl)\r
3624 {\r
3625     struct i2c_client *client = v4l2_get_subdevdata(sd);\r
3626     struct soc_camera_device *icd = client->dev.platform_data;\r
3627     int i, error_cnt=0, error_idx=-1;\r
3628 \r
3629 \r
3630     for (i=0; i<ext_ctrl->count; i++) {\r
3631         if (sensor_g_ext_control(icd, &ext_ctrl->controls[i]) != 0) {\r
3632             error_cnt++;\r
3633             error_idx = i;\r
3634         }\r
3635     }\r
3636 \r
3637     if (error_cnt > 1)\r
3638         error_idx = ext_ctrl->count;\r
3639 \r
3640     if (error_idx != -1) {\r
3641         ext_ctrl->error_idx = error_idx;\r
3642         return -EINVAL;\r
3643     } else {\r
3644         return 0;\r
3645     }\r
3646 }\r
3647 \r
3648 static int sensor_s_ext_controls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ext_ctrl)\r
3649 {\r
3650     struct i2c_client *client = v4l2_get_subdevdata(sd);\r
3651     struct soc_camera_device *icd = client->dev.platform_data;\r
3652     int i, error_cnt=0, error_idx=-1;\r
3653 \r
3654 \r
3655     for (i=0; i<ext_ctrl->count; i++) {\r
3656         if (sensor_s_ext_control(icd, &ext_ctrl->controls[i]) != 0) {\r
3657             error_cnt++;\r
3658             error_idx = i;\r
3659         }\r
3660     }\r
3661 \r
3662     if (error_cnt > 1)\r
3663         error_idx = ext_ctrl->count;\r
3664 \r
3665     if (error_idx != -1) {\r
3666         ext_ctrl->error_idx = error_idx;\r
3667         return -EINVAL;\r
3668     } else {\r
3669         return 0;\r
3670     }\r
3671 }\r
3672 \r
3673 /* Interface active, can use i2c. If it fails, it can indeed mean, that\r
3674  * this wasn't our capture interface, so, we wait for the right one */\r
3675 static int sensor_video_probe(struct soc_camera_device *icd,\r
3676                                struct i2c_client *client)\r
3677 {\r
3678     char value;\r
3679     int ret,pid = 0;\r
3680     struct sensor *sensor = to_sensor(client);\r
3681 \r
3682     /* We must have a parent by now. And it cannot be a wrong one.\r
3683      * So this entire test is completely redundant. */\r
3684     if (!icd->dev.parent ||\r
3685             to_soc_camera_host(icd->dev.parent)->nr != icd->iface)\r
3686                 return -ENODEV;\r
3687 \r
3688         if (sensor_ioctrl(icd, Sensor_PowerDown, 0) < 0) {\r
3689                 ret = -ENODEV;\r
3690                 goto sensor_video_probe_err;\r
3691         }\r
3692 \r
3693     /* soft reset */\r
3694 \r
3695     /* check if it is an sensor sensor */\r
3696         #if 0    // honghaishen_test\r
3697     ret = sensor_read(client, 0xf0, &value);\r
3698     if (ret != 0) {\r
3699         SENSOR_TR("read chip id high byte failed\n");\r
3700         ret = -ENODEV;\r
3701         goto sensor_video_probe_err;\r
3702     }\r
3703 \r
3704     pid |= (value << 8);\r
3705 \r
3706     ret = sensor_read(client, 0xf1, &value);\r
3707     if (ret != 0) {\r
3708         SENSOR_TR("read chip id low byte failed\n");\r
3709         ret = -ENODEV;\r
3710         goto sensor_video_probe_err;\r
3711     }\r
3712 \r
3713     pid |= (value & 0xff);\r
3714     SENSOR_DG("\n %s  pid = 0x%x\n", SENSOR_NAME_STRING(), pid);\r
3715     if (pid == SENSOR_ID) {\r
3716         sensor->model = SENSOR_V4L2_IDENT;\r
3717     } else {\r
3718         SENSOR_TR("error: %s mismatched   pid = 0x%x\n", SENSOR_NAME_STRING(), pid);\r
3719         ret = -ENODEV;\r
3720         goto sensor_video_probe_err;\r
3721     }\r
3722 #endif\r
3723 sensor->model = SENSOR_V4L2_IDENT; \r
3724     return 0;\r
3725 \r
3726 sensor_video_probe_err:\r
3727 \r
3728     return ret;\r
3729 }\r
3730 static long sensor_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)\r
3731 {\r
3732         struct i2c_client *client = v4l2_get_subdevdata(sd);\r
3733     struct soc_camera_device *icd = client->dev.platform_data;\r
3734     struct sensor *sensor = to_sensor(client);\r
3735 #if CONFIG_SENSOR_Flash\r
3736     int i;\r
3737 #endif\r
3738     int ret = 0;\r
3739     \r
3740         SENSOR_DG("\n%s..%s..cmd:%x \n",SENSOR_NAME_STRING(),__FUNCTION__,cmd);\r
3741         switch (cmd)\r
3742         {\r
3743                 case RK29_CAM_SUBDEV_DEACTIVATE:\r
3744                 {\r
3745                         sensor_deactivate(client);\r
3746                         break;\r
3747                 }\r
3748 \r
3749                 case RK29_CAM_SUBDEV_IOREQUEST:\r
3750                 {\r
3751                         sensor->sensor_io_request = (struct rk29camera_platform_data*)arg;           \r
3752             if (sensor->sensor_io_request != NULL) { \r
3753                 sensor->sensor_gpio_res = NULL;\r
3754                 for (i=0; i<RK29_CAM_SUPPORT_NUMS;i++) {\r
3755                     if (sensor->sensor_io_request->gpio_res[i].dev_name && \r
3756                         (strcmp(sensor->sensor_io_request->gpio_res[i].dev_name, dev_name(icd->pdev)) == 0)) {\r
3757                         sensor->sensor_gpio_res = (struct rk29camera_gpio_res*)&sensor->sensor_io_request->gpio_res[i];\r
3758                     }\r
3759                 }\r
3760                 if (sensor->sensor_gpio_res == NULL) {\r
3761                     SENSOR_TR("%s %s obtain gpio resource failed when RK29_CAM_SUBDEV_IOREQUEST \n",SENSOR_NAME_STRING(),__FUNCTION__);\r
3762                     ret = -EINVAL;\r
3763                     goto sensor_ioctl_end;\r
3764                 }\r
3765             } else {\r
3766                 SENSOR_TR("%s %s RK29_CAM_SUBDEV_IOREQUEST fail\n",SENSOR_NAME_STRING(),__FUNCTION__);\r
3767                 ret = -EINVAL;\r
3768                 goto sensor_ioctl_end;\r
3769             }\r
3770             /* ddl@rock-chips.com : if gpio_flash havn't been set in board-xxx.c, sensor driver must notify is not support flash control \r
3771                for this project */\r
3772             #if CONFIG_SENSOR_Flash     \r
3773                 if (sensor->sensor_gpio_res) {\r
3774                 if (sensor->sensor_gpio_res->gpio_flash == INVALID_GPIO) {\r
3775                     for (i = 0; i < icd->ops->num_controls; i++) {\r
3776                                 if (V4L2_CID_FLASH == icd->ops->controls[i].id) {\r
3777                                         //memset((char*)&icd->ops->controls[i],0x00,sizeof(struct v4l2_queryctrl));  \r
3778                               sensor_controls[i].id=0xffff;                             \r
3779                                 }\r
3780                     }\r
3781                     sensor->info_priv.flash = 0xff;\r
3782                     SENSOR_DG("%s flash gpio is invalidate!\n",SENSOR_NAME_STRING());\r
3783                 }else{ //two cameras are the same,need to deal diffrently ,zyc\r
3784                     for (i = 0; i < icd->ops->num_controls; i++) {\r
3785                            if(0xffff == icd->ops->controls[i].id){\r
3786                               sensor_controls[i].id=V4L2_CID_FLASH;\r
3787                            }               \r
3788                     }\r
3789                 }\r
3790                 }\r
3791             #endif\r
3792                         break;\r
3793                 }\r
3794                 default:\r
3795                 {\r
3796                         SENSOR_TR("%s %s cmd(0x%x) is unknown !\n",SENSOR_NAME_STRING(),__FUNCTION__,cmd);\r
3797                         break;\r
3798                 }\r
3799         }\r
3800 sensor_ioctl_end:\r
3801         return ret;\r
3802 \r
3803 }\r
3804 static int sensor_enum_fmt(struct v4l2_subdev *sd, unsigned int index,\r
3805                             enum v4l2_mbus_pixelcode *code)\r
3806 {\r
3807         if (index >= ARRAY_SIZE(sensor_colour_fmts))\r
3808                 return -EINVAL;\r
3809 \r
3810         *code = sensor_colour_fmts[index].code;\r
3811         return 0;\r
3812 }\r
3813 static struct v4l2_subdev_core_ops sensor_subdev_core_ops = {\r
3814         .init           = sensor_init,\r
3815         .g_ctrl         = sensor_g_control,\r
3816         .s_ctrl         = sensor_s_control,\r
3817         .g_ext_ctrls          = sensor_g_ext_controls,\r
3818         .s_ext_ctrls          = sensor_s_ext_controls,\r
3819         .g_chip_ident   = sensor_g_chip_ident,\r
3820         .ioctl = sensor_ioctl,\r
3821 };\r
3822 \r
3823 static struct v4l2_subdev_video_ops sensor_subdev_video_ops = {\r
3824         .s_mbus_fmt     = sensor_s_fmt,\r
3825         .g_mbus_fmt     = sensor_g_fmt,\r
3826         .try_mbus_fmt   = sensor_try_fmt,\r
3827         .enum_mbus_fmt  = sensor_enum_fmt,\r
3828 };\r
3829 \r
3830 static struct v4l2_subdev_ops sensor_subdev_ops = {\r
3831         .core   = &sensor_subdev_core_ops,\r
3832         .video = &sensor_subdev_video_ops,\r
3833 };\r
3834 \r
3835 static int sensor_probe(struct i2c_client *client,\r
3836                          const struct i2c_device_id *did)\r
3837 {\r
3838     struct sensor *sensor;\r
3839     struct soc_camera_device *icd = client->dev.platform_data;\r
3840     struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);\r
3841     struct soc_camera_link *icl;\r
3842     int ret;\r
3843 \r
3844     SENSOR_DG("\n%s..%s..%d..\n",__FUNCTION__,__FILE__,__LINE__);\r
3845     if (!icd) {\r
3846         dev_err(&client->dev, "%s: missing soc-camera data!\n",SENSOR_NAME_STRING());\r
3847         return -EINVAL;\r
3848     }\r
3849 \r
3850     icl = to_soc_camera_link(icd);\r
3851     if (!icl) {\r
3852         dev_err(&client->dev, "%s driver needs platform data\n", SENSOR_NAME_STRING());\r
3853         return -EINVAL;\r
3854     }\r
3855 \r
3856     if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) {\r
3857         dev_warn(&adapter->dev,\r
3858                  "I2C-Adapter doesn't support I2C_FUNC_I2C\n");\r
3859         return -EIO;\r
3860     }\r
3861 \r
3862     sensor = kzalloc(sizeof(struct sensor), GFP_KERNEL);\r
3863     if (!sensor)\r
3864         return -ENOMEM;\r
3865 \r
3866     v4l2_i2c_subdev_init(&sensor->subdev, client, &sensor_subdev_ops);\r
3867 \r
3868     /* Second stage probe - when a capture adapter is there */\r
3869     icd->ops            = &sensor_ops;\r
3870 \r
3871     sensor->info_priv.fmt = sensor_colour_fmts[0];\r
3872     \r
3873         #if CONFIG_SENSOR_I2C_NOSCHED\r
3874         atomic_set(&sensor->tasklock_cnt,0);\r
3875         #endif\r
3876 \r
3877     ret = sensor_video_probe(icd, client);\r
3878     if (ret < 0) {\r
3879         icd->ops = NULL;\r
3880         i2c_set_clientdata(client, NULL);\r
3881         kfree(sensor);\r
3882                 sensor = NULL;\r
3883     }\r
3884         hrtimer_init(&(flash_off_timer.timer), CLOCK_MONOTONIC, HRTIMER_MODE_REL);\r
3885     SENSOR_DG("\n%s..%s..%d  ret = %x \n",__FUNCTION__,__FILE__,__LINE__,ret);\r
3886     return ret;\r
3887 }\r
3888 \r
3889 static int sensor_remove(struct i2c_client *client)\r
3890 {\r
3891     struct sensor *sensor = to_sensor(client);\r
3892     struct soc_camera_device *icd = client->dev.platform_data;\r
3893 \r
3894     icd->ops = NULL;\r
3895     i2c_set_clientdata(client, NULL);\r
3896     client->driver = NULL;\r
3897     kfree(sensor);\r
3898 \r
3899     return 0;\r
3900 }\r
3901 \r
3902 static const struct i2c_device_id sensor_id[] = {\r
3903         {SENSOR_NAME_STRING(), 0 },\r
3904         { }\r
3905 };\r
3906 MODULE_DEVICE_TABLE(i2c, sensor_id);\r
3907 \r
3908 static struct i2c_driver sensor_i2c_driver = {\r
3909         .driver = {\r
3910                 .name = SENSOR_NAME_STRING(),\r
3911         },\r
3912         .probe          = sensor_probe,\r
3913         .remove         = sensor_remove,\r
3914         .id_table       = sensor_id,\r
3915 };\r
3916 \r
3917 static int __init sensor_mod_init(void)\r
3918 {\r
3919     SENSOR_DG("\n%s..%s.. \n",__FUNCTION__,SENSOR_NAME_STRING());\r
3920     return i2c_add_driver(&sensor_i2c_driver);\r
3921 }\r
3922 \r
3923 static void __exit sensor_mod_exit(void)\r
3924 {\r
3925     i2c_del_driver(&sensor_i2c_driver);\r
3926 }\r
3927 \r
3928 device_initcall_sync(sensor_mod_init);\r
3929 module_exit(sensor_mod_exit);\r
3930 \r
3931 MODULE_DESCRIPTION(SENSOR_NAME_STRING(Camera sensor driver));\r
3932 MODULE_AUTHOR("ddl <kernel@rock-chips>");\r
3933 MODULE_LICENSE("GPL");\r
3934 \r
3935 \r