camera: oneframe v0.1.e
[firefly-linux-kernel-4.4.55.git] / drivers / media / video / generic_sensor.h
index 8b77a356e473f157e3455e48c82a30a432f27ea9..4575ba69e55a6259602a04d64f006138dec2435f 100755 (executable)
@@ -12,8 +12,9 @@
 #include <media/v4l2-chip-ident.h>\r
 #include <media/soc_camera.h>\r
 #include <linux/vmalloc.h>\r
-#include <plat/rk_camera.h>\r
-\r
+#include <linux/module.h>\r
+#include "../../../arch/arm/mach-rockchip/rk30_camera.h"/*yzm*/\r
+#include <linux/kernel.h>\r
 /* Camera Sensor driver */\r
 \r
 #define MIN(x,y)   ((x<y) ? x: y)\r
@@ -30,6 +31,8 @@
 //a represents a generic_sensor type point\r
 #define to_specific_sensor(a) (container_of(a, struct specific_sensor, common_sensor))\r
 \r
+#define SENSOR_CROP_PERCENT   0         // Redefine this macro in sensor driver if user want to crop\r
+\r
 #define SENSOR_INIT_IS_ERR      (0x00<<28)\r
 #define SENSOR_INIT_IS_OK       (0x01<<28)\r
 \r
@@ -207,7 +210,7 @@ typedef struct rk_sensor_priv_s
 struct sensor_v4l2ctrl_info_s {\r
     struct v4l2_queryctrl *qctrl;\r
     int (*cb)(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, \r
-              struct v4l2_ext_control *ext_ctrl);\r
+              struct v4l2_ext_control *ext_ctrl,bool is_set);\r
     struct rk_sensor_reg **sensor_Seqe;\r
     int cur_value;\r
     int num_ctrls;\r
@@ -216,7 +219,7 @@ struct sensor_v4l2ctrl_info_s {
 struct sensor_v4l2ctrl_usr_s {\r
     struct v4l2_queryctrl qctrl;\r
     int (*cb)(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, \r
-              struct v4l2_ext_control *ext_ctrl);\r
+              struct v4l2_ext_control *ext_ctrl,bool is_set);\r
     struct rk_sensor_reg **sensor_Seqe;\r
 };\r
 \r
@@ -232,6 +235,9 @@ struct sensor_ops_cb_s{
        int (*sensor_s_fmt_cb_th)(struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture);\r
        int (*sensor_s_fmt_cb_bh)(struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture);\r
        int (*sensor_try_fmt_cb_th)(struct i2c_client *client,struct v4l2_mbus_framefmt *mf);\r
+       int (*sensor_s_stream_cb)(struct v4l2_subdev *sd, int enable);\r
+    int (*sensor_enum_framesizes)(struct v4l2_subdev *sd, struct v4l2_frmsizeenum *fsize);\r
+\r
 };\r
 //flash off in fixed time to prevent from too hot , zyc\r
 struct rk_flash_timer{\r
@@ -242,21 +248,23 @@ struct    rk_flash_timer{
 struct generic_sensor\r
 {\r
     char dev_name[32];\r
-       struct v4l2_subdev subdev;\r
-       struct i2c_client *client;\r
-       rk_sensor_info_priv_t info_priv;\r
-       int model;      /* V4L2_IDENT_OV* codes from v4l2-chip-ident.h */\r
-       \r
-       bool is_need_tasklock;\r
-       atomic_t tasklock_cnt;\r
-       struct soc_camera_ops *sensor_ops; \r
-       struct v4l2_queryctrl* sensor_controls;  \r
-       struct sensor_v4l2ctrl_info_s *ctrls;\r
-       struct rk_flash_timer flash_off_timer;\r
-       struct sensor_ops_cb_s sensor_cb;\r
-       struct rk_sensor_focus_op_s sensor_focus;\r
-       struct rk29camera_platform_data *sensor_io_request;\r
-       struct rk29camera_gpio_res *sensor_gpio_res;\r
+    struct v4l2_subdev subdev;\r
+    struct i2c_client *client;\r
+    rk_sensor_info_priv_t info_priv;\r
+    int model; /* V4L2_IDENT_OV* codes from v4l2-chip-ident.h */\r
+\r
+    int crop_percent;\r
+\r
+    bool is_need_tasklock;\r
+    atomic_t tasklock_cnt;\r
+    struct soc_camera_ops *sensor_ops; \r
+    struct v4l2_queryctrl* sensor_controls;  \r
+    struct sensor_v4l2ctrl_info_s *ctrls;\r
+    struct rk_flash_timer flash_off_timer;\r
+    struct sensor_ops_cb_s sensor_cb;\r
+    struct rk_sensor_focus_op_s sensor_focus;\r
+    struct rk29camera_platform_data *sensor_io_request;\r
+    struct rk29camera_gpio_res *sensor_gpio_res;\r
        \r
 };\r
 \r
@@ -289,12 +297,15 @@ extern int generic_sensor_s_ext_control(struct soc_camera_device *icd, struct v4
 extern int generic_sensor_g_ext_controls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ext_ctrl);\r
 extern int generic_sensor_s_ext_controls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ext_ctrl);\r
 extern long generic_sensor_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg);\r
