lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <20190613130058.10480-1-felix.riemann@sma.de>
Date:   Thu, 13 Jun 2019 13:01:45 +0000
From:   Felix Riemann <Felix.Riemann@....de>
To:     "linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>
CC:     "lee.jones@...aro.org" <lee.jones@...aro.org>,
        "broonie@...nel.org" <broonie@...nel.org>,
        "lgirdwood@...il.com" <lgirdwood@...il.com>,
        "support.opensource@...semi.com" <support.opensource@...semi.com>,
        Felix Riemann <Felix.Riemann@....de>
Subject: [PATCH] regulator: da9062: Adjust LDO voltage selection minimum value

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.riemann@....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
___________________________________________________

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