[PATCH] power: regulator: tps65941: Fix voltage calculation for ldo
Neha Malcom Francis
n-francis at ti.com
Wed Feb 12 06:01:35 CET 2025
Hi Udit
On 11/02/25 23:21, Udit Kumar wrote:
> 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-kumar1 at 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
Reviewed-by: Neha Malcom Francis <n-francis at ti.com>
--
Thanking You
Neha Malcom Francis
More information about the U-Boot
mailing list