[PATCH v6 04/15] DMA: PL330: Add DMA_CYCLIC capability
Boojin Kim
boojin.kim at samsung.com
Tue Aug 23 03:08:27 EDT 2011
Jassi Brar [mailto:jassisinghbrar at gmail.com]
> Sent: Tuesday, August 23, 2011 2:42 PM
> To: Boojin Kim
> Cc: linux-arm-kernel at lists.infradead.org; linux-samsung-
> soc at vger.kernel.org; Vinod Koul; Kukjin Kim; Dan Williams; Mark Brown;
> Grant Likely; Russell King
> Subject: Re: [PATCH v6 04/15] DMA: PL330: Add DMA_CYCLIC capability
>
> On Mon, Aug 22, 2011 at 5:33 PM, Boojin Kim <boojin.kim at samsung.com>
> wrote:
> >>
> >> > +static struct dma_async_tx_descriptor *pl330_prep_dma_cyclic(
> >> > + struct dma_chan *chan, dma_addr_t dma_addr, size_t
> len,
> >> > + size_t period_len, enum dma_data_direction
> direction)
> >> > +{
> >> > + struct dma_pl330_desc *desc;
> >> > + struct dma_pl330_chan *pch = to_pchan(chan);
> >> > + dma_addr_t dst;
> >> > + dma_addr_t src;
> >> > +
> >> > + desc = pl330_get_desc(pch);
> >> > + if (!desc) {
> >> > + dev_err(pch->dmac->pif.dev, "%s:%d Unable to fetch
> >> desc\n",
> >> > + __func__, __LINE__);
> >> > + return NULL;
> >> > + }
> >> > +
> >> > + switch (direction) {
> >> > + case DMA_TO_DEVICE:
> >> > + desc->rqcfg.src_inc = 1;
> >> > + desc->rqcfg.dst_inc = 0;
> >> > + src = dma_addr;
> >> > + dst = pch->fifo_addr;
> >> > + break;
> >> > + case DMA_FROM_DEVICE:
> >> > + desc->rqcfg.src_inc = 0;
> >> > + desc->rqcfg.dst_inc = 1;
> >> > + src = pch->fifo_addr;
> >> > + dst = dma_addr;
> >> > + break;
> >> > + default:
> >> > + dev_err(pch->dmac->pif.dev, "%s:%d Invalid dma
> >> direction\n",
> >> > + __func__, __LINE__);
> >> > + return NULL;
> >> > + }
> >> > +
> >> > + desc->rqcfg.brst_size = pch->burst_sz;
> >> > + desc->rqcfg.brst_len = 1;
> >> > +
> >> > + if (!pch->cyclic)
> >> > + pch->cyclic = CYCLIC_PREP;
> >> The need for check here seems suspicious.
> >> Is it really needed? If not, please remove it.
> > It's required because Cyclic operation is passed from CYCLIC_PREP to
> > CYCLIC_TRIGGER.
> I don't see why you need to differentiate between PREP and TRIGGER in
> cyclic mode. I think, you should simply have 'bool cyclic' instead of
> enum.
On cyclic mode, Pl330_tasklet() operation is changed according to the value of
'cyclic'.
In case of CYCLIC_PREP, Pl330_tasklet()operation is same with normal
operation.
In case of CYCLIC_TRIGGER, pl330_tasklet()reloads the done data into
work_list.
So, 'Cyclic' needs two status(CYCLIC_PREP and CYCLIC_TRIGGER) to distinguish
the operation on pl330_tasklet().
The sequence is following.
device_prep_dma_cyclic() -> set CYCLIC_PREP -> device_issue_pending() ->
Pl330_tasklet() with CYCLIC_PREP -> set CYCLIC_TRIGGER -> PL330 IRQ ->
Pl330_tasklet() with CYCLIC_TRIGGER.
Thanks
Boojin
More information about the linux-arm-kernel
mailing list