camera: delete compile warning
[firefly-linux-kernel-4.4.55.git] / drivers / media / video / generic_sensor.h
1 #ifndef __ASM_ARCH_GENERIC_SENSOR_RK_H_\r
2 #include <linux/videodev2.h>\r
3 #include <linux/slab.h>\r
4 #include <linux/i2c.h>\r
5 #include <linux/stat.h>\r
6 #include <linux/log2.h>\r
7 #include <linux/platform_device.h>\r
8 #include <linux/delay.h>\r
9 #include <linux/circ_buf.h>\r
10 #include <linux/miscdevice.h>\r
11 #include <media/v4l2-common.h>\r
12 #include <media/v4l2-chip-ident.h>\r
13 #include <media/soc_camera.h>\r
14 #include <linux/vmalloc.h>\r
15 #include <plat/rk_camera.h>\r
16 \r
17 /* Camera Sensor driver */\r
18 \r
19 #define MIN(x,y)   ((x<y) ? x: y)\r
20 #define MAX(x,y)        ((x>y) ? x: y)\r
21 \r
22 #define SENSOR_TR(format, ...) printk(KERN_ERR "%s(%d): " format"\n", SENSOR_NAME_STRING(),__LINE__, ## __VA_ARGS__)\r
23 #define SENSOR_DG(format, ...) dprintk(1, "%s(%d): "format"\n", SENSOR_NAME_STRING(),__LINE__,## __VA_ARGS__)\r
24 \r
25 //to generic sensor\r
26 //a represents a i2c_client type point\r
27 #define to_generic_sensor(a) (container_of(i2c_get_clientdata(a), struct generic_sensor, subdev))\r
28 \r
29 //to specific sensor\r
30 //a represents a generic_sensor type point\r
31 #define to_specific_sensor(a) (container_of(a, struct specific_sensor, common_sensor))\r
32 \r
33 #define SENSOR_INIT_IS_ERR       (0x00<<28)\r
34 #define SENSOR_INIT_IS_OK        (0x01<<28)\r
35 \r
36 #define SEQCMD_STREAMCHK     0xFA000000\r
37 #define SEQCMD_INVALIDATE    0xFB000000\r
38 #define SEQCMD_INTERPOLATION 0xFC000000\r
39 #define SEQCMD_WAIT_MS   0xFD000000\r
40 #define SEQCMD_WAIT_US   0xFE000000\r
41 #define SEQCMD_END               0xFF000000\r
42 \r
43 #define SensorReg0Val0(a,b)    {SEQCMD_INVALIDATE,0,0,0}\r
44 #define SensorReg1Val1(a,b)    {a,b,0xff,0xff}\r
45 #define SensorReg2Val1(a,b)    {a,b,0xffff,0xff}\r
46 #define SensorReg2Val2(a,b)    {a,b,0xffff,0xffff}\r
47 \r
48 #define SensorStreamChk        {SEQCMD_STREAMCHK,0,0,0}\r
49 #define SensorWaitMs(a)            {SEQCMD_WAIT_MS,a,0x00,0x00}\r
50 #define SensorWaitUs(a)            {SEQCMD_WAIT_US,a,0x00,0x00}\r
51 #define SensorEnd                          {SEQCMD_END,0x00,0x00,0x00}\r
52 \r
53 #define CFG_WhiteBalance                       (1<<0)\r
54 #define CFG_Brightness                     (1<<1)\r
55 #define CFG_Contrast                           (1<<2)\r
56 #define CFG_Saturation                     (1<<3)\r
57 #define CFG_Effect                                 (1<<4)\r
58 #define CFG_Scene                                  (1<<5)\r
59 #define CFG_DigitalZoom                    (1<<6)\r
60 #define CFG_Focus                                  (1<<7)\r
61 #define CFG_FocusContinues                         (1<<8)\r
62 #define CFG_FocusZone                      (1<<9)\r
63 #define CFG_FocusRelative                          (1<<10)\r
64 #define CFG_FocusAbsolute                          (1<<11)\r
65 #define CFG_FACE_DETECT                    (1<<12)\r
66 #define CFG_Exposure                           (1<<13)\r
67 #define CFG_Flash                                  (1<<14)\r
68 #define CFG_Mirror                                 (1<<15)\r
69 #define CFG_Flip                                       (1<<16)\r
70 \r
71 #define CFG_FunChk(a,b)                      ((a&b)==b) \r
72 #define CFG_FunDis(a,b)                      (a &= (~b))\r
73 \r
74 enum rk_sensor_sequence_property {\r
75         SEQUENCE_INIT =1,\r
76         SEQUENCE_PREVIEW,\r
77         SEQUENCE_CAPTURE\r
78 };\r
79 \r
80 struct rk_sensor_reg {\r
81         unsigned int reg;\r
82         unsigned int val;\r
83         unsigned int reg_mask;\r
84         unsigned int val_mask;\r
85 };\r
86 \r
87 struct rk_sensor_seq_info {\r
88         unsigned short w;\r
89         unsigned short h;\r
90         unsigned short fps;\r
91 };\r
92 struct rk_sensor_sequence {\r
93         struct rk_sensor_seq_info gSeq_info;\r
94         enum rk_sensor_sequence_property property;\r
95         struct rk_sensor_reg *data;\r
96 };\r
97 \r
98 /* only one fixed colorspace per pixelcode */\r
99 struct rk_sensor_datafmt {\r
100         enum v4l2_mbus_pixelcode code;\r
101         enum v4l2_colorspace colorspace;\r
102 };\r
103 \r
104 \r
105 //focus work\r
106 enum rk_sensor_focus_wq_cmd\r
107 {\r
108         WqCmd_af_invalid = -1,\r
109         WqCmd_af_init =1,\r
110         WqCmd_af_single,\r
111         WqCmd_af_continues,\r
112         WqCmd_af_continues_pause,     /* ddl@rock-chips.com: v0.1.1 */\r
113         WqCmd_af_update_zone,\r
114         WqCmd_af_close,\r
115         WqCmd_af_special_pos,\r
116         WqCmd_af_near_pos,\r
117         WqCmd_af_far_pos\r
118         \r
119 };\r
120 enum rk_sensor_focus_sensor_wq_result\r
121 {\r
122         WqRet_success = 0,\r
123         WqRet_fail = -1,\r
124         WqRet_inval = -2\r
125 };\r
126 \r
127 enum rk_sensor_focus_state\r
128 {\r
129     FocusState_Inval,\r
130     FocusState_Inited\r
131 };\r
132 \r
133 struct rk_sensor_focus_work\r
134 {\r
135         struct i2c_client *client;\r
136         struct delayed_work dwork;\r
137         enum rk_sensor_focus_wq_cmd cmd;\r
138         wait_queue_head_t done;\r
139         enum rk_sensor_focus_sensor_wq_result result;\r
140         bool wait;\r
141         int var;        \r
142 };\r
143 \r
144 //focus structs\r
145 struct rk_sensor_focus_cb{\r
146         int (*sensor_focus_init_cb)(struct i2c_client *client); \r
147     int (*sensor_af_single_cb)(struct i2c_client *client);\r
148     int (*sensor_af_const_cb)(struct i2c_client *client);\r
149     int (*sensor_af_const_pause_cb)(struct i2c_client *client);\r
150     int (*sensor_af_zoneupdate_cb)(struct i2c_client *client, int *zone_tm_pos);\r
151     int (*sensor_af_close_cb)(struct i2c_client *client);\r
152     int (*sensor_af_near_cb)(struct i2c_client *client);\r
153     int (*sensor_af_far_cb)(struct i2c_client *client);\r
154     int (*sensor_af_specialpos_cb)(struct i2c_client *client,int pos);  \r
155         //\r
156 };\r
157 //zone from hal is [-1000,-1000,1000,1000],must map to sensor's zone.\r
158 struct rk_sensor_focus_zone{\r
159         int lx;\r
160         int ty;\r
161         int rx;\r
162         int dy;\r
163 };\r
164 struct rk_sensor_focus_op_s{\r
165         struct rk_sensor_focus_cb focus_cb;\r
166         struct workqueue_struct *sensor_wq;\r
167         struct mutex focus_lock;\r
168     unsigned int focus_state;\r
169         unsigned int focus_mode;                //show the focus mode\r
170         struct rk_sensor_focus_zone focus_zone;\r
171         enum rk_sensor_focus_wq_cmd focus_delay;\r
172 };\r
173 \r
174 \r
175 typedef struct rk_sensor_priv_s\r
176 {\r
177     int mirror;\r
178         bool snap2preview;\r
179         bool video2preview;\r
180         struct rk_sensor_sequence* winseqe_cur_addr;\r
181         struct rk_sensor_datafmt* datafmt;\r
182         int num_datafmt;\r
183         struct rk_sensor_datafmt curfmt;\r
184         unsigned int funmodule_state;\r
185         //\r
186         struct rk_sensor_sequence* sensor_series;\r
187         int num_series; \r
188 \r
189     struct rk_sensor_reg* sensor_SfRstSeqe;\r
190     struct rk_sensor_reg* sensor_CkIdSeqe;\r
191     \r
192         struct rk_sensor_seq_info max_res;//maybe interploted\r
193         struct rk_sensor_seq_info max_real_res;\r
194         struct rk_sensor_seq_info min_res;\r
195         unsigned long bus_parameter;\r
196     unsigned int  *chip_id;\r
197     unsigned int  chip_id_num;\r
198         int chip_ident;\r
199         unsigned int gReg_mask;\r
200         unsigned int gVal_mask;\r
201         unsigned int gI2c_speed;\r
202 \r
203     bool stream;\r
204         \r
205 } rk_sensor_info_priv_t;\r
206 \r
207 struct sensor_v4l2ctrl_info_s {\r
208     struct v4l2_queryctrl *qctrl;\r
209     int (*cb)(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, \r
210               struct v4l2_ext_control *ext_ctrl);\r
211     struct rk_sensor_reg **sensor_Seqe;\r
212     int cur_value;\r
213     int num_ctrls;\r
214 };\r
215 \r
216 struct sensor_v4l2ctrl_usr_s {\r
217     struct v4l2_queryctrl qctrl;\r
218     int (*cb)(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, \r
219               struct v4l2_ext_control *ext_ctrl);\r
220     struct rk_sensor_reg **sensor_Seqe;\r
221 };\r
222 \r
223 struct sensor_ops_cb_s{\r
224         int (*sensor_softreset_cb)(struct i2c_client *client,struct rk_sensor_reg *series);\r
225         int (*sensor_check_id_cb)(struct i2c_client *client,struct rk_sensor_reg *series);\r
226         int (*sensor_activate_cb)(struct i2c_client *client);\r
227         int (*sensor_deactivate_cb)(struct i2c_client *client);\r
228         int (*sensor_mirror_cb)(struct i2c_client *client, int mirror);\r
229         int (*sensor_flip_cb)(struct i2c_client *client, int flip);\r
230         int (*sensor_face_detect_cb)(struct i2c_client *client, int on);\r
231 \r
232         int (*sensor_s_fmt_cb_th)(struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture);\r
233         int (*sensor_s_fmt_cb_bh)(struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture);\r
234         int (*sensor_try_fmt_cb_th)(struct i2c_client *client,struct v4l2_mbus_framefmt *mf);\r
235 };\r
236 //flash off in fixed time to prevent from too hot , zyc\r
237 struct  rk_flash_timer{\r
238         struct soc_camera_device *icd;\r
239         struct hrtimer timer;\r
240 };\r
241 \r
242 struct generic_sensor\r
243 {\r
244     char dev_name[32];\r
245         struct v4l2_subdev subdev;\r
246         struct i2c_client *client;\r
247         rk_sensor_info_priv_t info_priv;\r
248         int model;      /* V4L2_IDENT_OV* codes from v4l2-chip-ident.h */\r
249         \r
250         bool is_need_tasklock;\r
251         atomic_t tasklock_cnt;\r
252         struct soc_camera_ops *sensor_ops; \r
253         struct v4l2_queryctrl* sensor_controls;  \r
254         struct sensor_v4l2ctrl_info_s *ctrls;\r
255         struct rk_flash_timer flash_off_timer;\r
256         struct sensor_ops_cb_s sensor_cb;\r
257         struct rk_sensor_focus_op_s sensor_focus;\r
258         struct rk29camera_platform_data *sensor_io_request;\r
259         struct rk29camera_gpio_res *sensor_gpio_res;\r
260         \r
261 };\r
262 \r
263 extern int generic_sensor_softreset(struct i2c_client *client, struct rk_sensor_reg *series);\r
264 extern int generic_sensor_check_id(struct i2c_client *client, struct rk_sensor_reg *series);\r
265 extern int sensor_write_reg2val1(struct i2c_client *client, u16 reg,u8 val);\r
266 extern int sensor_write_reg2val2(struct i2c_client *client, u16 reg,u16 val);\r
267 extern int sensor_write_reg1val1(struct i2c_client *client, u8 reg,u8 val);\r
268 extern int sensor_write_reg1val2(struct i2c_client *client, u8 reg,u16 val);\r
269 extern int sensor_read_reg1val1(struct i2c_client *client, u8 reg,u8* val);\r
270 extern int sensor_read_reg2val1(struct i2c_client *client, u16 reg,u8* val);\r
271 extern int sensor_read_reg1val2(struct i2c_client *client, u8 reg,u16* val);\r
272 extern int sensor_read_reg2val2(struct i2c_client *client, u16 reg,u16* val);\r
273 extern int generic_sensor_write(struct i2c_client *client,struct rk_sensor_reg* sensor_reg);\r
274 extern int generic_sensor_read(struct i2c_client *client, struct rk_sensor_reg* sensor_reg);\r
275 extern int generic_sensor_write_array(struct i2c_client *client, struct rk_sensor_reg *regarray);\r
276 extern int generic_sensor_get_max_min_res(struct rk_sensor_sequence* res_array,int num,struct rk_sensor_seq_info * max_real_res\r
277                                                                                 ,struct rk_sensor_seq_info * max_res,struct rk_sensor_seq_info *min_res);\r
278 extern int generic_sensor_init(struct v4l2_subdev *sd, u32 val);\r
279 extern int generic_sensor_enum_frameintervals(struct v4l2_subdev *sd, struct v4l2_frmivalenum *fival);\r
280 extern int generic_sensor_try_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf);\r
281 extern int generic_sensor_ioctrl(struct soc_camera_device *icd,enum rk29sensor_power_cmd cmd, int on);\r
282 extern unsigned long generic_sensor_query_bus_param(struct soc_camera_device *icd);\r
283 extern int generic_sensor_g_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf);\r
284 extern int generic_sensor_set_bus_param(struct soc_camera_device *icd,unsigned long flags);\r
285 extern int generic_sensor_g_control(struct v4l2_subdev *sd, struct v4l2_control *ctrl);\r
286 extern int generic_sensor_s_control(struct v4l2_subdev *sd, struct v4l2_control *ctrl);\r
287 extern int generic_sensor_g_ext_control(struct soc_camera_device *icd , struct v4l2_ext_control *ext_ctrl);\r
288 extern int generic_sensor_s_ext_control(struct soc_camera_device *icd, struct v4l2_ext_control *ext_ctrl);\r
289 extern int generic_sensor_g_ext_controls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ext_ctrl);\r
290 extern int generic_sensor_s_ext_controls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ext_ctrl);\r
291 extern long generic_sensor_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg);\r
292 extern int generic_sensor_enum_fmt(struct v4l2_subdev *sd, unsigned int index,enum v4l2_mbus_pixelcode *code);\r
293 extern int generic_sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf);\r
294 extern int generic_sensor_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *id);\r
295 extern int generic_sensor_af_workqueue_set(struct soc_camera_device *icd, enum rk_sensor_focus_wq_cmd cmd, int var, bool wait);\r
296 extern int generic_sensor_s_stream(struct v4l2_subdev *sd, int enable);\r
297 extern int generic_sensor_writebuf(struct i2c_client *client, char *buf, int buf_size);\r
298 \r
299 static inline int sensor_get_full_width_height(int full_resolution, unsigned short *w, unsigned short *h)\r
300 {\r
301     switch (full_resolution) \r
302     {\r
303         case 0x30000:\r
304         {\r
305             *w = 640;\r
306             *h = 480;\r
307             break;\r
308         } \r
309 \r
310         case 0x100000:\r
311         {\r
312             *w = 1024;\r
313             *h = 768;\r
314             break;\r
315         }   \r
316         \r
317         case 0x130000:\r
318         {\r
319             *w = 1280;\r
320             *h = 1024;\r
321             break;\r
322         }\r
323 \r
324         case 0x200000:\r
325         {\r
326             *w = 1600;\r
327             *h = 1200;\r
328             break;\r
329         }\r
330 \r
331         case 0x300000:\r
332         {\r
333             *w = 2048;\r
334             *h = 1536;\r
335             break;\r
336         }\r
337 \r
338         case 0x500000:\r
339         {\r
340             *w = 2592;\r
341             *h = 1944;\r
342             break;\r
343         }\r
344 \r
345         case 0x800000:\r
346         {\r
347             *w = 3264;\r
348             *h = 2448;\r
349             break;\r
350         }\r
351         \r
352         default:\r
353             return -1;\r
354     }\r
355 \r
356     return 0;\r
357 }\r
358 static inline int sensor_video_probe(struct soc_camera_device *icd,\r
359                                    struct i2c_client *client)\r
360 {\r
361         int ret;\r
362         struct generic_sensor *sensor = to_generic_sensor(client);\r
363 \r
364         /* We must have a parent by now. And it cannot be a wrong one.\r
365          * So this entire test is completely redundant. */\r
366         if (!icd->dev.parent ||\r
367                 to_soc_camera_host(icd->dev.parent)->nr != icd->iface) {\r
368                 ret = -ENODEV;\r
369                 goto sensor_video_probe_end;\r
370         }\r
371 \r
372         generic_sensor_softreset(client,sensor->info_priv.sensor_SfRstSeqe);\r
373     ret = generic_sensor_check_id(client,sensor->info_priv.sensor_CkIdSeqe);\r
374 \r
375 sensor_video_probe_end: \r
376         return ret;\r
377 }\r
378 \r
379 static inline int sensor_regarray_check(struct rk_sensor_reg *data, int reg_num)\r
380 {\r
381     struct rk_sensor_reg *data_ptr;\r
382 \r
383     data_ptr = data+reg_num-1;\r
384     if (data_ptr->reg == SEQCMD_END) {\r
385         return 0;\r
386     } else { \r
387         printk(KERN_ERR "%s(%d): data[%d].reg = 0x%x\n",__FUNCTION__,__LINE__,reg_num-1,data_ptr->reg);\r
388         return -1;\r
389     }\r
390     \r
391 }\r
392 \r
393 static inline void sensor_v4l2ctrl_info_init (struct sensor_v4l2ctrl_info_s *ptr,\r
394                                         unsigned int id,\r
395                                         enum v4l2_ctrl_type type,\r
396                                         char *name,\r
397                                         int min,\r
398                                         int max,\r
399                                         int step,\r
400                                         int default_val,\r
401                                         int(*cb)(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, \r
402                                                  struct v4l2_ext_control *ext_ctrl),\r
403                                         struct rk_sensor_reg ** sensor_seqe\r
404                                         )\r
405 {\r
406     ptr->qctrl->id = id;\r
407         ptr->qctrl->type = type;\r
408         strcat(ptr->qctrl->name,name);\r
409         ptr->qctrl->minimum = min;\r
410         ptr->qctrl->maximum = max;\r
411     ptr->qctrl->step = step;\r
412         ptr->qctrl->default_value = default_val;\r
413     ptr->cur_value = default_val;\r
414     ptr->cb = cb;\r
415     ptr->sensor_Seqe = sensor_seqe;\r
416     return;\r
417 }\r
418 \r
419 static inline struct sensor_v4l2ctrl_info_s* sensor_find_ctrl(\r
420         struct sensor_v4l2ctrl_info_s *ops, int id)\r
421 {\r
422         int i;\r
423 \r
424         for (i = 0; i < ops[i].num_ctrls; i++)\r
425                 if (ops[i].qctrl->id == id)\r
426                         return &ops[i];\r
427 \r
428         return NULL;\r
429 }\r
430 \r
431 static inline void v4l2_querymenu_init (struct v4l2_querymenu *ptr,\r
432                                         unsigned int id,\r
433                                         unsigned int index,\r
434                                         char *name,\r
435                                         unsigned int reserved)\r
436 {\r
437     ptr->id = id;\r
438         ptr->index = index;\r
439         strcat(ptr->name,name);\r
440         ptr->reserved = reserved;\r
441 \r
442     return;\r
443 }\r
444 \r
445 static inline int sensor_v4l2ctrl_replace_cb(struct generic_sensor *sensor, int id, void *cb)\r
446 {\r
447     int i,num;\r
448     struct sensor_v4l2ctrl_info_s* ctrls;\r
449 \r
450     ctrls = sensor->ctrls;\r
451     num = ctrls->num_ctrls;\r
452     for (i=0; i<num; i++,ctrls++) {\r
453         if (ctrls->qctrl->id == id) {\r
454             ctrls->cb = cb;\r
455             break;\r
456         }\r
457     }\r
458 \r
459     if (i>=num) {\r
460         printk(KERN_ERR "%s(%d): v4l2_control id(0x%x) isn't exist\n",__FUNCTION__,__LINE__,id);\r
461     } else {\r
462         return 0;\r
463     }\r
464 }\r
465 \r
466 static inline int sensor_v4l2ctrl_default_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, \r
467                                                      struct v4l2_ext_control *ext_ctrl)\r
468 {\r
469     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));    \r
470     int value = ext_ctrl->value;\r
471     int index;\r
472 \r
473     if ((value < ctrl_info->qctrl->minimum) || (value > ctrl_info->qctrl->maximum)) {\r
474         printk(KERN_ERR "%s(%d): value(0x%x) isn't between in (0x%x,0x%x)\n",__FUNCTION__,__LINE__,value,\r
475             ctrl_info->qctrl->minimum,ctrl_info->qctrl->maximum);\r
476         return -EINVAL;\r
477     }\r
478 \r
479     index = value - ctrl_info->qctrl->minimum;\r
480     if (ctrl_info->sensor_Seqe && (ctrl_info->sensor_Seqe[index] != NULL)) {\r
481         if (generic_sensor_write_array(client, ctrl_info->sensor_Seqe[index]) != 0) {\r
482             printk(KERN_ERR "%s(%d):  sensor write array sensor_Seqe failed\n",__FUNCTION__,__LINE__);\r
483             return -EINVAL;\r
484         }\r
485 \r
486         ctrl_info->cur_value = value;\r
487         return 0;\r
488     } else {\r
489         printk(KERN_ERR "%s(%d): ctrl_info(id=0x%x)'s sensor_Seqe is invalidate\n",__FUNCTION__,__LINE__,ctrl_info->qctrl->id);\r
490         return -EINVAL;\r
491     }\r
492 }\r
493 static inline int sensor_v4l2ctrl_flash_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, \r
494                                                      struct v4l2_ext_control *ext_ctrl)\r
495 {\r
496     //struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
497     int value = ext_ctrl->value;\r
498 \r
499     if ((value < ctrl_info->qctrl->minimum) || (value > ctrl_info->qctrl->maximum)) {\r
500         printk(KERN_ERR "%s(%d): value(0x%x) isn't between in (0x%x,0x%x)\n",__FUNCTION__,__LINE__,value,\r
501             ctrl_info->qctrl->minimum,ctrl_info->qctrl->maximum);\r
502         return -EINVAL;\r
503     }\r
504 \r
505     if (value == 3) {            /* ddl@rock-chips.com: torch */\r
506         generic_sensor_ioctrl(icd, Sensor_Flash, Flash_Torch);   /* Flash On */\r
507     } else {\r
508         generic_sensor_ioctrl(icd, Sensor_Flash, Flash_Off);\r
509     }\r
510     \r
511     ctrl_info->cur_value = value;  /* ddl@rock-chips.com : v0.1.3 */\r
512     \r
513     return 0;\r
514 }\r
515 static inline int sensor_focus_default_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, \r
516                                                                                                          struct v4l2_ext_control *ext_ctrl)\r
517 {\r
518         struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));    \r
519         int value = ext_ctrl->value;\r
520         int ret = 0;\r
521         struct generic_sensor* sensor = to_generic_sensor(client);\r
522     \r
523         if ((value < ctrl_info->qctrl->minimum) || (value > ctrl_info->qctrl->maximum)) {\r
524                 printk(KERN_ERR "%s(%d): value(0x%x) isn't between in (0x%x,0x%x)\n",__FUNCTION__,__LINE__,value,\r
525                         ctrl_info->qctrl->minimum,ctrl_info->qctrl->maximum);\r
526                 return -EINVAL;\r
527         }\r
528     \r
529         if(sensor->sensor_focus.focus_state == FocusState_Inval){\r
530                 printk(KERN_ERR "%s(%d): focus have not been init success yet\n",__FUNCTION__,__LINE__);\r
531                 //set focus delay\r
532                 \r
533                 switch (ext_ctrl->id)\r
534                 {\r
535                         case V4L2_CID_FOCUS_ABSOLUTE:\r
536                                 sensor->sensor_focus.focus_delay = WqCmd_af_special_pos;\r
537                                 break;\r
538                         case V4L2_CID_FOCUS_RELATIVE:\r
539                                 if (ext_ctrl->value == ctrl_info->qctrl->minimum)\r
540                                         sensor->sensor_focus.focus_delay = WqCmd_af_near_pos;\r
541                                 else\r
542                                         sensor->sensor_focus.focus_delay = WqCmd_af_far_pos;\r
543                                 break;\r
544                         \r
545                         case V4L2_CID_FOCUS_AUTO:\r
546                                 sensor->sensor_focus.focus_delay = WqCmd_af_single;\r
547                                 break;\r
548                         case V4L2_CID_FOCUS_CONTINUOUS:\r
549                                 sensor->sensor_focus.focus_delay = WqCmd_af_continues;\r
550                                 break;\r
551                         default:\r
552                                 printk(KERN_ERR "%s(%d):not support this focus mode",__FUNCTION__,__LINE__ );\r
553                 }\r
554                 return -EINVAL;\r
555         }\r
556         switch (ext_ctrl->id)\r
557         {\r
558                 case V4L2_CID_FOCUS_ABSOLUTE:\r
559                         {\r
560                                 if(sensor->sensor_focus.focus_mode ==V4L2_CID_FOCUS_CONTINUOUS){\r
561                                         //need do something?\r
562 \r
563                                 }\r
564                                 if (ctrl_info->cur_value != value) {\r
565                                         if (ext_ctrl->value == ctrl_info->qctrl->minimum)\r
566                                                 ret = generic_sensor_af_workqueue_set(icd, WqCmd_af_near_pos, value, true);\r
567                                         else if(ext_ctrl->value == ctrl_info->qctrl->maximum)\r
568                                                 ret = generic_sensor_af_workqueue_set(icd, WqCmd_af_far_pos, value, true);\r
569                                         else\r
570                                                 ret = generic_sensor_af_workqueue_set(icd, WqCmd_af_special_pos, value, true);\r
571                                         if(ret == 0){\r
572                                                 ctrl_info->cur_value = value;\r
573                                         } else {\r
574                                                 ret = -EINVAL;\r
575                                                 printk(KERN_ERR"\n %s valure = %d is invalidate..       \n",__FUNCTION__,value);\r
576                                         }\r
577                                 }\r
578                                 break;\r
579                         }\r
580                 case V4L2_CID_FOCUS_RELATIVE:\r
581                         {\r
582                                 if(sensor->sensor_focus.focus_mode ==V4L2_CID_FOCUS_CONTINUOUS){\r
583                                         //need do something?\r
584                                 \r
585                                 }\r
586                                 if (ctrl_info->cur_value != value) {\r
587                                         if (ext_ctrl->value == ctrl_info->qctrl->minimum)\r
588                                                 ret = generic_sensor_af_workqueue_set(icd, WqCmd_af_near_pos, value, true);\r
589                                         else if(ext_ctrl->value == ctrl_info->qctrl->maximum)\r
590                                                 ret = generic_sensor_af_workqueue_set(icd, WqCmd_af_far_pos, value, true);\r
591                                         if(ret == 0){\r
592                                                 ctrl_info->cur_value = value;\r
593                                         } else {\r
594                                                 ret = -EINVAL;\r
595                                                 printk(KERN_ERR"\n %s valure = %d is invalidate..       \n",__FUNCTION__,value);\r
596                                         }\r
597                                 }\r
598                                 break;\r
599                         }\r
600                 case V4L2_CID_FOCUS_AUTO:\r
601                         {\r
602                 mutex_lock(&sensor->sensor_focus.focus_lock);\r
603                 //get focuszone\r
604                 sensor->sensor_focus.focus_zone.lx = ext_ctrl->rect[0];\r
605                 sensor->sensor_focus.focus_zone.ty = ext_ctrl->rect[1];\r
606                 sensor->sensor_focus.focus_zone.rx = ext_ctrl->rect[2];\r
607                 sensor->sensor_focus.focus_zone.dy = ext_ctrl->rect[3];\r
608                 mutex_unlock(&sensor->sensor_focus.focus_lock);\r
609               \r
610                                 if(sensor->sensor_focus.focus_mode ==V4L2_CID_FOCUS_CONTINUOUS){\r
611                                         //need do something?\r
612                                         //generic_sensor_af_workqueue_set(icd, WqCmd_af_close, value, true);\r
613                                 }\r
614                                 if((value==1) || (sensor->sensor_focus.focus_mode==V4L2_CID_FOCUS_AUTO)){\r
615                                         ret = generic_sensor_af_workqueue_set(icd, WqCmd_af_update_zone, value, true);\r
616                                         ret = generic_sensor_af_workqueue_set(icd, WqCmd_af_single, value, true);\r
617                     sensor->sensor_focus.focus_mode = V4L2_CID_FOCUS_AUTO;\r
618                                 }else if(value == 0){\r
619                                         ret = generic_sensor_af_workqueue_set(icd, WqCmd_af_close, value, true);\r
620                                 }\r
621                                 if(ret != 0){\r
622                                         ret = -EINVAL;\r
623                                         printk(KERN_ERR"\n %s valure = %d is invalidate..       \n",__FUNCTION__,value);\r
624                                 }\r
625                                 break;\r
626                                 \r
627                         }\r
628                 case V4L2_CID_FOCUS_CONTINUOUS:\r
629                         {\r
630                                 if((value==1) && (sensor->sensor_focus.focus_mode!=V4L2_CID_FOCUS_CONTINUOUS)){\r
631                                         //have to close focus firstly?\r
632                                         //generic_sensor_af_workqueue_set(icd, WqCmd_af_close, value, true);\r
633                                         ret = generic_sensor_af_workqueue_set(icd, WqCmd_af_continues, value, true);\r
634 \r
635                     sensor->sensor_focus.focus_mode = V4L2_CID_FOCUS_CONTINUOUS;\r
636                                 }else if(value ==0){\r
637                                         ret = generic_sensor_af_workqueue_set(icd, WqCmd_af_close, value, true);\r
638                                 }\r
639                                 if(ret != 0){\r
640                                         ret = -EINVAL;\r
641                                         printk(KERN_ERR"\n %s valure = %d is invalidate..       \n",__FUNCTION__,value);\r
642                                 }\r
643                                 break;\r
644                         }\r
645                 \r
646         }\r
647         return ret;\r
648 \r
649 }\r
650 static inline int sensor_face_detect_default_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, \r
651                                                                                                          struct v4l2_ext_control *ext_ctrl)\r
652 {\r
653         struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));    \r
654         int value = ext_ctrl->value;\r
655         int ret = 0;\r
656         struct generic_sensor* sensor = to_generic_sensor(client);\r
657         if ((value < ctrl_info->qctrl->minimum) || (value > ctrl_info->qctrl->maximum)) {\r
658                 printk(KERN_ERR "%s(%d): value(0x%x) isn't between in (0x%x,0x%x)\n",__FUNCTION__,__LINE__,value,\r
659                         ctrl_info->qctrl->minimum,ctrl_info->qctrl->maximum);\r
660                 return -EINVAL;\r
661         }\r
662         if(ctrl_info->cur_value != value){\r
663                 if(sensor->sensor_cb.sensor_face_detect_cb)\r
664                         ret = (sensor->sensor_cb.sensor_face_detect_cb)(client,value);\r
665                 if(ret ==0)\r
666                         ctrl_info->cur_value = value;\r
667         }\r
668         return ret;\r
669 }\r
670 #define new_user_v4l2ctrl(ctl_id,ctl_type,ctl_name,ctl_min,ctl_max,ctl_step,default_val,callback,seqe)\\r
671 {\\r
672     .qctrl = {\\r
673                 .id     = ctl_id,\\r
674                 .type           = ctl_type,\\r
675                 .name           = ctl_name,\\r
676                 .minimum        = ctl_min,\\r
677                 .maximum        = ctl_max,\\r
678                 .step           = ctl_step,\\r
679                 .default_value = default_val,\\r
680         },\\r
681         .cb = callback,\\r
682         .sensor_Seqe = seqe,\\r
683 }\r
684     \r
685 \r
686 #define new_usr_v4l2menu(menu_id,menu_idx,menu_name,menu_rev)\\r
687     {\\r
688         .id = menu_id,\\r
689         .index = menu_idx,\\r
690         .name = menu_name,\\r
691         .reserved = menu_rev,\\r
692     }\r
693 \r
694 #define sensor_init_parameters_default_code() static void sensor_init_parameters(struct specific_sensor* spsensor,struct soc_camera_device *icd)\\r
695 { \\r
696     int num,i; \\r
697     struct rk_sensor_sequence *sensor_series; \\r
698     struct v4l2_queryctrl *controls, *control; \\r
699     struct sensor_v4l2ctrl_info_s *ctrls; \\r
700     struct v4l2_querymenu *menus,*menu; \\r
701     struct soc_camera_link *icl = to_soc_camera_link(icd); \\r
702     struct rk29camera_platform_data *pdata = icl->priv_usr; \\r
703     struct rkcamera_platform_data *sensor_device=NULL,*new_camera; \\r
704     struct rk_sensor_reg *reg_data; \\r
705     int config_flash = 0;\\r
706     int sensor_config;\\r
707  \\r
708     if (pdata == NULL) {\\r
709         printk("WARNING: Camera sensor device is registered in board by CONFIG_SENSOR_XX,\n"\\r
710                "Please register camera sesnor deivce in struct rkcamera_platform_data new_camera[]\n");\\r
711         BUG();\\r
712     }\\r
713     sensor_config = SensorConfiguration;\\r
714     new_camera = pdata->register_dev_new; \\r
715     while (strstr(new_camera->dev_name,"end")==NULL) { \\r
716         if (strcmp(dev_name(icd->pdev), new_camera->dev_name) == 0) { \\r
717             sensor_device = new_camera; \\r
718             break; \\r
719         } \\r
720         new_camera++; \\r
721     } \\r
722  \\r
723     if(sensor_device && sensor_device->flash)\\r
724             config_flash = 1;\\r
725     spsensor->common_sensor.info_priv.gReg_mask = 0x00; \\r
726     spsensor->common_sensor.info_priv.gVal_mask = 0x00; \\r
727     for (i=0; i<SENSOR_REGISTER_LEN; i++) \\r
728             spsensor->common_sensor.info_priv.gReg_mask |= (0xff<<(i*8));  \\r
729     for (i=0; i<SENSOR_VALUE_LEN; i++) \\r
730             spsensor->common_sensor.info_priv.gVal_mask |= (0xff<<(i*8));  \\r
731         spsensor->common_sensor.info_priv.gI2c_speed = 100000;  \\r
732     if (sensor_regarray_check(sensor_softreset_data, sizeof(sensor_softreset_data)/sizeof(struct rk_sensor_reg))==0) { \\r
733         spsensor->common_sensor.info_priv.sensor_SfRstSeqe = sensor_softreset_data; \\r
734     } else { \\r
735         SENSOR_TR("sensor_softreset_data haven't SensorEnd flag! Please fill SensorEnd in the last of sensor_softreset_data"); \\r
736         BUG(); \\r
737     } \\r
738     if (sensor_regarray_check(sensor_check_id_data, sizeof(sensor_check_id_data)/sizeof(struct rk_sensor_reg))==0) { \\r
739         spsensor->common_sensor.info_priv.sensor_CkIdSeqe= sensor_check_id_data; \\r
740     } else { \\r
741         SENSOR_TR("sensor_check_id_data haven't SensorEnd flag! Please fill SensorEnd in the last of sensor_check_id_data"); \\r
742         BUG(); \\r
743     } \\r
744     spsensor->common_sensor.sensor_cb.sensor_activate_cb = sensor_activate_cb;  \\r
745         spsensor->common_sensor.sensor_cb.sensor_deactivate_cb = sensor_deactivate_cb; \\r
746         spsensor->common_sensor.sensor_cb.sensor_mirror_cb = sensor_mirror_cb; \\r
747         spsensor->common_sensor.sensor_cb.sensor_flip_cb = sensor_flip_cb; \\r
748     spsensor->common_sensor.sensor_cb.sensor_s_fmt_cb_th = sensor_s_fmt_cb_th; \\r
749     spsensor->common_sensor.sensor_cb.sensor_s_fmt_cb_bh = sensor_s_fmt_cb_bh; \\r
750         spsensor->common_sensor.sensor_cb.sensor_try_fmt_cb_th = sensor_try_fmt_cb_th;\\r
751     spsensor->common_sensor.sensor_cb.sensor_softreset_cb = sensor_softrest_usr_cb;\\r
752         spsensor->common_sensor.sensor_cb.sensor_check_id_cb = sensor_check_id_usr_cb;\\r
753     if (CFG_FunChk(sensor_config,CFG_FACE_DETECT)) \\r
754         spsensor->common_sensor.sensor_cb.sensor_face_detect_cb = sensor_face_detect_usr_cb; \\r
755     else \\r
756         spsensor->common_sensor.sensor_cb.sensor_face_detect_cb = NULL; \\r
757  \\r
758     num = 4;  \\r
759     if (sensor_720p[0].reg != SEQCMD_END) {  \\r
760         num++;  \\r
761     }  \\r
762     if (sensor_1080p[0].reg != SEQCMD_END) {  \\r
763         num++;  \\r
764     } \\r
765  \\r
766     if (sensor_device && (sensor_device->resolution > CONS(SENSOR_NAME,_FULL_RESOLUTION))) \\r
767         num++; \\r
768  \\r
769     sensor_series = (struct rk_sensor_sequence*)kzalloc(sizeof(struct rk_sensor_sequence)*num,GFP_KERNEL);  \\r
770     if (sensor_series == NULL) {  \\r
771         SENSOR_TR("malloc sensor_series failed! n");  \\r
772         BUG();  \\r
773     } else {  \\r
774         spsensor->common_sensor.info_priv.sensor_series = sensor_series;  \\r
775         spsensor->common_sensor.info_priv.num_series = num;  \\r
776  \\r
777         sensor_series->gSeq_info.w = SENSOR_PREVIEW_W;  \\r
778         sensor_series->gSeq_info.h = SENSOR_PREVIEW_H;  \\r
779         sensor_series->gSeq_info.fps = SENSOR_PREVIEW_FPS;  \\r
780         sensor_series->property = SEQUENCE_INIT;  \\r
781         if (sensor_regarray_check(sensor_init_data, sizeof(sensor_init_data)/sizeof(struct rk_sensor_reg))==0) { \\r
782             sensor_series->data = sensor_init_data; \\r
783         } else { \\r
784             SENSOR_TR("sensor_init_data haven't SensorEnd flag! Please fill SensorEnd in the last of sensor_int_data"); \\r
785             BUG(); \\r
786         } \\r
787  \\r
788         sensor_series++;  \\r
789         sensor_series->gSeq_info.w = SENSOR_PREVIEW_W;  \\r
790         sensor_series->gSeq_info.h = SENSOR_PREVIEW_H;  \\r
791         sensor_series->gSeq_info.fps = SENSOR_PREVIEW_FPS;  \\r
792         sensor_series->property = SEQUENCE_PREVIEW;  \\r
793         if (sensor_regarray_check(sensor_preview_data, sizeof(sensor_preview_data)/sizeof(struct rk_sensor_reg))==0) { \\r
794             sensor_series->data = sensor_preview_data; \\r
795         } else { \\r
796             SENSOR_TR("sensor_preview_data haven't SensorEnd flag! Please fill SensorEnd in the last of sensor_preview_data"); \\r
797             BUG(); \\r
798         } \\r
799  \\r
800         sensor_series++;  \\r
801         if (sensor_get_full_width_height(CONS(SENSOR_NAME,_FULL_RESOLUTION),&sensor_series->gSeq_info.w,&sensor_series->gSeq_info.h) == 0) {  \\r
802             sensor_series->gSeq_info.fps = SENSOR_FULLRES_L_FPS; \\r
803             sensor_series->property = SEQUENCE_CAPTURE; \\r
804             if (sensor_regarray_check(sensor_fullres_lowfps_data, sizeof(sensor_fullres_lowfps_data)/sizeof(struct rk_sensor_reg))==0) { \\r
805                 sensor_series->data = sensor_fullres_lowfps_data; \\r
806             } else { \\r
807                 SENSOR_TR("sensor_fullres_lowfps_data haven't SensorEnd flag! Please fill SensorEnd in the last of sensor_fullres_lowfps_data"); \\r
808                 BUG(); \\r
809             } \\r
810         } else {  \\r
811             SENSOR_TR("generic_sensor_get_width_height failed!");  \\r
812             BUG();  \\r
813         }  \\r
814  \\r
815         sensor_series++;  \\r
816         sensor_series->gSeq_info.w = (sensor_series-1)->gSeq_info.w; \\r
817         sensor_series->gSeq_info.h = (sensor_series-1)->gSeq_info.h; \\r
818         sensor_series->gSeq_info.fps = SENSOR_FULLRES_H_FPS;  \\r
819         sensor_series->property = SEQUENCE_PREVIEW; \\r
820         if (sensor_regarray_check(sensor_fullres_highfps_data, sizeof(sensor_fullres_highfps_data)/sizeof(struct rk_sensor_reg))==0) { \\r
821             sensor_series->data = sensor_fullres_highfps_data; \\r
822         } else { \\r
823             SENSOR_TR("sensor_fullres_highfps_data haven't SensorEnd flag! Please fill SensorEnd in the last of sensor_fullres_highfps_data"); \\r
824             BUG(); \\r
825         } \\r
826  \\r
827         if (sensor_device && (sensor_device->resolution > CONS(SENSOR_NAME,_FULL_RESOLUTION))) { \\r
828             sensor_series++; \\r
829             if (sensor_get_full_width_height(sensor_device->resolution,&sensor_series->gSeq_info.w,&sensor_series->gSeq_info.h) == 0) { \\r
830                 sensor_series->gSeq_info.fps = SENSOR_FULLRES_L_FPS; \\r
831                 sensor_series->property = SEQUENCE_CAPTURE; \\r
832                 reg_data = kzalloc(sizeof(struct rk_sensor_reg)*2,GFP_KERNEL); \\r
833                 if (reg_data == NULL) { \\r
834                     SENSOR_TR("kzalloc interpolate reg_data failed"); \\r
835                 } else { \\r
836                     sensor_series->data = reg_data; \\r
837                     reg_data->reg = SEQCMD_INTERPOLATION; \\r
838                     reg_data++; \\r
839                     reg_data->reg = SEQCMD_END; \\r
840                 } \\r
841             } else {  \\r
842                 SENSOR_TR("generic_sensor_get_width_height failed!");  \\r
843                 BUG();  \\r
844             } \\r
845         } \\r
846  \\r
847         if (sensor_720p[0].reg != SEQCMD_END) {  \\r
848             sensor_series++;  \\r
849             sensor_series->gSeq_info.w = 1280;  \\r
850             sensor_series->gSeq_info.h = 720;  \\r
851             sensor_series->gSeq_info.fps = SENSOR_720P_FPS;  \\r
852             sensor_series->property = SEQUENCE_PREVIEW;  \\r
853             if (sensor_regarray_check(sensor_720p, sizeof(sensor_720p)/sizeof(struct rk_sensor_reg))==0) { \\r
854                 sensor_series->data = sensor_720p; \\r
855             } else { \\r
856                 SENSOR_TR("sensor_720p haven't SensorEnd flag! Please fill SensorEnd in the last of sensor_720p"); \\r
857                 BUG(); \\r
858             } \\r
859         }  \\r
860  \\r
861         if (sensor_1080p[0].reg != SEQCMD_END) {  \\r
862             sensor_series++;  \\r
863             sensor_series->gSeq_info.w = 1920;  \\r
864             sensor_series->gSeq_info.h = 1080;  \\r
865             sensor_series->gSeq_info.fps = SENSOR_1080P_FPS;  \\r
866             sensor_series->property = SEQUENCE_PREVIEW;  \\r
867             if (sensor_regarray_check(sensor_1080p, sizeof(sensor_1080p)/sizeof(struct rk_sensor_reg))==0) { \\r
868                 sensor_series->data = sensor_1080p; \\r
869             } else { \\r
870                 SENSOR_TR("sensor_1080p haven't SensorEnd flag! Please fill SensorEnd in the last of sensor_1080p"); \\r
871                 BUG(); \\r
872             } \\r
873         }  \\r
874     } \\r
875  \\r
876     if (CFG_FunChk(sensor_config,CFG_Focus)) { \\r
877         spsensor->common_sensor.sensor_focus.sensor_wq = create_workqueue(SENSOR_NAME_STRING(_af_workqueue)); \\r
878         if (spsensor->common_sensor.sensor_focus.sensor_wq == NULL) {\\r
879             SENSOR_TR("%s create fail, so auto focus is disable!", SENSOR_NAME_STRING(_af_workqueue));\\r
880             CFG_FunDis(sensor_config,CFG_Focus);\\r
881             CFG_FunDis(sensor_config,CFG_FocusContinues);\\r
882             CFG_FunDis(sensor_config,CFG_FocusZone);\\r
883             CFG_FunDis(sensor_config,CFG_FocusRelative);\\r
884             CFG_FunDis(sensor_config,CFG_FocusAbsolute);\\r
885         }\\r
886     } else {\\r
887         spsensor->common_sensor.sensor_focus.sensor_wq = NULL;\\r
888         CFG_FunDis(sensor_config,CFG_FocusContinues);\\r
889         CFG_FunDis(sensor_config,CFG_FocusZone);\\r
890         CFG_FunDis(sensor_config,CFG_FocusRelative);\\r
891         CFG_FunDis(sensor_config,CFG_FocusAbsolute);\\r
892     }\\r
893 \\r
894         spsensor->common_sensor.info_priv.bus_parameter = SENSOR_BUS_PARAM; \\r
895         spsensor->common_sensor.info_priv.chip_ident = SENSOR_V4L2_IDENT; \\r
896     spsensor->common_sensor.info_priv.chip_id = SensorChipID;\\r
897     spsensor->common_sensor.info_priv.chip_id_num = sizeof(SensorChipID)/sizeof(SensorChipID[0]);\\r
898 \\r
899     generic_sensor_get_max_min_res(spsensor->common_sensor.info_priv.sensor_series ,  \\r
900                                    spsensor->common_sensor.info_priv.num_series,  \\r
901                                    &(spsensor->common_sensor.info_priv.max_real_res),  \\r
902                                                                    &(spsensor->common_sensor.info_priv.max_res),  \\r
903                                                                    &(spsensor->common_sensor.info_priv.min_res));  \\r
904  \\r
905     num = 0;\\r
906     for (i=0; i<32; i++)\\r
907         if (SensorConfiguration & (1<<i))\\r
908             num++;\\r
909     num += sizeof(sensor_controls)/sizeof(struct sensor_v4l2ctrl_usr_s);  \\r
910     num += config_flash;\\r
911     controls = (struct v4l2_queryctrl*)kzalloc(sizeof(struct v4l2_queryctrl)*num,GFP_KERNEL);  \\r
912     if (controls == NULL) {  \\r
913         SENSOR_TR("kzalloc struct v4l2_queryctrl(%d) failed",num);  \\r
914         BUG();  \\r
915     }  \\r
916     spsensor->common_sensor.sensor_controls = controls;  \\r
917     sensor_ops.controls = controls;  \\r
918     sensor_ops.num_controls = num;  \\r
919   \\r
920     ctrls = (struct sensor_v4l2ctrl_info_s*)kzalloc(sizeof(struct sensor_v4l2ctrl_info_s)*num,GFP_KERNEL);  \\r
921     if (ctrls == NULL) {  \\r
922         SENSOR_TR("kzalloc struct sensor_v4l2ctrl_info_s(%d) failed",num);  \\r
923         BUG();  \\r
924     }  \\r
925     spsensor->common_sensor.ctrls = ctrls;  \\r
926     for (i=0; i<num; i++) {  \\r
927         ctrls->qctrl = controls; \\r
928         ctrls->num_ctrls = num;  \\r
929         ctrls++;  \\r
930         controls++; \\r
931     }  \\r
932     controls = spsensor->common_sensor.sensor_controls; \\r
933     ctrls = spsensor->common_sensor.ctrls;  \\r
934  \\r
935     num = 0;  \\r
936     num += (CFG_FunChk(sensor_config,CFG_WhiteBalance)*5 + CFG_FunChk(sensor_config,CFG_Effect)*6 + CFG_FunChk(sensor_config,CFG_Scene)*2 + config_flash*4); \\r
937     num += sizeof(sensor_menus)/sizeof(struct v4l2_querymenu);  \\r
938     menus = (struct v4l2_querymenu*)kzalloc(sizeof(struct v4l2_querymenu)*num,GFP_KERNEL);  \\r
939     if (menus == NULL) {  \\r
940         SENSOR_TR("kzalloc struct v4l2_querymenu(%d) failed",num);  \\r
941         BUG();  \\r
942     }  \\r
943     sensor_ops.menus = menus;  \\r
944     sensor_ops.num_menus = num;  \\r
945  \\r
946     sensor_ops.suspend = sensor_suspend;  \\r
947     sensor_ops.resume = sensor_resume;  \\r
948     sensor_ops.set_bus_param = generic_sensor_set_bus_param;  \\r
949         sensor_ops.query_bus_param = generic_sensor_query_bus_param;  \\r
950  \\r
951     if (sizeof(sensor_ZoomSeqe)/sizeof(struct rk_sensor_reg *))\\r
952         sensor_ZoomSeqe[0] = NULL;\\r
953 \\r
954     if (CFG_FunChk(sensor_config,CFG_WhiteBalance)) { \\r
955         sensor_v4l2ctrl_info_init(ctrls,V4L2_CID_DO_WHITE_BALANCE,V4L2_CTRL_TYPE_MENU,  \\r
956                             "White Balance Control",0,4,1,0,sensor_v4l2ctrl_default_cb,sensor_WhiteBalanceSeqe);  \\r
957         controls++; \\r
958         ctrls++;  \\r
959  \\r
960         v4l2_querymenu_init(menus,V4L2_CID_DO_WHITE_BALANCE,0,"auto",0); \\r
961         menus++;  \\r
962         v4l2_querymenu_init(menus,V4L2_CID_DO_WHITE_BALANCE,1,"incandescent",0);  \\r
963         menus++;  \\r
964         v4l2_querymenu_init(menus,V4L2_CID_DO_WHITE_BALANCE,2,"fluorescent",0);  \\r
965         menus++;  \\r
966         v4l2_querymenu_init(menus,V4L2_CID_DO_WHITE_BALANCE,3,"daylight",0);  \\r
967         menus++;  \\r
968         v4l2_querymenu_init(menus,V4L2_CID_DO_WHITE_BALANCE,4,"cloudy-daylight",0);  \\r
969         menus++;  \\r
970     }  \\r
971  \\r
972     if (CFG_FunChk(sensor_config,CFG_Brightness)) { \\r
973         sensor_v4l2ctrl_info_init(ctrls,V4L2_CID_BRIGHTNESS,V4L2_CTRL_TYPE_INTEGER,  \\r
974                             "Brightness Control",-3,2,1,0,sensor_v4l2ctrl_default_cb,sensor_BrightnessSeqe);  \\r
975         controls++;  \\r
976         ctrls++;  \\r
977     }  \\r
978     if (CFG_FunChk(sensor_config,CFG_Effect)) { \\r
979         sensor_v4l2ctrl_info_init(ctrls,V4L2_CID_EFFECT,V4L2_CTRL_TYPE_MENU, \\r
980                             "Effect Control",0,5,1,0,sensor_v4l2ctrl_default_cb,sensor_EffectSeqe); \\r
981         controls++; \\r
982         ctrls++;  \\r
983  \\r
984         v4l2_querymenu_init(menus,V4L2_CID_EFFECT,0,"none",0);  \\r
985         menus++; \\r
986         v4l2_querymenu_init(menus,V4L2_CID_EFFECT,1,"mono",0);  \\r
987         menus++; \\r
988         v4l2_querymenu_init(menus,V4L2_CID_EFFECT,2,"negative",0); \\r
989         menus++; \\r
990         v4l2_querymenu_init(menus,V4L2_CID_EFFECT,3,"sepia",0); \\r
991         menus++; \\r
992         v4l2_querymenu_init(menus,V4L2_CID_EFFECT,4,"posterize",0); \\r
993         menus++; \\r
994         v4l2_querymenu_init(menus,V4L2_CID_EFFECT,5,"aqua",0); \\r
995         menus++; \\r
996     } \\r
997     if (CFG_FunChk(sensor_config,CFG_Exposure)) { \\r
998         sensor_v4l2ctrl_info_init(ctrls,V4L2_CID_EXPOSURE,V4L2_CTRL_TYPE_INTEGER, \\r
999                             "Exposure Control",0,6,1,0,sensor_v4l2ctrl_default_cb,sensor_ExposureSeqe);  \\r
1000         controls++;  \\r
1001         ctrls++;  \\r
1002     }  \\r
1003         if (CFG_FunChk(sensor_config,CFG_Saturation)) { \\r
1004         sensor_v4l2ctrl_info_init(ctrls,V4L2_CID_SATURATION,V4L2_CTRL_TYPE_INTEGER,  \\r
1005                             "Saturation Control",0,2,1,0,sensor_v4l2ctrl_default_cb,sensor_SaturationSeqe);  \\r
1006         controls++;  \\r
1007         ctrls++;  \\r
1008         }  \\r
1009         if (CFG_FunChk(sensor_config,CFG_Contrast)) { \\r
1010         sensor_v4l2ctrl_info_init(ctrls,V4L2_CID_CONTRAST,V4L2_CTRL_TYPE_INTEGER,  \\r
1011                             "Contrast Control",-3,3,1,0,sensor_v4l2ctrl_default_cb,sensor_ContrastSeqe);  \\r
1012         controls++;  \\r
1013         ctrls++;  \\r
1014         }  \\r
1015         if (CFG_FunChk(sensor_config,CFG_Mirror)) {  \\r
1016         sensor_v4l2ctrl_info_init(ctrls,V4L2_CID_HFLIP,V4L2_CTRL_TYPE_BOOLEAN, \\r
1017                             "Mirror Control",0,1,1,0,sensor_v4l2ctrl_mirror_cb,NULL); \\r
1018         controls++;  \\r
1019         ctrls++;  \\r
1020         }  \\r
1021         if (CFG_FunChk(sensor_config,CFG_Flip)) {  \\r
1022         ctrls->qctrl = controls; \\r
1023         sensor_v4l2ctrl_info_init(ctrls,V4L2_CID_VFLIP,V4L2_CTRL_TYPE_BOOLEAN,  \\r
1024                             "Flip Control",0,1,1,0,sensor_v4l2ctrl_flip_cb,NULL); \\r
1025         controls++;  \\r
1026         ctrls++;  \\r
1027         }  \\r
1028     if (CFG_FunChk(sensor_config,CFG_Scene)) { \\r
1029         sensor_v4l2ctrl_info_init(ctrls,V4L2_CID_SCENE,V4L2_CTRL_TYPE_MENU,  \\r
1030                             "Scene Control",0,1,1,0,sensor_v4l2ctrl_default_cb,sensor_SceneSeqe);  \\r
1031         controls++;  \\r
1032         ctrls++;  \\r
1033   \\r
1034         v4l2_querymenu_init(menus,V4L2_CID_SCENE,0,"auto",0);  \\r
1035         menus++;  \\r
1036         v4l2_querymenu_init(menus,V4L2_CID_SCENE,1,"night",0);  \\r
1037         menus++;  \\r
1038     }  \\r
1039     if (CFG_FunChk(sensor_config,CFG_Focus)) { \\r
1040            sensor_v4l2ctrl_info_init(ctrls,V4L2_CID_FOCUS_AUTO,V4L2_CTRL_TYPE_BOOLEAN,  \\r
1041                                                    "Focus Control",0,2,1,0,sensor_focus_default_cb,NULL);  \\r
1042            controls++;  \\r
1043            ctrls++;  \\r
1044     } \\r
1045  \\r
1046     if (CFG_FunChk(sensor_config,CFG_FocusRelative)) { \\r
1047         sensor_v4l2ctrl_info_init(ctrls,V4L2_CID_FOCUS_RELATIVE,V4L2_CTRL_TYPE_INTEGER,  \\r
1048                             "Focus Control",-1,1,1,0,sensor_focus_default_cb,NULL);  \\r
1049         controls++;  \\r
1050         ctrls++;  \\r
1051         } \\r
1052   \\r
1053    if (CFG_FunChk(sensor_config,CFG_FocusAbsolute)) { \\r
1054         sensor_v4l2ctrl_info_init(ctrls,V4L2_CID_FOCUS_ABSOLUTE,V4L2_CTRL_TYPE_INTEGER,  \\r
1055                             "Focus Control",0,255,1,125,sensor_focus_default_cb,NULL);  \\r
1056         controls++;  \\r
1057         ctrls++;  \\r
1058     }  \\r
1059     if (CFG_FunChk(sensor_config,CFG_FocusZone)) { \\r
1060             sensor_v4l2ctrl_info_init(ctrls,V4L2_CID_FOCUSZONE,V4L2_CTRL_TYPE_BOOLEAN,  \\r
1061                                                 "Focus Control",0,1,1,0,NULL,NULL);  \\r
1062             controls++;  \\r
1063             ctrls++;  \\r
1064     } \\r
1065    if (CFG_FunChk(sensor_config,CFG_FocusContinues)) { \\r
1066            sensor_v4l2ctrl_info_init(ctrls,V4L2_CID_FOCUS_CONTINUOUS,V4L2_CTRL_TYPE_BOOLEAN,  \\r
1067                                                    "Focus Control",0,1,1,0,sensor_focus_default_cb,NULL);  \\r
1068            controls++;  \\r
1069            ctrls++;  \\r
1070     } \\r
1071    if (CFG_FunChk(sensor_config,CFG_FACE_DETECT)) { \\r
1072            sensor_v4l2ctrl_info_init(ctrls,V4L2_CID_FACEDETECT,V4L2_CTRL_TYPE_BOOLEAN,  \\r
1073                                                    "FaceDEt Control",0,1,1,0,sensor_face_detect_default_cb,NULL);  \\r
1074            controls++;  \\r
1075            ctrls++;  \\r
1076         } \\r
1077     if (config_flash) { \\r
1078         sensor_v4l2ctrl_info_init(ctrls,V4L2_CID_FLASH,V4L2_CTRL_TYPE_MENU,  \\r
1079                             "Flash Control",0,3,1,0,sensor_v4l2ctrl_flash_cb,NULL);  \\r
1080         controls++;  \\r
1081         ctrls++;  \\r
1082   \\r
1083         v4l2_querymenu_init(menus,V4L2_CID_FLASH,0,"off",0);  \\r
1084         menus++;  \\r
1085         v4l2_querymenu_init(menus,V4L2_CID_FLASH,1,"auto",0);  \\r
1086         menus++;  \\r
1087         v4l2_querymenu_init(menus,V4L2_CID_FLASH,2,"on",0);  \\r
1088         menus++;  \\r
1089         v4l2_querymenu_init(menus,V4L2_CID_FLASH,3,"torch",0);  \\r
1090         menus++;  \\r
1091     }  \\r
1092   \\r
1093     for (i=0; i<(sizeof(sensor_controls)/sizeof(struct sensor_v4l2ctrl_usr_s)); i++) { \\r
1094  \\r
1095         control = spsensor->common_sensor.sensor_controls; \\r
1096         while (control < controls) \\r
1097         { \\r
1098             if (control->id == sensor_controls[i].qctrl.id) { \\r
1099                 control->id = 0xffffffff; \\r
1100             } \\r
1101             control++; \\r
1102         } \\r
1103  \\r
1104         memcpy(controls, &sensor_controls[i].qctrl,sizeof(struct v4l2_queryctrl));  \\r
1105         controls++;  \\r
1106  \\r
1107         ctrls->sensor_Seqe = sensor_controls[i].sensor_Seqe; \\r
1108         ctrls->cur_value = sensor_controls[i].qctrl.default_value; \\r
1109         ctrls->cb = sensor_controls[i].cb; \\r
1110         ctrls++; \\r
1111     }  \\r
1112  \\r
1113     for (i=0; i<(sizeof(sensor_menus)/sizeof(struct v4l2_querymenu)); i++) { \\r
1114         num = sensor_ops.num_menus - sizeof(sensor_menus)/sizeof(struct v4l2_querymenu); \\r
1115         menu = sensor_ops.menus; \\r
1116         while (num--) { \\r
1117             if (menu->id == sensor_menus[i].id) { \\r
1118                 menu->id = 0xffffffff; \\r
1119             } \\r
1120             menu++; \\r
1121         } \\r
1122  \\r
1123         memcpy(menus, &sensor_menus[i],sizeof(struct v4l2_querymenu));  \\r
1124         menus++;  \\r
1125     }  \\r
1126  \\r
1127         spsensor->common_sensor.info_priv.datafmt = sensor_colour_fmts;  \\r
1128         spsensor->common_sensor.info_priv.num_datafmt = ARRAY_SIZE(sensor_colour_fmts);  \\r
1129         spsensor->common_sensor.sensor_ops = &sensor_ops;  \\r
1130         icd->ops                = &sensor_ops;  \\r
1131         spsensor->common_sensor.info_priv.curfmt= sensor_colour_fmts[0];  \\r
1132  \\r
1133     if (config_flash) { \\r
1134         hrtimer_init(&(spsensor->common_sensor.flash_off_timer.timer), CLOCK_MONOTONIC, HRTIMER_MODE_REL);  \\r
1135         spsensor->common_sensor.flash_off_timer.icd = icd; \\r
1136     } \\r
1137     if(CFG_FunChk(sensor_config,CFG_Focus)) { \\r
1138                 mutex_init(&spsensor->common_sensor.sensor_focus.focus_lock); \\r
1139                 spsensor->common_sensor.sensor_focus.focus_mode = WqCmd_af_invalid; \\r
1140                 spsensor->common_sensor.sensor_focus.focus_state = FocusState_Inval;\\r
1141                 spsensor->common_sensor.sensor_focus.focus_cb.sensor_focus_init_cb = sensor_focus_init_usr_cb; \\r
1142                 spsensor->common_sensor.sensor_focus.focus_cb.sensor_af_single_cb = sensor_focus_af_single_usr_cb; \\r
1143                 spsensor->common_sensor.sensor_focus.focus_cb.sensor_af_near_cb = sensor_focus_af_near_usr_cb; \\r
1144                 spsensor->common_sensor.sensor_focus.focus_cb.sensor_af_far_cb = sensor_focus_af_far_usr_cb; \\r
1145                 spsensor->common_sensor.sensor_focus.focus_cb.sensor_af_specialpos_cb = sensor_focus_af_specialpos_usr_cb; \\r
1146                 if(CFG_FunChk(sensor_config,CFG_FocusContinues)) {\\r
1147                         spsensor->common_sensor.sensor_focus.focus_cb.sensor_af_const_cb = sensor_focus_af_const_usr_cb; \\r
1148                         spsensor->common_sensor.sensor_focus.focus_cb.sensor_af_const_pause_cb = sensor_focus_af_const_pause_usr_cb; \\r
1149                 }\\r
1150                 if(CFG_FunChk(sensor_config,CFG_FocusZone)) \\r
1151                         spsensor->common_sensor.sensor_focus.focus_cb.sensor_af_zoneupdate_cb = sensor_focus_af_zoneupdate_usr_cb; \\r
1152                 spsensor->common_sensor.sensor_focus.focus_cb.sensor_af_close_cb = sensor_focus_af_close_usr_cb; \\r
1153         }else{ \\r
1154                 spsensor->common_sensor.sensor_focus.focus_cb.sensor_focus_init_cb = NULL; \\r
1155                 spsensor->common_sensor.sensor_focus.focus_cb.sensor_af_single_cb = NULL; \\r
1156                 spsensor->common_sensor.sensor_focus.focus_cb.sensor_af_near_cb = NULL; \\r
1157                 spsensor->common_sensor.sensor_focus.focus_cb.sensor_af_far_cb =NULL; \\r
1158                 spsensor->common_sensor.sensor_focus.focus_cb.sensor_af_specialpos_cb =NULL; \\r
1159                 spsensor->common_sensor.sensor_focus.focus_cb.sensor_af_const_cb =NULL; \\r
1160                 spsensor->common_sensor.sensor_focus.focus_cb.sensor_af_zoneupdate_cb =NULL; \\r
1161                 spsensor->common_sensor.sensor_focus.focus_cb.sensor_af_close_cb =NULL; \\r
1162         } \\r
1163  \\r
1164     memcpy(spsensor->common_sensor.dev_name,dev_name(icd->pdev), sizeof(spsensor->common_sensor.dev_name)-1); \\r
1165     sensor_init_parameters_user(spsensor,icd);  \\r
1166 }\r
1167 \r
1168 \r
1169 #define sensor_v4l2_struct_initialization()  static struct v4l2_subdev_core_ops sensor_subdev_core_ops = {\\r
1170         .init           = generic_sensor_init,\\r
1171         .g_ctrl         = generic_sensor_g_control,\\r
1172         .s_ctrl         = generic_sensor_s_control,\\r
1173         .g_ext_ctrls              = generic_sensor_g_ext_controls,\\r
1174         .s_ext_ctrls              = generic_sensor_s_ext_controls,\\r
1175         .g_chip_ident   = generic_sensor_g_chip_ident,\\r
1176         .ioctl = generic_sensor_ioctl,\\r
1177 };\\r
1178 \\r
1179 static struct v4l2_subdev_video_ops sensor_subdev_video_ops = {\\r
1180         .s_mbus_fmt = generic_sensor_s_fmt,\\r
1181         .g_mbus_fmt = generic_sensor_g_fmt,\\r
1182         .try_mbus_fmt   = generic_sensor_try_fmt,\\r
1183         .enum_mbus_fmt  = generic_sensor_enum_fmt,\\r
1184         .enum_frameintervals = generic_sensor_enum_frameintervals,\\r
1185         .s_stream   = generic_sensor_s_stream,\\r
1186 };\\r
1187 static struct v4l2_subdev_ops sensor_subdev_ops = {\\r
1188         .core   = &sensor_subdev_core_ops,\\r
1189         .video = &sensor_subdev_video_ops,\\r
1190 };\\r
1191 \\r
1192 static const struct i2c_device_id sensor_id[] = {\\r
1193         {SENSOR_NAME_STRING(), 0 },\\r
1194     {"\0",0}\\r
1195 };\\r
1196 \\r
1197 MODULE_DEVICE_TABLE(i2c, sensor_id);\r
1198 \r
1199 \r
1200 #define sensor_probe_default_code() static int sensor_probe(struct i2c_client *client,\\r
1201                          const struct i2c_device_id *did)\\r
1202 {\\r
1203         struct specific_sensor *spsensor=NULL;\\r
1204         struct soc_camera_device *icd = client->dev.platform_data;\\r
1205         struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);\\r
1206         struct soc_camera_link *icl;\\r
1207         int ret=0;\\r
1208 \\r
1209         if (!icd) {\\r
1210                 dev_err(&client->dev, "%s: missing soc-camera data!\n",SENSOR_NAME_STRING());\\r
1211                 ret = -EINVAL;\\r
1212         goto sensor_probe_end;\\r
1213         }\\r
1214 \\r
1215         icl = to_soc_camera_link(icd);\\r
1216         if (!icl) {\\r
1217                 SENSOR_TR("driver needs platform data! But it is failed\n");\\r
1218                 ret = -EINVAL;\\r
1219         goto sensor_probe_end;\\r
1220         }\\r
1221 \\r
1222         if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) {\\r
1223                 SENSOR_TR("I2C-Adapter doesn't support I2C_FUNC_I2C\n");\\r
1224                 ret =  -EIO;\\r
1225         goto sensor_probe_end;\\r
1226         }\\r
1227 \\r
1228         spsensor = kzalloc(sizeof(struct specific_sensor), GFP_KERNEL);\\r
1229         if (!spsensor) {\\r
1230                 ret = -ENOMEM;\\r
1231         SENSOR_TR("kzalloc failed\n");\\r
1232         goto sensor_probe_end;\\r
1233         }\\r
1234 \\r
1235         v4l2_i2c_subdev_init(&spsensor->common_sensor.subdev, client, &sensor_subdev_ops);\\r
1236     sensor_init_parameters(spsensor,icd);\\r
1237 \\r
1238     ret = sensor_video_probe(icd, client);\\r
1239 \\r
1240 sensor_probe_end:\\r
1241     if (ret != 0) {\\r
1242         if (icd->ops) {\\r
1243             if (icd->ops->controls) {\\r
1244                 kfree(icd->ops->controls);\\r
1245                 icd->ops->controls = NULL;\\r
1246             }\\r
1247             if (icd->ops->menus) {\\r
1248                 kfree(icd->ops->menus);\\r
1249                 icd->ops->menus = NULL;\\r
1250             }\\r
1251             icd->ops = NULL;\\r
1252         }\\r
1253         i2c_set_clientdata(client, NULL);\\r
1254         client->driver = NULL;\\r
1255         if (spsensor) {\\r
1256             kfree(spsensor);\\r
1257         }\\r
1258         spsensor = NULL;\\r
1259     }\\r
1260         return ret;\\r
1261 }\r
1262 \r
1263 #define sensor_remove_default_code() static int sensor_remove(struct i2c_client *client)\\r
1264 {\\r
1265         struct generic_sensor*sensor = to_generic_sensor(client);\\r
1266         struct soc_camera_device *icd = client->dev.platform_data;\\r
1267         struct specific_sensor *spsensor = to_specific_sensor(sensor);\\r
1268         int sensor_config;\\r
1269 \\r
1270     sensor_config = SensorConfiguration;\\r
1271         if(CFG_FunChk(sensor_config,CFG_Focus)){ \\r
1272                 if (sensor->sensor_focus.sensor_wq) {\\r
1273                         destroy_workqueue(sensor->sensor_focus.sensor_wq);\\r
1274                         sensor->sensor_focus.sensor_wq = NULL;\\r
1275                 }\\r
1276         }\\r
1277     if (icd->ops) {\\r
1278         if (icd->ops->controls) {\\r
1279             kfree(icd->ops->controls);\\r
1280             icd->ops->controls = NULL;\\r
1281         }\\r
1282         if (icd->ops->menus) {\\r
1283             kfree(icd->ops->menus);\\r
1284             icd->ops->menus = NULL;\\r
1285         }\\r
1286             icd->ops = NULL;\\r
1287     }\\r
1288         i2c_set_clientdata(client, NULL);\\r
1289         client->driver = NULL;\\r
1290     if (spsensor) {\\r
1291         kfree(spsensor);\\r
1292     }\\r
1293         spsensor = NULL;\\r
1294         return 0;\\r
1295 }\r
1296 \r
1297 \r
1298 #define sensor_driver_default_module_code() static struct i2c_driver sensor_i2c_driver = {\\r
1299         .driver = {\\r
1300                 .name = SENSOR_NAME_STRING(),\\r
1301         },\\r
1302         .probe          = sensor_probe,\\r
1303         .remove         = sensor_remove,\\r
1304         .id_table       = sensor_id,\\r
1305 };\\r
1306 \\r
1307 static int __init sensor_mod_init(void)\\r
1308 {\\r
1309         return i2c_add_driver(&sensor_i2c_driver);\\r
1310 }\\r
1311 \\r
1312 static void __exit sensor_mod_exit(void)\\r
1313 {\\r
1314         i2c_del_driver(&sensor_i2c_driver);\\r
1315 }\\r
1316 \\r
1317 device_initcall_sync(sensor_mod_init);\\r
1318 module_exit(sensor_mod_exit);\\r
1319 \\r
1320 MODULE_DESCRIPTION(SENSOR_NAME_STRING(sensor driver));\\r
1321 MODULE_AUTHOR("<ddl@rock-chips.com,zyc@rock-chips.com>");\\r
1322 MODULE_LICENSE("GPL");\r
1323 #endif\r