aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Brown <broonie@linaro.org>2013-09-01 08:48:55 -0400
committerMark Brown <broonie@linaro.org>2013-09-01 08:48:55 -0400
commit8e37befc5ce80d6c9f3072e63d6f665ee2999783 (patch)
tree780d3b9a689fe5e69ea93ad2e3d200a193066dcb
parent497cb4473a88fb18c2a773160f9328c499be7051 (diff)
parent27743e0bfdb227617017d14dcc7fa64f34d48671 (diff)
Merge remote-tracking branch 'spi/topic/imx' into spi-next
-rw-r--r--drivers/spi/spi-imx.c76
1 files changed, 26 insertions, 50 deletions
diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c
index 7db4f43ee4d8..15323d8bd9cf 100644
--- a/drivers/spi/spi-imx.c
+++ b/drivers/spi/spi-imx.c
@@ -619,6 +619,7 @@ static const struct of_device_id spi_imx_dt_ids[] = {
619 { .compatible = "fsl,imx51-ecspi", .data = &imx51_ecspi_devtype_data, }, 619 { .compatible = "fsl,imx51-ecspi", .data = &imx51_ecspi_devtype_data, },
620 { /* sentinel */ } 620 { /* sentinel */ }
621}; 621};
622MODULE_DEVICE_TABLE(of, spi_imx_dt_ids);
622 623
623static void spi_imx_chipselect(struct spi_device *spi, int is_active) 624static void spi_imx_chipselect(struct spi_device *spi, int is_active)
624{ 625{
@@ -796,10 +797,11 @@ static int spi_imx_probe(struct platform_device *pdev)
796 if (!gpio_is_valid(cs_gpio)) 797 if (!gpio_is_valid(cs_gpio))
797 continue; 798 continue;
798 799
799 ret = gpio_request(spi_imx->chipselect[i], DRIVER_NAME); 800 ret = devm_gpio_request(&pdev->dev, spi_imx->chipselect[i],
801 DRIVER_NAME);
800 if (ret) { 802 if (ret) {
801 dev_err(&pdev->dev, "can't get cs gpios\n"); 803 dev_err(&pdev->dev, "can't get cs gpios\n");
802 goto out_gpio_free; 804 goto out_master_put;
803 } 805 }
804 } 806 }
805 807
@@ -816,50 +818,44 @@ static int spi_imx_probe(struct platform_device *pdev)
816 (struct spi_imx_devtype_data *) pdev->id_entry->driver_data; 818 (struct spi_imx_devtype_data *) pdev->id_entry->driver_data;
817 819
818 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 820 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
819 if (!res) { 821 spi_imx->base = devm_ioremap_resource(&pdev->dev, res);
820 dev_err(&pdev->dev, "can't get platform resource\n"); 822 if (IS_ERR(spi_imx->base)) {
821 ret = -ENOMEM; 823 ret = PTR_ERR(spi_imx->base);
822 goto out_gpio_free; 824 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 } 825 }
836 826
837 spi_imx->irq = platform_get_irq(pdev, 0); 827 spi_imx->irq = platform_get_irq(pdev, 0);
838 if (spi_imx->irq < 0) { 828 if (spi_imx->irq < 0) {
839 ret = -EINVAL; 829 ret = -EINVAL;
840 goto out_iounmap; 830 goto out_master_put;
841 } 831 }
842 832
843 ret = request_irq(spi_imx->irq, spi_imx_isr, 0, DRIVER_NAME, spi_imx); 833 ret = devm_request_irq(&pdev->dev, spi_imx->irq, spi_imx_isr, 0,
834 DRIVER_NAME, spi_imx);
844 if (ret) { 835 if (ret) {
845 dev_err(&pdev->dev, "can't get irq%d: %d\n", spi_imx->irq, ret); 836 dev_err(&pdev->dev, "can't get irq%d: %d\n", spi_imx->irq, ret);
846 goto out_iounmap; 837 goto out_master_put;
847 } 838 }
848 839
849 spi_imx->clk_ipg = devm_clk_get(&pdev->dev, "ipg"); 840 spi_imx->clk_ipg = devm_clk_get(&pdev->dev, "ipg");
850 if (IS_ERR(spi_imx->clk_ipg)) { 841 if (IS_ERR(spi_imx->clk_ipg)) {
851 ret = PTR_ERR(spi_imx->clk_ipg); 842 ret = PTR_ERR(spi_imx->clk_ipg);
852 goto out_free_irq; 843 goto out_master_put;
853 } 844 }
854 845
855 spi_imx->clk_per = devm_clk_get(&pdev->dev, "per"); 846 spi_imx->clk_per = devm_clk_get(&pdev->dev, "per");
856 if (IS_ERR(spi_imx->clk_per)) { 847 if (IS_ERR(spi_imx->clk_per)) {
857 ret = PTR_ERR(spi_imx->clk_per); 848 ret = PTR_ERR(spi_imx->clk_per);
858 goto out_free_irq; 849 goto out_master_put;
859 } 850 }
860 851
861 clk_prepare_enable(spi_imx->clk_per); 852 ret = clk_prepare_enable(spi_imx->clk_per);
862 clk_prepare_enable(spi_imx->clk_ipg); 853 if (ret)
854 goto out_master_put;
855
856 ret = clk_prepare_enable(spi_imx->clk_ipg);
857 if (ret)
858 goto out_put_per;
863 859
864 spi_imx->spi_clk = clk_get_rate(spi_imx->clk_per); 860 spi_imx->spi_clk = clk_get_rate(spi_imx->clk_per);
865 861
@@ -879,47 +875,27 @@ static int spi_imx_probe(struct platform_device *pdev)
879 return ret; 875 return ret;
880 876
881out_clk_put: 877out_clk_put:
882 clk_disable_unprepare(spi_imx->clk_per);
883 clk_disable_unprepare(spi_imx->clk_ipg); 878 clk_disable_unprepare(spi_imx->clk_ipg);
884out_free_irq: 879out_put_per:
885 free_irq(spi_imx->irq, spi_imx); 880 clk_disable_unprepare(spi_imx->clk_per);
886out_iounmap: 881out_master_put:
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); 882 spi_master_put(master);
896 kfree(master); 883
897 return ret; 884 return ret;
898} 885}
899 886
900static int spi_imx_remove(struct platform_device *pdev) 887static int spi_imx_remove(struct platform_device *pdev)
901{ 888{
902 struct spi_master *master = platform_get_drvdata(pdev); 889 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); 890 struct spi_imx_data *spi_imx = spi_master_get_devdata(master);
905 int i;
906 891
907 spi_bitbang_stop(&spi_imx->bitbang); 892 spi_bitbang_stop(&spi_imx->bitbang);
908 893
909 writel(0, spi_imx->base + MXC_CSPICTRL); 894 writel(0, spi_imx->base + MXC_CSPICTRL);
910 clk_disable_unprepare(spi_imx->clk_per);
911 clk_disable_unprepare(spi_imx->clk_ipg); 895 clk_disable_unprepare(spi_imx->clk_ipg);
912 free_irq(spi_imx->irq, spi_imx); 896 clk_disable_unprepare(spi_imx->clk_per);
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); 897 spi_master_put(master);
920 898
921 release_mem_region(res->start, resource_size(res));
922
923 return 0; 899 return 0;
924} 900}
925 901