linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] mmc: mvsdio: Replace IS_ERR_NULL() is with IS_ERR()
@ 2013-01-10 20:29 Andrew Lunn
  2013-01-10 20:49 ` Jason Cooper
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Andrew Lunn @ 2013-01-10 20:29 UTC (permalink / raw)
  To: linux-arm-kernel

A NULL is a valid clk cookie, so we should not be tested with
IS_ERR_NULL(). Replace it with IS_ERR().

Signed-off-by: Andrew Lunn <andrew@lunn.ch>
---
 drivers/mmc/host/mvsdio.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/mmc/host/mvsdio.c b/drivers/mmc/host/mvsdio.c
index de4c20b..d0050fa 100644
--- a/drivers/mmc/host/mvsdio.c
+++ b/drivers/mmc/host/mvsdio.c
@@ -839,7 +839,7 @@ out:
 	if (r)
 		release_resource(r);
 	if (mmc)
-		if (!IS_ERR_OR_NULL(host->clk)) {
+		if (!IS_ERR(host->clk)) {
 			clk_disable_unprepare(host->clk);
 			clk_put(host->clk);
 		}
-- 
1.7.10.4

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

* [PATCH] mmc: mvsdio: Replace IS_ERR_NULL() is with IS_ERR()
  2013-01-10 20:29 [PATCH] mmc: mvsdio: Replace IS_ERR_NULL() is with IS_ERR() Andrew Lunn
@ 2013-01-10 20:49 ` Jason Cooper
  2013-01-11  0:43 ` Simon Baatz
  2013-01-11 11:02 ` [PATCH] mmc: mvsdio: Replace IS_ERR_NULL() is " Russell King - ARM Linux
  2 siblings, 0 replies; 9+ messages in thread
From: Jason Cooper @ 2013-01-10 20:49 UTC (permalink / raw)
  To: linux-arm-kernel

On Thu, Jan 10, 2013 at 09:29:15PM +0100, Andrew Lunn wrote:
> A NULL is a valid clk cookie, so we should not be tested with
> IS_ERR_NULL(). Replace it with IS_ERR().
> 
> Signed-off-by: Andrew Lunn <andrew@lunn.ch>
> ---
>  drivers/mmc/host/mvsdio.c |    2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)

The subject and commit entry should be IS_ERR_OR_NULL, but other than
that:

Acked-by: Jason Cooper <jason@lakedaemon.net>

thx,

Jason.

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

* [PATCH] mmc: mvsdio: Replace IS_ERR_NULL() is with IS_ERR()
  2013-01-10 20:29 [PATCH] mmc: mvsdio: Replace IS_ERR_NULL() is with IS_ERR() Andrew Lunn
  2013-01-10 20:49 ` Jason Cooper
@ 2013-01-11  0:43 ` Simon Baatz
  2013-01-11  7:27   ` [PATCH v2] mmc: mvsdio: Replace IS_ERR_OR_NULL() " Andrew Lunn
  2013-01-11 11:02 ` [PATCH] mmc: mvsdio: Replace IS_ERR_NULL() is " Russell King - ARM Linux
  2 siblings, 1 reply; 9+ messages in thread
From: Simon Baatz @ 2013-01-11  0:43 UTC (permalink / raw)
  To: linux-arm-kernel

Hi Andrew,

