]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
regulator: max8997: Convert to GPIO descriptors
authorLinus Walleij <linus.walleij@linaro.org>
Tue, 20 Feb 2024 08:36:27 +0000 (09:36 +0100)
committerMark Brown <broonie@kernel.org>
Mon, 26 Feb 2024 13:46:36 +0000 (13:46 +0000)
This rewrites the max8997 regulator driver to fetch the dvs
regulators as descriptors. This will likely mostly come from
the device tree since there are no in-tree users of the platform
data, but supplying GPIO descriptor tables from board files is
also possible if needed.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Link: https://msgid.link/r/20240220-descriptors-regulators-v1-4-097f608694be@linaro.org
Acked-by: Lee Jones <lee@kernel.org>
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/regulator/max8997-regulator.c
include/linux/mfd/max8997.h

index 0b38eaa73597ebbecacbc5f6353308919504c637..5f201ee9a5b8033658424ad6f64e57072d795232 100644 (file)
@@ -9,8 +9,7 @@
 
 #include <linux/bug.h>
 #include <linux/err.h>
-#include <linux/gpio.h>
-#include <linux/of_gpio.h>
+#include <linux/gpio/consumer.h>
 #include <linux/slab.h>
 #include <linux/module.h>
 #include <linux/platform_device.h>