+extern int generic_sensor_s_power(struct v4l2_subdev *sd, int on);/*yzm*/\r
 extern int generic_sensor_enum_fmt(struct v4l2_subdev *sd, unsigned int index,enum v4l2_mbus_pixelcode *code);\r
 extern int generic_sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf);\r
 extern int generic_sensor_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *id);\r
 extern int generic_sensor_af_workqueue_set(struct soc_camera_device *icd, enum rk_sensor_focus_wq_cmd cmd, int var, bool wait);\r
 extern int generic_sensor_s_stream(struct v4l2_subdev *sd, int enable);\r
 extern int generic_sensor_writebuf(struct i2c_client *client, char *buf, int buf_size);\r
+extern int generic_sensor_cropcap(struct v4l2_subdev *sd, struct v4l2_cropcap *cc);\r
+extern int generic_sensor_enum_framesizes(struct v4l2_subdev *sd, struct v4l2_frmsizeenum *fsize);\r
 \r
 static inline int sensor_get_full_width_height(int full_resolution, unsigned short *w, unsigned short *h)\r
 {\r
@@ -327,6 +338,12 @@ static inline int sensor_get_full_width_height(int full_resolution, unsigned sho
             *h = 1200;\r
             break;\r
         }\r
+        case 0x210000:\r
+        {\r
+            *w = 1920;\r
+            *h = 1080;\r
+            break;\r
+        }\r
 \r
         case 0x300000:\r
         {\r
@@ -359,16 +376,17 @@ static inline int sensor_video_probe(struct soc_camera_device *icd,
                                   struct i2c_client *client)\r
 {\r
        int ret;\r
+       \r
        struct generic_sensor *sensor = to_generic_sensor(client);\r
 \r
        /* We must have a parent by now. And it cannot be a wrong one.\r
         * So this entire test is completely redundant. */\r
-       if (!icd->dev.parent ||\r
-               to_soc_camera_host(icd->dev.parent)->nr != icd->iface) {\r
+       if (!icd->parent ||\r
+               to_soc_camera_host(icd->parent)->nr != icd->iface) {\r
                ret = -ENODEV;\r
                goto sensor_video_probe_end;\r
        }\r
-\r
+       \r
        generic_sensor_softreset(client,sensor->info_priv.sensor_SfRstSeqe);\r
     ret = generic_sensor_check_id(client,sensor->info_priv.sensor_CkIdSeqe);\r
 \r
@@ -399,13 +417,12 @@ static inline void sensor_v4l2ctrl_info_init (struct sensor_v4l2ctrl_info_s *ptr
                                         int step,\r
                                         int default_val,\r
                                         int(*cb)(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, \r
-                                                 struct v4l2_ext_control *ext_ctrl),\r
+                                                 struct v4l2_ext_control *ext_ctrl,bool is_set),\r
                                         struct rk_sensor_reg ** sensor_seqe\r
                                         )\r
 {\r
     ptr->qctrl->id = id;\r
        ptr->qctrl->type = type;\r
-       strcat(ptr->qctrl->name,name);\r
        ptr->qctrl->minimum = min;\r
        ptr->qctrl->maximum = max;\r
     ptr->qctrl->step = step;\r
@@ -454,7 +471,7 @@ static inline int sensor_v4l2ctrl_replace_cb(struct generic_sensor *sensor, int
             ctrls->cb = cb;\r
             break;\r
         }\r
-    }\r
+    } \r
 \r
     if (i>=num) {\r
         printk(KERN_ERR "%s(%d): v4l2_control id(0x%x) isn't exist\n",__FUNCTION__,__LINE__,id);\r
@@ -464,11 +481,15 @@ static inline int sensor_v4l2ctrl_replace_cb(struct generic_sensor *sensor, int
 }\r
 \r
 static inline int sensor_v4l2ctrl_default_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, \r
-                                                     struct v4l2_ext_control *ext_ctrl)\r
+                                                     struct v4l2_ext_control *ext_ctrl,bool is_set)\r
 {\r
     struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));    \r
     int value = ext_ctrl->value;\r
     int index;\r
