]> git.sur5r.net Git - u-boot/blobdiff - drivers/power/regulator/as3722_regulator.c
power: as3722: fix ldo_get/set_enable for ldo index bigger than 7
[u-boot] / drivers / power / regulator / as3722_regulator.c
index 63f4615398f50f63ecd7f74888cfd9233491096f..a0703c9e05983f95e28ee8d8284cf8977b5b2530 100644 (file)
@@ -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);