diff options
author | Ming Wong <miwong@nvidia.com> | 2014-11-07 17:35:31 -0800 |
---|---|---|
committer | Winnie Hsu <whsu@nvidia.com> | 2014-11-14 13:53:27 -0800 |
commit | ef19d27ca4d97fe8b4f81dc994e3e4d633b13d0c (patch) | |
tree | 16fdaa8e91ebb38574c8d1880253029edf901875 /arch/arm/mach-tegra/board-ardbeg-sensors.c | |
parent | 59dbaaabf59ac6a4faeef55a6acb23fcfa4b0043 (diff) |
kernel: driver: modify ar0330 power sequence
Bug 1552628
Bug 1576621
Change-Id: Icc881724f0e4e5c0346aa44ffeb80dc8d498919c
Signed-off-by: Ming Wong <miwong@nvidia.com>
Reviewed-on: http://git-master/r/598929
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Frank Chen <frankc@nvidia.com>
Reviewed-by: Sachin Nikam <snikam@nvidia.com>
Diffstat (limited to 'arch/arm/mach-tegra/board-ardbeg-sensors.c')
-rw-r--r-- | arch/arm/mach-tegra/board-ardbeg-sensors.c | 96 |
1 files changed, 20 insertions, 76 deletions
diff --git a/arch/arm/mach-tegra/board-ardbeg-sensors.c b/arch/arm/mach-tegra/board-ardbeg-sensors.c index 55dd519bd10c..b8ea94d1c086 100644 --- a/arch/arm/mach-tegra/board-ardbeg-sensors.c +++ b/arch/arm/mach-tegra/board-ardbeg-sensors.c @@ -300,56 +300,31 @@ static int ardbeg_ar0330_front_power_on(struct ar0330_power_rail *pw) { int err; - if (unlikely(WARN_ON(!pw || !pw->avdd || !pw->iovdd || !pw->dvdd))) + if (unlikely(WARN_ON(!pw || !pw->avdd || !pw->iovdd))) return -EFAULT; - pr_info("!!! mach-tegra front power on\n"); /* disable CSIE IOs DPD mode to turn on front camera for ardbeg */ tegra_io_dpd_disable(&csie_io); - if (ardbeg_get_extra_regulators()) - goto ardbeg_ar0330_front_poweron_fail; - - gpio_set_value(CAM_RSTN, 0); - gpio_set_value(CAM_AF_PWDN, 1); - - - err = regulator_enable(ardbeg_vcmvdd); - if (unlikely(err)) - goto ar0330_front_vcm_fail; + gpio_set_value(CAM2_PWDN, 0); - err = regulator_enable(pw->dvdd); + err = regulator_enable(pw->iovdd); if (unlikely(err)) - goto ar0330_front_dvdd_fail; + goto ar0330_front_iovdd_fail; + usleep_range(1000, 1100); err = regulator_enable(pw->avdd); if (unlikely(err)) goto ar0330_front_avdd_fail; - err = regulator_enable(pw->iovdd); - if (unlikely(err)) - goto ar0330_front_iovdd_fail; - usleep_range(1, 2); gpio_set_value(CAM2_PWDN, 1); - gpio_set_value(CAM_RSTN, 1); - return 0; -ar0330_front_iovdd_fail: - regulator_disable(pw->dvdd); - -ar0330_front_dvdd_fail: - regulator_disable(pw->avdd); - ar0330_front_avdd_fail: - regulator_disable(ardbeg_vcmvdd); - -ar0330_front_vcm_fail: - pr_err("%s vcmvdd failed.\n", __func__); - return -ENODEV; + regulator_disable(pw->iovdd); -ardbeg_ar0330_front_poweron_fail: +ar0330_front_iovdd_fail: /* put CSIE IOs into DPD mode to save additional power for ardbeg */ tegra_io_dpd_enable(&csie_io); pr_err("%s failed.\n", __func__); @@ -358,8 +333,7 @@ ardbeg_ar0330_front_poweron_fail: static int ardbeg_ar0330_front_power_off(struct ar0330_power_rail *pw) { - if (unlikely(WARN_ON(!pw || !pw->avdd || !pw->iovdd || !pw->dvdd || - !ardbeg_vcmvdd))) { + if (unlikely(WARN_ON(!pw || !pw->avdd || !pw->iovdd))) { /* put CSIE IOs into DPD mode to * save additional power for ardbeg */ @@ -367,14 +341,12 @@ static int ardbeg_ar0330_front_power_off(struct ar0330_power_rail *pw) return -EFAULT; } - gpio_set_value(CAM_RSTN, 0); + gpio_set_value(CAM2_PWDN, 0); usleep_range(1, 2); regulator_disable(pw->iovdd); - regulator_disable(pw->dvdd); regulator_disable(pw->avdd); - regulator_disable(ardbeg_vcmvdd); /* put CSIE IOs into DPD mode to save additional power for ardbeg */ tegra_io_dpd_enable(&csie_io); return 0; @@ -384,64 +356,39 @@ struct ar0330_platform_data ardbeg_ar0330_front_data = { .power_on = ardbeg_ar0330_front_power_on, .power_off = ardbeg_ar0330_front_power_off, .dev_name = "ar0330.1", - .mclk_name = "mclk", + .mclk_name = "mclk2", }; static int ardbeg_ar0330_power_on(struct ar0330_power_rail *pw) { int err; - if (unlikely(WARN_ON(!pw || !pw->avdd || !pw->iovdd || !pw->dvdd))) + if (unlikely(WARN_ON(!pw || !pw->avdd || !pw->iovdd))) return -EFAULT; - pr_info("!!! mach-tegra rear power on\n"); /* disable CSIE IOs DPD mode to turn on front camera for ardbeg */ tegra_io_dpd_disable(&csia_io); tegra_io_dpd_disable(&csib_io); - if (ardbeg_get_extra_regulators()) - goto ardbeg_ar0330_poweron_fail; - - gpio_set_value(CAM_RSTN, 0); - gpio_set_value(CAM_AF_PWDN, 1); - - - err = regulator_enable(ardbeg_vcmvdd); - if (unlikely(err)) - goto ar0330_vcm_fail; + gpio_set_value(CAM1_PWDN, 0); - err = regulator_enable(pw->dvdd); + err = regulator_enable(pw->iovdd); if (unlikely(err)) - goto ar0330_dvdd_fail; + goto ar0330_iovdd_fail; + usleep_range(1000, 1100); err = regulator_enable(pw->avdd); if (unlikely(err)) goto ar0330_avdd_fail; - err = regulator_enable(pw->iovdd); - if (unlikely(err)) - goto ar0330_iovdd_fail; - usleep_range(1, 2); - gpio_set_value(CAM2_PWDN, 1); - - gpio_set_value(CAM_RSTN, 1); + gpio_set_value(CAM1_PWDN, 1); return 0; -ar0330_iovdd_fail: - regulator_disable(pw->dvdd); - -ar0330_dvdd_fail: - regulator_disable(pw->avdd); - ar0330_avdd_fail: - regulator_disable(ardbeg_vcmvdd); - -ar0330_vcm_fail: - pr_err("%s vcmvdd failed.\n", __func__); - return -ENODEV; + regulator_disable(pw->iovdd); -ardbeg_ar0330_poweron_fail: +ar0330_iovdd_fail: /* put CSIE IOs into DPD mode to save additional power for ardbeg */ tegra_io_dpd_enable(&csia_io); tegra_io_dpd_enable(&csib_io); @@ -451,8 +398,7 @@ ardbeg_ar0330_poweron_fail: static int ardbeg_ar0330_power_off(struct ar0330_power_rail *pw) { - if (unlikely(WARN_ON(!pw || !pw->avdd || !pw->iovdd || !pw->dvdd || - !ardbeg_vcmvdd))) { + if (unlikely(WARN_ON(!pw || !pw->avdd || !pw->iovdd))) { /* put CSIE IOs into DPD mode to * save additional power for ardbeg */ @@ -461,14 +407,12 @@ static int ardbeg_ar0330_power_off(struct ar0330_power_rail *pw) return -EFAULT; } - gpio_set_value(CAM_RSTN, 0); + gpio_set_value(CAM1_PWDN, 0); usleep_range(1, 2); regulator_disable(pw->iovdd); - regulator_disable(pw->dvdd); regulator_disable(pw->avdd); - regulator_disable(ardbeg_vcmvdd); /* put CSIE IOs into DPD mode to save additional power for ardbeg */ tegra_io_dpd_enable(&csia_io); tegra_io_dpd_enable(&csib_io); |