From 3d567f08f468a496b4d1997151abd04896d0be7b Mon Sep 17 00:00:00 2001 From: Naren Bhat Date: Wed, 16 May 2012 18:49:21 -0700 Subject: media: video: tegra: ar0832: Make focuser range, slew rate tunable The range parameters & slew rate from the blocks-camera are being passed down to ODM and then to kernel. Generic structure added for sharing the data between ODM and kernel instead of specific structure. Bug 954874 Change-Id: I84656e36a5a2721c007de78aa5c20f5dfeb00361 Signed-off-by: Naren Bhat Reviewed-on: http://git-master/r/102077 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Jon Mayo --- drivers/media/video/tegra/ar0832_main.c | 41 ++++++++++++++++++++++++++------- include/media/ar0832_main.h | 13 +++-------- include/media/nvc_focus.h | 38 ++++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+), 18 deletions(-) diff --git a/drivers/media/video/tegra/ar0832_main.c b/drivers/media/video/tegra/ar0832_main.c index f3b56bbf847e..8f75527415a7 100644 --- a/drivers/media/video/tegra/ar0832_main.c +++ b/drivers/media/video/tegra/ar0832_main.c @@ -23,9 +23,11 @@ #include #include -#define POS_LOW 0 -#define POS_HIGH 1000 -#define SETTLETIME_MS 100 +#define POS_ACTUAL_LOW 0 +#define POS_ACTUAL_HIGH 255 +#define SETTLE_TIME 100 +#define SLEW_RATE_DEFAULT 1 + struct ar0832_sensor_info { int mode; @@ -33,7 +35,7 @@ struct ar0832_sensor_info { }; struct ar0832_focuser_info { - struct ar0832_focuser_config config; + struct nv_focuser_config config; int focuser_init_flag; u16 last_position; }; @@ -2160,7 +2162,8 @@ static long ar0832_ioctl(struct file *file, "%s AR0832_FOCUSER_IOCTL_GET_CONFIG\n", __func__); if (copy_to_user((void __user *) arg, &dev->focuser_info->config, - sizeof(dev->focuser_info->config))) { + sizeof(struct nv_focuser_config))) + { dev_err(&i2c_client->dev, "%s: AR0832_FOCUSER_IOCTL_GET_CONFIG failed\n", __func__); @@ -2168,6 +2171,25 @@ static long ar0832_ioctl(struct file *file, } return 0; + case AR0832_FOCUSER_IOCTL_SET_CONFIG: + dev_info(&i2c_client->dev, + "%s AR0832_FOCUSER_IOCTL_SET_CONFIG\n", __func__); + if (copy_from_user(&dev->focuser_info->config, + (const void __user *)arg, + sizeof(struct nv_focuser_config))) + { + dev_err(&i2c_client->dev, + "%s: AR0832_FOCUSER_IOCTL_SET_CONFIG failed\n", __func__); + return -EFAULT; + } + dev_dbg(&i2c_client->dev, + "%s AR0832_FOCUSER_IOCTL_SET_CONFIG sucess " + "slew_rate %i, pos_working_high %i, pos_working_low %i\n", + __func__, dev->focuser_info->config.slew_rate, + dev->focuser_info->config.pos_working_low, + dev->focuser_info->config.pos_working_high); + return 0; + case AR0832_FOCUSER_IOCTL_SET_POSITION: dev_dbg(&i2c_client->dev, "%s AR0832_FOCUSER_IOCTL_SET_POSITION\n", __func__); @@ -2443,9 +2465,12 @@ static int ar0832_probe(struct i2c_client *client, dev->i2c_client = client; /* focuser */ - dev->focuser_info->config.settle_time = SETTLETIME_MS; - dev->focuser_info->config.pos_low = POS_LOW; - dev->focuser_info->config.pos_high = POS_HIGH; + dev->focuser_info->config.settle_time = SETTLE_TIME; + dev->focuser_info->config.slew_rate = SLEW_RATE_DEFAULT; + dev->focuser_info->config.pos_actual_low = POS_ACTUAL_LOW; + dev->focuser_info->config.pos_actual_high = POS_ACTUAL_HIGH; + dev->focuser_info->config.pos_working_low = POS_ACTUAL_LOW; + dev->focuser_info->config.pos_working_high = POS_ACTUAL_HIGH; snprintf(dev->dname, sizeof(dev->dname), "%s-%s", id->name, dev->pdata->id); diff --git a/include/media/ar0832_main.h b/include/media/ar0832_main.h index f5e3713b46fb..fe46c228a9f1 100644 --- a/include/media/ar0832_main.h +++ b/include/media/ar0832_main.h @@ -12,6 +12,7 @@ #define __AR0832_MAIN_H__ #include /* For IOCTL macros */ +#include #define AR0832_IOCTL_SET_MODE _IOW('o', 0x01, struct ar0832_mode) #define AR0832_IOCTL_SET_FRAME_LENGTH _IOW('o', 0x02, __u32) @@ -23,10 +24,11 @@ #define AR0832_IOCTL_SET_POWER_ON _IOW('o', 0x08, struct ar0832_mode) #define AR0832_IOCTL_SET_SENSOR_REGION _IOW('o', 0x09, struct ar0832_stereo_region) -#define AR0832_FOCUSER_IOCTL_GET_CONFIG _IOR('o', 0x10, struct ar0832_focuser_config) +#define AR0832_FOCUSER_IOCTL_GET_CONFIG _IOR('o', 0x10, struct nv_focuser_config) #define AR0832_FOCUSER_IOCTL_SET_POSITION _IOW('o', 0x11, __u32) #define AR0832_IOCTL_GET_SENSOR_ID _IOR('o', 0x12, __u16) +#define AR0832_FOCUSER_IOCTL_SET_CONFIG _IOW('o', 0x13, struct nv_focuser_config) #define AR0832_SENSOR_ID_8141 0x1006 #define AR0832_SENSOR_ID_8140 0x3006 @@ -85,15 +87,6 @@ struct ar0832_stereo_region { struct ar0832_point image_end; }; -struct ar0832_focuser_config { - __u32 settle_time; - __u32 actuator_range; - __u32 pos_low; - __u32 pos_high; - __u32 focal_length; - __u32 fnumber; - __u32 max_aperture; -}; #ifdef __KERNEL__ struct ar0832_platform_data { diff --git a/include/media/nvc_focus.h b/include/media/nvc_focus.h index bed9df11a34a..c6ff1fa792c1 100644 --- a/include/media/nvc_focus.h +++ b/include/media/nvc_focus.h @@ -59,5 +59,43 @@ struct nvc_focus_cap { __u32 focus_infinity; } __packed; + +#define NV_FOCUSER_SET_MAX 10 +#define NV_FOCUSER_SET_DISTANCE_PAIR 16 + +struct nv_focuser_set_dist_pairs { + __s32 fdn; + __s32 distance; +}; + +struct nv_focuser_set { + __s32 posture; + __s32 macro; + __s32 hyper; + __s32 inf; + __s32 hysteresis; + __u32 settle_time; + __s32 macro_offset; + __s32 inf_offset; + __u32 num_dist_pairs; + struct nv_focuser_set_dist_pairs dist_pair[NV_FOCUSER_SET_DISTANCE_PAIR]; +}; + +struct nv_focuser_config { + __u32 focal_length; + __u32 fnumber; + __u32 max_aperture; + __u32 actuator_range; + __u32 settle_time; + __s32 pos_working_low; + __s32 pos_working_high; + __s32 pos_actual_low; + __s32 pos_actual_high; + __u32 slew_rate; + __u32 circle_of_confusion; + struct nv_focuser_set focuser_set[NV_FOCUSER_SET_MAX]; +}; + + #endif /* __NVC_FOCUS_H__ */ -- cgit v1.2.3