lkml.org 
[lkml]   [2013]   [Jan]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[resend][PATCH 15/16] dma: dw_dmac: add dwc_chan_pause and dwc_chan_resume
    Date
    We will use at least the dwc_chan_resume() later.

    Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
    ---
    drivers/dma/dw_dmac.c | 31 ++++++++++++++++++++++---------
    1 file changed, 22 insertions(+), 9 deletions(-)

    diff --git a/drivers/dma/dw_dmac.c b/drivers/dma/dw_dmac.c
    index 8afbda6..6a8f8c7 100644
    --- a/drivers/dma/dw_dmac.c
    +++ b/drivers/dma/dw_dmac.c
    @@ -1008,6 +1008,26 @@ set_runtime_config(struct dma_chan *chan, struct dma_slave_config *sconfig)
    return 0;
    }

    +static inline void dwc_chan_pause(struct dw_dma_chan *dwc)
    +{
    + u32 cfglo = channel_readl(dwc, CFG_LO);
    +
    + channel_writel(dwc, CFG_LO, cfglo | DWC_CFGL_CH_SUSP);
    + while (!(channel_readl(dwc, CFG_LO) & DWC_CFGL_FIFO_EMPTY))
    + cpu_relax();
    +
    + dwc->paused = true;
    +}
    +
    +static inline void dwc_chan_resume(struct dw_dma_chan *dwc)
    +{
    + u32 cfglo = channel_readl(dwc, CFG_LO);
    +
    + channel_writel(dwc, CFG_LO, cfglo & ~DWC_CFGL_CH_SUSP);
    +
    + dwc->paused = false;
    +}
    +
    static int dwc_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd,
    unsigned long arg)
    {
    @@ -1015,18 +1035,13 @@ static int dwc_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd,
    struct dw_dma *dw = to_dw_dma(chan->device);
    struct dw_desc *desc, *_desc;
    unsigned long flags;
    - u32 cfglo;
    LIST_HEAD(list);

    if (cmd == DMA_PAUSE) {
    spin_lock_irqsave(&dwc->lock, flags);

    - cfglo = channel_readl(dwc, CFG_LO);
    - channel_writel(dwc, CFG_LO, cfglo | DWC_CFGL_CH_SUSP);
    - while (!(channel_readl(dwc, CFG_LO) & DWC_CFGL_FIFO_EMPTY))
    - cpu_relax();
    + dwc_chan_pause(dwc);

    - dwc->paused = true;
    spin_unlock_irqrestore(&dwc->lock, flags);
    } else if (cmd == DMA_RESUME) {
    if (!dwc->paused)
    @@ -1034,9 +1049,7 @@ static int dwc_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd,

    spin_lock_irqsave(&dwc->lock, flags);

    - cfglo = channel_readl(dwc, CFG_LO);
    - channel_writel(dwc, CFG_LO, cfglo & ~DWC_CFGL_CH_SUSP);
    - dwc->paused = false;
    + dwc_chan_resume(dwc);

    spin_unlock_irqrestore(&dwc->lock, flags);
    } else if (cmd == DMA_TERMINATE_ALL) {
    --
    1.7.10.4


    \
     
     \ /
      Last update: 2013-01-09 10:21    [W:3.303 / U:0.888 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site