+    \r
+    if(!is_set){\r
+        return 0;\r
+    }\r
 \r
     if ((value < ctrl_info->qctrl->minimum) || (value > ctrl_info->qctrl->maximum)) {\r
         printk(KERN_ERR "%s(%d): value(0x%x) isn't between in (0x%x,0x%x)\n",__FUNCTION__,__LINE__,value,\r
@@ -491,11 +512,19 @@ static inline int sensor_v4l2ctrl_default_cb(struct soc_camera_device *icd, stru
     }\r
 }\r
 static inline int sensor_v4l2ctrl_flash_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, \r
-                                                     struct v4l2_ext_control *ext_ctrl)\r
+                                                     struct v4l2_ext_control *ext_ctrl,bool is_set)\r
 {\r
     //struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
     int value = ext_ctrl->value;\r
 \r
+       \r
+       if(value == 0xfefe5a5a){        \r
+               if ((ctrl_info->cur_value == 2) || (ctrl_info->cur_value == 1)) {\r
+                       generic_sensor_ioctrl(icd, Sensor_Flash, Flash_On);                                     \r
+               }\r
+               \r
+               return 0;\r
+       }\r
     if ((value < ctrl_info->qctrl->minimum) || (value > ctrl_info->qctrl->maximum)) {\r
         printk(KERN_ERR "%s(%d): value(0x%x) isn't between in (0x%x,0x%x)\n",__FUNCTION__,__LINE__,value,\r
             ctrl_info->qctrl->minimum,ctrl_info->qctrl->maximum);\r
@@ -513,7 +542,7 @@ static inline int sensor_v4l2ctrl_flash_cb(struct soc_camera_device *icd, struct
     return 0;\r
 }\r
 static inline int sensor_focus_default_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, \r
-                                                                                                        struct v4l2_ext_control *ext_ctrl)\r
+                                                                                                        struct v4l2_ext_control *ext_ctrl,bool is_set)\r
 {\r
        struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));    \r
        int value = ext_ctrl->value;\r
@@ -525,7 +554,7 @@ static inline int sensor_focus_default_cb(struct soc_camera_device *icd, struct
                        ctrl_info->qctrl->minimum,ctrl_info->qctrl->maximum);\r
                return -EINVAL;\r
        }\r
-    \r
+\r
        if(sensor->sensor_focus.focus_state == FocusState_Inval){\r
                printk(KERN_ERR "%s(%d): focus have not been init success yet\n",__FUNCTION__,__LINE__);\r
                //set focus delay\r
@@ -648,7 +677,7 @@ static inline int sensor_focus_default_cb(struct soc_camera_device *icd, struct
 \r
 }\r
 static inline int sensor_face_detect_default_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, \r
-                                                                                                        struct v4l2_ext_control *ext_ctrl)\r
+                                                                                                        struct v4l2_ext_control *ext_ctrl,bool is_set)\r
 {\r
        struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));    \r
        int value = ext_ctrl->value;\r
@@ -667,6 +696,24 @@ static inline int sensor_face_detect_default_cb(struct soc_camera_device *icd, s
        }\r
        return ret;\r
 }\r
