lkml.org 
[lkml]   [2012]   [Sep]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 02/15] dmaengine: omap: Add support for pause/resume in cyclic dma mode
    Date
    The audio stack used omap_stop_dma/omap_start_dma to pause/resume the DMA.
    This method has been used for years on OMAP based products.
    We only allow pause/resume when the DMA has been configured in cyclic mode
    which is used by the audio stack.

    Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
    CC: Russell King <rmk+kernel@arm.linux.org.uk>
    ---
    drivers/dma/omap-dma.c | 30 +++++++++++++++++++++++++-----
    1 file changed, 25 insertions(+), 5 deletions(-)

    diff --git a/drivers/dma/omap-dma.c b/drivers/dma/omap-dma.c
    index b77a40d..71d7869 100644
    --- a/drivers/dma/omap-dma.c
    +++ b/drivers/dma/omap-dma.c
    @@ -34,6 +34,7 @@ struct omap_chan {
    struct dma_slave_config cfg;
    unsigned dma_sig;
    bool cyclic;
    + bool paused;

    int dma_ch;
    struct omap_desc *desc;
    @@ -470,11 +471,14 @@ static int omap_dma_terminate_all(struct omap_chan *c)
    */
    if (c->desc) {
    c->desc = NULL;
    - omap_stop_dma(c->dma_ch);
    + /* Avoid stopping the dma twice */
    + if (!c->paused)
    + omap_stop_dma(c->dma_ch);
    }

    if (c->cyclic) {
    c->cyclic = false;
    + c->paused = false;
    omap_dma_unlink_lch(c->dma_ch, c->dma_ch);
    }

    @@ -487,14 +491,30 @@ static int omap_dma_terminate_all(struct omap_chan *c)

    static int omap_dma_pause(struct omap_chan *c)
    {
    - /* FIXME: not supported by platform private API */
    - return -EINVAL;
    + /* Pause/Resume only allowed with cyclic mode */
    + if (!c->cyclic)
    + return -EINVAL;
    +
    + if (!c->paused) {
    + omap_stop_dma(c->dma_ch);
    + c->paused = true;
    + }
    +
    + return 0;
    }

    static int omap_dma_resume(struct omap_chan *c)
    {
    - /* FIXME: not supported by platform private API */
    - return -EINVAL;
    + /* Pause/Resume only allowed with cyclic mode */
    + if (!c->cyclic)
    + return -EINVAL;
    +
    + if (c->paused) {
    + omap_start_dma(c->dma_ch);
    + c->paused = false;
    + }
    +
    + return 0;
    }

    static int omap_dma_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd,
    --
    1.7.12


    \
     
     \ /
      Last update: 2012-09-14 14:41    [W:0.024 / U:0.544 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site