diff options
author | Marcel Ziswiler <marcel.ziswiler@toradex.com> | 2018-05-08 17:34:08 +0200 |
---|---|---|
committer | Tom Warren <twarren@nvidia.com> | 2018-05-10 16:34:20 -0700 |
commit | 4616e33b6a01b2f12c422d0d27afbbbbee2985e8 (patch) | |
tree | e9026afe9cc5ee3d9758ac513ee3df2d9a34648c /drivers/power/regulator/as3722_regulator.c | |
parent | c0cb8c8e8656639ebeeaa0d98a1f3c0807f590b3 (diff) |
power: as3722: fix ldo_get/set_enable for ldo index bigger than 7
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@toradex.com>
Signed-off-by: Tom Warren <twarren@nvidia.com>
Diffstat (limited to 'drivers/power/regulator/as3722_regulator.c')
-rw-r--r-- | drivers/power/regulator/as3722_regulator.c | 18 |
1 files changed, 16 insertions, 2 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); |