[U-Boot] [PATCH v6 3/6] power: as3722: fix ldo_get/set_enable for ldo index bigger than 7
Marcel Ziswiler
marcel at ziswiler.com
Tue May 8 15:34:08 UTC 2018
From: Marcel Ziswiler <marcel.ziswiler at toradex.com>
Fix ldo_get_enable() and ldo_set_enable() functions for LDOs with an
index > 7. Turns out there are actually two separate AS3722_LDO_CONTROL
registers AS3722_LDO_CONTROL0 and AS3722_LDO_CONTROL1. Actually make use
of both. While at it also actually use the enable parameter of the
ldo_set_enable() function which now truly allows disabling as opposed to
only enabling LDOs.
Signed-off-by: Marcel Ziswiler <marcel.ziswiler at toradex.com>
---
Changes in v6:
- Use macro AS3722_LDO_CONTROL0_MAX_INDEX instead of the hard-coded
number 7 in LDO index check as suggested by Jaehoon Chung.
Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2:
- New bug fix.
drivers/power/regulator/as3722_regulator.c | 18 ++++++++++++++++--
include/power/as3722.h | 3 ++-
2 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/drivers/power/regulator/as3722_regulator.c b/drivers/power/regulator/as3722_regulator.c
index 63f4615398..a0703c9e05 100644
--- a/drivers/power/regulator/as3722_regulator.c
+++ b/drivers/power/regulator/as3722_regulator.c
@@ -13,6 +13,8 @@
#include <power/pmic.h>
#include <power/regulator.h>
+#define AS3722_LDO_CONTROL0_MAX_INDEX 7
+
static int stepdown_get_value(struct udevice *dev)
{
return -ENOSYS;
@@ -68,10 +70,16 @@ static int ldo_set_value(struct udevice *dev, int uvolt)
static int ldo_set_enable(struct udevice *dev, bool enable)
{
struct udevice *pmic = dev_get_parent(dev);
+ u8 ctrl_reg = AS3722_LDO_CONTROL0;
int ldo = dev->driver_data;
int ret;
- ret = pmic_clrsetbits(pmic, AS3722_LDO_CONTROL, 0, 1 << ldo);
+ if (ldo > AS3722_LDO_CONTROL0_MAX_INDEX) {
+ ctrl_reg = AS3722_LDO_CONTROL1;
+ ldo -= 8;
+ }
+
+ ret = pmic_clrsetbits(pmic, ctrl_reg, !enable << ldo, enable << ldo);
if (ret < 0) {
debug("%s: failed to write LDO control register: %d", __func__,
ret);
@@ -84,10 +92,16 @@ static int ldo_set_enable(struct udevice *dev, bool enable)
static int ldo_get_enable(struct udevice *dev)
{
struct udevice *pmic = dev_get_parent(dev);
+ u8 ctrl_reg = AS3722_LDO_CONTROL0;
int ldo = dev->driver_data;
int ret;
- ret = pmic_reg_read(pmic, AS3722_LDO_CONTROL);
+ if (ldo > AS3722_LDO_CONTROL0_MAX_INDEX) {
+ ctrl_reg = AS3722_LDO_CONTROL1;
+ ldo -= 8;
+ }
+
+ ret = pmic_reg_read(pmic, ctrl_reg);
if (ret < 0) {
debug("%s: failed to read SD control register: %d", __func__,
ret);
diff --git a/include/power/as3722.h b/include/power/as3722.h
index 9f045d5ab6..ab969809ee 100644
--- a/include/power/as3722.h
+++ b/include/power/as3722.h
@@ -13,7 +13,8 @@
#define AS3722_SD_VOLTAGE(n) (0x00 + (n))
#define AS3722_LDO_VOLTAGE(n) (0x10 + (n))
#define AS3722_SD_CONTROL 0x4d
-#define AS3722_LDO_CONTROL 0x4e
+#define AS3722_LDO_CONTROL0 0x4e
+#define AS3722_LDO_CONTROL1 0x4f
#define AS3722_ASIC_ID1 0x90
#define AS3722_ASIC_ID2 0x91
--
2.14.3
More information about the U-Boot
mailing list