aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/spi/spi-imx.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/spi/spi-imx.c')
-rw-r--r--drivers/spi/spi-imx.c32
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