According to the datasheet the LDO's voltage selection registers have
a minimum value of 0x2. This offset was not observed by the driver,
causing the LDO output being two steps (= 0.1V) lower than requested.
Signed-off-by: Felix Riemann <[email protected]>
---
drivers/regulator/da9062-regulator.c | 40 +++++++++++++++++++++---------------
include/linux/mfd/da9062/registers.h | 4 ++++
2 files changed, 28 insertions(+), 16 deletions(-)
diff --git a/drivers/regulator/da9062-regulator.c b/drivers/regulator/da9062-regulator.c
index a02e0488410f..bfe0fe52fdd2 100644
--- a/drivers/regulator/da9062-regulator.c
+++ b/drivers/regulator/da9062-regulator.c
@@ -493,12 +493,13 @@ static const struct da9062_regulator_info local_da9061_regulator_info[] = {
.desc.ops = &da9062_ldo_ops,
.desc.min_uV = (900) * 1000,
.desc.uV_step = (50) * 1000,
-.desc.n_voltages = ((3600) - (900))/(50) + 1,
+.desc.n_voltages = ((3600) - (900))/(50) + 1
++ DA9062AA_VLDO1_A_MIN_SEL,
.desc.enable_reg = DA9062AA_LDO1_CONT,
.desc.enable_mask = DA9062AA_LDO1_EN_MASK,
.desc.vsel_reg = DA9062AA_VLDO1_A,
.desc.vsel_mask = DA9062AA_VLDO1_A_MASK,
-.desc.linear_min_sel = 0,
+.desc.linear_min_sel = DA9062AA_VLDO1_A_MIN_SEL,
.sleep = REG_FIELD(DA9062AA_VLDO1_A,
__builtin_ffs((int)DA9062AA_LDO1_SL_A_MASK) - 1,
sizeof(unsigned int) * 8 -
@@ -525,12 +526,13 @@ static const struct da9062_regulator_info local_da9061_regulator_info[] = {
.desc.ops = &da9062_ldo_ops,
.desc.min_uV = (900) * 1000,
.desc.uV_step = (50) * 1000,
-.desc.n_voltages = ((3600) - (600))/(50) + 1,
+.desc.n_voltages = ((3600) - (600))/(50) + 1
++ DA9062AA_VLDO2_A_MIN_SEL,
.desc.enable_reg = DA9062AA_LDO2_CONT,
.desc.enable_mask = DA9062AA_LDO2_EN_MASK,
.desc.vsel_reg = DA9062AA_VLDO2_A,
.desc.vsel_mask = DA9062AA_VLDO2_A_MASK,
-.desc.linear_min_sel = 0,
+.desc.linear_min_sel = DA9062AA_VLDO2_A_MIN_SEL,
.sleep = REG_FIELD(DA9062AA_VLDO2_A,
__builtin_ffs((int)DA9062AA_LDO2_SL_A_MASK) - 1,
sizeof(unsigned int) * 8 -
@@ -557,12 +559,13 @@ static const struct da9062_regulator_info local_da9061_regulator_info[] = {
.desc.ops = &da9062_ldo_ops,
.desc.min_uV = (900) * 1000,
.desc.uV_step = (50) * 1000,
-.desc.n_voltages = ((3600) - (900))/(50) + 1,
+.desc.n_voltages = ((3600) - (900))/(50) + 1
++ DA9062AA_VLDO3_A_MIN_SEL,
.desc.enable_reg = DA9062AA_LDO3_CONT,
.desc.enable_mask = DA9062AA_LDO3_EN_MASK,
.desc.vsel_reg = DA9062AA_VLDO3_A,
.desc.vsel_mask = DA9062AA_VLDO3_A_MASK,
-.desc.linear_min_sel = 0,
+.desc.linear_min_sel = DA9062AA_VLDO3_A_MIN_SEL,
.sleep = REG_FIELD(DA9062AA_VLDO3_A,
__builtin_ffs((int)DA9062AA_LDO3_SL_A_MASK) - 1,
sizeof(unsigned int) * 8 -
@@ -589,12 +592,13 @@ static const struct da9062_regulator_info local_da9061_regulator_info[] = {
.desc.ops = &da9062_ldo_ops,
.desc.min_uV = (900) * 1000,
.desc.uV_step = (50) * 1000,
-.desc.n_voltages = ((3600) - (900))/(50) + 1,
+.desc.n_voltages = ((3600) - (900))/(50) + 1
++ DA9062AA_VLDO4_A_MIN_SEL,
.desc.enable_reg = DA9062AA_LDO4_CONT,
.desc.enable_mask = DA9062AA_LDO4_EN_MASK,
.desc.vsel_reg = DA9062AA_VLDO4_A,
.desc.vsel_mask = DA9062AA_VLDO4_A_MASK,
-.desc.linear_min_sel = 0,
+.desc.linear_min_sel = DA9062AA_VLDO4_A_MIN_SEL,
.sleep = REG_FIELD(DA9062AA_VLDO4_A,
__builtin_ffs((int)DA9062AA_LDO4_SL_A_MASK) - 1,
sizeof(unsigned int) * 8 -
@@ -769,12 +773,13 @@ static const struct da9062_regulator_info local_da9062_regulator_info[] = {
.desc.ops = &da9062_ldo_ops,
.desc.min_uV = (900) * 1000,
.desc.uV_step = (50) * 1000,
-.desc.n_voltages = ((3600) - (900))/(50) + 1,
+.desc.n_voltages = ((3600) - (900))/(50) + 1
++ DA9062AA_VLDO1_A_MIN_SEL,
.desc.enable_reg = DA9062AA_LDO1_CONT,
.desc.enable_mask = DA9062AA_LDO1_EN_MASK,
.desc.vsel_reg = DA9062AA_VLDO1_A,
.desc.vsel_mask = DA9062AA_VLDO1_A_MASK,
-.desc.linear_min_sel = 0,
+.desc.linear_min_sel = DA9062AA_VLDO1_A_MIN_SEL,
.sleep = REG_FIELD(DA9062AA_VLDO1_A,
__builtin_ffs((int)DA9062AA_LDO1_SL_A_MASK) - 1,
sizeof(unsigned int) * 8 -
@@ -801,12 +806,13 @@ static const struct da9062_regulator_info local_da9062_regulator_info[] = {
.desc.ops = &da9062_ldo_ops,
.desc.min_uV = (900) * 1000,
.desc.uV_step = (50) * 1000,
-.desc.n_voltages = ((3600) - (600))/(50) + 1,
+.desc.n_voltages = ((3600) - (600))/(50) + 1
++ DA9062AA_VLDO2_A_MIN_SEL,
.desc.enable_reg = DA9062AA_LDO2_CONT,
.desc.enable_mask = DA9062AA_LDO2_EN_MASK,
.desc.vsel_reg = DA9062AA_VLDO2_A,
.desc.vsel_mask = DA9062AA_VLDO2_A_MASK,
-.desc.linear_min_sel = 0,
+.desc.linear_min_sel = DA9062AA_VLDO2_A_MIN_SEL,
.sleep = REG_FIELD(DA9062AA_VLDO2_A,
__builtin_ffs((int)DA9062AA_LDO2_SL_A_MASK) - 1,
sizeof(unsigned int) * 8 -
@@ -833,12 +839,13 @@ static const struct da9062_regulator_info local_da9062_regulator_info[] = {
.desc.ops = &da9062_ldo_ops,
.desc.min_uV = (900) * 1000,
.desc.uV_step = (50) * 1000,
-.desc.n_voltages = ((3600) - (900))/(50) + 1,
+.desc.n_voltages = ((3600) - (900))/(50) + 1
++ DA9062AA_VLDO3_A_MIN_SEL,
.desc.enable_reg = DA9062AA_LDO3_CONT,
.desc.enable_mask = DA9062AA_LDO3_EN_MASK,
.desc.vsel_reg = DA9062AA_VLDO3_A,
.desc.vsel_mask = DA9062AA_VLDO3_A_MASK,
-.desc.linear_min_sel = 0,
+.desc.linear_min_sel = DA9062AA_VLDO3_A_MIN_SEL,
.sleep = REG_FIELD(DA9062AA_VLDO3_A,
__builtin_ffs((int)DA9062AA_LDO3_SL_A_MASK) - 1,
sizeof(unsigned int) * 8 -
@@ -865,12 +872,13 @@ static const struct da9062_regulator_info local_da9062_regulator_info[] = {
.desc.ops = &da9062_ldo_ops,
.desc.min_uV = (900) * 1000,
.desc.uV_step = (50) * 1000,
-.desc.n_voltages = ((3600) - (900))/(50) + 1,
+.desc.n_voltages = ((3600) - (900))/(50) + 1
++ DA9062AA_VLDO4_A_MIN_SEL,
.desc.enable_reg = DA9062AA_LDO4_CONT,
.desc.enable_mask = DA9062AA_LDO4_EN_MASK,
.desc.vsel_reg = DA9062AA_VLDO4_A,
.desc.vsel_mask = DA9062AA_VLDO4_A_MASK,
-.desc.linear_min_sel = 0,
+.desc.linear_min_sel = DA9062AA_VLDO4_A_MIN_SEL,
.sleep = REG_FIELD(DA9062AA_VLDO4_A,
__builtin_ffs((int)DA9062AA_LDO4_SL_A_MASK) - 1,
sizeof(unsigned int) * 8 -
diff --git a/include/linux/mfd/da9062/registers.h b/include/linux/mfd/da9062/registers.h
index fe04b708742b..559b064d5e5a 100644
--- a/include/linux/mfd/da9062/registers.h
+++ b/include/linux/mfd/da9062/registers.h
@@ -798,24 +798,28 @@
#define DA9062AA_BUCK3_SL_A_MASKBIT(7)
/* DA9062AA_VLDO1_A = 0x0A9 */
+#define DA9062AA_VLDO1_A_MIN_SEL2
#define DA9062AA_VLDO1_A_SHIFT0
#define DA9062AA_VLDO1_A_MASK0x3f
#define DA9062AA_LDO1_SL_A_SHIFT7
#define DA9062AA_LDO1_SL_A_MASKBIT(7)
/* DA9062AA_VLDO2_A = 0x0AA */
+#define DA9062AA_VLDO2_A_MIN_SEL2
#define DA9062AA_VLDO2_A_SHIFT0
#define DA9062AA_VLDO2_A_MASK0x3f
#define DA9062AA_LDO2_SL_A_SHIFT7
#define DA9062AA_LDO2_SL_A_MASKBIT(7)
/* DA9062AA_VLDO3_A = 0x0AB */
+#define DA9062AA_VLDO3_A_MIN_SEL2
#define DA9062AA_VLDO3_A_SHIFT0
#define DA9062AA_VLDO3_A_MASK0x3f
#define DA9062AA_LDO3_SL_A_SHIFT7
#define DA9062AA_LDO3_SL_A_MASKBIT(7)
/* DA9062AA_VLDO4_A = 0x0AC */
+#define DA9062AA_VLDO4_A_MIN_SEL2
#define DA9062AA_VLDO4_A_SHIFT0
#define DA9062AA_VLDO4_A_MASK0x3f
#define DA9062AA_LDO4_SL_A_SHIFT7
--
2.16.4
___________________________________________________
SMA Solar Technology AG
Aufsichtsrat: Dr. Erik Ehrentraut (Vorsitzender)
Vorstand: Ulrich Hadding, Dr.-Ing. Juergen Reinert
Handelsregister: Amtsgericht Kassel HRB 3972
Sitz der Gesellschaft: 34266 Niestetal
USt-ID-Nr. DE 113 08 59 54
WEEE-Reg.-Nr. DE 95881150
___________________________________________________