On Thu, Jan 10, 2013 at 09:29:15PM +0100, Andrew Lunn wrote:
> A NULL is a valid clk cookie, so we should not be tested with
> IS_ERR_NULL(). Replace it with IS_ERR().
> 
> Signed-off-by: Andrew Lunn <andrew@lunn.ch>
> ---
>  drivers/mmc/host/mvsdio.c |    2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/mmc/host/mvsdio.c b/drivers/mmc/host/mvsdio.c
> index de4c20b..d0050fa 100644
> --- a/drivers/mmc/host/mvsdio.c
> +++ b/drivers/mmc/host/mvsdio.c
> @@ -839,7 +839,7 @@ out:
>  	if (r)
>  		release_resource(r);
>  	if (mmc)
> -		if (!IS_ERR_OR_NULL(host->clk)) {
> +		if (!IS_ERR(host->clk)) {
>  			clk_disable_unprepare(host->clk);
>  			clk_put(host->clk);
>  		}

Hmm. I think this check was originally intended to go under "if
(host)" above and not here.  Notice the indentation mismatch/missing
braces for "if (mmc)". My bad.

Additionally, host->clk == NULL is not necessarily the result of
clk_get() but it can also be NULL if the irq could not be assigned. 
Leading to unbalanced clk calls in this case.


- Simon

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

* [PATCH v2] mmc: mvsdio: Replace IS_ERR_OR_NULL() with IS_ERR()
  2013-01-11  0:43 ` Simon Baatz
@ 2013-01-11  7:27   ` Andrew Lunn
  2013-01-13 20:43     ` Jason Cooper
  0 siblings, 1 reply; 9+ messages in thread
From: Andrew Lunn @ 2013-01-11  7:27 UTC (permalink / raw)
  To: linux-arm-kernel

A NULL is a valid clk cookie, so we should not be tested with
IS_ERR_OR_NULL(). Replace it with IS_ERR().

Signed-off-by: Andrew Lunn <andrew@lunn.ch>
---

This patch depends on Thomas Petazzoni DT patches for mvsdio, which changed
the order of resource allocation etc.

Simon

You are correct about the indentation. As suggested, i moved the
disable_unprepare() inside if (host).

It should no longer be possible to have imbalanced clk operations:

If mmc_alloc_host() fails, it goes to out. host is NULL, no clk calls.
All other goto out occur after the clk_get() and when host is !NULL. clk
calls are then made when !IS_ERR(host->clk), keeping this balanced.

 drivers/mmc/host/mvsdio.c |    8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/mmc/host/mvsdio.c b/drivers/mmc/host/mvsdio.c
index feb16bd..196f085 100644
--- a/drivers/mmc/host/mvsdio.c
+++ b/drivers/mmc/host/mvsdio.c
@@ -818,14 +818,14 @@ out:
 		mmc_gpio_free_ro(mmc);
 		if (host->base)
 			iounmap(host->base);
+		if (!IS_ERR(host->clk)) {
+			clk_disable_unprepare(host->clk);
+			clk_put(host->clk);
+		}
 	}
 	if (r)
 		release_resource(r);
 	if (mmc)
-		if (!IS_ERR_OR_NULL(host->clk)) {
-			clk_disable_unprepare(host->clk);
-			clk_put(host->clk);
-		}
 		mmc_free_host(mmc);
 
 	return ret;
-- 
1.7.10.4

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

* [PATCH] mmc: mvsdio: Replace IS_ERR_NULL() is with IS_ERR()
  2013-01-10 20:29 [PATCH] mmc: mvsdio: Replace IS_ERR_NULL() is with IS_ERR() Andrew Lunn
  2013-01-10 20:49 ` Jason Cooper
  2013-01-11  0:43 ` Simon Baatz
@ 2013-01-11 11:02 ` Russell King - ARM Linux
  2013-01-11 11:09   ` Thomas Petazzoni
  2 siblings, 1 reply; 9+ messages in thread
From: Russell King - ARM Linux @ 2013-01-11 11:02 UTC (permalink / raw)
  To: linux-arm-kernel

On Thu, Jan 10, 2013 at 09:29:15PM +0100, Andrew Lunn wrote:
> A NULL is a valid clk cookie, so we should not be tested with
> IS_ERR_NULL(). Replace it with IS_ERR().
> 
> Signed-off-by: Andrew Lunn <andrew@lunn.ch>
> ---
>  drivers/mmc/host/mvsdio.c |    2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/mmc/host/mvsdio.c b/drivers/mmc/host/mvsdio.c
> index de4c20b..d0050fa 100644
> --- a/drivers/mmc/host/mvsdio.c
> +++ b/drivers/mmc/host/mvsdio.c
> @@ -839,7 +839,7 @@ out:
>  	if (r)
>  		release_resource(r);
>  	if (mmc)
> -		if (!IS_ERR_OR_NULL(host->clk)) {
> +		if (!IS_ERR(host->clk)) {
>  			clk_disable_unprepare(host->clk);
>  			clk_put(host->clk);
>  		}

Actually, no.

1. I've already recently pointed out that C is not python, and this code
   is broken.  (Look at the lack of missing braces around the code you've
   modified.)
2. host->clk _can_ be NULL here.

Here's the (untested) bare minimum needed to fix this driver:

 drivers/mmc/host/mvsdio.c |   10 ++++++----
 1 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/drivers/mmc/host/mvsdio.c b/drivers/mmc/host/mvsdio.c
index de4c20b..4190fb4 100644
--- a/drivers/mmc/host/mvsdio.c
+++ b/drivers/mmc/host/mvsdio.c
@@ -733,6 +733,7 @@ static int __init mvsd_probe(struct platform_device *pdev)
 	host->dev = &pdev->dev;
 	host->res = r;
 	host->base_clock = mvsd_data->clock / 2;
+	host->clk = ERR_PTR(-EINVAL);
 
 	mmc->ops = &mvsd_ops;
 
@@ -837,13 +838,14 @@ static int __init mvsd_probe(struct platform_device *pdev)
 			iounmap(host->base);
 	}
 	if (r)
-		release_resource(r);
-	if (mmc)
-		if (!IS_ERR_OR_NULL(host->clk)) {
+		release_mem_resource(r->start, resource_size(r));
+	if (mmc) {
+		if (!IS_ERR(host->clk)) {
 			clk_disable_unprepare(host->clk);
 			clk_put(host->clk);
 		}
 		mmc_free_host(mmc);
+	}
 
 	return ret;
 }
@@ -866,7 +868,7 @@ static int __exit mvsd_remove(struct platform_device *pdev)
 		del_timer_sync(&host->timer);
 		mvsd_power_down(host);
 		iounmap(host->base);
-		release_resource(host->res);
+		release_mem_resource(host->res->start, resource_size(host->res);
 
 		if (!IS_ERR(host->clk)) {
 			clk_disable_unprepare(host->clk);


But... we can do better than that.  We have the devm_* APIs which will
make this code simpler, and less prone to these kinds of silly errors.
I've left the request_irq()s alone because it isn't obvious to me that
there isn't a reason for releasing the IRQ at a particular point in the
cleanup, and there's no sign that IRQs may be asked on the device itself.

Note also that I found another bug in this driver - it requests a region
1K in size, but ioremaps 4K.  That's just wrong.  But anyway, the whole
issue goes away with devm_request_and_ioremap().

What remains?  The assumption that GPIO0 means "no GPIO" rather than
testing with gpio_valid() and the IRQ stuff.

 drivers/mmc/host/mvsdio.c |   61 +++++++++++++++-----------------------------
 1 files changed, 21 insertions(+), 40 deletions(-)

diff --git a/drivers/mmc/host/mvsdio.c b/drivers/mmc/host/mvsdio.c
index de4c20b..4723310 100644
--- a/drivers/mmc/host/mvsdio.c
+++ b/drivers/mmc/host/mvsdio.c
@@ -50,7 +50,6 @@ struct mvsd_host {
 	struct timer_list timer;
 	struct mmc_host *mmc;
 	struct device *dev;
-	struct resource *res;
 	int irq;
 	struct clk *clk;
 	int gpio_card_detect;
@@ -718,10 +717,6 @@ static int __init mvsd_probe(struct platform_device *pdev)
 	if (!r || irq < 0 || !mvsd_data)
 		return -ENXIO;
 
-	r = request_mem_region(r->start, SZ_1K, DRIVER_NAME);
-	if (!r)
-		return -EBUSY;
-
 	mmc = mmc_alloc_host(sizeof(struct mvsd_host), &pdev->dev);
 	if (!mmc) {
 		ret = -ENOMEM;
@@ -731,8 +726,8 @@ static int __init mvsd_probe(struct platform_device *pdev)
 	host = mmc_priv(mmc);
 	host->mmc = mmc;
 	host->dev = &pdev->dev;
-	host->res = r;
 	host->base_clock = mvsd_data->clock / 2;
+	host->clk = ERR_PTR(-EINVAL);
 
 	mmc->ops = &mvsd_ops;
 
@@ -752,7 +747,7 @@ static int __init mvsd_probe(struct platform_device *pdev)
 
 	spin_lock_init(&host->lock);
 
-	host->base = ioremap(r->start, SZ_4K);
+	host->base = devm_request_and_ioremap(&pdev->dev, r);
 	if (!host->base) {
 		ret = -ENOMEM;
 		goto out;
@@ -774,16 +769,15 @@ static int __init mvsd_probe(struct platform_device *pdev)
 
 	/* Not all platforms can gate the clock, so it is not
 	   an error if the clock does not exists. */
-	host->clk = clk_get(&pdev->dev, NULL);
-	if (!IS_ERR(host->clk)) {
+	host->clk = devm_clk_get(&pdev->dev, NULL);
+	if (!IS_ERR(host->clk))
 		clk_prepare_enable(host->clk);
-	}
 
 	if (mvsd_data->gpio_card_detect) {
-		ret = gpio_request(mvsd_data->gpio_card_detect,
-				   DRIVER_NAME " cd");
+		ret = devm_gpio_request_one(&pdev->dev,
+					    mvsd_data->gpio_card_detect,
+					    GPIOF_IN, DRIVER_NAME " cd");
 		if (ret == 0) {
-			gpio_direction_input(mvsd_data->gpio_card_detect);
 			irq = gpio_to_irq(mvsd_data->gpio_card_detect);
 			ret = request_irq(irq, mvsd_card_detect_irq,
 					  IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING,
@@ -792,17 +786,18 @@ static int __init mvsd_probe(struct platform_device *pdev)
 				host->gpio_card_detect =
 					mvsd_data->gpio_card_detect;
 			else
-				gpio_free(mvsd_data->gpio_card_detect);
+				devm_gpio_free(&pdev->dev,
+					       mvsd_data->gpio_card_detect);
 		}
 	}
 	if (!host->gpio_card_detect)
 		mmc->caps |= MMC_CAP_NEEDS_POLL;
 
 	if (mvsd_data->gpio_write_protect) {
-		ret = gpio_request(mvsd_data->gpio_write_protect,
-				   DRIVER_NAME " wp");
+		ret = devm_gpio_request_one(&pdev->dev,
+					    mvsd_data->gpio_write_protect,
+				            GPIOF_IN, DRIVER_NAME " wp");
 		if (ret == 0) {
-			gpio_direction_input(mvsd_data->gpio_write_protect);
 			host->gpio_write_protect =
 				mvsd_data->gpio_write_protect;
 		}
@@ -827,23 +822,15 @@ static int __init mvsd_probe(struct platform_device *pdev)
 	if (host) {
 		if (host->irq)
 			free_irq(host->irq, host);
-		if (host->gpio_card_detect) {
+		if (host->gpio_card_detect)
 			free_irq(gpio_to_irq(host->gpio_card_detect), host);
-			gpio_free(host->gpio_card_detect);
-		}
-		if (host->gpio_write_protect)
-			gpio_free(host->gpio_write_protect);
-		if (host->base)
-			iounmap(host->base);
 	}
-	if (r)
-		release_resource(r);
-	if (mmc)
-		if (!IS_ERR_OR_NULL(host->clk)) {
+	if (mmc) {
+		if (!IS_ERR(host->clk))
 			clk_disable_unprepare(host->clk);
-			clk_put(host->clk);
-		}
+
 		mmc_free_host(mmc);
+	}
 
 	return ret;
 }
@@ -855,23 +842,17 @@ static int __exit mvsd_remove(struct platform_device *pdev)
 	if (mmc) {
 		struct mvsd_host *host = mmc_priv(mmc);
 
-		if (host->gpio_card_detect) {
+		if (host->gpio_card_detect)
 			free_irq(gpio_to_irq(host->gpio_card_detect), host);
-			gpio_free(host->gpio_card_detect);
-		}
+
 		mmc_remove_host(mmc);
 		free_irq(host->irq, host);
-		if (host->gpio_write_protect)
-			gpio_free(host->gpio_write_protect);
 		del_timer_sync(&host->timer);
 		mvsd_power_down(host);
-		iounmap(host->base);
-		release_resource(host->res);
 
-		if (!IS_ERR(host->clk)) {
+		if (!IS_ERR(host->clk))
 			clk_disable_unprepare(host->clk);
-			clk_put(host->clk);
-		}
+
 		mmc_free_host(mmc);
 	}
 	platform_set_drvdata(pdev, NULL);

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

* [PATCH] mmc: mvsdio: Replace IS_ERR_NULL() is with IS_ERR()
  2013-01-11 11:02 ` [PATCH] mmc: mvsdio: Replace IS_ERR_NULL() is " Russell King - ARM Linux
@ 2013-01-11 11:09   ` Thomas Petazzoni
  2013-01-11 11:11     ` Russell King - ARM Linux
  0 siblings, 1 reply; 9+ messages in thread
From: Thomas Petazzoni @ 2013-01-11 11:09 UTC (permalink / raw)
  To: linux-arm-kernel

Dear Russell King - ARM Linux,

On Fri, 11 Jan 2013 11:02:10 +0000, Russell King - ARM Linux wrote:

> What remains?  The assumption that GPIO0 means "no GPIO" rather than
> testing with gpio_valid() and the IRQ stuff.

Patches that I have written have been merged by Jason Cooper and while
adding the DT binding for this driver, it also converts it to use the
MMC GPIO helpers from drivers/mmc/core/slot-gpio.c, which makes this
whole GPIO initialization/cleanup a lot simpler.

See:

  http://git.infradead.org/users/jcooper/linux.git/commitdiff/c3833fbb117bb1a547d29b27a0de4418fa2d5a5a
  http://git.infradead.org/users/jcooper/linux.git/commitdiff/e60a21ed4edb7f33010ab21cefcb20666a9bc7d7

Also, note that Andrew Lunn has sent a v2 of his patch:

Subject: [PATCH v2] mmc: mvsdio: Replace IS_ERR_OR_NULL() with IS_ERR()
Date: Fri, 11 Jan 2013 08:27:52 +0100

Best regards,

Thomas
-- 
Thomas Petazzoni, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com

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

* [PATCH] mmc: mvsdio: Replace IS_ERR_NULL() is with IS_ERR()
  2013-01-11 11:09   ` Thomas Petazzoni
@ 2013-01-11 11:11     ` Russell King - ARM Linux
  0 siblings, 0 replies; 9+ messages in thread
From: Russell King - ARM Linux @ 2013-01-11 11:11 UTC (permalink / raw)
  To: linux-arm-kernel

On Fri, Jan 11, 2013 at 12:09:09PM +0100, Thomas Petazzoni wrote:
> Dear Russell King - ARM Linux,
> 
> On Fri, 11 Jan 2013 11:02:10 +0000, Russell King - ARM Linux wrote:
> 
> > What remains?  The assumption that GPIO0 means "no GPIO" rather than
> > testing with gpio_valid() and the IRQ stuff.
> 
> Patches that I have written have been merged by Jason Cooper and while
> adding the DT binding for this driver, it also converts it to use the
> MMC GPIO helpers from drivers/mmc/core/slot-gpio.c, which makes this
> whole GPIO initialization/cleanup a lot simpler.

Please also fix the whole raft of other crap in this driver too, as
I've highlighted previously and in these patches.

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

* [PATCH v2] mmc: mvsdio: Replace IS_ERR_OR_NULL() with IS_ERR()
  2013-01-11  7:27   ` [PATCH v2] mmc: mvsdio: Replace IS_ERR_OR_NULL() " Andrew Lunn
@ 2013-01-13 20:43     ` Jason Cooper
  2013-01-13 21:42       ` Andrew Lunn
  0 siblings, 1 reply; 9+ messages in thread
From: Jason Cooper @ 2013-01-13 20:43 UTC (permalink / raw)
  To: linux-arm-kernel

On Fri, Jan 11, 2013 at 08:27:52AM +0100, Andrew Lunn wrote:
> A NULL is a valid clk cookie, so we should not be tested with
> IS_ERR_OR_NULL(). Replace it with IS_ERR().
> 
> Signed-off-by: Andrew Lunn <andrew@lunn.ch>
> ---
> 
> This patch depends on Thomas Petazzoni DT patches for mvsdio, which changed
> the order of resource allocation etc.

grrr, I'm seeing fixes depending on features :(  Any way to avoid that?

In light of Russell's comments, shall I wait for a v3?  All of Thomas'
mvsdio work is now waiting on this.  I'd like to get that in as early as
possible.

thx,

Jason.

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

* [PATCH v2] mmc: mvsdio: Replace IS_ERR_OR_NULL() with IS_ERR()
  2013-01-13 20:43     ` Jason Cooper
@ 2013-01-13 21:42       ` Andrew Lunn
  0 siblings, 0 replies; 9+ messages in thread
From: Andrew Lunn @ 2013-01-13 21:42 UTC (permalink / raw)
  To: linux-arm-kernel

On Sun, Jan 13, 2013 at 03:43:48PM -0500, Jason Cooper wrote:
> On Fri, Jan 11, 2013 at 08:27:52AM +0100, Andrew Lunn wrote:
> > A NULL is a valid clk cookie, so we should not be tested with
> > IS_ERR_OR_NULL(). Replace it with IS_ERR().
> > 
> > Signed-off-by: Andrew Lunn <andrew@lunn.ch>
> > ---
> > 
> > This patch depends on Thomas Petazzoni DT patches for mvsdio, which changed
> > the order of resource allocation etc.
> 
> grrr, I'm seeing fixes depending on features :(  Any way to avoid that?
> 
> In light of Russell's comments, shall I wait for a v3?  All of Thomas'
> mvsdio work is now waiting on this.  I'd like to get that in as early as
> possible.

Well, im guessing doing the fixes first will require changes to Thomas
features. 

Did you try putting Russells patch in first? How bad are the
conflicts?

	Andrew

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

end of thread, other threads:[~2013-01-13 21:42 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-01-10 20:29 [PATCH] mmc: mvsdio: Replace IS_ERR_NULL() is with IS_ERR() Andrew Lunn
2013-01-10 20:49 ` Jason Cooper
2013-01-11  0:43 ` Simon Baatz
2013-01-11  7:27   ` [PATCH v2] mmc: mvsdio: Replace IS_ERR_OR_NULL() " Andrew Lunn
2013-01-13 20:43     ` Jason Cooper
2013-01-13 21:42       ` Andrew Lunn
2013-01-11 11:02 ` [PATCH] mmc: mvsdio: Replace IS_ERR_NULL() is " Russell King - ARM Linux
2013-01-11 11:09   ` Thomas Petazzoni
2013-01-11 11:11     ` Russell King - ARM Linux

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).