linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / arch / parisc / mm / ioremap.c
index 2738456..edd9a95 100644 (file)
@@ -2,7 +2,7 @@
  * arch/parisc/mm/ioremap.c
  *
  * (C) Copyright 1995 1996 Linus Torvalds
- * (C) Copyright 2001-2006 Helge Deller <deller@gmx.de>
+ * (C) Copyright 2001 Helge Deller <deller@gmx.de>
  * (C) Copyright 2005 Kyle McMartin <kyle@parisc-linux.org>
  */
 
@@ -72,6 +72,7 @@ remap_area_pmd(pmd_t *pmd, unsigned long address, unsigned long size,
        return 0;
 }
 
+#if USE_HPPA_IOREMAP
 static int 
 remap_area_pages(unsigned long address, unsigned long phys_addr,
                 unsigned long size, unsigned long flags)
@@ -113,6 +114,31 @@ remap_area_pages(unsigned long address, unsigned long phys_addr,
 
        return error;
 }
+#endif /* USE_HPPA_IOREMAP */
+
+#ifdef CONFIG_DEBUG_IOREMAP
+static unsigned long last = 0;
+
+void gsc_bad_addr(unsigned long addr)
+{
+       if (time_after(jiffies, last + HZ*10)) {
+               printk("gsc_foo() called with bad address 0x%lx\n", addr);
+               dump_stack();
+               last = jiffies;
+       }
+}
+EXPORT_SYMBOL(gsc_bad_addr);
+
+void __raw_bad_addr(const volatile void __iomem *addr)
+{
+       if (time_after(jiffies, last + HZ*10)) {
+               printk("__raw_foo() called with bad address 0x%p\n", addr);
+               dump_stack();
+               last = jiffies;
+       }
+}
+EXPORT_SYMBOL(__raw_bad_addr);
+#endif
 
 /*
  * Generic mapping function (not visible outside):
@@ -128,20 +154,26 @@ remap_area_pages(unsigned long address, unsigned long phys_addr,
  */
 void __iomem * __ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags)
 {
-       void *addr;
-       struct vm_struct *area;
-       unsigned long offset, last_addr;
+#if !(USE_HPPA_IOREMAP)
 
-#ifdef CONFIG_EISA
        unsigned long end = phys_addr + size - 1;
        /* Support EISA addresses */
-       if ((phys_addr >= 0x00080000 && end < 0x000fffff) ||
-           (phys_addr >= 0x00500000 && end < 0x03bfffff)) {
-               phys_addr |= F_EXTEND(0xfc000000);
-               flags |= _PAGE_NO_CACHE;
+       if ((phys_addr >= 0x00080000 && end < 0x000fffff)
+                       || (phys_addr >= 0x00500000 && end < 0x03bfffff)) {
+               phys_addr |= 0xfc000000;
        }
+
+#ifdef CONFIG_DEBUG_IOREMAP
+       return (void __iomem *)(phys_addr - (0x1UL << NYBBLE_SHIFT));
+#else
+       return (void __iomem *)phys_addr;
 #endif
 
+#else
+       void *addr;
+       struct vm_struct *area;
+       unsigned long offset, last_addr;
+
        /* Don't allow wraparound or zero size */
        last_addr = phys_addr + size - 1;
        if (!size || last_addr < phys_addr)
@@ -185,12 +217,15 @@ void __iomem * __ioremap(unsigned long phys_addr, unsigned long size, unsigned l
        }
 
        return (void __iomem *) (offset + (char *)addr);
+#endif
 }
-EXPORT_SYMBOL(__ioremap);
 
 void iounmap(void __iomem *addr)
 {
+#if !(USE_HPPA_IOREMAP)
+       return;
+#else
        if (addr > high_memory)
                return vfree((void *) (PAGE_MASK & (unsigned long __force) addr));
+#endif
 }
-EXPORT_SYMBOL(iounmap);