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 <felix.riem...@sma.de>
---
 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
___________________________________________________

Reply via email to