/*
* Set the initial DMA register values i.e. those for the first LLI
* The next lli pointer and the configuration interrupt bit have
* been set when the LLIs were constructed
*/
void pl08x_set_cregs(struct pl08x_txd *entry, int pl08x_chan_num)
{
unsigned int reg;
unsigned int chan_base = (unsigned int)pd.base
+ PL08X_OS_CHAN_BASE;
chan_base += pl08x_chan_num * PL08X_OS_CHAN;
/* Wait for channel inactive */
reg = readl(chan_base + PL08X_OS_CCFG);
while (reg & PL08X_MASK_ACTIVE)
reg = readl(chan_base + PL08X_OS_CCFG);
writel(entry->csrc, chan_base + PL08X_OS_CSRC);
writel(entry->cdst, chan_base + PL08X_OS_CDST);
writel(entry->clli, chan_base + PL08X_OS_CLLI);
writel(entry->cctl, chan_base + PL08X_OS_CCTL);
writel(entry->ccfg, chan_base + PL08X_OS_CCFG);
mb();
}
| 找到当前使用的channel的基地址 |
| 如果之前正有人用此channel的DMA,就等待直到不在用,即inactive为止 注意,此处没有直接去Halt或者disable对应的channel,因为有可能之前的某个DMA正在传输过程中,所以应该等待其完成,当然,大多数情况都是已经是inactive了 |