Message ID | 20240524182702.1317935-7-dave.stevenson@raspberrypi.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | BCM2835 DMA mapping cleanups and fixes | expand |
On Fri, May 24, 2024 at 07:26:50PM +0100, Dave Stevenson wrote: > From: Stefan Wahren <stefan.wahren@i2se.com> > > Actually the criteria to increment source & destination address doesn't > based on platform specific bits. It's just the DMA transfer direction which > is translated into the info bits. So introduce two new helper functions > and get the rid of these platform specifics. > Fix increment source & destination address depend on the platform drvdata. It should be depend on dma_transfer_direction. look like it is bug fixes. Can you add fixes tag. > Signed-off-by: Stefan Wahren <wahrenst@gmx.net> > Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com> > --- > drivers/dma/bcm2835-dma.c | 28 ++++++++++++++++++++++------ > 1 file changed, 22 insertions(+), 6 deletions(-) > > diff --git a/drivers/dma/bcm2835-dma.c b/drivers/dma/bcm2835-dma.c > index ef452ebb3c15..d6c5a2762a46 100644 > --- a/drivers/dma/bcm2835-dma.c > +++ b/drivers/dma/bcm2835-dma.c > @@ -252,6 +252,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; > @@ -336,10 +354,8 @@ static inline size_t bcm2835_dma_count_frames_for_sg( > * @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 > @@ -408,9 +424,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 */ > -- > 2.34.1 >
diff --git a/drivers/dma/bcm2835-dma.c b/drivers/dma/bcm2835-dma.c index ef452ebb3c15..d6c5a2762a46 100644 --- a/drivers/dma/bcm2835-dma.c +++ b/drivers/dma/bcm2835-dma.c @@ -252,6 +252,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; @@ -336,10 +354,8 @@ static inline size_t bcm2835_dma_count_frames_for_sg( * @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 @@ -408,9 +424,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 */