diff mbox series

[10/18,v2] regulator: s2mps11: Pass descriptor instead of GPIO number

Message ID 20180422230742.3729-10-linus.walleij@linaro.org
State Superseded
Headers show
Series [01/18,v2] regulator: fixed: Convert to use GPIO descriptor only | expand

Commit Message

Linus Walleij April 22, 2018, 11:07 p.m. UTC
Instead of passing a global GPIO number for the enable GPIO, pass
a descriptor looked up with the standard devm_gpiod_get_optional()
call.

This regulator supports passing platform data, but enable/sleep
regulators are looked up from the device tree exclusively, so
we can need not touch other files.

Cc: Krzysztof Kozlowski <krzk@kernel.org>
Cc: Sangbeom Kim <sbkim73@samsung.com>
Cc: Chanwoo Choi <cw00.choi@samsung.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>

---
ChangeLog v1->v2:
- Rebase the patch on the other changes.
---
 drivers/regulator/s2mps11.c | 46 ++++++++++++++++++++++-----------------------
 1 file changed, 23 insertions(+), 23 deletions(-)

-- 
2.14.3

Comments

Krzysztof Kozlowski May 14, 2018, 7:59 a.m. UTC | #1
On Mon, Apr 23, 2018 at 1:07 AM, Linus Walleij <linus.walleij@linaro.org> wrote:
> Instead of passing a global GPIO number for the enable GPIO, pass

> a descriptor looked up with the standard devm_gpiod_get_optional()

> call.

>

> This regulator supports passing platform data, but enable/sleep

> regulators are looked up from the device tree exclusively, so

> we can need not touch other files.

>

> Cc: Krzysztof Kozlowski <krzk@kernel.org>

> Cc: Sangbeom Kim <sbkim73@samsung.com>

> Cc: Chanwoo Choi <cw00.choi@samsung.com>

> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>

> ---

> ChangeLog v1->v2:

> - Rebase the patch on the other changes.

> ---

>  drivers/regulator/s2mps11.c | 46 ++++++++++++++++++++++-----------------------

>  1 file changed, 23 insertions(+), 23 deletions(-)

>

> diff --git a/drivers/regulator/s2mps11.c b/drivers/regulator/s2mps11.c

> index 7726b874e539..9a1dca26362e 100644

> --- a/drivers/regulator/s2mps11.c

> +++ b/drivers/regulator/s2mps11.c

> @@ -18,7 +18,7 @@

>

>  #include <linux/bug.h>

>  #include <linux/err.h>

> -#include <linux/gpio.h>

> +#include <linux/gpio/consumer.h>

>  #include <linux/slab.h>

>  #include <linux/module.h>

>  #include <linux/of.h>

> @@ -27,7 +27,6 @@

>  #include <linux/regulator/driver.h>

>  #include <linux/regulator/machine.h>

>  #include <linux/regulator/of_regulator.h>

> -#include <linux/of_gpio.h>

>  #include <linux/mfd/samsung/core.h>

>  #include <linux/mfd/samsung/s2mps11.h>

>  #include <linux/mfd/samsung/s2mps13.h>

> @@ -57,7 +56,7 @@ struct s2mps11_info {

>          * Array (size: number of regulators) with GPIO-s for external

>          * sleep control.

>          */

> -       int *ext_control_gpio;

> +       struct gpio_desc **ext_control_gpiod;

>  };

>

>  static int get_ramp_delay(int ramp_delay)

> @@ -524,7 +523,7 @@ static int s2mps14_regulator_enable(struct regulator_dev *rdev)

>         case S2MPS14X:

>                 if (test_bit(rdev_get_id(rdev), s2mps11->suspend_state))

>                         val = S2MPS14_ENABLE_SUSPEND;

> -               else if (gpio_is_valid(s2mps11->ext_control_gpio[rdev_get_id(rdev)]))

> +               else if (s2mps11->ext_control_gpiod[rdev_get_id(rdev)])

>                         val = S2MPS14_ENABLE_EXT_CONTROL;

>                 else

>                         val = rdev->desc->enable_mask;

