Message ID | 1404204063-20961-1-git-send-email-jingchang.lu@freescale.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Am 2014-07-01 10:41, schrieb Jingchang Lu: > u32 ch = fsl_chan->vchan.chan.chan_id; > - void __iomem *muxaddr = fsl_chan->edma->muxbase[ch / DMAMUX_NR]; > + void __iomem *muxaddr; > unsigned chans_per_mux, ch_off; > > chans_per_mux = fsl_chan->edma->n_chans / DMAMUX_NR; > ch_off = fsl_chan->vchan.chan.chan_id % chans_per_mux; > + muxaddr = fsl_chan->edma->muxbase[ch / chans_per_mux]; After realizing that only one DMA channel was working on Vybrid I first came up with an almost identically patch before I found this one. I now applied and tested this one. Without this patch, the DMA user (e.g. lpuart) fails gracefully and work nonetheless, however without DMA. Since eDMA support is broken in current state in 3.16-rc3, it would be good to get this patch into 3.16. Tested-by: Stefan Agner <stefan@agner.ch> -- Stefan
On Tue, Jul 01, 2014 at 04:41:03PM +0800, Jingchang Lu wrote:
> Signed-off-by: Jingchang Lu <jingchang.lu@freescale.com>
Applied, thanks
diff --git a/drivers/dma/fsl-edma.c b/drivers/dma/fsl-edma.c index b396a7f..24ab3d3 100644 --- a/drivers/dma/fsl-edma.c +++ b/drivers/dma/fsl-edma.c @@ -248,11 +248,12 @@ static void fsl_edma_chan_mux(struct fsl_edma_chan *fsl_chan, unsigned int slot, bool enable) { u32 ch = fsl_chan->vchan.chan.chan_id; - void __iomem *muxaddr = fsl_chan->edma->muxbase[ch / DMAMUX_NR]; + void __iomem *muxaddr; unsigned chans_per_mux, ch_off; chans_per_mux = fsl_chan->edma->n_chans / DMAMUX_NR; ch_off = fsl_chan->vchan.chan.chan_id % chans_per_mux; + muxaddr = fsl_chan->edma->muxbase[ch / chans_per_mux]; if (enable) edma_writeb(fsl_chan->edma, @@ -724,6 +725,7 @@ static struct dma_chan *fsl_edma_xlate(struct of_phandle_args *dma_spec, { struct fsl_edma_engine *fsl_edma = ofdma->of_dma_data; struct dma_chan *chan, *_chan; + unsigned long chans_per_mux = fsl_edma->n_chans / DMAMUX_NR; if (dma_spec->args_count != 2) return NULL; @@ -732,7 +734,7 @@ static struct dma_chan *fsl_edma_xlate(struct of_phandle_args *dma_spec, list_for_each_entry_safe(chan, _chan, &fsl_edma->dma_dev.channels, device_node) { if (chan->client_count) continue; - if ((chan->chan_id / DMAMUX_NR) == dma_spec->args[0]) { + if ((chan->chan_id / chans_per_mux) == dma_spec->args[0]) { chan = dma_get_slave_channel(chan); if (chan) { chan->device->privatecnt++;
Signed-off-by: Jingchang Lu <jingchang.lu@freescale.com> --- drivers/dma/fsl-edma.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)