*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
\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
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
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
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
\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
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
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
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