forked from rubenslte/android_kernel_samsung_msm8226
msm: camera: Fix for gpio usage in camera modules
Add valid flags for all initialized camera gpios. This change also will protect wrong operations with gpio #0. Change-Id: Ibb40140c9708f0d7582b643fc81ec72cdfbdbee1 Signed-off-by: Evgeniy Borisov <eborisov@codeaurora.org> Signed-off-by: Lokesh Kumar Aakulu <lkumar@codeaurora.org> Signed-off-by: Satish Kamuju <skamuj@codeaurora.org>
This commit is contained in:
committed by
Satish Kamuju
parent
131a9186a1
commit
8234aebbc9
@@ -183,7 +183,8 @@ struct msm_gpio_set_tbl {
|
||||
};
|
||||
|
||||
struct msm_camera_gpio_num_info {
|
||||
uint16_t gpio_num[7];
|
||||
uint16_t gpio_num[10];
|
||||
uint8_t valid[10];
|
||||
};
|
||||
|
||||
struct msm_camera_gpio_conf {
|
||||
|
||||
@@ -117,7 +117,8 @@ int msm_flash_led_init(struct msm_led_flash_ctrl_t *fctrl)
|
||||
}
|
||||
msleep(20);
|
||||
gpio_set_value_cansleep(
|
||||
power_info->gpio_conf->gpio_num_info->gpio_num[0],
|
||||
power_info->gpio_conf->gpio_num_info->
|
||||
gpio_num[SENSOR_GPIO_FL_EN],
|
||||
GPIO_OUT_HIGH);
|
||||
|
||||
if (fctrl->flash_i2c_client && fctrl->reg_setting) {
|
||||
@@ -145,10 +146,12 @@ int msm_flash_led_release(struct msm_led_flash_ctrl_t *fctrl)
|
||||
return -EINVAL;
|
||||
}
|
||||
gpio_set_value_cansleep(
|
||||
power_info->gpio_conf->gpio_num_info->gpio_num[0],
|
||||
power_info->gpio_conf->gpio_num_info->
|
||||
gpio_num[SENSOR_GPIO_FL_EN],
|
||||
GPIO_OUT_LOW);
|
||||
gpio_set_value_cansleep(
|
||||
power_info->gpio_conf->gpio_num_info->gpio_num[1],
|
||||
power_info->gpio_conf->gpio_num_info->
|
||||
gpio_num[SENSOR_GPIO_FL_NOW],
|
||||
GPIO_OUT_LOW);
|
||||
rc = msm_camera_request_gpio_table(
|
||||
power_info->gpio_conf->cam_gpio_req_tbl,
|
||||
@@ -181,7 +184,8 @@ int msm_flash_led_off(struct msm_led_flash_ctrl_t *fctrl)
|
||||
pr_err("%s:%d failed\n", __func__, __LINE__);
|
||||
}
|
||||
gpio_set_value_cansleep(
|
||||
power_info->gpio_conf->gpio_num_info->gpio_num[1],
|
||||
power_info->gpio_conf->gpio_num_info->
|
||||
gpio_num[SENSOR_GPIO_FL_NOW],
|
||||
GPIO_OUT_LOW);
|
||||
|
||||
return rc;
|
||||
@@ -197,11 +201,13 @@ int msm_flash_led_low(struct msm_led_flash_ctrl_t *fctrl)
|
||||
flashdata = fctrl->flashdata;
|
||||
power_info = &flashdata->power_info;
|
||||
gpio_set_value_cansleep(
|
||||
power_info->gpio_conf->gpio_num_info->gpio_num[0],
|
||||
power_info->gpio_conf->gpio_num_info->
|
||||
gpio_num[SENSOR_GPIO_FL_EN],
|
||||
GPIO_OUT_HIGH);
|
||||
|
||||
gpio_set_value_cansleep(
|
||||
power_info->gpio_conf->gpio_num_info->gpio_num[1],
|
||||
power_info->gpio_conf->gpio_num_info->
|
||||
gpio_num[SENSOR_GPIO_FL_NOW],
|
||||
GPIO_OUT_HIGH);
|
||||
|
||||
|
||||
@@ -226,11 +232,13 @@ int msm_flash_led_high(struct msm_led_flash_ctrl_t *fctrl)
|
||||
flashdata = fctrl->flashdata;
|
||||
power_info = &flashdata->power_info;
|
||||
gpio_set_value_cansleep(
|
||||
power_info->gpio_conf->gpio_num_info->gpio_num[0],
|
||||
power_info->gpio_conf->gpio_num_info->
|
||||
gpio_num[SENSOR_GPIO_FL_EN],
|
||||
GPIO_OUT_HIGH);
|
||||
|
||||
gpio_set_value_cansleep(
|
||||
power_info->gpio_conf->gpio_num_info->gpio_num[1],
|
||||
power_info->gpio_conf->gpio_num_info->
|
||||
gpio_num[SENSOR_GPIO_FL_NOW],
|
||||
GPIO_OUT_HIGH);
|
||||
|
||||
if (fctrl->flash_i2c_client && fctrl->reg_setting) {
|
||||
|
||||
@@ -706,6 +706,7 @@ int msm_camera_init_gpio_pin_tbl(struct device_node *of_node,
|
||||
}
|
||||
gconf->gpio_num_info->gpio_num[SENSOR_GPIO_VDIG] =
|
||||
gpio_array[val];
|
||||
gconf->gpio_num_info->valid[SENSOR_GPIO_VDIG] = 1;
|
||||
CDBG("%s qcom,gpio-reset %d\n", __func__,
|
||||
gconf->gpio_num_info->gpio_num[SENSOR_GPIO_VDIG]);
|
||||
}
|
||||
@@ -723,6 +724,7 @@ int msm_camera_init_gpio_pin_tbl(struct device_node *of_node,
|
||||
}
|
||||
gconf->gpio_num_info->gpio_num[SENSOR_GPIO_RESET] =
|
||||
gpio_array[val];
|
||||
gconf->gpio_num_info->valid[SENSOR_GPIO_RESET] = 1;
|
||||
CDBG("%s qcom,gpio-reset %d\n", __func__,
|
||||
gconf->gpio_num_info->gpio_num[SENSOR_GPIO_RESET]);
|
||||
}
|
||||
@@ -740,9 +742,47 @@ int msm_camera_init_gpio_pin_tbl(struct device_node *of_node,
|
||||
}
|
||||
gconf->gpio_num_info->gpio_num[SENSOR_GPIO_STANDBY] =
|
||||
gpio_array[val];
|
||||
gconf->gpio_num_info->valid[SENSOR_GPIO_STANDBY] = 1;
|
||||
CDBG("%s qcom,gpio-reset %d\n", __func__,
|
||||
gconf->gpio_num_info->gpio_num[SENSOR_GPIO_STANDBY]);
|
||||
}
|
||||
|
||||
if (of_property_read_bool(of_node, "qcom,gpio-flash-en") == true) {
|
||||
rc = of_property_read_u32(of_node, "qcom,gpio-flash-en", &val);
|
||||
if (rc < 0) {
|
||||
pr_err("%s:%d read qcom,gpio-flash-en failed rc %d\n",
|
||||
__func__, __LINE__, rc);
|
||||
goto ERROR;
|
||||
} else if (val >= gpio_array_size) {
|
||||
pr_err("%s:%d qcom,gpio-flash-en invalid %d\n",
|
||||
__func__, __LINE__, val);
|
||||
goto ERROR;
|
||||
}
|
||||
gconf->gpio_num_info->gpio_num[SENSOR_GPIO_FL_EN] =
|
||||
gpio_array[val];
|
||||
gconf->gpio_num_info->valid[SENSOR_GPIO_FL_EN] = 1;
|
||||
CDBG("%s qcom,gpio-flash-en %d\n", __func__,
|
||||
gconf->gpio_num_info->gpio_num[SENSOR_GPIO_FL_EN]);
|
||||
}
|
||||
|
||||
if (of_property_read_bool(of_node, "qcom,gpio-flash-now") == true) {
|
||||
rc = of_property_read_u32(of_node, "qcom,gpio-flash-now", &val);
|
||||
if (rc < 0) {
|
||||
pr_err("%s:%d read qcom,gpio-flash-now failed rc %d\n",
|
||||
__func__, __LINE__, rc);
|
||||
goto ERROR;
|
||||
} else if (val >= gpio_array_size) {
|
||||
pr_err("%s:%d qcom,gpio-flash-now invalid %d\n",
|
||||
__func__, __LINE__, val);
|
||||
goto ERROR;
|
||||
}
|
||||
gconf->gpio_num_info->gpio_num[SENSOR_GPIO_FL_NOW] =
|
||||
gpio_array[val];
|
||||
gconf->gpio_num_info->valid[SENSOR_GPIO_FL_NOW] = 1;
|
||||
CDBG("%s qcom,gpio-flash-now %d\n", __func__,
|
||||
gconf->gpio_num_info->gpio_num[SENSOR_GPIO_FL_NOW]);
|
||||
}
|
||||
|
||||
return rc;
|
||||
|
||||
ERROR:
|
||||
@@ -935,6 +975,9 @@ int msm_camera_power_up(struct msm_camera_power_ctrl_t *ctrl,
|
||||
SENSOR_GPIO_MAX);
|
||||
goto power_up_failed;
|
||||
}
|
||||
if (!ctrl->gpio_conf->gpio_num_info->valid
|
||||
[power_setting->seq_val])
|
||||
continue;
|
||||
CDBG("%s:%d gpio set val %d\n", __func__, __LINE__,
|
||||
ctrl->gpio_conf->gpio_num_info->gpio_num
|
||||
[power_setting->seq_val]);
|
||||
@@ -1003,6 +1046,9 @@ power_up_failed:
|
||||
0);
|
||||
break;
|
||||
case SENSOR_GPIO:
|
||||
if (!ctrl->gpio_conf->gpio_num_info->valid
|
||||
[power_setting->seq_val])
|
||||
continue;
|
||||
gpio_set_value_cansleep(
|
||||
ctrl->gpio_conf->gpio_num_info->gpio_num
|
||||
[power_setting->seq_val], GPIOF_OUT_INIT_LOW);
|
||||
@@ -1073,6 +1119,9 @@ int msm_camera_power_down(struct msm_camera_power_ctrl_t *ctrl,
|
||||
SENSOR_GPIO_MAX);
|
||||
continue;
|
||||
}
|
||||
if (!ctrl->gpio_conf->gpio_num_info->valid
|
||||
[power_setting->seq_val])
|
||||
continue;
|
||||
gpio_set_value_cansleep(
|
||||
ctrl->gpio_conf->gpio_num_info->gpio_num
|
||||
[power_setting->seq_val],
|
||||
|
||||
@@ -94,6 +94,8 @@ enum msm_sensor_power_seq_gpio_t {
|
||||
SENSOR_GPIO_VANA,
|
||||
SENSOR_GPIO_VDIG,
|
||||
SENSOR_GPIO_VAF,
|
||||
SENSOR_GPIO_FL_EN,
|
||||
SENSOR_GPIO_FL_NOW,
|
||||
SENSOR_GPIO_MAX,
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user