All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH 1/3] sunxi: power: Add support for disabling axp209 regulators
@ 2015-10-10 12:40 Hans de Goede
  2015-10-10 12:40 ` [U-Boot] [PATCH 2/3] sunxi: power: Change axp209 LDO3 and LDO4 default to disabled Hans de Goede
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Hans de Goede @ 2015-10-10 12:40 UTC (permalink / raw)
  To: u-boot

Add support for disabling the regulators found on the axp209 pmic.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 drivers/power/axp209.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++----
 include/axp209.h       |  8 ++++++++
 2 files changed, 54 insertions(+), 4 deletions(-)

diff --git a/drivers/power/axp209.c b/drivers/power/axp209.c
index bb5d08b..71aa000 100644
--- a/drivers/power/axp209.c
+++ b/drivers/power/axp209.c
@@ -24,6 +24,14 @@ int axp_set_dcdc2(unsigned int mvolt)
 	int rc;
 	u8 cfg, current;
 
+	if (mvolt == 0)
+		return pmic_bus_clrbits(AXP209_OUTPUT_CTRL,
+					AXP209_OUTPUT_CTRL_DCDC2);
+
+	rc = pmic_bus_setbits(AXP209_OUTPUT_CTRL, AXP209_OUTPUT_CTRL_DCDC2);
+	if (rc)
+		return rc;
+
 	cfg = axp209_mvolt_to_cfg(mvolt, 700, 2275, 25);
 
 	/* Do we really need to be this gentle? It has built-in voltage slope */
@@ -45,8 +53,17 @@ int axp_set_dcdc2(unsigned int mvolt)
 int axp_set_dcdc3(unsigned int mvolt)
 {
 	u8 cfg = axp209_mvolt_to_cfg(mvolt, 700, 3500, 25);
+	int rc;
+
+	if (mvolt == 0)
+		return pmic_bus_clrbits(AXP209_OUTPUT_CTRL,
+					AXP209_OUTPUT_CTRL_DCDC3);
 
-	return pmic_bus_write(AXP209_DCDC3_VOLTAGE, cfg);
+	rc = pmic_bus_write(AXP209_DCDC3_VOLTAGE, cfg);
+	if (rc)
+		return rc;
+
+	return pmic_bus_setbits(AXP209_OUTPUT_CTRL, AXP209_OUTPUT_CTRL_DCDC3);
 }
 
 int axp_set_aldo2(unsigned int mvolt)
@@ -54,6 +71,10 @@ int axp_set_aldo2(unsigned int mvolt)
 	int rc;
 	u8 cfg, reg;
 
+	if (mvolt == 0)
+		return pmic_bus_clrbits(AXP209_OUTPUT_CTRL,
+					AXP209_OUTPUT_CTRL_LDO2);
+
 	cfg = axp209_mvolt_to_cfg(mvolt, 1800, 3300, 100);
 
 	rc = pmic_bus_read(AXP209_LDO24_VOLTAGE, &reg);
@@ -62,19 +83,32 @@ int axp_set_aldo2(unsigned int mvolt)
 
 	/* LDO2 configuration is in upper 4 bits */
 	reg = (reg & 0x0f) | (cfg << 4);
-	return pmic_bus_write(AXP209_LDO24_VOLTAGE, reg);
+	rc = pmic_bus_write(AXP209_LDO24_VOLTAGE, reg);
+	if (rc)
+		return rc;
+
+	return pmic_bus_setbits(AXP209_OUTPUT_CTRL, AXP209_OUTPUT_CTRL_LDO2);
 }
 
 int axp_set_aldo3(unsigned int mvolt)
 {
 	u8 cfg;
+	int rc;
+
+	if (mvolt == 0)
+		return pmic_bus_clrbits(AXP209_OUTPUT_CTRL,
+					AXP209_OUTPUT_CTRL_LDO3);
 
 	if (mvolt == -1)
 		cfg = 0x80;	/* determined by LDO3IN pin */
 	else
 		cfg = axp209_mvolt_to_cfg(mvolt, 700, 3500, 25);
 
-	return pmic_bus_write(AXP209_LDO3_VOLTAGE, cfg);
+	rc = pmic_bus_write(AXP209_LDO3_VOLTAGE, cfg);
+	if (rc)
+		return rc;
+
+	return pmic_bus_setbits(AXP209_OUTPUT_CTRL, AXP209_OUTPUT_CTRL_LDO3);
 }
 
 int axp_set_aldo4(unsigned int mvolt)
@@ -86,6 +120,10 @@ int axp_set_aldo4(unsigned int mvolt)
 	};
 	u8 cfg, reg;
 
+	if (mvolt == 0)
+		return pmic_bus_clrbits(AXP209_OUTPUT_CTRL,
+					AXP209_OUTPUT_CTRL_LDO4);
+
 	/* Translate mvolt to register cfg value, requested <= selected */
 	for (cfg = 15; vindex[cfg] > mvolt && cfg > 0; cfg--);
 
@@ -95,7 +133,11 @@ int axp_set_aldo4(unsigned int mvolt)
 
 	/* LDO4 configuration is in lower 4 bits */
 	reg = (reg & 0xf0) | (cfg << 0);
-	return pmic_bus_write(AXP209_LDO24_VOLTAGE, reg);
+	rc = pmic_bus_write(AXP209_LDO24_VOLTAGE, reg);
+	if (rc)
+		return rc;
+
+	return pmic_bus_setbits(AXP209_OUTPUT_CTRL, AXP209_OUTPUT_CTRL_LDO4);
 }
 
 int axp_init(void)
diff --git a/include/axp209.h b/include/axp209.h
index 13aa66c..e1b22e3 100644
--- a/include/axp209.h
+++ b/include/axp209.h
@@ -7,6 +7,7 @@
 enum axp209_reg {
 	AXP209_POWER_STATUS = 0x00,
 	AXP209_CHIP_VERSION = 0x03,
+	AXP209_OUTPUT_CTRL = 0x12,
 	AXP209_DCDC2_VOLTAGE = 0x23,
 	AXP209_DCDC3_VOLTAGE = 0x27,
 	AXP209_LDO24_VOLTAGE = 0x28,
@@ -23,6 +24,13 @@ enum axp209_reg {
 #define AXP209_POWER_STATUS_ON_BY_DC	(1 << 0)
 #define AXP209_POWER_STATUS_VBUS_USABLE	(1 << 4)
 
+#define AXP209_OUTPUT_CTRL_EXTEN	(1 << 0)
+#define AXP209_OUTPUT_CTRL_DCDC3	(1 << 1)
+#define AXP209_OUTPUT_CTRL_LDO2		(1 << 2)
+#define AXP209_OUTPUT_CTRL_LDO4		(1 << 3)
+#define AXP209_OUTPUT_CTRL_DCDC2	(1 << 4)
+#define AXP209_OUTPUT_CTRL_LDO3		(1 << 6)
+
 #define AXP209_IRQ5_PEK_UP		(1 << 6)
 #define AXP209_IRQ5_PEK_DOWN		(1 << 5)
 
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2015-10-11  9:08 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-10-10 12:40 [U-Boot] [PATCH 1/3] sunxi: power: Add support for disabling axp209 regulators Hans de Goede
2015-10-10 12:40 ` [U-Boot] [PATCH 2/3] sunxi: power: Change axp209 LDO3 and LDO4 default to disabled Hans de Goede
2015-10-10 12:40 ` [U-Boot] [PATCH 3/3] sunxi: power: Columbus: only enable ELDO3 when necessary Hans de Goede
2015-10-11  9:08 ` [U-Boot] [PATCH 1/3] sunxi: power: Add support for disabling axp209 regulators Ian Campbell

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.