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:
Evgeniy Borisov
2014-02-10 20:55:03 +05:30
committed by Satish Kamuju
parent 131a9186a1
commit 8234aebbc9
4 changed files with 69 additions and 9 deletions
+2 -1
View File
@@ -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],
+2
View File
@@ -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,
};