* 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>
*/
return 0;
}
+#if USE_HPPA_IOREMAP
static int
remap_area_pages(unsigned long address, unsigned long phys_addr,
unsigned long size, unsigned long flags)
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):
*/
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)
}
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);