2.2. pl08x_set_cregs

/*
 * 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_base1 = (unsigned int)pd.base
					+ PL08X_OS_CHAN_BASE;
	chan_base += pl08x_chan_num * PL08X_OS_CHAN;

	/* Wait for channel inactive */2
	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();
}
        

1

找到当前使用的channel的基地址

2

如果之前正有人用此channel的DMA,就等待直到不在用,即inactive为止

注意,此处没有直接去Halt或者disable对应的channel,因为有可能之前的某个DMA正在传输过程中,所以应该等待其完成,当然,大多数情况都是已经是inactive了