MLK-13793-6 regulator: anatop: fix min dropout for bypass mode
authorIrina Tirdea <irina.tirdea@nxp.com>
Sun, 12 Feb 2017 19:07:31 +0000 (21:07 +0200)
committerNitin Garg <nitin.garg@nxp.com>
Mon, 19 Mar 2018 19:58:11 +0000 (14:58 -0500)
In bypass mode, the anatop digital regulators do not have any minimum
dropout value (the input voltage is equal to the output voltage according
to documentation).

Having a min dropout value of 125mV will lead to an increased voltage
for PMIC supplies.

Only set minimum dropout value for ldo enabled mode.

Signed-off-by: Irina Tirdea <irina.tirdea@nxp.com>
drivers/regulator/anatop-regulator.c

index d3fbf6e..21f72f1 100644 (file)
@@ -38,6 +38,8 @@
 #define LDO_POWER_GATE                 0x00
 #define LDO_FET_FULL_ON                        0x1f
 
+#define LDO_MIN_DROPOUT_UV             125000
+
 struct anatop_regulator {
        const char *name;
        u32 control_reg;
@@ -95,8 +97,12 @@ static int anatop_core_regmap_enable(struct regulator_dev *reg)
         * The vddpu has to stay at the same voltage level as vddsoc
         * whenever it's about to be enabled.
         */
-       if (anatop_reg == vddpu && vddsoc)
-               anatop_reg->sel = vddsoc->bypass ? LDO_FET_FULL_ON : vddsoc->sel;
+       if (anatop_reg == vddpu && vddsoc) {
+               anatop_reg->sel = vddsoc->sel;
+               anatop_reg->bypass = vddsoc->bypass;
+               if (anatop_reg->bypass)
+                       anatop_reg->rdesc.min_dropout_uV = 0;
+       }
 
        sel = anatop_reg->bypass ? LDO_FET_FULL_ON : anatop_reg->sel;
        return regulator_set_voltage_sel_regmap(reg, sel);
@@ -164,6 +170,10 @@ static int anatop_regmap_set_bypass(struct regulator_dev *reg, bool enable)
 
        sel = enable ? LDO_FET_FULL_ON : anatop_reg->sel;
        anatop_reg->bypass = enable;
+       if (anatop_reg->bypass)
+               anatop_reg->rdesc.min_dropout_uV = 0;
+       else
+               anatop_reg->rdesc.min_dropout_uV = LDO_MIN_DROPOUT_UV;
 
        return regulator_set_voltage_sel_regmap(reg, sel);
 }
@@ -326,7 +336,7 @@ static int anatop_regulator_probe(struct platform_device *pdev)
        rdesc->vsel_reg = sreg->control_reg;
        rdesc->vsel_mask = ((1 << sreg->vol_bit_width) - 1) <<
                           sreg->vol_bit_shift;
-       rdesc->min_dropout_uV = 125000;
+       rdesc->min_dropout_uV = LDO_MIN_DROPOUT_UV;
 
        config.dev = &pdev->dev;
        config.init_data = initdata;
@@ -348,6 +358,7 @@ static int anatop_regulator_probe(struct platform_device *pdev)
                if (sreg->sel == LDO_FET_FULL_ON) {
                        sreg->sel = 0;
                        sreg->bypass = true;
+                       rdesc->min_dropout_uV = 0;
                }
 
                /*