camera driver v0.2.1 for RK30
[firefly-linux-kernel-4.4.55.git] / drivers / media / video / ov2640_rk.c
1 #include <linux/videodev2.h>\r
2 #include <linux/slab.h>\r
3 #include <linux/i2c.h>\r
4 #include <linux/log2.h>\r
5 #include <linux/platform_device.h>\r
6 #include <linux/delay.h>\r
7 #include <linux/circ_buf.h>\r
8 #include <linux/miscdevice.h>\r
9 #include <media/v4l2-common.h>\r
10 #include <media/v4l2-chip-ident.h>\r
11 #include <media/soc_camera.h>\r
12 #include <mach/rk_camera.h>\r
13 \r
14 static int debug;\r
15 module_param(debug, int, S_IRUGO|S_IWUSR);\r
16 \r
17 #define dprintk(level, fmt, arg...) do {                        \\r
18         if (debug >= level)                                     \\r
19         printk(KERN_WARNING fmt , ## arg); } while (0)\r
20 \r
21 #define SENSOR_TR(format, ...) printk(KERN_ERR format, ## __VA_ARGS__)\r
22 #define SENSOR_DG(format, ...) dprintk(1, format, ## __VA_ARGS__)\r
23 \r
24 \r
25 #define _CONS(a,b) a##b\r
26 #define CONS(a,b) _CONS(a,b)\r
27 \r
28 #define __STR(x) #x\r
29 #define _STR(x) __STR(x)\r
30 #define STR(x) _STR(x)\r
31 \r
32 #define MIN(x,y)   ((x<y) ? x: y)\r
33 #define MAX(x,y)    ((x>y) ? x: y)\r
34 \r
35 /* Sensor Driver Configuration */\r
36 #define SENSOR_NAME RK_CAM_SENSOR_OV2640\r
37 #define SENSOR_V4L2_IDENT V4L2_IDENT_OV2640\r
38 #define SENSOR_ID 0x2642\r
39 #define SENSOR_ID1 0x2641\r
40 #define SENSOR_MIN_WIDTH    640\r
41 #define SENSOR_MIN_HEIGHT   480\r
42 #define SENSOR_MAX_WIDTH    1600\r
43 #define SENSOR_MAX_HEIGHT   1200\r
44 #define SENSOR_INIT_WIDTH       640                     /* Sensor pixel size for sensor_init_data array */\r
45 #define SENSOR_INIT_HEIGHT  480\r
46 #define SENSOR_INIT_WINSEQADR sensor_vga\r
47 #define SENSOR_INIT_PIXFMT V4L2_MBUS_FMT_YUYV8_2X8\r
48 \r
49 #define CONFIG_SENSOR_WhiteBalance      0\r
50 #define CONFIG_SENSOR_Brightness        1\r
51 #define CONFIG_SENSOR_Contrast      0\r
52 #define CONFIG_SENSOR_Saturation    1\r
53 #define CONFIG_SENSOR_Effect        1\r
54 #define CONFIG_SENSOR_Scene         0\r
55 #define CONFIG_SENSOR_DigitalZoom   0\r
56 #define CONFIG_SENSOR_Focus         0\r
57 #define CONFIG_SENSOR_Exposure      0\r
58 #define CONFIG_SENSOR_Flash         0\r
59 #define CONFIG_SENSOR_Mirror        0\r
60 #define CONFIG_SENSOR_Flip          0\r
61 \r
62 #define CONFIG_SENSOR_I2C_SPEED     250000       /* Hz */\r
63 /* Sensor write register continues by preempt_disable/preempt_enable for current process not be scheduled */\r
64 #define CONFIG_SENSOR_I2C_NOSCHED   0\r
65 #define CONFIG_SENSOR_I2C_RDWRCHK   0\r
66 \r
67 #define SENSOR_BUS_PARAM  (SOCAM_MASTER | SOCAM_PCLK_SAMPLE_RISING |\\r
68                           SOCAM_HSYNC_ACTIVE_HIGH | SOCAM_VSYNC_ACTIVE_LOW |\\r
69                           SOCAM_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8  |SOCAM_MCLK_24MHZ)\r
70 \r
71 #define COLOR_TEMPERATURE_CLOUDY_DN  6500\r
72 #define COLOR_TEMPERATURE_CLOUDY_UP    8000\r
73 #define COLOR_TEMPERATURE_CLEARDAY_DN  5000\r
74 #define COLOR_TEMPERATURE_CLEARDAY_UP    6500\r
75 #define COLOR_TEMPERATURE_OFFICE_DN     3500\r
76 #define COLOR_TEMPERATURE_OFFICE_UP     5000\r
77 #define COLOR_TEMPERATURE_HOME_DN       2500\r
78 #define COLOR_TEMPERATURE_HOME_UP       3500\r
79 \r
80 #define SENSOR_NAME_STRING(a) STR(CONS(SENSOR_NAME, a))\r
81 #define SENSOR_NAME_VARFUN(a) CONS(SENSOR_NAME, a)\r
82 \r
83 struct reginfo\r
84 {\r
85     u8 reg;\r
86     u8 val;\r
87 };\r
88 \r
89 /* init 800*600 SVGA */\r
90 static struct reginfo sensor_init_data[] =\r
91 {\r
92 #if 1\r
93     {0xff,0x01},\r
94     {0x12,0x80},\r
95     {0xff,0x00},\r
96     {0x2c,0xff},\r
97     {0x2e,0xdf},\r
98     {0xff,0x01},\r
99 \r
100     {0x03,0x4f},\r
101     {0x0f,0x4b},\r
102 \r
103 \r
104     {0x3c,0x32},\r
105     {0x11,0x00},\r
106     {0x09,0x02},\r
107     {0x04,0xF8},//b7,b6 directs\r
108     {0x13,0xe5},\r
109     {0x14,0x48},\r
110     {0x2c,0x0c},\r
111     {0x33,0x78},\r
112     {0x3a,0x33},\r
113     {0x3b,0xfB},\r
114     {0x3e,0x00},\r
115     {0x43,0x11},\r
116     {0x16,0x10},\r
117     {0x39,0x02},\r
118     {0x35,0x88},\r
119     {0x22,0x09},\r
120     {0x37,0x40},\r
121     {0x23,0x00},\r
122     {0x34,0xa0},\r
123     {0x36,0x1a},\r
124     {0x06,0x02},\r
125     {0x07,0xc0},\r
126     {0x0d,0xb7},\r
127     {0x0e,0x01},\r
128     {0x4c,0x00},\r
129     {0x4a,0x81},\r
130     {0x21,0x99},\r
131     \r
132     //{0x24,0x58},\r
133     //{0x25,0x50},\r
134     //{0x26,0x92},\r
135     \r
136     {0x24, 0x70},\r
137     {0x25, 0x60},\r
138     {0x26, 0xa4},    \r
139     \r
140     {0x5c,0x00},\r
141     {0x63,0x00},\r
142     {0x46,0x3f},\r
143     {0x0c,0x3c},\r
144     {0x61,0x70},\r
145     {0x62,0x80},\r
146     {0x7c,0x05},\r
147     {0x20,0x80},\r
148     {0x28,0x30},\r
149     {0x6c,0x00},\r
150     {0x6d,0x80},\r
151     {0x6e,0x00},\r
152     {0x70,0x02},\r
153     {0x71,0x94},\r
154     {0x73,0xc1},\r
155     {0x3d,0x34},\r
156     {0x5a,0x57},\r
157     {0x4f,0xbb},\r
158     {0x50,0x9c},\r
159     {0xff,0x00},\r
160     {0xe5,0x7f},\r
161     {0xf9,0xc0},\r
162     {0x41,0x24},\r
163     {0xe0,0x14},\r
164     {0x76,0xff},\r
165     {0x33,0xa0},\r
166     {0x42,0x20},\r
167     {0x43,0x18},\r
168     {0x4c,0x00},\r
169     {0x87,0xd0},\r
170     {0x88,0x3f},\r
171     {0xd7,0x03},\r
172     {0xd9,0x10},\r
173     {0xd3,0x82},\r
174     {0xc8,0x08},\r
175     {0xc9,0x80},\r
176     {0x7c,0x00},\r
177     {0x7d,0x00},//0x00//0x07\r
178     {0x7c,0x03},\r
179     {0x7d,0x48},//0x48//0x40\r
180     {0x7d,0x48},//0x48//0x40\r
181     {0x7c,0x08},\r
182     {0x7d,0x20},\r
183     {0x7d,0x10},//0x10\r
184     {0x7d,0x0e},//0x0e\r
185 \r
186     {0x92,0x00},\r
187     {0x93,0x06},\r
188     {0x93,0xc8},//e3\r
189     {0x93,0x05},\r
190     {0x93,0x05},\r
191     {0x93,0x00},\r
192     {0x93,0x04},\r
193     {0x93,0x00},\r
194     {0x93,0x00},\r
195     {0x93,0x00},\r
196     {0x93,0x00},\r
197     {0x93,0x00},\r
198     {0x93,0x00},\r
199     {0x93,0x00},\r
200     {0x96,0x00},\r
201     {0x97,0x08},\r
202     {0x97,0x19},\r
203     {0x97,0x02},\r
204     {0x97,0x0c},\r
205     {0x97,0x24},\r
206     {0x97,0x30},\r
207     {0x97,0x28},\r
208     {0x97,0x26},\r
209     {0x97,0x02},\r
210     {0x97,0x98},\r
211     {0x97,0x80},\r
212     {0x97,0x00},\r
213     {0x97,0x00},\r
214     {0xc3,0xef},//ed\r
215     {0xa4,0x00},\r
216     {0xa8,0x00},\r
217 \r
218     {0xbf, 0x00},\r
219     {0xba, 0xdc},\r
220     {0xbb, 0x08},\r
221     {0xb6, 0x20},\r
222     {0xb8, 0x30},\r
223     {0xb7, 0x20},\r
224     {0xb9, 0x30},\r
225     {0xb3, 0xb4},\r
226     {0xb4, 0xca},\r
227     {0xb5, 0x34},\r
228     {0xb0, 0x46},\r
229     {0xb1, 0x46},\r
230     {0xb2, 0x06},\r
231     {0xc7, 0x00},\r
232     {0xc6, 0x51},\r
233     {0xc5, 0x11},\r
234     {0xc4, 0x9c},\r
235 ////\r
236     {0xc0,0xc8},\r
237     {0xc1,0x96},\r
238     {0x86,0x3d},\r
239     {0x50,0x92},\r
240     {0x51,0x90},\r
241     {0x52,0x2c},\r
242     {0x53,0x00},\r
243     {0x54,0x00},\r
244     {0x55,0x88},\r
245     {0x57,0x00},\r
246     {0x5a,0x50},\r
247     {0x5b,0x3c},\r
248     {0x5c,0x00},\r
249     {0xc3,0xed},\r
250     {0x7f,0x00},\r
251     {0xda,0x01},\r
252     {0xe5,0x1f},\r
253     {0xe1,0x67},\r
254     {0xe0,0x00},\r
255     {0xdd,0xff},\r
256     {0x05,0x00},\r
257 \r
258 #endif\r
259 #if 1\r
260     {0xff, 0x01},\r
261     {0x5d, 0x00},\r
262     {0x5e, 0x3c},\r
263     {0x5f, 0x28},\r
264     {0x60, 0x55},\r
265 \r
266 \r
267     {0xff, 0x00},\r
268     {0xc3, 0xef},\r
269     {0xa6, 0x00},\r
270     {0xa7, 0x0f},\r
271     {0xa7, 0x4e},\r
272     {0xa7, 0x7a},\r
273     {0xa7, 0x33},\r
274     {0xa7, 0x00},\r
275     {0xa7, 0x23},\r
276     {0xa7, 0x27},\r
277     {0xa7, 0x3a},\r
278     {0xa7, 0x70},\r
279     {0xa7, 0x33},\r
280     {0xa7, 0x00},//L\r
281     {0xa7, 0x23},\r
282     {0xa7, 0x20},\r
283     {0xa7, 0x0c},\r
284     {0xa7, 0x66},\r
285     {0xa7, 0x33},\r
286     {0xa7, 0x00},\r
287     {0xa7, 0x23},\r
288     {0xc3, 0xef},\r
289 #endif\r
290 \r
291 \r
292 #if 1\r
293     {0xff,0x00},\r
294     {0x92,0x00},\r
295     {0x93,0x06},\r
296     {0x93,0xc1},//e\r
297     {0x93,0x02},\r
298     {0x93,0x02},\r
299     {0x93,0x00},\r
300     {0x93,0x04},\r
301 #endif\r
302 \r
303     {0x03, 0x0f},\r
304     {0xe0, 0x04},\r
305     {0xc0, 0xc8},\r
306     {0xc1, 0x96},\r
307     {0x86, 0x3d},\r
308     {0x50, 0x89},\r
309     {0x51, 0x90},\r
310     {0x52, 0x2c},\r
311     {0x53, 0x00},\r
312     {0x54, 0x00},\r
313     {0x55, 0x88},\r
314     {0x57, 0x00},\r
315     {0x5a, 0xa0},\r
316     {0x5b, 0x78},\r
317     {0x5c, 0x00},\r
318     {0xd3, 0x04},\r
319     {0xe0, 0x00},\r
320 \r
321   {0x0, 0x0}   //end flag\r
322 \r
323 };\r
324 \r
325 /* 1600X1200 UXGA */\r
326 static struct reginfo sensor_uxga[] =\r
327 {\r
328     {0xff, 0x00},\r
329     {0xe0, 0x04},\r
330     {0xc0, 0xc8},\r
331     {0xc1, 0x96},\r
332     {0x86, 0x3d},\r
333     {0x50, 0x00},\r
334     {0x51, 0x90},\r
335     {0x52, 0x2c},\r
336     {0x53, 0x00},\r
337     {0x54, 0x00},\r
338     {0x55, 0x88},\r
339     {0x57, 0x00},\r
340     {0x5a, 0x90},\r
341     {0x5b, 0x2c},\r
342     {0x5c, 0x05},\r
343     {0xd3, 0x82},\r
344     {0xe0, 0x00},\r
345   {0x0, 0x0}   //end flag\r
346 };\r
347 \r
348 /* 1280X1024 SXGA */\r
349 static struct reginfo sensor_sxga[] =\r
350 {\r
351     {0xff, 0x00},\r
352     {0xe0, 0x04},\r
353     {0xc0, 0xc8},\r
354     {0xc1, 0x96},\r
355     {0x86, 0x3d},\r
356     {0x50, 0x00},\r
357     {0x51, 0x90},\r
358     {0x52, 0x2c},\r
359     {0x53, 0x00},\r
360     {0x54, 0x00},\r
361     {0x55, 0x88},\r
362     {0x57, 0x00},\r
363     {0x5a, 0x40},\r
364     {0x5b, 0x00},\r
365     {0x5c, 0x05},\r
366     {0xd3, 0x82},\r
367     {0xe0, 0x00},\r
368   {0x0, 0x0}   //end flag\r
369 };\r
370 \r
371 \r
372 static struct reginfo sensor_xga[] =\r
373 {\r
374     {0xff, 0x00},\r
375     {0xe0, 0x04},\r
376     {0xc0, 0xc8},\r
377     {0xc1, 0x96},\r
378     {0x86, 0x3d},\r
379     {0x50, 0x00},\r
380     {0x51, 0x90},\r
381     {0x52, 0x2c},\r
382     {0x53, 0x00},\r
383     {0x54, 0x00},\r
384     {0x55, 0x88},\r
385     {0x57, 0x00},\r
386     {0x5a, 0x40},\r
387     {0x5b, 0x00},\r
388     {0x5c, 0x05},\r
389     {0xd3, 0x82},\r
390     {0xe0, 0x00},\r
391   {0x0, 0x0}   //end flag\r
392 \r
393 \r
394 };\r
395 \r
396 \r
397 /* 800X600 SVGA*/\r
398 static struct reginfo sensor_svga[] =\r
399 {\r
400   {0x0, 0x0}   //end flag\r
401 };\r
402 \r
403 /* 640X480 VGA */\r
404 static struct reginfo sensor_vga[] =\r
405 {\r
406    {0x0, 0x0}   //end flag\r
407  };\r
408 \r
409 /* 352X288 CIF */\r
410 static struct reginfo sensor_cif[] =\r
411 {\r
412   {0x0, 0x0}   //end flag\r
413 };\r
414 \r
415 /* 320*240 QVGA */\r
416 static  struct reginfo sensor_qvga[] =\r
417 {\r
418   {0x0, 0x0}   //end flag\r
419 };\r
420 \r
421 /* 176X144 QCIF*/\r
422 static struct reginfo sensor_qcif[] =\r
423 {\r
424   {0x0, 0x0}   //end flag\r
425 };\r
426 #if 0\r
427 /* 160X120 QQVGA*/\r
428 static struct reginfo ov2655_qqvga[] =\r
429 {\r
430 \r
431     {0x300E, 0x34},\r
432     {0x3011, 0x01},\r
433     {0x3012, 0x10},\r
434     {0x302a, 0x02},\r
435     {0x302b, 0xE6},\r
436     {0x306f, 0x14},\r
437     {0x3362, 0x90},\r
438 \r
439     {0x3070, 0x5d},\r
440     {0x3072, 0x5d},\r
441     {0x301c, 0x07},\r
442     {0x301d, 0x07},\r
443 \r
444     {0x3020, 0x01},\r
445     {0x3021, 0x18},\r
446     {0x3022, 0x00},\r
447     {0x3023, 0x06},\r
448     {0x3024, 0x06},\r
449     {0x3025, 0x58},\r
450     {0x3026, 0x02},\r
451     {0x3027, 0x61},\r
452     {0x3088, 0x00},\r
453     {0x3089, 0xa0},\r
454     {0x308a, 0x00},\r
455     {0x308b, 0x78},\r
456     {0x3316, 0x64},\r
457     {0x3317, 0x25},\r
458     {0x3318, 0x80},\r
459     {0x3319, 0x08},\r
460     {0x331a, 0x0a},\r
461     {0x331b, 0x07},\r
462     {0x331c, 0x80},\r
463     {0x331d, 0x38},\r
464     {0x3100, 0x00},\r
465     {0x3302, 0x11},\r
466 \r
467     {0x0, 0x0},\r
468 };\r
469 \r
470 \r
471 \r
472 static  struct reginfo ov2655_Sharpness_auto[] =\r
473 {\r
474     {0x3306, 0x00},\r
475 };\r
476 \r
477 static  struct reginfo ov2655_Sharpness1[] =\r
478 {\r
479     {0x3306, 0x08},\r
480     {0x3371, 0x00},\r
481 };\r
482 \r
483 static  struct reginfo ov2655_Sharpness2[][3] =\r
484 {\r
485     //Sharpness 2\r
486     {0x3306, 0x08},\r
487     {0x3371, 0x01},\r
488 };\r
489 \r
490 static  struct reginfo ov2655_Sharpness3[] =\r
491 {\r
492     //default\r
493     {0x3306, 0x08},\r
494     {0x332d, 0x02},\r
495 };\r
496 static  struct reginfo ov2655_Sharpness4[]=\r
497 {\r
498     //Sharpness 4\r
499     {0x3306, 0x08},\r
500     {0x332d, 0x03},\r
501 };\r
502 \r
503 static  struct reginfo ov2655_Sharpness5[] =\r
504 {\r
505     //Sharpness 5\r
506     {0x3306, 0x08},\r
507     {0x332d, 0x04},\r
508 };\r
509 #endif\r
510 \r
511 static  struct reginfo sensor_ClrFmt_YUYV[]=\r
512 {\r
513     //{0x4300, 0x30},\r
514     {0x00, 0x00}\r
515 };\r
516 \r
517 static  struct reginfo sensor_ClrFmt_UYVY[]=\r
518 {\r
519     //{0x4300, 0x32},\r
520     {0x00, 0x00}\r
521 };\r
522 \r
523 #if CONFIG_SENSOR_WhiteBalance\r
524 static  struct reginfo sensor_WhiteB_Auto[]=\r
525 {\r
526     {0x3406, 0x00},  //AWB auto, bit[1]:0,auto\r
527     {0x0000, 0x00}\r
528 };\r
529 /* Cloudy Colour Temperature : 6500K - 8000K  */\r
530 static  struct reginfo sensor_WhiteB_Cloudy[]=\r
531 {\r
532     {0x3406, 0x01},\r
533     {0x3400, 0x07},\r
534     {0x3401, 0x08},\r
535     {0x3402, 0x04},\r
536     {0x3403, 0x00},\r
537     {0x3404, 0x05},\r
538     {0x3405, 0x00},\r
539     {0x0000, 0x00}\r
540 };\r
541 /* ClearDay Colour Temperature : 5000K - 6500K  */\r
542 static  struct reginfo sensor_WhiteB_ClearDay[]=\r
543 {\r
544     //Sunny\r
545     {0x3406, 0x01},\r
546     {0x3400, 0x07},\r
547     {0x3401, 0x02},\r
548     {0x3402, 0x04},\r
549     {0x3403, 0x00},\r
550     {0x3404, 0x05},\r
551     {0x3405, 0x15},\r
552     {0x0000, 0x00}\r
553 };\r
554 /* Office Colour Temperature : 3500K - 5000K  */\r
555 static  struct reginfo sensor_WhiteB_TungstenLamp1[]=\r
556 {\r
557     //Office\r
558     {0x3406, 0x01},\r
559     {0x3400, 0x06},\r
560     {0x3401, 0x2a},\r
561     {0x3402, 0x04},\r
562     {0x3403, 0x00},\r
563     {0x3404, 0x07},\r
564     {0x3405, 0x24},\r
565     {0x0000, 0x00}\r
566 \r
567 };\r
568 /* Home Colour Temperature : 2500K - 3500K  */\r
569 static  struct reginfo sensor_WhiteB_TungstenLamp2[]=\r
570 {\r
571     //Home\r
572     {0x3406, 0x01},\r
573     {0x3400, 0x04},\r
574     {0x3401, 0x58},\r
575     {0x3402, 0x04},\r
576     {0x3403, 0x00},\r
577     {0x3404, 0x07},\r
578     {0x3405, 0x24},\r
579     {0x0000, 0x00}\r
580 };\r
581 static struct reginfo *sensor_WhiteBalanceSeqe[] = {sensor_WhiteB_Auto, sensor_WhiteB_TungstenLamp1,sensor_WhiteB_TungstenLamp2,\r
582     sensor_WhiteB_ClearDay, sensor_WhiteB_Cloudy,NULL,\r
583 };\r
584 #endif\r
585 \r
586 #if CONFIG_SENSOR_Brightness\r
587 static  struct reginfo sensor_Brightness0[]=\r
588 {\r
589     // Brightness -2\r
590     {0xff, 0x01},\r
591     {0x24, 0x34},\r
592     {0x25, 0x22},\r
593     {0x26, 0x70},\r
594   {0x0, 0x0}   //end flag\r
595 };\r
596 \r
597 static  struct reginfo sensor_Brightness1[]=\r
598 {\r
599     // Brightness -1\r
600 \r
601     {0xff, 0x01},\r
602     {0x24, 0x58},\r
603     {0x25, 0x50},\r
604     {0x26, 0x92},\r
605   {0x0, 0x0}   //end flag\r
606 };\r
607 \r
608 static  struct reginfo sensor_Brightness2[]=\r
609 {\r
610     //  Brightness 0\r
611 \r
612         {0xff, 0x01},\r
613         {0x24, 0xa8},\r
614         {0x25, 0x90},\r
615         {0x26, 0xd6},\r
616   {0x0, 0x0}   //end flag\r
617 };\r
618 \r
619 static  struct reginfo sensor_Brightness3[]=\r
620 {\r
621     // Brightness +1\r
622 \r
623     {0xff, 0x01},\r
624     {0x24, 0x48},\r
625     {0x25, 0x40},\r
626     {0x26, 0x81},\r
627   {0x0, 0x0}   //end flag\r
628 };\r
629 \r
630 static  struct reginfo sensor_Brightness4[]=\r
631 {\r
632     //  Brightness +2\r
633 \r
634     {0xff, 0x01},\r
635     {0x24, 0x58},\r
636     {0x25, 0x50},\r
637     {0x26, 0x92},\r
638   {0x0, 0x0}   //end flag\r
639 };\r
640 \r
641 static  struct reginfo sensor_Brightness5[]=\r
642 {\r
643     //  Brightness +3\r
644     {0xff, 0x01},\r
645     {0x24, 0x70},\r
646     {0x25, 0x60},\r
647     {0x26, 0xa4},\r
648   {0x0, 0x0}   //end flag\r
649 };\r
650 static struct reginfo *sensor_BrightnessSeqe[] = {sensor_Brightness0, sensor_Brightness1, sensor_Brightness2, sensor_Brightness3,\r
651     sensor_Brightness4, sensor_Brightness5,NULL,\r
652 };\r
653 \r
654 #endif\r
655 \r
656 #if CONFIG_SENSOR_Effect\r
657 static  struct reginfo sensor_Effect_Normal[] =\r
658 {\r
659         {0xff,0x00},\r
660         {0x7c,0x00},\r
661         {0x7d,0x00},\r
662         {0x7c,0x05},\r
663         {0x7d,0x80},\r
664         {0x7d,0x80},\r
665   {0x0, 0x0}   //end flag\r
666 };\r
667 \r
668 static  struct reginfo sensor_Effect_WandB[] =\r
669 {\r
670     {0xff,0x00},\r
671     {0x7c,0x00},\r
672     {0x7d,0x18},\r
673     {0x7c,0x05},\r
674     {0x7d,0x80},\r
675     {0x7d,0x80},\r
676   {0x0, 0x0}   //end flag\r
677 };\r
678 \r
679 static  struct reginfo sensor_Effect_Sepia[] =\r
680 {\r
681     {0xff,0x00},\r
682     {0x7c,0x00},\r
683     {0x7d,0x18},\r
684     {0x7c,0x05},\r
685     {0x7d,0x40},\r
686     {0x7d,0xc0},\r
687   {0x0, 0x0}   //end flag\r
688 };\r
689 \r
690 static  struct reginfo sensor_Effect_Negative[] =\r
691 {\r
692     {0xff,0x00},\r
693     {0x7c,0x00},\r
694     {0x7d,0x40},\r
695     {0x7c,0x05},\r
696     {0x7d,0x80},\r
697     {0x7d,0x80},\r
698   {0x0, 0x0}   //end flag\r
699 };\r
700 static  struct reginfo sensor_Effect_Bluish[] =\r
701 {\r
702     {0Xff, 0X00},\r
703     {0X7c, 0X00},\r
704     {0X7d, 0X18},\r
705     {0X7c, 0X05},\r
706     {0X7d, 0Xa0},\r
707     {0X7d, 0X40},\r
708   {0x0, 0x0}   //end flag\r
709 };\r
710 \r
711 static  struct reginfo sensor_Effect_Green[] =\r
712 {\r
713     {0Xff, 0X00},\r
714     {0X7c, 0X00},\r
715     {0X7d, 0X18},\r
716     {0X7c, 0X05},\r
717     {0X7d, 0X40},\r
718     {0X7d, 0X40},\r
719   {0x0, 0x0}   //end flag\r
720 };\r
721 \r
722 static  struct reginfo sensor_Effect_Exp_Windows_Half[] =\r
723 {\r
724         {0xff, 0x01},\r
725         {0x5d, 0x00},\r
726         {0x5e, 0x3c},\r
727         {0x5f, 0x28},\r
728         {0x60, 0x55},\r
729   {0x0, 0x0}   //end flag\r
730 };\r
731 static struct reginfo *sensor_EffectSeqe[] = {sensor_Effect_Normal, sensor_Effect_WandB, sensor_Effect_Negative,sensor_Effect_Sepia,\r
732     sensor_Effect_Bluish, sensor_Effect_Green,NULL,\r
733 };\r
734 #endif\r
735 #if CONFIG_SENSOR_Exposure\r
736 static  struct reginfo sensor_Exposure0[]=\r
737 {\r
738         {0x0000, 0x00}\r
739 };\r
740 \r
741 static  struct reginfo sensor_Exposure1[]=\r
742 {\r
743     {0x0000, 0x00}\r
744 };\r
745 \r
746 static  struct reginfo sensor_Exposure2[]=\r
747 {\r
748     {0x0000, 0x00}\r
749 };\r
750 \r
751 static  struct reginfo sensor_Exposure3[]=\r
752 {\r
753     {0x0000, 0x00}\r
754 };\r
755 \r
756 static  struct reginfo sensor_Exposure4[]=\r
757 {\r
758     {0x0000, 0x00}\r
759 };\r
760 \r
761 static  struct reginfo sensor_Exposure5[]=\r
762 {\r
763     {0x0000, 0x00}\r
764 };\r
765 \r
766 static  struct reginfo sensor_Exposure6[]=\r
767 {\r
768     {0x0000, 0x00}\r
769 };\r
770 \r
771 static struct reginfo *sensor_ExposureSeqe[] = {sensor_Exposure0, sensor_Exposure1, sensor_Exposure2, sensor_Exposure3,\r
772     sensor_Exposure4, sensor_Exposure5,sensor_Exposure6,NULL,\r
773 };\r
774 #endif\r
775 #if CONFIG_SENSOR_Saturation\r
776 static  struct reginfo sensor_Saturation0[]=\r
777 {\r
778         {0xff, 0x00},\r
779         {0x90, 0x00},\r
780         {0x91, 0x0e},\r
781         {0x91, 0x1a},\r
782         {0x91, 0x31},\r
783         {0x91, 0x5a},\r
784         {0x91, 0x69},\r
785         {0x91, 0x75},\r
786         {0x91, 0x7e},\r
787         {0x91, 0x88},\r
788         {0x91, 0x8f},\r
789         {0x91, 0x96},\r
790         {0x91, 0xa3},\r
791         {0x91, 0xaf},\r
792         {0x91, 0xc4},\r
793         {0x91, 0xd7},\r
794         {0x91, 0xe8},\r
795         {0x91, 0x20},\r
796   {0x0, 0x0}   //end flag\r
797 };\r
798 \r
799 static  struct reginfo sensor_Saturation1[]=\r
800 {\r
801     {0xff, 0x00},\r
802     {0x90, 0x00},\r
803     {0x91, 0x03},\r
804     {0x91, 0x0a},\r
805     {0x91, 0x1a},\r
806     {0x91, 0x3f},\r
807     {0x91, 0x4e},\r
808     {0x91, 0x5b},\r
809     {0x91, 0x68},\r
810     {0x91, 0x75},\r
811     {0x91, 0x7f},\r
812     {0x91, 0x89},\r
813     {0x91, 0x9a},\r
814     {0x91, 0xa6},\r
815     {0x91, 0xbd},\r
816     {0x91, 0xd3},\r
817     {0x91, 0xe5},\r
818     {0x91, 0x24},\r
819   {0x0, 0x0}   //end flag\r
820 };\r
821 \r
822 static  struct reginfo sensor_Saturation2[]=\r
823 {\r
824     {0xff, 0x00},\r
825     {0x90, 0x00},\r
826     {0x91, 0x04},\r
827     {0x91, 0x07},\r
828     {0x91, 0x10},\r
829     {0x91, 0x28},\r
830     {0x91, 0x36},\r
831     {0x91, 0x44},\r
832     {0x91, 0x52},\r
833     {0x91, 0x60},\r
834     {0x91, 0x6c},\r
835     {0x91, 0x78},\r
836     {0x91, 0x8c},\r
837     {0x91, 0x9e},\r
838     {0x91, 0xbb},\r
839     {0x91, 0xd3},\r
840     {0x91, 0xe5},\r
841     {0x91, 0x24},\r
842   {0x0, 0x0}   //end flag       \r
843 };\r
844 static struct reginfo *sensor_SaturationSeqe[] = {sensor_Saturation0, sensor_Saturation1, sensor_Saturation2, NULL,};\r
845 \r
846 \r
847 #endif\r
848 #if CONFIG_SENSOR_Contrast\r
849 static  struct reginfo sensor_Contrast0[]=\r
850 {\r
851     {0xff, 0x00},\r
852     {0x7c, 0x00},\r
853     {0x7d, 0x04},\r
854     {0x7c, 0x07},\r
855     {0x7d, 0x20},\r
856     {0x7d, 0x10},\r
857     {0x7d, 0x4a},\r
858     {0x7d, 0x06},\r
859   {0x0, 0x0}   //end flag\r
860 \r
861 };\r
862 \r
863 static  struct reginfo sensor_Contrast1[]=\r
864 {\r
865     {0xff, 0x00},\r
866     {0x7c, 0x00},\r
867     {0x7d, 0x04},\r
868     {0x7c, 0x07},\r
869     {0x7d, 0x20},\r
870     {0x7d, 0x14},\r
871     {0x7d, 0x40},\r
872     {0x7d, 0x06},\r
873   {0x0, 0x0}   //end flag\r
874 };\r
875 \r
876 static  struct reginfo sensor_Contrast2[]=\r
877 {\r
878     {0xff, 0x00},\r
879     {0x7c, 0x00},\r
880     {0x7d, 0x04},\r
881     {0x7c, 0x07},\r
882     {0x7d, 0x20},\r
883     {0x7d, 0x18},\r
884     {0x7d, 0x34},\r
885     {0x7d, 0x06},\r
886   {0x0, 0x0}   //end flag\r
887 };\r
888 \r
889 static  struct reginfo sensor_Contrast3[]=\r
890 {\r
891     {0xff, 0x00},\r
892     {0x7c, 0x00},\r
893     {0x7d, 0x04},\r
894     {0x7c, 0x07},\r
895     {0x7d, 0x20},\r
896     {0x7d, 0x1c},\r
897     {0x7d, 0x2a},\r
898     {0x7d, 0x06},\r
899   {0x0, 0x0}   //end flag\r
900 };\r
901 \r
902 static  struct reginfo sensor_Contrast4[]=\r
903 {\r
904     {0xff,0x00},\r
905     {0x7c,0x00},\r
906     {0x7d,0x04},\r
907     {0x7c,0x07},\r
908     {0x7d,0x20},\r
909     {0x7d,0x24},\r
910     {0x7d,0x16},\r
911     {0x7d,0x06},\r
912   {0x0, 0x0}   //end flag\r
913 };\r
914 \r
915 \r
916 static  struct reginfo sensor_Contrast5[]=\r
917 {\r
918     {0xff, 0x00},\r
919     {0x7c, 0x00},\r
920     {0x7d, 0x04},\r
921     {0x7c, 0x07},\r
922     {0x7d, 0x20},\r
923     {0x7d, 0x20},\r
924     {0x7d, 0x20},\r
925     {0x7d, 0x06},\r
926   {0x0, 0x0}   //end flag\r
927 };\r
928 \r
929 static  struct reginfo sensor_Contrast6[]=\r
930 {\r
931     {0xff, 0x00},\r
932     {0x7c, 0x00},\r
933     {0x7d, 0x04},\r
934     {0x7c, 0x07},\r
935     {0x7d, 0x20},\r
936     {0x7d, 0x24},\r
937     {0x7d, 0x16},\r
938     {0x7d, 0x06},\r
939   {0x0, 0x0}   //end flag\r
940 };\r
941 \r
942 \r
943 static  struct reginfo sensor_Contrast7[]=\r
944 {\r
945     {0xff, 0x00},\r
946     {0x7c, 0x00},\r
947     {0x7d, 0x04},\r
948     {0x7c, 0x07},\r
949     {0x7d, 0x20},\r
950     {0x7d, 0x28},\r
951     {0x7d, 0x0c},\r
952     {0x7d, 0x06},\r
953   {0x0, 0x0}   //end flag\r
954 };\r
955 \r
956 static  struct reginfo sensor_Contrast8[]=\r
957 {\r
958     {0xff, 0x00},\r
959     {0x7c, 0x00},\r
960     {0x7d, 0x04},\r
961     {0x7c, 0x07},\r
962     {0x7d, 0x20},\r
963     {0x7d, 0x2c},\r
964     {0x7d, 0x02},\r
965     {0x7d, 0x06},\r
966   {0x0, 0x0}   //end flag\r
967 };\r
968 \r
969 static  struct reginfo sensor_Contrast9[]=\r
970 {\r
971     {0xff, 0x00},\r
972     {0x7c, 0x00},\r
973     {0x7d, 0x04},\r
974     {0x7c, 0x07},\r
975     {0x7d, 0x20},\r
976     {0x7d, 0x30},\r
977     {0x7d, 0x08},\r
978     {0x7d, 0x0e},\r
979   {0x0, 0x0}   //end flag\r
980 };\r
981 \r
982 \r
983 \r
984 static struct reginfo *sensor_ContrastSeqe[] = {sensor_Contrast0, sensor_Contrast1, sensor_Contrast2, sensor_Contrast3,\r
985     sensor_Contrast4, sensor_Contrast5, sensor_Contrast6, NULL,\r
986 };\r
987 \r
988 #endif\r
989 #if CONFIG_SENSOR_Mirror\r
990 static  struct reginfo sensor_MirrorOn[]=\r
991 {\r
992     {0x0000, 0x00}\r
993 };\r
994 \r
995 static  struct reginfo sensor_MirrorOff[]=\r
996 {\r
997     {0x0000, 0x00}\r
998 };\r
999 static struct reginfo *sensor_MirrorSeqe[] = {sensor_MirrorOff, sensor_MirrorOn,NULL,};\r
1000 #endif\r
1001 #if CONFIG_SENSOR_Flip\r
1002 static  struct reginfo sensor_FlipOn[]=\r
1003 {\r
1004     {0x0000, 0x00}\r
1005 };\r
1006 \r
1007 static  struct reginfo sensor_FlipOff[]=\r
1008 {\r
1009     {0x0000, 0x00}\r
1010 };\r
1011 static struct reginfo *sensor_FlipSeqe[] = {sensor_FlipOff, sensor_FlipOn,NULL,};\r
1012 \r
1013 #endif\r
1014 #if CONFIG_SENSOR_Scene\r
1015 static  struct reginfo sensor_SceneAuto[] =\r
1016 {\r
1017     {0x3a00, 0x78},\r
1018     {0x0000, 0x00}\r
1019 };\r
1020 \r
1021 static  struct reginfo sensor_SceneNight[] =\r
1022 {\r
1023     {0x3003, 0x80},\r
1024         {0x3004, 0x20},\r
1025         {0x3005, 0x18},\r
1026         {0x3006, 0x0d},\r
1027         {0x3a00, 0x7c},\r
1028         {0x3a02 ,0x07},\r
1029         {0x3a03 ,0x38},\r
1030         {0x3a14 ,0x07},\r
1031         {0x3a15 ,0x38},\r
1032     {0x0000, 0x00}\r
1033 };\r
1034 static struct reginfo *sensor_SceneSeqe[] = {sensor_SceneAuto, sensor_SceneNight,NULL,};\r
1035 \r
1036 #endif\r
1037 #if CONFIG_SENSOR_DigitalZoom\r
1038 static struct reginfo sensor_Zoom0[] =\r
1039 {\r
1040     {0x0, 0x0},\r
1041 };\r
1042 \r
1043 static struct reginfo sensor_Zoom1[] =\r
1044 {\r
1045      {0x0, 0x0},\r
1046 };\r
1047 \r
1048 static struct reginfo sensor_Zoom2[] =\r
1049 {\r
1050     {0x0, 0x0},\r
1051 };\r
1052 \r
1053 \r
1054 static struct reginfo sensor_Zoom3[] =\r
1055 {\r
1056     {0x0, 0x0},\r
1057 };\r
1058 static struct reginfo *sensor_ZoomSeqe[] = {sensor_Zoom0, sensor_Zoom1, sensor_Zoom2, sensor_Zoom3, NULL,};\r
1059 #endif\r
1060 static const struct v4l2_querymenu sensor_menus[] =\r
1061 {\r
1062         #if CONFIG_SENSOR_WhiteBalance\r
1063     { .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
1064     { .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
1065     { .id = V4L2_CID_DO_WHITE_BALANCE,  .index = 4,  .name = "cloudy-daylight", .reserved = 0,},\r
1066     #endif\r
1067 \r
1068         #if CONFIG_SENSOR_Effect\r
1069     { .id = V4L2_CID_EFFECT,  .index = 0,  .name = "none",  .reserved = 0, }, {  .id = V4L2_CID_EFFECT,  .index = 1, .name = "mono",  .reserved = 0,},\r
1070     { .id = V4L2_CID_EFFECT,  .index = 2,  .name = "negative", .reserved = 0,}, {  .id = V4L2_CID_EFFECT, .index = 3,  .name = "sepia", .reserved = 0,},\r
1071     { .id = V4L2_CID_EFFECT,  .index = 4, .name = "posterize", .reserved = 0,} ,{ .id = V4L2_CID_EFFECT,  .index = 5,  .name = "aqua", .reserved = 0,},\r
1072     #endif\r
1073 \r
1074         #if CONFIG_SENSOR_Scene\r
1075     { .id = V4L2_CID_SCENE,  .index = 0, .name = "auto", .reserved = 0,} ,{ .id = V4L2_CID_SCENE,  .index = 1,  .name = "night", .reserved = 0,},\r
1076     #endif\r
1077 \r
1078         #if CONFIG_SENSOR_Flash\r
1079     { .id = V4L2_CID_FLASH,  .index = 0,  .name = "off",  .reserved = 0, }, {  .id = V4L2_CID_FLASH,  .index = 1, .name = "auto",  .reserved = 0,},\r
1080     { .id = V4L2_CID_FLASH,  .index = 2,  .name = "on", .reserved = 0,}, {  .id = V4L2_CID_FLASH, .index = 3,  .name = "torch", .reserved = 0,},\r
1081     #endif\r
1082 };\r
1083 \r
1084 static const struct v4l2_queryctrl sensor_controls[] =\r
1085 {\r
1086         #if CONFIG_SENSOR_WhiteBalance\r
1087     {\r
1088         .id             = V4L2_CID_DO_WHITE_BALANCE,\r
1089         .type           = V4L2_CTRL_TYPE_MENU,\r
1090         .name           = "White Balance Control",\r
1091         .minimum        = 0,\r
1092         .maximum        = 4,\r
1093         .step           = 1,\r
1094         .default_value = 0,\r
1095     },\r
1096     #endif\r
1097 \r
1098         #if CONFIG_SENSOR_Brightness\r
1099         {\r
1100         .id             = V4L2_CID_BRIGHTNESS,\r
1101         .type           = V4L2_CTRL_TYPE_INTEGER,\r
1102         .name           = "Brightness Control",\r
1103         .minimum        = -3,\r
1104         .maximum        = 2,\r
1105         .step           = 1,\r
1106         .default_value = 0,\r
1107     },\r
1108     #endif\r
1109 \r
1110         #if CONFIG_SENSOR_Effect\r
1111         {\r
1112         .id             = V4L2_CID_EFFECT,\r
1113         .type           = V4L2_CTRL_TYPE_MENU,\r
1114         .name           = "Effect Control",\r
1115         .minimum        = 0,\r
1116         .maximum        = 5,\r
1117         .step           = 1,\r
1118         .default_value = 0,\r
1119     },\r
1120         #endif\r
1121 \r
1122         #if CONFIG_SENSOR_Exposure\r
1123         {\r
1124         .id             = V4L2_CID_EXPOSURE,\r
1125         .type           = V4L2_CTRL_TYPE_INTEGER,\r
1126         .name           = "Exposure Control",\r
1127         .minimum        = 0,\r
1128         .maximum        = 6,\r
1129         .step           = 1,\r
1130         .default_value = 0,\r
1131     },\r
1132         #endif\r
1133 \r
1134         #if CONFIG_SENSOR_Saturation\r
1135         {\r
1136         .id             = V4L2_CID_SATURATION,\r
1137         .type           = V4L2_CTRL_TYPE_INTEGER,\r
1138         .name           = "Saturation Control",\r
1139         .minimum        = 0,\r
1140         .maximum        = 2,\r
1141         .step           = 1,\r
1142         .default_value = 0,\r
1143     },\r
1144     #endif\r
1145 \r
1146         #if CONFIG_SENSOR_Contrast\r
1147         {\r
1148         .id             = V4L2_CID_CONTRAST,\r
1149         .type           = V4L2_CTRL_TYPE_INTEGER,\r
1150         .name           = "Contrast Control",\r
1151         .minimum        = -3,\r
1152         .maximum        = 3,\r
1153         .step           = 1,\r
1154         .default_value = 0,\r
1155     },\r
1156         #endif\r
1157 \r
1158         #if CONFIG_SENSOR_Mirror\r
1159         {\r
1160         .id             = V4L2_CID_HFLIP,\r
1161         .type           = V4L2_CTRL_TYPE_BOOLEAN,\r
1162         .name           = "Mirror Control",\r
1163         .minimum        = 0,\r
1164         .maximum        = 1,\r
1165         .step           = 1,\r
1166         .default_value = 1,\r
1167     },\r
1168     #endif\r
1169 \r
1170         #if CONFIG_SENSOR_Flip\r
1171         {\r
1172         .id             = V4L2_CID_VFLIP,\r
1173         .type           = V4L2_CTRL_TYPE_BOOLEAN,\r
1174         .name           = "Flip Control",\r
1175         .minimum        = 0,\r
1176         .maximum        = 1,\r
1177         .step           = 1,\r
1178         .default_value = 1,\r
1179     },\r
1180     #endif\r
1181 \r
1182         #if CONFIG_SENSOR_Scene\r
1183     {\r
1184         .id             = V4L2_CID_SCENE,\r
1185         .type           = V4L2_CTRL_TYPE_MENU,\r
1186         .name           = "Scene Control",\r
1187         .minimum        = 0,\r
1188         .maximum        = 1,\r
1189         .step           = 1,\r
1190         .default_value = 0,\r
1191     },\r
1192     #endif\r
1193 \r
1194         #if CONFIG_SENSOR_DigitalZoom\r
1195     {\r
1196         .id             = V4L2_CID_ZOOM_RELATIVE,\r
1197         .type           = V4L2_CTRL_TYPE_INTEGER,\r
1198         .name           = "DigitalZoom Control",\r
1199         .minimum        = -1,\r
1200         .maximum        = 1,\r
1201         .step           = 1,\r
1202         .default_value = 0,\r
1203     }, {\r
1204         .id             = V4L2_CID_ZOOM_ABSOLUTE,\r
1205         .type           = V4L2_CTRL_TYPE_INTEGER,\r
1206         .name           = "DigitalZoom Control",\r
1207         .minimum        = 0,\r
1208         .maximum        = 3,\r
1209         .step           = 1,\r
1210         .default_value = 0,\r
1211     },\r
1212     #endif\r
1213 \r
1214         #if CONFIG_SENSOR_Focus\r
1215         {\r
1216         .id             = V4L2_CID_FOCUS_RELATIVE,\r
1217         .type           = V4L2_CTRL_TYPE_INTEGER,\r
1218         .name           = "Focus Control",\r
1219         .minimum        = -1,\r
1220         .maximum        = 1,\r
1221         .step           = 1,\r
1222         .default_value = 0,\r
1223     }, {\r
1224         .id             = V4L2_CID_FOCUS_ABSOLUTE,\r
1225         .type           = V4L2_CTRL_TYPE_INTEGER,\r
1226         .name           = "Focus Control",\r
1227         .minimum        = 0,\r
1228         .maximum        = 255,\r
1229         .step           = 1,\r
1230         .default_value = 125,\r
1231     },\r
1232     #endif\r
1233 \r
1234         #if CONFIG_SENSOR_Flash\r
1235         {\r
1236         .id             = V4L2_CID_FLASH,\r
1237         .type           = V4L2_CTRL_TYPE_MENU,\r
1238         .name           = "Flash Control",\r
1239         .minimum        = 0,\r
1240         .maximum        = 3,\r
1241         .step           = 1,\r
1242         .default_value = 0,\r
1243     },\r
1244         #endif\r
1245 };\r
1246 \r
1247 static int sensor_probe(struct i2c_client *client, const struct i2c_device_id *did);\r
1248 static int sensor_video_probe(struct soc_camera_device *icd, struct i2c_client *client);\r
1249 static int sensor_g_control(struct v4l2_subdev *sd, struct v4l2_control *ctrl);\r
1250 static int sensor_s_control(struct v4l2_subdev *sd, struct v4l2_control *ctrl);\r
1251 static int sensor_g_ext_controls(struct v4l2_subdev *sd,  struct v4l2_ext_controls *ext_ctrl);\r
1252 static int sensor_s_ext_controls(struct v4l2_subdev *sd,  struct v4l2_ext_controls *ext_ctrl);\r
1253 static int sensor_suspend(struct soc_camera_device *icd, pm_message_t pm_msg);\r
1254 static int sensor_resume(struct soc_camera_device *icd);\r
1255 static int sensor_set_bus_param(struct soc_camera_device *icd,unsigned long flags);\r
1256 static unsigned long sensor_query_bus_param(struct soc_camera_device *icd);\r
1257 #if CONFIG_SENSOR_Effect\r
1258 static int sensor_set_effect(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value);\r
1259 #endif\r
1260 #if CONFIG_SENSOR_WhiteBalance\r
1261 static int sensor_set_whiteBalance(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value);\r
1262 #endif\r
1263 static int sensor_deactivate(struct i2c_client *client);\r
1264 \r
1265 static struct soc_camera_ops sensor_ops =\r
1266 {\r
1267     .suspend                     = sensor_suspend,\r
1268     .resume                       = sensor_resume,\r
1269     .set_bus_param              = sensor_set_bus_param,\r
1270     .query_bus_param    = sensor_query_bus_param,\r
1271     .controls           = sensor_controls,\r
1272     .menus                         = sensor_menus,\r
1273     .num_controls               = ARRAY_SIZE(sensor_controls),\r
1274     .num_menus          = ARRAY_SIZE(sensor_menus),\r
1275 };\r
1276 \r
1277 /* only one fixed colorspace per pixelcode */\r
1278 struct sensor_datafmt {\r
1279         enum v4l2_mbus_pixelcode code;\r
1280         enum v4l2_colorspace colorspace;\r
1281 };\r
1282 \r
1283 /* Find a data format by a pixel code in an array */\r
1284 static const struct sensor_datafmt *sensor_find_datafmt(\r
1285         enum v4l2_mbus_pixelcode code, const struct sensor_datafmt *fmt,\r
1286         int n)\r
1287 {\r
1288         int i;\r
1289         for (i = 0; i < n; i++)\r
1290                 if (fmt[i].code == code)\r
1291                         return fmt + i;\r
1292 \r
1293         return NULL;\r
1294 }\r
1295 \r
1296 static const struct sensor_datafmt sensor_colour_fmts[] = {\r
1297     {V4L2_MBUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG},\r
1298     {V4L2_MBUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG}     \r
1299 };\r
1300 \r
1301 typedef struct sensor_info_priv_s\r
1302 {\r
1303     int whiteBalance;\r
1304     int brightness;\r
1305     int contrast;\r
1306     int saturation;\r
1307     int effect;\r
1308     int scene;\r
1309     int digitalzoom;\r
1310     int focus;\r
1311     int flash;\r
1312     int exposure;\r
1313         bool snap2preview;\r
1314         bool video2preview;\r
1315     unsigned char mirror;                                        /* HFLIP */\r
1316     unsigned char flip;                                          /* VFLIP */\r
1317     unsigned int winseqe_cur_addr;\r
1318     struct sensor_datafmt fmt;\r
1319 \r
1320 } sensor_info_priv_t;\r
1321 \r
1322 struct sensor\r
1323 {\r
1324     struct v4l2_subdev subdev;\r
1325     struct i2c_client *client;\r
1326     sensor_info_priv_t info_priv;\r
1327     int model;  /* V4L2_IDENT_OV* codes from v4l2-chip-ident.h */\r
1328 #if CONFIG_SENSOR_I2C_NOSCHED\r
1329         atomic_t tasklock_cnt;\r
1330 #endif\r
1331         struct rkcamera_platform_data *sensor_io_request;\r
1332     struct rkcamera_gpio_res *sensor_gpio_res;\r
1333 };\r
1334 \r
1335 static struct sensor* to_sensor(const struct i2c_client *client)\r
1336 {\r
1337     return container_of(i2c_get_clientdata(client), struct sensor, subdev);\r
1338 }\r
1339 \r
1340 static int sensor_task_lock(struct i2c_client *client, int lock)\r
1341 {\r
1342 #if CONFIG_SENSOR_I2C_NOSCHED\r
1343         int cnt = 3;\r
1344     struct sensor *sensor = to_sensor(client);\r
1345 \r
1346         if (lock) {\r
1347                 if (atomic_read(&sensor->tasklock_cnt) == 0) {\r
1348                         while ((atomic_read(&client->adapter->bus_lock.count) < 1) && (cnt>0)) {\r
1349                                 SENSOR_TR("\n %s will obtain i2c in atomic, but i2c bus is locked! Wait...\n",SENSOR_NAME_STRING());\r
1350                                 msleep(35);\r
1351                                 cnt--;\r
1352                         }\r
1353                         if ((atomic_read(&client->adapter->bus_lock.count) < 1) && (cnt<=0)) {\r
1354                                 SENSOR_TR("\n %s obtain i2c fail in atomic!!\n",SENSOR_NAME_STRING());\r
1355                                 goto sensor_task_lock_err;\r
1356                         }\r
1357                         preempt_disable();\r
1358                 }\r
1359 \r
1360                 atomic_add(1, &sensor->tasklock_cnt);\r
1361         } else {\r
1362                 if (atomic_read(&sensor->tasklock_cnt) > 0) {\r
1363                         atomic_sub(1, &sensor->tasklock_cnt);\r
1364 \r
1365                         if (atomic_read(&sensor->tasklock_cnt) == 0)\r
1366                                 preempt_enable();\r
1367                 }\r
1368         }\r
1369         return 0;\r
1370 sensor_task_lock_err:\r
1371         return -1;  \r
1372 #else\r
1373     return 0;\r
1374 #endif\r
1375 \r
1376 }\r
1377 static int sensor_write(struct i2c_client *client, u8 reg, u8 val)\r
1378 {\r
1379     int err,cnt;\r
1380     u8 buf[2];\r
1381     struct i2c_msg msg[1];\r
1382 \r
1383     buf[0] = reg & 0xFF;\r
1384     buf[1] = val;\r
1385 \r
1386     msg->addr = client->addr;\r
1387     msg->flags = client->flags;\r
1388     msg->buf = buf;\r
1389     msg->len = sizeof(buf);\r
1390     msg->scl_rate = CONFIG_SENSOR_I2C_SPEED;                                        /* ddl@rock-chips.com : 100kHz */\r
1391     msg->read_type = 0;               /* fpga i2c:0==I2C_NORMAL : direct use number not enum for don't want include spi_fpga.h */\r
1392 \r
1393     cnt = 3;\r
1394     err = -EAGAIN;\r
1395 \r
1396     while ((cnt-->0) && (err < 0)) {                       /* ddl@rock-chips.com :  Transfer again if transent is failed   */\r
1397         err = i2c_transfer(client->adapter, msg, 1);\r
1398 \r
1399         if (err >= 0) {\r
1400             return 0;\r
1401         } else {\r
1402             SENSOR_TR("\n %s write reg(0x%x, val:0x%x) failed, try to write again!\n",SENSOR_NAME_STRING(),reg, val);\r
1403             udelay(10);\r
1404         }\r
1405     }\r
1406 \r
1407     return err;\r
1408 }\r
1409 \r
1410 /* sensor register read */\r
1411 static int sensor_read(struct i2c_client *client, u8 reg, u8 *val)\r
1412 {\r
1413     int err,cnt;\r
1414     u8 buf[1];\r
1415     struct i2c_msg msg[2];\r
1416 \r
1417     buf[0] = reg ;//>> 8;\r
1418    // buf[1] = 0;\r
1419 \r
1420     msg[0].addr = client->addr;\r
1421     msg[0].flags = client->flags;\r
1422     msg[0].buf = buf;\r
1423     msg[0].len = sizeof(buf);\r
1424     msg[0].scl_rate = CONFIG_SENSOR_I2C_SPEED;       /* ddl@rock-chips.com : 100kHz */\r
1425     msg[0].read_type = 2;//0x55;   /* fpga i2c:0==I2C_NO_STOP : direct use number not enum for don't want include spi_fpga.h */\r
1426 \r
1427     msg[1].addr = client->addr;\r
1428     msg[1].flags = client->flags|I2C_M_RD;\r
1429     msg[1].buf = buf;\r
1430     msg[1].len = 1;\r
1431     msg[1].scl_rate = CONFIG_SENSOR_I2C_SPEED;                       /* ddl@rock-chips.com : 100kHz */\r
1432     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
1433 \r
1434     cnt = 3;\r
1435     err = -EAGAIN;\r
1436     while ((cnt-->0) && (err < 0)) {                       /* ddl@rock-chips.com :  Transfer again if transent is failed   */\r
1437         err = i2c_transfer(client->adapter, msg, 2);\r
1438 \r
1439         if (err >= 0) {\r
1440             *val = buf[0];\r
1441             return 0;\r
1442         } else {\r
1443                 SENSOR_TR("\n %s read reg(0x%x val:0x%x) failed, try to read again! \n",SENSOR_NAME_STRING(),reg, *val);\r
1444             udelay(10);\r
1445         }\r
1446     }\r
1447 \r
1448     return err;\r
1449 }\r
1450 \r
1451 /* write a array of registers  */\r
1452 static int sensor_write_array(struct i2c_client *client, struct reginfo *regarray)\r
1453 {\r
1454     int err = 0, cnt;\r
1455     int i = 0;\r
1456 #if CONFIG_SENSOR_I2C_RDWRCHK    \r
1457         char valchk;\r
1458 #endif\r
1459 \r
1460         cnt = 0;\r
1461         if (sensor_task_lock(client, 1) < 0)\r
1462                 goto sensor_write_array_end;\r
1463     while (regarray[i].reg != 0)\r
1464     {\r
1465         err = sensor_write(client, regarray[i].reg, regarray[i].val);\r
1466         if (err < 0)\r
1467         {\r
1468             if (cnt-- > 0) {\r
1469                             SENSOR_TR("%s..write failed current reg:0x%x, Write array again !\n", SENSOR_NAME_STRING(),regarray[i].reg);\r
1470                                 i = 0;\r
1471                                 continue;\r
1472             } else {\r
1473                 SENSOR_TR("%s..write array failed!!!\n", SENSOR_NAME_STRING());\r
1474                 err = -EPERM;\r
1475                                 goto sensor_write_array_end;\r
1476             }\r
1477         } else {\r
1478         #if CONFIG_SENSOR_I2C_RDWRCHK\r
1479                         sensor_read(client, regarray[i].reg, &valchk);\r
1480                         if (valchk != regarray[i].val)\r
1481                                 SENSOR_TR("%s Reg:0x%x write(0x%x, 0x%x) fail\n",SENSOR_NAME_STRING(), regarray[i].reg, regarray[i].val, valchk);\r
1482                 #endif\r
1483         }\r
1484         i++;\r
1485     }\r
1486 \r
1487 sensor_write_array_end:\r
1488         sensor_task_lock(client,0);\r
1489         return err;\r
1490 }\r
1491 #if CONFIG_SENSOR_I2C_RDWRCHK\r
1492 static int sensor_readchk_array(struct i2c_client *client, struct reginfo *regarray)\r
1493 {\r
1494     int cnt;\r
1495     int i = 0;\r
1496         char valchk;\r
1497 \r
1498         cnt = 0;\r
1499         valchk = 0;\r
1500     while (regarray[i].reg != 0)\r
1501     {\r
1502                 sensor_read(client, regarray[i].reg, &valchk);\r
1503                 if (valchk != regarray[i].val)\r
1504                         SENSOR_TR("%s Reg:0x%x read(0x%x, 0x%x) error\n",SENSOR_NAME_STRING(), regarray[i].reg, regarray[i].val, valchk);\r
1505 \r
1506         i++;\r
1507     }\r
1508     return 0;\r
1509 }\r
1510 #endif\r
1511 static int sensor_ioctrl(struct soc_camera_device *icd,enum rksensor_power_cmd cmd, int on)\r
1512 {\r
1513         struct soc_camera_link *icl = to_soc_camera_link(icd);\r
1514         int ret = 0;\r
1515 \r
1516     SENSOR_DG("%s %s  cmd(%d) on(%d)\n",SENSOR_NAME_STRING(),__FUNCTION__,cmd,on);\r
1517 \r
1518         switch (cmd)\r
1519         {\r
1520                 case Sensor_PowerDown:\r
1521                 {\r
1522                         if (icl->powerdown) {\r
1523                                 ret = icl->powerdown(icd->pdev, on);\r
1524                                 if (ret == RK_CAM_IO_SUCCESS) {\r
1525                                         if (on == 0) {\r
1526                                                 mdelay(2);\r
1527                                                 if (icl->reset)\r
1528                                                         icl->reset(icd->pdev);\r
1529                                         }\r
1530                                 } else if (ret == RK_CAM_EIO_REQUESTFAIL) {\r
1531                                         ret = -ENODEV;\r
1532                                         goto sensor_power_end;\r
1533                                 }\r
1534                         }\r
1535                         break;\r
1536                 }\r
1537                 case Sensor_Flash:\r
1538                 {\r
1539                         struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
1540                 struct sensor *sensor = to_sensor(client);\r
1541 \r
1542                         if (sensor->sensor_io_request && sensor->sensor_io_request->sensor_ioctrl) {\r
1543                                 sensor->sensor_io_request->sensor_ioctrl(icd->pdev,Cam_Flash, on);\r
1544                         }\r
1545             break;\r
1546                 }\r
1547                 default:\r
1548                 {\r
1549                         SENSOR_TR("%s %s cmd(0x%x) is unknown!",SENSOR_NAME_STRING(),__FUNCTION__,cmd);\r
1550                         break;\r
1551                 }\r
1552         }\r
1553 sensor_power_end:\r
1554         return ret;\r
1555 }\r
1556 static int sensor_init(struct v4l2_subdev *sd, u32 val)\r
1557 {\r
1558     struct i2c_client *client = v4l2_get_subdevdata(sd);\r
1559     struct soc_camera_device *icd = client->dev.platform_data;\r
1560     struct sensor *sensor = to_sensor(client);\r
1561         const struct v4l2_queryctrl *qctrl;\r
1562     const struct sensor_datafmt *fmt;\r
1563     char value;\r
1564     int ret,pid = 0;\r
1565 \r
1566     SENSOR_DG("\n%s..%s.. \n",SENSOR_NAME_STRING(),__FUNCTION__);\r
1567 \r
1568         if (sensor_ioctrl(icd, Sensor_PowerDown, 0) < 0) {\r
1569                 ret = -ENODEV;\r
1570                 goto sensor_INIT_ERR;\r
1571         }\r
1572 \r
1573     /* soft reset */\r
1574         if (sensor_task_lock(client,1)<0)\r
1575                 goto sensor_INIT_ERR;\r
1576     ret = sensor_write(client, 0xff, 1);\r
1577     ret |= sensor_write(client, 0x12, 0x80);\r
1578     if (ret != 0)\r
1579     {\r
1580         SENSOR_TR("%s soft reset sensor failed\n",SENSOR_NAME_STRING());\r
1581         ret = -ENODEV;\r
1582                 goto sensor_INIT_ERR;\r
1583     }\r
1584 \r
1585     mdelay(5);  //delay 5 microseconds\r
1586         /* check if it is an sensor sensor */\r
1587     ret = sensor_write(client, 0xff, 1);\r
1588     ret |= sensor_read(client, 0x0a, &value);\r
1589     if (ret != 0) {\r
1590         SENSOR_TR("read chip id high byte failed\n");\r
1591         ret = -ENODEV;\r
1592         goto sensor_INIT_ERR;\r
1593     }\r
1594 \r
1595     pid = value << 8;\r
1596     ret = sensor_read(client, 0x0b, &value);\r
1597     if (ret != 0) {\r
1598         SENSOR_TR("read chip id low byte failed\n");\r
1599         ret = -ENODEV;\r
1600         goto sensor_INIT_ERR;\r
1601     }\r
1602 \r
1603     pid |= (value & 0xff);\r
1604 \r
1605     SENSOR_DG("\n %s  pid = 0x%x\n", SENSOR_NAME_STRING(), pid);\r
1606     if ((pid == SENSOR_ID)||(pid == SENSOR_ID1)) {\r
1607         sensor->model = SENSOR_V4L2_IDENT;\r
1608     } else {\r
1609         SENSOR_TR("error: %s mismatched   pid = 0x%x\n", SENSOR_NAME_STRING(), pid);\r
1610         ret = -ENODEV;\r
1611         goto sensor_INIT_ERR;\r
1612     }\r
1613 \r
1614     ret = sensor_write_array(client, sensor_init_data);\r
1615     if (ret != 0)\r
1616     {\r
1617         SENSOR_TR("error: %s initial failed\n",SENSOR_NAME_STRING());\r
1618         goto sensor_INIT_ERR;\r
1619     }\r
1620         sensor_task_lock(client,0);\r
1621     sensor->info_priv.winseqe_cur_addr  = (int)SENSOR_INIT_WINSEQADR;\r
1622     fmt = sensor_find_datafmt(SENSOR_INIT_PIXFMT,sensor_colour_fmts, ARRAY_SIZE(sensor_colour_fmts));\r
1623     if (!fmt) {\r
1624         SENSOR_TR("error: %s initial array colour fmts is not support!!",SENSOR_NAME_STRING());\r
1625         ret = -EINVAL;\r
1626         goto sensor_INIT_ERR;\r
1627     }\r
1628         sensor->info_priv.fmt = *fmt;\r
1629 \r
1630     /* sensor sensor information for initialization  */\r
1631         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_DO_WHITE_BALANCE);\r
1632         if (qctrl)\r
1633         sensor->info_priv.whiteBalance = qctrl->default_value;\r
1634         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_BRIGHTNESS);\r
1635         if (qctrl)\r
1636         sensor->info_priv.brightness = qctrl->default_value;\r
1637         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);\r
1638         if (qctrl)\r
1639         sensor->info_priv.effect = qctrl->default_value;\r
1640         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EXPOSURE);\r
1641         if (qctrl)\r
1642         sensor->info_priv.exposure = qctrl->default_value;\r
1643 \r
1644         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_SATURATION);\r
1645         if (qctrl)\r
1646         sensor->info_priv.saturation = qctrl->default_value;\r
1647         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_CONTRAST);\r
1648         if (qctrl)\r
1649         sensor->info_priv.contrast = qctrl->default_value;\r
1650         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_HFLIP);\r
1651         if (qctrl)\r
1652         sensor->info_priv.mirror = qctrl->default_value;\r
1653         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_VFLIP);\r
1654         if (qctrl)\r
1655         sensor->info_priv.flip = qctrl->default_value;\r
1656         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_SCENE);\r
1657         if (qctrl)\r
1658         sensor->info_priv.scene = qctrl->default_value;\r
1659         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_ZOOM_ABSOLUTE);\r
1660         if (qctrl)\r
1661         sensor->info_priv.digitalzoom = qctrl->default_value;\r
1662 \r
1663     /* ddl@rock-chips.com : if sensor support auto focus and flash, programer must run focus and flash code  */\r
1664         #if CONFIG_SENSOR_Focus\r
1665     sensor_set_focus();\r
1666     qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_FOCUS_ABSOLUTE);\r
1667         if (qctrl)\r
1668         sensor->info_priv.focus = qctrl->default_value;\r
1669         #endif\r
1670 \r
1671         #if CONFIG_SENSOR_Flash\r
1672         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_FLASH);\r
1673         if (qctrl)\r
1674         sensor->info_priv.flash = qctrl->default_value;\r
1675     #endif\r
1676 \r
1677     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
1678 \r
1679     return 0;\r
1680 sensor_INIT_ERR:\r
1681         sensor_task_lock(client,0);\r
1682         sensor_deactivate(client);\r
1683     return ret;\r
1684 }\r
1685 \r
1686 static int sensor_deactivate(struct i2c_client *client)\r
1687 {\r
1688         struct soc_camera_device *icd = client->dev.platform_data;\r
1689 \r
1690         SENSOR_DG("\n%s..%s.. Enter\n",SENSOR_NAME_STRING(),__FUNCTION__);\r
1691 \r
1692         /* ddl@rock-chips.com : all sensor output pin must change to input for other sensor */\r
1693 #if 0   \r
1694         sensor_task_lock(client, 1);\r
1695     sensor_write(client, 0x3000, reg_val&0xfc);\r
1696         sensor_write(client, 0x3001, 0x00);\r
1697         sensor_task_lock(client, 0);\r
1698 #endif\r
1699         sensor_ioctrl(icd, Sensor_PowerDown, 1);\r
1700         /* ddl@rock-chips.com : sensor config init width , because next open sensor quickly(soc_camera_open -> Try to configure with default parameters) */\r
1701         icd->user_width = SENSOR_INIT_WIDTH;\r
1702     icd->user_height = SENSOR_INIT_HEIGHT;\r
1703         msleep(100);\r
1704         return 0;\r
1705 }\r
1706 \r
1707 static  struct reginfo sensor_power_down_sequence[]=\r
1708 {\r
1709     {0x00,0x00}\r
1710 };\r
1711 static int sensor_suspend(struct soc_camera_device *icd, pm_message_t pm_msg)\r
1712 {\r
1713     int ret;\r
1714     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
1715 \r
1716     if (pm_msg.event == PM_EVENT_SUSPEND) {\r
1717         SENSOR_DG("\n %s Enter Suspend.. \n", SENSOR_NAME_STRING());\r
1718         ret = sensor_write_array(client, sensor_power_down_sequence) ;\r
1719         if (ret != 0) {\r
1720             SENSOR_TR("\n %s..%s WriteReg Fail.. \n", SENSOR_NAME_STRING(),__FUNCTION__);\r
1721             return ret;\r
1722         } else {\r
1723             ret = sensor_ioctrl(icd, Sensor_PowerDown, 1);\r
1724             if (ret < 0) {\r
1725                             SENSOR_TR("\n %s suspend fail for turn on power!\n", SENSOR_NAME_STRING());\r
1726                 return -EINVAL;\r
1727             }\r
1728         }\r
1729     } else {\r
1730         SENSOR_TR("\n %s cann't suppout Suspend..\n",SENSOR_NAME_STRING());\r
1731         return -EINVAL;\r
1732     }\r
1733     return 0;\r
1734 }\r
1735 \r
1736 static int sensor_resume(struct soc_camera_device *icd)\r
1737 {\r
1738         int ret;\r
1739 \r
1740     ret = sensor_ioctrl(icd, Sensor_PowerDown, 0);\r
1741     if (ret < 0) {\r
1742                 SENSOR_TR("\n %s resume fail for turn on power!\n", SENSOR_NAME_STRING());\r
1743         return -EINVAL;\r
1744     }\r
1745 \r
1746         SENSOR_DG("\n %s Enter Resume.. \n", SENSOR_NAME_STRING());\r
1747 \r
1748     return 0;\r
1749 \r
1750 }\r
1751 \r
1752 static int sensor_set_bus_param(struct soc_camera_device *icd,\r
1753                                 unsigned long flags)\r
1754 {\r
1755 \r
1756     return 0;\r
1757 }\r
1758 \r
1759 static unsigned long sensor_query_bus_param(struct soc_camera_device *icd)\r
1760 {\r
1761     struct soc_camera_link *icl = to_soc_camera_link(icd);\r
1762     unsigned long flags = SENSOR_BUS_PARAM;\r
1763 \r
1764     return soc_camera_apply_sensor_flags(icl, flags);\r
1765 }\r
1766 \r
1767 static int sensor_g_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)\r
1768 {\r
1769     struct i2c_client *client = v4l2_get_subdevdata(sd);\r
1770     struct soc_camera_device *icd = client->dev.platform_data;\r
1771     struct sensor *sensor = to_sensor(client);\r
1772 \r
1773     mf->width   = icd->user_width;\r
1774         mf->height      = icd->user_height;\r
1775         mf->code        = sensor->info_priv.fmt.code;\r
1776         mf->colorspace  = sensor->info_priv.fmt.colorspace;\r
1777         mf->field       = V4L2_FIELD_NONE;\r
1778 \r
1779     return 0;\r
1780 }\r
1781 static bool sensor_fmt_capturechk(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)\r
1782 {\r
1783     bool ret = false;\r
1784 \r
1785         if ((mf->width == 1024) && (mf->height == 768)) {\r
1786                 ret = true;\r
1787         } else if ((mf->width == 1280) && (mf->height == 1024)) {\r
1788                 ret = true;\r
1789         } else if ((mf->width == 1600) && (mf->height == 1200)) {\r
1790                 ret = true;\r
1791         } else if ((mf->width == 2048) && (mf->height == 1536)) {\r
1792                 ret = true;\r
1793         } else if ((mf->width == 2592) && (mf->height == 1944)) {\r
1794                 ret = true;\r
1795         }\r
1796 \r
1797         if (ret == true)\r
1798                 SENSOR_DG("%s %dx%d is capture format\n", __FUNCTION__, mf->width, mf->height);\r
1799         return ret;\r
1800 }\r
1801 \r
1802 static bool sensor_fmt_videochk(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)\r
1803 {\r
1804     bool ret = false;\r
1805 \r
1806         if ((mf->width == 1280) && (mf->height == 720)) {\r
1807                 ret = true;\r
1808         } else if ((mf->width == 1920) && (mf->height == 1080)) {\r
1809                 ret = true;\r
1810         }\r
1811 \r
1812         if (ret == true)\r
1813                 SENSOR_DG("%s %dx%d is video format\n", __FUNCTION__, mf->width, mf->height);\r
1814         return ret;\r
1815 }\r
1816 static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)\r
1817 {\r
1818     struct i2c_client *client = v4l2_get_subdevdata(sd);\r
1819     struct sensor *sensor = to_sensor(client);\r
1820     const struct sensor_datafmt *fmt;\r
1821         const struct v4l2_queryctrl *qctrl;\r
1822         struct soc_camera_device *icd = client->dev.platform_data;\r
1823     struct reginfo *winseqe_set_addr=NULL;\r
1824     int ret=0, set_w,set_h;\r
1825 \r
1826         fmt = sensor_find_datafmt(mf->code, sensor_colour_fmts,\r
1827                                    ARRAY_SIZE(sensor_colour_fmts));\r
1828         if (!fmt) {\r
1829         ret = -EINVAL;\r
1830         goto sensor_s_fmt_end;\r
1831     }\r
1832 \r
1833         if (sensor->info_priv.fmt.code != mf->code) {\r
1834                 switch (mf->code)\r
1835                 {\r
1836                         case V4L2_MBUS_FMT_YUYV8_2X8:\r
1837                         {\r
1838                                 winseqe_set_addr = sensor_ClrFmt_YUYV;\r
1839                                 break;\r
1840                         }\r
1841                         case V4L2_MBUS_FMT_UYVY8_2X8:\r
1842                         {\r
1843                                 winseqe_set_addr = sensor_ClrFmt_UYVY;\r
1844                                 break;\r
1845                         }\r
1846                         default:\r
1847                                 break;\r
1848                 }\r
1849                 if (winseqe_set_addr != NULL) {\r
1850             sensor_write_array(client, winseqe_set_addr);\r
1851                         sensor->info_priv.fmt.code = mf->code;\r
1852             sensor->info_priv.fmt.colorspace= mf->colorspace;            \r
1853                         SENSOR_DG("%s v4l2_mbus_code:%d set success!\n", SENSOR_NAME_STRING(),mf->code);\r
1854                 } else {\r
1855                         SENSOR_TR("%s v4l2_mbus_code:%d is invalidate!\n", SENSOR_NAME_STRING(),mf->code);\r
1856                 }\r
1857         }\r
1858 \r
1859     set_w = mf->width;\r
1860     set_h = mf->height;\r
1861 \r
1862         if (((set_w <= 176) && (set_h <= 144)) && sensor_qcif[0].reg)\r
1863         {\r
1864                 winseqe_set_addr = sensor_qcif;\r
1865         set_w = 176;\r
1866         set_h = 144;\r
1867         }\r
1868         else if (((set_w <= 320) && (set_h <= 240)) && sensor_qvga[0].reg)\r
1869     {\r
1870         winseqe_set_addr = sensor_qvga;\r
1871         set_w = 320;\r
1872         set_h = 240;\r
1873     }\r
1874     else if (((set_w <= 352) && (set_h<= 288)) && sensor_cif[0].reg)\r
1875     {\r
1876         winseqe_set_addr = sensor_cif;\r
1877         set_w = 352;\r
1878         set_h = 288;\r
1879     }\r
1880     else if (((set_w <= 640) && (set_h <= 480)) && sensor_vga[0].reg)\r
1881     {\r
1882         winseqe_set_addr = sensor_vga;\r
1883         set_w = 640;\r
1884         set_h = 480;\r
1885     }\r
1886     else if (((set_w <= 800) && (set_h <= 600)) && sensor_svga[0].reg)\r
1887     {\r
1888         winseqe_set_addr = sensor_svga;\r
1889         set_w = 800;\r
1890         set_h = 600;\r
1891     }\r
1892         else if (((set_w <= 1024) && (set_h <= 768)) && sensor_xga[0].reg)\r
1893     {\r
1894         winseqe_set_addr = sensor_xga;\r
1895         set_w = 1024;\r
1896         set_h = 768;\r
1897     }\r
1898     else if (((set_w <= 1280) && (set_h <= 1024)) && sensor_sxga[0].reg)\r
1899     {\r
1900         winseqe_set_addr = sensor_sxga;\r
1901         set_w = 1280;\r
1902         set_h = 1024;\r
1903     }\r
1904     else if (((set_w <= 1600) && (set_h <= 1200)) && sensor_uxga[0].reg)\r
1905     {\r
1906         winseqe_set_addr = sensor_uxga;\r
1907         set_w = 1600;\r
1908         set_h = 1200;\r
1909     }\r
1910     else\r
1911     {\r
1912         winseqe_set_addr = SENSOR_INIT_WINSEQADR;               /* ddl@rock-chips.com : Sensor output smallest size if  isn't support app  */\r
1913         set_w = SENSOR_INIT_WIDTH;\r
1914         set_h = SENSOR_INIT_HEIGHT;\r
1915                 SENSOR_TR("\n %s..%s Format is Invalidate. pix->width = %d.. pix->height = %d\n",SENSOR_NAME_STRING(),__FUNCTION__,mf->width,mf->height);\r
1916     }\r
1917 \r
1918     if ((int)winseqe_set_addr  != sensor->info_priv.winseqe_cur_addr) {\r
1919         #if CONFIG_SENSOR_Flash\r
1920         if (sensor_fmt_capturechk(sd,mf) == true) {      /* ddl@rock-chips.com : Capture */\r
1921             if ((sensor->info_priv.flash == 1) || (sensor->info_priv.flash == 2)) {\r
1922                 sensor_ioctrl(icd, Sensor_Flash, Flash_On);\r
1923                 SENSOR_DG("%s flash on in capture!\n", SENSOR_NAME_STRING());\r
1924             }           \r
1925         } else {                                        /* ddl@rock-chips.com : Video */\r
1926             if ((sensor->info_priv.flash == 1) || (sensor->info_priv.flash == 2)) {\r
1927                 sensor_ioctrl(icd, Sensor_Flash, Flash_Off);\r
1928                 SENSOR_DG("%s flash off in preivew!\n", SENSOR_NAME_STRING());\r
1929             }\r
1930         }\r
1931         #endif        \r
1932         ret |= sensor_write_array(client, winseqe_set_addr);\r
1933         if (ret != 0) {\r
1934             SENSOR_TR("%s set format capability failed\n", SENSOR_NAME_STRING());\r
1935             #if CONFIG_SENSOR_Flash\r
1936             if (sensor_fmt_capturechk(sd,mf) == true) {\r
1937                 if ((sensor->info_priv.flash == 1) || (sensor->info_priv.flash == 2)) {\r
1938                     sensor_ioctrl(icd, Sensor_Flash, Flash_Off);\r
1939                     SENSOR_TR("%s Capture format set fail, flash off !\n", SENSOR_NAME_STRING());\r
1940                 }\r
1941             }\r
1942             #endif\r
1943             goto sensor_s_fmt_end;\r
1944         }\r
1945 \r
1946         sensor->info_priv.winseqe_cur_addr  = (int)winseqe_set_addr;\r
1947 \r
1948                 if (sensor_fmt_capturechk(sd,mf) == true) {                                 /* ddl@rock-chips.com : Capture */\r
1949         #if CONFIG_SENSOR_Effect\r
1950                         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);\r
1951                         sensor_set_effect(icd, qctrl,sensor->info_priv.effect);\r
1952         #endif\r
1953         #if CONFIG_SENSOR_WhiteBalance\r
1954                         if (sensor->info_priv.whiteBalance != 0) {\r
1955                                 qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_DO_WHITE_BALANCE);\r
1956                                 sensor_set_whiteBalance(icd, qctrl,sensor->info_priv.whiteBalance);\r
1957                         }\r
1958         #endif\r
1959                         sensor->info_priv.snap2preview = true;\r
1960                 } else if (sensor_fmt_videochk(sd,mf) == true) {                        /* ddl@rock-chips.com : Video */\r
1961                 #if CONFIG_SENSOR_Effect\r
1962                         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);\r
1963                         sensor_set_effect(icd, qctrl,sensor->info_priv.effect);\r
1964         #endif\r
1965         #if CONFIG_SENSOR_WhiteBalance\r
1966                         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_DO_WHITE_BALANCE);\r
1967                         sensor_set_whiteBalance(icd, qctrl,sensor->info_priv.whiteBalance);\r
1968         #endif\r
1969                         sensor->info_priv.video2preview = true;\r
1970                 } else if ((sensor->info_priv.snap2preview == true) || (sensor->info_priv.video2preview == true)) {\r
1971                 #if CONFIG_SENSOR_Effect\r
1972                         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);\r
1973                         sensor_set_effect(icd, qctrl,sensor->info_priv.effect);\r
1974         #endif\r
1975         #if CONFIG_SENSOR_WhiteBalance    \r
1976                         qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_DO_WHITE_BALANCE);\r
1977                         sensor_set_whiteBalance(icd, qctrl,sensor->info_priv.whiteBalance);\r
1978         #endif    \r
1979                         sensor->info_priv.video2preview = false;            \r
1980                         sensor->info_priv.snap2preview = false;\r
1981                 }\r
1982         SENSOR_DG("\n%s..%s.. icd->width = %d.. icd->height %d\n",SENSOR_NAME_STRING(),__FUNCTION__,set_w,set_h);\r
1983     }\r
1984     else\r
1985     {\r
1986         SENSOR_DG("\n %s .. Current Format is validate. icd->width = %d.. icd->height %d\n",SENSOR_NAME_STRING(),set_w,set_h);\r
1987     }\r
1988 \r
1989         mf->width = set_w;\r
1990     mf->height = set_h;\r
1991 \r
1992 sensor_s_fmt_end:\r
1993     return ret;\r
1994 }\r
1995 \r
1996 static int sensor_try_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)\r
1997 {\r
1998     struct i2c_client *client = v4l2_get_subdevdata(sd);\r
1999     struct sensor *sensor = to_sensor(client);\r
2000     const struct sensor_datafmt *fmt;\r
2001     int ret = 0;\r
2002    \r
2003         fmt = sensor_find_datafmt(mf->code, sensor_colour_fmts,\r
2004                                    ARRAY_SIZE(sensor_colour_fmts));\r
2005         if (fmt == NULL) {\r
2006                 fmt = &sensor->info_priv.fmt;\r
2007         mf->code = fmt->code;\r
2008         } \r
2009 \r
2010     if (mf->height > SENSOR_MAX_HEIGHT)\r
2011         mf->height = SENSOR_MAX_HEIGHT;\r
2012     else if (mf->height < SENSOR_MIN_HEIGHT)\r
2013         mf->height = SENSOR_MIN_HEIGHT;\r
2014 \r
2015     if (mf->width > SENSOR_MAX_WIDTH)\r
2016         mf->width = SENSOR_MAX_WIDTH;\r
2017     else if (mf->width < SENSOR_MIN_WIDTH)\r
2018         mf->width = SENSOR_MIN_WIDTH;\r
2019 \r
2020     mf->colorspace = fmt->colorspace;\r
2021     \r
2022     return ret;\r
2023 }\r
2024  static int sensor_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *id)\r
2025 {\r
2026     struct i2c_client *client = v4l2_get_subdevdata(sd);\r
2027 \r
2028     if (id->match.type != V4L2_CHIP_MATCH_I2C_ADDR)\r
2029         return -EINVAL;\r
2030 \r
2031     if (id->match.addr != client->addr)\r
2032         return -ENODEV;\r
2033 \r
2034     id->ident = SENSOR_V4L2_IDENT;      /* ddl@rock-chips.com :  Return OV2655  identifier */\r
2035     id->revision = 0;\r
2036 \r
2037     return 0;\r
2038 }\r
2039 #if CONFIG_SENSOR_Brightness\r
2040 static int sensor_set_brightness(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
2041 {\r
2042     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
2043 \r
2044     if ((value >= qctrl->minimum) && (value <= qctrl->maximum))\r
2045     {\r
2046         if (sensor_BrightnessSeqe[value - qctrl->minimum] != NULL)\r
2047         {\r
2048             if (sensor_write_array(client, sensor_BrightnessSeqe[value - qctrl->minimum]) != 0)\r
2049             {\r
2050                 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
2051                 return -EINVAL;\r
2052             }\r
2053             SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
2054             return 0;\r
2055         }\r
2056     }\r
2057         SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
2058     return -EINVAL;\r
2059 }\r
2060 #endif\r
2061 #if CONFIG_SENSOR_Effect\r
2062 static int sensor_set_effect(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
2063 {\r
2064     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
2065 \r
2066     if ((value >= qctrl->minimum) && (value <= qctrl->maximum))\r
2067     {\r
2068         if (sensor_EffectSeqe[value - qctrl->minimum] != NULL)\r
2069         {\r
2070             if (sensor_write_array(client, sensor_EffectSeqe[value - qctrl->minimum]) != 0)\r
2071             {\r
2072                 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
2073                 return -EINVAL;\r
2074             }\r
2075             SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
2076             return 0;\r
2077         }\r
2078     }\r
2079         SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
2080     return -EINVAL;\r
2081 }\r
2082 #endif\r
2083 #if CONFIG_SENSOR_Exposure\r
2084 static int sensor_set_exposure(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
2085 {\r
2086     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
2087 \r
2088     if ((value >= qctrl->minimum) && (value <= qctrl->maximum))\r
2089     {\r
2090         if (sensor_ExposureSeqe[value - qctrl->minimum] != NULL)\r
2091         {\r
2092             if (sensor_write_array(client, sensor_ExposureSeqe[value - qctrl->minimum]) != 0)\r
2093             {\r
2094                 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
2095                 return -EINVAL;\r
2096             }\r
2097             SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
2098             return 0;\r
2099         }\r
2100     }\r
2101         SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
2102     return -EINVAL;\r
2103 }\r
2104 #endif\r
2105 #if CONFIG_SENSOR_Saturation\r
2106 static int sensor_set_saturation(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
2107 {\r
2108     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
2109 \r
2110     if ((value >= qctrl->minimum) && (value <= qctrl->maximum))\r
2111     {\r
2112         if (sensor_SaturationSeqe[value - qctrl->minimum] != NULL)\r
2113         {\r
2114             if (sensor_write_array(client, sensor_SaturationSeqe[value - qctrl->minimum]) != 0)\r
2115             {\r
2116                 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
2117                 return -EINVAL;\r
2118             }\r
2119             SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
2120             return 0;\r
2121         }\r
2122     }\r
2123     SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
2124     return -EINVAL;\r
2125 }\r
2126 #endif\r
2127 #if CONFIG_SENSOR_Contrast\r
2128 static int sensor_set_contrast(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
2129 {\r
2130     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
2131 \r
2132     if ((value >= qctrl->minimum) && (value <= qctrl->maximum))\r
2133     {\r
2134         if (sensor_ContrastSeqe[value - qctrl->minimum] != NULL)\r
2135         {\r
2136             if (sensor_write_array(client, sensor_ContrastSeqe[value - qctrl->minimum]) != 0)\r
2137             {\r
2138                 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
2139                 return -EINVAL;\r
2140             }\r
2141             SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
2142             return 0;\r
2143         }\r
2144     }\r
2145     SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
2146     return -EINVAL;\r
2147 }\r
2148 #endif\r
2149 #if CONFIG_SENSOR_Mirror\r
2150 static int sensor_set_mirror(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
2151 {\r
2152     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
2153 \r
2154     if ((value >= qctrl->minimum) && (value <= qctrl->maximum))\r
2155     {\r
2156         if (sensor_MirrorSeqe[value - qctrl->minimum] != NULL)\r
2157         {\r
2158             if (sensor_write_array(client, sensor_MirrorSeqe[value - qctrl->minimum]) != 0)\r
2159             {\r
2160                 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
2161                 return -EINVAL;\r
2162             }\r
2163             SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
2164             return 0;\r
2165         }\r
2166     }\r
2167     SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
2168     return -EINVAL;\r
2169 }\r
2170 #endif\r
2171 #if CONFIG_SENSOR_Flip\r
2172 static int sensor_set_flip(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
2173 {\r
2174     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
2175 \r
2176     if ((value >= qctrl->minimum) && (value <= qctrl->maximum))\r
2177     {\r
2178         if (sensor_FlipSeqe[value - qctrl->minimum] != NULL)\r
2179         {\r
2180             if (sensor_write_array(client, sensor_FlipSeqe[value - qctrl->minimum]) != 0)\r
2181             {\r
2182                 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
2183                 return -EINVAL;\r
2184             }\r
2185             SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
2186             return 0;\r
2187         }\r
2188     }\r
2189     SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
2190     return -EINVAL;\r
2191 }\r
2192 #endif\r
2193 #if CONFIG_SENSOR_Scene\r
2194 static int sensor_set_scene(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
2195 {\r
2196     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
2197 \r
2198     if ((value >= qctrl->minimum) && (value <= qctrl->maximum))\r
2199     {\r
2200         if (sensor_SceneSeqe[value - qctrl->minimum] != NULL)\r
2201         {\r
2202             if (sensor_write_array(client, sensor_SceneSeqe[value - qctrl->minimum]) != 0)\r
2203             {\r
2204                 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
2205                 return -EINVAL;\r
2206             }\r
2207             SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
2208             return 0;\r
2209         }\r
2210     }\r
2211     SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
2212     return -EINVAL;\r
2213 }\r
2214 #endif\r
2215 #if CONFIG_SENSOR_WhiteBalance\r
2216 static int sensor_set_whiteBalance(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
2217 {\r
2218     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
2219 \r
2220     if ((value >= qctrl->minimum) && (value <= qctrl->maximum))\r
2221     {\r
2222         if (sensor_WhiteBalanceSeqe[value - qctrl->minimum] != NULL)\r
2223         {\r
2224             if (sensor_write_array(client, sensor_WhiteBalanceSeqe[value - qctrl->minimum]) != 0)\r
2225             {\r
2226                 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
2227                 return -EINVAL;\r
2228             }\r
2229             SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
2230             return 0;\r
2231         }\r
2232     }\r
2233         SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
2234     return -EINVAL;\r
2235 }\r
2236 #endif\r
2237 #if CONFIG_SENSOR_DigitalZoom\r
2238 static int sensor_set_digitalzoom(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int *value)\r
2239 {\r
2240     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
2241     struct sensor *sensor = to_sensor(client);\r
2242         const struct v4l2_queryctrl *qctrl_info;\r
2243     int digitalzoom_cur, digitalzoom_total;\r
2244 \r
2245         qctrl_info = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_ZOOM_ABSOLUTE);\r
2246         if (qctrl_info)\r
2247                 return -EINVAL;\r
2248 \r
2249     digitalzoom_cur = sensor->info_priv.digitalzoom;\r
2250     digitalzoom_total = qctrl_info->maximum;\r
2251 \r
2252     if ((*value > 0) && (digitalzoom_cur >= digitalzoom_total))\r
2253     {\r
2254         SENSOR_TR("%s digitalzoom is maximum - %x\n", SENSOR_NAME_STRING(), digitalzoom_cur);\r
2255         return -EINVAL;\r
2256     }\r
2257 \r
2258     if  ((*value < 0) && (digitalzoom_cur <= qctrl_info->minimum))\r
2259     {\r
2260         SENSOR_TR("%s digitalzoom is minimum - %x\n", SENSOR_NAME_STRING(), digitalzoom_cur);\r
2261         return -EINVAL;\r
2262     }\r
2263 \r
2264     if ((*value > 0) && ((digitalzoom_cur + *value) > digitalzoom_total))\r
2265     {\r
2266         *value = digitalzoom_total - digitalzoom_cur;\r
2267     }\r
2268 \r
2269     if ((*value < 0) && ((digitalzoom_cur + *value) < 0))\r
2270     {\r
2271         *value = 0 - digitalzoom_cur;\r
2272     }\r
2273 \r
2274     digitalzoom_cur += *value;\r
2275 \r
2276     if (sensor_ZoomSeqe[digitalzoom_cur] != NULL)\r
2277     {\r
2278         if (sensor_write_array(client, sensor_ZoomSeqe[digitalzoom_cur]) != 0)\r
2279         {\r
2280             SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
2281             return -EINVAL;\r
2282         }\r
2283         SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, *value);\r
2284         return 0;\r
2285     }\r
2286 \r
2287     return -EINVAL;\r
2288 }\r
2289 #endif\r
2290 #if CONFIG_SENSOR_Flash\r
2291 static int sensor_set_flash(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
2292 {    \r
2293     if ((value >= qctrl->minimum) && (value <= qctrl->maximum)) {\r
2294         if (value == 3) {       /* ddl@rock-chips.com: torch */\r
2295             sensor_ioctrl(icd, Sensor_Flash, Flash_Torch);   /* Flash On */\r
2296         } else {\r
2297             sensor_ioctrl(icd, Sensor_Flash, Flash_Off);\r
2298         }\r
2299         SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
2300         return 0;\r
2301     }\r
2302     \r
2303         SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
2304     return -EINVAL;\r
2305 }\r
2306 #endif\r
2307 \r
2308 static int sensor_g_control(struct v4l2_subdev *sd, struct v4l2_control *ctrl)\r
2309 {\r
2310     struct i2c_client *client = v4l2_get_subdevdata(sd);\r
2311     struct sensor *sensor = to_sensor(client);\r
2312     const struct v4l2_queryctrl *qctrl;\r
2313 \r
2314     qctrl = soc_camera_find_qctrl(&sensor_ops, ctrl->id);\r
2315 \r
2316     if (!qctrl)\r
2317     {\r
2318         SENSOR_TR("\n %s ioctrl id = %d  is invalidate \n", SENSOR_NAME_STRING(), ctrl->id);\r
2319         return -EINVAL;\r
2320     }\r
2321 \r
2322     switch (ctrl->id)\r
2323     {\r
2324         case V4L2_CID_BRIGHTNESS:\r
2325             {\r
2326                 ctrl->value = sensor->info_priv.brightness;\r
2327                 break;\r
2328             }\r
2329         case V4L2_CID_SATURATION:\r
2330             {\r
2331                 ctrl->value = sensor->info_priv.saturation;\r
2332                 break;\r
2333             }\r
2334         case V4L2_CID_CONTRAST:\r
2335             {\r
2336                 ctrl->value = sensor->info_priv.contrast;\r
2337                 break;\r
2338             }\r
2339         case V4L2_CID_DO_WHITE_BALANCE:\r
2340             {\r
2341                 ctrl->value = sensor->info_priv.whiteBalance;\r
2342                 break;\r
2343             }\r
2344         case V4L2_CID_EXPOSURE:\r
2345             {\r
2346                 ctrl->value = sensor->info_priv.exposure;\r
2347                 break;\r
2348             }\r
2349         case V4L2_CID_HFLIP:\r
2350             {\r
2351                 ctrl->value = sensor->info_priv.mirror;\r
2352                 break;\r
2353             }\r
2354         case V4L2_CID_VFLIP:\r
2355             {\r
2356                 ctrl->value = sensor->info_priv.flip;\r
2357                 break;\r
2358             }\r
2359         default :\r
2360                 break;\r
2361     }\r
2362     return 0;\r
2363 }\r
2364 \r
2365 \r
2366 \r
2367 static int sensor_s_control(struct v4l2_subdev *sd, struct v4l2_control *ctrl)\r
2368 {\r
2369     struct i2c_client *client = v4l2_get_subdevdata(sd);\r
2370     struct sensor *sensor = to_sensor(client);\r
2371     struct soc_camera_device *icd = client->dev.platform_data;\r
2372     const struct v4l2_queryctrl *qctrl;\r
2373 \r
2374 \r
2375     qctrl = soc_camera_find_qctrl(&sensor_ops, ctrl->id);\r
2376 \r
2377     if (!qctrl)\r
2378     {\r
2379         SENSOR_TR("\n %s ioctrl id = %d  is invalidate \n", SENSOR_NAME_STRING(), ctrl->id);\r
2380         return -EINVAL;\r
2381     }\r
2382 \r
2383     switch (ctrl->id)\r
2384     {\r
2385 #if CONFIG_SENSOR_Brightness\r
2386         case V4L2_CID_BRIGHTNESS:\r
2387             {\r
2388                 if (ctrl->value != sensor->info_priv.brightness)\r
2389                 {\r
2390                     if (sensor_set_brightness(icd, qctrl,ctrl->value) != 0)\r
2391                     {\r
2392                         return -EINVAL;\r
2393                     }\r
2394                     sensor->info_priv.brightness = ctrl->value;\r
2395                 }\r
2396                 break;\r
2397             }\r
2398 #endif\r
2399 #if CONFIG_SENSOR_Exposure\r
2400         case V4L2_CID_EXPOSURE:\r
2401             {\r
2402                 if (ctrl->value != sensor->info_priv.exposure)\r
2403                 {\r
2404                     if (sensor_set_exposure(icd, qctrl,ctrl->value) != 0)\r
2405                     {\r
2406                         return -EINVAL;\r
2407                     }\r
2408                     sensor->info_priv.exposure = ctrl->value;\r
2409                 }\r
2410                 break;\r
2411             }\r
2412 #endif\r
2413 #if CONFIG_SENSOR_Saturation\r
2414         case V4L2_CID_SATURATION:\r
2415             {\r
2416                 if (ctrl->value != sensor->info_priv.saturation)\r
2417                 {\r
2418                     if (sensor_set_saturation(icd, qctrl,ctrl->value) != 0)\r
2419                     {\r
2420                         return -EINVAL;\r
2421                     }\r
2422                     sensor->info_priv.saturation = ctrl->value;\r
2423                 }\r
2424                 break;\r
2425             }\r
2426 #endif\r
2427 #if CONFIG_SENSOR_Contrast\r
2428         case V4L2_CID_CONTRAST:\r
2429             {\r
2430                 if (ctrl->value != sensor->info_priv.contrast)\r
2431                 {\r
2432                     if (sensor_set_contrast(icd, qctrl,ctrl->value) != 0)\r
2433                     {\r
2434                         return -EINVAL;\r
2435                     }\r
2436                     sensor->info_priv.contrast = ctrl->value;\r
2437                 }\r
2438                 break;\r
2439             }\r
2440 #endif\r
2441 #if CONFIG_SENSOR_WhiteBalance\r
2442         case V4L2_CID_DO_WHITE_BALANCE:\r
2443             {\r
2444                 if (ctrl->value != sensor->info_priv.whiteBalance)\r
2445                 {\r
2446                     if (sensor_set_whiteBalance(icd, qctrl,ctrl->value) != 0)\r
2447                     {\r
2448                         return -EINVAL;\r
2449                     }\r
2450                     sensor->info_priv.whiteBalance = ctrl->value;\r
2451                 }\r
2452                 break;\r
2453             }\r
2454 #endif\r
2455 #if CONFIG_SENSOR_Mirror\r
2456         case V4L2_CID_HFLIP:\r
2457             {\r
2458                 if (ctrl->value != sensor->info_priv.mirror)\r
2459                 {\r
2460                     if (sensor_set_mirror(icd, qctrl,ctrl->value) != 0)\r
2461                         return -EINVAL;\r
2462                     sensor->info_priv.mirror = ctrl->value;\r
2463                 }\r
2464                 break;\r
2465             }\r
2466 #endif\r
2467 #if CONFIG_SENSOR_Flip\r
2468         case V4L2_CID_VFLIP:\r
2469             {\r
2470                 if (ctrl->value != sensor->info_priv.flip)\r
2471                 {\r
2472                     if (sensor_set_flip(icd, qctrl,ctrl->value) != 0)\r
2473                         return -EINVAL;\r
2474                     sensor->info_priv.flip = ctrl->value;\r
2475                 }\r
2476                 break;\r
2477             }\r
2478 #endif\r
2479         default:\r
2480             break;\r
2481     }\r
2482 \r
2483     return 0;\r
2484 }\r
2485 static int sensor_g_ext_control(struct soc_camera_device *icd , struct v4l2_ext_control *ext_ctrl)\r
2486 {\r
2487     const struct v4l2_queryctrl *qctrl;\r
2488     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
2489     struct sensor *sensor = to_sensor(client);\r
2490 \r
2491     qctrl = soc_camera_find_qctrl(&sensor_ops, ext_ctrl->id);\r
2492 \r
2493     if (!qctrl)\r
2494     {\r
2495         SENSOR_TR("\n %s ioctrl id = %d  is invalidate \n", SENSOR_NAME_STRING(), ext_ctrl->id);\r
2496         return -EINVAL;\r
2497     }\r
2498 \r
2499     switch (ext_ctrl->id)\r
2500     {\r
2501         case V4L2_CID_SCENE:\r
2502             {\r
2503                 ext_ctrl->value = sensor->info_priv.scene;\r
2504                 break;\r
2505             }\r
2506         case V4L2_CID_EFFECT:\r
2507             {\r
2508                 ext_ctrl->value = sensor->info_priv.effect;\r
2509                 break;\r
2510             }\r
2511         case V4L2_CID_ZOOM_ABSOLUTE:\r
2512             {\r
2513                 ext_ctrl->value = sensor->info_priv.digitalzoom;\r
2514                 break;\r
2515             }\r
2516         case V4L2_CID_ZOOM_RELATIVE:\r
2517             {\r
2518                 return -EINVAL;\r
2519             }\r
2520         case V4L2_CID_FOCUS_ABSOLUTE:\r
2521             {\r
2522                 ext_ctrl->value = sensor->info_priv.focus;\r
2523                 break;\r
2524             }\r
2525         case V4L2_CID_FOCUS_RELATIVE:\r
2526             {\r
2527                 return -EINVAL;\r
2528             }\r
2529         case V4L2_CID_FLASH:\r
2530             {\r
2531                 ext_ctrl->value = sensor->info_priv.flash;\r
2532                 break;\r
2533             }\r
2534         default :\r
2535             break;\r
2536     }\r
2537     return 0;\r
2538 }\r
2539 static int sensor_s_ext_control(struct soc_camera_device *icd, struct v4l2_ext_control *ext_ctrl)\r
2540 {\r
2541     const struct v4l2_queryctrl *qctrl;\r
2542     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
2543     struct sensor *sensor = to_sensor(client);\r
2544     int val_offset;\r
2545 \r
2546     qctrl = soc_camera_find_qctrl(&sensor_ops, ext_ctrl->id);\r
2547 \r
2548     if (!qctrl)\r
2549     {\r
2550         SENSOR_TR("\n %s ioctrl id = %d  is invalidate \n", SENSOR_NAME_STRING(), ext_ctrl->id);\r
2551         return -EINVAL;\r
2552     }\r
2553 \r
2554         val_offset = 0;\r
2555     switch (ext_ctrl->id)\r
2556     {\r
2557 #if CONFIG_SENSOR_Scene\r
2558         case V4L2_CID_SCENE:\r
2559             {\r
2560                 if (ext_ctrl->value != sensor->info_priv.scene)\r
2561                 {\r
2562                     if (sensor_set_scene(icd, qctrl,ext_ctrl->value) != 0)\r
2563                         return -EINVAL;\r
2564                     sensor->info_priv.scene = ext_ctrl->value;\r
2565                 }\r
2566                 break;\r
2567             }\r
2568 #endif\r
2569 #if CONFIG_SENSOR_Effect\r
2570         case V4L2_CID_EFFECT:\r
2571             {\r
2572                 if (ext_ctrl->value != sensor->info_priv.effect)\r
2573                 {\r
2574                     if (sensor_set_effect(icd, qctrl,ext_ctrl->value) != 0)\r
2575                         return -EINVAL;\r
2576                     sensor->info_priv.effect= ext_ctrl->value;\r
2577                 }\r
2578                 break;\r
2579             }\r
2580 #endif\r
2581 #if CONFIG_SENSOR_DigitalZoom\r
2582         case V4L2_CID_ZOOM_ABSOLUTE:\r
2583             {\r
2584                 if ((ext_ctrl->value < qctrl->minimum) || (ext_ctrl->value > qctrl->maximum))\r
2585                     return -EINVAL;\r
2586 \r
2587                 if (ext_ctrl->value != sensor->info_priv.digitalzoom)\r
2588                 {\r
2589                     val_offset = ext_ctrl->value -sensor->info_priv.digitalzoom;\r
2590 \r
2591                     if (sensor_set_digitalzoom(icd, qctrl,&val_offset) != 0)\r
2592                         return -EINVAL;\r
2593                     sensor->info_priv.digitalzoom += val_offset;\r
2594 \r
2595                     SENSOR_DG("%s digitalzoom is %x\n",SENSOR_NAME_STRING(),  sensor->info_priv.digitalzoom);\r
2596                 }\r
2597 \r
2598                 break;\r
2599             }\r
2600         case V4L2_CID_ZOOM_RELATIVE:\r
2601             {\r
2602                 if (ext_ctrl->value)\r
2603                 {\r
2604                     if (sensor_set_digitalzoom(icd, qctrl,&ext_ctrl->value) != 0)\r
2605                         return -EINVAL;\r
2606                     sensor->info_priv.digitalzoom += ext_ctrl->value;\r
2607 \r
2608                     SENSOR_DG("%s digitalzoom is %x\n", SENSOR_NAME_STRING(), sensor->info_priv.digitalzoom);\r
2609                 }\r
2610                 break;\r
2611             }\r
2612 #endif\r
2613 #if CONFIG_SENSOR_Focus\r
2614         case V4L2_CID_FOCUS_ABSOLUTE:\r
2615             {\r
2616                 if ((ext_ctrl->value < qctrl->minimum) || (ext_ctrl->value > qctrl->maximum))\r
2617                     return -EINVAL;\r
2618 \r
2619                 if (ext_ctrl->value != sensor->info_priv.focus)\r
2620                 {\r
2621                     val_offset = ext_ctrl->value -sensor->info_priv.focus;\r
2622 \r
2623                     sensor->info_priv.focus += val_offset;\r
2624                 }\r
2625 \r
2626                 break;\r
2627             }\r
2628         case V4L2_CID_FOCUS_RELATIVE:\r
2629             {\r
2630                 if (ext_ctrl->value)\r
2631                 {\r
2632                     sensor->info_priv.focus += ext_ctrl->value;\r
2633 \r
2634                     SENSOR_DG("%s focus is %x\n", SENSOR_NAME_STRING(), sensor->info_priv.focus);\r
2635                 }\r
2636                 break;\r
2637             }\r
2638 #endif\r
2639 #if CONFIG_SENSOR_Flash\r
2640         case V4L2_CID_FLASH:\r
2641             {\r
2642                 if (sensor_set_flash(icd, qctrl,ext_ctrl->value) != 0)\r
2643                     return -EINVAL;\r
2644                 sensor->info_priv.flash = ext_ctrl->value;\r
2645 \r
2646                 SENSOR_DG("%s flash is %x\n",SENSOR_NAME_STRING(), sensor->info_priv.flash);\r
2647                 break;\r
2648             }\r
2649 #endif\r
2650         default:\r
2651             break;\r
2652     }\r
2653 \r
2654     return 0;\r
2655 }\r
2656 \r
2657 static int sensor_g_ext_controls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ext_ctrl)\r
2658 {\r
2659     struct i2c_client *client = v4l2_get_subdevdata(sd);\r
2660     struct soc_camera_device *icd = client->dev.platform_data;\r
2661     int i, error_cnt=0, error_idx=-1;\r
2662 \r
2663 \r
2664     for (i=0; i<ext_ctrl->count; i++) {\r
2665         if (sensor_g_ext_control(icd, &ext_ctrl->controls[i]) != 0) {\r
2666             error_cnt++;\r
2667             error_idx = i;\r
2668         }\r
2669     }\r
2670 \r
2671     if (error_cnt > 1)\r
2672         error_idx = ext_ctrl->count;\r
2673 \r
2674     if (error_idx != -1) {\r
2675         ext_ctrl->error_idx = error_idx;\r
2676         return -EINVAL;\r
2677     } else {\r
2678         return 0;\r
2679     }\r
2680 }\r
2681 \r
2682 static int sensor_s_ext_controls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ext_ctrl)\r
2683 {\r
2684     struct i2c_client *client = v4l2_get_subdevdata(sd);\r
2685     struct soc_camera_device *icd = client->dev.platform_data;\r
2686     int i, error_cnt=0, error_idx=-1;\r
2687 \r
2688 \r
2689     for (i=0; i<ext_ctrl->count; i++) {\r
2690         if (sensor_s_ext_control(icd, &ext_ctrl->controls[i]) != 0) {\r
2691             error_cnt++;\r
2692             error_idx = i;\r
2693         }\r
2694     }\r
2695 \r
2696     if (error_cnt > 1)\r
2697         error_idx = ext_ctrl->count;\r
2698 \r
2699     if (error_idx != -1) {\r
2700         ext_ctrl->error_idx = error_idx;\r
2701         return -EINVAL;\r
2702     } else {\r
2703         return 0;\r
2704     }\r
2705 }\r
2706 \r
2707 /* Interface active, can use i2c. If it fails, it can indeed mean, that\r
2708  * this wasn't our capture interface, so, we wait for the right one */\r
2709 static int sensor_video_probe(struct soc_camera_device *icd,\r
2710                                struct i2c_client *client)\r
2711 {\r
2712     char value;\r
2713     int ret,pid = 0;\r
2714     struct sensor *sensor = to_sensor(client);\r
2715 \r
2716     /* We must have a parent by now. And it cannot be a wrong one.\r
2717      * So this entire test is completely redundant. */\r
2718     if (!icd->dev.parent ||\r
2719             to_soc_camera_host(icd->dev.parent)->nr != icd->iface)\r
2720                 return -ENODEV;\r
2721 \r
2722         if (sensor_ioctrl(icd, Sensor_PowerDown, 0) < 0) {\r
2723                 ret = -ENODEV;\r
2724                 goto sensor_video_probe_err;\r
2725         }\r
2726 \r
2727     /* soft reset */\r
2728     ret = sensor_write(client, 0xff, 0x1);\r
2729     if (ret != 0) {\r
2730         SENSOR_TR("soft reset %s failed\n",SENSOR_NAME_STRING());\r
2731         ret = -ENODEV;\r
2732                 goto sensor_video_probe_err;\r
2733     }\r
2734     mdelay(5);          //delay 5 microseconds\r
2735 \r
2736     /* check if it is an sensor sensor */\r
2737     ret = sensor_read(client, 0x0a, &value);\r
2738     if (ret != 0) {\r
2739         SENSOR_TR("read chip id high byte failed\n");\r
2740         ret = -ENODEV;\r
2741         goto sensor_video_probe_err;\r
2742     }\r
2743     pid = value << 8;\r
2744 \r
2745     ret = sensor_read(client, 0x0b, &value);\r
2746     if (ret != 0) {\r
2747         SENSOR_TR("read chip id low byte failed\n");\r
2748         ret = -ENODEV;\r
2749         goto sensor_video_probe_err;\r
2750     }\r
2751 \r
2752     pid |= (value & 0xff);\r
2753     SENSOR_DG("\n %s  pid = 0x%x\n", SENSOR_NAME_STRING(), pid);\r
2754 \r
2755     if ((pid == SENSOR_ID)||(pid == SENSOR_ID1)) {\r
2756         sensor->model = SENSOR_V4L2_IDENT;\r
2757     } else {\r
2758         SENSOR_TR("error: %s mismatched   pid = 0x%x\n", SENSOR_NAME_STRING(), pid);\r
2759         ret = -ENODEV;\r
2760         goto sensor_video_probe_err;\r
2761     }\r
2762 \r
2763     return 0;\r
2764 \r
2765 sensor_video_probe_err:\r
2766 \r
2767     return ret;\r
2768 }\r
2769 \r
2770 static long sensor_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)\r
2771 {\r
2772         struct i2c_client *client = v4l2_get_subdevdata(sd);\r
2773     struct soc_camera_device *icd = client->dev.platform_data;  \r
2774     struct sensor *sensor = to_sensor(client);\r
2775     int ret = 0;\r
2776     \r
2777         SENSOR_DG("\n%s..%s..cmd:%x \n",SENSOR_NAME_STRING(),__FUNCTION__,cmd);\r
2778         switch (cmd)\r
2779         {\r
2780                 case RK_CAM_SUBDEV_DEACTIVATE:\r
2781                 {\r
2782                         sensor_deactivate(client);\r
2783                         break;\r
2784                 }\r
2785 \r
2786                 case RK_CAM_SUBDEV_IOREQUEST:\r
2787                 {\r
2788                         sensor->sensor_io_request = (struct rkcamera_platform_data*)arg;           \r
2789             if (sensor->sensor_io_request != NULL) { \r
2790                 if (sensor->sensor_io_request->gpio_res[0].dev_name && \r
2791                     (strcmp(sensor->sensor_io_request->gpio_res[0].dev_name, dev_name(icd->pdev)) == 0)) {\r
2792                     sensor->sensor_gpio_res = (struct rkcamera_gpio_res*)&sensor->sensor_io_request->gpio_res[0];\r
2793                 } else if (sensor->sensor_io_request->gpio_res[1].dev_name && \r
2794                     (strcmp(sensor->sensor_io_request->gpio_res[1].dev_name, dev_name(icd->pdev)) == 0)) {\r
2795                     sensor->sensor_gpio_res = (struct rkcamera_gpio_res*)&sensor->sensor_io_request->gpio_res[1];\r
2796                 }\r
2797             } else {\r
2798                 SENSOR_TR("%s %s RK_CAM_SUBDEV_IOREQUEST fail\n",SENSOR_NAME_STRING(),__FUNCTION__);\r
2799                 ret = -EINVAL;\r
2800                 goto sensor_ioctl_end;\r
2801             }\r
2802             /* 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
2803                for this project */\r
2804             #if CONFIG_SENSOR_Flash     \r
2805                 if (sensor->sensor_gpio_res) { \r
2806                 if (sensor->sensor_gpio_res->gpio_flash == INVALID_GPIO) {\r
2807                     for (i = 0; i < icd->ops->num_controls; i++) {\r
2808                                 if (V4L2_CID_FLASH == icd->ops->controls[i].id) {\r
2809                                         memset((char*)&icd->ops->controls[i],0x00,sizeof(struct v4l2_queryctrl));                                       \r
2810                                 }\r
2811                     }\r
2812                     sensor->info_priv.flash = 0xff;\r
2813                     SENSOR_DG("%s flash gpio is invalidate!\n",SENSOR_NAME_STRING());\r
2814                 }\r
2815                 }\r
2816             #endif\r
2817                         break;\r
2818                 }\r
2819                 default:\r
2820                 {\r
2821                         SENSOR_TR("%s %s cmd(0x%x) is unknown !\n",SENSOR_NAME_STRING(),__FUNCTION__,cmd);\r
2822                         break;\r
2823                 }\r
2824         }\r
2825 \r
2826 sensor_ioctl_end:\r
2827         return ret;\r
2828 \r
2829 }\r
2830 static int sensor_enum_fmt(struct v4l2_subdev *sd, unsigned int index,\r
2831                             enum v4l2_mbus_pixelcode *code)\r
2832 {\r
2833         if (index >= ARRAY_SIZE(sensor_colour_fmts))\r
2834                 return -EINVAL;\r
2835 \r
2836         *code = sensor_colour_fmts[index].code;\r
2837         return 0;\r
2838 }\r
2839 static struct v4l2_subdev_core_ops sensor_subdev_core_ops = {\r
2840         .init           = sensor_init,\r
2841         .g_ctrl         = sensor_g_control,\r
2842         .s_ctrl         = sensor_s_control,\r
2843         .g_ext_ctrls          = sensor_g_ext_controls,\r
2844         .s_ext_ctrls          = sensor_s_ext_controls,\r
2845         .g_chip_ident   = sensor_g_chip_ident,\r
2846         .ioctl = sensor_ioctl,\r
2847 };\r
2848 \r
2849 static struct v4l2_subdev_video_ops sensor_subdev_video_ops = {\r
2850         .s_mbus_fmt     = sensor_s_fmt,\r
2851         .g_mbus_fmt     = sensor_g_fmt,\r
2852         .try_mbus_fmt   = sensor_try_fmt,\r
2853         .enum_mbus_fmt  = sensor_enum_fmt,\r
2854 };\r
2855 \r
2856 static struct v4l2_subdev_ops sensor_subdev_ops = {\r
2857         .core   = &sensor_subdev_core_ops,\r
2858         .video = &sensor_subdev_video_ops,\r
2859 };\r
2860 \r
2861 static int sensor_probe(struct i2c_client *client,\r
2862                          const struct i2c_device_id *did)\r
2863 {\r
2864     struct sensor *sensor;\r
2865     struct soc_camera_device *icd = client->dev.platform_data;\r
2866     struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);\r
2867     struct soc_camera_link *icl;\r
2868     int ret;\r
2869 \r
2870     SENSOR_DG("\n%s..%s..%d..\n",__FUNCTION__,__FILE__,__LINE__);\r
2871     if (!icd) {\r
2872         dev_err(&client->dev, "%s: missing soc-camera data!\n",SENSOR_NAME_STRING());\r
2873         return -EINVAL;\r
2874     }\r
2875 \r
2876     icl = to_soc_camera_link(icd);\r
2877     if (!icl) {\r
2878         dev_err(&client->dev, "%s driver needs platform data\n", SENSOR_NAME_STRING());\r
2879         return -EINVAL;\r
2880     }\r
2881 \r
2882     if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) {\r
2883         dev_warn(&adapter->dev,\r
2884                  "I2C-Adapter doesn't support I2C_FUNC_I2C\n");\r
2885         return -EIO;\r
2886     }\r
2887 \r
2888     sensor = kzalloc(sizeof(struct sensor), GFP_KERNEL);\r
2889     if (!sensor)\r
2890         return -ENOMEM;\r
2891 \r
2892     v4l2_i2c_subdev_init(&sensor->subdev, client, &sensor_subdev_ops);\r
2893 \r
2894     /* Second stage probe - when a capture adapter is there */\r
2895     icd->ops            = &sensor_ops;\r
2896     sensor->info_priv.fmt = sensor_colour_fmts[0];\r
2897         #if CONFIG_SENSOR_I2C_NOSCHED\r
2898         atomic_set(&sensor->tasklock_cnt,0);\r
2899         #endif\r
2900 \r
2901     ret = sensor_video_probe(icd, client);\r
2902     if (ret < 0) {\r
2903         icd->ops = NULL;\r
2904         i2c_set_clientdata(client, NULL);\r
2905         kfree(sensor);\r
2906                 sensor = NULL;\r
2907     }\r
2908     SENSOR_DG("\n%s..%s..%d  ret = %x \n",__FUNCTION__,__FILE__,__LINE__,ret);\r
2909     return ret;\r
2910 }\r
2911 \r
2912 static int sensor_remove(struct i2c_client *client)\r
2913 {\r
2914     struct sensor *sensor = to_sensor(client);\r
2915     struct soc_camera_device *icd = client->dev.platform_data;\r
2916 \r
2917     icd->ops = NULL;\r
2918     i2c_set_clientdata(client, NULL);\r
2919     client->driver = NULL;\r
2920     kfree(sensor);\r
2921         sensor = NULL;\r
2922     return 0;\r
2923 }\r
2924 \r
2925 static const struct i2c_device_id sensor_id[] = {\r
2926         {SENSOR_NAME_STRING(), 0 },\r
2927         { }\r
2928 };\r
2929 MODULE_DEVICE_TABLE(i2c, sensor_id);\r
2930 \r
2931 static struct i2c_driver sensor_i2c_driver = {\r
2932         .driver = {\r
2933                 .name = SENSOR_NAME_STRING(),\r
2934         },\r
2935         .probe          = sensor_probe,\r
2936         .remove         = sensor_remove,\r
2937         .id_table       = sensor_id,\r
2938 };\r
2939 \r
2940 static int __init sensor_mod_init(void)\r
2941 {\r
2942     SENSOR_DG("\n%s..%s.. \n",__FUNCTION__,SENSOR_NAME_STRING());\r
2943     return i2c_add_driver(&sensor_i2c_driver);\r
2944 }\r
2945 \r
2946 static void __exit sensor_mod_exit(void)\r
2947 {\r
2948     i2c_del_driver(&sensor_i2c_driver);\r
2949 }\r
2950 \r
2951 device_initcall_sync(sensor_mod_init);\r
2952 module_exit(sensor_mod_exit);\r
2953 \r
2954 MODULE_DESCRIPTION(SENSOR_NAME_STRING(Camera sensor driver));\r
2955 MODULE_AUTHOR("ddl <kernel@rock-chips>");\r
2956 MODULE_LICENSE("GPL");\r