summaryrefslogtreecommitdiffstats
path: root/drivers/dma/map.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/dma/map.c')
-rw-r--r--drivers/dma/map.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/drivers/dma/map.c b/drivers/dma/map.c
new file mode 100644
index 0000000000..a3e1b3b5b5
--- /dev/null
+++ b/drivers/dma/map.c
@@ -0,0 +1,42 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/* SPDX-FileCopyrightText: 2012 Marc Kleine-Budde <mkl@pengutronix.de> */
+
+#include <dma.h>
+
+static inline dma_addr_t cpu_to_dma(struct device_d *dev, unsigned long cpu_addr)
+{
+ dma_addr_t dma_addr = cpu_addr;
+
+ if (dev)
+ dma_addr -= dev->dma_offset;
+
+ return dma_addr;
+}
+
+static inline unsigned long dma_to_cpu(struct device_d *dev, dma_addr_t addr)
+{
+ unsigned long cpu_addr = addr;
+
+ if (dev)
+ cpu_addr += dev->dma_offset;
+
+ return cpu_addr;
+}
+
+dma_addr_t dma_map_single(struct device_d *dev, void *ptr, size_t size,
+ enum dma_data_direction dir)
+{
+ unsigned long addr = (unsigned long)ptr;
+
+ dma_sync_single_for_device(addr, size, dir);
+
+ return cpu_to_dma(dev, addr);
+}
+
+void dma_unmap_single(struct device_d *dev, dma_addr_t dma_addr, size_t size,
+ enum dma_data_direction dir)
+{
+ unsigned long addr = dma_to_cpu(dev, dma_addr);
+
+ dma_sync_single_for_cpu(addr, size, dir);
+}