mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-26 00:41:17 +00:00
74 lines
2.6 KiB
Diff
74 lines
2.6 KiB
Diff
|
From 6d317d92627736a94e6c1c4b49c3f63cc33c28aa Mon Sep 17 00:00:00 2001
|
||
|
From: Phil Elwell <phil@raspberrypi.com>
|
||
|
Date: Thu, 11 May 2023 10:00:01 +0100
|
||
|
Subject: [PATCH] bcm2835-dma: Derive slave DMA addresses correctly
|
||
|
|
||
|
Slave addresses for DMA are meant to be supplied as physical addresses
|
||
|
(contrary to what struct snd_dmaengine_dai_dma_data does). It is up to
|
||
|
the DMA controller driver to perform the translation based on its own
|
||
|
view of the world, as described in Device Tree.
|
||
|
|
||
|
Now that the Pi Device Trees have the correct peripheral mappings,
|
||
|
replace the hacky address munging with phys_to_dma().
|
||
|
|
||
|
Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||
|
---
|
||
|
drivers/dma/bcm2835-dma.c | 23 +++++------------------
|
||
|
1 file changed, 5 insertions(+), 18 deletions(-)
|
||
|
|
||
|
--- a/drivers/dma/bcm2835-dma.c
|
||
|
+++ b/drivers/dma/bcm2835-dma.c
|
||
|
@@ -18,6 +18,7 @@
|
||
|
* Copyright 2012 Marvell International Ltd.
|
||
|
*/
|
||
|
#include <linux/dmaengine.h>
|
||
|
+#include <linux/dma-direct.h>
|
||
|
#include <linux/dma-mapping.h>
|
||
|
#include <linux/dmapool.h>
|
||
|
#include <linux/err.h>
|
||
|
@@ -910,22 +911,12 @@ static struct dma_async_tx_descriptor *b
|
||
|
if (direction == DMA_DEV_TO_MEM) {
|
||
|
if (c->cfg.src_addr_width != DMA_SLAVE_BUSWIDTH_4_BYTES)
|
||
|
return NULL;
|
||
|
- src = c->cfg.src_addr;
|
||
|
- /*
|
||
|
- * One would think it ought to be possible to get the physical
|
||
|
- * to dma address mapping information from the dma-ranges DT
|
||
|
- * property, but I've not found a way yet that doesn't involve
|
||
|
- * open-coding the whole thing.
|
||
|
- */
|
||
|
- if (c->is_40bit_channel)
|
||
|
- src |= 0x400000000ull;
|
||
|
+ src = phys_to_dma(chan->device->dev, c->cfg.src_addr);
|
||
|
info |= BCM2835_DMA_S_DREQ | BCM2835_DMA_D_INC;
|
||
|
} else {
|
||
|
if (c->cfg.dst_addr_width != DMA_SLAVE_BUSWIDTH_4_BYTES)
|
||
|
return NULL;
|
||
|
- dst = c->cfg.dst_addr;
|
||
|
- if (c->is_40bit_channel)
|
||
|
- dst |= 0x400000000ull;
|
||
|
+ dst = phys_to_dma(chan->device->dev, c->cfg.dst_addr);
|
||
|
info |= BCM2835_DMA_D_DREQ | BCM2835_DMA_S_INC;
|
||
|
}
|
||
|
|
||
|
@@ -994,17 +985,13 @@ static struct dma_async_tx_descriptor *b
|
||
|
if (direction == DMA_DEV_TO_MEM) {
|
||
|
if (c->cfg.src_addr_width != DMA_SLAVE_BUSWIDTH_4_BYTES)
|
||
|
return NULL;
|
||
|
- src = c->cfg.src_addr;
|
||
|
- if (c->is_40bit_channel)
|
||
|
- src |= 0x400000000ull;
|
||
|
+ src = phys_to_dma(chan->device->dev, c->cfg.src_addr);
|
||
|
dst = buf_addr;
|
||
|
info |= BCM2835_DMA_S_DREQ | BCM2835_DMA_D_INC;
|
||
|
} else {
|
||
|
if (c->cfg.dst_addr_width != DMA_SLAVE_BUSWIDTH_4_BYTES)
|
||
|
return NULL;
|
||
|
- dst = c->cfg.dst_addr;
|
||
|
- if (c->is_40bit_channel)
|
||
|
- dst |= 0x400000000ull;
|
||
|
+ dst = phys_to_dma(chan->device->dev, c->cfg.dst_addr);
|
||
|
src = buf_addr;
|
||
|
info |= BCM2835_DMA_D_DREQ | BCM2835_DMA_S_INC;
|
||
|
|