linux-next.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* linux-next: build failure after merge of the gpio tree
@ 2015-07-21  3:29 Stephen Rothwell
  2015-07-21  6:59 ` [PATCH] regulator: rk808: make better use of the gpiod API Uwe Kleine-König
  0 siblings, 1 reply; 12+ messages in thread
From: Stephen Rothwell @ 2015-07-21  3:29 UTC (permalink / raw)
  To: Linus Walleij, Mark Brown, Liam Girdwood
  Cc: linux-next, linux-kernel, Chris Zhong, Uwe Kleine-König

Hi Linus,

After merging the gpio tree, today's linux-next build (x86_64
allmodconfig) failed like this:

drivers/regulator/rk808-regulator.c: In function 'rk808_regulator_dt_parse_pdata':
drivers/regulator/rk808-regulator.c:543:24: error: too few arguments to function 'gpiod_get_index'
   pdata->dvs_gpio[i] = gpiod_get_index(client_dev, "dvs", i);
                        ^
In file included from include/asm-generic/gpio.h:13:0,
                 from include/linux/gpio.h:51,
                 from drivers/regulator/rk808-regulator.c:20:
include/linux/gpio/consumer.h:53:32: note: declared here
 struct gpio_desc *__must_check gpiod_get_index(struct device *dev,
                                ^

Caused by commit

  bad47ad2eef3 ("regulator: rk808: fixed the overshoot when adjust voltage")

from the regulator tree interactings with commit

  b17d1bf16cc7 ("gpio: make flags mandatory for gpiod_get functions")

from the gpio tree.

I added teh following merge fix patch:

From: Stephen Rothwell <sfr@canb.auug.org.au>
Date: Tue, 21 Jul 2015 13:23:56 +1000
Subject: [PATCH] regulator: rk808: fix up for gpiod_get_index() API change

Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>
---
 drivers/regulator/rk808-regulator.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/regulator/rk808-regulator.c b/drivers/regulator/rk808-regulator.c
index ca913fd15598..cfec52c1a4a2 100644
--- a/drivers/regulator/rk808-regulator.c
+++ b/drivers/regulator/rk808-regulator.c
@@ -540,7 +540,7 @@ static int rk808_regulator_dt_parse_pdata(struct device *dev,
 		goto dt_parse_end;
 
 	for (i = 0; i < ARRAY_SIZE(pdata->dvs_gpio); i++) {
-		pdata->dvs_gpio[i] = gpiod_get_index(client_dev, "dvs", i);
+		pdata->dvs_gpio[i] = gpiod_get_index(client_dev, "dvs", i, GPIOD_ASIS);
 		if (IS_ERR(pdata->dvs_gpio[i])) {
 			dev_warn(dev, "there is no dvs%d gpio\n", i);
 			continue;
-- 
2.1.4

-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH] regulator: rk808: make better use of the gpiod API
  2015-07-21  3:29 linux-next: build failure after merge of the gpio tree Stephen Rothwell
@ 2015-07-21  6:59 ` Uwe Kleine-König
  2015-07-21  9:56   ` Linus Walleij
  2015-07-21 13:09   ` [PATCH] " Krzysztof Kozlowski
  0 siblings, 2 replies; 12+ messages in thread
From: Uwe Kleine-König @ 2015-07-21  6:59 UTC (permalink / raw)
  To: Linus Walleij, Mark Brown, Liam Girdwood
  Cc: linux-next, linux-kernel, Chris Zhong, kernel

The gpiod functions include variants for managed gpiod resources. Use it
to simplify the remove function.

As the driver handles a device node without a specification of dvs gpios
just fine, additionally use the variant of gpiod_get exactly for this
use case. This makes error checking more strict.

As a third benefit this patch makes the driver use the flags parameter
of gpiod_get* which will not be optional any more after 4.2 and so
prevents a build failure when the respective gpiod commit is merged.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
---
Hello,

this is the more complete fix of the issue that Stephen found while creating
next-20150721 (see commit f51ec04cf8be9f7ef795f1f39ada17c19f725650).

Best regards
Uwe

 drivers/regulator/rk808-regulator.c | 25 +++++++++++--------------
 1 file changed, 11 insertions(+), 14 deletions(-)

