|
@@ -532,6 +532,15 @@ static void jz4780_dma_begin(struct jz4780_dma_chan *jzchan)
|
|
|
jz4780_dma_chn_writel(jzdma, jzchan->id, JZ_DMA_REG_DRT,
|
|
|
jzchan->transfer_type);
|
|
|
|
|
|
+ /*
|
|
|
+ * Set the transfer count. This is redundant for a descriptor-driven
|
|
|
+ * transfer. However, there can be a delay between the transfer start
|
|
|
+ * time and when DTCn reg contains the new transfer count. Setting
|
|
|
+ * it explicitly ensures residue is computed correctly at all times.
|
|
|
+ */
|
|
|
+ jz4780_dma_chn_writel(jzdma, jzchan->id, JZ_DMA_REG_DTC,
|
|
|
+ jzchan->desc->desc[jzchan->curr_hwdesc].dtc);
|
|
|
+
|
|
|
/* Write descriptor address and initiate descriptor fetch. */
|
|
|
desc_phys = jzchan->desc->desc_phys +
|
|
|
(jzchan->curr_hwdesc * sizeof(*jzchan->desc->desc));
|