rk312x camera : oneframe v0.1.9,pingpong v0.1.9
[firefly-linux-kernel-4.4.55.git] / drivers / media / video / gc2035_old.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    800\r
50 #define SENSOR_MIN_HEIGHT   600\r
51 #define SENSOR_MAX_WIDTH    1600\r
52 #define SENSOR_MAX_HEIGHT   1200\r
53 #define SENSOR_INIT_WIDTH         800                   /* Sensor pixel size for sensor_init_data array */\r
54 #define SENSOR_INIT_HEIGHT  600\r
55 #define SENSOR_INIT_WINSEQADR sensor_svga\r
56 #define SENSOR_INIT_PIXFMT V4L2_MBUS_FMT_YUYV8_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     100000       /* 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 \r
113 /* init 352X288 SVGA */\r
114 static struct reginfo sensor_init_data[] ={\r
115         {0xfe , 0x80},\r
116         {0xfe , 0x80},\r
117         {0xfe , 0x80},  \r
118         {0xfc , 0x06},\r
119         {0xf2 , 0x00},\r
120         {0xf3 , 0x00},\r
121         {0xf4 , 0x00},\r
122         {0xf5 , 0x00},\r
123         {0xf9 , 0xfe}, //[0] pll enable\r
124         {0xfa , 0x00},\r
125         {0xf6 , 0x00},\r
126         {0xf7 , 0x15}, //pll enable\r
127 \r
128         {0xf8 , 0x85},\r
129         {0xfe , 0x00},\r
130         {0x82 , 0x00},\r
131         {0xb3 , 0x60},\r
132         {0xb4 , 0x40},\r
133         {0xb5 , 0x60},\r
134 \r
135         {0x03 , 0x02},\r
136         {0x04 , 0x80},\r
137 \r
138         //////////measure window  ///////////\r
139         {0xfe , 0x00},\r
140         {0xec , 0x06},//04 \r
141         {0xed , 0x06},//04 \r
142         {0xee , 0x62},//60 \r
143         {0xef , 0x92},//90 \r
144 \r
145         ///////////analog/////////////\r
146         {0x0a , 0x00}, //row start\r
147         {0x0c , 0x00}, //col start\r
148         {0x0d , 0x04},\r
149         {0x0e , 0xc0},\r
150         {0x0f , 0x06}, //Window setting\r
151         {0x10 , 0x58}, \r
152         {0x17 , 0x14}, //[0]mirror [1]flip\r
153 \r
154 \r
155         {0x18 , 0x0e}, //sdark 4 row in even frame??\r
156         {0x19 , 0x0c}, //AD pipe number\r
157 \r
158         /*\r
159         ///  Ã«´Ì ÏÖÏó\r
160         {0x18 , 0x0a}, //sdark 4 row in even frame??\r
161         {0x19 , 0x0a}, //AD pipe number\r
162         */\r
163         \r
164         {0x1a , 0x01}, //CISCTL mode4\r
165         {0x1b , 0x8b},\r
166         {0x1e , 0x88}, //analog mode1 [7] tx-high en [5:3]COL_bias\r
167         {0x1f , 0x08}, //[3] tx-low en//\r
168         {0x20 , 0x05}, //[0]adclk mode , 0x[1]rowclk_MODE [2]rsthigh_en\r
169         {0x21 , 0x0f}, //[6:4]rsg\r
170         {0x22 , 0xf0}, //[3:0]vref\r
171         {0x23 , 0xc3}, //f3//ADC_r\r
172         {0x24 , 0x17}, //pad drive  16\r
173 \r
174         //AEC\r
175         {0xfe , 0x01},\r
176         {0x11 , 0x20},//AEC_out_slope , 0x\r
177         {0x1f , 0xc0},//max_post_gain\r
178         {0x20 , 0x60},//max_pre_gain\r
179         {0x47 , 0x30},//AEC_outdoor_th\r
180         {0x0b , 0x10},//\r
181         {0x13 , 0x75},//y_target\r
182         {0xfe , 0x00},\r
183 \r
184 \r
185         {0x05 , 0x01},//hb\r
186         {0x06 , 0x11},\r
187         {0x07 , 0x00},//vb\r
188         {0x08 , 0x50},\r
189         {0xfe , 0x01},\r
190         {0x27 , 0x00},//step\r
191         {0x28 , 0xa0},\r
192         {0x29 , 0x05},//level1\r
193         {0x2a , 0x00},\r
194         {0x2b , 0x05},//level2\r
195         {0x2c , 0x00},\r
196         {0x2d , 0x06},//6e8//level3\r
197         {0x2e , 0xe0},\r
198         {0x2f , 0x0a},//level4\r
199         {0x30 , 0x00},\r
200         {0x3e , 0x40},\r
201         {0xfe , 0x00},\r
202         {0xfe , 0x00},  //0x , 0x , 0x , 0x , 0x \r
203         {0xb6 , 0x03}, //AEC enable\r
204         {0xfe , 0x00},\r
205 \r
206         /////////BLK//////\r
207         {0x3f , 0x00}, //prc close\r
208         {0x40 , 0x77},//\r
209         {0x42 , 0x7f},\r
210         {0x43 , 0x30},\r
211         {0x5c , 0x08},\r
212         {0x5e , 0x20},\r
213         {0x5f , 0x20},\r
214         {0x60 , 0x20},\r
215         {0x61 , 0x20},\r
216         {0x62 , 0x20},\r
217         {0x63 , 0x20},\r
218         {0x64 , 0x20},\r
219         {0x65 , 0x20},\r
220 \r
221         ///block////////////\r
222         {0x80 , 0xff},\r
223         {0x81 , 0x26},//38 , 0x//skin_Y 8c_debug\r
224         {0x87 , 0x90}, //[7]middle gamma \r
225         {0x84 , 0x00}, //output put foramat\r
226         {0x86 , 0x07}, //02 //sync plority \r
227         {0x8b , 0xbc},\r
228         {0xb0 , 0x80}, //globle gain\r
229         {0xc0 , 0x40},//Yuv bypass\r
230 \r
231         //////lsc/////////////\r
232         {0xfe , 0x01},\r
233         {0xc2 , 0x38},\r
234         {0xc3 , 0x25},\r
235         {0xc4 , 0x21},\r
236         {0xc8 , 0x19},\r
237         {0xc9 , 0x12},\r
238         {0xca , 0x0e},\r
239         {0xbc , 0x43},\r
240         {0xbd , 0x18},\r
241         {0xbe , 0x1b},\r
242         {0xb6 , 0x40},\r
243         {0xb7 , 0x2e},\r
244         {0xb8 , 0x26},\r
245         {0xc5 , 0x05},\r
246         {0xc6 , 0x03},\r
247         {0xc7 , 0x04},\r
248         {0xcb , 0x00},\r
249         {0xcc , 0x00},\r
250         {0xcd , 0x00},\r
251         {0xbf , 0x14},\r
252         {0xc0 , 0x22},\r
253         {0xc1 , 0x1b},\r
254         {0xb9 , 0x00},\r
255         {0xba , 0x05},\r
256         {0xbb , 0x05},\r
257         {0xaa , 0x35},\r
258         {0xab , 0x33},\r
259         {0xac , 0x33},\r
260         {0xad , 0x25},\r
261         {0xae , 0x22},\r
262         {0xaf , 0x27},\r
263         {0xb0 , 0x1d},\r
264         {0xb1 , 0x20},\r
265         {0xb2 , 0x22},\r
266         {0xb3 , 0x14},\r
267         {0xb4 , 0x15},\r
268         {0xb5 , 0x16},\r
269         {0xd0 , 0x00},\r
270         {0xd2 , 0x07},\r
271         {0xd3 , 0x08},\r
272         {0xd8 , 0x00},\r
273         {0xda , 0x13},\r
274         {0xdb , 0x17},\r
275         {0xdc , 0x00},\r
276         {0xde , 0x0a},\r
277         {0xdf , 0x08},\r
278         {0xd4 , 0x00},\r
279         {0xd6 , 0x00},\r
280         {0xd7 , 0x0c},\r
281         {0xa4 , 0x00},\r
282         {0xa5 , 0x00},\r
283         {0xa6 , 0x00},\r
284         {0xa7 , 0x00},\r
285         {0xa8 , 0x00},\r
286         {0xa9 , 0x00},\r
287         {0xa1 , 0x80},\r
288         {0xa2 , 0x80},\r
289 \r
290         //////////cc//////////////\r
291         {0xfe , 0x02},\r
292         {0xc0 , 0x01},\r
293         {0xc1 , 0x40}, //Green_cc for d\r
294         {0xc2 , 0xfc},\r
295         {0xc3 , 0x05},\r
296         {0xc4 , 0xec},\r
297         {0xc5 , 0x42},\r
298         {0xc6 , 0xf8},\r
299         {0xc7 , 0x40},//for cwf \r
300         {0xc8 , 0xf8},\r
301         {0xc9 , 0x06},\r
302         {0xca , 0xfd},\r
303         {0xcb , 0x3e},\r
304         {0xcc , 0xf3},\r
305         {0xcd , 0x36},//for A\r
306         {0xce , 0xf6},\r
307         {0xcf , 0x04},\r
308         {0xe3 , 0x0c},\r
309         {0xe4 , 0x44},\r
310         {0xe5 , 0xe5},\r
311         {0xfe , 0x00},\r
312 \r
313         ///////awb start ////////////////\r
314         //AWB clear\r
315         {0xfe , 0x01},\r
316         {0x4f , 0x00},\r
317         {0x4d , 0x00},\r
318         {0x4e , 0x00},\r
319         {0x4e , 0x00},\r
320         {0x4e , 0x00},\r
321         {0x4e , 0x00},\r
322         {0x4e , 0x00},\r
323         {0x4e , 0x00},\r
324         {0x4e , 0x00},\r
325         {0x4e , 0x00},\r
326         {0x4e , 0x00},\r
327         {0x4e , 0x00},\r
328         {0x4e , 0x00},\r
329         {0x4e , 0x00},\r
330         {0x4e , 0x00},\r
331         {0x4e , 0x00},\r
332         {0x4e , 0x00},\r
333         {0x4e , 0x00},\r
334         {0x4d , 0x10}, // 10\r
335         {0x4e , 0x00},\r
336         {0x4e , 0x00},\r
337         {0x4e , 0x00},\r
338         {0x4e , 0x00},\r
339         {0x4e , 0x00},\r
340         {0x4e , 0x00},\r
341         {0x4e , 0x00},\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         {0x4d , 0x20}, // 20\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         {0x4e , 0x00},\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         {0x4d , 0x30},\r
369         {0x4e , 0x00},\r
370         {0x4e , 0x00},\r
371         {0x4e , 0x00},\r
372         {0x4e , 0x00}, // 30\r
373         {0x4e , 0x00},\r
374         {0x4e , 0x00},\r
375         {0x4e , 0x00},\r
376         {0x4e , 0x00},\r
377         {0x4e , 0x00},\r
378         {0x4e , 0x00},\r
379         {0x4e , 0x00},\r
380         {0x4e , 0x00},\r
381         {0x4e , 0x00},\r
382         {0x4e , 0x00},\r
383         {0x4e , 0x00},\r
384         {0x4e , 0x00},\r
385         {0x4d , 0x40}, // 40\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         {0x4e , 0x00},\r
394         {0x4e , 0x00},\r
395         {0x4e , 0x00},\r
396         {0x4e , 0x00},\r
397         {0x4e , 0x00},\r
398         {0x4e , 0x00},\r
399         {0x4e , 0x00},\r
400         {0x4e , 0x00},\r
401         {0x4e , 0x00},\r
402         {0x4d , 0x50}, // 50\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         {0x4e , 0x00},\r
411         {0x4e , 0x00},\r
412         {0x4e , 0x00},\r
413         {0x4e , 0x00},\r
414         {0x4e , 0x00},\r
415         {0x4e , 0x00},\r
416         {0x4e , 0x00},\r
417         {0x4e , 0x00},\r
418         {0x4e , 0x00},\r
419         {0x4d , 0x60}, // 60\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         {0x4e , 0x00},\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         {0x4d , 0x70}, // 70\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         {0x4e , 0x00},\r
445         {0x4e , 0x00},\r
446         {0x4e , 0x00},\r
447         {0x4e , 0x00},\r
448         {0x4e , 0x00},\r
449         {0x4e , 0x00},\r
450         {0x4e , 0x00},\r
451         {0x4e , 0x00},\r
452         {0x4e , 0x00},\r
453         {0x4d , 0x80}, // 80\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         {0x4e , 0x00},\r
462         {0x4e , 0x00},\r
463         {0x4e , 0x00},\r
464         {0x4e , 0x00},\r
465         {0x4e , 0x00},\r
466         {0x4e , 0x00},\r
467         {0x4e , 0x00},\r
468         {0x4e , 0x00},\r
469         {0x4e , 0x00},\r
470         {0x4d , 0x90}, // 90\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         {0x4e , 0x00},\r
479         {0x4e , 0x00},\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         {0x4d , 0xa0}, // a0\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         {0x4e , 0x00},\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         {0x4d , 0xb0}, // b0\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         {0x4e , 0x00},\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         {0x4d , 0xc0}, // c0\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         {0x4e , 0x00},\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         {0x4d , 0xd0}, // d0\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         {0x4e , 0x00},\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         {0x4f , 0x01},\r
556         /////// awb value////////\r
557         {0xfe , 0x01},\r
558         {0x4f , 0x00},\r
559         {0x4d , 0x30},\r
560         {0x4e , 0x00},\r
561         {0x4e , 0x80},\r
562         {0x4e , 0x80},\r
563         {0x4e , 0x02},\r
564         {0x4e , 0x02},\r
565         {0x4d , 0x40},\r
566         {0x4e , 0x00},\r
567         {0x4e , 0x80},\r
568         {0x4e , 0x80},\r
569         {0x4e , 0x02},\r
570         {0x4e , 0x02},\r
571         {0x4e , 0x02},\r
572         {0x4d , 0x53},\r
573         {0x4e , 0x08},\r
574         {0x4e , 0x04},\r
575         {0x4d , 0x62},\r
576         {0x4e , 0x10},\r
577         {0x4d , 0x72},\r
578         {0x4e , 0x20},\r
579         {0x4f , 0x01},\r
580 \r
581         /////awb////\r
582         {0xfe , 0x01},\r
583         {0x50 , 0x88},//c0//[6]green mode\r
584         {0x52 , 0x40},\r
585         {0x54 , 0x60},\r
586         {0x56 , 0x06},\r
587         {0x57 , 0x20}, //pre adjust\r
588         {0x58 , 0x01}, \r
589         {0x5b , 0x02}, //AWB_gain_delta\r
590         {0x61 , 0xaa},//R/G stand\r
591         {0x62 , 0xaa},//R/G stand\r
592         {0x71 , 0x00},\r
593         {0x74 , 0x10},  //0x//AWB_C_max\r
594         {0x77 , 0x08}, // 0x//AWB_p2_x\r
595         {0x78 , 0xfd}, //AWB_p2_y\r
596         {0x86 , 0x30},\r
597         {0x87 , 0x00},\r
598         {0x88 , 0x04},//06 , 0x//[1]dark mode\r
599         {0x8a , 0xc0},//awb move mode\r
600         {0x89 , 0x75},\r
601         {0x84 , 0x08},  //0x//auto_window\r
602         {0x8b , 0x00}, // 0x//awb compare luma\r
603         {0x8d , 0x70}, //awb gain limit R \r
604         {0x8e , 0x70},//G\r
605         {0x8f , 0xf4},//B\r
606         {0xfe , 0x00},\r
607         {0x82 , 0x02},//awb_en\r
608        /////////awb end /////////////\r
609        \r
610         ///==========asde\r
611         {0xfe , 0x01},\r
612         {0x21 , 0xbf},\r
613         {0xfe , 0x02},\r
614         {0xa4 , 0x00},//\r
615         {0xa5 , 0x40}, //lsc_th\r
616         {0xa2 , 0xa0}, //lsc_dec_slope\r
617         {0xa6 , 0x80}, //dd_th\r
618         {0xa7 , 0x80}, //ot_th\r
619         {0xab , 0x31}, //\r
620         {0xa9 , 0x6f}, //\r
621         {0xb0 , 0x99}, //0x//edge effect slope low\r
622         {0xb1 , 0x34},//edge effect slope low\r
623         {0xb3 , 0x80}, //saturation dec slope\r
624         {0xde , 0xb6},  //\r
625         {0x38 , 0x0f}, // \r
626         {0x39 , 0x60}, //\r
627         {0xfe , 0x00},\r
628         {0x81 , 0x26},\r
629         {0xfe , 0x02},\r
630         {0x83 , 0x00},//\r
631         {0x84 , 0x45},//\r
632         ////////////YCP//////////\r
633         {0xd1 , 0x38},//saturation_cb\r
634         {0xd2 , 0x38},//saturation_Cr\r
635         {0xd3 , 0x40},//contrast ?\r
636         {0xd4 , 0x80},//contrast center \r
637         {0xd5 , 0x00},//luma_offset \r
638         {0xdc , 0x30},\r
639         {0xdd , 0xb8},//edge_sa_g,b\r
640         {0xfe , 0x00},\r
641         ///////dndd///////////\r
642         {0xfe , 0x02},\r
643         {0x88 , 0x15},//dn_b_base\r
644         {0x8c , 0xf6}, //[2]b_in_dark_inc\r
645         {0x89 , 0x03}, //dn_c_weight\r
646         ////////EE ///////////\r
647         {0xfe , 0x02},\r
648         {0x90 , 0x6c},// EEINTP mode1\r
649         {0x97 , 0x45},// edge effect\r
650         ////==============RGB Gamma \r
651         {0xfe , 0x02},\r
652         {0x15 , 0x0a},\r
653         {0x16 , 0x12},\r
654         {0x17 , 0x19},\r
655         {0x18 , 0x1f},\r
656         {0x19 , 0x2c},\r
657         {0x1a , 0x38},\r
658         {0x1b , 0x42},\r
659         {0x1c , 0x4e},\r
660         {0x1d , 0x63},\r
661         {0x1e , 0x76},\r
662         {0x1f , 0x87},\r
663         {0x20 , 0x96},\r
664         {0x21 , 0xa2},\r
665         {0x22 , 0xb8},\r
666         {0x23 , 0xca},\r
667         {0x24 , 0xd8},\r
668         {0x25 , 0xe3},\r
669         {0x26 , 0xf0},\r
670         {0x27 , 0xf8},\r
671         {0x28 , 0xfd},\r
672         {0x29 , 0xff},\r
673 \r
674         ///=================y gamma\r
675         {0xfe , 0x02},\r
676         {0x2b , 0x00},\r
677         {0x2c , 0x04},\r
678         {0x2d , 0x09},\r
679         {0x2e , 0x18},\r
680         {0x2f , 0x27},\r
681         {0x30 , 0x37},\r
682         {0x31 , 0x49},\r
683         {0x32 , 0x5c},\r
684         {0x33 , 0x7e},\r
685         {0x34 , 0xa0},\r
686         {0x35 , 0xc0},\r
687         {0x36 , 0xe0},\r
688         {0x37 , 0xff},\r
689         /////1600x1200size// \r
690         {0xfe , 0x00},//\r
691         {0x90 , 0x01}, //0x//crop enable\r
692         {0x95 , 0x04},  //0x//1600x1200\r
693         {0x96 , 0xb0},\r
694         {0x97 , 0x06},\r
695         {0x98 , 0x40},\r
696 \r
697         {0xfe , 0x03},\r
698         {0x42 , 0x40}, \r
699         {0x43 , 0x06}, //output buf width\r
700         {0x41 , 0x02}, // Pclk_polarity\r
701         {0x40 , 0x40},  //00  \r
702         {0x17 , 0x00}, //widv \r
703         {0xfe , 0x00},\r
704         ////output DVP/////\r
705         {0xfe , 0x00},\r
706         {0xb6 , 0x03},\r
707         {0xf7 , 0x15},\r
708 \r
709         {0xc8 , 0x00},//close scaler\r
710         {0x99 , 0x22},// 1/2 subsample\r
711         {0x9a , 0x06},\r
712         {0x9b , 0x00},\r
713         {0x9c , 0x00},\r
714         {0x9d , 0x00},\r
715         {0x9e , 0x00},\r
716         {0x9f , 0x00},\r
717         {0xa0 , 0x00},  \r
718         {0xa1 , 0x00},\r
719         {0xa2  ,0x00},\r
720         \r
721         {0x90 , 0x01},  //crop enable\r
722         {0x94 , 0x02},\r
723         {0x95 , 0x02},\r
724         {0x96 , 0x58},\r
725         {0x97 , 0x03},\r
726         {0x98 , 0x20},\r
727         {0xfe , 0x00},\r
728         {0x82 , 0xfe},  // fe\r
729         {0xf2 , 0x70}, \r
730         {0xf3 , 0xff},\r
731         {0xf4 , 0x00},\r
732         {0xf5 , 0x30},\r
733         \r
734           #if 0   \r
735         /////////  re zao///\r
736         {0xfe,0x00},\r
737         {0x22,0xd0},\r
738         {0xfe,0x01},\r
739         {0x21,0xff},\r
740         {0xfe,0x02},  \r
741         {0x8a,0x33},\r
742         {0x8c,0x76},\r
743         {0x8d,0x85},\r
744         {0xa6,0xf0},    \r
745         {0xae,0x9f},\r
746         {0xa2,0x90},\r
747         {0xa5,0x40},  \r
748         {0xa7,0x30},\r
749         {0xb0,0x88},\r
750         {0x38,0x0b},\r
751         {0x39,0x30},\r
752         {0xfe,0x00},  \r
753         {0x87,0xb0},\r
754 \r
755        //// small  RGB gamma////\r
756         {0xfe , 0x02},\r
757         {0x15 , 0x0b},\r
758         {0x16 , 0x0e},\r
759         {0x17 , 0x10},\r
760         {0x18 , 0x12},\r
761         {0x19 , 0x19},\r
762         {0x1a , 0x21},\r
763         {0x1b , 0x29},\r
764         {0x1c , 0x31},\r
765         {0x1d , 0x41},\r
766         {0x1e , 0x50},\r
767         {0x1f , 0x5f},\r
768         {0x20 , 0x6d},\r
769         {0x21 , 0x79},\r
770         {0x22 , 0x91},\r
771         {0x23 , 0xa5},\r
772         {0x24 , 0xb9},\r
773         {0x25 , 0xc9},\r
774         {0x26 , 0xe1},\r
775         {0x27 , 0xee},\r
776         {0x28 , 0xf7},\r
777         {0x29 , 0xff},\r
778         \r
779         ////dark sun/////\r
780         {0xfe , 0x02},\r
781         {0x40 , 0x06},\r
782         {0x41 , 0x23},\r
783         {0x42 , 0x3f},\r
784         {0x43 , 0x06},\r
785         {0x44 , 0x00},\r
786         {0x45 , 0x00},\r
787         {0x46 , 0x14},\r
788         {0x47 , 0x09},\r
789  \r
790   #endif\r
791 \r
792         {0x00,0x00}, \r
793 };\r
794         \r
795 \r
796 \r
797 /* 1600X1200 UXGA */\r
798 static struct reginfo sensor_uxga[] = \r
799 {\r
800  \r
801  \r
802         {0xfe , 0x00},\r
803         {0xc8 , 0x00},\r
804         {0xf7 , 0x17},\r
805 \r
806         {0x99 , 0x11}, // disable sambsample\r
807         {0x9a , 0x06},\r
808         {0x9b , 0x00},\r
809         {0x9c , 0x00},\r
810         {0x9d , 0x00},\r
811         {0x9e , 0x00},\r
812         {0x9f , 0x00},\r
813         {0xa0 , 0x00},  \r
814         {0xa1 , 0x00},\r
815         {0xa2 , 0x00},\r
816                 \r
817         {0x90 , 0x01},\r
818         {0x95 , 0x04},\r
819         {0x96 , 0xb0},  \r
820         {0x97 , 0x06},\r
821         {0x98 , 0x40},\r
822                 \r
823         {0x00 , 0x00}, \r
824 \r
825 \r
826 };\r
827 \r
828         \r
829 \r
830 /* 1280X1024 SXGA */\r
831 static struct reginfo sensor_sxga[] =\r
832 {\r
833         \r
834         {0x00,0x00}, \r
835 };\r
836 \r
837 /* 800X600 SVGA*/\r
838 static struct reginfo sensor_svga[] =\r
839 {       \r
840         {0xfe , 0x00},\r
841         {0xb6 , 0x03},\r
842         {0xf7 , 0x15},\r
843 \r
844         {0xc8 , 0x00},//close scaler\r
845         {0x99 , 0x22},// 1/2 subsample\r
846         {0x9a , 0x06},\r
847         {0x9b , 0x00},\r
848         {0x9c , 0x00},\r
849         {0x9d , 0x00},\r
850         {0x9e , 0x00},\r
851         {0x9f , 0x00},\r
852         {0xa0 , 0x00},  \r
853         {0xa1 , 0x00},\r
854         {0xa2 , 0x00},\r
855         \r
856         {0x90 , 0x01},  //crop enable\r
857         {0x94 , 0x02},\r
858         {0x95 , 0x02},\r
859         {0x96 , 0x58},\r
860         {0x97 , 0x03},\r
861         {0x98 , 0x20},\r
862         {0x00,0x00}, \r
863 };\r
864         \r
865         \r
866 \r
867 /* 640X480 VGA */\r
868 static struct reginfo sensor_vga[] =\r
869 {\r
870         \r
871 \r
872         {0x00 , 0x00},\r
873 };\r
874 \r
875 /* 352X288 CIF */\r
876 static struct reginfo sensor_cif[] =\r
877 {\r
878         {0x00,0x00}, \r
879 };\r
880 \r
881 /* 320*240 QVGA */\r
882 static  struct reginfo sensor_qvga[] =\r
883 {\r
884     \r
885 \r
886         {0x00,0x00}, \r
887 };\r
888 \r
889 /* 176X144 QCIF*/\r
890 static struct reginfo sensor_qcif[] =\r
891 {\r
892         \r
893         {0x00,0x00}, \r
894 };\r
895 \r
896 static  struct reginfo sensor_ClrFmt_YUYV[]=\r
897 {\r
898    \r
899         {0x00,0x00}, \r
900 };\r
901 \r
902 static  struct reginfo sensor_ClrFmt_UYVY[]=\r
903 {\r
904         {0x00,0x00}, \r
905 };\r
906 \r
907 #if CONFIG_SENSOR_WhiteBalance\r
908 static  struct reginfo sensor_WhiteB_Auto[]=\r
909 {\r
910         {0xfe, 0x00},\r
911         {0xb3, 0x61},\r
912         {0xb4, 0x40},\r
913         {0xb5, 0x61},\r
914         {0x82, 0xfe},\r
915         {0x00,0x00}, \r
916 };\r
917 /* Cloudy Colour Temperature : 6500K - 8000K  */\r
918 static  struct reginfo sensor_WhiteB_Cloudy[]=\r
919 {\r
920         {0xfe, 0x00},\r
921         {0x82, 0xfc},\r
922         {0xb3, 0x58},\r
923         {0xb4, 0x40},\r
924         {0xb5, 0x50},   \r
925         {0x00,0x00}, \r
926 };\r
927 /* ClearDay Colour Temperature : 5000K - 6500K  */\r
928 static  struct reginfo sensor_WhiteB_ClearDay[]=\r
929 {\r
930     //Sunny\r
931         {0xfe, 0x00},\r
932         {0x82, 0xfc},\r
933         {0xb3, 0x78},\r
934         {0xb4, 0x40},\r
935         {0xb5, 0x50},\r
936         {0x00,0x00}, \r
937 };\r
938 /* Office Colour Temperature : 3500K - 5000K  */\r
939 static  struct reginfo sensor_WhiteB_TungstenLamp1[]=\r
940 {\r
941     //Office\r
942         {0xfe, 0x00},\r
943         {0x82, 0xfc},\r
944         {0xb3, 0x50},\r
945         {0xb4, 0x40},\r
946         {0xb5, 0xa8},\r
947         {0x00,0x00}, \r
948 \r
949 };\r
950 /* Home Colour Temperature : 2500K - 3500K  */\r
951 static  struct reginfo sensor_WhiteB_TungstenLamp2[]=\r
952 {\r
953     //Home\r
954         {0xfe, 0x00},\r
955         {0x82, 0xfc},\r
956         {0xb3, 0xa0},\r
957         {0xb4, 0x45},\r
958         {0xb5, 0x40},\r
959         {0x00, 0x00}, \r
960 };\r
961 static struct reginfo *sensor_WhiteBalanceSeqe[] = {sensor_WhiteB_Auto, sensor_WhiteB_TungstenLamp1,sensor_WhiteB_TungstenLamp2,\r
962     sensor_WhiteB_ClearDay, sensor_WhiteB_Cloudy,NULL,\r
963 };\r
964 #endif\r
965 \r
966 #if CONFIG_SENSOR_Brightness\r
967 static  struct reginfo sensor_Brightness0[]=\r
968 {\r
969     // Brightness -2\r
970   \r
971         {0xfe, 0x01},\r
972         {0x13, 0x70},\r
973         {0xfe, 0x02},\r
974         {0xd5, 0xe0},\r
975        {0x00, 0x00},\r
976 };\r
977 \r
978 static  struct reginfo sensor_Brightness1[]=\r
979 {\r
980     // Brightness -1\r
981  \r
982         {0xfe, 0x01},\r
983         {0x13, 0x78},\r
984         {0xfe, 0x02},\r
985         {0xd5, 0xf0},\r
986        {0x00, 0x00}\r
987 };\r
988 \r
989 static  struct reginfo sensor_Brightness2[]=\r
990 {\r
991     //  Brightness 0\r
992 \r
993         {0xfe, 0x01},\r
994         {0x13, 0x80},\r
995         {0xfe, 0x02},\r
996         {0xd5, 0x00},\r
997        {0x00, 0x00}\r
998 };\r
999 \r
1000 static  struct reginfo sensor_Brightness3[]=\r
1001 {\r
1002     // Brightness +1\r
1003         {0xfe, 0x01},\r
1004         {0x13, 0x88},\r
1005         {0xfe, 0x02},\r
1006         {0xd5, 0x10},\r
1007        {0x00, 0x00}\r
1008 };\r
1009 \r
1010 static  struct reginfo sensor_Brightness4[]=\r
1011 {\r
1012     //  Brightness +2\r
1013         {0xfe, 0x01},\r
1014         {0x13, 0x90},\r
1015         {0xfe, 0x02},\r
1016         {0xd5, 0x20},\r
1017        {0x00, 0x00}\r
1018 };\r
1019 \r
1020 static  struct reginfo sensor_Brightness5[]=\r
1021 {\r
1022     //  Brightness +3\r
1023         {0xfe, 0x01},\r
1024         {0x13, 0x98},\r
1025         {0xfe, 0x02},\r
1026         {0xd5, 0x30},\r
1027 \r
1028         {0x00, 0x00}\r
1029 };\r
1030 static struct reginfo *sensor_BrightnessSeqe[] = {sensor_Brightness0, sensor_Brightness1, sensor_Brightness2, sensor_Brightness3,\r
1031     sensor_Brightness4, sensor_Brightness5,NULL,\r
1032 };\r
1033 \r
1034 #endif\r
1035 \r
1036 #if CONFIG_SENSOR_Effect\r
1037 static  struct reginfo sensor_Effect_Normal[] =\r
1038 {\r
1039         {0xfe, 0x00},\r
1040         {0x83, 0xe0},\r
1041         {0x00, 0x00}            \r
1042 };\r
1043 \r
1044 static  struct reginfo sensor_Effect_WandB[] =\r
1045 {\r
1046         {0xfe, 0x00},\r
1047         {0x83, 0x12},                   \r
1048         {0x00, 0x00}\r
1049 };\r
1050 \r
1051 static  struct reginfo sensor_Effect_Sepia[] =\r
1052 {\r
1053         {0xfe, 0x00},\r
1054         {0x83, 0x82},\r
1055         {0x00, 0x00}\r
1056 };\r
1057 \r
1058 static  struct reginfo sensor_Effect_Negative[] =\r
1059 {\r
1060     //Negative\r
1061         {0xfe, 0x00},\r
1062         {0x83, 0x01},\r
1063         {0x00, 0x00}\r
1064 };\r
1065 static  struct reginfo sensor_Effect_Bluish[] =\r
1066 {\r
1067     // Bluish\r
1068         {0xfe, 0x00},\r
1069         {0x83, 0x62},\r
1070         {0x00, 0x00}\r
1071 };\r
1072 \r
1073 static  struct reginfo sensor_Effect_Green[] =\r
1074 {\r
1075     //  Greenish\r
1076         {0xfe, 0x00},\r
1077         {0x83, 0x52},\r
1078         {0x00, 0x00}\r
1079 };\r
1080 static struct reginfo *sensor_EffectSeqe[] = {sensor_Effect_Normal, sensor_Effect_WandB, sensor_Effect_Negative,sensor_Effect_Sepia,\r
1081     sensor_Effect_Bluish, sensor_Effect_Green,NULL,\r
1082 };\r
1083 #endif\r
1084 #if CONFIG_SENSOR_Exposure\r
1085 static  struct reginfo sensor_Exposure0[]=\r
1086 {\r
1087     //-3\r
1088  \r
1089     {0x00, 0x00}\r
1090 };\r
1091 \r
1092 static  struct reginfo sensor_Exposure1[]=\r
1093 {\r
1094     //-2\r
1095  \r
1096     {0x00, 0x00}\r
1097 };\r
1098 \r
1099 static  struct reginfo sensor_Exposure2[]=\r
1100 {\r
1101     //-0.3EV\r
1102 \r
1103     {0x00, 0x00}\r
1104 };\r
1105 \r
1106 static  struct reginfo sensor_Exposure3[]=\r
1107 {\r
1108     //default\r
1109    \r
1110     {0x00, 0x00}\r
1111 };\r
1112 \r
1113 static  struct reginfo sensor_Exposure4[]=\r
1114 {\r
1115     // 1\r
1116 \r
1117     {0x00, 0x00}\r
1118 };\r
1119 \r
1120 static  struct reginfo sensor_Exposure5[]=\r
1121 {\r
1122     // 2\r
1123   \r
1124     {0x00, 0x00}\r
1125 };\r
1126 \r
1127 static  struct reginfo sensor_Exposure6[]=\r
1128 {\r
1129     // 3\r
1130     \r
1131     {0x00, 0x00}\r
1132 };\r
1133 \r
1134 static struct reginfo *sensor_ExposureSeqe[] = {sensor_Exposure0, sensor_Exposure1, sensor_Exposure2, sensor_Exposure3,\r
1135     sensor_Exposure4, sensor_Exposure5,sensor_Exposure6,NULL,\r
1136 };\r
1137 #endif\r
1138 #if CONFIG_SENSOR_Saturation\r
1139 static  struct reginfo sensor_Saturation0[]=\r
1140 {\r
1141 \r
1142     {0x00, 0x00}\r
1143 };\r
1144 \r
1145 static  struct reginfo sensor_Saturation1[]=\r
1146 {\r
1147     {0x00, 0x00}\r
1148 };\r
1149 \r
1150 static  struct reginfo sensor_Saturation2[]=\r
1151 {\r
1152     {0x00, 0x00}\r
1153 };\r
1154 static struct reginfo *sensor_SaturationSeqe[] = {sensor_Saturation0, sensor_Saturation1, sensor_Saturation2, NULL,};\r
1155 \r
1156 #endif\r
1157 #if CONFIG_SENSOR_Contrast\r
1158 static  struct reginfo sensor_Contrast0[]=\r
1159 {\r
1160     //Contrast -3\r
1161     {0x00, 0x00}\r
1162 };\r
1163 \r
1164 static  struct reginfo sensor_Contrast1[]=\r
1165 {\r
1166     //Contrast -2\r
1167     {0x00, 0x00}\r
1168 };\r
1169 \r
1170 static  struct reginfo sensor_Contrast2[]=\r
1171 {\r
1172     // Contrast -1\r
1173     {0x00, 0x00}\r
1174 };\r
1175 \r
1176 static  struct reginfo sensor_Contrast3[]=\r
1177 {\r
1178     //Contrast 0\r
1179     {0x00, 0x00}\r
1180 };\r
1181 \r
1182 static  struct reginfo sensor_Contrast4[]=\r
1183 {\r
1184     //Contrast +1\r
1185     {0x00, 0x00}\r
1186 };\r
1187 \r
1188 \r
1189 static  struct reginfo sensor_Contrast5[]=\r
1190 {\r
1191     //Contrast +2\r
1192     {0x00, 0x00}\r
1193 };\r
1194 \r
1195 static  struct reginfo sensor_Contrast6[]=\r
1196 {\r
1197    \r
1198     //Contrast +3\r
1199     {0x00, 0x00}\r
1200 \r
1201 };\r
1202 static struct reginfo *sensor_ContrastSeqe[] = {sensor_Contrast0, sensor_Contrast1, sensor_Contrast2, sensor_Contrast3,\r
1203     sensor_Contrast4, sensor_Contrast5, sensor_Contrast6, NULL,\r
1204 };\r
1205 \r
1206 #endif\r
1207 #if CONFIG_SENSOR_Mirror\r
1208 static  struct reginfo sensor_MirrorOn[]=\r
1209 {\r
1210     {0x17 , 0x14},\r
1211     {0x00 , 0x00}\r
1212 };\r
1213 \r
1214 static  struct reginfo sensor_MirrorOff[]=\r
1215 {\r
1216     {0x17 , 0x15},\r
1217     {0x00 , 0x00}\r
1218 };\r
1219 static struct reginfo *sensor_MirrorSeqe[] = {sensor_MirrorOff, sensor_MirrorOn,NULL,};\r
1220 #endif\r
1221 #if CONFIG_SENSOR_Flip\r
1222 static  struct reginfo sensor_FlipOn[]=\r
1223 {\r
1224     {0x17 , 0x16},\r
1225     {0x00 , 0x00}\r
1226 };\r
1227 \r
1228 static  struct reginfo sensor_FlipOff[]=\r
1229 {\r
1230     {0x17 , 0x17},\r
1231     {0x00 , 0x00}\r
1232 };\r
1233 static struct reginfo *sensor_FlipSeqe[] = {sensor_FlipOff, sensor_FlipOn,NULL,};\r
1234 \r
1235 #endif\r
1236 #if CONFIG_SENSOR_Scene\r
1237 static  struct reginfo sensor_SceneAuto[] =\r
1238 {\r
1239 {0xfe,0x01},\r
1240 {0x3e,0x40},    \r
1241 {0xfe,0x00},\r
1242 \r
1243 {0x00,0x00}\r
1244 };\r
1245 \r
1246 static  struct reginfo sensor_SceneNight[] =\r
1247 {\r
1248 {0xfe,0x01},\r
1249 {0x3e,0x60},    \r
1250 {0xfe,0x00},\r
1251 {0x00,0x00}\r
1252 \r
1253 };\r
1254 static struct reginfo *sensor_SceneSeqe[] = {sensor_SceneAuto, sensor_SceneNight,NULL,};\r
1255 \r
1256 #endif\r
1257 #if CONFIG_SENSOR_DigitalZoom\r
1258 static struct reginfo sensor_Zoom0[] =\r
1259 {\r
1260     {0x0, 0x0},\r
1261 };\r
1262 \r
1263 static struct reginfo sensor_Zoom1[] =\r
1264 {\r
1265      {0x0, 0x0},\r
1266 };\r
1267 \r
1268 static struct reginfo sensor_Zoom2[] =\r
1269 {\r
1270     {0x0, 0x0},\r
1271 };\r
1272 \r
1273 \r
1274 static struct reginfo sensor_Zoom3[] =\r
1275 {\r
1276     {0x0, 0x0},\r
1277 };\r
1278 static struct reginfo *sensor_ZoomSeqe[] = {sensor_Zoom0, sensor_Zoom1, sensor_Zoom2, sensor_Zoom3, NULL,};\r
1279 #endif\r
1280 static const struct v4l2_querymenu sensor_menus[] =\r
1281 {\r
1282         #if CONFIG_SENSOR_WhiteBalance\r
1283     { .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
1284     { .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
1285     { .id = V4L2_CID_DO_WHITE_BALANCE,  .index = 4,  .name = "cloudy-daylight", .reserved = 0,},\r
1286     #endif\r
1287 \r
1288         #if CONFIG_SENSOR_Effect\r
1289     { .id = V4L2_CID_EFFECT,  .index = 0,  .name = "none",  .reserved = 0, }, {  .id = V4L2_CID_EFFECT,  .index = 1, .name = "mono",  .reserved = 0,},\r
1290     { .id = V4L2_CID_EFFECT,  .index = 2,  .name = "negative", .reserved = 0,}, {  .id = V4L2_CID_EFFECT, .index = 3,  .name = "sepia", .reserved = 0,},\r
1291     { .id = V4L2_CID_EFFECT,  .index = 4, .name = "posterize", .reserved = 0,} ,{ .id = V4L2_CID_EFFECT,  .index = 5,  .name = "aqua", .reserved = 0,},\r
1292     #endif\r
1293 \r
1294         #if CONFIG_SENSOR_Scene\r
1295     { .id = V4L2_CID_SCENE,  .index = 0, .name = "auto", .reserved = 0,} ,{ .id = V4L2_CID_SCENE,  .index = 1,  .name = "night", .reserved = 0,},\r
1296     #endif\r
1297 \r
1298         #if CONFIG_SENSOR_Flash\r
1299     { .id = V4L2_CID_FLASH,  .index = 0,  .name = "off",  .reserved = 0, }, {  .id = V4L2_CID_FLASH,  .index = 1, .name = "auto",  .reserved = 0,},\r
1300     { .id = V4L2_CID_FLASH,  .index = 2,  .name = "on", .reserved = 0,}, {  .id = V4L2_CID_FLASH, .index = 3,  .name = "torch", .reserved = 0,},\r
1301     #endif\r
1302 };\r
1303 \r
1304 static  struct v4l2_queryctrl sensor_controls[] =\r
1305 {\r
1306         #if CONFIG_SENSOR_WhiteBalance\r
1307     {\r
1308         .id             = V4L2_CID_DO_WHITE_BALANCE,\r
1309         .type           = V4L2_CTRL_TYPE_MENU,\r
1310         .name           = "White Balance Control",\r
1311         .minimum        = 0,\r
1312         .maximum        = 4,\r
1313         .step           = 1,\r
1314         .default_value = 0,\r
1315     },\r
1316     #endif\r
1317 \r
1318         #if CONFIG_SENSOR_Brightness\r
1319         {\r
1320         .id             = V4L2_CID_BRIGHTNESS,\r
1321         .type           = V4L2_CTRL_TYPE_INTEGER,\r
1322         .name           = "Brightness Control",\r
1323         .minimum        = -3,\r
1324         .maximum        = 2,\r
1325         .step           = 1,\r
1326         .default_value = 0,\r
1327     },\r
1328     #endif\r
1329 \r
1330         #if CONFIG_SENSOR_Effect\r
1331         {\r
1332         .id             = V4L2_CID_EFFECT,\r
1333         .type           = V4L2_CTRL_TYPE_MENU,\r
1334         .name           = "Effect Control",\r
1335         .minimum        = 0,\r
1336         .maximum        = 5,\r
1337         .step           = 1,\r
1338         .default_value = 0,\r
1339     },\r
1340         #endif\r
1341 \r
1342         #if CONFIG_SENSOR_Exposure\r
1343         {\r
1344         .id             = V4L2_CID_EXPOSURE,\r
1345         .type           = V4L2_CTRL_TYPE_INTEGER,\r
1346         .name           = "Exposure Control",\r
1347         .minimum        = 0,\r
1348         .maximum        = 6,\r
1349         .step           = 1,\r
1350         .default_value = 0,\r
1351     },\r
1352         #endif\r
1353 \r
1354         #if CONFIG_SENSOR_Saturation\r
1355         {\r
1356         .id             = V4L2_CID_SATURATION,\r
1357         .type           = V4L2_CTRL_TYPE_INTEGER,\r
1358         .name           = "Saturation Control",\r
1359         .minimum        = 0,\r
1360         .maximum        = 2,\r
1361         .step           = 1,\r
1362         .default_value = 0,\r
1363     },\r
1364     #endif\r
1365 \r
1366         #if CONFIG_SENSOR_Contrast\r
1367         {\r
1368         .id             = V4L2_CID_CONTRAST,\r
1369         .type           = V4L2_CTRL_TYPE_INTEGER,\r
1370         .name           = "Contrast Control",\r
1371         .minimum        = -3,\r
1372         .maximum        = 3,\r
1373         .step           = 1,\r
1374         .default_value = 0,\r
1375     },\r
1376         #endif\r
1377 \r
1378         #if CONFIG_SENSOR_Mirror\r
1379         {\r
1380         .id             = V4L2_CID_HFLIP,\r
1381         .type           = V4L2_CTRL_TYPE_BOOLEAN,\r
1382         .name           = "Mirror Control",\r
1383         .minimum        = 0,\r
1384         .maximum        = 1,\r
1385         .step           = 1,\r
1386         .default_value = 1,\r
1387     },\r
1388     #endif\r
1389 \r
1390         #if CONFIG_SENSOR_Flip\r
1391         {\r
1392         .id             = V4L2_CID_VFLIP,\r
1393         .type           = V4L2_CTRL_TYPE_BOOLEAN,\r
1394         .name           = "Flip Control",\r
1395         .minimum        = 0,\r
1396         .maximum        = 1,\r
1397         .step           = 1,\r
1398         .default_value = 1,\r
1399     },\r
1400     #endif\r
1401 \r
1402         #if CONFIG_SENSOR_Scene\r
1403     {\r
1404         .id             = V4L2_CID_SCENE,\r
1405         .type           = V4L2_CTRL_TYPE_MENU,\r
1406         .name           = "Scene Control",\r
1407         .minimum        = 0,\r
1408         .maximum        = 1,\r
1409         .step           = 1,\r
1410         .default_value = 0,\r
1411     },\r
1412     #endif\r
1413 \r
1414         #if CONFIG_SENSOR_DigitalZoom\r
1415     {\r
1416         .id             = V4L2_CID_ZOOM_RELATIVE,\r
1417         .type           = V4L2_CTRL_TYPE_INTEGER,\r
1418         .name           = "DigitalZoom Control",\r
1419         .minimum        = -1,\r
1420         .maximum        = 1,\r
1421         .step           = 1,\r
1422         .default_value = 0,\r
1423     }, {\r
1424         .id             = V4L2_CID_ZOOM_ABSOLUTE,\r
1425         .type           = V4L2_CTRL_TYPE_INTEGER,\r
1426         .name           = "DigitalZoom Control",\r
1427         .minimum        = 0,\r
1428         .maximum        = 3,\r
1429         .step           = 1,\r
1430         .default_value = 0,\r
1431     },\r
1432     #endif\r
1433 \r
1434         #if CONFIG_SENSOR_Focus\r
1435         {\r
1436         .id             = V4L2_CID_FOCUS_RELATIVE,\r
1437         .type           = V4L2_CTRL_TYPE_INTEGER,\r
1438         .name           = "Focus Control",\r
1439         .minimum        = -1,\r
1440         .maximum        = 1,\r
1441         .step           = 1,\r
1442         .default_value = 0,\r
1443     }, {\r
1444         .id             = V4L2_CID_FOCUS_ABSOLUTE,\r
1445         .type           = V4L2_CTRL_TYPE_INTEGER,\r
1446         .name           = "Focus Control",\r
1447         .minimum        = 0,\r
1448         .maximum        = 255,\r
1449         .step           = 1,\r
1450         .default_value = 125,\r
1451     },\r
1452     #endif\r
1453 \r
1454         #if CONFIG_SENSOR_Flash\r
1455         {\r
1456         .id             = V4L2_CID_FLASH,\r
1457         .type           = V4L2_CTRL_TYPE_MENU,\r
1458         .name           = "Flash Control",\r
1459         .minimum        = 0,\r
1460         .maximum        = 3,\r
1461         .step           = 1,\r
1462         .default_value = 0,\r
1463     },\r
1464         #endif\r
1465 };\r
1466 \r
1467 static int sensor_probe(struct i2c_client *client, const struct i2c_device_id *did);\r
1468 static int sensor_video_probe(struct soc_camera_device *icd, struct i2c_client *client);\r
1469 static int sensor_g_control(struct v4l2_subdev *sd, struct v4l2_control *ctrl);\r
1470 static int sensor_s_control(struct v4l2_subdev *sd, struct v4l2_control *ctrl);\r
1471 static int sensor_g_ext_controls(struct v4l2_subdev *sd,  struct v4l2_ext_controls *ext_ctrl);\r
1472 static int sensor_s_ext_controls(struct v4l2_subdev *sd,  struct v4l2_ext_controls *ext_ctrl);\r
1473 static int sensor_suspend(struct soc_camera_device *icd, pm_message_t pm_msg);\r
1474 static int sensor_resume(struct soc_camera_device *icd);\r
1475 static int sensor_set_bus_param(struct soc_camera_device *icd,unsigned long flags);\r
1476 static unsigned long sensor_query_bus_param(struct soc_camera_device *icd);\r
1477 static int sensor_set_effect(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value);\r
1478 static int sensor_set_whiteBalance(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value);\r
1479 static int sensor_deactivate(struct i2c_client *client);\r
1480 \r
1481 static struct soc_camera_ops sensor_ops =\r
1482 {\r
1483     .suspend                     = sensor_suspend,\r
1484     .resume                       = sensor_resume,\r
1485     .set_bus_param              = sensor_set_bus_param,\r
1486     .query_bus_param    = sensor_query_bus_param,\r
1487     .controls           = sensor_controls,\r
1488     .menus                         = sensor_menus,\r
1489     .num_controls               = ARRAY_SIZE(sensor_controls),\r
1490     .num_menus          = ARRAY_SIZE(sensor_menus),\r
1491 };\r
1492 \r
1493 /* only one fixed colorspace per pixelcode */\r
1494 struct sensor_datafmt {\r
1495         enum v4l2_mbus_pixelcode code;\r
1496         enum v4l2_colorspace colorspace;\r
1497 };\r
1498 \r
1499 /* Find a data format by a pixel code in an array */\r
1500 static const struct sensor_datafmt *sensor_find_datafmt(\r
1501         enum v4l2_mbus_pixelcode code, const struct sensor_datafmt *fmt,\r
1502         int n)\r
1503 {\r
1504         int i;\r
1505         for (i = 0; i < n; i++)\r
1506                 if (fmt[i].code == code)\r
1507                         return fmt + i;\r
1508 \r
1509         return NULL;\r
1510 }\r
1511 \r
1512 static const struct sensor_datafmt sensor_colour_fmts[] = {\r
1513     {V4L2_MBUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG},\r
1514     {V4L2_MBUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG}     \r
1515 };\r
1516 \r
1517 typedef struct sensor_info_priv_s\r
1518 {\r
1519     int whiteBalance;\r
1520     int brightness;\r
1521     int contrast;\r
1522     int saturation;\r
1523     int effect;\r
1524     int scene;\r
1525     int digitalzoom;\r
1526     int focus;\r
1527     int flash;\r
1528     int exposure;\r
1529         bool snap2preview;\r
1530         bool video2preview;\r
1531     unsigned char mirror;                                        /* HFLIP */\r
1532     unsigned char flip;                                          /* VFLIP */\r
1533     unsigned int winseqe_cur_addr;\r
1534     struct sensor_datafmt fmt;\r
1535     unsigned int funmodule_state;\r
1536 } sensor_info_priv_t;\r
1537 \r
1538 struct sensor\r
1539 {\r
1540     struct v4l2_subdev subdev;\r
1541     struct i2c_client *client;\r
1542     sensor_info_priv_t info_priv;\r
1543     int model;  /* V4L2_IDENT_OV* codes from v4l2-chip-ident.h */\r
1544 #if CONFIG_SENSOR_I2C_NOSCHED\r
1545         atomic_t tasklock_cnt;\r
1546 #endif\r
1547         struct rk29camera_platform_data *sensor_io_request;\r
1548     struct rk29camera_gpio_res *sensor_gpio_res;\r
1549 };\r
1550 \r
1551 static struct sensor* to_sensor(const struct i2c_client *client)\r
1552 {\r
1553     return container_of(i2c_get_clientdata(client), struct sensor, subdev);\r
1554 }\r
1555 \r
1556 static int sensor_task_lock(struct i2c_client *client, int lock)\r
1557 {\r
1558 #if CONFIG_SENSOR_I2C_NOSCHED\r
1559         int cnt = 3;\r
1560     struct sensor *sensor = to_sensor(client);\r
1561 \r
1562         if (lock) {\r
1563                 if (atomic_read(&sensor->tasklock_cnt) == 0) {\r
1564                         while ((atomic_read(&client->adapter->bus_lock.count) < 1) && (cnt>0)) {\r
1565                                 SENSOR_TR("\n %s will obtain i2c in atomic, but i2c bus is locked! Wait...\n",SENSOR_NAME_STRING());\r
1566                                 msleep(35);\r
1567                                 cnt--;\r
1568                         }\r
1569                         if ((atomic_read(&client->adapter->bus_lock.count) < 1) && (cnt<=0)) {\r
1570                                 SENSOR_TR("\n %s obtain i2c fail in atomic!!\n",SENSOR_NAME_STRING());\r
1571                                 goto sensor_task_lock_err;\r
1572                         }\r
1573                         preempt_disable();\r
1574                 }\r
1575 \r
1576                 atomic_add(1, &sensor->tasklock_cnt);\r
1577         } else {\r
1578                 if (atomic_read(&sensor->tasklock_cnt) > 0) {\r
1579                         atomic_sub(1, &sensor->tasklock_cnt);\r
1580 \r
1581                         if (atomic_read(&sensor->tasklock_cnt) == 0)\r
1582                                 preempt_enable();\r
1583                 }\r
1584         }\r
1585         return 0;\r
1586 sensor_task_lock_err:\r
1587         return -1; \r
1588 #else\r
1589     return 0;\r
1590 #endif\r
1591 \r
1592 }\r
1593 \r
1594 /* sensor register write */\r
1595 static int sensor_write(struct i2c_client *client, u8 reg, u8 val)\r
1596 {\r
1597     int err,cnt;\r
1598     u8 buf[2];\r
1599     struct i2c_msg msg[1];\r
1600 \r
1601     buf[0] = reg;\r
1602     buf[1] = val;\r
1603 \r
1604 \r
1605     msg->addr = client->addr;\r
1606     msg->flags = client->flags;\r
1607     msg->buf = buf;\r
1608     msg->len = sizeof(buf);\r
1609     msg->scl_rate = CONFIG_SENSOR_I2C_SPEED;         /* ddl@rock-chips.com : 100kHz */\r
1610     msg->read_type = 0;               /* fpga i2c:0==I2C_NORMAL : direct use number not enum for don't want include spi_fpga.h */\r
1611 \r
1612     cnt = 3;\r
1613     err = -EAGAIN;\r
1614 \r
1615     while ((cnt-- > 0) && (err < 0)) {                       /* ddl@rock-chips.com :  Transfer again if transent is failed   */\r
1616         err = i2c_transfer(client->adapter, msg, 1);\r
1617 \r
1618         if (err >= 0) {\r
1619             return 0;\r
1620         } else {\r
1621                 SENSOR_TR("\n %s write reg(0x%x, val:0x%x) failed, try to write again!\n",SENSOR_NAME_STRING(),reg, val);\r
1622             udelay(10);\r
1623         }\r
1624     }\r
1625 \r
1626     return err;\r
1627 }\r
1628 \r
1629 /* sensor register read */\r
1630 static int sensor_read(struct i2c_client *client, u8 reg, u8 *val)\r
1631 {\r
1632     int err,cnt;\r
1633     u8 buf[1];\r
1634     struct i2c_msg msg[2];\r
1635 \r
1636     buf[0] = reg ;\r
1637 \r
1638     msg[0].addr = client->addr;\r
1639     msg[0].flags = client->flags;\r
1640     msg[0].buf = buf;\r
1641     msg[0].len = sizeof(buf);\r
1642     msg[0].scl_rate = CONFIG_SENSOR_I2C_SPEED;       /* ddl@rock-chips.com : 100kHz */\r
1643     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
1644 \r
1645     msg[1].addr = client->addr;\r
1646     msg[1].flags = client->flags|I2C_M_RD;\r
1647     msg[1].buf = buf;\r
1648     msg[1].len = 1;\r
1649     msg[1].scl_rate = CONFIG_SENSOR_I2C_SPEED;                       /* ddl@rock-chips.com : 100kHz */\r
1650     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
1651 \r
1652     cnt = 3;\r
1653     err = -EAGAIN;\r
1654     while ((cnt-- > 0) && (err < 0)) {                       /* ddl@rock-chips.com :  Transfer again if transent is failed   */\r
1655         err = i2c_transfer(client->adapter, msg, 2);\r
1656 \r
1657         if (err >= 0) {\r
1658             *val = buf[0];\r
1659             return 0;\r
1660         } else {\r
1661                 SENSOR_TR("\n %s read reg(0x%x val:0x%x) failed, try to read again! \n",SENSOR_NAME_STRING(),reg, *val);\r
1662             udelay(10);\r
1663         }\r
1664     }\r
1665 \r
1666     return err;\r
1667 }\r
1668 \r
1669 /* write a array of registers  */\r
1670 static int sensor_write_array(struct i2c_client *client, struct reginfo *regarray)\r
1671 {\r
1672     int err = 0, cnt;\r
1673     int i = 0;\r
1674 #if CONFIG_SENSOR_I2C_RDWRCHK    \r
1675         char valchk;\r
1676 #endif\r
1677 \r
1678         cnt = 0;\r
1679         if (sensor_task_lock(client, 1) < 0)\r
1680                 goto sensor_write_array_end;\r
1681 \r
1682     while (regarray[i].reg != 0)\r
1683     {\r
1684         err = sensor_write(client, regarray[i].reg, regarray[i].val);\r
1685         if (err < 0)\r
1686         {\r
1687             if (cnt-- > 0) {\r
1688                             SENSOR_TR("%s..write failed current reg:0x%x, Write array again !\n", SENSOR_NAME_STRING(),regarray[i].reg);\r
1689                                 i = 0;\r
1690                                 continue;\r
1691             } else {\r
1692                 SENSOR_TR("%s..write array failed!!!\n", SENSOR_NAME_STRING());\r
1693                 err = -EPERM;\r
1694                                 goto sensor_write_array_end;\r
1695             }\r
1696         } else {\r
1697         #if CONFIG_SENSOR_I2C_RDWRCHK\r
1698                         sensor_read(client, regarray[i].reg, &valchk);\r
1699                         if (valchk != regarray[i].val)\r
1700                                 SENSOR_TR("%s Reg:0x%x write(0x%x, 0x%x) fail\n",SENSOR_NAME_STRING(), regarray[i].reg, regarray[i].val, valchk);\r
1701                 #endif\r
1702         }\r
1703         i++;\r
1704     }\r
1705 \r
1706 sensor_write_array_end:\r
1707         sensor_task_lock(client,0);\r
1708         return err;\r
1709 }\r
1710 \r
1711 #if CONFIG_SENSOR_I2C_RDWRCHK\r
1712 static int sensor_check_array(struct i2c_client *client, struct reginfo *regarray)\r
1713 {\r
1714     int cnt;\r
1715     int i = 0;\r
1716         char valchk;\r
1717 \r
1718         cnt = 0;\r
1719         valchk = 0;\r
1720     while (regarray[i].reg != 0)\r
1721     {\r
1722                 sensor_read(client, regarray[i].reg, &valchk);\r
1723                 if (valchk != regarray[i].val)\r
1724                         SENSOR_TR("%s Reg:0x%x read(0x%x, 0x%x) error\n",SENSOR_NAME_STRING(), regarray[i].reg, regarray[i].val, valchk);\r
1725 \r
1726         i++;\r
1727     }\r
1728     return 0;\r
1729 }\r
1730 #endif\r
1731 static int sensor_ioctrl(struct soc_camera_device *icd,enum rk29sensor_power_cmd cmd, int on)\r
1732 {\r
1733         struct soc_camera_link *icl = to_soc_camera_link(icd);\r
1734         int ret = 0;\r
1735 \r
1736     SENSOR_DG("%s %s  cmd(%d) on(%d)\n",SENSOR_NAME_STRING(),__FUNCTION__,cmd,on);\r
1737         switch (cmd)\r
1738         {\r
1739                 case Sensor_PowerDown:\r
1740                 {\r
1741                         if (icl->powerdown) {\r
1742                                 ret = icl->powerdown(icd->pdev, on);\r
1743                                 if (ret == RK29_CAM_IO_SUCCESS) {\r
1744                                         if (on == 0) {\r
1745                                                 mdelay(2);\r
1746                                                 if (icl->reset)\r
1747                                                         icl->reset(icd->pdev);\r
1748                                         }\r
1749                                 } else if (ret == RK29_CAM_EIO_REQUESTFAIL) {\r
1750                                         ret = -ENODEV;\r
1751                                         goto sensor_power_end;\r
1752                                 }\r
1753                         }\r
1754                         break;\r
1755                 }\r
1756                 case Sensor_Flash:\r
1757                 {\r
1758                         struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
1759                 struct sensor *sensor = to_sensor(client);\r
1760 \r
1761                         if (sensor->sensor_io_request && sensor->sensor_io_request->sensor_ioctrl) {\r
1762                                 sensor->sensor_io_request->sensor_ioctrl(icd->pdev,Cam_Flash, on);\r
1763                 if(on){\r
1764                     //flash off after 2 secs\r
1765                         hrtimer_cancel(&(flash_off_timer.timer));\r
1766                         hrtimer_start(&(flash_off_timer.timer),ktime_set(0, 800*1000*1000),HRTIMER_MODE_REL);\r
1767                     }\r
1768                         }\r
1769             break;\r
1770                 }\r
1771                 default:\r
1772                 {\r
1773                         SENSOR_TR("%s %s cmd(0x%x) is unknown!",SENSOR_NAME_STRING(),__FUNCTION__,cmd);\r
1774                         break;\r
1775                 }\r
1776         }\r
1777 sensor_power_end:\r
1778         return ret;\r
1779 }\r
1780 static enum hrtimer_restart flash_off_func(struct hrtimer *timer){\r
1781         struct flash_timer *fps_timer = container_of(timer, struct flash_timer, timer);\r
1782     sensor_ioctrl(fps_timer->icd,Sensor_Flash,0);\r
1783         SENSOR_DG("%s %s !!!!!!",SENSOR_NAME_STRING(),__FUNCTION__);\r
1784     return 0;\r
1785     \r
1786 }\r
1787 static int sensor_init(struct v4l2_subdev *sd, u32 val)\r
1788 {\r
1789     struct i2c_client *client = v4l2_get_subdevdata(sd);\r
1790     struct soc_camera_device *icd = client->dev.platform_data;\r
1791     struct sensor *sensor = to_sensor(client);\r
1792         const struct v4l2_queryctrl *qctrl;\r
1793     const struct sensor_datafmt *fmt;\r
1794     char value;\r
1795     int ret,pid = 0;\r
1796 \r
1797     SENSOR_DG("\n%s..%s.. \n",SENSOR_NAME_STRING(),__FUNCTION__);\r
1798 \r
1799         if (sensor_ioctrl(icd, Sensor_PowerDown, 0) < 0) {\r
1800                 ret = -ENODEV;\r
1801                 goto sensor_INIT_ERR;\r
1802         }\r
1803 \r
1804     /* soft reset */\r
1805         if (sensor_task_lock(client,1)<0)\r
1806                 goto sensor_INIT_ERR;\r
1807         /* check if it is an sensor sensor */\r
1808     ret = sensor_read(client, 0xf0, &value);\r
1809     if (ret != 0) {\r
1810         SENSOR_TR("read chip id high byte failed\n");\r
1811         ret = -ENODEV;\r
1812         goto sensor_INIT_ERR;\r
1813     }\r
1814 \r
1815     pid |= (value << 8);\r
1816 \r
1817     ret = sensor_read(client, 0xf1, &value);\r
1818     if (ret != 0) {\r
1819         SENSOR_TR("read chip id low byte failed\n");\r
1820         ret = -ENODEV;\r
1821         goto sensor_INIT_ERR;\r
1822     }\r
1823 \r
1824     pid |= (value & 0xff);\r
1825     SENSOR_DG("\n %s  pid = 0x%x\n", SENSOR_NAME_STRING(), pid);\r
1826     if (pid == SENSOR_ID) {\r
1827         sensor->model = SENSOR_V4L2_IDENT;\r
1828     } else {\r
1829         SENSOR_TR("error: %s mismatched   pid = 0x%x\n", SENSOR_NAME_STRING(), pid);\r
1830         ret = -ENODEV;\r
1831         goto sensor_INIT_ERR;\r
1832     }\r
1833 \r
1834     ret = sensor_write_array(client, sensor_init_data);\r
1835 \r
1836 \r
1837     mdelay(300);\r
1838 \r
1839         \r
1840     if (ret != 0)\r
1841     {\r
1842         SENSOR_TR("error: %s initial failed\n",SENSOR_NAME_STRING());\r
1843         goto sensor_INIT_ERR;\r
1844     }\r
1845         sensor_task_lock(client,0);\r
1846     \r
1847     sensor->info_priv.winseqe_cur_addr  = (int)SENSOR_INIT_WINSEQADR;\r
1848     fmt = sensor_find_datafmt(SENSOR_INIT_PIXFMT,sensor_colour_fmts, ARRAY_SIZE(sensor_colour_fmts));\r
1849     if (!fmt) {\r
1850         SENSOR_TR("error: %s initial array colour fmts is not support!!",SENSOR_NAME_STRING());\r
1851         ret = -EINVAL;\r
1852         goto sensor_INIT_ERR;\r
1853     }\r
1854         sensor->info_priv.fmt = *fmt;\r
1855 \r
1856     /* sensor sensor information for initialization  */\r
1857         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_DO_WHITE_BALANCE);\r
1858         if (qctrl)\r
1859         sensor->info_priv.whiteBalance = qctrl->default_value;\r
1860         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_BRIGHTNESS);\r
1861         if (qctrl)\r
1862         sensor->info_priv.brightness = qctrl->default_value;\r
1863         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);\r
1864         if (qctrl)\r
1865         sensor->info_priv.effect = qctrl->default_value;\r
1866         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EXPOSURE);\r
1867         if (qctrl)\r
1868         sensor->info_priv.exposure = qctrl->default_value;\r
1869 \r
1870         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_SATURATION);\r
1871         if (qctrl)\r
1872         sensor->info_priv.saturation = qctrl->default_value;\r
1873         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_CONTRAST);\r
1874         if (qctrl)\r
1875         sensor->info_priv.contrast = qctrl->default_value;\r
1876         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_HFLIP);\r
1877         if (qctrl)\r
1878         sensor->info_priv.mirror = qctrl->default_value;\r
1879         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_VFLIP);\r
1880         if (qctrl)\r
1881         sensor->info_priv.flip = qctrl->default_value;\r
1882         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_SCENE);\r
1883         if (qctrl)\r
1884         sensor->info_priv.scene = qctrl->default_value;\r
1885         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_ZOOM_ABSOLUTE);\r
1886         if (qctrl)\r
1887         sensor->info_priv.digitalzoom = qctrl->default_value;\r
1888 \r
1889     /* ddl@rock-chips.com : if sensor support auto focus and flash, programer must run focus and flash code  */\r
1890         #if CONFIG_SENSOR_Focus\r
1891     sensor_set_focus();\r
1892     qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_FOCUS_ABSOLUTE);\r
1893         if (qctrl)\r
1894         sensor->info_priv.focus = qctrl->default_value;\r
1895         #endif\r
1896 \r
1897         #if CONFIG_SENSOR_Flash \r
1898         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_FLASH);\r
1899         if (qctrl)\r
1900         sensor->info_priv.flash = qctrl->default_value;\r
1901     flash_off_timer.icd = icd;\r
1902         flash_off_timer.timer.function = flash_off_func;\r
1903     #endif\r
1904 \r
1905     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
1906     sensor->info_priv.funmodule_state |= SENSOR_INIT_IS_OK;\r
1907     return 0;\r
1908 sensor_INIT_ERR:\r
1909     sensor->info_priv.funmodule_state &= ~SENSOR_INIT_IS_OK;\r
1910         sensor_task_lock(client,0);\r
1911         sensor_deactivate(client);\r
1912     return ret;\r
1913 }\r
1914 \r
1915 static int sensor_deactivate(struct i2c_client *client)\r
1916 {\r
1917         struct soc_camera_device *icd = client->dev.platform_data;\r
1918 \r
1919     struct sensor *sensor = to_sensor(client);\r
1920         SENSOR_DG("\n%s..%s.. Enter\n",SENSOR_NAME_STRING(),__FUNCTION__);\r
1921 \r
1922         /* ddl@rock-chips.com : all sensor output pin must change to input for other sensor */\r
1923     if (sensor->info_priv.funmodule_state & SENSOR_INIT_IS_OK) {\r
1924     }\r
1925         sensor_ioctrl(icd, Sensor_PowerDown, 1);\r
1926     msleep(100); \r
1927 \r
1928         /* ddl@rock-chips.com : sensor config init width , because next open sensor quickly(soc_camera_open -> Try to configure with default parameters) */\r
1929         icd->user_width = SENSOR_INIT_WIDTH;\r
1930     icd->user_height = SENSOR_INIT_HEIGHT;\r
1931     sensor->info_priv.funmodule_state &= ~SENSOR_INIT_IS_OK;\r
1932         \r
1933         return 0;\r
1934 }\r
1935 \r
1936 static  struct reginfo sensor_power_down_sequence[]=\r
1937 {\r
1938 \r
1939     {0x00,0x00}\r
1940 };\r
1941 static int sensor_suspend(struct soc_camera_device *icd, pm_message_t pm_msg)\r
1942 {\r
1943     int ret;\r
1944     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
1945 \r
1946     if (pm_msg.event == PM_EVENT_SUSPEND) {\r
1947         SENSOR_DG("\n %s Enter Suspend.. \n", SENSOR_NAME_STRING());\r
1948         ret = sensor_write_array(client, sensor_power_down_sequence) ;\r
1949         if (ret != 0) {\r
1950             SENSOR_TR("\n %s..%s WriteReg Fail.. \n", SENSOR_NAME_STRING(),__FUNCTION__);\r
1951             return ret;\r
1952         } else {\r
1953             ret = sensor_ioctrl(icd, Sensor_PowerDown, 1);\r
1954             if (ret < 0) {\r
1955                             SENSOR_TR("\n %s suspend fail for turn on power!\n", SENSOR_NAME_STRING());\r
1956                 return -EINVAL;\r
1957             }\r
1958         }\r
1959     } else {\r
1960         SENSOR_TR("\n %s cann't suppout Suspend..\n",SENSOR_NAME_STRING());\r
1961         return -EINVAL;\r
1962     }\r
1963     return 0;\r
1964 }\r
1965 \r
1966 static int sensor_resume(struct soc_camera_device *icd)\r
1967 {\r
1968         int ret;\r
1969 \r
1970     ret = sensor_ioctrl(icd, Sensor_PowerDown, 0);\r
1971     if (ret < 0) {\r
1972                 SENSOR_TR("\n %s resume fail for turn on power!\n", SENSOR_NAME_STRING());\r
1973         return -EINVAL;\r
1974     }\r
1975 \r
1976         SENSOR_DG("\n %s Enter Resume.. \n", SENSOR_NAME_STRING());\r
1977 \r
1978     return 0;\r
1979 \r
1980 }\r
1981 \r
1982 static int sensor_set_bus_param(struct soc_camera_device *icd,\r
1983                                 unsigned long flags)\r
1984 {\r
1985 \r
1986     return 0;\r
1987 }\r
1988 \r
1989 static unsigned long sensor_query_bus_param(struct soc_camera_device *icd)\r
1990 {\r
1991     struct soc_camera_link *icl = to_soc_camera_link(icd);\r
1992     unsigned long flags = SENSOR_BUS_PARAM;\r
1993 \r
1994     return soc_camera_apply_sensor_flags(icl, flags);\r
1995 }\r
1996 \r
1997 static int sensor_g_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)\r
1998 {\r
1999     struct i2c_client *client = v4l2_get_subdevdata(sd);\r
2000     struct soc_camera_device *icd = client->dev.platform_data;\r
2001     struct sensor *sensor = to_sensor(client);\r
2002 \r
2003     mf->width   = icd->user_width;\r
2004         mf->height      = icd->user_height;\r
2005         mf->code        = sensor->info_priv.fmt.code;\r
2006         mf->colorspace  = sensor->info_priv.fmt.colorspace;\r
2007         mf->field       = V4L2_FIELD_NONE;\r
2008 \r
2009     return 0;\r
2010 }\r
2011 static bool sensor_fmt_capturechk(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)\r
2012 {\r
2013     bool ret = false;\r
2014 \r
2015         if ((mf->width == 1024) && (mf->height == 768)) {\r
2016                 ret = true;\r
2017         } else if ((mf->width == 1280) && (mf->height == 1024)) {\r
2018                 ret = true;\r
2019         } else if ((mf->width == 1600) && (mf->height == 1200)) {\r
2020                 ret = true;\r
2021         } else if ((mf->width == 2048) && (mf->height == 1536)) {\r
2022                 ret = true;\r
2023         } else if ((mf->width == 2592) && (mf->height == 1944)) {\r
2024                 ret = true;\r
2025         }\r
2026 \r
2027         if (ret == true)\r
2028                 SENSOR_DG("%s %dx%d is capture format\n", __FUNCTION__, mf->width, mf->height);\r
2029         return ret;\r
2030 }\r
2031 \r
2032 static bool sensor_fmt_videochk(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)\r
2033 {\r
2034     bool ret = false;\r
2035 \r
2036         if ((mf->width == 1280) && (mf->height == 720)) {\r
2037                 ret = true;\r
2038         } else if ((mf->width == 1920) && (mf->height == 1080)) {\r
2039                 ret = true;\r
2040         }\r
2041 \r
2042         if (ret == true)\r
2043                 SENSOR_DG("%s %dx%d is video format\n", __FUNCTION__, mf->width, mf->height);\r
2044         return ret;\r
2045 }\r
2046 static  unsigned   int shutter_h,shutter_l;\r
2047 static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)\r
2048 {\r
2049     int ret1;\r
2050 \r
2051     struct i2c_client *client = v4l2_get_subdevdata(sd);\r
2052     const struct sensor_datafmt *fmt;\r
2053     struct sensor *sensor = to_sensor(client);\r
2054         const struct v4l2_queryctrl *qctrl;\r
2055         struct soc_camera_device *icd = client->dev.platform_data;\r
2056     struct reginfo *winseqe_set_addr=NULL;\r
2057     int ret=0, set_w,set_h;\r
2058 #if  1\r
2059 char value;\r
2060 unsigned   int pid=0,shutter,temp_reg;\r
2061 \r
2062 #endif\r
2063 \r
2064         fmt = sensor_find_datafmt(mf->code, sensor_colour_fmts,\r
2065                                    ARRAY_SIZE(sensor_colour_fmts));\r
2066         if (!fmt) {\r
2067         ret = -EINVAL;\r
2068         goto sensor_s_fmt_end;\r
2069     }\r
2070 \r
2071         if (sensor->info_priv.fmt.code != mf->code) {\r
2072                 switch (mf->code)\r
2073                 {\r
2074                         case V4L2_MBUS_FMT_YUYV8_2X8:\r
2075                         {\r
2076                                 winseqe_set_addr = sensor_ClrFmt_YUYV;\r
2077                                 break;\r
2078                         }\r
2079                         case V4L2_MBUS_FMT_UYVY8_2X8:\r
2080                         {\r
2081                                 winseqe_set_addr = sensor_ClrFmt_UYVY;\r
2082                                 break;\r
2083                         }\r
2084                         default:\r
2085                                 break;\r
2086                 }\r
2087                 if (winseqe_set_addr != NULL) {\r
2088             sensor_write_array(client, winseqe_set_addr);\r
2089                         sensor->info_priv.fmt.code = mf->code;\r
2090             sensor->info_priv.fmt.colorspace= mf->colorspace;            \r
2091                         SENSOR_DG("%s v4l2_mbus_code:%d set success!\n", SENSOR_NAME_STRING(),mf->code);\r
2092                 } else {\r
2093                         SENSOR_TR("%s v4l2_mbus_code:%d is invalidate!\n", SENSOR_NAME_STRING(),mf->code);\r
2094                 }\r
2095         }\r
2096 \r
2097     set_w = mf->width;\r
2098     set_h = mf->height;\r
2099 \r
2100         if (((set_w <= 176) && (set_h <= 144)) && sensor_qcif[0].reg)\r
2101         {\r
2102                 winseqe_set_addr = sensor_qcif;\r
2103         set_w = 176;\r
2104         set_h = 144;\r
2105         }\r
2106         else if (((set_w <= 320) && (set_h <= 240)) && sensor_qvga[0].reg)\r
2107     {\r
2108         winseqe_set_addr = sensor_qvga;\r
2109         set_w = 320;\r
2110         set_h = 240;\r
2111     }\r
2112     else if (((set_w <= 352) && (set_h<= 288)) && sensor_cif[0].reg)\r
2113     {\r
2114         winseqe_set_addr = sensor_cif;\r
2115         set_w = 352;\r
2116         set_h = 288;\r
2117     }\r
2118     else if (((set_w <= 640) && (set_h <= 480)) && sensor_vga[0].reg)\r
2119     {\r
2120         winseqe_set_addr = sensor_vga;\r
2121         set_w = 640;\r
2122         set_h = 480;\r
2123     }\r
2124     else if (((set_w <= 800) && (set_h <= 600)) && sensor_svga[0].reg)\r
2125     {\r
2126         winseqe_set_addr = sensor_svga;\r
2127         set_w = 800;\r
2128         set_h = 600;\r
2129     }\r
2130     else if (((set_w <= 1280) && (set_h <= 1024)) && sensor_sxga[0].reg)\r
2131     {\r
2132         winseqe_set_addr = sensor_sxga;\r
2133         set_w = 1280;\r
2134         set_h = 1024;\r
2135     }\r
2136     else if (((set_w <= 1600) && (set_h <= 1200)) && sensor_uxga[0].reg)\r
2137     {\r
2138         winseqe_set_addr = sensor_uxga;\r
2139         set_w = 1600;\r
2140         set_h = 1200;\r
2141     }\r
2142     else\r
2143     {\r
2144         winseqe_set_addr = SENSOR_INIT_WINSEQADR;               /* ddl@rock-chips.com : Sensor output smallest size if  isn't support app  */\r
2145         set_w = SENSOR_INIT_WIDTH;\r
2146         set_h = SENSOR_INIT_HEIGHT;\r
2147                 SENSOR_TR("\n %s..%s Format is Invalidate. pix->width = %d.. pix->height = %d\n",SENSOR_NAME_STRING(),__FUNCTION__,mf->width,mf->height);\r
2148     }\r
2149 \r
2150     if ((int)winseqe_set_addr  != sensor->info_priv.winseqe_cur_addr) {\r
2151         #if CONFIG_SENSOR_Flash\r
2152         if (sensor_fmt_capturechk(sd,mf) == true) {      /* ddl@rock-chips.com : Capture */\r
2153             if ((sensor->info_priv.flash == 1) || (sensor->info_priv.flash == 2)) {\r
2154                 sensor_ioctrl(icd, Sensor_Flash, Flash_On);\r
2155                 SENSOR_DG("%s flash on in capture!\n", SENSOR_NAME_STRING());\r
2156             }           \r
2157         } else {                                        /* ddl@rock-chips.com : Video */\r
2158             if ((sensor->info_priv.flash == 1) || (sensor->info_priv.flash == 2)) {\r
2159                 sensor_ioctrl(icd, Sensor_Flash, Flash_Off);\r
2160                 SENSOR_DG("%s flash off in preivew!\n", SENSOR_NAME_STRING());\r
2161             }\r
2162         }\r
2163         #endif\r
2164 \r
2165         if ((winseqe_set_addr == sensor_svga)||(winseqe_set_addr == sensor_vga) )\r
2166         {\r
2167         sensor_write(client, 0xb6, 0x00);  // AEC ON\r
2168         sensor_write(client, 0x03, shutter_h);\r
2169         sensor_write(client, 0x04, shutter_l);\r
2170        msleep(50);\r
2171         printk("set preview for rewrite 0x03");\r
2172         \r
2173         } \r
2174         ret |= sensor_write_array(client, winseqe_set_addr);\r
2175 #if 1\r
2176                 if (winseqe_set_addr == sensor_uxga) \r
2177         { \r
2178                                 sensor_write(client, 0xfe, 0x00);\r
2179                                 sensor_write(client, 0xb6, 0x02);  // AEC OFF\r
2180                                 sensor_read(client, 0x03, &value);\r
2181                                 shutter_h=value;\r
2182                                 pid |= (value << 8);\r
2183                                sensor_read(client, 0x04, &value);\r
2184                                  shutter_l=value;\r
2185                                 pid |= (value & 0xff);\r
2186                                 shutter=pid;\r
2187                                 temp_reg= shutter /2;\r
2188                                 if(temp_reg < 1) temp_reg = 1;\r
2189                                 sensor_write(client, 0x03, ((temp_reg>>8)&0xff));\r
2190                                sensor_write(client, 0x04, (temp_reg&0xff));\r
2191         }\r
2192 #endif   \r
2193 \r
2194         if (ret != 0) {\r
2195             SENSOR_TR("%s set format capability failed\n", SENSOR_NAME_STRING());\r
2196             #if CONFIG_SENSOR_Flash\r
2197             if (sensor_fmt_capturechk(sd,mf) == true) {\r
2198                 if ((sensor->info_priv.flash == 1) || (sensor->info_priv.flash == 2)) {\r
2199                     sensor_ioctrl(icd, Sensor_Flash, Flash_Off);\r
2200                     SENSOR_TR("%s Capture format set fail, flash off !\n", SENSOR_NAME_STRING());\r
2201                 }\r
2202             }\r
2203             #endif\r
2204             goto sensor_s_fmt_end;\r
2205         }\r
2206 \r
2207         sensor->info_priv.winseqe_cur_addr  = (int)winseqe_set_addr;\r
2208 \r
2209                 if (sensor_fmt_capturechk(sd,mf) == true) {                                 /* ddl@rock-chips.com : Capture */\r
2210                         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);\r
2211                         sensor_set_effect(icd, qctrl,sensor->info_priv.effect);\r
2212                         if (sensor->info_priv.whiteBalance != 0) {\r
2213                                 qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_DO_WHITE_BALANCE);\r
2214                                 sensor_set_whiteBalance(icd, qctrl,sensor->info_priv.whiteBalance);\r
2215                         }\r
2216                         sensor->info_priv.snap2preview = true;\r
2217                 } else if (sensor_fmt_videochk(sd,mf) == true) {                        /* ddl@rock-chips.com : Video */\r
2218                         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);\r
2219                         sensor_set_effect(icd, qctrl,sensor->info_priv.effect);\r
2220                         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_DO_WHITE_BALANCE);\r
2221                         sensor_set_whiteBalance(icd, qctrl,sensor->info_priv.whiteBalance);\r
2222                         sensor->info_priv.video2preview = true;\r
2223                 } else if ((sensor->info_priv.snap2preview == true) || (sensor->info_priv.video2preview == true)) {\r
2224                         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);\r
2225                         sensor_set_effect(icd, qctrl,sensor->info_priv.effect);\r
2226                         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_DO_WHITE_BALANCE);\r
2227                         sensor_set_whiteBalance(icd, qctrl,sensor->info_priv.whiteBalance);\r
2228             msleep(600);\r
2229                         sensor->info_priv.video2preview = false;\r
2230                         sensor->info_priv.snap2preview = false;\r
2231                 }\r
2232 \r
2233         SENSOR_DG("\n%s..%s.. icd->width = %d.. icd->height %d\n",SENSOR_NAME_STRING(),__FUNCTION__,set_w,set_h);\r
2234     }\r
2235     else\r
2236     {\r
2237         SENSOR_DG("\n %s .. Current Format is validate. icd->width = %d.. icd->height %d\n",SENSOR_NAME_STRING(),set_w,set_h);\r
2238     }\r
2239 \r
2240         mf->width = set_w;\r
2241     mf->height = set_h;\r
2242      msleep(100);  //james added\r
2243 sensor_s_fmt_end:\r
2244     return ret;\r
2245 }\r
2246 \r
2247 static int sensor_try_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)\r
2248 {\r
2249     struct i2c_client *client = v4l2_get_subdevdata(sd);\r
2250     struct sensor *sensor = to_sensor(client);\r
2251     const struct sensor_datafmt *fmt;\r
2252     int ret = 0,set_w,set_h;\r
2253    \r
2254         fmt = sensor_find_datafmt(mf->code, sensor_colour_fmts,\r
2255                                    ARRAY_SIZE(sensor_colour_fmts));\r
2256         if (fmt == NULL) {\r
2257                 fmt = &sensor->info_priv.fmt;\r
2258         mf->code = fmt->code;\r
2259         } \r
2260 \r
2261     if (mf->height > SENSOR_MAX_HEIGHT)\r
2262         mf->height = SENSOR_MAX_HEIGHT;\r
2263     else if (mf->height < SENSOR_MIN_HEIGHT)\r
2264         mf->height = SENSOR_MIN_HEIGHT;\r
2265 \r
2266     if (mf->width > SENSOR_MAX_WIDTH)\r
2267         mf->width = SENSOR_MAX_WIDTH;\r
2268     else if (mf->width < SENSOR_MIN_WIDTH)\r
2269         mf->width = SENSOR_MIN_WIDTH;\r
2270 \r
2271     set_w = mf->width;\r
2272     set_h = mf->height;\r
2273 \r
2274         if (((set_w <= 176) && (set_h <= 144)) && sensor_qcif[0].reg)\r
2275         {\r
2276         set_w = 176;\r
2277         set_h = 144;\r
2278         }\r
2279         else if (((set_w <= 320) && (set_h <= 240)) && sensor_qvga[0].reg)\r
2280     {\r
2281         set_w = 320;\r
2282         set_h = 240;\r
2283     }\r
2284     else if (((set_w <= 352) && (set_h<= 288)) && sensor_cif[0].reg)\r
2285     {\r
2286         set_w = 352;\r
2287         set_h = 288;\r
2288     }\r
2289     else if (((set_w <= 640) && (set_h <= 480)) && sensor_vga[0].reg)\r
2290     {\r
2291         set_w = 640;\r
2292         set_h = 480;\r
2293     }\r
2294     else if (((set_w <= 800) && (set_h <= 600)) && sensor_svga[0].reg)\r
2295     {\r
2296         set_w = 800;\r
2297         set_h = 600;\r
2298     }\r
2299     else if (((set_w <= 1280) && (set_h <= 1024)) && sensor_sxga[0].reg)\r
2300     {\r
2301         set_w = 1280;\r
2302         set_h = 1024;\r
2303     }\r
2304     else if (((set_w <= 1600) && (set_h <= 1200)) && sensor_uxga[0].reg)\r
2305     {\r
2306         set_w = 1600;\r
2307         set_h = 1200;\r
2308     }\r
2309     else\r
2310     {\r
2311         set_w = SENSOR_INIT_WIDTH;\r
2312         set_h = SENSOR_INIT_HEIGHT;\r
2313     }\r
2314 \r
2315         mf->width = set_w;\r
2316     mf->height = set_h;\r
2317     mf->colorspace = fmt->colorspace;\r
2318     \r
2319     return ret;\r
2320 }\r
2321 \r
2322  static int sensor_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *id)\r
2323 {\r
2324     struct i2c_client *client = v4l2_get_subdevdata(sd);\r
2325 \r
2326     if (id->match.type != V4L2_CHIP_MATCH_I2C_ADDR)\r
2327         return -EINVAL;\r
2328 \r
2329     if (id->match.addr != client->addr)\r
2330         return -ENODEV;\r
2331 \r
2332     id->ident = SENSOR_V4L2_IDENT;      /* ddl@rock-chips.com :  Return gc2035  identifier */\r
2333     id->revision = 0;\r
2334 \r
2335     return 0;\r
2336 }\r
2337 #if CONFIG_SENSOR_Brightness\r
2338 static int sensor_set_brightness(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
2339 {\r
2340     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
2341 \r
2342     if ((value >= qctrl->minimum) && (value <= qctrl->maximum))\r
2343     {\r
2344         if (sensor_BrightnessSeqe[value - qctrl->minimum] != NULL)\r
2345         {\r
2346             if (sensor_write_array(client, sensor_BrightnessSeqe[value - qctrl->minimum]) != 0)\r
2347             {\r
2348                 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
2349                 return -EINVAL;\r
2350             }\r
2351             SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
2352             return 0;\r
2353         }\r
2354     }\r
2355         SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
2356     return -EINVAL;\r
2357 }\r
2358 #endif\r
2359 #if CONFIG_SENSOR_Effect\r
2360 static int sensor_set_effect(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
2361 {\r
2362     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
2363 \r
2364     if ((value >= qctrl->minimum) && (value <= qctrl->maximum))\r
2365     {\r
2366         if (sensor_EffectSeqe[value - qctrl->minimum] != NULL)\r
2367         {\r
2368             if (sensor_write_array(client, sensor_EffectSeqe[value - qctrl->minimum]) != 0)\r
2369             {\r
2370                 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
2371                 return -EINVAL;\r
2372             }\r
2373             SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
2374             return 0;\r
2375         }\r
2376     }\r
2377         SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
2378     return -EINVAL;\r
2379 }\r
2380 #endif\r
2381 #if CONFIG_SENSOR_Exposure\r
2382 static int sensor_set_exposure(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
2383 {\r
2384     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
2385 \r
2386     if ((value >= qctrl->minimum) && (value <= qctrl->maximum))\r
2387     {\r
2388         if (sensor_ExposureSeqe[value - qctrl->minimum] != NULL)\r
2389         {\r
2390             if (sensor_write_array(client, sensor_ExposureSeqe[value - qctrl->minimum]) != 0)\r
2391             {\r
2392                 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
2393                 return -EINVAL;\r
2394             }\r
2395             SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
2396             return 0;\r
2397         }\r
2398     }\r
2399         SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
2400     return -EINVAL;\r
2401 }\r
2402 #endif\r
2403 #if CONFIG_SENSOR_Saturation\r
2404 static int sensor_set_saturation(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
2405 {\r
2406     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
2407 \r
2408     if ((value >= qctrl->minimum) && (value <= qctrl->maximum))\r
2409     {\r
2410         if (sensor_SaturationSeqe[value - qctrl->minimum] != NULL)\r
2411         {\r
2412             if (sensor_write_array(client, sensor_SaturationSeqe[value - qctrl->minimum]) != 0)\r
2413             {\r
2414                 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
2415                 return -EINVAL;\r
2416             }\r
2417             SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
2418             return 0;\r
2419         }\r
2420     }\r
2421     SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
2422     return -EINVAL;\r
2423 }\r
2424 #endif\r
2425 #if CONFIG_SENSOR_Contrast\r
2426 static int sensor_set_contrast(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
2427 {\r
2428     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
2429 \r
2430     if ((value >= qctrl->minimum) && (value <= qctrl->maximum))\r
2431     {\r
2432         if (sensor_ContrastSeqe[value - qctrl->minimum] != NULL)\r
2433         {\r
2434             if (sensor_write_array(client, sensor_ContrastSeqe[value - qctrl->minimum]) != 0)\r
2435             {\r
2436                 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
2437                 return -EINVAL;\r
2438             }\r
2439             SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
2440             return 0;\r
2441         }\r
2442     }\r
2443     SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
2444     return -EINVAL;\r
2445 }\r
2446 #endif\r
2447 #if CONFIG_SENSOR_Mirror\r
2448 static int sensor_set_mirror(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
2449 {\r
2450     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
2451 \r
2452     if ((value >= qctrl->minimum) && (value <= qctrl->maximum))\r
2453     {\r
2454         if (sensor_MirrorSeqe[value - qctrl->minimum] != NULL)\r
2455         {\r
2456             if (sensor_write_array(client, sensor_MirrorSeqe[value - qctrl->minimum]) != 0)\r
2457             {\r
2458                 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
2459                 return -EINVAL;\r
2460             }\r
2461             SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
2462             return 0;\r
2463         }\r
2464     }\r
2465     SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
2466     return -EINVAL;\r
2467 }\r
2468 #endif\r
2469 #if CONFIG_SENSOR_Flip\r
2470 static int sensor_set_flip(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
2471 {\r
2472     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
2473 \r
2474     if ((value >= qctrl->minimum) && (value <= qctrl->maximum))\r
2475     {\r
2476         if (sensor_FlipSeqe[value - qctrl->minimum] != NULL)\r
2477         {\r
2478             if (sensor_write_array(client, sensor_FlipSeqe[value - qctrl->minimum]) != 0)\r
2479             {\r
2480                 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
2481                 return -EINVAL;\r
2482             }\r
2483             SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
2484             return 0;\r
2485         }\r
2486     }\r
2487     SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
2488     return -EINVAL;\r
2489 }\r
2490 #endif\r
2491 #if CONFIG_SENSOR_Scene\r
2492 static int sensor_set_scene(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
2493 {\r
2494     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
2495 \r
2496     if ((value >= qctrl->minimum) && (value <= qctrl->maximum))\r
2497     {\r
2498         if (sensor_SceneSeqe[value - qctrl->minimum] != NULL)\r
2499         {\r
2500             if (sensor_write_array(client, sensor_SceneSeqe[value - qctrl->minimum]) != 0)\r
2501             {\r
2502                 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
2503                 return -EINVAL;\r
2504             }\r
2505             SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
2506             return 0;\r
2507         }\r
2508     }\r
2509     SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
2510     return -EINVAL;\r
2511 }\r
2512 #endif\r
2513 #if CONFIG_SENSOR_WhiteBalance\r
2514 static int sensor_set_whiteBalance(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
2515 {\r
2516     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
2517 \r
2518     if ((value >= qctrl->minimum) && (value <= qctrl->maximum))\r
2519     {\r
2520         if (sensor_WhiteBalanceSeqe[value - qctrl->minimum] != NULL)\r
2521         {\r
2522             if (sensor_write_array(client, sensor_WhiteBalanceSeqe[value - qctrl->minimum]) != 0)\r
2523             {\r
2524                 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
2525                 return -EINVAL;\r
2526             }\r
2527             SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
2528             return 0;\r
2529         }\r
2530     }\r
2531         SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
2532     return -EINVAL;\r
2533 }\r
2534 #endif\r
2535 #if CONFIG_SENSOR_DigitalZoom\r
2536 static int sensor_set_digitalzoom(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int *value)\r
2537 {\r
2538     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
2539     struct sensor *sensor = to_sensor(client);\r
2540         const struct v4l2_queryctrl *qctrl_info;\r
2541     int digitalzoom_cur, digitalzoom_total;\r
2542 \r
2543         qctrl_info = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_ZOOM_ABSOLUTE);\r
2544         if (qctrl_info)\r
2545                 return -EINVAL;\r
2546 \r
2547     digitalzoom_cur = sensor->info_priv.digitalzoom;\r
2548     digitalzoom_total = qctrl_info->maximum;\r
2549 \r
2550     if ((value > 0) && (digitalzoom_cur >= digitalzoom_total))\r
2551     {\r
2552         SENSOR_TR("%s digitalzoom is maximum - %x\n", SENSOR_NAME_STRING(), digitalzoom_cur);\r
2553         return -EINVAL;\r
2554     }\r
2555 \r
2556     if  ((value < 0) && (digitalzoom_cur <= qctrl_info->minimum))\r
2557     {\r
2558         SENSOR_TR("%s digitalzoom is minimum - %x\n", SENSOR_NAME_STRING(), digitalzoom_cur);\r
2559         return -EINVAL;\r
2560     }\r
2561 \r
2562     if ((value > 0) && ((digitalzoom_cur + value) > digitalzoom_total))\r
2563     {\r
2564         value = digitalzoom_total - digitalzoom_cur;\r
2565     }\r
2566 \r
2567     if ((value < 0) && ((digitalzoom_cur + value) < 0))\r
2568     {\r
2569         value = 0 - digitalzoom_cur;\r
2570     }\r
2571 \r
2572     digitalzoom_cur += value;\r
2573 \r
2574     if (sensor_ZoomSeqe[digitalzoom_cur] != NULL)\r
2575     {\r
2576         if (sensor_write_array(client, sensor_ZoomSeqe[digitalzoom_cur]) != 0)\r
2577         {\r
2578             SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
2579             return -EINVAL;\r
2580         }\r
2581         SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
2582         return 0;\r
2583     }\r
2584 \r
2585     return -EINVAL;\r
2586 }\r
2587 #endif\r
2588 #if CONFIG_SENSOR_Flash\r
2589 static int sensor_set_flash(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
2590 {    \r
2591     if ((value >= qctrl->minimum) && (value <= qctrl->maximum)) {\r
2592         if (value == 3) {       /* ddl@rock-chips.com: torch */\r
2593             sensor_ioctrl(icd, Sensor_Flash, Flash_Torch);   /* Flash On */\r
2594         } else {\r
2595             sensor_ioctrl(icd, Sensor_Flash, Flash_Off);\r
2596         }\r
2597         SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
2598         return 0;\r
2599     }\r
2600     \r
2601         SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
2602     return -EINVAL;\r
2603 }\r
2604 #endif\r
2605 \r
2606 static int sensor_g_control(struct v4l2_subdev *sd, struct v4l2_control *ctrl)\r
2607 {\r
2608     struct i2c_client *client = v4l2_get_subdevdata(sd);\r
2609     struct sensor *sensor = to_sensor(client);\r
2610     const struct v4l2_queryctrl *qctrl;\r
2611 \r
2612     qctrl = soc_camera_find_qctrl(&sensor_ops, ctrl->id);\r
2613 \r
2614     if (!qctrl)\r
2615     {\r
2616         SENSOR_TR("\n %s ioctrl id = %d  is invalidate \n", SENSOR_NAME_STRING(), ctrl->id);\r
2617         return -EINVAL;\r
2618     }\r
2619 \r
2620     switch (ctrl->id)\r
2621     {\r
2622         case V4L2_CID_BRIGHTNESS:\r
2623             {\r
2624                 ctrl->value = sensor->info_priv.brightness;\r
2625                 break;\r
2626             }\r
2627         case V4L2_CID_SATURATION:\r
2628             {\r
2629                 ctrl->value = sensor->info_priv.saturation;\r
2630                 break;\r
2631             }\r
2632         case V4L2_CID_CONTRAST:\r
2633             {\r
2634                 ctrl->value = sensor->info_priv.contrast;\r
2635                 break;\r
2636             }\r
2637         case V4L2_CID_DO_WHITE_BALANCE:\r
2638             {\r
2639                 ctrl->value = sensor->info_priv.whiteBalance;\r
2640                 break;\r
2641             }\r
2642         case V4L2_CID_EXPOSURE:\r
2643             {\r
2644                 ctrl->value = sensor->info_priv.exposure;\r
2645                 break;\r
2646             }\r
2647         case V4L2_CID_HFLIP:\r
2648             {\r
2649                 ctrl->value = sensor->info_priv.mirror;\r
2650                 break;\r
2651             }\r
2652         case V4L2_CID_VFLIP:\r
2653             {\r
2654                 ctrl->value = sensor->info_priv.flip;\r
2655                 break;\r
2656             }\r
2657         default :\r
2658                 break;\r
2659     }\r
2660     return 0;\r
2661 }\r
2662 \r
2663 \r
2664 \r
2665 static int sensor_s_control(struct v4l2_subdev *sd, struct v4l2_control *ctrl)\r
2666 {\r
2667     struct i2c_client *client = v4l2_get_subdevdata(sd);\r
2668     struct sensor *sensor = to_sensor(client);\r
2669     struct soc_camera_device *icd = client->dev.platform_data;\r
2670     const struct v4l2_queryctrl *qctrl;\r
2671 \r
2672 \r
2673     qctrl = soc_camera_find_qctrl(&sensor_ops, ctrl->id);\r
2674 \r
2675     if (!qctrl)\r
2676     {\r
2677         SENSOR_TR("\n %s ioctrl id = %d  is invalidate \n", SENSOR_NAME_STRING(), ctrl->id);\r
2678         return -EINVAL;\r
2679     }\r
2680 \r
2681     switch (ctrl->id)\r
2682     {\r
2683 #if CONFIG_SENSOR_Brightness\r
2684         case V4L2_CID_BRIGHTNESS:\r
2685             {\r
2686                 if (ctrl->value != sensor->info_priv.brightness)\r
2687                 {\r
2688                     if (sensor_set_brightness(icd, qctrl,ctrl->value) != 0)\r
2689                     {\r
2690                         return -EINVAL;\r
2691                     }\r
2692                     sensor->info_priv.brightness = ctrl->value;\r
2693                 }\r
2694                 break;\r
2695             }\r
2696 #endif\r
2697 #if CONFIG_SENSOR_Exposure\r
2698         case V4L2_CID_EXPOSURE:\r
2699             {\r
2700                 if (ctrl->value != sensor->info_priv.exposure)\r
2701                 {\r
2702                     if (sensor_set_exposure(icd, qctrl,ctrl->value) != 0)\r
2703                     {\r
2704                         return -EINVAL;\r
2705                     }\r
2706                     sensor->info_priv.exposure = ctrl->value;\r
2707                 }\r
2708                 break;\r
2709             }\r
2710 #endif\r
2711 #if CONFIG_SENSOR_Saturation\r
2712         case V4L2_CID_SATURATION:\r
2713             {\r
2714                 if (ctrl->value != sensor->info_priv.saturation)\r
2715                 {\r
2716                     if (sensor_set_saturation(icd, qctrl,ctrl->value) != 0)\r
2717                     {\r
2718                         return -EINVAL;\r
2719                     }\r
2720                     sensor->info_priv.saturation = ctrl->value;\r
2721                 }\r
2722                 break;\r
2723             }\r
2724 #endif\r
2725 #if CONFIG_SENSOR_Contrast\r
2726         case V4L2_CID_CONTRAST:\r
2727             {\r
2728                 if (ctrl->value != sensor->info_priv.contrast)\r
2729                 {\r
2730                     if (sensor_set_contrast(icd, qctrl,ctrl->value) != 0)\r
2731                     {\r
2732                         return -EINVAL;\r
2733                     }\r
2734                     sensor->info_priv.contrast = ctrl->value;\r
2735                 }\r
2736                 break;\r
2737             }\r
2738 #endif\r
2739 #if CONFIG_SENSOR_WhiteBalance\r
2740         case V4L2_CID_DO_WHITE_BALANCE:\r
2741             {\r
2742                 if (ctrl->value != sensor->info_priv.whiteBalance)\r
2743                 {\r
2744                     if (sensor_set_whiteBalance(icd, qctrl,ctrl->value) != 0)\r
2745                     {\r
2746                         return -EINVAL;\r
2747                     }\r
2748                     sensor->info_priv.whiteBalance = ctrl->value;\r
2749                 }\r
2750                 break;\r
2751             }\r
2752 #endif\r
2753 #if CONFIG_SENSOR_Mirror\r
2754         case V4L2_CID_HFLIP:\r
2755             {\r
2756                 if (ctrl->value != sensor->info_priv.mirror)\r
2757                 {\r
2758                     if (sensor_set_mirror(icd, qctrl,ctrl->value) != 0)\r
2759                         return -EINVAL;\r
2760                     sensor->info_priv.mirror = ctrl->value;\r
2761                 }\r
2762                 break;\r
2763             }\r
2764 #endif\r
2765 #if CONFIG_SENSOR_Flip\r
2766         case V4L2_CID_VFLIP:\r
2767             {\r
2768                 if (ctrl->value != sensor->info_priv.flip)\r
2769                 {\r
2770                     if (sensor_set_flip(icd, qctrl,ctrl->value) != 0)\r
2771                         return -EINVAL;\r
2772                     sensor->info_priv.flip = ctrl->value;\r
2773                 }\r
2774                 break;\r
2775             }\r
2776 #endif\r
2777         default:\r
2778             break;\r
2779     }\r
2780 \r
2781     return 0;\r
2782 }\r
2783 static int sensor_g_ext_control(struct soc_camera_device *icd , struct v4l2_ext_control *ext_ctrl)\r
2784 {\r
2785     const struct v4l2_queryctrl *qctrl;\r
2786     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
2787     struct sensor *sensor = to_sensor(client);\r
2788 \r
2789     qctrl = soc_camera_find_qctrl(&sensor_ops, ext_ctrl->id);\r
2790 \r
2791     if (!qctrl)\r
2792     {\r
2793         SENSOR_TR("\n %s ioctrl id = %d  is invalidate \n", SENSOR_NAME_STRING(), ext_ctrl->id);\r
2794         return -EINVAL;\r
2795     }\r
2796 \r
2797     switch (ext_ctrl->id)\r
2798     {\r
2799         case V4L2_CID_SCENE:\r
2800             {\r
2801                 ext_ctrl->value = sensor->info_priv.scene;\r
2802                 break;\r
2803             }\r
2804         case V4L2_CID_EFFECT:\r
2805             {\r
2806                 ext_ctrl->value = sensor->info_priv.effect;\r
2807                 break;\r
2808             }\r
2809         case V4L2_CID_ZOOM_ABSOLUTE:\r
2810             {\r
2811                 ext_ctrl->value = sensor->info_priv.digitalzoom;\r
2812                 break;\r
2813             }\r
2814         case V4L2_CID_ZOOM_RELATIVE:\r
2815             {\r
2816                 return -EINVAL;\r
2817             }\r
2818         case V4L2_CID_FOCUS_ABSOLUTE:\r
2819             {\r
2820                 ext_ctrl->value = sensor->info_priv.focus;\r
2821                 break;\r
2822             }\r
2823         case V4L2_CID_FOCUS_RELATIVE:\r
2824             {\r
2825                 return -EINVAL;\r
2826             }\r
2827         case V4L2_CID_FLASH:\r
2828             {\r
2829                 ext_ctrl->value = sensor->info_priv.flash;\r
2830                 break;\r
2831             }\r
2832         default :\r
2833             break;\r
2834     }\r
2835     return 0;\r
2836 }\r
2837 static int sensor_s_ext_control(struct soc_camera_device *icd, struct v4l2_ext_control *ext_ctrl)\r
2838 {\r
2839     const struct v4l2_queryctrl *qctrl;\r
2840     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
2841     struct sensor *sensor = to_sensor(client);\r
2842     int val_offset;\r
2843 \r
2844     qctrl = soc_camera_find_qctrl(&sensor_ops, ext_ctrl->id);\r
2845 \r
2846     if (!qctrl)\r
2847     {\r
2848         SENSOR_TR("\n %s ioctrl id = %d  is invalidate \n", SENSOR_NAME_STRING(), ext_ctrl->id);\r
2849         return -EINVAL;\r
2850     }\r
2851 \r
2852         val_offset = 0;\r
2853     switch (ext_ctrl->id)\r
2854     {\r
2855 #if CONFIG_SENSOR_Scene\r
2856         case V4L2_CID_SCENE:\r
2857             {\r
2858                 if (ext_ctrl->value != sensor->info_priv.scene)\r
2859                 {\r
2860                     if (sensor_set_scene(icd, qctrl,ext_ctrl->value) != 0)\r
2861                         return -EINVAL;\r
2862                     sensor->info_priv.scene = ext_ctrl->value;\r
2863                 }\r
2864                 break;\r
2865             }\r
2866 #endif\r
2867 #if CONFIG_SENSOR_Effect\r
2868         case V4L2_CID_EFFECT:\r
2869             {\r
2870                 if (ext_ctrl->value != sensor->info_priv.effect)\r
2871                 {\r
2872                     if (sensor_set_effect(icd, qctrl,ext_ctrl->value) != 0)\r
2873                         return -EINVAL;\r
2874                     sensor->info_priv.effect= ext_ctrl->value;\r
2875                 }\r
2876                 break;\r
2877             }\r
2878 #endif\r
2879 #if CONFIG_SENSOR_DigitalZoom\r
2880         case V4L2_CID_ZOOM_ABSOLUTE:\r
2881             {\r
2882                 if ((ext_ctrl->value < qctrl->minimum) || (ext_ctrl->value > qctrl->maximum))\r
2883                     return -EINVAL;\r
2884 \r
2885                 if (ext_ctrl->value != sensor->info_priv.digitalzoom)\r
2886                 {\r
2887                     val_offset = ext_ctrl->value -sensor->info_priv.digitalzoom;\r
2888 \r
2889                     if (sensor_set_digitalzoom(icd, qctrl,&val_offset) != 0)\r
2890                         return -EINVAL;\r
2891                     sensor->info_priv.digitalzoom += val_offset;\r
2892 \r
2893                     SENSOR_DG("%s digitalzoom is %x\n",SENSOR_NAME_STRING(),  sensor->info_priv.digitalzoom);\r
2894                 }\r
2895 \r
2896                 break;\r
2897             }\r
2898         case V4L2_CID_ZOOM_RELATIVE:\r
2899             {\r
2900                 if (ext_ctrl->value)\r
2901                 {\r
2902                     if (sensor_set_digitalzoom(icd, qctrl,&ext_ctrl->value) != 0)\r
2903                         return -EINVAL;\r
2904                     sensor->info_priv.digitalzoom += ext_ctrl->value;\r
2905 \r
2906                     SENSOR_DG("%s digitalzoom is %x\n", SENSOR_NAME_STRING(), sensor->info_priv.digitalzoom);\r
2907                 }\r
2908                 break;\r
2909             }\r
2910 #endif\r
2911 #if CONFIG_SENSOR_Focus\r
2912         case V4L2_CID_FOCUS_ABSOLUTE:\r
2913             {\r
2914                 if ((ext_ctrl->value < qctrl->minimum) || (ext_ctrl->value > qctrl->maximum))\r
2915                     return -EINVAL;\r
2916 \r
2917                 if (ext_ctrl->value != sensor->info_priv.focus)\r
2918                 {\r
2919                     val_offset = ext_ctrl->value -sensor->info_priv.focus;\r
2920 \r
2921                     sensor->info_priv.focus += val_offset;\r
2922                 }\r
2923 \r
2924                 break;\r
2925             }\r
2926         case V4L2_CID_FOCUS_RELATIVE:\r
2927             {\r
2928                 if (ext_ctrl->value)\r
2929                 {\r
2930                     sensor->info_priv.focus += ext_ctrl->value;\r
2931 \r
2932                     SENSOR_DG("%s focus is %x\n", SENSOR_NAME_STRING(), sensor->info_priv.focus);\r
2933                 }\r
2934                 break;\r
2935             }\r
2936 #endif\r
2937 #if CONFIG_SENSOR_Flash\r
2938         case V4L2_CID_FLASH:\r
2939             {\r
2940                 if (sensor_set_flash(icd, qctrl,ext_ctrl->value) != 0)\r
2941                     return -EINVAL;\r
2942                 sensor->info_priv.flash = ext_ctrl->value;\r
2943 \r
2944                 SENSOR_DG("%s flash is %x\n",SENSOR_NAME_STRING(), sensor->info_priv.flash);\r
2945                 break;\r
2946             }\r
2947 #endif\r
2948         default:\r
2949             break;\r
2950     }\r
2951 \r
2952     return 0;\r
2953 }\r
2954 \r
2955 static int sensor_g_ext_controls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ext_ctrl)\r
2956 {\r
2957     struct i2c_client *client = v4l2_get_subdevdata(sd);\r
2958     struct soc_camera_device *icd = client->dev.platform_data;\r
2959     int i, error_cnt=0, error_idx=-1;\r
2960 \r
2961 \r
2962     for (i=0; i<ext_ctrl->count; i++) {\r
2963         if (sensor_g_ext_control(icd, &ext_ctrl->controls[i]) != 0) {\r
2964             error_cnt++;\r
2965             error_idx = i;\r
2966         }\r
2967     }\r
2968 \r
2969     if (error_cnt > 1)\r
2970         error_idx = ext_ctrl->count;\r
2971 \r
2972     if (error_idx != -1) {\r
2973         ext_ctrl->error_idx = error_idx;\r
2974         return -EINVAL;\r
2975     } else {\r
2976         return 0;\r
2977     }\r
2978 }\r
2979 \r
2980 static int sensor_s_ext_controls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ext_ctrl)\r
2981 {\r
2982     struct i2c_client *client = v4l2_get_subdevdata(sd);\r
2983     struct soc_camera_device *icd = client->dev.platform_data;\r
2984     int i, error_cnt=0, error_idx=-1;\r
2985 \r
2986 \r
2987     for (i=0; i<ext_ctrl->count; i++) {\r
2988         if (sensor_s_ext_control(icd, &ext_ctrl->controls[i]) != 0) {\r
2989             error_cnt++;\r
2990             error_idx = i;\r
2991         }\r
2992     }\r
2993 \r
2994     if (error_cnt > 1)\r
2995         error_idx = ext_ctrl->count;\r
2996 \r
2997     if (error_idx != -1) {\r
2998         ext_ctrl->error_idx = error_idx;\r
2999         return -EINVAL;\r
3000     } else {\r
3001         return 0;\r
3002     }\r
3003 }\r
3004 \r
3005 /* Interface active, can use i2c. If it fails, it can indeed mean, that\r
3006  * this wasn't our capture interface, so, we wait for the right one */\r
3007 static int sensor_video_probe(struct soc_camera_device *icd,\r
3008                                struct i2c_client *client)\r
3009 {\r
3010     char value;\r
3011     int ret,pid = 0;\r
3012     struct sensor *sensor = to_sensor(client);\r
3013 \r
3014     /* We must have a parent by now. And it cannot be a wrong one.\r
3015      * So this entire test is completely redundant. */\r
3016     if (!icd->dev.parent ||\r
3017             to_soc_camera_host(icd->dev.parent)->nr != icd->iface)\r
3018                 return -ENODEV;\r
3019 \r
3020         if (sensor_ioctrl(icd, Sensor_PowerDown, 0) < 0) {\r
3021                 ret = -ENODEV;\r
3022                 goto sensor_video_probe_err;\r
3023         }\r
3024 \r
3025     /* soft reset */\r
3026 \r
3027     /* check if it is an sensor sensor */\r
3028     ret = sensor_read(client, 0xf0, &value);\r
3029     if (ret != 0) {\r
3030         SENSOR_TR("read chip id high byte failed\n");\r
3031         ret = -ENODEV;\r
3032         goto sensor_video_probe_err;\r
3033     }\r
3034 \r
3035     pid |= (value << 8);\r
3036 \r
3037     ret = sensor_read(client, 0xf1, &value);\r
3038     if (ret != 0) {\r
3039         SENSOR_TR("read chip id low byte failed\n");\r
3040         ret = -ENODEV;\r
3041         goto sensor_video_probe_err;\r
3042     }\r
3043 \r
3044     pid |= (value & 0xff);\r
3045     SENSOR_DG("\n %s  pid = 0x%x\n", SENSOR_NAME_STRING(), pid);\r
3046     if (pid == SENSOR_ID) {\r
3047         sensor->model = SENSOR_V4L2_IDENT;\r
3048     } else {\r
3049         SENSOR_TR("error: %s mismatched   pid = 0x%x\n", SENSOR_NAME_STRING(), pid);\r
3050         ret = -ENODEV;\r
3051         goto sensor_video_probe_err;\r
3052     }\r
3053 \r
3054     return 0;\r
3055 \r
3056 sensor_video_probe_err:\r
3057 \r
3058     return ret;\r
3059 }\r
3060 static long sensor_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)\r
3061 {\r
3062         struct i2c_client *client = v4l2_get_subdevdata(sd);\r
3063     struct soc_camera_device *icd = client->dev.platform_data;\r
3064     struct sensor *sensor = to_sensor(client);\r
3065 #if CONFIG_SENSOR_Flash\r
3066     int i;\r
3067 #endif\r
3068     int ret = 0;\r
3069     \r
3070         SENSOR_DG("\n%s..%s..cmd:%x \n",SENSOR_NAME_STRING(),__FUNCTION__,cmd);\r
3071         switch (cmd)\r
3072         {\r
3073                 case RK29_CAM_SUBDEV_DEACTIVATE:\r
3074                 {\r
3075                         sensor_deactivate(client);\r
3076                         break;\r
3077                 }\r
3078 \r
3079                 case RK29_CAM_SUBDEV_IOREQUEST:\r
3080                 {\r
3081                         sensor->sensor_io_request = (struct rk29camera_platform_data*)arg;           \r
3082             if (sensor->sensor_io_request != NULL) { \r
3083                 sensor->sensor_gpio_res = NULL;\r
3084                 for (i=0; i<RK29_CAM_SUPPORT_NUMS;i++) {\r
3085                     if (sensor->sensor_io_request->gpio_res[i].dev_name && \r
3086                         (strcmp(sensor->sensor_io_request->gpio_res[i].dev_name, dev_name(icd->pdev)) == 0)) {\r
3087                         sensor->sensor_gpio_res = (struct rk29camera_gpio_res*)&sensor->sensor_io_request->gpio_res[i];\r
3088                     }\r
3089                 }\r
3090                 if (sensor->sensor_gpio_res == NULL) {\r
3091                     SENSOR_TR("%s %s obtain gpio resource failed when RK29_CAM_SUBDEV_IOREQUEST \n",SENSOR_NAME_STRING(),__FUNCTION__);\r
3092                     ret = -EINVAL;\r
3093                     goto sensor_ioctl_end;\r
3094                 }\r
3095             } else {\r
3096                 SENSOR_TR("%s %s RK29_CAM_SUBDEV_IOREQUEST fail\n",SENSOR_NAME_STRING(),__FUNCTION__);\r
3097                 ret = -EINVAL;\r
3098                 goto sensor_ioctl_end;\r
3099             }\r
3100             /* 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
3101                for this project */\r
3102             #if CONFIG_SENSOR_Flash     \r
3103                 if (sensor->sensor_gpio_res) {\r
3104                 if (sensor->sensor_gpio_res->gpio_flash == INVALID_GPIO) {\r
3105                     for (i = 0; i < icd->ops->num_controls; i++) {\r
3106                                 if (V4L2_CID_FLASH == icd->ops->controls[i].id) {\r
3107                                         //memset((char*)&icd->ops->controls[i],0x00,sizeof(struct v4l2_queryctrl));  \r
3108                               sensor_controls[i].id=0xffff;                             \r
3109                                 }\r
3110                     }\r
3111                     sensor->info_priv.flash = 0xff;\r
3112                     SENSOR_DG("%s flash gpio is invalidate!\n",SENSOR_NAME_STRING());\r
3113                 }else{ //two cameras are the same,need to deal diffrently ,zyc\r
3114                     for (i = 0; i < icd->ops->num_controls; i++) {\r
3115                            if(0xffff == icd->ops->controls[i].id){\r
3116                               sensor_controls[i].id=V4L2_CID_FLASH;\r
3117                            }               \r
3118                     }\r
3119                 }\r
3120                 }\r
3121             #endif\r
3122                         break;\r
3123                 }\r
3124                 default:\r
3125                 {\r
3126                         SENSOR_TR("%s %s cmd(0x%x) is unknown !\n",SENSOR_NAME_STRING(),__FUNCTION__,cmd);\r
3127                         break;\r
3128                 }\r
3129         }\r
3130 sensor_ioctl_end:\r
3131         return ret;\r
3132 \r
3133 }\r
3134 static int sensor_enum_fmt(struct v4l2_subdev *sd, unsigned int index,\r
3135                             enum v4l2_mbus_pixelcode *code)\r
3136 {\r
3137         if (index >= ARRAY_SIZE(sensor_colour_fmts))\r
3138                 return -EINVAL;\r
3139 \r
3140         *code = sensor_colour_fmts[index].code;\r
3141         return 0;\r
3142 }\r
3143 static struct v4l2_subdev_core_ops sensor_subdev_core_ops = {\r
3144         .init           = sensor_init,\r
3145         .g_ctrl         = sensor_g_control,\r
3146         .s_ctrl         = sensor_s_control,\r
3147         .g_ext_ctrls          = sensor_g_ext_controls,\r
3148         .s_ext_ctrls          = sensor_s_ext_controls,\r
3149         .g_chip_ident   = sensor_g_chip_ident,\r
3150         .ioctl = sensor_ioctl,\r
3151 };\r
3152 \r
3153 static struct v4l2_subdev_video_ops sensor_subdev_video_ops = {\r
3154         .s_mbus_fmt     = sensor_s_fmt,\r
3155         .g_mbus_fmt     = sensor_g_fmt,\r
3156         .try_mbus_fmt   = sensor_try_fmt,\r
3157         .enum_mbus_fmt  = sensor_enum_fmt,\r
3158 };\r
3159 \r
3160 static struct v4l2_subdev_ops sensor_subdev_ops = {\r
3161         .core   = &sensor_subdev_core_ops,\r
3162         .video = &sensor_subdev_video_ops,\r
3163 };\r
3164 \r
3165 static int sensor_probe(struct i2c_client *client,\r
3166                          const struct i2c_device_id *did)\r
3167 {\r
3168     struct sensor *sensor;\r
3169     struct soc_camera_device *icd = client->dev.platform_data;\r
3170     struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);\r
3171     struct soc_camera_link *icl;\r
3172     int ret;\r
3173 \r
3174     SENSOR_DG("\n%s..%s..%d..\n",__FUNCTION__,__FILE__,__LINE__);\r
3175     if (!icd) {\r
3176         dev_err(&client->dev, "%s: missing soc-camera data!\n",SENSOR_NAME_STRING());\r
3177         return -EINVAL;\r
3178     }\r
3179 \r
3180     icl = to_soc_camera_link(icd);\r
3181     if (!icl) {\r
3182         dev_err(&client->dev, "%s driver needs platform data\n", SENSOR_NAME_STRING());\r
3183         return -EINVAL;\r
3184     }\r
3185 \r
3186     if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) {\r
3187         dev_warn(&adapter->dev,\r
3188                  "I2C-Adapter doesn't support I2C_FUNC_I2C\n");\r
3189         return -EIO;\r
3190     }\r
3191 \r
3192     sensor = kzalloc(sizeof(struct sensor), GFP_KERNEL);\r
3193     if (!sensor)\r
3194         return -ENOMEM;\r
3195 \r
3196     v4l2_i2c_subdev_init(&sensor->subdev, client, &sensor_subdev_ops);\r
3197 \r
3198     /* Second stage probe - when a capture adapter is there */\r
3199     icd->ops            = &sensor_ops;\r
3200 \r
3201     sensor->info_priv.fmt = sensor_colour_fmts[0];\r
3202     \r
3203         #if CONFIG_SENSOR_I2C_NOSCHED\r
3204         atomic_set(&sensor->tasklock_cnt,0);\r
3205         #endif\r
3206 \r
3207     ret = sensor_video_probe(icd, client);\r
3208     if (ret < 0) {\r
3209         icd->ops = NULL;\r
3210         i2c_set_clientdata(client, NULL);\r
3211         kfree(sensor);\r
3212                 sensor = NULL;\r
3213     }\r
3214         hrtimer_init(&(flash_off_timer.timer), CLOCK_MONOTONIC, HRTIMER_MODE_REL);\r
3215     SENSOR_DG("\n%s..%s..%d  ret = %x \n",__FUNCTION__,__FILE__,__LINE__,ret);\r
3216     return ret;\r
3217 }\r
3218 \r
3219 static int sensor_remove(struct i2c_client *client)\r
3220 {\r
3221     struct sensor *sensor = to_sensor(client);\r
3222     struct soc_camera_device *icd = client->dev.platform_data;\r
3223 \r
3224     icd->ops = NULL;\r
3225     i2c_set_clientdata(client, NULL);\r
3226     client->driver = NULL;\r
3227     kfree(sensor);\r
3228 \r
3229     return 0;\r
3230 }\r
3231 \r
3232 static const struct i2c_device_id sensor_id[] = {\r
3233         {SENSOR_NAME_STRING(), 0 },\r
3234         { }\r
3235 };\r
3236 MODULE_DEVICE_TABLE(i2c, sensor_id);\r
3237 \r
3238 static struct i2c_driver sensor_i2c_driver = {\r
3239         .driver = {\r
3240                 .name = SENSOR_NAME_STRING(),\r
3241         },\r
3242         .probe          = sensor_probe,\r
3243         .remove         = sensor_remove,\r
3244         .id_table       = sensor_id,\r
3245 };\r
3246 \r
3247 static int __init sensor_mod_init(void)\r
3248 {\r
3249     SENSOR_DG("\n%s..%s.. \n",__FUNCTION__,SENSOR_NAME_STRING());\r
3250     return i2c_add_driver(&sensor_i2c_driver);\r
3251 }\r
3252 \r
3253 static void __exit sensor_mod_exit(void)\r
3254 {\r
3255     i2c_del_driver(&sensor_i2c_driver);\r
3256 }\r
3257 \r
3258 device_initcall_sync(sensor_mod_init);\r
3259 module_exit(sensor_mod_exit);\r
3260 \r
3261 MODULE_DESCRIPTION(SENSOR_NAME_STRING(Camera sensor driver));\r
3262 MODULE_AUTHOR("ddl <kernel@rock-chips>");\r
3263 MODULE_LICENSE("GPL");\r
3264 \r
3265 \r
3266 \r
3267 \r