diff options
Diffstat (limited to 'arch/mips/txx9/generic/setup.c')
-rw-r--r-- | arch/mips/txx9/generic/setup.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/arch/mips/txx9/generic/setup.c b/arch/mips/txx9/generic/setup.c index a205e2ba8e7b..c860810722c0 100644 --- a/arch/mips/txx9/generic/setup.c +++ b/arch/mips/txx9/generic/setup.c | |||
@@ -782,7 +782,7 @@ void __init txx9_iocled_init(unsigned long baseaddr, | |||
782 | return; | 782 | return; |
783 | iocled->mmioaddr = ioremap(baseaddr, 1); | 783 | iocled->mmioaddr = ioremap(baseaddr, 1); |
784 | if (!iocled->mmioaddr) | 784 | if (!iocled->mmioaddr) |
785 | return; | 785 | goto out_free; |
786 | iocled->chip.get = txx9_iocled_get; | 786 | iocled->chip.get = txx9_iocled_get; |
787 | iocled->chip.set = txx9_iocled_set; | 787 | iocled->chip.set = txx9_iocled_set; |
788 | iocled->chip.direction_input = txx9_iocled_dir_in; | 788 | iocled->chip.direction_input = txx9_iocled_dir_in; |
@@ -791,13 +791,13 @@ void __init txx9_iocled_init(unsigned long baseaddr, | |||
791 | iocled->chip.base = basenum; | 791 | iocled->chip.base = basenum; |
792 | iocled->chip.ngpio = num; | 792 | iocled->chip.ngpio = num; |
793 | if (gpiochip_add(&iocled->chip)) | 793 | if (gpiochip_add(&iocled->chip)) |
794 | return; | 794 | goto out_unmap; |
795 | if (basenum < 0) | 795 | if (basenum < 0) |
796 | basenum = iocled->chip.base; | 796 | basenum = iocled->chip.base; |
797 | 797 | ||
798 | pdev = platform_device_alloc("leds-gpio", basenum); | 798 | pdev = platform_device_alloc("leds-gpio", basenum); |
799 | if (!pdev) | 799 | if (!pdev) |
800 | return; | 800 | goto out_gpio; |
801 | iocled->pdata.num_leds = num; | 801 | iocled->pdata.num_leds = num; |
802 | iocled->pdata.leds = iocled->leds; | 802 | iocled->pdata.leds = iocled->leds; |
803 | for (i = 0; i < num; i++) { | 803 | for (i = 0; i < num; i++) { |
@@ -812,7 +812,16 @@ void __init txx9_iocled_init(unsigned long baseaddr, | |||
812 | } | 812 | } |
813 | pdev->dev.platform_data = &iocled->pdata; | 813 | pdev->dev.platform_data = &iocled->pdata; |
814 | if (platform_device_add(pdev)) | 814 | if (platform_device_add(pdev)) |
815 | platform_device_put(pdev); | 815 | goto out_pdev; |
816 | return; | ||
817 | out_pdev: | ||
818 | platform_device_put(pdev); | ||
819 | out_gpio: | ||
820 | gpio_remove(&iocled->chip); | ||
821 | out_unmap: | ||
822 | iounmap(iocled->mmioaddr); | ||
823 | out_free: | ||
824 | kfree(iocled); | ||
816 | } | 825 | } |
817 | #else /* CONFIG_LEDS_GPIO */ | 826 | #else /* CONFIG_LEDS_GPIO */ |
818 | void __init txx9_iocled_init(unsigned long baseaddr, | 827 | void __init txx9_iocled_init(unsigned long baseaddr, |