[PATCH v4 06/18] dmaengine: st_fdma: Add STMicroelectronics FDMA engine driver support
Peter Griffin
peter.griffin at linaro.org
Mon Jun 6 10:38:44 PDT 2016
Hi Vinod,
Thanks for reviewing v4 series.
On Mon, 06 Jun 2016, Vinod Koul wrote:
> On Wed, May 25, 2016 at 05:06:40PM +0100, Peter Griffin wrote:
>
> > @@ -527,6 +527,18 @@ config ZX_DMA
> > help
> > Support the DMA engine for ZTE ZX296702 platform devices.
> >
> > +config ST_FDMA
> > + tristate "ST FDMA dmaengine support"
> > + depends on ARCH_STI || COMPILE_TEST
> > + depends on ST_XP70_REMOTEPROC
> > + select DMA_ENGINE
> > + select DMA_VIRTUAL_CHANNELS
> > + help
> > + Enable support for ST FDMA controller.
> > + It supports 16 independent DMA channels, accepts up to 32 DMA requests
> > +
> > + Say Y here if you have such a chipset.
> > + If unsure, say N.
>
> Alphabetical order in Kconfig and makefile please...
OK, will fix in v5.
>
> > +#include <linux/init.h>
> > +#include <linux/module.h>
> > +#include <linux/slab.h>
> > +#include <linux/of.h>
> > +#include <linux/of_device.h>
> > +#include <linux/of_dma.h>
> > +#include <linux/platform_device.h>
> > +#include <linux/interrupt.h>
> > +#include <linux/clk.h>
> > +#include <linux/dmaengine.h>
> > +#include <linux/dmapool.h>
> > +#include <linux/firmware.h>
> > +#include <linux/elf.h>
> > +#include <linux/atomic.h>
> > +#include <linux/remoteproc.h>
> > +#include <linux/io.h>
>
> that seems to be quite a lot of headers, am sure some of them are not
> required..
Yes your right this hasn't kept aligned with the driver changes through the
various submissions. I will prune the headers in v5.
>
>
> > +static int st_fdma_dreq_get(struct st_fdma_chan *fchan)
> > +{
> > + struct st_fdma_dev *fdev = fchan->fdev;
> > + u32 req_line_cfg = fchan->cfg.req_line;
> > + u32 dreq_line;
> > + int try = 0;
> > +
> > + /*
> > + * dreq_mask is shared for n channels of fdma, so all accesses must be
> > + * atomic. if the dreq_mask it change between ffz ant set_bit,
>
> s/ant/and
Will fix in v5.
>
> > + switch (ch_sta) {
> > + case FDMA_CH_CMD_STA_PAUSED:
> > + fchan->status = DMA_PAUSED;
> > + break;
>
> empty line here please
Fixed in v5.
>
> > +static void st_fdma_free_chan_res(struct dma_chan *chan)
> > +{
> > + struct st_fdma_chan *fchan = to_st_fdma_chan(chan);
> > + unsigned long flags;
> > +
> > + LIST_HEAD(head);
> > +
> > + dev_dbg(fchan->fdev->dev, "%s: freeing chan:%d\n",
> > + __func__, fchan->vchan.chan.chan_id);
> > +
> > + if (fchan->cfg.type != ST_FDMA_TYPE_FREE_RUN)
> > + st_fdma_dreq_put(fchan);
> > +
> > + spin_lock_irqsave(&fchan->vchan.lock, flags);
> > + fchan->fdesc = NULL;
> > + vchan_get_all_descriptors(&fchan->vchan, &head);
>
> and what are you doing with all these descriptors?
Looks like a copy/paste error from terminate_all(). Will fix in v5.
>
> > + spin_unlock_irqrestore(&fchan->vchan.lock, flags);
> > +
> > + dma_pool_destroy(fchan->node_pool);
> > + fchan->node_pool = NULL;
> > + memset(&fchan->cfg, 0, sizeof(struct st_fdma_cfg));
> > +
> > + rproc_shutdown(fchan->fdev->rproc);
> > +}
>
> > +static enum dma_status st_fdma_tx_status(struct dma_chan *chan,
> > + dma_cookie_t cookie,
> > + struct dma_tx_state *txstate)
> > +{
> > + struct st_fdma_chan *fchan = to_st_fdma_chan(chan);
> > + struct virt_dma_desc *vd;
> > + enum dma_status ret;
> > + unsigned long flags;
> > +
> > + ret = dma_cookie_status(chan, cookie, txstate);
> > + if (ret == DMA_COMPLETE)
>
> check for txtstate here, that can be NULL and in that case no need to
> calculate residue
Will fix in v5.
>
> > +
> > + dma_cap_set(DMA_SLAVE, fdev->dma_device.cap_mask);
>
> why slave, you only support cyclic
No, we also support device_prep_slave_sg().
>
> > + dma_cap_set(DMA_CYCLIC, fdev->dma_device.cap_mask);
> > + dma_cap_set(DMA_MEMCPY, fdev->dma_device.cap_mask);
>
>
> helps to print the 'ret' too
Will fix in v5.
regards,
Peter
More information about the linux-arm-kernel
mailing list