Some variants of the anatop like the one found on the i.MX7D need to be enabled. Add support for the anatop-enable-bit property that is used for this purpose.
Instances without this property are considered to be always enabled, and attempting to disable them will fail. Signed-off-by: Nora Schiffer <[email protected]> --- drivers/power/regulator/anatop_regulator.c | 40 ++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/drivers/power/regulator/anatop_regulator.c b/drivers/power/regulator/anatop_regulator.c index 68a320bd0f8..a64b35b7363 100644 --- a/drivers/power/regulator/anatop_regulator.c +++ b/drivers/power/regulator/anatop_regulator.c @@ -42,6 +42,7 @@ struct anatop_regulator { u32 delay_reg; u32 delay_bit_shift; u32 delay_bit_width; + u32 enable_mask; }; static u32 anatop_get_bits(struct udevice *dev, u32 addr, int bit_shift, @@ -154,9 +155,42 @@ static int anatop_set_voltage(struct udevice *dev, int uV) return ret; } +static int anatop_set_enable(struct udevice *dev, bool enable) +{ + const struct anatop_regulator *anatop_reg = dev_get_plat(dev); + + dev_dbg(dev, "enable = %d\n", enable); + + if (!anatop_reg->enable_mask) + return enable ? 0 : -ENOSYS; + return regmap_update_bits(anatop_reg->regmap, anatop_reg->control_reg, + anatop_reg->enable_mask, + enable ? anatop_reg->enable_mask : 0); +} + +static int anatop_get_enable(struct udevice *dev) +{ + const struct anatop_regulator *anatop_reg = dev_get_plat(dev); + u32 val; + int err; + + if (!anatop_reg->enable_mask) + return 1; + + err = regmap_read(anatop_reg->regmap, anatop_reg->control_reg, &val); + if (err) { + dev_dbg(dev, "cannot read reg (%d)\n", err); + return err; + } + + return !!(val & anatop_reg->enable_mask); +} + static const struct dm_regulator_ops anatop_regulator_ops = { .set_value = anatop_set_voltage, .get_value = anatop_get_voltage, + .get_enable = anatop_get_enable, + .set_enable = anatop_set_enable, }; static int anatop_regulator_probe(struct udevice *dev) @@ -229,6 +263,12 @@ static int anatop_regulator_probe(struct udevice *dev) dev_read_u32(dev, "anatop-delay-bit-shift", &anatop_reg->delay_bit_shift); + ret = dev_read_u32(dev, + "anatop-enable-bit", + &val); + if (!ret) + anatop_reg->enable_mask = BIT(val); + syscon = dev_get_parent(dev); if (!syscon) { dev_dbg(dev, "unable to find syscon device\n"); -- 2.55.0
