]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
regulator: s5m8767: Convert to GPIO descriptors
authorPeng Fan <peng.fan@nxp.com>
Thu, 27 Mar 2025 00:49:45 +0000 (08:49 +0800)
committerMark Brown <broonie@kernel.org>
Mon, 7 Apr 2025 11:53:34 +0000 (12:53 +0100)
Update the driver to fetch buck_gpio and buck_ds as GPIO descriptors.
Then drop the usage of 'of_gpio.h' which should be deprecated.
Based on commit 84618d5e31cf ("regulator: max8997:
Convert to GPIO descriptors") as a reference to make the changes.

With the quirk fix for s5m8767 in of_gpio_try_fixup_polarity,
the polarity will be active-high, even if exynos5250 spring DTS
wrongly use active-low polarity. So using GPIO descriptors,
it should work as before.

Signed-off-by: Peng Fan <peng.fan@nxp.com>
Acked-by: Mark Brown <broonie@kernel.org>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Link: https://patch.msgid.link/20250327004945.563765-2-peng.fan@oss.nxp.com
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/regulator/s5m8767.c

index d25cd81e3f360775fde65561bb9a950194a208e0..fe2631378ccd9cfdced937a7c3ee5e176fa65ed0 100644 (file)
@@ -5,7 +5,7 @@
 
 #include <linux/cleanup.h>
 #include <linux/err.h>
-#include <linux/of_gpio.h>
+#include <linux/of.h>
 #include <linux/gpio/consumer.h>
 #include <linux/module.h>
 #include <linux/platform_device.h>
@@ -35,8 +35,8 @@ struct s5m8767_info {
        u8 buck2_vol[8];
        u8 buck3_vol[8];
        u8 buck4_vol[8];
-       int buck_gpios[3];
-       int buck_ds[3];
+       struct gpio_desc *buck_gpios[3];
+       struct gpio_desc *buck_ds[3];
        int buck_gpioindex;
 };
 
@@ -272,9 +272,9 @@ static inline int s5m8767_set_high(struct s5m8767_info *s5m8767)
 {
        int temp_index = s5m8767->buck_gpioindex;
 
-       gpio_set_value(s5m8767->buck_gpios[0], (temp_index >> 2) & 0x1);
-       gpio_set_value(s5m8767->buck_gpios[1], (temp_index >> 1) & 0x1);
-       gpio_set_value(s5m8767->buck_gpios[2], temp_index & 0x1);
+       gpiod_set_value(s5m8767->buck_gpios[0], !!(temp_index & BIT(2)));
+       gpiod_set_value(s5m8767->buck_gpios[1], !!(temp_index & BIT(1)));
+       gpiod_set_value(s5m8767->buck_gpios[2], !!(temp_index & BIT(0)));
 
        return 0;
 }
@@ -283,9 +283,9 @@ static inline int s5m8767_set_low(struct s5m8767_info *s5m8767)
 {
        int temp_index = s5m8767->buck_gpioindex;
 
-       gpio_set_value(s5m8767->buck_gpios[2], temp_index & 0x1);
-       gpio_set_value(s5m8767->buck_gpios[1], (temp_index >> 1) & 0x1);
-       gpio_set_value(s5m8767->buck_gpios[0], (temp_index >> 2) & 0x1);
+       gpiod_set_value(s5m8767->buck_gpios[2], !!(temp_index & BIT(0)));
+       gpiod_set_value(s5m8767->buck_gpios[1], !!(temp_index & BIT(1)));
+       gpiod_set_value(s5m8767->buck_gpios[0], !!(temp_index & BIT(2)));
 
        return 0;
 }
@@ -482,42 +482,6 @@ static int s5m8767_enable_ext_control(struct s5m8767_info *s5m8767,
 
 
 #ifdef CONFIG_OF
-static int s5m8767_pmic_dt_parse_dvs_gpio(struct sec_pmic_dev *iodev,
-                       struct sec_platform_data *pdata,
-                       struct device_node *pmic_np)
-{
-       int i, gpio;
-
-       for (i = 0; i < 3; i++) {
-               gpio = of_get_named_gpio(pmic_np,
-                                       "s5m8767,pmic-buck-dvs-gpios", i);
-               if (!gpio_is_valid(gpio)) {
-                       dev_err(iodev->dev, "invalid gpio[%d]: %d\n", i, gpio);
-                       return -EINVAL;
-               }
-               pdata->buck_gpios[i] = gpio;
-       }
-       return 0;
-}
-
-static int s5m8767_pmic_dt_parse_ds_gpio(struct sec_pmic_dev *iodev,
-                       struct sec_platform_data *pdata,
-                       struct device_node *pmic_np)
-{
-       int i, gpio;
-
-       for (i = 0; i < 3; i++) {
-               gpio = of_get_named_gpio(pmic_np,
-                                       "s5m8767,pmic-buck-ds-gpios", i);
-               if (!gpio_is_valid(gpio)) {
-                       dev_err(iodev->dev, "invalid gpio[%d]: %d\n", i, gpio);
-                       return -EINVAL;
-               }
-               pdata->buck_ds[i] = gpio;
-       }
-       return 0;
-}
-
 static int s5m8767_pmic_dt_parse_pdata(struct platform_device *pdev,
                                        struct sec_platform_data *pdata)
 {
@@ -525,7 +489,7 @@ static int s5m8767_pmic_dt_parse_pdata(struct platform_device *pdev,
        struct device_node *pmic_np, *reg_np;
        struct sec_regulator_data *rdata;
        struct sec_opmode_data *rmode;
-       unsigned int i, dvs_voltage_nr = 8, ret;
+       unsigned int i, dvs_voltage_nr = 8;
 
        pmic_np = iodev->dev->of_node;
        if (!pmic_np) {
@@ -635,10 +599,6 @@ static int s5m8767_pmic_dt_parse_pdata(struct platform_device *pdev,
 
        if (pdata->buck2_gpiodvs || pdata->buck3_gpiodvs ||
                                                pdata->buck4_gpiodvs) {
-               ret = s5m8767_pmic_dt_parse_dvs_gpio(iodev, pdata, pmic_np);
-               if (ret)
-                       return -EINVAL;
-
                if (of_property_read_u32(pmic_np,
                                "s5m8767,pmic-buck-default-dvs-idx",
                                &pdata->buck_default_idx)) {
@@ -652,10 +612,6 @@ static int s5m8767_pmic_dt_parse_pdata(struct platform_device *pdev,
                }
        }
 
-       ret = s5m8767_pmic_dt_parse_ds_gpio(iodev, pdata, pmic_np);
-       if (ret)
-               return -EINVAL;
-
        pdata->buck2_ramp_enable = of_property_read_bool(pmic_np, "s5m8767,pmic-buck2-ramp-enable");
        pdata->buck3_ramp_enable = of_property_read_bool(pmic_np, "s5m8767,pmic-buck3-ramp-enable");
        pdata->buck4_ramp_enable = of_property_read_bool(pmic_np, "s5m8767,pmic-buck4-ramp-enable");
@@ -684,6 +640,8 @@ static int s5m8767_pmic_probe(struct platform_device *pdev)
        struct regulator_config config = { };
        struct s5m8767_info *s5m8767;
        int i, ret, buck_init;
+       const char *gpiods_names[3] = { "S5M8767 DS2", "S5M8767 DS3", "S5M8767 DS4" };
+       const char *gpiodvs_names[3] = { "S5M8767 SET1", "S5M8767 SET2", "S5M8767 SET3" };
 
        if (!pdata) {
                dev_err(pdev->dev.parent, "Platform data not supplied\n");
@@ -731,12 +689,6 @@ static int s5m8767_pmic_probe(struct platform_device *pdev)
        s5m8767->buck2_gpiodvs = pdata->buck2_gpiodvs;
        s5m8767->buck3_gpiodvs = pdata->buck3_gpiodvs;
        s5m8767->buck4_gpiodvs = pdata->buck4_gpiodvs;
-       s5m8767->buck_gpios[0] = pdata->buck_gpios[0];
-       s5m8767->buck_gpios[1] = pdata->buck_gpios[1];
-       s5m8767->buck_gpios[2] = pdata->buck_gpios[2];
-       s5m8767->buck_ds[0] = pdata->buck_ds[0];
-       s5m8767->buck_ds[1] = pdata->buck_ds[1];
-       s5m8767->buck_ds[2] = pdata->buck_ds[2];
 
        s5m8767->ramp_delay = pdata->buck_ramp_delay;
        s5m8767->buck2_ramp = pdata->buck2_ramp_enable;
@@ -787,58 +739,36 @@ static int s5m8767_pmic_probe(struct platform_device *pdev)
 
        if (pdata->buck2_gpiodvs || pdata->buck3_gpiodvs ||
                                                pdata->buck4_gpiodvs) {
+               for (i = 0; i < 3; i++) {
+                       enum gpiod_flags flags;
 
-               if (!gpio_is_valid(pdata->buck_gpios[0]) ||
-                       !gpio_is_valid(pdata->buck_gpios[1]) ||
-                       !gpio_is_valid(pdata->buck_gpios[2])) {
-                       dev_err(&pdev->dev, "GPIO NOT VALID\n");
-                       return -EINVAL;
-               }
-
-               ret = devm_gpio_request(&pdev->dev, pdata->buck_gpios[0],
-                                       "S5M8767 SET1");
-               if (ret)
-                       return ret;
-
-               ret = devm_gpio_request(&pdev->dev, pdata->buck_gpios[1],
-                                       "S5M8767 SET2");
-               if (ret)
-                       return ret;
-
-               ret = devm_gpio_request(&pdev->dev, pdata->buck_gpios[2],
-                                       "S5M8767 SET3");
-               if (ret)
-                       return ret;
+                       if (s5m8767->buck_gpioindex & BIT(2 - i))
+                               flags = GPIOD_OUT_HIGH;
+                       else
+                               flags = GPIOD_OUT_LOW;
+
+                       s5m8767->buck_gpios[i] = devm_gpiod_get_index(iodev->dev,
+                                                                     "s5m8767,pmic-buck-dvs", i,
+                                                                     flags);
+                       if (IS_ERR(s5m8767->buck_gpios[i])) {
+                               return dev_err_probe(iodev->dev, PTR_ERR(s5m8767->buck_gpios[i]),
+                                                    "invalid gpio[%d]\n", i);
+                       }
 
-               /* SET1 GPIO */
-               gpio_direction_output(pdata->buck_gpios[0],
-                               (s5m8767->buck_gpioindex >> 2) & 0x1);
-               /* SET2 GPIO */
-               gpio_direction_output(pdata->buck_gpios[1],
-                               (s5m8767->buck_gpioindex >> 1) & 0x1);
-               /* SET3 GPIO */
-               gpio_direction_output(pdata->buck_gpios[2],
-                               (s5m8767->buck_gpioindex >> 0) & 0x1);
+                       gpiod_set_consumer_name(s5m8767->buck_gpios[i], gpiodvs_names[i]);
+               }
        }
 
-       ret = devm_gpio_request(&pdev->dev, pdata->buck_ds[0], "S5M8767 DS2");
-       if (ret)
-               return ret;
-
-       ret = devm_gpio_request(&pdev->dev, pdata->buck_ds[1], "S5M8767 DS3");
-       if (ret)
-               return ret;
-
-       ret = devm_gpio_request(&pdev->dev, pdata->buck_ds[2], "S5M8767 DS4");
-       if (ret)
-               return ret;
-
-       /* DS2 GPIO */
-       gpio_direction_output(pdata->buck_ds[0], 0x0);
-       /* DS3 GPIO */
-       gpio_direction_output(pdata->buck_ds[1], 0x0);
-       /* DS4 GPIO */
-       gpio_direction_output(pdata->buck_ds[2], 0x0);
+       for (i = 0; i < 3; i++) {
+               s5m8767->buck_ds[i] = devm_gpiod_get_index(iodev->dev,
+                                                          "s5m8767,pmic-buck-ds", i,
+                                                          GPIOD_OUT_LOW);
+               if (IS_ERR(s5m8767->buck_ds[i])) {
+                       return dev_err_probe(iodev->dev, PTR_ERR(s5m8767->buck_ds[i]),
+                                            "can't get GPIO %d\n", i);
+               }
+               gpiod_set_consumer_name(s5m8767->buck_ds[i], gpiods_names[i]);
+       }
 
        regmap_update_bits(s5m8767->iodev->regmap_pmic,
                           S5M8767_REG_BUCK2CTRL, 1 << 1,