FAILED: patch "[PATCH] dmaengine: dw: fix cyclic transfer setup" failed to apply to 3.14-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 3.14-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
Quoted 1 line
From
df3bb8a0e619d501cd13334c3e0586edcdcbc716Mon Sep 17 00:00:00 2001
From: Mans Rullgard <[email protected]>
Date: Mon, 11 Jan 2016 13:04:28 +0000
Subject: [PATCH] dmaengine: dw: fix cyclic transfer setup
Commit 61e183f83069 ("dmaengine/dw_dmac: Reconfigure interrupt and chan_cfg register on resume") moved some channel initialisation to a new function which must be called before starting a transfer.
This updates dw_dma_cyclic_start() to use dwc_dostart() like the other modes, thus ensuring dwc_initialize() gets called and removing some code duplication.
drivers/dma/dw/core.c +1 -22
@@ -1245,7 +1245,6 @@ static void dwc_free_chan_resources(struct dma_chan *chan)int dw_dma_cyclic_start (struct dma_chan *chan) {struct dw_dma_chan *dwc =to_dw_dma_chan (chan); -struct dw_dma *dw =to_dw_dma (dwc->chan.device);unsigned long flags;if (!test_bit (DW_DMA_IS_CYCLIC , &dwc->flags)) {
@@ -1254,27 +1253,7 @@ int dw_dma_cyclic_start(struct dma_chan *chan) }spin_lock_irqsave (&dwc->lock, flags); - -/* Assert channel is idle */ -if (dma_readl (dw,CH_EN ) & dwc->mask) { -dev_err (chan2dev (&dwc->chan), -"%s: BUG: Attempted to start non-idle channel\n" , - __func__); -dwc_dump_chan_regs (dwc); -spin_unlock_irqrestore (&dwc->lock, flags); -return -EBUSY ; - } - -dma_writel (dw,CLEAR .ERROR, dwc->mask); -dma_writel (dw,CLEAR .XFER, dwc->mask); - -/* Setup DMAC channel registers */ -channel_writel (dwc,LLP , dwc->cdesc->desc[0 ]->txd.phys); -channel_writel (dwc,CTL_LO ,DWC_CTLL_LLP_D_EN |DWC_CTLL_LLP_S_EN ); -channel_writel (dwc,CTL_HI ,0 ); - -channel_set_bit (dw,CH_EN , dwc->mask); - +dwc_dostart (dwc, dwc->cdesc->desc[0 ]);spin_unlock_irqrestore (&dwc->lock, flags);return 0 ;