Message ID | 20180426110502.16350-4-marcel@ziswiler.com |
---|---|
State | Superseded |
Delegated to: | Tom Warren |
Headers | show |
Series | fix apalis-tk1 pcie gigabit ethernet operation | expand |
On 04/26/2018 08:04 PM, Marcel Ziswiler wrote: > From: Marcel Ziswiler <marcel.ziswiler@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@toradex.com> > > --- > > Changes in v5: None > Changes in v4: None > Changes in v3: None > Changes in v2: > - New bug fix. > > drivers/power/regulator/as3722_regulator.c | 16 ++++++++++++++-- > include/power/as3722.h | 3 ++- > 2 files changed, 16 insertions(+), 3 deletions(-) > > diff --git a/drivers/power/regulator/as3722_regulator.c b/drivers/power/regulator/as3722_regulator.c > index 3e1e6f1178..eb4c4651d7 100644 > --- a/drivers/power/regulator/as3722_regulator.c > +++ b/drivers/power/regulator/as3722_regulator.c > @@ -69,10 +69,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 > 7) { If you use the macro, it's more easier to maintain in future. #define MAX_LDO_INDEX 7 ? I don't know what means 7. So you can choose the meaningful name. If you need to change from 7 to some value, you only need to change the MAX_LDO_INDEX value. > + 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); > @@ -85,10 +91,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 > 7) { > + 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 cb4b188bcf..b3dc7b657a 100644 > --- a/include/power/as3722.h > +++ b/include/power/as3722.h > @@ -14,7 +14,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 > >
diff --git a/drivers/power/regulator/as3722_regulator.c b/drivers/power/regulator/as3722_regulator.c index 3e1e6f1178..eb4c4651d7 100644 --- a/drivers/power/regulator/as3722_regulator.c +++ b/drivers/power/regulator/as3722_regulator.c @@ -69,10 +69,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 > 7) { + 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); @@ -85,10 +91,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 > 7) { + 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 cb4b188bcf..b3dc7b657a 100644 --- a/include/power/as3722.h +++ b/include/power/as3722.h @@ -14,7 +14,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