@@ -283,9 +283,23 @@ static int bcm2835_dma_map_slave_addr(struct dma_chan *chan,
struct bcm2835_chan *c = to_bcm2835_dma_chan(chan);
struct bcm2835_dma_chan_map *map = &c->map;
- map->addr = dev_addr;
+ if ((dev_addr & 0xfe000000ULL) == 0x7e000000ULL) {
+ /*
+ * Address is already in the 0x7e... peripherals range.
+ * Assume this is an old client that hasn't been updated to
+ * correctly pass a cpu phys_addr to the DMA subsystem.
+ */
+ map->addr = dev_addr;
- return 0;
+ return 0;
+ }
+
+ /*
+ * This path will be updated to handle new clients, but currently should
+ * never be used.
+ */
+
+ return -EINVAL;
}
static void bcm2835_dma_free_cb_chain(struct bcm2835_desc *desc)
bcm2835-dma has been (incorrectly) expecting dma addresses to be passed in, not CPU physical addresses. In order to fix this up, add temporary handling of clients still passing in dma addresses until they are fixed up. This will be reverted once all clients have been fixed. Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com> --- drivers/dma/bcm2835-dma.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-)