diff options
author | Mark Brown <broonie@linaro.org> | 2013-09-01 08:48:55 -0400 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2013-09-01 08:48:55 -0400 |
commit | 8e37befc5ce80d6c9f3072e63d6f665ee2999783 (patch) | |
tree | 780d3b9a689fe5e69ea93ad2e3d200a193066dcb | |
parent | 497cb4473a88fb18c2a773160f9328c499be7051 (diff) | |
parent | 27743e0bfdb227617017d14dcc7fa64f34d48671 (diff) |
Merge remote-tracking branch 'spi/topic/imx' into spi-next
-rw-r--r-- | drivers/spi/spi-imx.c | 76 |
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 | }; |
622 | MODULE_DEVICE_TABLE(of, spi_imx_dt_ids); | ||
622 | 623 | ||
623 | static void spi_imx_chipselect(struct spi_device *spi, int is_active) | 624 | static 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 | ||
881 | out_clk_put: | 877 | out_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); |
884 | out_free_irq: | 879 | out_put_per: |
885 | free_irq(spi_imx->irq, spi_imx); | 880 | clk_disable_unprepare(spi_imx->clk_per); |
886 | out_iounmap: | 881 | out_master_put: |
887 | iounmap(spi_imx->base); | ||
888 | out_release_mem: | ||
889 | release_mem_region(res->start, resource_size(res)); | ||
890 | out_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 | ||
900 | static int spi_imx_remove(struct platform_device *pdev) | 887 | static 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 | ||