regulator: s2mps11: Adjust supported buck voltages to real values
authorKrzysztof Kozlowski <krzk@kernel.org>
Sat, 29 Jun 2019 11:44:46 +0000 (13:44 +0200)
committerMark Brown <broonie@kernel.org>
Tue, 2 Jul 2019 11:43:25 +0000 (12:43 +0100)
The driver was registering buck regulators with unsupported range of
voltages for S2MPS11 devices.  Basically it assumed that all 256 values
are possible for a single 8-bit I2C register controlling buck's voltage.
This is not true, as datasheet describes subset of these which can be
used.

For example for buck[12346] the minimum voltage is 650 mV which
corresponds to register value of 0x8.  The driver was however
registering regulator starting at 600 mV, so for a step of 6.25 mV this
gave the same result.  However this allowed to try to configure
regulators to unsupported values.

Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org>
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/regulator/s2mps11.c
include/linux/mfd/samsung/core.h
include/linux/mfd/samsung/s2mps11.h

index 7a89030..5b7ba7c 100644 (file)
@@ -269,9 +269,10 @@ static const struct regulator_ops s2mps11_buck_ops = {
        .ops            = &s2mps11_buck_ops,                    \
        .type           = REGULATOR_VOLTAGE,                    \
        .owner          = THIS_MODULE,                          \
-       .min_uV         = MIN_600_MV,                           \
+       .min_uV         = MIN_650_MV,                           \
        .uV_step        = STEP_6_25_MV,                         \
-       .n_voltages     = S2MPS11_BUCK_N_VOLTAGES,              \
+       .linear_min_sel = 8,                                    \
+       .n_voltages     = S2MPS11_BUCK12346_N_VOLTAGES,         \
        .ramp_delay     = S2MPS11_RAMP_DELAY,                   \
        .vsel_reg       = S2MPS11_REG_B1CTRL2 + (num - 1) * 2,  \
        .vsel_mask      = S2MPS11_BUCK_VSEL_MASK,               \
@@ -285,9 +286,10 @@ static const struct regulator_ops s2mps11_buck_ops = {
        .ops            = &s2mps11_buck_ops,                    \
        .type           = REGULATOR_VOLTAGE,                    \
        .owner          = THIS_MODULE,                          \
-       .min_uV         = MIN_600_MV,                           \
+       .min_uV         = MIN_650_MV,                           \
        .uV_step        = STEP_6_25_MV,                         \
-       .n_voltages     = S2MPS11_BUCK_N_VOLTAGES,              \
+       .linear_min_sel = 8,                                    \
+       .n_voltages     = S2MPS11_BUCK5_N_VOLTAGES,             \
        .ramp_delay     = S2MPS11_RAMP_DELAY,                   \
        .vsel_reg       = S2MPS11_REG_B5CTRL2,                  \
        .vsel_mask      = S2MPS11_BUCK_VSEL_MASK,               \
@@ -295,7 +297,7 @@ static const struct regulator_ops s2mps11_buck_ops = {
        .enable_mask    = S2MPS11_ENABLE_MASK                   \
 }
 
-#define regulator_desc_s2mps11_buck67810(num, min, step) {     \
+#define regulator_desc_s2mps11_buck67810(num, min, step, min_sel, voltages) {  \
        .name           = "BUCK"#num,                           \
        .id             = S2MPS11_BUCK##num,                    \
        .ops            = &s2mps11_buck_ops,                    \
@@ -303,7 +305,8 @@ static const struct regulator_ops s2mps11_buck_ops = {
        .owner          = THIS_MODULE,                          \
        .min_uV         = min,                                  \
        .uV_step        = step,                                 \
-       .n_voltages     = S2MPS11_BUCK_N_VOLTAGES,              \
+       .linear_min_sel = min_sel,                              \
+       .n_voltages     = voltages,                             \
        .ramp_delay     = S2MPS11_RAMP_DELAY,                   \
        .vsel_reg       = S2MPS11_REG_B6CTRL2 + (num - 6) * 2,  \
        .vsel_mask      = S2MPS11_BUCK_VSEL_MASK,               \
@@ -371,11 +374,15 @@ static const struct regulator_desc s2mps11_regulators[] = {
        regulator_desc_s2mps11_buck1_4(3),
        regulator_desc_s2mps11_buck1_4(4),
        regulator_desc_s2mps11_buck5,
-       regulator_desc_s2mps11_buck67810(6, MIN_600_MV, STEP_6_25_MV),
-       regulator_desc_s2mps11_buck67810(7, MIN_750_MV, STEP_12_5_MV),
-       regulator_desc_s2mps11_buck67810(8, MIN_750_MV, STEP_12_5_MV),
+       regulator_desc_s2mps11_buck67810(6, MIN_650_MV, STEP_6_25_MV, 8,
+                                        S2MPS11_BUCK12346_N_VOLTAGES),
+       regulator_desc_s2mps11_buck67810(7, MIN_750_MV, STEP_12_5_MV, 0,
+                                        S2MPS11_BUCK7810_N_VOLTAGES),
+       regulator_desc_s2mps11_buck67810(8, MIN_750_MV, STEP_12_5_MV, 0,
+                                        S2MPS11_BUCK7810_N_VOLTAGES),
        regulator_desc_s2mps11_buck9,
-       regulator_desc_s2mps11_buck67810(10, MIN_750_MV, STEP_12_5_MV),
+       regulator_desc_s2mps11_buck67810(10, MIN_750_MV, STEP_12_5_MV, 0,
+                                        S2MPS11_BUCK7810_N_VOLTAGES),
 };
 
 static const struct regulator_ops s2mps14_reg_ops;
index 3ca17eb..f1631a3 100644 (file)
@@ -20,6 +20,7 @@
 #define MIN_850_MV             850000
 #define MIN_800_MV             800000
 #define MIN_750_MV             750000
+#define MIN_650_MV             650000
 #define MIN_600_MV             600000
 #define MIN_500_MV             500000
 
index 6e7668a..fc67c9e 100644 (file)
@@ -170,7 +170,9 @@ enum s2mps11_regulators {
 #define S2MPS11_ENABLE_MASK    (0x03 << S2MPS11_ENABLE_SHIFT)
 #define S2MPS11_ENABLE_SHIFT   0x06
 #define S2MPS11_LDO_N_VOLTAGES (S2MPS11_LDO_VSEL_MASK + 1)
-#define S2MPS11_BUCK_N_VOLTAGES (S2MPS11_BUCK_VSEL_MASK + 1)
+#define S2MPS11_BUCK12346_N_VOLTAGES   153
+#define S2MPS11_BUCK5_N_VOLTAGES       216
+#define S2MPS11_BUCK7810_N_VOLTAGES    225
 #define S2MPS11_BUCK9_N_VOLTAGES (S2MPS11_BUCK9_VSEL_MASK + 1)
 #define S2MPS11_RAMP_DELAY     25000           /* uV/us */