xtensa: mm: convert to GENERIC_IOREMAP
[linux-2.6-microblaze.git] / arch / xtensa / mm / ioremap.c
index a400188..8ca660b 100644 (file)
@@ -6,60 +6,30 @@
  */
 
 #include <linux/io.h>
-#include <linux/vmalloc.h>
 #include <linux/pgtable.h>
 #include <asm/cacheflush.h>
 #include <asm/io.h>
 
-static void __iomem *xtensa_ioremap(unsigned long paddr, unsigned long size,
-                                   pgprot_t prot)
+void __iomem *ioremap_prot(phys_addr_t phys_addr, size_t size,
+                          unsigned long prot)
 {
-       unsigned long offset = paddr & ~PAGE_MASK;
-       unsigned long pfn = __phys_to_pfn(paddr);
-       struct vm_struct *area;
-       unsigned long vaddr;
-       int err;
-
-       paddr &= PAGE_MASK;
-
+       unsigned long pfn = __phys_to_pfn((phys_addr));
        WARN_ON(pfn_valid(pfn));
 
-       size = PAGE_ALIGN(offset + size);
-
-       area = get_vm_area(size, VM_IOREMAP);
-       if (!area)
-               return NULL;
-
-       vaddr = (unsigned long)area->addr;
-       area->phys_addr = paddr;
-
-       err = ioremap_page_range(vaddr, vaddr + size, paddr, prot);
-
-       if (err) {
-               vunmap((void *)vaddr);
-               return NULL;
-       }
-
-       flush_cache_vmap(vaddr, vaddr + size);
-       return (void __iomem *)(offset + vaddr);
-}
-
-void __iomem *xtensa_ioremap_nocache(unsigned long addr, unsigned long size)
-{
-       return xtensa_ioremap(addr, size, pgprot_noncached(PAGE_KERNEL));
+       return generic_ioremap_prot(phys_addr, size, __pgprot(prot));
 }
-EXPORT_SYMBOL(xtensa_ioremap_nocache);
+EXPORT_SYMBOL(ioremap_prot);
 
-void __iomem *xtensa_ioremap_cache(unsigned long addr, unsigned long size)
+void iounmap(volatile void __iomem *addr)
 {
-       return xtensa_ioremap(addr, size, PAGE_KERNEL);
-}
-EXPORT_SYMBOL(xtensa_ioremap_cache);
+       unsigned long va = (unsigned long) addr;
 
-void xtensa_iounmap(volatile void __iomem *io_addr)
-{
-       void *addr = (void *)(PAGE_MASK & (unsigned long)io_addr);
+       if ((va >= XCHAL_KIO_CACHED_VADDR &&
+             va - XCHAL_KIO_CACHED_VADDR < XCHAL_KIO_SIZE) ||
+           (va >= XCHAL_KIO_BYPASS_VADDR &&
+             va - XCHAL_KIO_BYPASS_VADDR < XCHAL_KIO_SIZE))
+               return;
 
-       vunmap(addr);
+       generic_iounmap(addr);
 }
-EXPORT_SYMBOL(xtensa_iounmap);
+EXPORT_SYMBOL(iounmap);