Merge branch 'mm-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-block.git] / drivers / base / dma-coherent.c
index 87b8083748885592c8da34f2defa4a1b46be0be5..bdf28f7dd5e8638bfee9f522aef1cbfa71b89cbf 100644 (file)
@@ -2,6 +2,7 @@
  * Coherent per-device memory handling.
  * Borrowed from i386
  */
+#include <linux/io.h>
 #include <linux/slab.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
@@ -31,7 +32,10 @@ static bool dma_init_coherent_memory(
        if (!size)
                goto out;
 
-       mem_base = ioremap(phys_addr, size);
+       if (flags & DMA_MEMORY_MAP)
+               mem_base = memremap(phys_addr, size, MEMREMAP_WC);
+       else
+               mem_base = ioremap(phys_addr, size);
        if (!mem_base)
                goto out;
 
@@ -54,8 +58,12 @@ static bool dma_init_coherent_memory(
 
 out:
        kfree(dma_mem);
-       if (mem_base)
-               iounmap(mem_base);
+       if (mem_base) {
+               if (flags & DMA_MEMORY_MAP)
+                       memunmap(mem_base);
+               else
+                       iounmap(mem_base);
+       }
        return false;
 }
 
@@ -63,7 +71,11 @@ static void dma_release_coherent_memory(struct dma_coherent_mem *mem)
 {
        if (!mem)
                return;
-       iounmap(mem->virt_base);
+
+       if (mem->flags & DMA_MEMORY_MAP)
+               memunmap(mem->virt_base);
+       else
+               iounmap(mem->virt_base);
        kfree(mem->bitmap);
        kfree(mem);
 }
@@ -175,7 +187,10 @@ int dma_alloc_from_coherent(struct device *dev, ssize_t size,
         */
        *dma_handle = mem->device_base + (pageno << PAGE_SHIFT);
        *ret = mem->virt_base + (pageno << PAGE_SHIFT);
-       memset(*ret, 0, size);
+       if (mem->flags & DMA_MEMORY_MAP)
+               memset(*ret, 0, size);
+       else
+               memset_io(*ret, 0, size);
        spin_unlock_irqrestore(&mem->spinlock, flags);
 
        return 1;