diff --git a/drivers/regulator/rk808-regulator.c b/drivers/regulator/rk808-regulator.c
index ca913fd15598..3738e49beb75 100644
--- a/drivers/regulator/rk808-regulator.c
+++ b/drivers/regulator/rk808-regulator.c
@@ -94,7 +94,7 @@ static int rk808_buck1_2_get_voltage_sel_regmap(struct regulator_dev *rdev)
 	unsigned int val;
 	int ret;
 
-	if (IS_ERR(gpio) || gpiod_get_value(gpio) == 0)
+	if (!gpio || gpiod_get_value(gpio) == 0)
 		return regulator_get_voltage_sel_regmap(rdev);
 
 	ret = regmap_read(rdev->regmap,
@@ -168,7 +168,7 @@ static int rk808_buck1_2_set_voltage_sel(struct regulator_dev *rdev,
 	unsigned old_sel;
 	int ret, gpio_level;
 
-	if (IS_ERR(gpio))
+	if (!gpio)
 		return rk808_buck1_2_i2c_set_voltage_sel(rdev, sel);
 
 	gpio_level = gpiod_get_value(gpio);
@@ -205,7 +205,7 @@ static int rk808_buck1_2_set_voltage_time_sel(struct regulator_dev *rdev,
 	struct gpio_desc *gpio = pdata->dvs_gpio[id];
 
 	/* if there is no dvs1/2 pin, we don't need wait extra time here. */
-	if (IS_ERR(gpio))
+	if (!gpio)
 		return 0;
 
 	return regulator_set_voltage_time_sel(rdev, old_selector, new_selector);
@@ -540,14 +540,19 @@ static int rk808_regulator_dt_parse_pdata(struct device *dev,
 		goto dt_parse_end;
 
 	for (i = 0; i < ARRAY_SIZE(pdata->dvs_gpio); i++) {
-		pdata->dvs_gpio[i] = gpiod_get_index(client_dev, "dvs", i);
+		pdata->dvs_gpio[i] =
+			devm_gpiod_get_index_optional(client_dev, "dvs", i,
+						      GPIOD_OUT_LOW);
 		if (IS_ERR(pdata->dvs_gpio[i])) {
+			dev_err(dev, "failed to get dvs%d gpio\n", i);
+			return PTR_ERR(pdata->dvs_gpio[i]);
+		}
+
+		if (!pdata->dvs_gpio[i]) {
 			dev_warn(dev, "there is no dvs%d gpio\n", i);
 			continue;
 		}
 
-		gpiod_direction_output(pdata->dvs_gpio[i], 0);
-
 		tmp = i ? RK808_DVS2_POL : RK808_DVS1_POL;
 		ret = regmap_update_bits(map, RK808_IO_POL_REG, tmp,
 				gpiod_is_active_low(pdata->dvs_gpio[i]) ?
@@ -561,14 +566,6 @@ dt_parse_end:
 
 static int rk808_regulator_remove(struct platform_device *pdev)
 {
-	struct rk808_regulator_data *pdata = platform_get_drvdata(pdev);
-	int i;
-
-	for (i = 0; i < ARRAY_SIZE(pdata->dvs_gpio); i++) {
-		if (!IS_ERR(pdata->dvs_gpio[i]))
-			gpiod_put(pdata->dvs_gpio[i]);
-	}
-
 	return 0;
 }
 
-- 
2.1.4

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH] regulator: rk808: make better use of the gpiod API
  2015-07-21  6:59 ` [PATCH] regulator: rk808: make better use of the gpiod API Uwe Kleine-König
@ 2015-07-21  9:56   ` Linus Walleij
  2015-07-21 11:04     ` Mark Brown
  2015-07-21 13:09   ` [PATCH] " Krzysztof Kozlowski
  1 sibling, 1 reply; 12+ messages in thread
From: Linus Walleij @ 2015-07-21  9:56 UTC (permalink / raw)
  To: Uwe Kleine-König
  Cc: Mark Brown, Liam Girdwood, linux-next, linux-kernel, Chris Zhong,
	Sascha Hauer

On Tue, Jul 21, 2015 at 8:59 AM, Uwe Kleine-König
<u.kleine-koenig@pengutronix.de> wrote:

> The gpiod functions include variants for managed gpiod resources. Use it
> to simplify the remove function.
>
> As the driver handles a device node without a specification of dvs gpios
> just fine, additionally use the variant of gpiod_get exactly for this
> use case. This makes error checking more strict.
>
> As a third benefit this patch makes the driver use the flags parameter
> of gpiod_get* which will not be optional any more after 4.2 and so
> prevents a build failure when the respective gpiod commit is merged.
>
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
> ---
> Hello,
>
> this is the more complete fix of the issue that Stephen found while creating
> next-20150721 (see commit f51ec04cf8be9f7ef795f1f39ada17c19f725650).

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

Mark, please apply this.

Yours,
Linus Walleij

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] regulator: rk808: make better use of the gpiod API
  2015-07-21  9:56   ` Linus Walleij
@ 2015-07-21 11:04     ` Mark Brown
  2015-07-21 14:21       ` Uwe Kleine-König
  0 siblings, 1 reply; 12+ messages in thread
From: Mark Brown @ 2015-07-21 11:04 UTC (permalink / raw)
  To: Linus Walleij
  Cc: Uwe Kleine-König, Liam Girdwood, linux-next, linux-kernel,
	Chris Zhong, Sascha Hauer

[-- Attachment #1: Type: text/plain, Size: 966 bytes --]

On Tue, Jul 21, 2015 at 11:56:49AM +0200, Linus Walleij wrote:
> On Tue, Jul 21, 2015 at 8:59 AM, Uwe Kleine-König

> > The gpiod functions include variants for managed gpiod resources. Use it
> > to simplify the remove function.

> > As the driver handles a device node without a specification of dvs gpios
> > just fine, additionally use the variant of gpiod_get exactly for this
> > use case. This makes error checking more strict.

> > As a third benefit this patch makes the driver use the flags parameter
> > of gpiod_get* which will not be optional any more after 4.2 and so
> > prevents a build failure when the respective gpiod commit is merged.

> Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
> 
> Mark, please apply this.

...and reverted since it doesn't build as it's adding a use of a new API
which doesn't actually exist in Linus' tree yet (hopefully it's in
-next).  I need a tag to pull if I'm going to use this patch.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] regulator: rk808: make better use of the gpiod API
  2015-07-21  6:59 ` [PATCH] regulator: rk808: make better use of the gpiod API Uwe Kleine-König
  2015-07-21  9:56   ` Linus Walleij
@ 2015-07-21 13:09   ` Krzysztof Kozlowski
  2015-07-21 14:35     ` Uwe Kleine-König
  1 sibling, 1 reply; 12+ messages in thread
From: Krzysztof Kozlowski @ 2015-07-21 13:09 UTC (permalink / raw)
  To: Uwe Kleine-König
  Cc: Linus Walleij, Mark Brown, Liam Girdwood, linux-next,
	linux-kernel, Chris Zhong, kernel

2015-07-21 15:59 GMT+09:00 Uwe Kleine-König <u.kleine-koenig@pengutronix.de>:
> The gpiod functions include variants for managed gpiod resources. Use it
> to simplify the remove function.
>
> As the driver handles a device node without a specification of dvs gpios
> just fine, additionally use the variant of gpiod_get exactly for this
> use case. This makes error checking more strict.
>
> As a third benefit this patch makes the driver use the flags parameter
> of gpiod_get* which will not be optional any more after 4.2 and so
> prevents a build failure when the respective gpiod commit is merged.
>
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
> ---
> Hello,
>
> this is the more complete fix of the issue that Stephen found while creating
> next-20150721 (see commit f51ec04cf8be9f7ef795f1f39ada17c19f725650).
>
> Best regards
> Uwe
>
>  drivers/regulator/rk808-regulator.c | 25 +++++++++++--------------
>  1 file changed, 11 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/regulator/rk808-regulator.c b/drivers/regulator/rk808-regulator.c
> index ca913fd15598..3738e49beb75 100644
> --- a/drivers/regulator/rk808-regulator.c
> +++ b/drivers/regulator/rk808-regulator.c
> @@ -94,7 +94,7 @@ static int rk808_buck1_2_get_voltage_sel_regmap(struct regulator_dev *rdev)
>         unsigned int val;
>         int ret;
>
> -       if (IS_ERR(gpio) || gpiod_get_value(gpio) == 0)
> +       if (!gpio || gpiod_get_value(gpio) == 0)
>                 return regulator_get_voltage_sel_regmap(rdev);
>
>         ret = regmap_read(rdev->regmap,
> @@ -168,7 +168,7 @@ static int rk808_buck1_2_set_voltage_sel(struct regulator_dev *rdev,
>         unsigned old_sel;
>         int ret, gpio_level;
>
> -       if (IS_ERR(gpio))
> +       if (!gpio)
>                 return rk808_buck1_2_i2c_set_voltage_sel(rdev, sel);
>
>         gpio_level = gpiod_get_value(gpio);
> @@ -205,7 +205,7 @@ static int rk808_buck1_2_set_voltage_time_sel(struct regulator_dev *rdev,
>         struct gpio_desc *gpio = pdata->dvs_gpio[id];
>
>         /* if there is no dvs1/2 pin, we don't need wait extra time here. */
> -       if (IS_ERR(gpio))
> +       if (!gpio)
>                 return 0;
>
>         return regulator_set_voltage_time_sel(rdev, old_selector, new_selector);
> @@ -540,14 +540,19 @@ static int rk808_regulator_dt_parse_pdata(struct device *dev,
>                 goto dt_parse_end;
>
>         for (i = 0; i < ARRAY_SIZE(pdata->dvs_gpio); i++) {
> -               pdata->dvs_gpio[i] = gpiod_get_index(client_dev, "dvs", i);
> +               pdata->dvs_gpio[i] =
> +                       devm_gpiod_get_index_optional(client_dev, "dvs", i,
> +                                                     GPIOD_OUT_LOW);
>                 if (IS_ERR(pdata->dvs_gpio[i])) {
> +                       dev_err(dev, "failed to get dvs%d gpio\n", i);

Missing of_node_put() from of_get_child_by_name() called before.

> +                       return PTR_ERR(pdata->dvs_gpio[i]);
> +               }
> +
> +               if (!pdata->dvs_gpio[i]) {
>                         dev_warn(dev, "there is no dvs%d gpio\n", i);
>                         continue;
>                 }
>
> -               gpiod_direction_output(pdata->dvs_gpio[i], 0);
> -
>                 tmp = i ? RK808_DVS2_POL : RK808_DVS1_POL;
>                 ret = regmap_update_bits(map, RK808_IO_POL_REG, tmp,
>                                 gpiod_is_active_low(pdata->dvs_gpio[i]) ?
> @@ -561,14 +566,6 @@ dt_parse_end:
>
>  static int rk808_regulator_remove(struct platform_device *pdev)
>  {
> -       struct rk808_regulator_data *pdata = platform_get_drvdata(pdev);
> -       int i;
> -
> -       for (i = 0; i < ARRAY_SIZE(pdata->dvs_gpio); i++) {
> -               if (!IS_ERR(pdata->dvs_gpio[i]))
> -                       gpiod_put(pdata->dvs_gpio[i]);
> -       }
> -
>         return 0;
>  }

The function looks empty so it can be removed entirely.

Best regards,
Krzysztof

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] regulator: rk808: make better use of the gpiod API
  2015-07-21 11:04     ` Mark Brown
@ 2015-07-21 14:21       ` Uwe Kleine-König
       [not found]         ` <1437489985-1362-1-git-send-email-uwe@kleine-koenig.org>
  0 siblings, 1 reply; 12+ messages in thread
From: Uwe Kleine-König @ 2015-07-21 14:21 UTC (permalink / raw)
  To: Mark Brown
  Cc: Linus Walleij, Liam Girdwood, linux-next, linux-kernel,
	Chris Zhong, kernel, Krzysztof Kozlowski

On Tue, Jul 21, 2015 at 12:04:15PM +0100, Mark Brown wrote:
> On Tue, Jul 21, 2015 at 11:56:49AM +0200, Linus Walleij wrote:
> > On Tue, Jul 21, 2015 at 8:59 AM, Uwe Kleine-König
> 
> > > The gpiod functions include variants for managed gpiod resources. Use it
> > > to simplify the remove function.
> 
> > > As the driver handles a device node without a specification of dvs gpios
> > > just fine, additionally use the variant of gpiod_get exactly for this
> > > use case. This makes error checking more strict.
> 
> > > As a third benefit this patch makes the driver use the flags parameter
> > > of gpiod_get* which will not be optional any more after 4.2 and so
> > > prevents a build failure when the respective gpiod commit is merged.
> 
> > Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
> > 
> > Mark, please apply this.
> 
> ...and reverted since it doesn't build as it's adding a use of a new API
> which doesn't actually exist in Linus' tree yet (hopefully it's in
> -next).  I need a tag to pull if I'm going to use this patch.
If you're refering to the build bot warning I got, too, then the problem
is just a missing #include and the problem existed already before e.g.
for gpiod_get_value with the .config used by the build bot.

In reply to this mail I'll send a fixup patch for the missing include
and a reworked version of my patch that fixes the reference leak pointed
out by Krzysztof Kozlowski.

Best regards
Uwe

-- 
Pengutronix e.K.                           | Uwe Kleine-König            |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] regulator: rk808: make better use of the gpiod API
  2015-07-21 13:09   ` [PATCH] " Krzysztof Kozlowski
@ 2015-07-21 14:35     ` Uwe Kleine-König
  2015-07-21 14:41       ` Mark Brown
  0 siblings, 1 reply; 12+ messages in thread
From: Uwe Kleine-König @ 2015-07-21 14:35 UTC (permalink / raw)
  To: Krzysztof Kozlowski, Greg Kroah-Hartman
  Cc: Linus Walleij, Mark Brown, Liam Girdwood, linux-next,
	linux-kernel, Chris Zhong, kernel

Hello,

On Tue, Jul 21, 2015 at 10:09:32PM +0900, Krzysztof Kozlowski wrote:
> 2015-07-21 15:59 GMT+09:00 Uwe Kleine-König <u.kleine-koenig@pengutronix.de>:
> > @@ -540,14 +540,19 @@ static int rk808_regulator_dt_parse_pdata(struct device *dev,
> >                 goto dt_parse_end;
> >
> >         for (i = 0; i < ARRAY_SIZE(pdata->dvs_gpio); i++) {
> > -               pdata->dvs_gpio[i] = gpiod_get_index(client_dev, "dvs", i);
> > +               pdata->dvs_gpio[i] =
> > +                       devm_gpiod_get_index_optional(client_dev, "dvs", i,
> > +                                                     GPIOD_OUT_LOW);
> >                 if (IS_ERR(pdata->dvs_gpio[i])) {
> > +                       dev_err(dev, "failed to get dvs%d gpio\n", i);
> 
> Missing of_node_put() from of_get_child_by_name() called before.
Good catch, thanks.

> > @@ -561,14 +566,6 @@ dt_parse_end:
> >
> >  static int rk808_regulator_remove(struct platform_device *pdev)
> >  {
> > -       struct rk808_regulator_data *pdata = platform_get_drvdata(pdev);
> > -       int i;
> > -
> > -       for (i = 0; i < ARRAY_SIZE(pdata->dvs_gpio); i++) {
> > -               if (!IS_ERR(pdata->dvs_gpio[i]))
> > -                       gpiod_put(pdata->dvs_gpio[i]);
> > -       }
> > -
> >         return 0;
> >  }
> 
> The function looks empty so it can be removed entirely.
I assumed that not having a remove function makes the device not
detachable. Not sure about that.
Looking at the code I found that not having a remove function can yield
surprises, though. If your driver has a probe but no remove function the
platform bus glue calls

	dev_pm_domain_attach(_dev, true);

at probe time, but not

	dev_pm_domain_detach(_dev, true);

at remove. I admit I don't know about that dev_pm_domain stuff, but it
looks wrong to only have one but not the other. Greg?

Best regards
Uwe

-- 
Pengutronix e.K.                           | Uwe Kleine-König            |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] regulator: rk808: make better use of the gpiod API
  2015-07-21 14:35     ` Uwe Kleine-König
@ 2015-07-21 14:41       ` Mark Brown
  2015-07-22  0:13         ` Krzysztof Kozlowski
  0 siblings, 1 reply; 12+ messages in thread
From: Mark Brown @ 2015-07-21 14:41 UTC (permalink / raw)
  To: Uwe Kleine-König
  Cc: Krzysztof Kozlowski, Greg Kroah-Hartman, Linus Walleij,
	Liam Girdwood, linux-next, linux-kernel, Chris Zhong, kernel

[-- Attachment #1: Type: text/plain, Size: 827 bytes --]

On Tue, Jul 21, 2015 at 04:35:24PM +0200, Uwe Kleine-König wrote:
> On Tue, Jul 21, 2015 at 10:09:32PM +0900, Krzysztof Kozlowski wrote:

> > The function looks empty so it can be removed entirely.

> I assumed that not having a remove function makes the device not
> detachable. Not sure about that.

No, of course not - the remove function is completely optional.

> Looking at the code I found that not having a remove function can yield
> surprises, though. If your driver has a probe but no remove function the
> platform bus glue calls

> 	dev_pm_domain_attach(_dev, true);

> at probe time, but not

> 	dev_pm_domain_detach(_dev, true);

> at remove. I admit I don't know about that dev_pm_domain stuff, but it
> looks wrong to only have one but not the other. Greg?

That looks like a bug, yes.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v2 2/2] regulator: rk808: make better use of the gpiod API
       [not found]         ` <1437489985-1362-1-git-send-email-uwe@kleine-koenig.org>
@ 2015-07-21 14:46           ` Uwe Kleine-König
  2015-07-22  2:21             ` Krzysztof Kozlowski
  0 siblings, 1 reply; 12+ messages in thread
From: Uwe Kleine-König @ 2015-07-21 14:46 UTC (permalink / raw)
  To: Linus Walleij, Mark Brown, Liam Girdwood
  Cc: Uwe Kleine-König, Chris Zhong, linux-next, linux-kernel, kernel

From: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>

The gpiod functions include variants for managed gpiod resources. Use it
to simplify the remove function.

As the driver handles a device node without a specification of dvs gpios
just fine, additionally use the variant of gpiod_get exactly for this
use case. This makes error checking more strict.

As a third benefit this patch makes the driver use the flags parameter
of gpiod_get* which will not be optional any more after 4.2 and so
prevents a build failure when the respective gpiod commit is merged.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
---
note the above mentioned gpiod change is already in next, so the driver
fails to build there.

Changes since (implicit) v1, sent with
Message-Id: 1437461993-14860-1-git-send-email-u.kleine-koenig@pengutronix.de:

 - Assert that of_node_put is called in error path to not leak a reference
   and drop now empty remove callback.
   Thanks to Krzysztof Kozlowski for catching.


Best regards
Uwe
 drivers/regulator/rk808-regulator.c | 32 ++++++++++++--------------------
 1 file changed, 12 insertions(+), 20 deletions(-)

diff --git a/drivers/regulator/rk808-regulator.c b/drivers/regulator/rk808-regulator.c
index ac9436d2ea8d..d86a3dcd61e2 100644
--- a/drivers/regulator/rk808-regulator.c
+++ b/drivers/regulator/rk808-regulator.c
@@ -95,7 +95,7 @@ static int rk808_buck1_2_get_voltage_sel_regmap(struct regulator_dev *rdev)
 	unsigned int val;
 	int ret;
 
-	if (IS_ERR(gpio) || gpiod_get_value(gpio) == 0)
+	if (!gpio || gpiod_get_value(gpio) == 0)
 		return regulator_get_voltage_sel_regmap(rdev);
 
 	ret = regmap_read(rdev->regmap,
@@ -169,7 +169,7 @@ static int rk808_buck1_2_set_voltage_sel(struct regulator_dev *rdev,
 	unsigned old_sel;
 	int ret, gpio_level;
 
-	if (IS_ERR(gpio))
+	if (!gpio)
 		return rk808_buck1_2_i2c_set_voltage_sel(rdev, sel);
 
 	gpio_level = gpiod_get_value(gpio);
@@ -206,7 +206,7 @@ static int rk808_buck1_2_set_voltage_time_sel(struct regulator_dev *rdev,
 	struct gpio_desc *gpio = pdata->dvs_gpio[id];
 
 	/* if there is no dvs1/2 pin, we don't need wait extra time here. */
-	if (IS_ERR(gpio))
+	if (!gpio)
 		return 0;
 
 	return regulator_set_voltage_time_sel(rdev, old_selector, new_selector);
@@ -541,14 +541,20 @@ static int rk808_regulator_dt_parse_pdata(struct device *dev,
 		goto dt_parse_end;
 
 	for (i = 0; i < ARRAY_SIZE(pdata->dvs_gpio); i++) {
-		pdata->dvs_gpio[i] = gpiod_get_index(client_dev, "dvs", i);
+		pdata->dvs_gpio[i] =
+			devm_gpiod_get_index_optional(client_dev, "dvs", i,
+						      GPIOD_OUT_LOW);
 		if (IS_ERR(pdata->dvs_gpio[i])) {
+			ret = PTR_ERR(pdata->dvs_gpio[i]);
+			dev_err(dev, "failed to get dvs%d gpio (%d)\n", i, ret);
+			goto dt_parse_end;
+		}
+
+		if (!pdata->dvs_gpio[i]) {
 			dev_warn(dev, "there is no dvs%d gpio\n", i);
 			continue;
 		}
 
-		gpiod_direction_output(pdata->dvs_gpio[i], 0);
-
 		tmp = i ? RK808_DVS2_POL : RK808_DVS1_POL;
 		ret = regmap_update_bits(map, RK808_IO_POL_REG, tmp,
 				gpiod_is_active_low(pdata->dvs_gpio[i]) ?
@@ -560,19 +566,6 @@ dt_parse_end:
 	return ret;
 }
 
-static int rk808_regulator_remove(struct platform_device *pdev)
-{
-	struct rk808_regulator_data *pdata = platform_get_drvdata(pdev);
-	int i;
-
-	for (i = 0; i < ARRAY_SIZE(pdata->dvs_gpio); i++) {
-		if (!IS_ERR(pdata->dvs_gpio[i]))
-			gpiod_put(pdata->dvs_gpio[i]);
-	}
-
-	return 0;
-}
-
 static int rk808_regulator_probe(struct platform_device *pdev)
 {
 	struct rk808 *rk808 = dev_get_drvdata(pdev->dev.parent);
@@ -619,7 +612,6 @@ static int rk808_regulator_probe(struct platform_device *pdev)
 
 static struct platform_driver rk808_regulator_driver = {
 	.probe = rk808_regulator_probe,
-	.remove = rk808_regulator_remove,
 	.driver = {
 		.name = "rk808-regulator",
 		.owner = THIS_MODULE,
-- 
2.1.4

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH] regulator: rk808: make better use of the gpiod API
  2015-07-21 14:41       ` Mark Brown
@ 2015-07-22  0:13         ` Krzysztof Kozlowski
  2015-07-22  7:13           ` Uwe Kleine-König
  0 siblings, 1 reply; 12+ messages in thread
From: Krzysztof Kozlowski @ 2015-07-22  0:13 UTC (permalink / raw)
  To: Mark Brown, Uwe Kleine-König
  Cc: Greg Kroah-Hartman, Linus Walleij, Liam Girdwood, linux-next,
	linux-kernel, Chris Zhong, kernel, linux-pm, Rafael J. Wysocki,
	Ulf Hansson, Kevin Hilman

On 21.07.2015 23:41, Mark Brown wrote:
> On Tue, Jul 21, 2015 at 04:35:24PM +0200, Uwe Kleine-König wrote:
>> On Tue, Jul 21, 2015 at 10:09:32PM +0900, Krzysztof Kozlowski wrote:
> 
>>> The function looks empty so it can be removed entirely.
> 
>> I assumed that not having a remove function makes the device not
>> detachable. Not sure about that.
> 
> No, of course not - the remove function is completely optional.
> 
>> Looking at the code I found that not having a remove function can yield
>> surprises, though. If your driver has a probe but no remove function the
>> platform bus glue calls
> 
>> 	dev_pm_domain_attach(_dev, true);
> 
>> at probe time, but not
> 
>> 	dev_pm_domain_detach(_dev, true);
> 
>> at remove. I admit I don't know about that dev_pm_domain stuff, but it
>> looks wrong to only have one but not the other. Greg?
> 
> That looks like a bug, yes.

Cc: linux-pm, Kevin, Rafael, Ulf

I agree, device should be detached from domain regardless of presence of
remove callback.

Documentation (like Documentation/driver-model/driver.txt) does not
mention that remove callback is necessary for unbinding devices. There
is no sense in storing empty removal callbacks.

Best regards,
Krzysztof

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v2 2/2] regulator: rk808: make better use of the gpiod API
  2015-07-21 14:46           ` [PATCH v2 2/2] " Uwe Kleine-König
@ 2015-07-22  2:21             ` Krzysztof Kozlowski
  0 siblings, 0 replies; 12+ messages in thread
From: Krzysztof Kozlowski @ 2015-07-22  2:21 UTC (permalink / raw)
  To: Uwe Kleine-König
  Cc: Linus Walleij, Mark Brown, Liam Girdwood, Uwe Kleine-König,
	Chris Zhong, linux-next, linux-kernel, kernel

2015-07-21 23:46 GMT+09:00 Uwe Kleine-König <uwe@kleine-koenig.org>:
> From: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
>
> The gpiod functions include variants for managed gpiod resources. Use it
> to simplify the remove function.
>
> As the driver handles a device node without a specification of dvs gpios
> just fine, additionally use the variant of gpiod_get exactly for this
> use case. This makes error checking more strict.
>
> As a third benefit this patch makes the driver use the flags parameter
> of gpiod_get* which will not be optional any more after 4.2 and so
> prevents a build failure when the respective gpiod commit is merged.
>
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
> ---
> note the above mentioned gpiod change is already in next, so the driver
> fails to build there.
>
> Changes since (implicit) v1, sent with
> Message-Id: 1437461993-14860-1-git-send-email-u.kleine-koenig@pengutronix.de:
>
>  - Assert that of_node_put is called in error path to not leak a reference
>    and drop now empty remove callback.
>    Thanks to Krzysztof Kozlowski for catching.
>
>
> Best regards
> Uwe
>  drivers/regulator/rk808-regulator.c | 32 ++++++++++++--------------------
>  1 file changed, 12 insertions(+), 20 deletions(-)

Looks good now:
Reviewed-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>

Best regards,
Krzysztof

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] regulator: rk808: make better use of the gpiod API
  2015-07-22  0:13         ` Krzysztof Kozlowski
@ 2015-07-22  7:13           ` Uwe Kleine-König
  0 siblings, 0 replies; 12+ messages in thread
From: Uwe Kleine-König @ 2015-07-22  7:13 UTC (permalink / raw)
  To: Krzysztof Kozlowski
  Cc: Mark Brown, Greg Kroah-Hartman, Linus Walleij, Liam Girdwood,
	linux-next, linux-kernel, Chris Zhong, kernel, linux-pm,
	Rafael J. Wysocki, Ulf Hansson, Kevin Hilman

Hello,

On Wed, Jul 22, 2015 at 09:13:51AM +0900, Krzysztof Kozlowski wrote:
> On 21.07.2015 23:41, Mark Brown wrote:
> > That looks like a bug, yes.
> 
> Cc: linux-pm, Kevin, Rafael, Ulf
Good idea. Note I already sent a patch to Greg that you might want to
look at, too:
	http://article.gmane.org/gmane.linux.kernel/2001345

Best regards
Uwe

-- 
Pengutronix e.K.                           | Uwe Kleine-König            |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2015-07-22  7:13 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-07-21  3:29 linux-next: build failure after merge of the gpio tree Stephen Rothwell
2015-07-21  6:59 ` [PATCH] regulator: rk808: make better use of the gpiod API Uwe Kleine-König
2015-07-21  9:56   ` Linus Walleij
2015-07-21 11:04     ` Mark Brown
2015-07-21 14:21       ` Uwe Kleine-König
     [not found]         ` <1437489985-1362-1-git-send-email-uwe@kleine-koenig.org>
2015-07-21 14:46           ` [PATCH v2 2/2] " Uwe Kleine-König
2015-07-22  2:21             ` Krzysztof Kozlowski
2015-07-21 13:09   ` [PATCH] " Krzysztof Kozlowski
2015-07-21 14:35     ` Uwe Kleine-König
2015-07-21 14:41       ` Mark Brown
2015-07-22  0:13         ` Krzysztof Kozlowski
2015-07-22  7:13           ` Uwe Kleine-König

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).