#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
//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
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
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
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
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
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
*h = 1200;\r
break;\r
}\r
+ case 0x210000:\r
+ {\r
+ *w = 1920;\r
+ *h = 1080;\r
+ break;\r
+ }\r
\r
case 0x300000:\r
{\r
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
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
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
}\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
}\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
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
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
\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
}\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
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
}\\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
} 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
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
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
} \\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
} \\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
\\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
.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
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
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
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
#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
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
\\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