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

Reply via email to