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 <eborisov@codeaurora.org>
This commit is contained in:
Shivaramraje Nimbalkar Joshi
2014-03-20 05:39:42 -07:00
committed by Gerrit - the friendly Code Review server
parent 7fd25c8278
commit 61c641f922
3 changed files with 120 additions and 11 deletions
@@ -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__,
@@ -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",
+16 -11
View File
@@ -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 {