mirror of
https://github.com/smaeul/u-boot.git
synced 2025-10-14 12:56:00 +01:00
power: regulator: tps65941: Fix voltage calculation for ldo
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@ti.com> Reviewed-by: Neha Malcom Francis <n-francis@ti.com>
This commit is contained in:
parent
92880a58ca
commit
e93f11148a
@ -388,6 +388,14 @@ static int tps65941_ldo_enable(struct udevice *dev, int op, bool *enable)
|
|||||||
return 0;
|
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)
|
static int tps65941_ldo_val2volt(__maybe_unused int idx, int val)
|
||||||
{
|
{
|
||||||
if (val > TPS65941_LDO_VOLT_MAX_HEX || val < TPS65941_LDO_VOLT_MIN_HEX)
|
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[] = {
|
static const struct tps65941_reg_conv_ops ldo_conv_ops[] = {
|
||||||
[TPS65941_LDO_CONV_OPS_IDX] = {
|
[TPS65941_LDO_CONV_OPS_IDX] = {
|
||||||
.volt_mask = TPS65941_LDO_VOLT_MASK,
|
.volt_mask = TPS65941_LDO_VOLT_MASK,
|
||||||
.volt2val = tps65941_buck_volt2val,
|
.volt2val = tps65941_ldo_volt2val,
|
||||||
.val2volt = tps65941_ldo_val2volt,
|
.val2volt = tps65941_ldo_val2volt,
|
||||||
},
|
},
|
||||||
[TPS65224_LDO_CONV_OPS_IDX] = {
|
[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)
|
static int tps65941_ldo_val(struct udevice *dev, int op, int *uV)
|
||||||
{
|
{
|
||||||
unsigned int hex, adr;
|
unsigned int hex, adr;
|
||||||
int ret, ret_volt, idx;
|
int ret, ret_volt, idx, ldo_bypass;
|
||||||
struct dm_regulator_uclass_plat *uc_pdata;
|
struct dm_regulator_uclass_plat *uc_pdata;
|
||||||
const struct tps65941_reg_conv_ops *conv_ops;
|
const struct tps65941_reg_conv_ops *conv_ops;
|
||||||
ulong chip_id;
|
ulong chip_id;
|
||||||
@ -502,7 +510,9 @@ static int tps65941_ldo_val(struct udevice *dev, int op, int *uV)
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
ldo_bypass = ret & TPS65941_LDO_BYPASS_EN;
|
||||||
ret &= conv_ops->volt_mask;
|
ret &= conv_ops->volt_mask;
|
||||||
|
ret = ret >> TPS65941_LDO_MODE_MASK;
|
||||||
ret_volt = conv_ops->val2volt(idx, ret);
|
ret_volt = conv_ops->val2volt(idx, ret);
|
||||||
if (ret_volt < 0)
|
if (ret_volt < 0)
|
||||||
return ret_volt;
|
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 &= ~TPS65224_LDO_VOLT_MASK;
|
||||||
ret |= hex;
|
ret |= hex;
|
||||||
} else {
|
} else {
|
||||||
ret = hex;
|
ret = hex | ldo_bypass;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = pmic_reg_write(dev->parent, adr, ret);
|
ret = pmic_reg_write(dev->parent, adr, ret);
|
||||||
|
@ -21,10 +21,11 @@
|
|||||||
#define TPS65941_BUCK_VOLT_MAX 3340000
|
#define TPS65941_BUCK_VOLT_MAX 3340000
|
||||||
#define TPS65941_BUCK_MODE_MASK 0x1
|
#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_MAX_HEX 0x3A
|
||||||
#define TPS65941_LDO_VOLT_MIN_HEX 0x4
|
#define TPS65941_LDO_VOLT_MIN_HEX 0x4
|
||||||
#define TPS65941_LDO_VOLT_MAX 3300000
|
#define TPS65941_LDO_VOLT_MAX 3300000
|
||||||
|
#define TPS65941_LDO_VOLT_MIN 600000
|
||||||
#define TPS65941_LDO_MODE_MASK 0x1
|
#define TPS65941_LDO_MODE_MASK 0x1
|
||||||
#define TPS65941_LDO_BYPASS_EN 0x80
|
#define TPS65941_LDO_BYPASS_EN 0x80
|
||||||
#define TP65941_BUCK_CONF_SLEW_MASK 0x7
|
#define TP65941_BUCK_CONF_SLEW_MASK 0x7
|
||||||
|
Loading…
x
Reference in New Issue
Block a user