Implements DMA on mmci driver for LPC3250 plateform
Subsystems (3)
PATCH 1/1 Implements DMA on mmci driver for LPC3250 plateform
---
UPDATE2: sent in raw mode, sorry
UPDATE1: Here is the patch cleaned up and validated with scripts/checkpatch.pl. I also add a check to prevent crashing when DMA is disabled.
ORIGINAL POST:
Hi,
Currently, LPC32xx plateform do not enable DMA on the mmci driver. This makes the driver useless because getting out data from a 64 bytes FIFO by interrupt is not fast enough (at standard SD-card data rate).
DMA is not enabled because LPC32xx has a bug that prevent DMA to work properly with the MMC controller (silicon bug, I guess). NXP did a patch to workaround this, but it has not been commited on the main branch. The patch is for linux 2.6.39.2 and does not use dmaengine.
So, I reworked this patch to make it compatible with the last kernel (3.7). Here it is. Have I any chance to see this patch be commited on the main branch?
Thanks a lot,
Gabriele
drivers/dma/amba-pl08x.c | 20 ++++++ drivers/mmc/host/mmci.c | 159 +++++++++++++++++++++++++++++++++++++++++----- drivers/mmc/host/mmci.h | 12 +++- 3 files changed, 174 insertions(+), 17 deletions(-)
drivers/dma/amba-pl08x.c +20 -0
@@ -1758,6 +1758,26 @@ static void pl08x_free_virtual_channels(struct dma_device *dmadev) } } +#ifdef CONFIG_ARCH_LPC32XX +/* +* This exported function is used by mmci driver to workaround a bug in the +* LPC32xx chip, where the last DMA request is missed and must be simulated by +* software. +*/ +void pl08x_force_dma_burst (struct dma_chan *chan) +{ +struct pl08x_dma_chan *plchan =to_pl08x_chan (chan); +struct pl08x_driver_data *pl08x = plchan->host; + +dev_dbg (&pl08x->adev->dev, +"force burst signal=%d chan=%p plchan=%p\n" , + plchan->signal, chan, plchan); +if (plchan->signal >=0 ) +writel (1 << plchan->signal, pl08x->base +PL080_SOFT_BREQ ); +} +EXPORT_SYMBOL_GPL (pl08x_force_dma_burst); +#endif +#ifdef CONFIG_DEBUG_FS static const char *pl08x_state_str (enum pl08x_dma_chan_state state) {
drivers/mmc/host/mmci.c +143 -16
269 lines not on this page · raw message
drivers/mmc/host/mmci.h +11 -1
@@ -159,7 +159,11 @@ struct dma_chan;struct mmci_host_next {struct dma_async_tx_descriptor *dma_desc;struct dma_chan *dma_chan; -s32 cookie; +s32 cookie_cnt; +#ifdef CONFIG_ARCH_LPC32XX +void *dma_v_tx; +dma_addr_t dma_p_tx; +#endif };struct mmci_host {
@@ -206,6 +210,12 @@ struct mmci_host {struct dma_chan *dma_tx_channel;struct dma_async_tx_descriptor *dma_desc_current;struct mmci_host_next next_data; +#ifdef CONFIG_ARCH_LPC32XX +void *dma_v_tx[2 ]; +dma_addr_t dma_p_tx[2 ]; +void *dma_v_tx_current; +dma_addr_t dma_p_tx_current; +#endif #define dma_inprogress (host) ((host)->dma_current)#else
Signature · 1 line
1.7.10.4