diff options
author | Bryan Wu <cooloney@kernel.org> | 2008-07-30 15:35:04 -0400 |
---|---|---|
committer | David Woodhouse <David.Woodhouse@intel.com> | 2008-08-01 10:44:22 -0400 |
commit | 4f0ca70e52b67f41287d853f0d572dafa875e485 (patch) | |
tree | f94dbab8700bee7e8ba0a802fa67f7e4decbb3ae /drivers/mtd | |
parent | 0ee002b041cb45ab3cc5384b86271d41ccf90fe1 (diff) |
[MTD] [NAND] Blackfin NFC Driver: Cleanup the error exit path of bf5xx_nand_probe function
Signed-off-by: Bryan Wu <cooloney@kernel.org>
Cc: Mike Frysinger <vapier.adi@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Diffstat (limited to 'drivers/mtd')
-rw-r--r-- | drivers/mtd/nand/bf5xx_nand.c | 38 |
1 files changed, 24 insertions, 14 deletions
diff --git a/drivers/mtd/nand/bf5xx_nand.c b/drivers/mtd/nand/bf5xx_nand.c index 6cf7fb86c256..9af2a2cc1153 100644 --- a/drivers/mtd/nand/bf5xx_nand.c +++ b/drivers/mtd/nand/bf5xx_nand.c | |||
@@ -549,7 +549,6 @@ static void bf5xx_nand_dma_write_buf(struct mtd_info *mtd, | |||
549 | /* | 549 | /* |
550 | * System initialization functions | 550 | * System initialization functions |
551 | */ | 551 | */ |
552 | |||
553 | static int bf5xx_nand_dma_init(struct bf5xx_nand_info *info) | 552 | static int bf5xx_nand_dma_init(struct bf5xx_nand_info *info) |
554 | { | 553 | { |
555 | int ret; | 554 | int ret; |
@@ -582,6 +581,13 @@ static int bf5xx_nand_dma_init(struct bf5xx_nand_info *info) | |||
582 | return 0; | 581 | return 0; |
583 | } | 582 | } |
584 | 583 | ||
584 | static void bf5xx_nand_dma_remove(struct bf5xx_nand_info *info) | ||
585 | { | ||
586 | /* Free NFC DMA channel */ | ||
587 | if (hardware_ecc) | ||
588 | free_dma(CH_NFC); | ||
589 | } | ||
590 | |||
585 | /* | 591 | /* |
586 | * BF5XX NFC hardware initialization | 592 | * BF5XX NFC hardware initialization |
587 | * - pin mux setup | 593 | * - pin mux setup |
@@ -658,6 +664,7 @@ static int __devexit bf5xx_nand_remove(struct platform_device *pdev) | |||
658 | } | 664 | } |
659 | 665 | ||
660 | peripheral_free_list(bfin_nfc_pin_req); | 666 | peripheral_free_list(bfin_nfc_pin_req); |
667 | bf5xx_nand_dma_remove(info); | ||
661 | 668 | ||
662 | /* free the common resources */ | 669 | /* free the common resources */ |
663 | kfree(info); | 670 | kfree(info); |
@@ -683,21 +690,21 @@ static int __devinit bf5xx_nand_probe(struct platform_device *pdev) | |||
683 | 690 | ||
684 | dev_dbg(&pdev->dev, "(%p)\n", pdev); | 691 | dev_dbg(&pdev->dev, "(%p)\n", pdev); |
685 | 692 | ||
693 | if (!plat) { | ||
694 | dev_err(&pdev->dev, "no platform specific information\n"); | ||
695 | return -EINVAL; | ||
696 | } | ||
697 | |||
686 | if (peripheral_request_list(bfin_nfc_pin_req, DRV_NAME)) { | 698 | if (peripheral_request_list(bfin_nfc_pin_req, DRV_NAME)) { |
687 | dev_err(&pdev->dev, "requesting Peripherals failed\n"); | 699 | dev_err(&pdev->dev, "requesting Peripherals failed\n"); |
688 | return -EFAULT; | 700 | return -EFAULT; |
689 | } | 701 | } |
690 | 702 | ||
691 | if (!plat) { | ||
692 | dev_err(&pdev->dev, "no platform specific information\n"); | ||
693 | goto exit_error; | ||
694 | } | ||
695 | |||
696 | info = kzalloc(sizeof(*info), GFP_KERNEL); | 703 | info = kzalloc(sizeof(*info), GFP_KERNEL); |
697 | if (info == NULL) { | 704 | if (info == NULL) { |
698 | dev_err(&pdev->dev, "no memory for flash info\n"); | 705 | dev_err(&pdev->dev, "no memory for flash info\n"); |
699 | err = -ENOMEM; | 706 | err = -ENOMEM; |
700 | goto exit_error; | 707 | goto out_err_kzalloc; |
701 | } | 708 | } |
702 | 709 | ||
703 | platform_set_drvdata(pdev, info); | 710 | platform_set_drvdata(pdev, info); |
@@ -741,8 +748,8 @@ static int __devinit bf5xx_nand_probe(struct platform_device *pdev) | |||
741 | 748 | ||
742 | /* initialise the hardware */ | 749 | /* initialise the hardware */ |
743 | err = bf5xx_nand_hw_init(info); | 750 | err = bf5xx_nand_hw_init(info); |
744 | if (err != 0) | 751 | if (err) |
745 | goto exit_error; | 752 | goto out_err_hw_init; |
746 | 753 | ||
747 | /* setup hardware ECC data struct */ | 754 | /* setup hardware ECC data struct */ |
748 | if (hardware_ecc) { | 755 | if (hardware_ecc) { |
@@ -772,7 +779,7 @@ static int __devinit bf5xx_nand_probe(struct platform_device *pdev) | |||
772 | /* scan hardware nand chip and setup mtd info data struct */ | 779 | /* scan hardware nand chip and setup mtd info data struct */ |
773 | if (nand_scan(mtd, 1)) { | 780 | if (nand_scan(mtd, 1)) { |
774 | err = -ENXIO; | 781 | err = -ENXIO; |
775 | goto exit_error; | 782 | goto out_err_nand_scan; |
776 | } | 783 | } |
777 | 784 | ||
778 | /* add NAND partition */ | 785 | /* add NAND partition */ |
@@ -781,11 +788,14 @@ static int __devinit bf5xx_nand_probe(struct platform_device *pdev) | |||
781 | dev_dbg(&pdev->dev, "initialised ok\n"); | 788 | dev_dbg(&pdev->dev, "initialised ok\n"); |
782 | return 0; | 789 | return 0; |
783 | 790 | ||
784 | exit_error: | 791 | out_err_nand_scan: |
785 | bf5xx_nand_remove(pdev); | 792 | bf5xx_nand_dma_remove(info); |
793 | out_err_hw_init: | ||
794 | platform_set_drvdata(pdev, NULL); | ||
795 | kfree(info); | ||
796 | out_err_kzalloc: | ||
797 | peripheral_free_list(bfin_nfc_pin_req); | ||
786 | 798 | ||
787 | if (err == 0) | ||
788 | err = -EINVAL; | ||
789 | return err; | 799 | return err; |
790 | } | 800 | } |
791 | 801 | ||