[PATCH v6 04/15] DMA: PL330: Add DMA_CYCLIC capability
From: Boojin Kim <hidden>
Date: 2011-08-23 23:28:59
Also in:
linux-samsung-soc
Jassi Brar wrote:
On Tue, Aug 23, 2011 at 12:38 PM, Boojin Kim [off-list ref] wrote:quoted
Jassi Brar [mailto:jassisinghbrar at gmail.com]quoted
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; MarkBrown;quoted
quoted
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[off-list ref]quoted
quoted
wrote:quoted
quoted
quoted
+static struct dma_async_tx_descriptor *pl330_prep_dma_cyclic( + struct dma_chan *chan, dma_addr_t dma_addr,size_tquoted
quoted
len,quoted
quoted
quoted
+ size_t period_len, enum dma_data_directiondirection)quoted
quoted
quoted
+{ + 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 tofetchquoted
quoted
quoted
quoted
desc\n",quoted
+ __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 dmadirection\n",quoted
+ __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_PREPtoquoted
quoted
quoted
CYCLIC_TRIGGER.I don't see why you need to differentiate between PREP and TRIGGERinquoted
quoted
cyclic mode. I think, you should simply have 'bool cyclic' insteadofquoted
quoted
enum.On cyclic mode, Pl330_tasklet() operation is changed according tothe value ofquoted
'cyclic'. In case of CYCLIC_PREP, Pl330_tasklet()operation is same with normal operation.By 'normal' you mean non-cyclic, right? That doesn't seem correct to do. Once the desc has been marked cyclic by device_prep_dma_cyclic(), you shouldn't treat it like a non-cyclic anymore.quoted
The sequence is following. device_prep_dma_cyclic() -> set CYCLIC_PREP -> device_issue_pending()->quoted
Pl330_tasklet() with CYCLIC_PREP -> set CYCLIC_TRIGGER -> PL330 IRQ->quoted
Pl330_tasklet() with CYCLIC_TRIGGER."device_issue_pending() ->Pl330_tasklet() with CYCLIC_PREP" is no different from "device_issue_pending() ->Pl330_tasklet() with CYCLIC_TRIGGER" because the list of 'done' xfers would be null yet.
Okay, You're right. CYCLIC_PREP is a redundancy status. I will address your comment. Thanks Boojin Kim