@@ -274,6 +274,24 @@ static u32 bcm2835_dma_prepare_cb_extra(struct bcm2835_chan *c,
return result;
}
+static inline bool need_src_incr(enum dma_transfer_direction direction)
+{
+ return direction != DMA_DEV_TO_MEM;
+}
+
+static inline bool need_dst_incr(enum dma_transfer_direction direction)
+{
+ switch (direction) {
+ case DMA_MEM_TO_MEM:
+ case DMA_DEV_TO_MEM:
+ return true;
+ default:
+ break;
+ }
+
+ return false;
+}
+
static void bcm2835_dma_free_cb_chain(struct bcm2835_desc *desc)
{
size_t i;
@@ -355,10 +373,8 @@ static inline size_t bcm2835_dma_count_frames_for_sg(struct bcm2835_chan *c,
* @cyclic: it is a cyclic transfer
* @info: the default info bits to apply per controlblock
* @frames: number of controlblocks to allocate
- * @src: the src address to assign (if the S_INC bit is set
- * in @info, then it gets incremented)
- * @dst: the dst address to assign (if the D_INC bit is set
- * in @info, then it gets incremented)
+ * @src: the src address to assign
+ * @dst: the dst address to assign
* @buf_len: the full buffer length (may also be 0)
* @period_len: the period length when to apply @finalextrainfo
* in addition to the last transfer
@@ -430,9 +446,9 @@ static struct bcm2835_desc *bcm2835_dma_create_cb_chain(
d->cb_list[frame - 1].cb->next = cb_entry->paddr;
/* update src and dst and length */
- if (src && (info & BCM2835_DMA_S_INC))
+ if (src && need_src_incr(direction))
src += control_block->length;
- if (dst && (info & BCM2835_DMA_D_INC))
+ if (dst && need_dst_incr(direction))
dst += control_block->length;
/* Length of total transfer */