]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
ARM: tegra12: ardbeg:operate CSIA/B/E DPD mode
authorTerry Wang <terwang@nvidia.com>
Tue, 24 Sep 2013 10:02:20 +0000 (18:02 +0800)
committerAjay Nandakumar <anandakumarm@nvidia.com>
Thu, 3 Oct 2013 13:47:53 +0000 (19:17 +0530)
Enable CSIA/B/E DPD mode when camera init.
Disable CSIA/B DPD mode when rear camera is on.
Enable CSIA/B DPD mode when rear camera is off.
Disable CSIE DPD mode when front camera is on.
Enable CSIE DPD mode when front camera is off.

Bug 1352773

Change-Id: Ib842d3cd6d516c9561d4857537c0e9e2b2c89b1d
Signed-off-by: Terry Wang <terwang@nvidia.com>
Reviewed-on: http://git-master/r/267767
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
(cherry picked from commit c040f576baee74c843574119a51ac2e3c6ede0f9)
Signed-off-by: Ajay Nandakumar <anandakumarm@nvidia.com>
arch/arm/mach-tegra/board-ardbeg-sensors.c

index f4e3fc43fa9a7e5937503d4f3280a9d88691af8a..72a6328910faee4ee719bb81b5441a0303258e1a 100644 (file)
@@ -36,6 +36,7 @@
 #include <mach/tegra_fuse.h>
 #include <mach/pinmux-t12.h>
 #include <mach/pinmux.h>
+#include <mach/io_dpd.h>
 
 #include "cpu-tegra.h"
 #include "devices.h"
@@ -142,6 +143,23 @@ static int ardbeg_get_extra_regulators(void)
        return 0;
 }
 
+static struct tegra_io_dpd csia_io = {
+       .name                   = "CSIA",
+       .io_dpd_reg_index       = 0,
+       .io_dpd_bit             = 0,
+};
+
+static struct tegra_io_dpd csib_io = {
+       .name                   = "CSIB",
+       .io_dpd_reg_index       = 0,
+       .io_dpd_bit             = 1,
+};
+
+static struct tegra_io_dpd csie_io = {
+       .name                   = "CSIE",
+       .io_dpd_reg_index       = 1,
+       .io_dpd_bit             = 12,
+};
 
 static int ardbeg_ar0261_power_on(struct ar0261_power_rail *pw)
 {
@@ -150,6 +168,9 @@ static int ardbeg_ar0261_power_on(struct ar0261_power_rail *pw)
        if (unlikely(WARN_ON(!pw || !pw->avdd || !pw->iovdd || !pw->dvdd)))
                return -EFAULT;
 
+       /* 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_ar0261_poweron_fail;
 
@@ -193,6 +214,8 @@ ar0261_vcm_fail:
        return -ENODEV;
 
 ardbeg_ar0261_poweron_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__);
        return -ENODEV;
 }
@@ -200,8 +223,13 @@ ardbeg_ar0261_poweron_fail:
 static int ardbeg_ar0261_power_off(struct ar0261_power_rail *pw)
 {
        if (unlikely(WARN_ON(!pw || !pw->avdd || !pw->iovdd || !pw->dvdd ||
-                                       !ardbeg_vcmvdd)))
+                                       !ardbeg_vcmvdd))) {
+               /* put CSIE IOs into DPD mode to
+                * save additional power for ardbeg
+                */
+               tegra_io_dpd_enable(&csie_io);
                return -EFAULT;
+       }
 
        gpio_set_value(CAM_RSTN, 0);
 
@@ -213,7 +241,8 @@ static int ardbeg_ar0261_power_off(struct ar0261_power_rail *pw)
 
 
        regulator_disable(ardbeg_vcmvdd);
-
+       /* put CSIE IOs into DPD mode to save additional power for ardbeg */
+       tegra_io_dpd_enable(&csie_io);
        return 0;
 }
 
@@ -255,6 +284,10 @@ static int ardbeg_imx135_power_on(struct imx135_power_rail *pw)
        if (unlikely(WARN_ON(!pw || !pw->iovdd || !pw->avdd)))
                return -EFAULT;
 
+       /* disable CSIA/B IOs DPD mode to turn on camera for ardbeg */
+       tegra_io_dpd_disable(&csia_io);
+       tegra_io_dpd_disable(&csib_io);
+
        if (ardbeg_imx135_get_extra_regulators(pw))
                goto imx135_poweron_fail;
 
@@ -301,14 +334,19 @@ imx135_ext_reg2_fail:
 
 imx135_ext_reg1_fail:
 imx135_poweron_fail:
+       tegra_io_dpd_enable(&csia_io);
+       tegra_io_dpd_enable(&csib_io);
        pr_err("%s failed.\n", __func__);
        return -ENODEV;
 }
 
 static int ardbeg_imx135_power_off(struct imx135_power_rail *pw)
 {
-       if (unlikely(WARN_ON(!pw || !pw->iovdd || !pw->avdd)))
+       if (unlikely(WARN_ON(!pw || !pw->iovdd || !pw->avdd))) {
+               tegra_io_dpd_enable(&csia_io);
+               tegra_io_dpd_enable(&csib_io);
                return -EFAULT;
+       }
 
        regulator_disable(pw->iovdd);
        regulator_disable(pw->avdd);
@@ -316,6 +354,9 @@ static int ardbeg_imx135_power_off(struct imx135_power_rail *pw)
        regulator_disable(pw->ext_reg1);
        regulator_disable(pw->ext_reg2);
 
+       /* put CSIA/B IOs into DPD mode to save additional power for ardbeg */
+       tegra_io_dpd_enable(&csia_io);
+       tegra_io_dpd_enable(&csib_io);
        return 0;
 }
 
@@ -617,6 +658,13 @@ static int ardbeg_camera_init(void)
        if (!of_machine_is_compatible("nvidia,tn8")) {
                i2c_register_board_info(2, ardbeg_i2c_board_info_e1823,
                                ARRAY_SIZE(ardbeg_i2c_board_info_e1823));
+
+               /* put CSIA/B/E IOs into DPD mode to
+                * save additional power for ardbeg
+                */
+               tegra_io_dpd_enable(&csia_io);
+               tegra_io_dpd_enable(&csib_io);
+               tegra_io_dpd_enable(&csie_io);
        } else {
                i2c_register_board_info(2, ardbeg_i2c_board_info_e1793,
                                ARRAY_SIZE(ardbeg_i2c_board_info_e1793));