diff options
Diffstat (limited to 'drivers/spi/spi-imx.c')
-rw-r--r-- | drivers/spi/spi-imx.c | 32 |
1 files changed, 18 insertions, 14 deletions
diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c index 961b97d43b43..6fea4af51c41 100644 --- a/drivers/spi/spi-imx.c +++ b/drivers/spi/spi-imx.c | |||
@@ -89,7 +89,6 @@ struct spi_imx_data { | |||
89 | 89 | ||
90 | struct completion xfer_done; | 90 | struct completion xfer_done; |
91 | void __iomem *base; | 91 | void __iomem *base; |
92 | int irq; | ||
93 | struct clk *clk_per; | 92 | struct clk *clk_per; |
94 | struct clk *clk_ipg; | 93 | struct clk *clk_ipg; |
95 | unsigned long spi_clk; | 94 | unsigned long spi_clk; |
@@ -823,6 +822,10 @@ static int spi_imx_sdma_init(struct device *dev, struct spi_imx_data *spi_imx, | |||
823 | struct dma_slave_config slave_config = {}; | 822 | struct dma_slave_config slave_config = {}; |
824 | int ret; | 823 | int ret; |
825 | 824 | ||
825 | /* use pio mode for i.mx6dl chip TKT238285 */ | ||
826 | if (of_machine_is_compatible("fsl,imx6dl")) | ||
827 | return 0; | ||
828 | |||
826 | /* Prepare for TX DMA: */ | 829 | /* Prepare for TX DMA: */ |
827 | master->dma_tx = dma_request_slave_channel(dev, "tx"); | 830 | master->dma_tx = dma_request_slave_channel(dev, "tx"); |
828 | if (!master->dma_tx) { | 831 | if (!master->dma_tx) { |
@@ -892,6 +895,7 @@ static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx, | |||
892 | { | 895 | { |
893 | struct dma_async_tx_descriptor *desc_tx = NULL, *desc_rx = NULL; | 896 | struct dma_async_tx_descriptor *desc_tx = NULL, *desc_rx = NULL; |
894 | int ret; | 897 | int ret; |
898 | unsigned long timeout; | ||
895 | u32 dma; | 899 | u32 dma; |
896 | int left; | 900 | int left; |
897 | struct spi_master *master = spi_imx->bitbang.master; | 901 | struct spi_master *master = spi_imx->bitbang.master; |
@@ -939,17 +943,17 @@ static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx, | |||
939 | dma_async_issue_pending(master->dma_tx); | 943 | dma_async_issue_pending(master->dma_tx); |
940 | dma_async_issue_pending(master->dma_rx); | 944 | dma_async_issue_pending(master->dma_rx); |
941 | /* Wait SDMA to finish the data transfer.*/ | 945 | /* Wait SDMA to finish the data transfer.*/ |
942 | ret = wait_for_completion_timeout(&spi_imx->dma_tx_completion, | 946 | timeout = wait_for_completion_timeout(&spi_imx->dma_tx_completion, |
943 | IMX_DMA_TIMEOUT); | 947 | IMX_DMA_TIMEOUT); |
944 | if (!ret) { | 948 | if (!timeout) { |
945 | pr_warn("%s %s: I/O Error in DMA TX\n", | 949 | pr_warn("%s %s: I/O Error in DMA TX\n", |
946 | dev_driver_string(&master->dev), | 950 | dev_driver_string(&master->dev), |
947 | dev_name(&master->dev)); | 951 | dev_name(&master->dev)); |
948 | dmaengine_terminate_all(master->dma_tx); | 952 | dmaengine_terminate_all(master->dma_tx); |
949 | } else { | 953 | } else { |
950 | ret = wait_for_completion_timeout(&spi_imx->dma_rx_completion, | 954 | timeout = wait_for_completion_timeout( |
951 | IMX_DMA_TIMEOUT); | 955 | &spi_imx->dma_rx_completion, IMX_DMA_TIMEOUT); |
952 | if (!ret) { | 956 | if (!timeout) { |
953 | pr_warn("%s %s: I/O Error in DMA RX\n", | 957 | pr_warn("%s %s: I/O Error in DMA RX\n", |
954 | dev_driver_string(&master->dev), | 958 | dev_driver_string(&master->dev), |
955 | dev_name(&master->dev)); | 959 | dev_name(&master->dev)); |
@@ -964,9 +968,9 @@ static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx, | |||
964 | spi_imx->dma_finished = 1; | 968 | spi_imx->dma_finished = 1; |
965 | spi_imx->devtype_data->trigger(spi_imx); | 969 | spi_imx->devtype_data->trigger(spi_imx); |
966 | 970 | ||
967 | if (!ret) | 971 | if (!timeout) |
968 | ret = -ETIMEDOUT; | 972 | ret = -ETIMEDOUT; |
969 | else if (ret > 0) | 973 | else |
970 | ret = transfer->len; | 974 | ret = transfer->len; |
971 | 975 | ||
972 | return ret; | 976 | return ret; |
@@ -1076,7 +1080,7 @@ static int spi_imx_probe(struct platform_device *pdev) | |||
1076 | struct spi_master *master; | 1080 | struct spi_master *master; |
1077 | struct spi_imx_data *spi_imx; | 1081 | struct spi_imx_data *spi_imx; |
1078 | struct resource *res; | 1082 | struct resource *res; |
1079 | int i, ret, num_cs; | 1083 | int i, ret, num_cs, irq; |
1080 | 1084 | ||
1081 | if (!np && !mxc_platform_info) { | 1085 | if (!np && !mxc_platform_info) { |
1082 | dev_err(&pdev->dev, "can't get the platform data\n"); | 1086 | dev_err(&pdev->dev, "can't get the platform data\n"); |
@@ -1143,16 +1147,16 @@ static int spi_imx_probe(struct platform_device *pdev) | |||
1143 | goto out_master_put; | 1147 | goto out_master_put; |
1144 | } | 1148 | } |
1145 | 1149 | ||
1146 | spi_imx->irq = platform_get_irq(pdev, 0); | 1150 | irq = platform_get_irq(pdev, 0); |
1147 | if (spi_imx->irq < 0) { | 1151 | if (irq < 0) { |
1148 | ret = spi_imx->irq; | 1152 | ret = irq; |
1149 | goto out_master_put; | 1153 | goto out_master_put; |
1150 | } | 1154 | } |
1151 | 1155 | ||
1152 | ret = devm_request_irq(&pdev->dev, spi_imx->irq, spi_imx_isr, 0, | 1156 | ret = devm_request_irq(&pdev->dev, irq, spi_imx_isr, 0, |
1153 | dev_name(&pdev->dev), spi_imx); | 1157 | dev_name(&pdev->dev), spi_imx); |
1154 | if (ret) { | 1158 | if (ret) { |
1155 | dev_err(&pdev->dev, "can't get irq%d: %d\n", spi_imx->irq, ret); | 1159 | dev_err(&pdev->dev, "can't get irq%d: %d\n", irq, ret); |
1156 | goto out_master_put; | 1160 | goto out_master_put; |
1157 | } | 1161 | } |
1158 | 1162 | ||