lkml.org 
[lkml]   [2012]   [Jan]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [PATCH 1/7 v2] dmaengine: add a simple dma library
    Hello Guennadi-san,

    2012/01/26 23:56, Guennadi Liakhovetski wrote:
    > This patch adds a library of functions, helping to implement dmaengine
    > drivers for hardware, unable to handle scatter-gather lists natively.
    > The first version of this driver only supports memcpy and slave DMA
    > operation.
    >
    > Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
    > ---
    >
    > v2:
    >
    > 1. switch from using a tasklet to threaded IRQ, which allowed to

    I tested this driver on 2 environment, but it could not work correctly.
    - renesas_usbhs driver with shdma driver on the mackerel board
    - renesas_usbhs driver with experimental SUDMAC driver

    In this case, should we modify the renesas_usbhs driver?
    For reference, if I changed the threaded IRQ to tasklet,
    the 2 environment worked correctly:
    ==============
    diff --git a/drivers/dma/dma-simple.c b/drivers/dma/dma-simple.c
    index 49d8f7d..65a5170 100644
    --- a/drivers/dma/dma-simple.c
    +++ b/drivers/dma/dma-simple.c
    @@ -715,16 +715,18 @@ static irqreturn_t chan_irq(int irq, void *dev)

    spin_lock(&schan->chan_lock);

    - ret = ops->chan_irq(schan, irq) ? IRQ_WAKE_THREAD : IRQ_NONE;
    + ret = ops->chan_irq(schan, irq) ? IRQ_HANDLED : IRQ_NONE;
    + if (ret == IRQ_HANDLED)
    + tasklet_schedule(&schan->tasklet);

    spin_unlock(&schan->chan_lock);

    return ret;
    }

    -static irqreturn_t chan_irqt(int irq, void *dev)
    +static void chan_irqt(unsigned long dev)
    {
    - struct dma_simple_chan *schan = dev;
    + struct dma_simple_chan *schan = (struct dma_simple_chan *)dev;
    const struct dma_simple_ops *ops =
    to_simple_dev(schan->dma_chan.device)->ops;
    struct dma_simple_desc *sdesc;
    @@ -744,15 +746,13 @@ static irqreturn_t chan_irqt(int irq, void *dev)
    spin_unlock_irq(&schan->chan_lock);

    simple_chan_ld_cleanup(schan, false);
    -
    - return IRQ_HANDLED;
    }

    int dma_simple_request_irq(struct dma_simple_chan *schan, int irq,
    unsigned long flags, const char *name)
    {
    - int ret = request_threaded_irq(irq, chan_irq, chan_irqt,
    - flags, name, schan);
    + int ret = request_irq(irq, chan_irq, flags, name, schan);
    + tasklet_init(&schan->tasklet, chan_irqt, (unsigned long)schan);

    schan->irq = ret < 0 ? ret : irq;

    diff --git a/include/linux/dma-simple.h b/include/linux/dma-simple.h
    index 5336674..beb1489 100644
    --- a/include/linux/dma-simple.h
    +++ b/include/linux/dma-simple.h
    @@ -68,6 +68,7 @@ struct dma_simple_chan {
    int id; /* Raw id of this channel */
    int irq; /* Channel IRQ */
    enum dma_simple_pm_state pm_state;
    + struct tasklet_struct tasklet;
    };

    /**
    ==============
    Best regards,
    Yoshihiro Shimoda


    \
     
     \ /
      Last update: 2012-01-27 09:39    [W:0.035 / U:0.224 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site