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 | ||
