[COMMON] fimc-is2: add delay time when retry sensor i2c read
authorWooyeon Kim <wooy88.kim@samsung.com>
Wed, 10 Apr 2019 12:50:48 +0000 (21:50 +0900)
committerlingsen1 <lingsen1@lenovo.com>
Mon, 10 Jun 2019 03:24:58 +0000 (11:24 +0800)
 - when retried sensor module power off to on
   add to get delay more

   3ms -> 5ms

CRs-fixed: (CR)

Change-Id: I7de6811c889e2efb2cf069a16654d3bf8ca0ac22
Signed-off-by: Wooyeon Kim <wooy88.kim@samsung.com>
Reviewed-on: https://gerrit.mot.com/1334944
SLTApproved: Slta Waiver
SME-Granted: SME Approvals Granted
Tested-by: Jira Key
Reviewed-by: Dawei Wang <wangdw10@motorola.com>
Reviewed-by: Zhichao Chen <chenzc2@motorola.com>
Submit-Approved: Lu Lu <lulu2@mt.com>

drivers/media/platform/exynos/fimc-is2/fimc-is-device-sensor.h
drivers/media/platform/exynos/fimc-is2/ischain/setup-fimc-is-module.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-2x5sp.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-5e9.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-base.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-gm1sp.c
include/dt-bindings/camera/fimc_is.h

index c62096d9cf074526146bbd7a88fe69b1d607f5d7..dd85c06495929616b76393e76b1abb0fb211dfe7 100644 (file)
@@ -287,6 +287,7 @@ struct fimc_is_module_enum {
        struct fimc_is_sensor_cfg                       *cfg;
        struct fimc_is_sensor_vc_extra_info             vc_extra_info[VC_BUF_DATA_TYPE_MAX];
        u32                                             vc_buffer_offset[CSI_VIRTUAL_CH_MAX];
+       u32                                             power_retry;
        struct i2c_client                               *client;
        struct sensor_open_extended                     ext;
        struct fimc_is_sensor_ops                       *ops;
index 7da220159dbebb7e9ef47e211b6c31bfd8b7757c..9821b20ad6d25561487a75ea48d6db03b2d62952 100644 (file)
@@ -172,6 +172,10 @@ static int exynos_fimc_is_module_pin_control(struct fimc_is_module_enum *module,
        case PIN_I2C:
                ret = fimc_is_i2c_pin_control(module, scenario, value);
                break;
+       case PIN_RETRY:
+               if (module->power_retry)
+                       usleep_range(delay, delay);
+               break;
        default:
                pr_err("unknown act for pin\n");
                break;
index a7f0fb7d18e60c71fa4ea225f4417fb331d2b57b..c46de0bb7d552b0b9b57923f2474e32c3ee80912 100644 (file)
@@ -195,6 +195,7 @@ static int sensor_module_2x5sp_power_setpin(struct device *dev,
 
        SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 0);
        SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 3000);
+       SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "retry delay", PIN_RETRY, 0, 2000);
 
        /* BACK CAEMRA - POWER OFF */
        SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst", PIN_RESET, 0, 10);
@@ -221,6 +222,7 @@ static int sensor_module_2x5sp_power_setpin(struct device *dev,
 
        SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 0);
        SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 3000);
+       SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_none, "retry delay", PIN_RETRY, 0, 2000);
 
 
        /* REAR VISION CAEMRA - POWER OFF */
@@ -244,6 +246,7 @@ static int sensor_module_2x5sp_power_setpin(struct device *dev,
 
        SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 0);
        SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 3000);
+       SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_none, "retry delay", PIN_RETRY, 0, 2000);
 
 
        /* REAR VISION CAEMRA - POWER OFF */
index 3640505d2b4ae1a12cf44b02b29c141c76cdbe23..168dca025f5e218299ff46d118a27d83511c8228 100644 (file)
@@ -289,6 +289,7 @@ static int sensor_module_5e9_power_setpin_1(struct device *dev,
 
        SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 0);
        SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 3000);
+       SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "retry delay", PIN_RETRY, 0, 2000);
 
        /* Normal Off */
        SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst", PIN_OUTPUT, 0, 0);
@@ -310,6 +311,7 @@ static int sensor_module_5e9_power_setpin_1(struct device *dev,
        SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_iovdd_en, "iovdd_en", PIN_OUTPUT, 1, 500);
        SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 0);
        SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 3000);
+       SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_none, "retry delay", PIN_RETRY, 0, 2000);
 
        /* Normal Off */
        SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst", PIN_OUTPUT, 0, 0);
index f8187fa2ce6b55e4300dc5afe3741900767cd980..ecbd244d72b1c2095e05d6645f0537746f420d98 100644 (file)
@@ -212,13 +212,16 @@ int sensor_module_init(struct v4l2_subdev *subdev, u32 val)
        if (ret < 0) {
                if (ret == -EAGAIN) {
                        err("Checking sensor revision is fail. So retry camera power sequence.");
+                       module->power_retry = true;
                        sensor_module_power_reset(subdev, device);
                        ret = CALL_CISOPS(&sensor_peri->cis, cis_check_rev, subdev_cis);
                        if (ret < 0) {
+                               module->power_retry = false;
                                goto p_err;
                        }
                }
        }
+       module->power_retry = false;
 
        /* init kthread for sensor register setting when s_format */
        ret = fimc_is_sensor_init_mode_change_thread(sensor_peri);
index c744b79d3158c63fcbe3c9c44a4f109e39158241..ebab255ecf69c1ae13131a5740161e478be93d39 100644 (file)
@@ -189,6 +189,7 @@ static int sensor_module_gm1sp_power_setpin(struct device *dev,
 
        SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 0);
        SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 3000);
+       SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "retry delay", PIN_RETRY, 0, 2000);
 
        /* BACK CAEMRA - POWER OFF */
        SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst", PIN_RESET, 0, 10);
@@ -215,6 +216,7 @@ static int sensor_module_gm1sp_power_setpin(struct device *dev,
 
        SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 0);
        SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 2000);
+       SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_none, "retry delay", PIN_RETRY, 0, 2000);
 
 
        /* REAR VISION CAEMRA - POWER OFF */
@@ -240,6 +242,7 @@ static int sensor_module_gm1sp_power_setpin(struct device *dev,
 
        SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 0);
        SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 3000);
+       SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_none, "retry delay", PIN_RETRY, 0, 2000);
 
 
        /* REAR VISION CAEMRA - POWER OFF */
index 59b7f2e72fa050dc0ae61c97f4b0021798c8c225..745765b04f669aa1c3201bfcc469096a038530d8 100644 (file)
@@ -62,6 +62,7 @@
 #define PIN_FUNCTION   4
 #define PIN_REGULATOR  5
 #define PIN_I2C                6
+#define PIN_RETRY      8
 
 #define DT_SET_PIN(p, n, a, v, t) \
                        seq@__LINE__ { \