> @@ -818,7 +817,7 @@ static int s2mps14_pmic_enable_ext_control(struct s2mps11_info *s2mps11,

>  static void s2mps14_pmic_dt_parse_ext_control_gpio(struct platform_device *pdev,

>                 struct of_regulator_match *rdata, struct s2mps11_info *s2mps11)

>  {

> -       int *gpio = s2mps11->ext_control_gpio;

> +       struct gpio_desc **gpio = s2mps11->ext_control_gpiod;

>         unsigned int i;

>         unsigned int valid_regulators[3] = { S2MPS14_LDO10, S2MPS14_LDO11,

>                 S2MPS14_LDO12 };

> @@ -829,11 +828,20 @@ static void s2mps14_pmic_dt_parse_ext_control_gpio(struct platform_device *pdev,

>                 if (!rdata[reg].init_data || !rdata[reg].of_node)

>                         continue;

>

> -               gpio[reg] = of_get_named_gpio(rdata[reg].of_node,

> -                               "samsung,ext-control-gpios", 0);

> -               if (gpio_is_valid(gpio[reg]))

> -                       dev_dbg(&pdev->dev, "Using GPIO %d for ext-control over %d/%s\n",

> -                                       gpio[reg], reg, rdata[reg].name);

> +               gpio[reg] = devm_gpiod_get_from_of_node(&pdev->dev,

> +                                                       rdata[reg].of_node,

> +                                                       "samsung,ext-control-gpios",

> +                                                       0,

> +                                                       GPIOD_OUT_HIGH,

> +                                                       "s2mps11-LDO");


The same as with max77686 - this can be also for bucks so how about
the name of "s2mps11-regulator"?

Rest looks good.

Best regards,
Krzysztof
Krzysztof Kozlowski May 14, 2018, 9:40 a.m. UTC | #2
On Mon, May 14, 2018 at 9:59 AM, Krzysztof Kozlowski <krzk@kernel.org> wrote:
> On Mon, Apr 23, 2018 at 1:07 AM, Linus Walleij <linus.walleij@linaro.org> wrote:

>> Instead of passing a global GPIO number for the enable GPIO, pass

>> a descriptor looked up with the standard devm_gpiod_get_optional()

>> call.

>>

>> This regulator supports passing platform data, but enable/sleep

>> regulators are looked up from the device tree exclusively, so

>> we can need not touch other files.

>>

>> Cc: Krzysztof Kozlowski <krzk@kernel.org>

>> Cc: Sangbeom Kim <sbkim73@samsung.com>

>> Cc: Chanwoo Choi <cw00.choi@samsung.com>

>> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>

>> ---

>> ChangeLog v1->v2:

>> - Rebase the patch on the other changes.

>> ---

>>  drivers/regulator/s2mps11.c | 46 ++++++++++++++++++++++-----------------------

>>  1 file changed, 23 insertions(+), 23 deletions(-)

>>

>> diff --git a/drivers/regulator/s2mps11.c b/drivers/regulator/s2mps11.c

>> index 7726b874e539..9a1dca26362e 100644

>> --- a/drivers/regulator/s2mps11.c

>> +++ b/drivers/regulator/s2mps11.c

>> @@ -18,7 +18,7 @@

>>

>>  #include <linux/bug.h>

>>  #include <linux/err.h>

>> -#include <linux/gpio.h>

>> +#include <linux/gpio/consumer.h>

>>  #include <linux/slab.h>

>>  #include <linux/module.h>

>>  #include <linux/of.h>

>> @@ -27,7 +27,6 @@

>>  #include <linux/regulator/driver.h>

>>  #include <linux/regulator/machine.h>

>>  #include <linux/regulator/of_regulator.h>

>> -#include <linux/of_gpio.h>

>>  #include <linux/mfd/samsung/core.h>

>>  #include <linux/mfd/samsung/s2mps11.h>

>>  #include <linux/mfd/samsung/s2mps13.h>

>> @@ -57,7 +56,7 @@ struct s2mps11_info {

>>          * Array (size: number of regulators) with GPIO-s for external

>>          * sleep control.

>>          */

>> -       int *ext_control_gpio;

>> +       struct gpio_desc **ext_control_gpiod;

>>  };

>>

>>  static int get_ramp_delay(int ramp_delay)

>> @@ -524,7 +523,7 @@ static int s2mps14_regulator_enable(struct regulator_dev *rdev)

>>         case S2MPS14X:

>>                 if (test_bit(rdev_get_id(rdev), s2mps11->suspend_state))

>>                         val = S2MPS14_ENABLE_SUSPEND;

>> -               else if (gpio_is_valid(s2mps11->ext_control_gpio[rdev_get_id(rdev)]))

>> +               else if (s2mps11->ext_control_gpiod[rdev_get_id(rdev)])

>>                         val = S2MPS14_ENABLE_EXT_CONTROL;

>>                 else

>>                         val = rdev->desc->enable_mask;

>> @@ -818,7 +817,7 @@ static int s2mps14_pmic_enable_ext_control(struct s2mps11_info *s2mps11,

>>  static void s2mps14_pmic_dt_parse_ext_control_gpio(struct platform_device *pdev,

>>                 struct of_regulator_match *rdata, struct s2mps11_info *s2mps11)

>>  {

>> -       int *gpio = s2mps11->ext_control_gpio;

>> +       struct gpio_desc **gpio = s2mps11->ext_control_gpiod;

>>         unsigned int i;

>>         unsigned int valid_regulators[3] = { S2MPS14_LDO10, S2MPS14_LDO11,

>>                 S2MPS14_LDO12 };

>> @@ -829,11 +828,20 @@ static void s2mps14_pmic_dt_parse_ext_control_gpio(struct platform_device *pdev,

>>                 if (!rdata[reg].init_data || !rdata[reg].of_node)

>>                         continue;

>>

>> -               gpio[reg] = of_get_named_gpio(rdata[reg].of_node,

>> -                               "samsung,ext-control-gpios", 0);

>> -               if (gpio_is_valid(gpio[reg]))

>> -                       dev_dbg(&pdev->dev, "Using GPIO %d for ext-control over %d/%s\n",

>> -                                       gpio[reg], reg, rdata[reg].name);

>> +               gpio[reg] = devm_gpiod_get_from_of_node(&pdev->dev,

>> +                                                       rdata[reg].of_node,

>> +                                                       "samsung,ext-control-gpios",

>> +                                                       0,

>> +                                                       GPIOD_OUT_HIGH,

>> +                                                       "s2mps11-LDO");

>

> The same as with max77686 - this can be also for bucks so how about

> the name of "s2mps11-regulator"?


With the name change:
Reviewed-by: Krzysztof Kozlowski <krzk@kernel.org>


Tested on Odroid XU3 (with s2mps11 although not using any GPIOs for
regulators, so at least default paths are not broken):
Tested-by: Krzysztof Kozlowski <krzk@kernel.org>


Best regards,
Krzysztof
diff mbox series

Patch

diff --git a/drivers/regulator/s2mps11.c b/drivers/regulator/s2mps11.c
index 7726b874e539..9a1dca26362e 100644
--- a/drivers/regulator/s2mps11.c
+++ b/drivers/regulator/s2mps11.c
@@ -18,7 +18,7 @@ 
 
 #include <linux/bug.h>
 #include <linux/err.h>
-#include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
 #include <linux/slab.h>
 #include <linux/module.h>
 #include <linux/of.h>
@@ -27,7 +27,6 @@ 
 #include <linux/regulator/driver.h>
 #include <linux/regulator/machine.h>
 #include <linux/regulator/of_regulator.h>
-#include <linux/of_gpio.h>
 #include <linux/mfd/samsung/core.h>
 #include <linux/mfd/samsung/s2mps11.h>
 #include <linux/mfd/samsung/s2mps13.h>
@@ -57,7 +56,7 @@  struct s2mps11_info {
 	 * Array (size: number of regulators) with GPIO-s for external
 	 * sleep control.
 	 */
-	int *ext_control_gpio;
+	struct gpio_desc **ext_control_gpiod;
 };
 
 static int get_ramp_delay(int ramp_delay)
@@ -524,7 +523,7 @@  static int s2mps14_regulator_enable(struct regulator_dev *rdev)
 	case S2MPS14X:
 		if (test_bit(rdev_get_id(rdev), s2mps11->suspend_state))
 			val = S2MPS14_ENABLE_SUSPEND;
-		else if (gpio_is_valid(s2mps11->ext_control_gpio[rdev_get_id(rdev)]))
+		else if (s2mps11->ext_control_gpiod[rdev_get_id(rdev)])
 			val = S2MPS14_ENABLE_EXT_CONTROL;
 		else
 			val = rdev->desc->enable_mask;
@@ -818,7 +817,7 @@  static int s2mps14_pmic_enable_ext_control(struct s2mps11_info *s2mps11,
 static void s2mps14_pmic_dt_parse_ext_control_gpio(struct platform_device *pdev,
 		struct of_regulator_match *rdata, struct s2mps11_info *s2mps11)
 {
-	int *gpio = s2mps11->ext_control_gpio;
+	struct gpio_desc **gpio = s2mps11->ext_control_gpiod;
 	unsigned int i;
 	unsigned int valid_regulators[3] = { S2MPS14_LDO10, S2MPS14_LDO11,
 		S2MPS14_LDO12 };
@@ -829,11 +828,20 @@  static void s2mps14_pmic_dt_parse_ext_control_gpio(struct platform_device *pdev,
 		if (!rdata[reg].init_data || !rdata[reg].of_node)
 			continue;
 
-		gpio[reg] = of_get_named_gpio(rdata[reg].of_node,
-				"samsung,ext-control-gpios", 0);
-		if (gpio_is_valid(gpio[reg]))
-			dev_dbg(&pdev->dev, "Using GPIO %d for ext-control over %d/%s\n",
-					gpio[reg], reg, rdata[reg].name);
+		gpio[reg] = devm_gpiod_get_from_of_node(&pdev->dev,
+							rdata[reg].of_node,
+							"samsung,ext-control-gpios",
+							0,
+							GPIOD_OUT_HIGH,
+							"s2mps11-LDO");
+		if (IS_ERR(gpio[reg])) {
+			dev_err(&pdev->dev, "Failed to get control GPIO for %d/%s\n",
+				reg, rdata[reg].name);
+			continue;
+		}
+		if (gpio[reg])
+			dev_dbg(&pdev->dev, "Using GPIO for ext-control over %d/%s\n",
+				reg, rdata[reg].name);
 	}
 }
 
@@ -1139,17 +1147,11 @@  static int s2mps11_pmic_probe(struct platform_device *pdev)
 		return -EINVAL;
 	}
 
-	s2mps11->ext_control_gpio = devm_kmalloc(&pdev->dev,
-			sizeof(*s2mps11->ext_control_gpio) * rdev_num,
+	s2mps11->ext_control_gpiod = devm_kmalloc(&pdev->dev,
+			sizeof(*s2mps11->ext_control_gpiod) * rdev_num,
 			GFP_KERNEL);
-	if (!s2mps11->ext_control_gpio)
+	if (!s2mps11->ext_control_gpiod)
 		return -ENOMEM;
-	/*
-	 * 0 is a valid GPIO so initialize all GPIO-s to negative value
-	 * to indicate that external control won't be used for this regulator.
-	 */
-	for (i = 0; i < rdev_num; i++)
-		s2mps11->ext_control_gpio[i] = -EINVAL;
 
 	if (!iodev->dev->of_node) {
 		if (iodev->pdata) {
@@ -1179,8 +1181,6 @@  static int s2mps11_pmic_probe(struct platform_device *pdev)
 	config.dev = &pdev->dev;
 	config.regmap = iodev->regmap_pmic;
 	config.driver_data = s2mps11;
-	config.ena_gpio_flags = GPIOF_OUT_INIT_HIGH;
-	config.ena_gpio_initialized = true;
 	for (i = 0; i < rdev_num; i++) {
 		struct regulator_dev *regulator;
 
@@ -1191,7 +1191,7 @@  static int s2mps11_pmic_probe(struct platform_device *pdev)
 			config.init_data = rdata[i].init_data;
 			config.of_node = rdata[i].of_node;
 		}
-		config.ena_gpio = s2mps11->ext_control_gpio[i];
+		config.ena_gpiod = s2mps11->ext_control_gpiod[i];
 
 		regulator = devm_regulator_register(&pdev->dev,
 						&regulators[i], &config);
@@ -1202,7 +1202,7 @@  static int s2mps11_pmic_probe(struct platform_device *pdev)
 			goto out;
 		}
 
-		if (gpio_is_valid(s2mps11->ext_control_gpio[i])) {
+		if (s2mps11->ext_control_gpiod[i]) {
 			ret = s2mps14_pmic_enable_ext_control(s2mps11,
 					regulator);
 			if (ret < 0) {