@@ -32,7 +31,7 @@ struct max8997_data {
        u8 buck1_vol[8];
        u8 buck2_vol[8];
        u8 buck5_vol[8];
-       int buck125_gpios[3];
+       struct gpio_desc *buck125_gpiods[3];
        int buck125_gpioindex;
        bool ignore_gpiodvs_side_effect;
 
@@ -52,9 +51,9 @@ static inline void max8997_set_gpio(struct max8997_data *max8997)
        int set2 = ((max8997->buck125_gpioindex) >> 1) & 0x1;
        int set1 = ((max8997->buck125_gpioindex) >> 2) & 0x1;
 
-       gpio_set_value(max8997->buck125_gpios[0], set1);
-       gpio_set_value(max8997->buck125_gpios[1], set2);
-       gpio_set_value(max8997->buck125_gpios[2], set3);
+       gpiod_set_value(max8997->buck125_gpiods[0], set1);
+       gpiod_set_value(max8997->buck125_gpiods[1], set2);
+       gpiod_set_value(max8997->buck125_gpiods[2], set3);
 }
 
 struct voltage_map_desc {
@@ -873,31 +872,13 @@ static struct regulator_desc regulators[] = {
 };
 
 #ifdef CONFIG_OF
-static int max8997_pmic_dt_parse_dvs_gpio(struct platform_device *pdev,
-                       struct max8997_platform_data *pdata,
-                       struct device_node *pmic_np)
-{
-       int i, gpio;
-
-       for (i = 0; i < 3; i++) {
-               gpio = of_get_named_gpio(pmic_np,
-                                       "max8997,pmic-buck125-dvs-gpios", i);
-               if (!gpio_is_valid(gpio)) {
-                       dev_err(&pdev->dev, "invalid gpio[%d]: %d\n", i, gpio);
-                       return -EINVAL;
-               }
-               pdata->buck125_gpios[i] = gpio;
-       }
-       return 0;
-}
-
 static int max8997_pmic_dt_parse_pdata(struct platform_device *pdev,
                                        struct max8997_platform_data *pdata)
 {
        struct max8997_dev *iodev = dev_get_drvdata(pdev->dev.parent);
        struct device_node *pmic_np, *regulators_np, *reg_np;
        struct max8997_regulator_data *rdata;
-       unsigned int i, dvs_voltage_nr = 1, ret;
+       unsigned int i, dvs_voltage_nr = 1;
 
        pmic_np = iodev->dev->of_node;
        if (!pmic_np) {
@@ -949,10 +930,6 @@ static int max8997_pmic_dt_parse_pdata(struct platform_device *pdev,
 
        if (pdata->buck1_gpiodvs || pdata->buck2_gpiodvs ||
                                                pdata->buck5_gpiodvs) {
-               ret = max8997_pmic_dt_parse_dvs_gpio(pdev, pdata, pmic_np);
-               if (ret)
-                       return -EINVAL;
-
                if (of_property_read_u32(pmic_np,
                                "max8997,pmic-buck125-default-dvs-idx",
                                &pdata->buck125_default_idx)) {
@@ -1039,7 +1016,6 @@ static int max8997_pmic_probe(struct platform_device *pdev)
        max8997->buck1_gpiodvs = pdata->buck1_gpiodvs;
        max8997->buck2_gpiodvs = pdata->buck2_gpiodvs;
        max8997->buck5_gpiodvs = pdata->buck5_gpiodvs;
-       memcpy(max8997->buck125_gpios, pdata->buck125_gpios, sizeof(int) * 3);
        max8997->ignore_gpiodvs_side_effect = pdata->ignore_gpiodvs_side_effect;
 
        nr_dvs = (pdata->buck1_gpiodvs || pdata->buck2_gpiodvs ||
@@ -1110,38 +1086,27 @@ static int max8997_pmic_probe(struct platform_device *pdev)
         */
        if (pdata->buck1_gpiodvs || pdata->buck2_gpiodvs ||
                        pdata->buck5_gpiodvs) {
+               const char *gpio_names[3] = {"MAX8997 SET1", "MAX8997 SET2", "MAX8997 SET3"};
 
-               if (!gpio_is_valid(pdata->buck125_gpios[0]) ||
-                               !gpio_is_valid(pdata->buck125_gpios[1]) ||
-                               !gpio_is_valid(pdata->buck125_gpios[2])) {
-                       dev_err(&pdev->dev, "GPIO NOT VALID\n");
-                       return -EINVAL;
-               }
+               for (i = 0; i < 3; i++) {
+                       enum gpiod_flags flags;
 
-               ret = devm_gpio_request(&pdev->dev, pdata->buck125_gpios[0],
-                                       "MAX8997 SET1");
-               if (ret)
-                       return ret;
-
-               ret = devm_gpio_request(&pdev->dev, pdata->buck125_gpios[1],
-                                       "MAX8997 SET2");
-               if (ret)
-                       return ret;
-
-               ret = devm_gpio_request(&pdev->dev, pdata->buck125_gpios[2],
-                               "MAX8997 SET3");
-               if (ret)
-                       return ret;
-
-               gpio_direction_output(pdata->buck125_gpios[0],
-                               (max8997->buck125_gpioindex >> 2)
-                               & 0x1); /* SET1 */
-               gpio_direction_output(pdata->buck125_gpios[1],
-                               (max8997->buck125_gpioindex >> 1)
-                               & 0x1); /* SET2 */
-               gpio_direction_output(pdata->buck125_gpios[2],
-                               (max8997->buck125_gpioindex >> 0)
-                               & 0x1); /* SET3 */
+                       if (max8997->buck125_gpioindex & BIT(2 - i))
+                               flags = GPIOD_OUT_HIGH;
+                       else
+                               flags = GPIOD_OUT_LOW;
+
+                       max8997->buck125_gpiods[i] = devm_gpiod_get_index(iodev->dev,
+                                                                         "max8997,pmic-buck125-dvs",
+                                                                         i,
+                                                                         flags);
+                       if (IS_ERR(max8997->buck125_gpiods[i])) {
+                               ret = PTR_ERR(max8997->buck125_gpiods[i]);
+                               return dev_err_probe(iodev->dev, ret, "cant get GPIO %d (%d)\n",
+                                                    i, ret);
+                       }
+                       gpiod_set_consumer_name(max8997->buck125_gpiods[i], gpio_names[i]);
+               }
        }
 
        /* DVS-GPIO disabled */
index 6193905abbb5782bfde8668b448ea7eaa0bb8e0e..5c2cc1103437aa9e2d1becead5f49ad653af613a 100644 (file)
@@ -178,7 +178,6 @@ struct max8997_platform_data {
         *
         */
        bool ignore_gpiodvs_side_effect;
-       int buck125_gpios[3]; /* GPIO of [0]SET1, [1]SET2, [2]SET3 */
        int buck125_default_idx; /* Default value of SET1, 2, 3 */
        unsigned int buck1_voltage[8]; /* buckx_voltage in uV */
        bool buck1_gpiodvs;