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

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