Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'spi-fix-v4.5-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi

Pull spi fixes from Mark Brown:
"A few driver specific fixes for the Rockchip and i.MX SPI controllers,
especially for the i.MX they're annoying bugs if you run into them"

* tag 'spi-fix-v4.5-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi:
spi: imx: fix spi resource leak with dma transfer
spi: imx: allow only WML aligned transfers to use DMA
spi: rockchip: add missing spi_master_put
spi: rockchip: disable runtime pm when in err case

+5 -15
+2 -15
drivers/spi/spi-imx.c
··· 204 204 { 205 205 struct spi_imx_data *spi_imx = spi_master_get_devdata(master); 206 206 207 - if (spi_imx->dma_is_inited && 208 - transfer->len > spi_imx->wml * sizeof(u32)) 207 + if (spi_imx->dma_is_inited && transfer->len >= spi_imx->wml && 208 + (transfer->len % spi_imx->wml) == 0) 209 209 return true; 210 210 return false; 211 211 } ··· 919 919 struct dma_async_tx_descriptor *desc_tx = NULL, *desc_rx = NULL; 920 920 int ret; 921 921 unsigned long timeout; 922 - u32 dma; 923 - int left; 924 922 struct spi_master *master = spi_imx->bitbang.master; 925 923 struct sg_table *tx = &transfer->tx_sg, *rx = &transfer->rx_sg; 926 924 ··· 952 954 /* Trigger the cspi module. */ 953 955 spi_imx->dma_finished = 0; 954 956 955 - dma = readl(spi_imx->base + MX51_ECSPI_DMA); 956 - dma = dma & (~MX51_ECSPI_DMA_RXT_WML_MASK); 957 - /* Change RX_DMA_LENGTH trigger dma fetch tail data */ 958 - left = transfer->len % spi_imx->wml; 959 - if (left) 960 - writel(dma | (left << MX51_ECSPI_DMA_RXT_WML_OFFSET), 961 - spi_imx->base + MX51_ECSPI_DMA); 962 957 /* 963 958 * Set these order to avoid potential RX overflow. The overflow may 964 959 * happen if we enable SPI HW before starting RX DMA due to rescheduling ··· 983 992 spi_imx->devtype_data->reset(spi_imx); 984 993 dmaengine_terminate_all(master->dma_rx); 985 994 } 986 - dma &= ~MX51_ECSPI_DMA_RXT_WML_MASK; 987 - writel(dma | 988 - spi_imx->wml << MX51_ECSPI_DMA_RXT_WML_OFFSET, 989 - spi_imx->base + MX51_ECSPI_DMA); 990 995 } 991 996 992 997 spi_imx->dma_finished = 1;
+3
drivers/spi/spi-rockchip.c
··· 749 749 return 0; 750 750 751 751 err_register_master: 752 + pm_runtime_disable(&pdev->dev); 752 753 if (rs->dma_tx.ch) 753 754 dma_release_channel(rs->dma_tx.ch); 754 755 if (rs->dma_rx.ch) ··· 778 777 dma_release_channel(rs->dma_tx.ch); 779 778 if (rs->dma_rx.ch) 780 779 dma_release_channel(rs->dma_rx.ch); 780 + 781 + spi_master_put(master); 781 782 782 783 return 0; 783 784 }