aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFabio Estevam <fabio.estevam@freescale.com>2013-07-11 00:26:48 -0400
committerMark Brown <broonie@linaro.org>2013-07-15 06:37:56 -0400
commit130b82c047675cf398ac49b7d230288f1b9ac9ad (patch)
tree4e5ca8bad27170476601dc0271ec13dd4f8fdd87
parentad81f0545ef01ea651886dddac4bef6cec930092 (diff)
spi: spi-imx: Use devm functions
Using devm functions can make the code smaller and cleaner. Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com> Signed-off-by: Mark Brown <broonie@linaro.org>
-rw-r--r--drivers/spi/spi-imx.c61
1 files changed, 15 insertions, 46 deletions
diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c
index 7db4f43ee4d8..756cd466cfaf 100644
--- a/drivers/spi/spi-imx.c
+++ b/drivers/spi/spi-imx.c
@@ -796,10 +796,11 @@ static int spi_imx_probe(struct platform_device *pdev)
796 if (!gpio_is_valid(cs_gpio)) 796 if (!gpio_is_valid(cs_gpio))
797 continue; 797 continue;
798 798
799 ret = gpio_request(spi_imx->chipselect[i], DRIVER_NAME); 799 ret = devm_gpio_request(&pdev->dev, spi_imx->chipselect[i],
800 DRIVER_NAME);
800 if (ret) { 801 if (ret) {
801 dev_err(&pdev->dev, "can't get cs gpios\n"); 802 dev_err(&pdev->dev, "can't get cs gpios\n");
802 goto out_gpio_free; 803 goto out_master_put;
803 } 804 }
804 } 805 }
805 806
@@ -816,46 +817,35 @@ static int spi_imx_probe(struct platform_device *pdev)
816 (struct spi_imx_devtype_data *) pdev->id_entry->driver_data; 817 (struct spi_imx_devtype_data *) pdev->id_entry->driver_data;
817 818
818 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 819 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
819 if (!res) { 820 spi_imx->base = devm_ioremap_resource(&pdev->dev, res);
820 dev_err(&pdev->dev, "can't get platform resource\n"); 821 if (IS_ERR(spi_imx->base)) {
821 ret = -ENOMEM; 822 ret = PTR_ERR(spi_imx->base);
822 goto out_gpio_free; 823 goto out_master_put;
823 }
824
825 if (!request_mem_region(res->start, resource_size(res), pdev->name)) {
826 dev_err(&pdev->dev, "request_mem_region failed\n");
827 ret = -EBUSY;
828 goto out_gpio_free;
829 }
830
831 spi_imx->base = ioremap(res->start, resource_size(res));
832 if (!spi_imx->base) {
833 ret = -EINVAL;
834 goto out_release_mem;
835 } 824 }
836 825
837 spi_imx->irq = platform_get_irq(pdev, 0); 826 spi_imx->irq = platform_get_irq(pdev, 0);
838 if (spi_imx->irq < 0) { 827 if (spi_imx->irq < 0) {
839 ret = -EINVAL; 828 ret = -EINVAL;
840 goto out_iounmap; 829 goto out_master_put;
841 } 830 }
842 831
843 ret = request_irq(spi_imx->irq, spi_imx_isr, 0, DRIVER_NAME, spi_imx); 832 ret = devm_request_irq(&pdev->dev, spi_imx->irq, spi_imx_isr, 0,
833 DRIVER_NAME, spi_imx);
844 if (ret) { 834 if (ret) {
845 dev_err(&pdev->dev, "can't get irq%d: %d\n", spi_imx->irq, ret); 835 dev_err(&pdev->dev, "can't get irq%d: %d\n", spi_imx->irq, ret);
846 goto out_iounmap; 836 goto out_master_put;
847 } 837 }
848 838
849 spi_imx->clk_ipg = devm_clk_get(&pdev->dev, "ipg"); 839 spi_imx->clk_ipg = devm_clk_get(&pdev->dev, "ipg");
850 if (IS_ERR(spi_imx->clk_ipg)) { 840 if (IS_ERR(spi_imx->clk_ipg)) {
851 ret = PTR_ERR(spi_imx->clk_ipg); 841 ret = PTR_ERR(spi_imx->clk_ipg);
852 goto out_free_irq; 842 goto out_master_put;
853 } 843 }
854 844
855 spi_imx->clk_per = devm_clk_get(&pdev->dev, "per"); 845 spi_imx->clk_per = devm_clk_get(&pdev->dev, "per");
856 if (IS_ERR(spi_imx->clk_per)) { 846 if (IS_ERR(spi_imx->clk_per)) {
857 ret = PTR_ERR(spi_imx->clk_per); 847 ret = PTR_ERR(spi_imx->clk_per);
858 goto out_free_irq; 848 goto out_master_put;
859 } 849 }
860 850
861 clk_prepare_enable(spi_imx->clk_per); 851 clk_prepare_enable(spi_imx->clk_per);
@@ -881,45 +871,24 @@ static int spi_imx_probe(struct platform_device *pdev)
881out_clk_put: 871out_clk_put:
882 clk_disable_unprepare(spi_imx->clk_per); 872 clk_disable_unprepare(spi_imx->clk_per);
883 clk_disable_unprepare(spi_imx->clk_ipg); 873 clk_disable_unprepare(spi_imx->clk_ipg);
884out_free_irq: 874out_master_put:
885 free_irq(spi_imx->irq, spi_imx);
886out_iounmap:
887 iounmap(spi_imx->base);
888out_release_mem:
889 release_mem_region(res->start, resource_size(res));
890out_gpio_free:
891 while (--i >= 0) {
892 if (gpio_is_valid(spi_imx->chipselect[i]))
893 gpio_free(spi_imx->chipselect[i]);
894 }
895 spi_master_put(master); 875 spi_master_put(master);
896 kfree(master); 876
897 return ret; 877 return ret;
898} 878}
899 879
900static int spi_imx_remove(struct platform_device *pdev) 880static int spi_imx_remove(struct platform_device *pdev)
901{ 881{
902 struct spi_master *master = platform_get_drvdata(pdev); 882 struct spi_master *master = platform_get_drvdata(pdev);
903 struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
904 struct spi_imx_data *spi_imx = spi_master_get_devdata(master); 883 struct spi_imx_data *spi_imx = spi_master_get_devdata(master);
905 int i;
906 884
907 spi_bitbang_stop(&spi_imx->bitbang); 885 spi_bitbang_stop(&spi_imx->bitbang);
908 886
909 writel(0, spi_imx->base + MXC_CSPICTRL); 887 writel(0, spi_imx->base + MXC_CSPICTRL);
910 clk_disable_unprepare(spi_imx->clk_per); 888 clk_disable_unprepare(spi_imx->clk_per);
911 clk_disable_unprepare(spi_imx->clk_ipg); 889 clk_disable_unprepare(spi_imx->clk_ipg);
912 free_irq(spi_imx->irq, spi_imx);
913 iounmap(spi_imx->base);
914
915 for (i = 0; i < master->num_chipselect; i++)
916 if (gpio_is_valid(spi_imx->chipselect[i]))
917 gpio_free(spi_imx->chipselect[i]);
918
919 spi_master_put(master); 890 spi_master_put(master);
920 891
921 release_mem_region(res->start, resource_size(res));
922
923 return 0; 892 return 0;
924} 893}
925 894