dmaengine: fsl-edma: fix dmamux index calculating error
Subsystems (2)
PATCH 1/1 dmaengine: fsl-edma: fix dmamux index calculating error
Signed-off-by Jingchang Lu <[email protected]>
--- drivers/dma/fsl-edma.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/dma/fsl-edma.c +4 -2
@@ -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++;
Signature · 1 line
1.8.0
PATCH 1/1 dmaengine: fsl-edma: fix dmamux index calculating error
Am 2014-07-01 10:41, schrieb Jingchang Lu:
drivers/dma/fsl-edma.c static void fsl_edma_chan_mux(struct fsl_edma_chan *fsl_chan, · line 256
Quoted 8 lines
drivers/dma/fsl-edma.c +2
-1u32 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 <[email protected]>
--
Stefan
Vinod Koul
AppliedPATCH 1/1 dmaengine: fsl-edma: fix dmamux index calculating error
In reply to Jingchang LuQuoted 1 line · Jingchang Lu
Signed-off-by Jingchang Lu <[email protected]>
Applied, thanks
Signature · 1 line
~Vinod
Quoted 46 lines
--- drivers/dma/fsl-edma.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)drivers/dma/fsl-edma.c +4
-2@@ -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++;Signature · 6 lines
1.8.0 -- To unsubscribe from this list: send the line "unsubscribe dmaengine" in the body of a message to majordomo at vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html