+static int sensor_v4l2ctrl_mirror_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, \r
+                                                                                                        struct v4l2_ext_control *ext_ctrl);\r
+static int sensor_v4l2ctrl_flip_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, \r
+                                                                                                        struct v4l2_ext_control *ext_ctrl);\r
+                                                                                                        \r
+static inline int sensor_v4l2ctrl_mirror_default_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, \r
+                                                                                                        struct v4l2_ext_control *ext_ctrl,bool is_set){\r
+       return sensor_v4l2ctrl_mirror_cb(icd,ctrl_info, ext_ctrl);\r
+                                                                                        \r
+\r
+}\r
+static inline int sensor_v4l2ctrl_flip_default_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, \r
+                                                                                                        struct v4l2_ext_control *ext_ctrl,bool is_set){\r
+       return sensor_v4l2ctrl_flip_cb(icd,ctrl_info, ext_ctrl);\r
+                                                                                        \r
+\r
+}\r
+\r
 #define new_user_v4l2ctrl(ctl_id,ctl_type,ctl_name,ctl_min,ctl_max,ctl_step,default_val,callback,seqe)\\r
 {\\r
     .qctrl = {\\r
@@ -698,12 +745,13 @@ static inline int sensor_face_detect_default_cb(struct soc_camera_device *icd, s
     struct v4l2_queryctrl *controls, *control; \\r
     struct sensor_v4l2ctrl_info_s *ctrls; \\r
     struct v4l2_querymenu *menus,*menu; \\r
-    struct soc_camera_link *icl = to_soc_camera_link(icd); \\r
-    struct rk29camera_platform_data *pdata = icl->priv_usr; \\r
+       struct soc_camera_desc *desc = to_soc_camera_desc(icd);\\r
+    struct rk29camera_platform_data *pdata = desc->subdev_desc.drv_priv; \\r
     struct rkcamera_platform_data *sensor_device=NULL,*new_camera; \\r
     struct rk_sensor_reg *reg_data; \\r
     int config_flash = 0;\\r
     int sensor_config;\\r
+       struct soc_camera_ops* sensor_ops_p = NULL;\\r
  \\r
     if (pdata == NULL) {\\r
         printk("WARNING: Camera sensor device is registered in board by CONFIG_SENSOR_XX,\n"\\r
@@ -712,12 +760,12 @@ static inline int sensor_face_detect_default_cb(struct soc_camera_device *icd, s
     }\\r
     sensor_config = SensorConfiguration;\\r
     new_camera = pdata->register_dev_new; \\r
-    while (strstr(new_camera->dev_name,"end")==NULL) { \\r
-        if (strcmp(dev_name(icd->pdev), new_camera->dev_name) == 0) { \\r
+       while(new_camera != NULL){\\r
+               if (strcmp(dev_name(icd->pdev), new_camera->dev_name) == 0) { \\r
             sensor_device = new_camera; \\r
             break; \\r
         } \\r
-        new_camera++; \\r
+        new_camera = new_camera->next_camera; \\r
     } \\r
  \\r
     if(sensor_device && sensor_device->flash)\\r
@@ -773,6 +821,7 @@ static inline int sensor_face_detect_default_cb(struct soc_camera_device *icd, s
     } else {  \\r
         spsensor->common_sensor.info_priv.sensor_series = sensor_series;  \\r
         spsensor->common_sensor.info_priv.num_series = num;  \\r
+        spsensor->common_sensor.crop_percent = SENSOR_CROP_PERCENT;\\r
  \\r
         sensor_series->gSeq_info.w = SENSOR_PREVIEW_W;  \\r
         sensor_series->gSeq_info.h = SENSOR_PREVIEW_H;  \\r
@@ -914,8 +963,13 @@ static inline int sensor_face_detect_default_cb(struct soc_camera_device *icd, s
         BUG();  \\r
     }  \\r
     spsensor->common_sensor.sensor_controls = controls;  \\r
-    sensor_ops.controls = controls;  \\r
-    sensor_ops.num_controls = num;  \\r
+    sensor_ops_p = (struct soc_camera_ops*)kzalloc(sizeof(struct soc_camera_ops),GFP_KERNEL);  \\r
+       if (sensor_ops_p == NULL) {  \\r
+               SENSOR_TR("kzalloc struct soc_camera_ops failed");      \\r
+               BUG();  \\r
+       }  \\r
+    sensor_ops_p->controls = controls;  \\r
+    sensor_ops_p->num_controls = num;  \\r
   \\r
     ctrls = (struct sensor_v4l2ctrl_info_s*)kzalloc(sizeof(struct sensor_v4l2ctrl_info_s)*num,GFP_KERNEL);  \\r
     if (ctrls == NULL) {  \\r
@@ -940,13 +994,13 @@ static inline int sensor_face_detect_default_cb(struct soc_camera_device *icd, s
         SENSOR_TR("kzalloc struct v4l2_querymenu(%d) failed",num);  \\r
         BUG();  \\r
     }  \\r
-    sensor_ops.menus = menus;  \\r
-    sensor_ops.num_menus = num;  \\r
+    sensor_ops_p->menus = menus;  \\r
+    sensor_ops_p->num_menus = num;  \\r
  \\r
-    sensor_ops.suspend = sensor_suspend;  \\r
-    sensor_ops.resume = sensor_resume;  \\r
-    sensor_ops.set_bus_param = generic_sensor_set_bus_param;  \\r
-       sensor_ops.query_bus_param = generic_sensor_query_bus_param;  \\r
+    sensor_ops_p->suspend = sensor_suspend;  \\r
+    sensor_ops_p->resume = sensor_resume;  \\r
+    sensor_ops_p->set_bus_param = generic_sensor_set_bus_param;  \\r
+       sensor_ops_p->query_bus_param = generic_sensor_query_bus_param;  \\r
  \\r
     if (sizeof(sensor_ZoomSeqe)/sizeof(struct rk_sensor_reg *))\\r
         sensor_ZoomSeqe[0] = NULL;\\r
@@ -1014,14 +1068,14 @@ static inline int sensor_face_detect_default_cb(struct soc_camera_device *icd, s
        }  \\r
        if (CFG_FunChk(sensor_config,CFG_Mirror)) {  \\r
         sensor_v4l2ctrl_info_init(ctrls,V4L2_CID_HFLIP,V4L2_CTRL_TYPE_BOOLEAN, \\r
-                            "Mirror Control",0,1,1,0,sensor_v4l2ctrl_mirror_cb,NULL); \\r
+                            "Mirror Control",0,1,1,0,sensor_v4l2ctrl_mirror_default_cb,NULL); \\r
         controls++;  \\r
         ctrls++;  \\r
        }  \\r
        if (CFG_FunChk(sensor_config,CFG_Flip)) {  \\r
         ctrls->qctrl = controls; \\r
         sensor_v4l2ctrl_info_init(ctrls,V4L2_CID_VFLIP,V4L2_CTRL_TYPE_BOOLEAN,  \\r
-                            "Flip Control",0,1,1,0,sensor_v4l2ctrl_flip_cb,NULL); \\r
+                            "Flip Control",0,1,1,0,sensor_v4l2ctrl_flip_default_cb,NULL); \\r
         controls++;  \\r
         ctrls++;  \\r
        }  \\r
@@ -1111,8 +1165,8 @@ static inline int sensor_face_detect_default_cb(struct soc_camera_device *icd, s
     }  \\r
  \\r
     for (i=0; i<(sizeof(sensor_menus)/sizeof(struct v4l2_querymenu)); i++) { \\r
-        num = sensor_ops.num_menus - sizeof(sensor_menus)/sizeof(struct v4l2_querymenu); \\r
-        menu = sensor_ops.menus; \\r
+        num = sensor_ops_p->num_menus - sizeof(sensor_menus)/sizeof(struct v4l2_querymenu); \\r
+        menu = sensor_ops_p->menus; \\r
         while (num--) { \\r
             if (menu->id == sensor_menus[i].id) { \\r
                 menu->id = 0xffffffff; \\r
@@ -1126,8 +1180,8 @@ static inline int sensor_face_detect_default_cb(struct soc_camera_device *icd, s
  \\r
        spsensor->common_sensor.info_priv.datafmt = sensor_colour_fmts;  \\r
        spsensor->common_sensor.info_priv.num_datafmt = ARRAY_SIZE(sensor_colour_fmts);  \\r
-       spsensor->common_sensor.sensor_ops = &sensor_ops;  \\r
-       icd->ops                = &sensor_ops;  \\r
+       spsensor->common_sensor.sensor_ops = sensor_ops_p;  \\r
+       icd->ops                = sensor_ops_p;  \\r
        spsensor->common_sensor.info_priv.curfmt= sensor_colour_fmts[0];  \\r
  \\r
     if (config_flash) { \\r
@@ -1174,15 +1228,18 @@ static inline int sensor_face_detect_default_cb(struct soc_camera_device *icd, s
        .s_ext_ctrls              = generic_sensor_s_ext_controls,\\r
        .g_chip_ident   = generic_sensor_g_chip_ident,\\r
        .ioctl = generic_sensor_ioctl,\\r
+       .s_power = generic_sensor_s_power,\\r
 };\\r
 \\r
 static struct v4l2_subdev_video_ops sensor_subdev_video_ops = {\\r
        .s_mbus_fmt = generic_sensor_s_fmt,\\r
        .g_mbus_fmt = generic_sensor_g_fmt,\\r
+    .cropcap = generic_sensor_cropcap,\\r
        .try_mbus_fmt   = generic_sensor_try_fmt,\\r
        .enum_mbus_fmt  = generic_sensor_enum_fmt,\\r
        .enum_frameintervals = generic_sensor_enum_frameintervals,\\r
        .s_stream   = generic_sensor_s_stream,\\r
+       .enum_framesizes = generic_sensor_enum_framesizes,\\r
 };\\r
 static struct v4l2_subdev_ops sensor_subdev_ops = {\\r
        .core   = &sensor_subdev_core_ops,\\r
@@ -1201,9 +1258,11 @@ MODULE_DEVICE_TABLE(i2c, sensor_id);
                         const struct i2c_device_id *did)\\r
 {\\r
        struct specific_sensor *spsensor=NULL;\\r
-       struct soc_camera_device *icd = client->dev.platform_data;\\r
+       struct soc_camera_subdev_desc *ssdd = client->dev.platform_data;\\r
+       struct soc_camera_desc *desc = container_of(ssdd,struct soc_camera_desc,subdev_desc);\\r
+       struct soc_camera_device *icd = ssdd->socdev;\\r
        struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);\\r
-       struct soc_camera_link *icl;\\r
+\\r
        int ret=0;\\r
 \\r
        if (!icd) {\\r
@@ -1212,8 +1271,8 @@ MODULE_DEVICE_TABLE(i2c, sensor_id);
         goto sensor_probe_end;\\r
        }\\r
 \\r
-       icl = to_soc_camera_link(icd);\\r
-       if (!icl) {\\r
+       desc = to_soc_camera_desc(icd);\\r
+       if (!desc) {\\r
                SENSOR_TR("driver needs platform data! But it is failed\n");\\r
                ret = -EINVAL;\\r
         goto sensor_probe_end;\\r
@@ -1248,6 +1307,7 @@ sensor_probe_end:\
                 kfree(icd->ops->menus);\\r
                 icd->ops->menus = NULL;\\r
             }\\r
+            kfree(icd->ops);\\r
            icd->ops = NULL;\\r
         }\\r
         i2c_set_clientdata(client, NULL);\\r
@@ -1263,7 +1323,8 @@ sensor_probe_end:\
 #define sensor_remove_default_code() static int sensor_remove(struct i2c_client *client)\\r
 {\\r
        struct generic_sensor*sensor = to_generic_sensor(client);\\r
-       struct soc_camera_device *icd = client->dev.platform_data;\\r
+       struct soc_camera_subdev_desc *ssdd = client->dev.platform_data;\\r
+       struct soc_camera_device *icd = ssdd->socdev;\\r
        struct specific_sensor *spsensor = to_specific_sensor(sensor);\\r
        int sensor_config;\\r
 \\r
@@ -1283,6 +1344,7 @@ sensor_probe_end:\
             kfree(icd->ops->menus);\\r
             icd->ops->menus = NULL;\\r
         }\\r
+           kfree(icd->ops);\\r
            icd->ops = NULL;\\r
     }\\r
        i2c_set_clientdata(client, NULL);\\r
@@ -1316,8 +1378,8 @@ static void __exit sensor_mod_exit(void)\
 \\r
 device_initcall_sync(sensor_mod_init);\\r
 module_exit(sensor_mod_exit);\\r
-\\r
-MODULE_DESCRIPTION(SENSOR_NAME_STRING(sensor driver));\\r
+MODULE_DESCRIPTION(SENSOR_NAME_STRING(sensor driver)); \\r
 MODULE_AUTHOR("<ddl@rock-chips.com,zyc@rock-chips.com>");\\r
+\\r
 MODULE_LICENSE("GPL");\r
 #endif\r