sh: Add SH-5 support to the consistent DMA impl.

Signed-off-by: Paul Mundt <lethal@linux-sh.org>
diff --git a/arch/sh/mm/consistent.c b/arch/sh/mm/consistent.c
index e220c29..65ad300 100644
--- a/arch/sh/mm/consistent.c
+++ b/arch/sh/mm/consistent.c
@@ -1,7 +1,7 @@
 /*
  * arch/sh/mm/consistent.c
  *
- * Copyright (C) 2004  Paul Mundt
+ * Copyright (C) 2004 - 2007  Paul Mundt
  *
  * This file is subject to the terms and conditions of the GNU General Public
  * License.  See the file "COPYING" in the main directory of this archive
@@ -16,7 +16,7 @@
 void *consistent_alloc(gfp_t gfp, size_t size, dma_addr_t *handle)
 {
 	struct page *page, *end, *free;
-	void *ret;
+	void *ret, *vp;
 	int order;
 
 	size = PAGE_ALIGN(size);
@@ -28,13 +28,20 @@
 	split_page(page, order);
 
 	ret = page_address(page);
-	memset(ret, 0, size);
 	*handle = virt_to_phys(ret);
 
+	vp = ioremap_nocache(*handle, size);
+	if (!vp) {
+		free_pages((unsigned long)ret, order);
+		return NULL;
+	}
+
+	memset(vp, 0, size);
+
 	/*
 	 * We must flush the cache before we pass it on to the device
 	 */
-	__flush_purge_region(ret, size);
+	dma_cache_sync(NULL, ret, size, DMA_BIDIRECTIONAL);
 
 	page = virt_to_page(ret);
 	free = page + (size >> PAGE_SHIFT);
@@ -47,24 +54,31 @@
 		}
 	}
 
-	return P2SEGADDR(ret);
+	return vp;
 }
+EXPORT_SYMBOL(consistent_alloc);
 
-void consistent_free(void *vaddr, size_t size)
+void consistent_free(void *vaddr, size_t size, dma_addr_t dma_handle)
 {
-	unsigned long addr = P1SEGADDR((unsigned long)vaddr);
-	struct page *page=virt_to_page(addr);
-	int num_pages=(size+PAGE_SIZE-1) >> PAGE_SHIFT;
-	int i;
+	struct page *page;
+	unsigned long addr;
 
-	for(i=0;i<num_pages;i++) {
-		__free_page((page+i));
-	}
+	addr = (unsigned long)phys_to_virt((unsigned long)dma_handle);
+	page = virt_to_page(addr);
+
+	free_pages(addr, get_order(size));
+
+	iounmap(vaddr);
 }
+EXPORT_SYMBOL(consistent_free);
 
 void consistent_sync(void *vaddr, size_t size, int direction)
 {
-	void * p1addr = (void*) P1SEGADDR((unsigned long)vaddr);
+#ifdef CONFIG_CPU_SH5
+	void *p1addr = vaddr;
+#else
+	void *p1addr = (void*) P1SEGADDR((unsigned long)vaddr);
+#endif
 
 	switch (direction) {
 	case DMA_FROM_DEVICE:		/* invalidate only */
@@ -80,8 +94,4 @@
 		BUG();
 	}
 }
-
-EXPORT_SYMBOL(consistent_alloc);
-EXPORT_SYMBOL(consistent_free);
 EXPORT_SYMBOL(consistent_sync);
-
diff --git a/include/asm-sh/dma-mapping.h b/include/asm-sh/dma-mapping.h
index fcea067..20ae762 100644
--- a/include/asm-sh/dma-mapping.h
+++ b/include/asm-sh/dma-mapping.h
@@ -10,7 +10,7 @@
 
 /* arch/sh/mm/consistent.c */
 extern void *consistent_alloc(gfp_t gfp, size_t size, dma_addr_t *handle);
-extern void consistent_free(void *vaddr, size_t size);
+extern void consistent_free(void *vaddr, size_t size, dma_addr_t handle);
 extern void consistent_sync(void *vaddr, size_t size, int direction);
 
 #define dma_supported(dev, mask)	(1)
@@ -50,7 +50,7 @@
 			return;
 	}
 
-	consistent_free(vaddr, size);
+	consistent_free(vaddr, size, dma_handle);
 }
 
 #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)