sh: Use the now generic SH-4 clear/copy page ops for all MMU platforms.

Now that the SH-4 page clear/copy ops are generic, they can be used for
all platforms with CONFIG_MMU=y. SH-5 remains the odd one out, but it too
will gradually be converted over to using this interface.

SH-3 platforms which do not contain aliases will see no impact from this
change, while aliasing SH-3 platforms will get the same interface as
SH-4.

Signed-off-by: Paul Mundt <lethal@linux-sh.org>
diff --git a/arch/sh/mm/Makefile_32 b/arch/sh/mm/Makefile_32
index 5c04bbb..62e2807 100644
--- a/arch/sh/mm/Makefile_32
+++ b/arch/sh/mm/Makefile_32
@@ -15,7 +15,7 @@
 obj-y			+= $(cache-y)
 
 mmu-y			:= tlb-nommu.o pg-nommu.o
-mmu-$(CONFIG_MMU)	:= fault_32.o tlbflush_32.o ioremap_32.o
+mmu-$(CONFIG_MMU)	:= fault_32.o tlbflush_32.o ioremap_32.o pg-mmu.o
 
 obj-y			+= $(mmu-y)
 obj-$(CONFIG_DEBUG_FS)	+= asids-debugfs.o
@@ -29,10 +29,6 @@
 tlb-$(CONFIG_CPU_SH4)		:= tlb-sh4.o
 tlb-$(CONFIG_CPU_HAS_PTEAEX)	:= tlb-pteaex.o
 obj-y				+= $(tlb-y)
-ifndef CONFIG_CACHE_OFF
-obj-$(CONFIG_CPU_SH4)		+= pg-sh4.o
-obj-$(CONFIG_SH7705_CACHE_32KB)	+= pg-sh4.o
-endif
 endif
 
 obj-$(CONFIG_HUGETLB_PAGE)	+= hugetlbpage.o
diff --git a/arch/sh/mm/cache-sh5.c b/arch/sh/mm/cache-sh5.c
index 8676209..3e2d732 100644
--- a/arch/sh/mm/cache-sh5.c
+++ b/arch/sh/mm/cache-sh5.c
@@ -831,4 +831,21 @@
 	else
 		sh64_clear_user_page_coloured(to, address);
 }
+
+void copy_to_user_page(struct vm_area_struct *vma, struct page *page,
+		       unsigned long vaddr, void *dst, const void *src,
+		       unsigned long len)
+{
+	flush_cache_page(vma, vaddr, page_to_pfn(page));
+	memcpy(dst, src, len);
+	flush_icache_user_range(vma, page, vaddr, len);
+}
+
+void copy_from_user_page(struct vm_area_struct *vma, struct page *page,
+			 unsigned long vaddr, void *dst, const void *src,
+			 unsigned long len)
+{
+	flush_cache_page(vma, vaddr, page_to_pfn(page));
+	memcpy(dst, src, len);
+}
 #endif
diff --git a/arch/sh/mm/pg-sh4.c b/arch/sh/mm/pg-mmu.c
similarity index 83%
rename from arch/sh/mm/pg-sh4.c
rename to arch/sh/mm/pg-mmu.c
index 4d93070..356d2cd 100644
--- a/arch/sh/mm/pg-sh4.c
+++ b/arch/sh/mm/pg-mmu.c
@@ -1,5 +1,5 @@
 /*
- * arch/sh/mm/pg-sh4.c
+ * arch/sh/mm/pg-mmu.c
  *
  * Copyright (C) 1999, 2000, 2002  Niibe Yutaka
  * Copyright (C) 2002 - 2009  Paul Mundt
@@ -22,11 +22,13 @@
 
 void __init kmap_coherent_init(void)
 {
+#if defined(CONFIG_CPU_SH4) || defined(CONFIG_SH7705_CACHE_32KB)
 	unsigned long vaddr;
 
 	/* cache the first coherent kmap pte */
 	vaddr = __fix_to_virt(FIX_CMAP_BEGIN);
 	kmap_coherent_pte = kmap_get_fixmap_pte(vaddr);
+#endif
 }
 
 static inline void *kmap_coherent(struct page *page, unsigned long addr)
@@ -62,13 +64,15 @@
 		       unsigned long vaddr, void *dst, const void *src,
 		       unsigned long len)
 {
-	if (page_mapped(page) && !test_bit(PG_dcache_dirty, &page->flags)) {
+	if (boot_cpu_data.dcache.n_aliases && page_mapped(page) &&
+	    !test_bit(PG_dcache_dirty, &page->flags)) {
 		void *vto = kmap_coherent(page, vaddr) + (vaddr & ~PAGE_MASK);
 		memcpy(vto, src, len);
 		kunmap_coherent(vto);
 	} else {
 		memcpy(dst, src, len);
-		set_bit(PG_dcache_dirty, &page->flags);
+		if (boot_cpu_data.dcache.n_aliases)
+			set_bit(PG_dcache_dirty, &page->flags);
 	}
 
 	if (vma->vm_flags & VM_EXEC)
@@ -79,13 +83,15 @@
 			 unsigned long vaddr, void *dst, const void *src,
 			 unsigned long len)
 {
-	if (page_mapped(page) && !test_bit(PG_dcache_dirty, &page->flags)) {
+	if (boot_cpu_data.dcache.n_aliases && page_mapped(page) &&
+	    !test_bit(PG_dcache_dirty, &page->flags)) {
 		void *vfrom = kmap_coherent(page, vaddr) + (vaddr & ~PAGE_MASK);
 		memcpy(dst, vfrom, len);
 		kunmap_coherent(vfrom);
 	} else {
 		memcpy(dst, src, len);
-		set_bit(PG_dcache_dirty, &page->flags);
+		if (boot_cpu_data.dcache.n_aliases)
+			set_bit(PG_dcache_dirty, &page->flags);
 	}
 }
 
@@ -96,7 +102,8 @@
 
 	vto = kmap_atomic(to, KM_USER1);
 
-	if (page_mapped(from) && !test_bit(PG_dcache_dirty, &from->flags)) {
+	if (boot_cpu_data.dcache.n_aliases && page_mapped(from) &&
+	    !test_bit(PG_dcache_dirty, &from->flags)) {
 		vfrom = kmap_coherent(from, vaddr);
 		copy_page(vto, vfrom);
 		kunmap_coherent(vfrom);