Re: [U-Boot] [PATCH 06/14] sunxi: axp221: Explicitly turn off unused voltages

2014-12-18 Thread Ian Campbell
On Tue, 2014-12-16 at 21:31 +0100, Hans de Goede wrote:
 Explicitly turn off unused voltages, rather then leaving them as is. Likewise
 explictly enabled the dcdc convertors, rather then assuming they are already
 enabled at boot.
 
 Signed-off-by: Hans de Goede hdego...@redhat.com

Acked-by: Ian Campbell i...@hellion.org.uk


___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


[U-Boot] [PATCH 06/14] sunxi: axp221: Explicitly turn off unused voltages

2014-12-16 Thread Hans de Goede
Explicitly turn off unused voltages, rather then leaving them as is. Likewise
explictly enabled the dcdc convertors, rather then assuming they are already
enabled at boot.

Signed-off-by: Hans de Goede hdego...@redhat.com
---
 board/sunxi/board.c|  10 -
 drivers/power/Kconfig  |  16 
 drivers/power/axp221.c | 102 ++---
 include/axp221.h   |   8 +++-
 4 files changed, 111 insertions(+), 25 deletions(-)

diff --git a/board/sunxi/board.c b/board/sunxi/board.c
index e2ebf83..5bf19b7 100644
--- a/board/sunxi/board.c
+++ b/board/sunxi/board.c
@@ -180,22 +180,12 @@ void sunxi_board_init(void)
power_failed |= axp221_set_dcdc3(1200);
power_failed |= axp221_set_dcdc4(1200);
power_failed |= axp221_set_dcdc5(1500);
-#if CONFIG_AXP221_DLDO1_VOLT != -1
power_failed |= axp221_set_dldo1(CONFIG_AXP221_DLDO1_VOLT);
-#endif
-#if CONFIG_AXP221_DLDO4_VOLT != -1
power_failed |= axp221_set_dldo4(CONFIG_AXP221_DLDO4_VOLT);
-#endif
-#if CONFIG_AXP221_ALDO1_VOLT != -1
power_failed |= axp221_set_aldo1(CONFIG_AXP221_ALDO1_VOLT);
-#endif
-#if CONFIG_AXP221_ALDO2_VOLT != -1
power_failed |= axp221_set_aldo2(CONFIG_AXP221_ALDO2_VOLT);
-#endif
-#if CONFIG_AXP221_ALDO3_VOLT != -1
power_failed |= axp221_set_aldo3(CONFIG_AXP221_ALDO3_VOLT);
 #endif
-#endif
 
printf(DRAM:);
ramsize = sunxi_dram_init();
diff --git a/drivers/power/Kconfig b/drivers/power/Kconfig
index e132759..ef0c093 100644
--- a/drivers/power/Kconfig
+++ b/drivers/power/Kconfig
@@ -19,9 +19,9 @@ config AXP221_DCDC1_VOLT
 config AXP221_DLDO1_VOLT
int axp221 dldo1 voltage
depends on AXP221_POWER
-   default -1
+   default 0
---help---
-   Set the voltage (mV) to program the axp221 dldo1 at, set to -1 to
+   Set the voltage (mV) to program the axp221 dldo1 at, set to 0 to
disable dldo1. On sun6i (A31) boards with ethernet this is often used
to power the ethernet phy. On sun8i (A23) boards this is often used to
power the wifi.
@@ -29,17 +29,17 @@ config AXP221_DLDO1_VOLT
 config AXP221_DLDO4_VOLT
int axp221 dldo4 voltage
depends on AXP221_POWER
-   default -1
+   default 0
---help---
-   Set the voltage (mV) to program the axp221 dldo4 at, set to -1 to
+   Set the voltage (mV) to program the axp221 dldo4 at, set to 0 to
disable dldo4.
 
 config AXP221_ALDO1_VOLT
int axp221 aldo1 voltage
depends on AXP221_POWER
-   default -1
+   default 0
---help---
-   Set the voltage (mV) to program the axp221 aldo1 at, set to -1 to
+   Set the voltage (mV) to program the axp221 aldo1 at, set to 0 to
disable aldo1. On sun6i (A31) boards which have a wifi module this is
often used to power the wifi module.
 
@@ -49,7 +49,7 @@ config AXP221_ALDO2_VOLT
default 1800 if MACH_SUN6I
default 2500 if MACH_SUN8I
---help---
-   Set the voltage (mV) to program the axp221 aldo2 at, set to -1 to
+   Set the voltage (mV) to program the axp221 aldo2 at, set to 0 to
disable aldo2. On sun6i (A31) boards this is typically connected to
VCC-PM, which powers the port M gpios, and should be set to 1.8V.
On sun8i (A23) this is typically connected to VDD-DLL and must be
@@ -60,6 +60,6 @@ config AXP221_ALDO3_VOLT
depends on AXP221_POWER
default 3000
---help---
-   Set the voltage (mV) to program the axp221 aldo3 at, set to -1 to
+   Set the voltage (mV) to program the axp221 aldo3 at, set to 0 to
disable aldo3. This is typically connected to VCC-PLL and AVCC and
must be set to 3V.
diff --git a/drivers/power/axp221.c b/drivers/power/axp221.c
index 717adad..c438849 100644
--- a/drivers/power/axp221.c
+++ b/drivers/power/axp221.c
@@ -80,45 +80,107 @@ static int axp221_setbits(u8 reg, u8 bits)
return pmic_bus_write(reg, val);
 }
 
+static int axp221_clrbits(u8 reg, u8 bits)
+{
+   int ret;
+   u8 val;
+
+   ret = pmic_bus_read(reg, val);
+   if (ret)
+   return ret;
+
+   val = ~bits;
+   return pmic_bus_write(reg, val);
+}
+
 int axp221_set_dcdc1(unsigned int mvolt)
 {
int ret;
u8 cfg = axp221_mvolt_to_cfg(mvolt, 1600, 3400, 100);
 
+   if (mvolt == 0)
+   return axp221_clrbits(AXP221_OUTPUT_CTRL1,
+ AXP221_OUTPUT_CTRL1_DCDC1_EN);
+
ret = pmic_bus_write(AXP221_DCDC1_CTRL, cfg);
if (ret)
return ret;
 
-   return axp221_setbits(AXP221_OUTPUT_CTRL2,
- AXP221_OUTPUT_CTRL2_DCDC1_EN);
+   ret = axp221_setbits(AXP221_OUTPUT_CTRL2,
+AXP221_OUTPUT_CTRL2_DCDC1SW_EN);
+   if (ret)
+   return ret;
+
+   return axp221_setbits(AXP221_OUTPUT_CTRL1,
+