diff options
| -rw-r--r-- | drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c | 22 |
1 files changed, 10 insertions, 12 deletions
diff --git a/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c b/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c index c80f8159220d..908e3c78465a 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c +++ b/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c @@ -111,6 +111,11 @@ static void msm_actuator_parse_i2c_params(struct msm_actuator_ctrl_t *a_ctrl, i2c_tbl = a_ctrl->i2c_reg_tbl; for (i = 0; i < size; i++) { + /* check that the index into i2c_tbl cannot grow larger that + the allocated size of i2c_tbl */ + if ((a_ctrl->total_steps + 1) < (a_ctrl->i2c_tbl_index)) + break; + if (write_arr[i].reg_write_type == MSM_ACTUATOR_WRITE_DAC) { value = (next_lens_position << write_arr[i].data_shift) | @@ -121,14 +126,9 @@ static void msm_actuator_parse_i2c_params(struct msm_actuator_ctrl_t *a_ctrl, i2c_byte1 = write_arr[i].reg_addr; i2c_byte2 = value; if (size != (i+1)) { - i2c_byte2 = value & 0xFF; + i2c_byte2 = (value & 0xFF00) >> 8; CDBG("byte1:0x%x, byte2:0x%x\n", i2c_byte1, i2c_byte2); - if (a_ctrl->i2c_tbl_index > - a_ctrl->total_steps) { - pr_err("failed:i2c table index out of bound\n"); - break; - } i2c_tbl[a_ctrl->i2c_tbl_index]. reg_addr = i2c_byte1; i2c_tbl[a_ctrl->i2c_tbl_index]. @@ -138,7 +138,7 @@ static void msm_actuator_parse_i2c_params(struct msm_actuator_ctrl_t *a_ctrl, a_ctrl->i2c_tbl_index++; i++; i2c_byte1 = write_arr[i].reg_addr; - i2c_byte2 = (value & 0xFF00) >> 8; + i2c_byte2 = value & 0xFF; } } else { i2c_byte1 = (value & 0xFF00) >> 8; @@ -149,10 +149,6 @@ static void msm_actuator_parse_i2c_params(struct msm_actuator_ctrl_t *a_ctrl, i2c_byte2 = (hw_dword & write_arr[i].hw_mask) >> write_arr[i].hw_shift; } - if (a_ctrl->i2c_tbl_index > a_ctrl->total_steps) { - pr_err("failed: i2c table index out of bound\n"); - break; - } CDBG("i2c_byte1:0x%x, i2c_byte2:0x%x\n", i2c_byte1, i2c_byte2); i2c_tbl[a_ctrl->i2c_tbl_index].reg_addr = i2c_byte1; i2c_tbl[a_ctrl->i2c_tbl_index].reg_data = i2c_byte2; @@ -1824,6 +1820,8 @@ static int32_t msm_actuator_power_up(struct msm_actuator_ctrl_t *a_ctrl) /* VREG needs some delay to power up */ usleep_range(2000, 3000); a_ctrl->actuator_state = ACT_ENABLE_STATE; + usleep_range(12 * 1000, (12 + * 1000) + 1000); CDBG("Exit\n"); return rc; @@ -2098,7 +2096,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, + .actuator_park_lens = NULL, /* Do not return msm_actuator_park_lens */ }, }; |
