From 8234aebbc9669379c0f940417c808fcf47b38e64 Mon Sep 17 00:00:00 2001 From: Evgeniy Borisov Date: Wed, 6 Nov 2013 16:37:54 +0200 Subject: [PATCH] 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 Signed-off-by: Lokesh Kumar Aakulu Signed-off-by: Satish Kamuju --- arch/arm/mach-msm/include/mach/board.h | 3 +- .../sensor/flash/msm_led_i2c_trigger.c | 24 ++++++--- .../camera_v2/sensor/io/msm_camera_dt_util.c | 49 +++++++++++++++++++ include/media/msm_cam_sensor.h | 2 + 4 files changed, 69 insertions(+), 9 deletions(-) diff --git a/arch/arm/mach-msm/include/mach/board.h b/arch/arm/mach-msm/include/mach/board.h index 47c07ff48f8..89e3b51fe1a 100644 --- a/arch/arm/mach-msm/include/mach/board.h +++ b/arch/arm/mach-msm/include/mach/board.h @@ -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 { diff --git a/drivers/media/platform/msm/camera_v2/sensor/flash/msm_led_i2c_trigger.c b/drivers/media/platform/msm/camera_v2/sensor/flash/msm_led_i2c_trigger.c index aeed65449b9..9cfab8f5344 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/flash/msm_led_i2c_trigger.c +++ b/drivers/media/platform/msm/camera_v2/sensor/flash/msm_led_i2c_trigger.c @@ -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) { diff --git a/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_dt_util.c b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_dt_util.c index 36f49fefe35..c89fa82f94f 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_dt_util.c +++ b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_dt_util.c @@ -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], diff --git a/include/media/msm_cam_sensor.h b/include/media/msm_cam_sensor.h index f403736d6f2..9450113ac62 100644 --- a/include/media/msm_cam_sensor.h +++ b/include/media/msm_cam_sensor.h @@ -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, };