| From b16bef60a9112b1e6daf3afd16484eb06e7ce792 Mon Sep 17 00:00:00 2001 |
| From: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com> |
| Date: Fri, 8 Oct 2021 13:37:13 +0200 |
| Subject: regulator: s5m8767: do not use reset value as DVS voltage if GPIO DVS is disabled |
| |
| From: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com> |
| |
| commit b16bef60a9112b1e6daf3afd16484eb06e7ce792 upstream. |
| |
| The driver and its bindings, before commit 04f9f068a619 ("regulator: |
| s5m8767: Modify parsing method of the voltage table of buck2/3/4") were |
| requiring to provide at least one safe/default voltage for DVS registers |
| if DVS GPIO is not being enabled. |
| |
| IOW, if s5m8767,pmic-buck2-uses-gpio-dvs is missing, the |
| s5m8767,pmic-buck2-dvs-voltage should still be present and contain one |
| voltage. |
| |
| This requirement was coming from driver behavior matching this condition |
| (none of DVS GPIO is enabled): it was always initializing the DVS |
| selector pins to 0 and keeping the DVS enable setting at reset value |
| (enabled). Therefore if none of DVS GPIO is enabled in devicetree, |
| driver was configuring the first DVS voltage for buck[234]. |
| |
| Mentioned commit 04f9f068a619 ("regulator: s5m8767: Modify parsing |
| method of the voltage table of buck2/3/4") broke it because DVS voltage |
| won't be parsed from devicetree if DVS GPIO is not enabled. After the |
| change, driver will configure bucks to use the register reset value as |
| voltage which might have unpleasant effects. |
| |
| Fix this by relaxing the bindings constrain: if DVS GPIO is not enabled |
| in devicetree (therefore DVS voltage is also not parsed), explicitly |
| disable it. |
| |
| Cc: <stable@vger.kernel.org> |
| Fixes: 04f9f068a619 ("regulator: s5m8767: Modify parsing method of the voltage table of buck2/3/4") |
| Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com> |
| Acked-by: Rob Herring <robh@kernel.org> |
| Message-Id: <20211008113723.134648-2-krzysztof.kozlowski@canonical.com> |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| Documentation/devicetree/bindings/regulator/samsung,s5m8767.txt | 21 +++------- |
| drivers/regulator/s5m8767.c | 21 ++++------ |
| 2 files changed, 17 insertions(+), 25 deletions(-) |
| |
| --- a/Documentation/devicetree/bindings/regulator/samsung,s5m8767.txt |
| +++ b/Documentation/devicetree/bindings/regulator/samsung,s5m8767.txt |
| @@ -13,6 +13,14 @@ common regulator binding documented in: |
| |
| |
| Required properties of the main device node (the parent!): |
| + - s5m8767,pmic-buck-ds-gpios: GPIO specifiers for three host gpio's used |
| + for selecting GPIO DVS lines. It is one-to-one mapped to dvs gpio lines. |
| + |
| + [1] If either of the 's5m8767,pmic-buck[2/3/4]-uses-gpio-dvs' optional |
| + property is specified, then all the eight voltage values for the |
| + 's5m8767,pmic-buck[2/3/4]-dvs-voltage' should be specified. |
| + |
| +Optional properties of the main device node (the parent!): |
| - s5m8767,pmic-buck2-dvs-voltage: A set of 8 voltage values in micro-volt (uV) |
| units for buck2 when changing voltage using gpio dvs. Refer to [1] below |
| for additional information. |
| @@ -25,19 +33,6 @@ Required properties of the main device n |
| units for buck4 when changing voltage using gpio dvs. Refer to [1] below |
| for additional information. |
| |
| - - s5m8767,pmic-buck-ds-gpios: GPIO specifiers for three host gpio's used |
| - for selecting GPIO DVS lines. It is one-to-one mapped to dvs gpio lines. |
| - |
| - [1] If none of the 's5m8767,pmic-buck[2/3/4]-uses-gpio-dvs' optional |
| - property is specified, the 's5m8767,pmic-buck[2/3/4]-dvs-voltage' |
| - property should specify atleast one voltage level (which would be a |
| - safe operating voltage). |
| - |
| - If either of the 's5m8767,pmic-buck[2/3/4]-uses-gpio-dvs' optional |
| - property is specified, then all the eight voltage values for the |
| - 's5m8767,pmic-buck[2/3/4]-dvs-voltage' should be specified. |
| - |
| -Optional properties of the main device node (the parent!): |
| - s5m8767,pmic-buck2-uses-gpio-dvs: 'buck2' can be controlled by gpio dvs. |
| - s5m8767,pmic-buck3-uses-gpio-dvs: 'buck3' can be controlled by gpio dvs. |
| - s5m8767,pmic-buck4-uses-gpio-dvs: 'buck4' can be controlled by gpio dvs. |
| --- a/drivers/regulator/s5m8767.c |
| +++ b/drivers/regulator/s5m8767.c |
| @@ -851,18 +851,15 @@ static int s5m8767_pmic_probe(struct pla |
| /* DS4 GPIO */ |
| gpio_direction_output(pdata->buck_ds[2], 0x0); |
| |
| - if (pdata->buck2_gpiodvs || pdata->buck3_gpiodvs || |
| - pdata->buck4_gpiodvs) { |
| - regmap_update_bits(s5m8767->iodev->regmap_pmic, |
| - S5M8767_REG_BUCK2CTRL, 1 << 1, |
| - (pdata->buck2_gpiodvs) ? (1 << 1) : (0 << 1)); |
| - regmap_update_bits(s5m8767->iodev->regmap_pmic, |
| - S5M8767_REG_BUCK3CTRL, 1 << 1, |
| - (pdata->buck3_gpiodvs) ? (1 << 1) : (0 << 1)); |
| - regmap_update_bits(s5m8767->iodev->regmap_pmic, |
| - S5M8767_REG_BUCK4CTRL, 1 << 1, |
| - (pdata->buck4_gpiodvs) ? (1 << 1) : (0 << 1)); |
| - } |
| + regmap_update_bits(s5m8767->iodev->regmap_pmic, |
| + S5M8767_REG_BUCK2CTRL, 1 << 1, |
| + (pdata->buck2_gpiodvs) ? (1 << 1) : (0 << 1)); |
| + regmap_update_bits(s5m8767->iodev->regmap_pmic, |
| + S5M8767_REG_BUCK3CTRL, 1 << 1, |
| + (pdata->buck3_gpiodvs) ? (1 << 1) : (0 << 1)); |
| + regmap_update_bits(s5m8767->iodev->regmap_pmic, |
| + S5M8767_REG_BUCK4CTRL, 1 << 1, |
| + (pdata->buck4_gpiodvs) ? (1 << 1) : (0 << 1)); |
| |
| /* Initialize GPIO DVS registers */ |
| for (i = 0; i < 8; i++) { |