lkml.org 
[lkml]   [2012]   [Jun]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCHv2.1] dw_dmac: introduce dwc_chan_disable
    Date
    This piece of code is used often. Make it as a separate function.

    Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    ---
    drivers/dma/dw_dmac.c | 32 ++++++++++++++------------------
    1 file changed, 14 insertions(+), 18 deletions(-)

    diff --git a/drivers/dma/dw_dmac.c b/drivers/dma/dw_dmac.c
    index d3845ef..cefc2c3b 100644
    --- a/drivers/dma/dw_dmac.c
    +++ b/drivers/dma/dw_dmac.c
    @@ -219,6 +219,14 @@ static void dwc_dump_chan_regs(struct dw_dma_chan *dwc)
    channel_readl(dwc, CTL_LO));
    }

    +
    +static inline void dwc_chan_disable(struct dw_dma *dw, struct dw_dma_chan *dwc)
    +{
    + channel_clear_bit(dw, CH_EN, dwc->mask);
    + while (dma_readl(dw, CH_EN) & dwc->mask)
    + cpu_relax();
    +}
    +
    /*----------------------------------------------------------------------*/

    /* Called with dwc->lock held and bh disabled */
    @@ -314,9 +322,7 @@ static void dwc_complete_all(struct dw_dma *dw, struct dw_dma_chan *dwc)
    "BUG: XFER bit set, but channel not idle!\n");

    /* Try to continue after resetting the channel... */
    - channel_clear_bit(dw, CH_EN, dwc->mask);
    - while (dma_readl(dw, CH_EN) & dwc->mask)
    - cpu_relax();
    + dwc_chan_disable(dw, dwc);
    }

    /*
    @@ -398,9 +404,7 @@ static void dwc_scan_descriptors(struct dw_dma *dw, struct dw_dma_chan *dwc)
    "BUG: All descriptors done, but channel not idle!\n");

    /* Try to continue after resetting the channel... */
    - channel_clear_bit(dw, CH_EN, dwc->mask);
    - while (dma_readl(dw, CH_EN) & dwc->mask)
    - cpu_relax();
    + dwc_chan_disable(dw, dwc);

    if (!list_empty(&dwc->queue)) {
    list_move(dwc->queue.next, &dwc->active_list);
    @@ -516,9 +520,7 @@ static void dwc_handle_cyclic(struct dw_dma *dw, struct dw_dma_chan *dwc,

    dwc_dump_chan_regs(dwc);

    - channel_clear_bit(dw, CH_EN, dwc->mask);
    - while (dma_readl(dw, CH_EN) & dwc->mask)
    - cpu_relax();
    + dwc_chan_disable(dw, dwc);

    /* make sure DMA does not restart by loading a new list */
    channel_writel(dwc, LLP, 0);
    @@ -948,9 +950,7 @@ static int dwc_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd,
    } else if (cmd == DMA_TERMINATE_ALL) {
    spin_lock_irqsave(&dwc->lock, flags);

    - channel_clear_bit(dw, CH_EN, dwc->mask);
    - while (dma_readl(dw, CH_EN) & dwc->mask)
    - cpu_relax();
    + dwc_chan_disable(dw, dwc);

    dwc->paused = false;

    @@ -1158,9 +1158,7 @@ void dw_dma_cyclic_stop(struct dma_chan *chan)

    spin_lock_irqsave(&dwc->lock, flags);

    - channel_clear_bit(dw, CH_EN, dwc->mask);
    - while (dma_readl(dw, CH_EN) & dwc->mask)
    - cpu_relax();
    + dwc_chan_disable(dw, dwc);

    spin_unlock_irqrestore(&dwc->lock, flags);
    }
    @@ -1338,9 +1336,7 @@ void dw_dma_cyclic_free(struct dma_chan *chan)

    spin_lock_irqsave(&dwc->lock, flags);

    - channel_clear_bit(dw, CH_EN, dwc->mask);
    - while (dma_readl(dw, CH_EN) & dwc->mask)
    - cpu_relax();
    + dwc_chan_disable(dw, dwc);

    dma_writel(dw, CLEAR.ERROR, dwc->mask);
    dma_writel(dw, CLEAR.XFER, dwc->mask);
    --
    1.7.10


    \
     
     \ /
      Last update: 2012-06-19 14:41    [W:0.027 / U:121.888 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site