camera(rk_cam_sensor:v0.1.3): add support flash control
authorddl <ddl@rock-chips.com>
Wed, 24 Apr 2013 08:18:04 +0000 (16:18 +0800)
committerddl <ddl@rock-chips.com>
Wed, 24 Apr 2013 08:18:13 +0000 (16:18 +0800)
drivers/media/video/generic_sensor.c
drivers/media/video/generic_sensor.h

index a68393bcfa99c83d925b44c8f2b4d47fc1f2ccd5..832e561541c46308bc08a4a580ded7485a909ed0 100755 (executable)
 *v0.0.1: this driver is compatible with generic_sensor\r
 *v0.1.1:\r
 *        add WqCmd_af_continues_pause;\r
+*v0.1.3:\r
+*        add support flash control;\r
 */\r
-static int version = KERNEL_VERSION(0,1,1);\r
+static int version = KERNEL_VERSION(0,1,3);\r
 module_param(version, int, S_IRUGO);\r
 \r
 \r
@@ -610,7 +612,6 @@ static const struct rk_sensor_datafmt *generic_sensor_find_datafmt(
 \r
        return NULL;\r
 }\r
-\r
 int generic_sensor_softreset(struct i2c_client *client, struct rk_sensor_reg *series) {\r
     int ret = 0;\r
     struct generic_sensor *sensor = to_generic_sensor(client);\r
@@ -715,9 +716,10 @@ int generic_sensor_ioctrl(struct soc_camera_device *icd,enum rk29sensor_power_cm
                        if (pdata && pdata->sensor_ioctrl) {\r
                                pdata->sensor_ioctrl(icd->pdev,Cam_Flash, on);\r
                                if(on==Flash_On){\r
-                                       //flash off after 1.5 secs\r
+                    mdelay(5);\r
+                                       //flash off after 2 secs\r
                                        hrtimer_cancel(&(sensor->flash_off_timer.timer));\r
-                                       hrtimer_start(&(sensor->flash_off_timer.timer),ktime_set(0, 1500*1000*1000),HRTIMER_MODE_REL);\r
+                                       hrtimer_start(&(sensor->flash_off_timer.timer),ktime_set(0, 2000*1000*1000),HRTIMER_MODE_REL);\r
                                }\r
                        }\r
                        break;\r
@@ -845,9 +847,11 @@ int generic_sensor_g_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
 int generic_sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)\r
 {\r
     struct i2c_client *client = v4l2_get_subdevdata(sd);\r
+    struct soc_camera_device *icd = client->dev.platform_data;\r
     const struct rk_sensor_datafmt *fmt;\r
     struct generic_sensor *sensor = to_generic_sensor(client);\r
     struct rk_sensor_sequence *winseqe_set_addr=NULL;\r
+    struct sensor_v4l2ctrl_info_s *v4l2ctrl_info;\r
     bool is_capture=(mf->reserved[7]==0xfefe5a5a)?true:false;\r
     int ret=0;\r
 \r
@@ -868,6 +872,17 @@ int generic_sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
         if (sensor->sensor_cb.sensor_s_fmt_cb_th)\r
             ret |= sensor->sensor_cb.sensor_s_fmt_cb_th(client, mf, is_capture);\r
         \r
+        v4l2ctrl_info = sensor_find_ctrl(sensor->ctrls,V4L2_CID_FLASH); /* ddl@rock-chips.com: v0.1.3 */        \r
+        if (v4l2ctrl_info) {   \r
+            if (is_capture) { \r
+                if ((v4l2ctrl_info->cur_value == 2) || (v4l2ctrl_info->cur_value == 1)) {\r
+                    generic_sensor_ioctrl(icd, Sensor_Flash, 1);                    \r
+                }\r
+            } else {\r
+                generic_sensor_ioctrl(icd, Sensor_Flash, 0); \r
+            }\r
+        }\r
+        \r
         ret |= generic_sensor_write_array(client, winseqe_set_addr->data);\r
         if (ret != 0) {\r
             SENSOR_TR("set format capability failed");\r
@@ -902,45 +917,6 @@ sensor_s_fmt_end:
 \r
        return 0;\r
 }\r
-int generic_sensor_set_flash(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
-{      \r
-    struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
-    struct generic_sensor *sensor = to_generic_sensor(client);\r
-    \r
-    if ((value >= qctrl->minimum) && (value <= qctrl->maximum)) {\r
-        if (value == 3) {               /* ddl@rock-chips.com: torch */\r
-            generic_sensor_ioctrl(icd, Sensor_Flash, Flash_Torch);   /* Flash On */\r
-        } else {\r
-            generic_sensor_ioctrl(icd, Sensor_Flash, Flash_Off);\r
-        }\r
-        SENSOR_DG("%s : %x",__FUNCTION__, value);\r
-        return 0;\r
-    }\r
-\r
-    SENSOR_TR("%s valure = %d is invalidate",__FUNCTION__,value);\r
-    return -EINVAL;\r
-}\r
-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
-{\r
-    struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));   \r
-    struct generic_sensor *sensor = to_generic_sensor(client);\r
-    int value = ext_ctrl->value;\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
-        return -EINVAL;\r
-    }\r
-\r
-    if (value == 3) {           /* ddl@rock-chips.com: torch */\r
-        generic_sensor_ioctrl(icd, Sensor_Flash, Flash_Torch);   /* Flash On */\r
-    } else {\r
-        generic_sensor_ioctrl(icd, Sensor_Flash, Flash_Off);\r
-    }\r
-    SENSOR_DG("%s : %x",__FUNCTION__, value);\r
-    return 0;\r
-}\r
  \r
 int generic_sensor_g_control(struct v4l2_subdev *sd, struct v4l2_control *ctrl)\r
 {\r
index c6129e0d3b94d7fc5f4c1a7148daddf1b7c842d9..e4277e9e83a2a3df5f25baf5eb0b16250f2d5e87 100755 (executable)
@@ -289,12 +289,9 @@ 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 long generic_sensor_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg);\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 sensor_v4l2ctrl_flash_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, \r
-                                                     struct v4l2_ext_control *ext_ctrl);\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
@@ -493,6 +490,29 @@ static inline int sensor_v4l2ctrl_default_cb(struct soc_camera_device *icd, stru
         return -EINVAL;\r
     }\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
+{\r
+    struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));   \r
+    struct generic_sensor *sensor = to_generic_sensor(client);\r
+    int value = ext_ctrl->value;\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
+        return -EINVAL;\r
+    }\r
+\r
+    if (value == 3) {           /* ddl@rock-chips.com: torch */\r
+        generic_sensor_ioctrl(icd, Sensor_Flash, Flash_Torch);   /* Flash On */\r
+    } else {\r
+        generic_sensor_ioctrl(icd, Sensor_Flash, Flash_Off);\r
+    }\r
+    \r
+    ctrl_info->cur_value = value;  /* ddl@rock-chips.com : v0.1.3 */\r
+    \r
+    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
 {\r
@@ -888,6 +908,7 @@ static inline int sensor_face_detect_default_cb(struct soc_camera_device *icd, s
         if (SensorConfiguration & (1<<i))\\r
             num++;\\r
     num += sizeof(sensor_controls)/sizeof(struct sensor_v4l2ctrl_usr_s);  \\r
+    num += config_flash;\\r
     controls = (struct v4l2_queryctrl*)kzalloc(sizeof(struct v4l2_queryctrl)*num,GFP_KERNEL);  \\r
     if (controls == NULL) {  \\r
         SENSOR_TR("kzalloc struct v4l2_queryctrl(%d) failed",num);  \\r