Loading drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c +64 −0 Original line number Diff line number Diff line Loading @@ -372,6 +372,53 @@ static int32_t msm_actuator_move_focus( return rc; } static int32_t msm_actuator_park_lens(struct msm_actuator_ctrl_t *a_ctrl) { int32_t rc = 0; uint16_t next_lens_pos = 0; struct msm_camera_i2c_reg_setting reg_setting; a_ctrl->i2c_tbl_index = 0; if ((a_ctrl->curr_step_pos > a_ctrl->total_steps) || (!a_ctrl->park_lens.max_step) || (!a_ctrl->step_position_table)) { pr_err("%s:%d Failed to park lens.\n", __func__, __LINE__); return 0; } if (a_ctrl->park_lens.max_step > a_ctrl->max_code_size) a_ctrl->park_lens.max_step = a_ctrl->max_code_size; next_lens_pos = a_ctrl->step_position_table[a_ctrl->curr_step_pos]; while (next_lens_pos) { next_lens_pos = (next_lens_pos > a_ctrl->park_lens.max_step) ? (next_lens_pos - a_ctrl->park_lens.max_step) : 0; a_ctrl->func_tbl->actuator_parse_i2c_params(a_ctrl, next_lens_pos, a_ctrl->park_lens.hw_params, a_ctrl->park_lens.damping_delay); reg_setting.reg_setting = a_ctrl->i2c_reg_tbl; reg_setting.size = a_ctrl->i2c_tbl_index; reg_setting.data_type = a_ctrl->i2c_data_type; rc = a_ctrl->i2c_client.i2c_func_tbl-> i2c_write_table_w_microdelay( &a_ctrl->i2c_client, ®_setting); if (rc < 0) { pr_err("%s Failed I2C write Line %d\n", __func__, __LINE__); return rc; } a_ctrl->i2c_tbl_index = 0; /* Use typical damping time delay to avoid tick sound */ usleep_range(10000, 12000); } return 0; } static int32_t msm_actuator_init_step_table(struct msm_actuator_ctrl_t *a_ctrl, struct msm_actuator_set_info_t *set_info) { Loading @@ -386,6 +433,7 @@ static int32_t msm_actuator_init_step_table(struct msm_actuator_ctrl_t *a_ctrl, for (; data_size > 0; data_size--) max_code_size *= 2; a_ctrl->max_code_size = max_code_size; kfree(a_ctrl->step_position_table); a_ctrl->step_position_table = NULL; Loading Loading @@ -477,6 +525,13 @@ static int32_t msm_actuator_power_down(struct msm_actuator_ctrl_t *a_ctrl) int32_t rc = 0; CDBG("Enter\n"); if (a_ctrl->actuator_state != ACTUATOR_POWER_DOWN) { if (a_ctrl->func_tbl && a_ctrl->func_tbl->actuator_park_lens) { rc = a_ctrl->func_tbl->actuator_park_lens(a_ctrl); if (rc < 0) pr_err("%s:%d Lens park failed.\n", __func__, __LINE__); } if (a_ctrl->vcm_enable) { rc = gpio_direction_output(a_ctrl->vcm_pwd, 0); if (!rc) Loading Loading @@ -659,6 +714,9 @@ static int32_t msm_actuator_set_param(struct msm_actuator_ctrl_t *a_ctrl, } } /* Park lens data */ a_ctrl->park_lens = set_info->actuator_params.park_lens; a_ctrl->initial_code = set_info->af_tuning_params.initial_code; if (a_ctrl->func_tbl->actuator_init_step_table) rc = a_ctrl->func_tbl-> Loading Loading @@ -920,6 +978,10 @@ static long msm_actuator_subdev_do_ioctl( .region_params = compat_ptr( u32->cfg.set_info.af_tuning_params .region_params); actuator_data.cfg.set_info.actuator_params.park_lens = u32->cfg.set_info.actuator_params.park_lens; parg = &actuator_data; break; case CFG_SET_DEFAULT_FOCUS: Loading Loading @@ -1236,6 +1298,7 @@ static struct msm_actuator msm_vcm_actuator_table = { .actuator_init_focus = msm_actuator_init_focus, .actuator_parse_i2c_params = msm_actuator_parse_i2c_params, .actuator_set_position = msm_actuator_set_position, .actuator_park_lens = msm_actuator_park_lens, }, }; Loading @@ -1249,6 +1312,7 @@ static struct msm_actuator msm_piezo_actuator_table = { msm_actuator_piezo_set_default_focus, .actuator_init_focus = msm_actuator_init_focus, .actuator_parse_i2c_params = msm_actuator_parse_i2c_params, .actuator_park_lens = NULL, }, }; Loading drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.h +3 −0 Original line number Diff line number Diff line Loading @@ -55,6 +55,7 @@ struct msm_actuator_func_tbl { int16_t); int32_t (*actuator_set_position)(struct msm_actuator_ctrl_t *, struct msm_actuator_set_position_t *); int32_t (*actuator_park_lens)(struct msm_actuator_ctrl_t *); }; struct msm_actuator { Loading Loading @@ -102,6 +103,8 @@ struct msm_actuator_ctrl_t { enum msm_actuator_state_t actuator_state; struct msm_actuator_vreg vreg_cfg; uint32_t valid_position; struct park_lens_data_t park_lens; uint32_t max_code_size; }; #endif include/media/msm_cam_sensor.h +9 −0 Original line number Diff line number Diff line Loading @@ -649,6 +649,13 @@ struct msm_actuator_tuning_params_t { struct region_params_t *region_params; }; struct park_lens_data_t { uint32_t damping_step; uint32_t damping_delay; uint32_t hw_params; uint32_t max_step; }; struct msm_actuator_params_t { enum actuator_type act_type; uint8_t reg_tbl_size; Loading @@ -659,6 +666,7 @@ struct msm_actuator_params_t { enum msm_actuator_data_type i2c_data_type; struct msm_actuator_reg_params_t *reg_tbl_params; struct reg_settings_t *init_settings; struct park_lens_data_t park_lens; }; struct msm_actuator_set_info_t { Loading Loading @@ -823,6 +831,7 @@ struct msm_actuator_params_t32 { enum msm_actuator_data_type i2c_data_type; compat_uptr_t reg_tbl_params; compat_uptr_t init_settings; struct park_lens_data_t park_lens; }; struct msm_actuator_set_info_t32 { Loading Loading
drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c +64 −0 Original line number Diff line number Diff line Loading @@ -372,6 +372,53 @@ static int32_t msm_actuator_move_focus( return rc; } static int32_t msm_actuator_park_lens(struct msm_actuator_ctrl_t *a_ctrl) { int32_t rc = 0; uint16_t next_lens_pos = 0; struct msm_camera_i2c_reg_setting reg_setting; a_ctrl->i2c_tbl_index = 0; if ((a_ctrl->curr_step_pos > a_ctrl->total_steps) || (!a_ctrl->park_lens.max_step) || (!a_ctrl->step_position_table)) { pr_err("%s:%d Failed to park lens.\n", __func__, __LINE__); return 0; } if (a_ctrl->park_lens.max_step > a_ctrl->max_code_size) a_ctrl->park_lens.max_step = a_ctrl->max_code_size; next_lens_pos = a_ctrl->step_position_table[a_ctrl->curr_step_pos]; while (next_lens_pos) { next_lens_pos = (next_lens_pos > a_ctrl->park_lens.max_step) ? (next_lens_pos - a_ctrl->park_lens.max_step) : 0; a_ctrl->func_tbl->actuator_parse_i2c_params(a_ctrl, next_lens_pos, a_ctrl->park_lens.hw_params, a_ctrl->park_lens.damping_delay); reg_setting.reg_setting = a_ctrl->i2c_reg_tbl; reg_setting.size = a_ctrl->i2c_tbl_index; reg_setting.data_type = a_ctrl->i2c_data_type; rc = a_ctrl->i2c_client.i2c_func_tbl-> i2c_write_table_w_microdelay( &a_ctrl->i2c_client, ®_setting); if (rc < 0) { pr_err("%s Failed I2C write Line %d\n", __func__, __LINE__); return rc; } a_ctrl->i2c_tbl_index = 0; /* Use typical damping time delay to avoid tick sound */ usleep_range(10000, 12000); } return 0; } static int32_t msm_actuator_init_step_table(struct msm_actuator_ctrl_t *a_ctrl, struct msm_actuator_set_info_t *set_info) { Loading @@ -386,6 +433,7 @@ static int32_t msm_actuator_init_step_table(struct msm_actuator_ctrl_t *a_ctrl, for (; data_size > 0; data_size--) max_code_size *= 2; a_ctrl->max_code_size = max_code_size; kfree(a_ctrl->step_position_table); a_ctrl->step_position_table = NULL; Loading Loading @@ -477,6 +525,13 @@ static int32_t msm_actuator_power_down(struct msm_actuator_ctrl_t *a_ctrl) int32_t rc = 0; CDBG("Enter\n"); if (a_ctrl->actuator_state != ACTUATOR_POWER_DOWN) { if (a_ctrl->func_tbl && a_ctrl->func_tbl->actuator_park_lens) { rc = a_ctrl->func_tbl->actuator_park_lens(a_ctrl); if (rc < 0) pr_err("%s:%d Lens park failed.\n", __func__, __LINE__); } if (a_ctrl->vcm_enable) { rc = gpio_direction_output(a_ctrl->vcm_pwd, 0); if (!rc) Loading Loading @@ -659,6 +714,9 @@ static int32_t msm_actuator_set_param(struct msm_actuator_ctrl_t *a_ctrl, } } /* Park lens data */ a_ctrl->park_lens = set_info->actuator_params.park_lens; a_ctrl->initial_code = set_info->af_tuning_params.initial_code; if (a_ctrl->func_tbl->actuator_init_step_table) rc = a_ctrl->func_tbl-> Loading Loading @@ -920,6 +978,10 @@ static long msm_actuator_subdev_do_ioctl( .region_params = compat_ptr( u32->cfg.set_info.af_tuning_params .region_params); actuator_data.cfg.set_info.actuator_params.park_lens = u32->cfg.set_info.actuator_params.park_lens; parg = &actuator_data; break; case CFG_SET_DEFAULT_FOCUS: Loading Loading @@ -1236,6 +1298,7 @@ static struct msm_actuator msm_vcm_actuator_table = { .actuator_init_focus = msm_actuator_init_focus, .actuator_parse_i2c_params = msm_actuator_parse_i2c_params, .actuator_set_position = msm_actuator_set_position, .actuator_park_lens = msm_actuator_park_lens, }, }; Loading @@ -1249,6 +1312,7 @@ static struct msm_actuator msm_piezo_actuator_table = { msm_actuator_piezo_set_default_focus, .actuator_init_focus = msm_actuator_init_focus, .actuator_parse_i2c_params = msm_actuator_parse_i2c_params, .actuator_park_lens = NULL, }, }; Loading
drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.h +3 −0 Original line number Diff line number Diff line Loading @@ -55,6 +55,7 @@ struct msm_actuator_func_tbl { int16_t); int32_t (*actuator_set_position)(struct msm_actuator_ctrl_t *, struct msm_actuator_set_position_t *); int32_t (*actuator_park_lens)(struct msm_actuator_ctrl_t *); }; struct msm_actuator { Loading Loading @@ -102,6 +103,8 @@ struct msm_actuator_ctrl_t { enum msm_actuator_state_t actuator_state; struct msm_actuator_vreg vreg_cfg; uint32_t valid_position; struct park_lens_data_t park_lens; uint32_t max_code_size; }; #endif
include/media/msm_cam_sensor.h +9 −0 Original line number Diff line number Diff line Loading @@ -649,6 +649,13 @@ struct msm_actuator_tuning_params_t { struct region_params_t *region_params; }; struct park_lens_data_t { uint32_t damping_step; uint32_t damping_delay; uint32_t hw_params; uint32_t max_step; }; struct msm_actuator_params_t { enum actuator_type act_type; uint8_t reg_tbl_size; Loading @@ -659,6 +666,7 @@ struct msm_actuator_params_t { enum msm_actuator_data_type i2c_data_type; struct msm_actuator_reg_params_t *reg_tbl_params; struct reg_settings_t *init_settings; struct park_lens_data_t park_lens; }; struct msm_actuator_set_info_t { Loading Loading @@ -823,6 +831,7 @@ struct msm_actuator_params_t32 { enum msm_actuator_data_type i2c_data_type; compat_uptr_t reg_tbl_params; compat_uptr_t init_settings; struct park_lens_data_t park_lens; }; struct msm_actuator_set_info_t32 { Loading