diff options
author | Arvind Yadav <arvind.yadav.cs@gmail.com> | 2017-05-23 05:18:57 -0400 |
---|---|---|
committer | Linus Walleij <linus.walleij@linaro.org> | 2017-05-29 04:37:40 -0400 |
commit | 6dc0048cff988858254fcc26becfc1e9753efa79 (patch) | |
tree | 8449b620b40138a0bdef4aca32e3f498bb296050 /drivers/gpio/gpio-davinci.c | |
parent | f37e335f925968942c6f613fa17c57f625042f87 (diff) |
gpio: davinci: Handle return value of clk_prepare_enable
clk_prepare_enable() can fail here and we must check its return value.
Signed-off-by: Arvind Yadav <arvind.yadav.cs@gmail.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/gpio/gpio-davinci.c')
-rw-r--r-- | drivers/gpio/gpio-davinci.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/drivers/gpio/gpio-davinci.c b/drivers/gpio/gpio-davinci.c index ac173575d3f6..65cb359308e3 100644 --- a/drivers/gpio/gpio-davinci.c +++ b/drivers/gpio/gpio-davinci.c | |||
@@ -437,6 +437,7 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev) | |||
437 | { | 437 | { |
438 | unsigned gpio, bank; | 438 | unsigned gpio, bank; |
439 | int irq; | 439 | int irq; |
440 | int ret; | ||
440 | struct clk *clk; | 441 | struct clk *clk; |
441 | u32 binten = 0; | 442 | u32 binten = 0; |
442 | unsigned ngpio, bank_irq; | 443 | unsigned ngpio, bank_irq; |
@@ -480,12 +481,15 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev) | |||
480 | PTR_ERR(clk)); | 481 | PTR_ERR(clk)); |
481 | return PTR_ERR(clk); | 482 | return PTR_ERR(clk); |
482 | } | 483 | } |
483 | clk_prepare_enable(clk); | 484 | ret = clk_prepare_enable(clk); |
485 | if (ret) | ||
486 | return ret; | ||
484 | 487 | ||
485 | if (!pdata->gpio_unbanked) { | 488 | if (!pdata->gpio_unbanked) { |
486 | irq = devm_irq_alloc_descs(dev, -1, 0, ngpio, 0); | 489 | irq = devm_irq_alloc_descs(dev, -1, 0, ngpio, 0); |
487 | if (irq < 0) { | 490 | if (irq < 0) { |
488 | dev_err(dev, "Couldn't allocate IRQ numbers\n"); | 491 | dev_err(dev, "Couldn't allocate IRQ numbers\n"); |
492 | clk_disable_unprepare(clk); | ||
489 | return irq; | 493 | return irq; |
490 | } | 494 | } |
491 | 495 | ||
@@ -494,6 +498,7 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev) | |||
494 | chips); | 498 | chips); |
495 | if (!irq_domain) { | 499 | if (!irq_domain) { |
496 | dev_err(dev, "Couldn't register an IRQ domain\n"); | 500 | dev_err(dev, "Couldn't register an IRQ domain\n"); |
501 | clk_disable_unprepare(clk); | ||
497 | return -ENODEV; | 502 | return -ENODEV; |
498 | } | 503 | } |
499 | } | 504 | } |
@@ -562,8 +567,10 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev) | |||
562 | sizeof(struct | 567 | sizeof(struct |
563 | davinci_gpio_irq_data), | 568 | davinci_gpio_irq_data), |
564 | GFP_KERNEL); | 569 | GFP_KERNEL); |
565 | if (!irqdata) | 570 | if (!irqdata) { |
571 | clk_disable_unprepare(clk); | ||
566 | return -ENOMEM; | 572 | return -ENOMEM; |
573 | } | ||
567 | 574 | ||
568 | irqdata->regs = g; | 575 | irqdata->regs = g; |
569 | irqdata->bank_num = bank; | 576 | irqdata->bank_num = bank; |