patch-2.2.0-pre6 linux/include/asm-arm/arch-ebsa285/io.h
Next file: linux/include/asm-arm/arch-ebsa285/irq.h
Previous file: linux/include/asm-arm/arch-ebsa285/hardware.h
Back to the patch index
Back to the overall index
- Lines: 162
- Date:
Thu Jan 7 15:51:33 1999
- Orig file:
v2.2.0-pre5/linux/include/asm-arm/arch-ebsa285/io.h
- Orig date:
Tue Jun 23 10:01:25 1998
diff -u --recursive --new-file v2.2.0-pre5/linux/include/asm-arm/arch-ebsa285/io.h linux/include/asm-arm/arch-ebsa285/io.h
@@ -1,5 +1,5 @@
/*
- * linux/include/asm-arm/arch-ebsa110/io.h
+ * linux/include/asm-arm/arch-ebsa285/io.h
*
* Copyright (C) 1997,1998 Russell King
*
@@ -9,6 +9,8 @@
#ifndef __ASM_ARM_ARCH_IO_H
#define __ASM_ARM_ARCH_IO_H
+#include <asm/dec21285.h>
+
/*
* This architecture does not require any delayed IO, and
* has the constant-optimised IO
@@ -23,7 +25,7 @@
extern __inline__ void __out##fnsuffix (unsigned int value, unsigned int port) \
{ \
__asm__ __volatile__( \
- "str" ##instr## " %0, [%1, %2]" \
+ "str%?" ##instr## " %0, [%1, %2] @ out"###fnsuffix \
: \
: "r" (value), "r" (PCIO_BASE), typ (port)); \
}
@@ -33,7 +35,7 @@
{ \
unsigned long value; \
__asm__ __volatile__( \
- "ldr" ##instr## " %0, [%1, %2]" \
+ "ldr%?" ##instr## " %0, [%1, %2] @ in"###fnsuffix \
: "=&r" (value) \
: "r" (PCIO_BASE), typ (port)); \
return (unsigned sz)value; \
@@ -65,7 +67,7 @@
#define __outbc(value,port) \
({ \
__asm__ __volatile__( \
- "strb %0, [%1, %2]" \
+ "str%?b %0, [%1, %2] @ outbc" \
: \
: "r" (value), "r" (PCIO_BASE), "Jr" (port)); \
})
@@ -74,7 +76,7 @@
({ \
unsigned char result; \
__asm__ __volatile__( \
- "ldrb %0, [%1, %2]" \
+ "ldr%?b %0, [%1, %2] @ inbc" \
: "=r" (result) \
: "r" (PCIO_BASE), "Jr" (port)); \
result; \
@@ -83,7 +85,7 @@
#define __outwc(value,port) \
({ \
__asm__ __volatile__( \
- "strh %0, [%1, %2]" \
+ "str%?h %0, [%1, %2] @ outwc" \
: \
: "r" (value), "r" (PCIO_BASE), "r" (port)); \
})
@@ -92,7 +94,7 @@
({ \
unsigned short result; \
__asm__ __volatile__( \
- "ldrh %0, [%1, %2]" \
+ "ldr%?h %0, [%1, %2] @ inwc" \
: "=r" (result) \
: "r" (PCIO_BASE), "r" (port)); \
result & 0xffff; \
@@ -101,7 +103,7 @@
#define __outlc(value,port) \
({ \
__asm__ __volatile__( \
- "str %0, [%1, %2]" \
+ "str%? %0, [%1, %2] @ outlc" \
: \
: "r" (value), "r" (PCIO_BASE), "Jr" (port)); \
})
@@ -110,7 +112,7 @@
({ \
unsigned long result; \
__asm__ __volatile__( \
- "ldr %0, [%1, %2]" \
+ "ldr%? %0, [%1, %2] @ inlc" \
: "=r" (result) \
: "r" (PCIO_BASE), "Jr" (port)); \
result; \
@@ -141,25 +143,68 @@
(*(volatile unsigned long *)(p))
/*
- * This is not sufficient... (and it's a hack anyway)
+ * ioremap support
+ */
+#define valid_ioaddr(iomem,size) ((iomem) < 0x80000000 && (iomem) + (size) <= 0x80000000)
+#define io_to_phys(iomem) ((iomem) + DC21285_PCI_MEM)
+
+/*
+ * Fudge up IO addresses by this much. Once we're confident that nobody
+ * is using read*() and so on with addresses they didn't get from ioremap
+ * this can go away.
+ */
+#define IO_FUDGE_FACTOR 0xe0000000
+
+extern inline void *ioremap(unsigned long iomem_addr, unsigned long size)
+{
+ unsigned long phys_addr;
+
+ if (!valid_ioaddr(iomem_addr, size))
+ return NULL;
+
+ phys_addr = io_to_phys(iomem_addr & PAGE_MASK);
+
+ return (void *)((unsigned long)__ioremap(phys_addr, size, 0)
+ - IO_FUDGE_FACTOR);
+}
+
+#define ioremap_nocache(iomem_addr,size) ioremap((iomem_addr),(size))
+
+extern void iounmap(void *addr);
+
+/*
+ * We'd probably be better off with these as macros rather than functions.
+ * Firstly that would be more efficient and secondly we could do with the
+ * ability to stop GCC whinging about type conversions. --philb
*/
static inline void writeb(unsigned char b, unsigned int addr)
{
- *(volatile unsigned char *)(0xe0000000 + (addr)) = b;
+ *(volatile unsigned char *)(IO_FUDGE_FACTOR + (addr)) = b;
}
static inline unsigned char readb(unsigned int addr)
{
- return *(volatile unsigned char *)(0xe0000000 + (addr));
+ return *(volatile unsigned char *)(IO_FUDGE_FACTOR + (addr));
}
static inline void writew(unsigned short b, unsigned int addr)
{
- *(volatile unsigned short *)(0xe0000000 + (addr)) = b;
+ *(volatile unsigned short *)(IO_FUDGE_FACTOR + (addr)) = b;
}
static inline unsigned short readw(unsigned int addr)
{
- return *(volatile unsigned short *)(0xe0000000 + (addr));
+ return *(volatile unsigned short *)(IO_FUDGE_FACTOR + (addr));
}
+
+static inline void writel(unsigned long b, unsigned int addr)
+{
+ *(volatile unsigned long *)(IO_FUDGE_FACTOR + (addr)) = b;
+}
+
+static inline unsigned short readl(unsigned int addr)
+{
+ return *(volatile unsigned long *)(IO_FUDGE_FACTOR + (addr));
+}
+
#endif
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov