diff options
author | Max Filippov <jcmvbkbc@gmail.com> | 2012-02-29 15:40:08 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-04-02 12:27:10 -0400 |
commit | 2a367a7641e3f3075bfb50cb6ce26d4c66848e3c (patch) | |
tree | 24d1e97c62d81f8f77afc1947d42836027314cd4 /drivers/net | |
parent | 220b62b4dae194046a0993d66c5a7651fcfed72e (diff) |
p54spi: Release GPIO lines and IRQ on error in p54spi_probe
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>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/wireless/p54/p54spi.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/drivers/net/wireless/p54/p54spi.c b/drivers/net/wireless/p54/p54spi.c index b33ceb1c066..d895ff972d6 100644 --- a/drivers/net/wireless/p54/p54spi.c +++ b/drivers/net/wireless/p54/p54spi.c | |||
@@ -623,19 +623,19 @@ static int __devinit p54spi_probe(struct spi_device *spi) | |||
623 | ret = spi_setup(spi); | 623 | ret = spi_setup(spi); |
624 | if (ret < 0) { | 624 | if (ret < 0) { |
625 | dev_err(&priv->spi->dev, "spi_setup failed"); | 625 | dev_err(&priv->spi->dev, "spi_setup failed"); |
626 | goto err_free_common; | 626 | goto err_free; |
627 | } | 627 | } |
628 | 628 | ||
629 | ret = gpio_request(p54spi_gpio_power, "p54spi power"); | 629 | ret = gpio_request(p54spi_gpio_power, "p54spi power"); |
630 | if (ret < 0) { | 630 | if (ret < 0) { |
631 | dev_err(&priv->spi->dev, "power GPIO request failed: %d", ret); | 631 | dev_err(&priv->spi->dev, "power GPIO request failed: %d", ret); |
632 | goto err_free_common; | 632 | goto err_free; |
633 | } | 633 | } |
634 | 634 | ||
635 | ret = gpio_request(p54spi_gpio_irq, "p54spi irq"); | 635 | ret = gpio_request(p54spi_gpio_irq, "p54spi irq"); |
636 | if (ret < 0) { | 636 | if (ret < 0) { |
637 | dev_err(&priv->spi->dev, "irq GPIO request failed: %d", ret); | 637 | dev_err(&priv->spi->dev, "irq GPIO request failed: %d", ret); |
638 | goto err_free_common; | 638 | goto err_free_gpio_power; |
639 | } | 639 | } |
640 | 640 | ||
641 | gpio_direction_output(p54spi_gpio_power, 0); | 641 | gpio_direction_output(p54spi_gpio_power, 0); |
@@ -646,7 +646,7 @@ static int __devinit p54spi_probe(struct spi_device *spi) | |||
646 | priv->spi); | 646 | priv->spi); |
647 | if (ret < 0) { | 647 | if (ret < 0) { |
648 | dev_err(&priv->spi->dev, "request_irq() failed"); | 648 | dev_err(&priv->spi->dev, "request_irq() failed"); |
649 | goto err_free_common; | 649 | goto err_free_gpio_irq; |
650 | } | 650 | } |
651 | 651 | ||
652 | irq_set_irq_type(gpio_to_irq(p54spi_gpio_irq), IRQ_TYPE_EDGE_RISING); | 652 | irq_set_irq_type(gpio_to_irq(p54spi_gpio_irq), IRQ_TYPE_EDGE_RISING); |
@@ -678,6 +678,12 @@ static int __devinit p54spi_probe(struct spi_device *spi) | |||
678 | return 0; | 678 | return 0; |
679 | 679 | ||
680 | err_free_common: | 680 | err_free_common: |
681 | free_irq(gpio_to_irq(p54spi_gpio_irq), spi); | ||
682 | err_free_gpio_irq: | ||
683 | gpio_free(p54spi_gpio_irq); | ||
684 | err_free_gpio_power: | ||
685 | gpio_free(p54spi_gpio_power); | ||
686 | err_free: | ||
681 | p54_free_common(priv->hw); | 687 | p54_free_common(priv->hw); |
682 | return ret; | 688 | return ret; |
683 | } | 689 | } |