From 61c641f92254bbd0804b22b8d23daebad480efcc Mon Sep 17 00:00:00 2001 From: Shivaramraje Nimbalkar Joshi Date: Fri, 27 Dec 2013 15:09:43 -0800 Subject: [PATCH] msm-camera: Update sensor mount angle and position Update sensor driver to add sensor mount angle and position as part of media entity flag for Camera MultiModule sensor sub-devices. This info is used by upper layers to get the info from media device entity insted of opening camera to reduce the launch latency. Change-Id: Ieba103d5ab9e74a3210261b5660f41867ef5c773 Signed-off-by: Evgeniy Borisov --- .../msm/camera_v2/sensor/msm_sensor.c | 6 ++ .../msm/camera_v2/sensor/msm_sensor_driver.c | 98 +++++++++++++++++++ include/media/msm_cam_sensor.h | 27 ++--- 3 files changed, 120 insertions(+), 11 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor.c b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor.c index 87ad9945b12..279a7dd59bc 100755 --- a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor.c +++ b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor.c @@ -169,6 +169,7 @@ static int32_t msm_sensor_get_dt_data(struct device_node *of_node, if (rc < 0) { pr_err("%s Default sensor position %d\n", __func__, __LINE__); sensordata->sensor_info->position = 0; + rc = 0; } rc = of_property_read_u32(of_node, "qcom,sensor-mode", @@ -178,6 +179,7 @@ static int32_t msm_sensor_get_dt_data(struct device_node *of_node, if (rc < 0) { pr_err("%s Default sensor mode %d\n", __func__, __LINE__); sensordata->sensor_info->modes_supported = 0; + rc = 0; } rc = msm_sensor_get_dt_csi_data(of_node, &sensordata->csi_lane_params); @@ -573,6 +575,10 @@ int msm_sensor_config(struct msm_sensor_ctrl_t *s_ctrl, void __user *argp) s_ctrl->sensordata->sensor_info->is_mount_angle_valid; cdata->cfg.sensor_info.sensor_mount_angle = s_ctrl->sensordata->sensor_info->sensor_mount_angle; + cdata->cfg.sensor_info.position = + s_ctrl->sensordata->sensor_info->position; + cdata->cfg.sensor_info.modes_supported = + s_ctrl->sensordata->sensor_info->modes_supported; CDBG("%s:%d sensor name %s\n", __func__, __LINE__, cdata->cfg.sensor_info.sensor_name); CDBG("%s:%d session id %d\n", __func__, __LINE__, diff --git a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c index f5be347bdc3..772ed0eff6d 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c +++ b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c @@ -27,6 +27,8 @@ #define CDBG(fmt, args...) pr_debug(fmt, ##args) #endif +#define SENSOR_MAX_MOUNTANGLE (360) + /* Static declaration */ static struct msm_sensor_ctrl_t *g_sctrl[MAX_CAMERAS]; @@ -260,6 +262,58 @@ static int32_t msm_sensor_fill_actuator_subdevid_by_name( return rc; } +static int32_t msm_sensor_fill_slave_info_init_params( + struct msm_camera_sensor_slave_info *slave_info, + struct msm_sensor_info_t *sensor_info) +{ + struct msm_sensor_init_params *sensor_init_params; + if (!slave_info || !sensor_info) + return -EINVAL; + + if (!slave_info->is_init_params_valid) + return 0; + + sensor_init_params = &slave_info->sensor_init_params; + if (INVALID_CAMERA_B != sensor_init_params->position) + sensor_info->position = + sensor_init_params->position; + + if (SENSOR_MAX_MOUNTANGLE > sensor_init_params->sensor_mount_angle) { + sensor_info->sensor_mount_angle = + sensor_init_params->sensor_mount_angle; + sensor_info->is_mount_angle_valid = 1; + } + + if (CAMERA_MODE_INVALID != sensor_init_params->modes_supported) + sensor_info->modes_supported = + sensor_init_params->modes_supported; + + return 0; +} + + +static int32_t msm_sensor_validate_slave_info( + struct msm_sensor_info_t *sensor_info) +{ + if (INVALID_CAMERA_B == sensor_info->position) { + sensor_info->position = BACK_CAMERA_B; + pr_err("%s Set dafault sensor position%d\n", + __func__, __LINE__); + } + if (CAMERA_MODE_INVALID == sensor_info->modes_supported) { + sensor_info->modes_supported = CAMERA_MODE_2D_B; + pr_err("%s Set dafault sensor modes_supported%d\n", + __func__, __LINE__); + } + if (SENSOR_MAX_MOUNTANGLE < sensor_info->sensor_mount_angle) { + sensor_info->sensor_mount_angle = 0; + pr_err("%s Set dafault sensor mount angle%d\n", + __func__, __LINE__); + sensor_info->is_mount_angle_valid = 1; + } + return 0; +} + /* static function definition */ int32_t msm_sensor_driver_probe(void *setting) { @@ -274,6 +328,7 @@ int32_t msm_sensor_driver_probe(void *setting) struct msm_camera_power_ctrl_t *power_info = NULL; int c, end; struct msm_sensor_power_setting power_down_setting_t; + unsigned long mount_pos = 0; /* Validate input parameters */ if (!setting) { @@ -304,6 +359,13 @@ int32_t msm_sensor_driver_probe(void *setting) CDBG("size %d", slave_info->power_setting_array.size); CDBG("size down %d", slave_info->power_setting_array.size_down); + if (slave_info->is_init_params_valid) { + CDBG("position %d", + slave_info->sensor_init_params.position); + CDBG("mount %d", + slave_info->sensor_init_params.sensor_mount_angle); + } + /* Validate camera id */ if (slave_info->camera_id >= MAX_CAMERAS) { pr_err("failed: invalid camera id %d max %d", @@ -537,6 +599,25 @@ int32_t msm_sensor_driver_probe(void *setting) /* Power down */ s_ctrl->func_tbl->sensor_power_down(s_ctrl); + rc = msm_sensor_fill_slave_info_init_params( + slave_info, + s_ctrl->sensordata->sensor_info); + if (rc < 0) { + pr_err("%s Fill slave info failed", slave_info->sensor_name); + goto FREE_CAMERA_INFO; + } + rc = msm_sensor_validate_slave_info(s_ctrl->sensordata->sensor_info); + if (rc < 0) { + pr_err("%s Validate slave info failed", + slave_info->sensor_name); + goto FREE_CAMERA_INFO; + } + /* Update sensor mount angle and position in media entity flag */ + mount_pos = s_ctrl->sensordata->sensor_info->position << 16; + mount_pos = mount_pos | ((s_ctrl->sensordata->sensor_info-> + sensor_mount_angle / 90) << 8); + s_ctrl->msm_sd.sd.entity.flags = mount_pos | MEDIA_ENT_FL_DEFAULT; + /*Save sensor info*/ s_ctrl->sensordata->cam_slave_info = slave_info; @@ -707,6 +788,23 @@ static int32_t msm_sensor_driver_get_dt_data(struct msm_sensor_ctrl_t *s_ctrl) sensordata->sensor_info->is_mount_angle_valid = 1; } + rc = of_property_read_u32(of_node, "qcom,sensor-position", + &sensordata->sensor_info->position); + if (rc < 0) { + pr_err("%s:%d Invalid sensor position\n", __func__, __LINE__); + sensordata->sensor_info->position = INVALID_CAMERA_B; + rc = 0; + } + + rc = of_property_read_u32(of_node, "qcom,sensor-mode", + &sensordata->sensor_info->modes_supported); + if (rc < 0) { + pr_err("%s:%d Invalid sensor mode supported\n", + __func__, __LINE__); + sensordata->sensor_info->modes_supported = CAMERA_MODE_INVALID; + rc = 0; + } + /* Get vdd-cx regulator */ /*Optional property, don't return error if absent */ of_property_read_string(of_node, "qcom,vdd-cx-name", diff --git a/include/media/msm_cam_sensor.h b/include/media/msm_cam_sensor.h index a88a71da5ef..8199643540b 100644 --- a/include/media/msm_cam_sensor.h +++ b/include/media/msm_cam_sensor.h @@ -246,16 +246,6 @@ enum cci_i2c_master_t { MASTER_MAX, }; -struct msm_camera_sensor_slave_info { - char sensor_name[32]; - char eeprom_name[32]; - char actuator_name[32]; - enum msm_sensor_camera_id_t camera_id; - uint16_t slave_addr; - enum msm_camera_i2c_reg_addr_type addr_type; - struct msm_sensor_id_info_t sensor_id_info; - struct msm_sensor_power_setting_array power_setting_array; -}; struct msm_camera_i2c_reg_array { uint16_t reg_addr; @@ -343,6 +333,7 @@ struct csi_lane_params_t { enum camb_position_t { BACK_CAMERA_B, FRONT_CAMERA_B, + INVALID_CAMERA_B, }; struct msm_sensor_info_t { @@ -366,7 +357,8 @@ struct camera_vreg_t { enum camerab_mode_t { CAMERA_MODE_2D_B = (1<<0), - CAMERA_MODE_3D_B = (1<<1) + CAMERA_MODE_3D_B = (1<<1), + CAMERA_MODE_INVALID = (1<<2), }; struct msm_sensor_init_params { @@ -378,6 +370,19 @@ struct msm_sensor_init_params { uint32_t sensor_mount_angle; }; +struct msm_camera_sensor_slave_info { + char sensor_name[32]; + char eeprom_name[32]; + char actuator_name[32]; + enum msm_sensor_camera_id_t camera_id; + uint16_t slave_addr; + enum msm_camera_i2c_reg_addr_type addr_type; + struct msm_sensor_id_info_t sensor_id_info; + struct msm_sensor_power_setting_array power_setting_array; + uint8_t is_init_params_valid; + struct msm_sensor_init_params sensor_init_params; +}; + struct sensorb_cfg_data { int cfgtype; union {