| From 62ebeed8d00aef75eac4fd6c161cae75a41965ca Mon Sep 17 00:00:00 2001 |
| From: Max Filippov <jcmvbkbc@gmail.com> |
| Date: Thu, 1 Mar 2012 00:40:08 +0400 |
| Subject: p54spi: Release GPIO lines and IRQ on error in p54spi_probe |
| |
| From: Max Filippov <jcmvbkbc@gmail.com> |
| |
| commit 62ebeed8d00aef75eac4fd6c161cae75a41965ca upstream. |
| |
| This makes it possible to reload driver if insmod has failed due to |
| missing firmware. |
| |
| Signed-off-by: Max Filippov <jcmvbkbc@gmail.com> |
| Acked-by: Christian Lamparter <chunkeey@googlemail.com> |
| Signed-off-by: John W. Linville <linville@tuxdriver.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/net/wireless/p54/p54spi.c | 14 ++++++++++---- |
| 1 file changed, 10 insertions(+), 4 deletions(-) |
| |
| --- a/drivers/net/wireless/p54/p54spi.c |
| +++ b/drivers/net/wireless/p54/p54spi.c |
| @@ -622,19 +622,19 @@ static int __devinit p54spi_probe(struct |
| ret = spi_setup(spi); |
| if (ret < 0) { |
| dev_err(&priv->spi->dev, "spi_setup failed"); |
| - goto err_free_common; |
| + goto err_free; |
| } |
| |
| ret = gpio_request(p54spi_gpio_power, "p54spi power"); |
| if (ret < 0) { |
| dev_err(&priv->spi->dev, "power GPIO request failed: %d", ret); |
| - goto err_free_common; |
| + goto err_free; |
| } |
| |
| ret = gpio_request(p54spi_gpio_irq, "p54spi irq"); |
| if (ret < 0) { |
| dev_err(&priv->spi->dev, "irq GPIO request failed: %d", ret); |
| - goto err_free_common; |
| + goto err_free_gpio_power; |
| } |
| |
| gpio_direction_output(p54spi_gpio_power, 0); |
| @@ -645,7 +645,7 @@ static int __devinit p54spi_probe(struct |
| priv->spi); |
| if (ret < 0) { |
| dev_err(&priv->spi->dev, "request_irq() failed"); |
| - goto err_free_common; |
| + goto err_free_gpio_irq; |
| } |
| |
| irq_set_irq_type(gpio_to_irq(p54spi_gpio_irq), IRQ_TYPE_EDGE_RISING); |
| @@ -677,6 +677,12 @@ static int __devinit p54spi_probe(struct |
| return 0; |
| |
| err_free_common: |
| + free_irq(gpio_to_irq(p54spi_gpio_irq), spi); |
| +err_free_gpio_irq: |
| + gpio_free(p54spi_gpio_irq); |
| +err_free_gpio_power: |
| + gpio_free(p54spi_gpio_power); |
| +err_free: |
| p54_free_common(priv->hw); |
| return ret; |
| } |