As per TRM[0] Section 8.7.1 "TPS6594-Q1 Registers", LDOx_Vout
bit 6-1, define the NVM voltage settings.
Along side table 8-4 of above TRM, shows voltage to value mapping.

Driver wrongly using bits 5-1 to calculate voltage, and to convert
voltage to value driver was using buck's calculation.
So fix those calculation.

[0]: https://www.ti.com/lit/ds/symlink/tps6594-q1.pdf
Fixes: 5d7dbd22cf7d ("power: regulator: tps65941: use function callbacks for 
conversion ops")
Signed-off-by: Udit Kumar <u-kum...@ti.com>
---
Bootlogs
https://gist.github.com/uditkumarti/298bd277da11eb82146d7aff24c402ba

 drivers/power/regulator/tps65941_regulator.c | 16 +++++++++++++---
 include/power/tps65941.h                     |  3 ++-
 2 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/drivers/power/regulator/tps65941_regulator.c 
b/drivers/power/regulator/tps65941_regulator.c
index bc4d153fd8..13f94b730d 100644
--- a/drivers/power/regulator/tps65941_regulator.c
+++ b/drivers/power/regulator/tps65941_regulator.c
@@ -388,6 +388,14 @@ static int tps65941_ldo_enable(struct udevice *dev, int 
op, bool *enable)
        return 0;
 }
 
+static int tps65941_ldo_volt2val(__maybe_unused int idx, int uV)
+{
+       if (uV > TPS65941_LDO_VOLT_MAX || uV < TPS65941_LDO_VOLT_MIN)
+               return -EINVAL;
+
+       return ((uV - 600000) / 50000 + 0x4) << TPS65941_LDO_MODE_MASK;
+}
+
 static int tps65941_ldo_val2volt(__maybe_unused int idx, int val)
 {
        if (val > TPS65941_LDO_VOLT_MAX_HEX || val < TPS65941_LDO_VOLT_MIN_HEX)
@@ -459,7 +467,7 @@ static int tps65224_ldo_val2volt(int idx, int val)
 static const struct tps65941_reg_conv_ops ldo_conv_ops[] = {
        [TPS65941_LDO_CONV_OPS_IDX] = {
                .volt_mask = TPS65941_LDO_VOLT_MASK,
-               .volt2val = tps65941_buck_volt2val,
+               .volt2val = tps65941_ldo_volt2val,
                .val2volt = tps65941_ldo_val2volt,
        },
        [TPS65224_LDO_CONV_OPS_IDX] = {
@@ -472,7 +480,7 @@ static const struct tps65941_reg_conv_ops ldo_conv_ops[] = {
 static int tps65941_ldo_val(struct udevice *dev, int op, int *uV)
 {
        unsigned int hex, adr;
-       int ret, ret_volt, idx;
+       int ret, ret_volt, idx, ldo_bypass;
        struct dm_regulator_uclass_plat *uc_pdata;
        const struct tps65941_reg_conv_ops *conv_ops;
        ulong chip_id;
@@ -502,7 +510,9 @@ static int tps65941_ldo_val(struct udevice *dev, int op, 
int *uV)
        if (ret < 0)
                return ret;
 
+       ldo_bypass = ret & TPS65941_LDO_BYPASS_EN;
        ret &= conv_ops->volt_mask;
+       ret = ret >> TPS65941_LDO_MODE_MASK;
        ret_volt = conv_ops->val2volt(idx, ret);
        if (ret_volt < 0)
                return ret_volt;
@@ -531,7 +541,7 @@ static int tps65941_ldo_val(struct udevice *dev, int op, 
int *uV)
                ret &= ~TPS65224_LDO_VOLT_MASK;
                ret |= hex;
        } else {
-               ret = hex;
+               ret = hex | ldo_bypass;
        }
 
        ret = pmic_reg_write(dev->parent, adr, ret);
diff --git a/include/power/tps65941.h b/include/power/tps65941.h
index cec85333f0..a026ec5695 100644
--- a/include/power/tps65941.h
+++ b/include/power/tps65941.h
@@ -21,10 +21,11 @@
 #define TPS65941_BUCK_VOLT_MAX         3340000
 #define TPS65941_BUCK_MODE_MASK                0x1
 
-#define TPS65941_LDO_VOLT_MASK         0x3E
+#define TPS65941_LDO_VOLT_MASK         0x7E
 #define TPS65941_LDO_VOLT_MAX_HEX      0x3A
 #define TPS65941_LDO_VOLT_MIN_HEX      0x4
 #define TPS65941_LDO_VOLT_MAX          3300000
+#define TPS65941_LDO_VOLT_MIN          600000
 #define TPS65941_LDO_MODE_MASK         0x1
 #define TPS65941_LDO_BYPASS_EN         0x80
 #define TP65941_BUCK_CONF_SLEW_MASK    0x7
-- 
2.34.1

Reply via email to