Merge remote-tracking branch 'origin/upstream/linux-linaro-lsk-v3.10-android+android...
[firefly-linux-kernel-4.4.55.git] / drivers / media / video / nt99160_2way.c
1 \r
2 #include "generic_sensor.h"\r
3 \r
4 /*
5 *      Driver Version Note\r
6 *v0.0.1: this driver is compatible with generic_sensor\r
7 *v0.1.1:\r
8 *        add sensor_focus_af_const_pause_usr_cb;\r
9 */\r
10 static int version = KERNEL_VERSION(0,1,1);\r
11 module_param(version, int, S_IRUGO);\r
12 \r
13 static int debug =1;\r
14 module_param(debug, int, S_IRUGO|S_IWUSR);\r
15 \r
16 #define dprintk(level, fmt, arg...) do {                        \\r
17         if (debug >= level)                                     \\r
18         printk(KERN_WARNING fmt , ## arg); } while (0)\r
19 \r
20 /* Sensor Driver Configuration Begin */\r
21 //define sensor_i2c_slave_id 0x54\r
22 #define SENSOR_NAME RK29_CAM_SENSOR_NT99160\r
23 #define SENSOR_V4L2_IDENT V4L2_IDENT_NT99160\r
24 #define SENSOR_ID 0x1600\r
25 #define SENSOR_BUS_PARAM  (SOCAM_MASTER | SOCAM_PCLK_SAMPLE_RISING |\\r
26                           SOCAM_HSYNC_ACTIVE_HIGH | SOCAM_VSYNC_ACTIVE_HIGH|\\r
27                           SOCAM_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8  |SOCAM_MCLK_24MHZ)\r
28 \r
29 #define SENSOR_PREVIEW_W                     800\r
30 #define SENSOR_PREVIEW_H                     600\r
31 #define SENSOR_PREVIEW_FPS                   15000     // 15fps \r
32 #define SENSOR_FULLRES_L_FPS                 5000      // 5fps\r
33 #define SENSOR_FULLRES_M_FPS                 10000      // 5fps\r
34 #define SENSOR_FULLRES_H_FPS                 15000      // 15-20fps\r
35 #define SENSOR_720P_FPS                      5000\r
36 #define SENSOR_1080P_FPS                     0\r
37 \r
38 #define SENSOR_REGISTER_LEN                  2         // sensor register address bytes\r
39 #define SENSOR_VALUE_LEN                     1         // sensor register value bytes\r
40 \r
41 static unsigned int SensorConfiguration = 0;\r
42 static unsigned int SensorChipID[] = {SENSOR_ID};\r
43 \r
44 /* Sensor Driver Configuration End */\r
45 \r
46 \r
47 #define SENSOR_NAME_STRING(a) STR(CONS(SENSOR_NAME, a))\r
48 #define SENSOR_NAME_VARFUN(a) CONS(SENSOR_NAME, a)\r
49 \r
50 #define SensorRegVal(a,b) CONS4(SensorReg,SENSOR_REGISTER_LEN,Val,SENSOR_VALUE_LEN)(a,b)\r
51 #define sensor_write(client,reg,v) CONS4(sensor_write_reg,SENSOR_REGISTER_LEN,val,SENSOR_VALUE_LEN)(client,(reg),(v))\r
52 #define sensor_read(client,reg,v) CONS4(sensor_read_reg,SENSOR_REGISTER_LEN,val,SENSOR_VALUE_LEN)(client,(reg),(v))\r
53 #define sensor_write_array generic_sensor_write_array\r
54 \r
55 struct sensor_parameter\r
56 {\r
57         unsigned int PreviewDummyPixels;\r
58         unsigned int CaptureDummyPixels;\r
59         unsigned int preview_exposure;\r
60         unsigned short int preview_line_width;\r
61         unsigned short int preview_gain;\r
62 \r
63         unsigned short int PreviewPclk;\r
64         unsigned short int CapturePclk;\r
65         char awb[6];\r
66 };\r
67 \r
68 struct specific_sensor{\r
69         struct generic_sensor common_sensor;\r
70         //define user data below\r
71         struct sensor_parameter parameter;\r
72 \r
73 };\r
74 \r
75 /*\r
76 *  The follow setting need been filled.\r
77 *  \r
78 *  Must Filled:\r
79 *  sensor_init_data :               Sensor initial setting;\r
80 *  sensor_fullres_lowfps_data :     Sensor full resolution setting with best auality, recommand for video;\r
81 *  sensor_preview_data :            Sensor preview resolution setting, recommand it is vga or svga;\r
82 *  sensor_softreset_data :          Sensor software reset register;\r
83 *  sensor_check_id_data :           Sensir chip id register;\r
84 *\r
85 *  Optional filled:\r
86 *  sensor_fullres_highfps_data:     Sensor full resolution setting with high framerate, recommand for video;\r
87 *  sensor_720p:                     Sensor 720p setting, it is for video;\r
88 *  sensor_1080p:                    Sensor 1080p setting, it is for video;\r
89 *\r
90 *  :::::WARNING:::::\r
91 *  The SensorEnd which is the setting end flag must be filled int the last of each setting;\r
92 */\r
93 \r
94 /* Sensor initial setting */\r
95 static struct rk_sensor_reg sensor_init_data[] ={\r
96         {0x3100, 0x03},\r
97         {0x3101, 0x80},\r
98         {0x3102, 0x09},\r
99         {0x3104, 0x03},\r
100         {0x3105, 0x03},\r
101         {0x3106, 0x05},\r
102         {0x3107, 0x40},\r
103         {0x3108, 0x00},\r
104         {0x3109, 0x82},\r
105         {0x310A, 0x04},\r
106         {0x310B, 0x00},\r
107         {0x310C, 0x00},\r
108         {0x3111, 0x56},\r
109         {0x3113, 0x66},\r
110         {0x3118, 0xA7},\r
111         {0x3119, 0xA7},\r
112         {0x311A, 0xA7},\r
113         {0x311B, 0x1F},           \r
114         {0x303f, 0x0e},\r
115         {0x3041, 0x04},\r
116         {0x3051, 0xf4},\r
117         {0x320A, 0x5A},\r
118         {0x3250, 0x80},   \r
119         {0x3251, 0x01},\r
120         {0x3252, 0x38},\r
121         {0x3253, 0xA8},\r
122         {0x3254, 0x01},\r
123         {0x3255, 0x00},\r
124         {0x3256, 0x8C},\r
125         {0x3257, 0x70},\r
126         {0x329B, 0x00},\r
127         {0x32A1, 0x00},\r
128         {0x32A2, 0xd8},\r
129         {0x32A3, 0x01},\r
130         {0x32A4, 0x5d},\r
131         {0x32A5, 0x01},\r
132         {0x32A6, 0x0c},\r
133         {0x32A7, 0x01},\r
134         {0x32A8, 0xa8}, \r
135         {0x3210, 0x32},   \r
136         {0x3211, 0x2a},\r
137         {0x3212, 0x30},\r
138         {0x3213, 0x32},\r
139         {0x3214, 0x2e},\r
140         {0x3215, 0x2e},\r
141         {0x3216, 0x2e},\r
142         {0x3217, 0x2e},\r
143         {0x3218, 0x2c},\r
144         {0x3219, 0x2e},\r
145         {0x321A, 0x2a},\r
146         {0x321B, 0x2a},\r
147         {0x321C, 0x2e},\r
148         {0x321D, 0x2e},\r
149         {0x321E, 0x28},\r
150         {0x321F, 0x2c},   \r
151         {0x3220, 0x01},\r
152         {0x3221, 0x48},\r
153         {0x3222, 0x01},\r
154         {0x3223, 0x48},\r
155         {0x3224, 0x01},\r
156         {0x3225, 0x48},\r
157         {0x3226, 0x01},\r
158         {0x3227, 0x48},\r
159         {0x3228, 0x00},\r
160         {0x3229, 0xa4},\r
161         {0x322A, 0x00},\r
162         {0x322B, 0xa4},\r
163         {0x322C, 0x00},\r
164         {0x322D, 0xa4},\r
165         {0x322E, 0x00},\r
166         {0x322F, 0xa4},\r
167         {0x3243, 0xc2}, \r
168         {0x3270, 0x10},\r
169         {0x3271, 0x1B},\r
170         {0x3272, 0x26},\r
171         {0x3273, 0x3E},\r
172         {0x3274, 0x4F},\r
173         {0x3275, 0x5E},\r
174         {0x3276, 0x78},\r
175         {0x3277, 0x8F},\r
176         {0x3278, 0xA3},\r
177         {0x3279, 0xB4},\r
178         {0x327A, 0xD2},\r
179         {0x327B, 0xE3},\r
180         {0x327C, 0xF0},\r
181         {0x327D, 0xF7},\r
182         {0x327E, 0xFF}, \r
183         {0x32F6, 0x0C},\r
184         {0x33c2, 0xF0},\r
185         {0x3302, 0x00},\r
186         {0x3303, 0x3E},\r
187         {0x3304, 0x00},\r
188         {0x3305, 0xC2},\r
189         {0x3306, 0x00},\r
190         {0x3307, 0x00},\r
191         {0x3308, 0x07},\r
192         {0x3309, 0xC4},\r
193         {0x330A, 0x06},\r
194         {0x330B, 0xED},\r
195         {0x330C, 0x01},\r
196         {0x330D, 0x4F},\r
197         {0x330E, 0x01},\r
198         {0x330F, 0x41},\r
199         {0x3310, 0x06},\r
200         {0x3311, 0xDD},\r
201         {0x3312, 0x07},\r
202         {0x3313, 0xE3}, \r
203         {0x3326, 0x14},\r
204         {0x3327, 0x04},\r
205         {0x3328, 0x04},\r
206         {0x3329, 0x02},\r
207         {0x332A, 0x02},\r
208         {0x332B, 0x1D},\r
209         {0x332C, 0x1D},\r
210         {0x332D, 0x04},\r
211         {0x332E, 0x1E},\r
212         {0x332F, 0x1F}, \r
213         {0x3331, 0x0a},\r
214         {0x3332, 0x40},\r
215         {0x33C9, 0xD8},\r
216         {0x33C0, 0x01},\r
217         {0x333F, 0x07},\r
218         {0x3360, 0x10},\r
219         {0x3361, 0x18},\r
220         {0x3362, 0x1f},\r
221         {0x3363, 0xb3},          \r
222         {0x3368, 0xb0},\r
223         {0x3369, 0xa0},\r
224         {0x336A, 0x90},\r
225         {0x336B, 0x80},\r
226         {0x336C, 0x00},\r
227         {0x3363, 0xB3},\r
228         {0x3364, 0x00},\r
229         {0x3365, 0x10},\r
230         {0x3366, 0x06},          \r
231         {0x336d, 0x18},\r
232         {0x336e, 0x18},\r
233         {0x336f, 0x10},\r
234         {0x3370, 0x10},                      \r
235         {0x3371, 0x3F},\r
236         {0x3372, 0x3F},\r
237         {0x3373, 0x3F},\r
238         {0x3374, 0x3F},\r
239         {0x3375, 0x20},\r
240         {0x3376, 0x20},\r
241         {0x3377, 0x28},\r
242         {0x3378, 0x30},                      \r
243         {0x32f6, 0x0C},\r
244         {0x33A0, 0xE0},\r
245         {0x33A1, 0x20},\r
246         {0x33A2, 0x00},\r
247         {0x33A3, 0x40},\r
248         {0x33A4, 0x00},\r
249         {0x32BF, 0x60},\r
250         SensorEnd\r
251 };\r
252 \r
253 static struct rk_sensor_reg sensor_fullres_lowfps_data[] ={\r
254         {0x32BF, 0x60},\r
255         {0x32C0, 0x84},\r
256         {0x32C1, 0x84},\r
257         {0x32C2, 0x84},\r
258         {0x32C3, 0x00},\r
259         {0x32C4, 0x20},\r
260         {0x32C5, 0x20},\r
261         {0x32C6, 0x20},\r
262         {0x32C7, 0x00},\r
263         {0x32C8, 0x95},\r
264         {0x32C9, 0x84},\r
265         {0x32CA, 0xA4},\r
266         {0x32CB, 0xA4},\r
267         {0x32CC, 0xA4},\r
268         {0x32CD, 0xA4},\r
269         {0x32DB, 0x72},\r
270         {0x3241, 0x8B},\r
271         {0x32F0, 0x00},\r
272         {0x3200, 0x3E},\r
273         {0x3201, 0x0F},\r
274         {0x302A, 0x00},\r
275         {0x302C, 0x07},\r
276         {0x302D, 0x00},\r
277         {0x302E, 0x00},\r
278         {0x302F, 0x02},\r
279         {0x3022, 0x24},\r
280         {0x3023, 0x24},\r
281         {0x3002, 0x00},\r
282         {0x3003, 0x04},//x_start=4\r
283         {0x3004, 0x00},\r
284         {0x3005, 0x04},//y_start=4\r
285         {0x3006, 0x05},\r
286         {0x3007, 0x03},//x_end =1283\r
287         {0x3008, 0x02},\r
288         {0x3009, 0xD3},//y_end =723\r
289         {0x300A, 0x06},\r
290         {0x300B, 0x48},//pixel_num=1608\r
291         {0x300C, 0x0B},\r
292         {0x300D, 0xA9},//line_num=2985\r
293         {0x300E, 0x05},\r
294         {0x300F, 0x00},//x_width = 1280\r
295         {0x3010, 0x02},\r
296         {0x3011, 0xD0},//y_height=720\r
297         {0x32B8, 0x3F},\r
298         {0x32B9, 0x31},\r
299         {0x32BB, 0x87},\r
300         {0x32BC, 0x38},\r
301         {0x32BD, 0x3C},\r
302         {0x32BE, 0x34},\r
303         {0x3201, 0x3F},\r
304         {0x3109, 0x82},\r
305         {0x310B, 0x00},\r
306         {0x3530, 0xC0},\r
307         {0x3021, 0x06},\r
308         {0x3060, 0x01},\r
309         SensorEnd\r
310 };\r
311 \r
312 \r
313 /* Senor full resolution setting: recommand for capture */\r
314 #if 0\r
315 static struct rk_sensor_reg sensor_fullres_midfps_data[] ={\r
316         {0x32BF, 0x60},\r
317         {0x32C0, 0x74},\r
318         {0x32C1, 0x74},\r
319         {0x32C2, 0x74},\r
320         {0x32C3, 0x00},\r
321         {0x32C4, 0x20},\r
322         {0x32C5, 0x20},\r
323         {0x32C6, 0x20},\r
324         {0x32C7, 0x00},\r
325         {0x32C8, 0x95},\r
326         {0x32C9, 0x74},\r
327         {0x32CA, 0x94},\r
328         {0x32CB, 0x94},\r
329         {0x32CC, 0x94},\r
330         {0x32CD, 0x94},\r
331         {0x32DB, 0x72},\r
332         {0x3241, 0x83},\r
333         {0x32F0, 0x00},\r
334         {0x3200, 0x3E},\r
335         {0x3201, 0x0F},\r
336         {0x302A, 0x00},\r
337         {0x302C, 0x07},\r
338         {0x302D, 0x00},\r
339         {0x302E, 0x00},\r
340         {0x302F, 0x02},\r
341         {0x3022, 0x27},\r
342         {0x3023, 0x24},\r
343         {0x3002, 0x00},\r
344         {0x3003, 0x04},//x_start=4\r
345         {0x3004, 0x00},\r
346         {0x3005, 0x04},//y_start=4\r
347         {0x3006, 0x05},\r
348         {0x3007, 0x03},//x_end = 1283\r
349         {0x3008, 0x02},\r
350         {0x3009, 0xD3},//y_end =723\r
351         {0x300A, 0x06},\r
352         {0x300B, 0x48},//pixel_num = 1608\r
353         {0x300C, 0x05},\r
354         {0x300D, 0xD4},//line_num = 1492\r
355         {0x300E, 0x05},\r
356         {0x300F, 0x00},//x_width = 1280\r
357         {0x3010, 0x02},\r
358         {0x3011, 0xD0},//y_height=720\r
359         {0x32B8, 0x3F},\r
360         {0x32B9, 0x31},\r
361         {0x32BB, 0x87},\r
362         {0x32BC, 0x38},\r
363         {0x32BD, 0x3C},\r
364         {0x32BE, 0x34},\r
365         {0x3201, 0x3F},\r
366         {0x3109, 0x82},\r
367         {0x310B, 0x00},\r
368         {0x3530, 0xC0},\r
369         {0x3021, 0x06},\r
370         {0x3060, 0x01},\r
371         SensorEnd\r
372 };\r
373 #endif\r
374 /* Senor full resolution setting: recommand for video */\r
375 static struct rk_sensor_reg sensor_fullres_highfps_data[] ={\r
376         {0x32BF, 0x60},\r
377         {0x32C0, 0x6A},\r
378         {0x32C1, 0x6A},\r
379         {0x32C2, 0x6A},\r
380         {0x32C3, 0x00},\r
381         {0x32C4, 0x20},\r
382         {0x32C5, 0x20},\r
383         {0x32C6, 0x20},\r
384         {0x32C7, 0x00},\r
385         {0x32C8, 0x95},\r
386         {0x32C9, 0x6A},\r
387         {0x32CA, 0x8A},\r
388         {0x32CB, 0x8A},\r
389         {0x32CC, 0x8A},\r
390         {0x32CD, 0x8A},\r
391         {0x32DB, 0x72},\r
392         {0x3241, 0x7E},\r
393         {0x32F0, 0x00},\r
394         {0x3200, 0x3E},\r
395         {0x3201, 0x0F},\r
396         {0x302A, 0x00},\r
397         {0x302C, 0x07},\r
398         {0x302D, 0x00},\r
399         {0x302E, 0x00},\r
400         {0x302F, 0x02},\r
401         {0x3022, 0x27},\r
402         {0x3023, 0x24},\r
403         {0x3002, 0x00},\r
404         {0x3003, 0x04},//x_start=4\r
405         {0x3004, 0x00},\r
406         {0x3005, 0x04},//y_start=4\r
407         {0x3006, 0x05},\r
408         {0x3007, 0x03},//x_end=1283  x_width=1280\r
409         {0x3008, 0x02},\r
410         {0x3009, 0xD3},//y_end=723        y_height=720\r
411         {0x300A, 0x06},\r
412         {0x300B, 0x48},//line_pixel_num =1608\r
413         {0x300C, 0x02},\r
414         {0x300D, 0xEA},//line_num=746\r
415         {0x300E, 0x05},\r
416         {0x300F, 0x00},//x_width = 1280\r
417         {0x3010, 0x02},\r
418         {0x3011, 0xD0},//y_height = 720\r
419         {0x32B8, 0x3F},\r
420         {0x32B9, 0x31},\r
421         {0x32BB, 0x87},\r
422         {0x32BC, 0x38},\r
423         {0x32BD, 0x3C},\r
424         {0x32BE, 0x34},\r
425         {0x3201, 0x3F},\r
426         {0x3109, 0x82},\r
427         {0x310B, 0x00},\r
428         {0x3530, 0xC0},\r
429         {0x3021, 0x06},\r
430         {0x3060, 0x01}, \r
431         SensorEnd\r
432 };\r
433 /* Preview resolution setting*/\r
434 static struct rk_sensor_reg sensor_preview_data[] =\r
435 {\r
436         {0x32BF, 0x60},\r
437         {0x32C0, 0x6A},\r
438         {0x32C1, 0x6A},\r
439         {0x32C2, 0x6A},\r
440         {0x32C3, 0x00},\r
441         {0x32C4, 0x20},\r
442         {0x32C5, 0x20},\r
443         {0x32C6, 0x20},\r
444         {0x32C7, 0x00},\r
445         {0x32C8, 0xBA},\r
446         {0x32C9, 0x6A},\r
447         {0x32CA, 0x8A},\r
448         {0x32CB, 0x8A},\r
449         {0x32CC, 0x8A},\r
450         {0x32CD, 0x8A},\r
451         {0x32DB, 0x77},\r
452         {0x3241, 0x80},\r
453         {0x32E0, 0x03},\r
454         {0x32E1, 0x20},\r
455         {0x32E2, 0x02},\r
456         {0x32E3, 0x58},\r
457         {0x32E4, 0x00},\r
458         {0x32E5, 0x33},\r
459         {0x32E6, 0x00},\r
460         {0x32E7, 0x33},\r
461         {0x32E8, 0x01},\r
462         {0x32F0, 0x00},\r
463         {0x3200, 0x3E},\r
464         {0x3201, 0x0F},\r
465         {0x302A, 0x00},\r
466         {0x302C, 0x07},\r
467         {0x302D, 0x00},\r
468         {0x302E, 0x00},\r
469         {0x302F, 0x02},\r
470         {0x3022, 0x24},\r
471         {0x3023, 0x24},\r
472         {0x3002, 0x00},\r
473         {0x3003, 0xA4},//x_start=164\r
474         {0x3004, 0x00},\r
475         {0x3005, 0x04},//y_start=4\r
476         {0x3006, 0x04},\r
477         {0x3007, 0x63},//x_end=1123\r
478         {0x3008, 0x02},\r
479         {0x3009, 0xD3},//y_end=723\r
480         {0x300A, 0x05},\r
481         {0x300B, 0x08},//pixel_num=1288\r
482         {0x300C, 0x02},\r
483         {0x300D, 0xE0},//line_num=736\r
484         {0x300E, 0x03},\r
485         {0x300F, 0xC0},//x_width=960\r
486         {0x3010, 0x02},\r
487         {0x3011, 0xD0},//y_height=720\r
488         {0x32B8, 0x3F},\r
489         {0x32B9, 0x31},\r
490         {0x32BB, 0x87},\r
491         {0x32BC, 0x38},\r
492         {0x32BD, 0x3C},\r
493         {0x32BE, 0x34},\r
494         {0x3201, 0x7F},\r
495         {0x3109, 0x82},\r
496         {0x310B, 0x00},\r
497         {0x3530, 0xC0},\r
498         {0x3021, 0x06},\r
499         {0x3060, 0x01},\r
500 \r
501         SensorEnd\r
502 };\r
503 /* 1280x720 */\r
504 static struct rk_sensor_reg sensor_720p[]={\r
505         \r
506         {0x32BF, 0x60},\r
507         {0x32C0, 0x84},\r
508         {0x32C1, 0x84},\r
509         {0x32C2, 0x84},\r
510         {0x32C3, 0x00},\r
511         {0x32C4, 0x20},\r
512         {0x32C5, 0x20},\r
513         {0x32C6, 0x20},\r
514         {0x32C7, 0x00},\r
515         {0x32C8, 0x95},\r
516         {0x32C9, 0x84},\r
517         {0x32CA, 0xA4},\r
518         {0x32CB, 0xA4},\r
519         {0x32CC, 0xA4},\r
520         {0x32CD, 0xA4},\r
521         {0x32DB, 0x72},\r
522         {0x3241, 0x8B},\r
523         {0x32F0, 0x00},\r
524         {0x3200, 0x3E},\r
525         {0x3201, 0x0F},\r
526         {0x302A, 0x00},\r
527         {0x302C, 0x07},\r
528         {0x302D, 0x00},\r
529         {0x302E, 0x00},\r
530         {0x302F, 0x02},\r
531         {0x3022, 0x24},\r
532         {0x3023, 0x24},\r
533         {0x3002, 0x00},\r
534         {0x3003, 0x04},//x_start=4\r
535         {0x3004, 0x00},\r
536         {0x3005, 0x04},//y_start=4\r
537         {0x3006, 0x05},\r
538         {0x3007, 0x03},//x_end =1283\r
539         {0x3008, 0x02},\r
540         {0x3009, 0xD3},//y_end =723\r
541         {0x300A, 0x06},\r
542         {0x300B, 0x48},//pixel_num=1608\r
543         {0x300C, 0x0B},\r
544         {0x300D, 0xA9},//line_num=2985\r
545         {0x300E, 0x05},\r
546         {0x300F, 0x00},//x_width = 1280\r
547         {0x3010, 0x02},\r
548         {0x3011, 0xD0},//y_height=720\r
549         {0x32B8, 0x3F},\r
550         {0x32B9, 0x31},\r
551         {0x32BB, 0x87},\r
552         {0x32BC, 0x38},\r
553         {0x32BD, 0x3C},\r
554         {0x32BE, 0x34},\r
555         {0x3201, 0x3F},\r
556         {0x3109, 0x82},\r
557         {0x310B, 0x00},\r
558         {0x3530, 0xC0},\r
559         {0x3021, 0x06},\r
560         {0x3060, 0x01},\r
561         SensorEnd\r
562 };\r
563 \r
564 /* 1920x1080 */\r
565 static struct rk_sensor_reg sensor_1080p[]={\r
566         SensorEnd\r
567 };\r
568 \r
569 \r
570 static struct rk_sensor_reg sensor_softreset_data[]={\r
571     SensorRegVal(0x3021,0x61),\r
572         SensorEnd\r
573 };\r
574 \r
575 static struct rk_sensor_reg sensor_check_id_data[]={\r
576     SensorRegVal(0x3000,0),\r
577     SensorRegVal(0x3001,0),\r
578         SensorEnd\r
579 };\r
580 /*\r
581 *  The following setting must been filled, if the function is turn on by CONFIG_SENSOR_xxxx\r
582 */\r
583 static struct rk_sensor_reg sensor_WhiteB_Auto[]=\r
584 {\r
585         {0x3201, 0x3F},\r
586         SensorEnd\r
587 };\r
588 /* Cloudy Colour Temperature : 6500K - 8000K  */\r
589 static  struct rk_sensor_reg sensor_WhiteB_Cloudy[]=\r
590 {\r
591         {0x3201, 0x2F},\r
592         {0x3290, 0x01},\r
593         {0x3291, 0x51},\r
594         {0x3296, 0x01},\r
595         {0x3297, 0x00},\r
596         {0x3060, 0x01},\r
597         SensorEnd\r
598 };\r
599 /* ClearDay Colour Temperature : 5000K - 6500K  */\r
600 static  struct rk_sensor_reg sensor_WhiteB_ClearDay[]=\r
601 {       \r
602         {0x3201, 0x2F},\r
603         {0x3290, 0x01},\r
604         {0x3291, 0x38},\r
605         {0x3296, 0x01},\r
606         {0x3297, 0x68},  \r
607         {0x3060, 0x01},  \r
608         SensorEnd\r
609 };\r
610 /* Office Colour Temperature : 3500K - 5000K  */\r
611 static  struct rk_sensor_reg sensor_WhiteB_TungstenLamp1[]=\r
612 {\r
613         //INCANDESCENCE \r
614         {0x3201, 0x2F},\r
615         {0x3290, 0x01},\r
616         {0x3291, 0x30},\r
617         {0x3296, 0x01},\r
618         {0x3297, 0xCB},\r
619         {0x3060, 0x01},\r
620         SensorEnd\r
621 };\r
622 /* Home Colour Temperature : 2500K - 3500K      */\r
623 static  struct rk_sensor_reg sensor_WhiteB_TungstenLamp2[]=\r
624 {\r
625         //FLUORESCENT]\r
626         {0x3201, 0x2F},\r
627         {0x3290, 0x01},\r
628         {0x3291, 0x70},\r
629         {0x3296, 0x01},\r
630         {0x3297, 0xFF},\r
631         {0x3060, 0x01},\r
632         SensorEnd\r
633 };\r
634 \r
635 /* Home Colour Temperature : 2500K - 3500K      */\r
636 static  struct rk_sensor_reg sensor_WhiteB_TungstenLamp3[]=\r
637 {\r
638         //TUNGSTEN]\r
639         {0x3201, 0x2F},\r
640         {0x3290, 0x01},\r
641         {0x3291, 0x00},\r
642         {0x3296, 0x02},\r
643         {0x3297, 0x30},\r
644         {0x3060, 0x01},\r
645         SensorEnd\r
646 };\r
647 \r
648 static struct rk_sensor_reg *sensor_WhiteBalanceSeqe[] = {sensor_WhiteB_Auto, sensor_WhiteB_TungstenLamp1,sensor_WhiteB_TungstenLamp2,\r
649         sensor_WhiteB_ClearDay, sensor_WhiteB_Cloudy,sensor_WhiteB_TungstenLamp3,NULL,\r
650 };\r
651 \r
652 static  struct rk_sensor_reg sensor_Brightness0[]=\r
653 {\r
654         // Brightness -2\r
655         SensorEnd\r
656 };\r
657 \r
658 static  struct rk_sensor_reg sensor_Brightness1[]=\r
659 {\r
660         // Brightness -1\r
661 \r
662         SensorEnd\r
663 };\r
664 \r
665 static  struct rk_sensor_reg sensor_Brightness2[]=\r
666 {\r
667         //      Brightness 0\r
668 \r
669         SensorEnd\r
670 };\r
671 \r
672 static  struct rk_sensor_reg sensor_Brightness3[]=\r
673 {\r
674         // Brightness +1\r
675 \r
676         SensorEnd\r
677 };\r
678 \r
679 static  struct rk_sensor_reg sensor_Brightness4[]=\r
680 {\r
681         //      Brightness +2\r
682 \r
683         SensorEnd\r
684 };\r
685 \r
686 static  struct rk_sensor_reg sensor_Brightness5[]=\r
687 {\r
688         //      Brightness +3\r
689 \r
690         SensorEnd\r
691 };\r
692 static struct rk_sensor_reg *sensor_BrightnessSeqe[] = {sensor_Brightness0, sensor_Brightness1, sensor_Brightness2, sensor_Brightness3,\r
693         sensor_Brightness4, sensor_Brightness5,NULL,\r
694 };\r
695 \r
696 static  struct rk_sensor_reg sensor_Effect_Normal[] =\r
697 {\r
698         {0x32F1, 0x00},\r
699         {0x32F4, 0x80},\r
700         {0x32F5, 0x80},\r
701         SensorEnd\r
702 };\r
703 \r
704 static  struct rk_sensor_reg sensor_Effect_WandB[] =\r
705 {       \r
706         //Grayscale\r
707         {0x32F1, 0x01},\r
708         {0x32F6, 0X08},\r
709         SensorEnd\r
710 };\r
711 \r
712 static  struct rk_sensor_reg sensor_Effect_Sepia[] =\r
713 {\r
714         //Sepia\r
715         {0x32F1, 0x02},\r
716         SensorEnd\r
717 };\r
718 \r
719 static  struct rk_sensor_reg sensor_Effect_Inverse[] =\r
720 {\r
721         //Inverse\r
722         {0x32F1, 0x03}, \r
723         SensorEnd\r
724 };\r
725 static  struct rk_sensor_reg sensor_Effect_Bluish[] =\r
726 {\r
727         // Bluish\r
728         {0x32F1, 0x05},\r
729         {0x32F4, 0xF0},\r
730         {0x32F5, 0x80},\r
731         SensorEnd\r
732 };\r
733 \r
734 static  struct rk_sensor_reg sensor_Effect_Green[] =\r
735 {\r
736         //Greenish\r
737         {0x32F1, 0x05},\r
738         {0x32F4, 0x60},\r
739         {0x32F5, 0x20},\r
740         SensorEnd\r
741 };\r
742 \r
743 static  struct rk_sensor_reg sensor_Effect_Solarization[] =\r
744 {\r
745         //Solarization\r
746         {0x32F1, 0x04},\r
747         SensorEnd\r
748 };\r
749 \r
750 \r
751 static struct rk_sensor_reg *sensor_EffectSeqe[] = {sensor_Effect_Normal, sensor_Effect_WandB, sensor_Effect_Inverse,sensor_Effect_Sepia,\r
752         sensor_Effect_Bluish,sensor_Effect_Green,sensor_Effect_Solarization, NULL,\r
753 };\r
754 \r
755 static  struct rk_sensor_reg sensor_Exposure04[]=\r
756 {\r
757         //[EV-4]                                \r
758         {0x32F6, 0X0C},\r
759         {0x32F2, 0x40},\r
760         SensorEnd\r
761 };\r
762 \r
763 \r
764 static  struct rk_sensor_reg sensor_Exposure03[]=\r
765 {\r
766         //[EV-3]                                \r
767         {0x32F6, 0X0C},\r
768         {0x32F2, 0x50},\r
769         SensorEnd\r
770 };\r
771 \r
772 static  struct rk_sensor_reg sensor_Exposure02[]=\r
773 {\r
774         //[EV-2]                                \r
775         {0x32F6, 0X0C},\r
776         {0x32F2, 0x60},\r
777         SensorEnd\r
778 };\r
779 \r
780 static  struct rk_sensor_reg sensor_Exposure01[]=\r
781 {\r
782         //[EV-1]                                \r
783         {0x32F6, 0X0C},\r
784         {0x32F2, 0x70},\r
785         SensorEnd\r
786 };\r
787 \r
788 static  struct rk_sensor_reg sensor_Exposure00[]=\r
789 {\r
790         //[EV+0]                                \r
791         {0x32F6, 0X0C},\r
792         {0x32F2, 0x80},\r
793         SensorEnd\r
794 };\r
795 \r
796 static  struct rk_sensor_reg sensor_Exposure11[]=\r
797 {\r
798         //[EV+1]              \r
799         {0x32F6, 0X0C},\r
800         {0x32F2, 0x90},\r
801         SensorEnd\r
802 };\r
803 \r
804 static  struct rk_sensor_reg sensor_Exposure12[]=\r
805 {\r
806         //[EV+2]              \r
807         {0x32F6, 0X0C},\r
808         {0x32F2, 0xA0},\r
809         SensorEnd\r
810 };\r
811 \r
812 static  struct rk_sensor_reg sensor_Exposure13[]=\r
813 {\r
814         //[EV+3]              \r
815         {0x32F6, 0X0C},\r
816         {0x32F2, 0xB0},\r
817         SensorEnd\r
818 };\r
819 \r
820 static  struct rk_sensor_reg sensor_Exposure14[]=\r
821 {\r
822         //[EV+4]                                \r
823         {0x32F6, 0X0C},\r
824         {0x32F2, 0xC0},\r
825         SensorEnd\r
826 };\r
827 \r
828 static struct rk_sensor_reg *sensor_ExposureSeqe[] = {sensor_Exposure04,sensor_Exposure03, sensor_Exposure02, sensor_Exposure01, sensor_Exposure00,\r
829         sensor_Exposure11, sensor_Exposure12,sensor_Exposure13,sensor_Exposure14,NULL,\r
830 };\r
831 \r
832 static  struct rk_sensor_reg sensor_Saturation0[]=\r
833 {\r
834         SensorEnd\r
835 };\r
836 \r
837 static  struct rk_sensor_reg sensor_Saturation1[]=\r
838 {\r
839         SensorEnd\r
840 };\r
841 \r
842 static  struct rk_sensor_reg sensor_Saturation2[]=\r
843 {\r
844         SensorEnd\r
845 };\r
846 static struct rk_sensor_reg *sensor_SaturationSeqe[] = {sensor_Saturation0, sensor_Saturation1, sensor_Saturation2, NULL,};\r
847 \r
848 static  struct rk_sensor_reg sensor_Contrast04[]=\r
849 {\r
850         //[Contrast : -4]\r
851         {0x32F6, 0x0C}, \r
852         {0x32C2, 0x40},\r
853         {0x32F2, 0x40},\r
854         {0x3060, 0x01},\r
855         SensorEnd\r
856 };\r
857 \r
858 static  struct rk_sensor_reg sensor_Contrast03[]=\r
859 {\r
860                 //[Contrast : -3]  \r
861         {0x32F6, 0x0C},    \r
862         {0x32C2, 0x30},\r
863         {0x32F2, 0x50},\r
864         {0x3060, 0x01},\r
865         SensorEnd\r
866 };\r
867 \r
868 static  struct rk_sensor_reg sensor_Contrast02[]=\r
869 {\r
870         //[Contrast : -2]    \r
871         {0x32F6, 0x0C},  \r
872         {0x32C2, 0x20},\r
873         {0x32F2, 0x60},\r
874         {0x3060, 0x01},\r
875         SensorEnd\r
876 };\r
877 static  struct rk_sensor_reg sensor_Contrast01[]=\r
878 {\r
879         //[Contrast : -1] \r
880         {0x32F6, 0x0C},     \r
881         {0x32C2, 0x10},\r
882         {0x32F2, 0x70},\r
883         {0x3060, 0x01},\r
884         SensorEnd\r
885 };\r
886 \r
887 static  struct rk_sensor_reg sensor_Contrast00[]=\r
888 {\r
889         //[Contrast : 0]        \r
890         {0x32F6, 0x0C},         \r
891         {0x32C2, 0x00},\r
892         {0x32F2, 0x80},\r
893         {0x3060, 0x01},\r
894         SensorEnd\r
895 };\r
896 \r
897 \r
898 static  struct rk_sensor_reg sensor_Contrast11[]=\r
899 {\r
900         //[Contrast : +1]   \r
901         {0x32F6, 0x0C},   \r
902         {0x32C2, 0xF0},\r
903         {0x32F2, 0x90},\r
904         {0x3060, 0x01},\r
905         SensorEnd\r
906 };\r
907 \r
908 \r
909 static  struct rk_sensor_reg sensor_Contrast12[]=\r
910 {\r
911         //[Contrast : +2]  \r
912         {0x32F6, 0x0C},    \r
913         {0x32C2, 0xE0},\r
914         {0x32F2, 0xA0},\r
915         {0x3060, 0x01},\r
916         SensorEnd\r
917 };\r
918 \r
919 static  struct rk_sensor_reg sensor_Contrast13[]=\r
920 {\r
921         //[Contrast : +3]  \r
922         {0x32F6, 0x0C},    \r
923         {0x32C2, 0xD0},\r
924         {0x32F2, 0xB0},\r
925         {0x3060, 0x01},\r
926         SensorEnd\r
927 };\r
928 \r
929 static  struct rk_sensor_reg sensor_Contrast14[]=\r
930 {\r
931         //[Contrast : +4]  \r
932         {0x32F6, 0x0C},         \r
933         {0x32C2, 0xC0},\r
934         {0x32F2, 0xC0},\r
935         {0x3060, 0x01},\r
936         SensorEnd\r
937 };\r
938 \r
939 static struct rk_sensor_reg *sensor_ContrastSeqe[] = {sensor_Contrast04, sensor_Contrast03, sensor_Contrast02, sensor_Contrast01,\r
940         sensor_Contrast00, sensor_Contrast11, sensor_Contrast12, sensor_Contrast13, sensor_Contrast14,NULL,\r
941 };\r
942 static  struct rk_sensor_reg sensor_SceneAuto[] =\r
943 {\r
944         SensorEnd\r
945 };\r
946 \r
947 static  struct rk_sensor_reg sensor_SceneNight[] =\r
948 {\r
949         SensorEnd\r
950 };\r
951 static struct rk_sensor_reg *sensor_SceneSeqe[] = {sensor_SceneAuto, sensor_SceneNight,NULL,};\r
952 \r
953 static struct rk_sensor_reg sensor_Zoom0[] =\r
954 {\r
955         SensorEnd\r
956 };\r
957 \r
958 static struct rk_sensor_reg sensor_Zoom1[] =\r
959 {\r
960         SensorEnd\r
961 };\r
962 \r
963 static struct rk_sensor_reg sensor_Zoom2[] =\r
964 {\r
965         SensorEnd\r
966 };\r
967 \r
968 \r
969 static struct rk_sensor_reg sensor_Zoom3[] =\r
970 {\r
971         SensorEnd\r
972 };\r
973 static struct rk_sensor_reg *sensor_ZoomSeqe[] = {sensor_Zoom0, sensor_Zoom1, sensor_Zoom2, sensor_Zoom3, NULL,};\r
974 \r
975 /*\r
976 * User could be add v4l2_querymenu in sensor_controls by new_usr_v4l2menu\r
977 */\r
978 static struct v4l2_querymenu sensor_menus[] =\r
979 {\r
980         //white balance\r
981         new_usr_v4l2menu(V4L2_CID_DO_WHITE_BALANCE,0,"auto",0),\r
982         new_usr_v4l2menu(V4L2_CID_DO_WHITE_BALANCE,1,"incandescent",0),\r
983         new_usr_v4l2menu(V4L2_CID_DO_WHITE_BALANCE,2,"fluorescent",0),\r
984         new_usr_v4l2menu(V4L2_CID_DO_WHITE_BALANCE,3,"daylight",0),\r
985         new_usr_v4l2menu(V4L2_CID_DO_WHITE_BALANCE,4,"cloudy-daylight",0),\r
986         new_usr_v4l2menu(V4L2_CID_DO_WHITE_BALANCE,5,"tungsten",0),\r
987 \r
988         //speical effect\r
989         new_usr_v4l2menu(V4L2_CID_EFFECT,0,"none",0),\r
990         new_usr_v4l2menu(V4L2_CID_EFFECT,1,"mono",0),\r
991         new_usr_v4l2menu(V4L2_CID_EFFECT,2,"negative",0),\r
992         new_usr_v4l2menu(V4L2_CID_EFFECT,3,"sepia",0),\r
993         new_usr_v4l2menu(V4L2_CID_EFFECT,4,"posterize",0),\r
994         new_usr_v4l2menu(V4L2_CID_EFFECT,5,"aqua",0),\r
995         new_usr_v4l2menu(V4L2_CID_EFFECT,6,"solarize",0),\r
996 };\r
997 /*\r
998 * User could be add v4l2_queryctrl in sensor_controls by new_user_v4l2ctrl\r
999 */\r
1000 static struct sensor_v4l2ctrl_usr_s sensor_controls[] =\r
1001 {\r
1002         new_user_v4l2ctrl(V4L2_CID_DO_WHITE_BALANCE,V4L2_CTRL_TYPE_MENU,"White Balance Control", 0, 5, 1, 0,sensor_v4l2ctrl_default_cb, sensor_WhiteBalanceSeqe),\r
1003         new_user_v4l2ctrl(V4L2_CID_EXPOSURE,V4L2_CTRL_TYPE_INTEGER,"Exposure Control", -4, 4, 1, 0,sensor_v4l2ctrl_default_cb, sensor_ExposureSeqe),\r
1004         new_user_v4l2ctrl(V4L2_CID_EFFECT,V4L2_CTRL_TYPE_MENU,"Effect Control", 0, 6, 1, 0,sensor_v4l2ctrl_default_cb, sensor_EffectSeqe),\r
1005         new_user_v4l2ctrl(V4L2_CID_CONTRAST,V4L2_CTRL_TYPE_INTEGER,"Contrast Control", -4, 4, 1, 0,sensor_v4l2ctrl_default_cb, sensor_ContrastSeqe),\r
1006 };\r
1007 \r
1008 \r
1009 //MUST define the current used format as the first item   \r
1010 static struct rk_sensor_datafmt sensor_colour_fmts[] = {\r
1011         {V4L2_MBUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG},\r
1012         {V4L2_MBUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG} \r
1013 };\r
1014 static struct soc_camera_ops sensor_ops;\r
1015 \r
1016 /*\r
1017 **********************************************************\r
1018 * Following is local code:\r
1019\r
1020 * Please codeing your program here \r
1021 **********************************************************\r
1022 */\r
1023 #define NT99160_FULL_PERIOD_PIXEL_NUMS  (1608)  // default pixel#(w/o dummy pixels) in UXGA mode\r
1024 #define NT99160_FULL_PERIOD_LINE_NUMS   (746)  // default line#(w/o dummy lines) in UXGA mode\r
1025 #define NT99160_PV_PERIOD_PIXEL_NUMS   (1288)  // default pixel#(w/o dummy pixels) in SVGA mode\r
1026 #define NT99160_PV_PERIOD_LINE_NUMS       (736)   // default line#(w/o dummy lines) in SVGA mode\r
1027 \r
1028 /* SENSOR EXPOSURE LINE LIMITATION */\r
1029 #define NT99160_FULL_EXPOSURE_LIMITATION   (1492)\r
1030 #define NT99160_PV_EXPOSURE_LIMITATION    (736)\r
1031 \r
1032 // SENSOR UXGA SIZE\r
1033 #define NT99160_IMAGE_SENSOR_FULL_WIDTH   (1280)\r
1034 #define NT99160_IMAGE_SENSOR_FULL_HEIGHT   (720)\r
1035 \r
1036 #define NT99160_FULL_GRAB_WIDTH                         (NT99160_IMAGE_SENSOR_FULL_WIDTH - 16)\r
1037 #define NT99160_FULL_GRAB_HEIGHT                        (NT99160_IMAGE_SENSOR_FULL_HEIGHT - 12)\r
1038 \r
1039 /*\r
1040 **********************************************************\r
1041 * Following is callback\r
1042 * If necessary, you could coding these callback\r
1043 **********************************************************\r
1044 */\r
1045 /*\r
1046 * the function is called in open sensor  \r
1047 */\r
1048 static int sensor_activate_cb(struct i2c_client *client)\r
1049 {\r
1050     SENSOR_DG("%s\n",__FUNCTION__);\r
1051 \r
1052         return 0;\r
1053 }\r
1054 /*\r
1055 * the function is called in close sensor\r
1056 */\r
1057 static int sensor_deactivate_cb(struct i2c_client *client)\r
1058 {\r
1059         struct generic_sensor *sensor = to_generic_sensor(client);\r
1060 \r
1061     SENSOR_DG("%s",__FUNCTION__);\r
1062     \r
1063         /* ddl@rock-chips.com : all sensor output pin must switch into Hi-Z */\r
1064         \r
1065         if (sensor->info_priv.funmodule_state & SENSOR_INIT_IS_OK) {\r
1066                 //generic_sensor_ioctrl(icd, Sensor_PowerDown, 1);\r
1067                  sensor->info_priv.funmodule_state &= ~SENSOR_INIT_IS_OK;\r
1068         }\r
1069         \r
1070         return 0;\r
1071 }\r
1072 /*\r
1073 * the function is called before sensor register setting in VIDIOC_S_FMT  \r
1074 */\r
1075 static int sensor_s_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture)\r
1076 {\r
1077     return 0;\r
1078 }\r
1079 /*\r
1080 * the function is called after sensor register setting finished in VIDIOC_S_FMT  \r
1081 */\r
1082 static int sensor_s_fmt_cb_bh (struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture)\r
1083 {\r
1084     return 0;\r
1085 }\r
1086 \r
1087 static int sensor_try_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf)\r
1088 {\r
1089         return 0;\r
1090 }\r
1091 \r
1092 static int sensor_softrest_usr_cb(struct i2c_client *client,struct rk_sensor_reg *series)\r
1093 {\r
1094         \r
1095         return 0;\r
1096 }\r
1097 static int sensor_check_id_usr_cb(struct i2c_client *client,struct rk_sensor_reg *series)\r
1098 {\r
1099         return 0;\r
1100 }\r
1101 \r
1102 static int sensor_suspend(struct soc_camera_device *icd, pm_message_t pm_msg)\r
1103 {\r
1104         //struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
1105                 \r
1106         if (pm_msg.event == PM_EVENT_SUSPEND) {\r
1107                 SENSOR_DG("Suspend");\r
1108                 \r
1109         } else {\r
1110                 SENSOR_TR("pm_msg.event(0x%x) != PM_EVENT_SUSPEND\n",pm_msg.event);\r
1111                 return -EINVAL;\r
1112         }\r
1113         return 0;\r
1114 }\r
1115 \r
1116 static int sensor_resume(struct soc_camera_device *icd)\r
1117 {\r
1118         int ret=0;\r
1119         \r
1120         SENSOR_DG("Resume");\r
1121         //ret = generic_sensor_ioctrl(icd, Sensor_PowerDown, 0);\r
1122 \r
1123         return ret;\r
1124 \r
1125 }\r
1126 static int sensor_mirror_cb (struct i2c_client *client, int mirror)\r
1127 {\r
1128         char val;\r
1129         int err = 0;\r
1130     \r
1131     SENSOR_DG("mirror: %d",mirror);\r
1132         if (mirror) {\r
1133                 err = sensor_read(client, 0x3022, &val);\r
1134                 if (err == 0) {\r
1135                         val |= 0x02;\r
1136                         err = sensor_write(client, 0x3022, val);\r
1137                 }\r
1138         } else {\r
1139                 err = sensor_read(client, 0x3022, &val);\r
1140                 if (err == 0) {\r
1141                         val &= 0xfd;\r
1142                         err = sensor_write(client, 0x3022, val);\r
1143                 }\r
1144         }\r
1145 \r
1146         return err;    \r
1147 }\r
1148 /*\r
1149 * the function is v4l2 control V4L2_CID_HFLIP callback  \r
1150 */\r
1151 static int sensor_v4l2ctrl_mirror_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, \r
1152                                                      struct v4l2_ext_control *ext_ctrl)\r
1153 {\r
1154         struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
1155 \r
1156     if (sensor_mirror_cb(client,ext_ctrl->value) != 0)\r
1157                 SENSOR_TR("sensor_mirror failed, value:0x%x",ext_ctrl->value);\r
1158         \r
1159         SENSOR_DG("sensor_mirror success, value:0x%x",ext_ctrl->value);\r
1160         return 0;\r
1161 }\r
1162 \r
1163 static int sensor_flip_cb(struct i2c_client *client, int flip)\r
1164 {\r
1165         char val;\r
1166         int err = 0;    \r
1167 \r
1168 \r
1169     SENSOR_DG("flip: %d",flip);\r
1170         if (flip) {\r
1171                 err = sensor_read(client, 0x3022, &val);\r
1172                 if (err == 0) {\r
1173                         val |= 0x01;\r
1174                         err = sensor_write(client, 0x3022, val);\r
1175                 }\r
1176         } else {\r
1177                 err = sensor_read(client, 0x3022, &val);\r
1178                 if (err == 0) {\r
1179                         val &= 0xfe;\r
1180                         err = sensor_write(client, 0x3022, val);\r
1181                 }\r
1182         }\r
1183 \r
1184         return err;    \r
1185 }\r
1186 /*\r
1187 * the function is v4l2 control V4L2_CID_VFLIP callback  \r
1188 */\r
1189 static int sensor_v4l2ctrl_flip_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, \r
1190                                                      struct v4l2_ext_control *ext_ctrl)\r
1191 {\r
1192         struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
1193 \r
1194     if (sensor_flip_cb(client,ext_ctrl->value) != 0)\r
1195                 SENSOR_TR("sensor_flip failed, value:0x%x",ext_ctrl->value);\r
1196         \r
1197         SENSOR_DG("sensor_flip success, value:0x%x",ext_ctrl->value);\r
1198         return 0;\r
1199 }\r
1200 \r
1201 static int sensor_focus_init_usr_cb(struct i2c_client *client){\r
1202         return 0;\r
1203 }\r
1204 \r
1205 static int sensor_focus_af_single_usr_cb(struct i2c_client *client){\r
1206         return 0;\r
1207 }\r
1208 \r
1209 static int sensor_focus_af_near_usr_cb(struct i2c_client *client){\r
1210         return 0;\r
1211 }\r
1212 \r
1213 static int sensor_focus_af_far_usr_cb(struct i2c_client *client){\r
1214         return 0;\r
1215 }\r
1216 \r
1217 static int sensor_focus_af_specialpos_usr_cb(struct i2c_client *client,int pos){\r
1218         return 0;\r
1219 }\r
1220 \r
1221 static int sensor_focus_af_const_usr_cb(struct i2c_client *client){\r
1222         return 0;\r
1223 }\r
1224 static int sensor_focus_af_const_pause_usr_cb(struct i2c_client *client)
1225 {
1226     return 0;
1227 }\r
1228 static int sensor_focus_af_close_usr_cb(struct i2c_client *client){\r
1229         return 0;\r
1230 }\r
1231 \r
1232 static int sensor_focus_af_zoneupdate_usr_cb(struct i2c_client *client, int *zone_tm_pos)\r
1233 {\r
1234         return 0;\r
1235 }\r
1236 \r
1237 /*\r
1238 face defect call back\r
1239 */\r
1240 static int      sensor_face_detect_usr_cb(struct i2c_client *client,int on){\r
1241         return 0;\r
1242 }\r
1243 \r
1244 /*\r
1245 *   The function can been run in sensor_init_parametres which run in sensor_probe, so user can do some\r
1246 * initialization in the function. \r
1247 */\r
1248 static void sensor_init_parameters_user(struct specific_sensor* spsensor,struct soc_camera_device *icd)\r
1249 {\r
1250         \r
1251     return;\r
1252 }\r
1253 \r
1254 /*\r
1255 * :::::WARNING:::::\r
1256 * It is not allowed to modify the following code\r
1257 */\r
1258 \r
1259 sensor_init_parameters_default_code();\r
1260 \r
1261 sensor_v4l2_struct_initialization();\r
1262 \r
1263 sensor_probe_default_code();\r
1264 \r
1265 sensor_remove_default_code();\r
1266 \r
1267 sensor_driver_default_module_code();\r
1268 \r
1269 \r
1270 \r