diff options
Diffstat (limited to 'include/asm-arm/arch-ebsa285/io.h')
-rw-r--r-- | include/asm-arm/arch-ebsa285/io.h | 219 |
1 files changed, 107 insertions, 112 deletions
diff --git a/include/asm-arm/arch-ebsa285/io.h b/include/asm-arm/arch-ebsa285/io.h index 1be73879d..b23ee6863 100644 --- a/include/asm-arm/arch-ebsa285/io.h +++ b/include/asm-arm/arch-ebsa285/io.h @@ -16,34 +16,37 @@ * has the constant-optimised IO */ #undef ARCH_IO_DELAY +#define ARCH_READWRITE /* * Dynamic IO functions - let the compiler * optimize the expressions */ -#define DECLARE_DYN_OUT(fnsuffix,instr,typ) \ -extern __inline__ void __out##fnsuffix (unsigned int value, unsigned int port) \ -{ \ - __asm__ __volatile__( \ - "str%?" ##instr## " %0, [%1, %2] @ out"###fnsuffix \ - : \ - : "r" (value), "r" (PCIO_BASE), typ (port)); \ +#define DECLARE_DYN_OUT(fnsuffix,instr,typ) \ +extern __inline__ void \ +__out##fnsuffix (unsigned int value, unsigned int port) \ +{ \ + __asm__ __volatile__( \ + "str%?" ##instr## " %0, [%1, %2] @ out"###fnsuffix \ + : \ + : "r" (value), "r" (PCIO_BASE), typ (port)); \ } -#define DECLARE_DYN_IN(sz,fnsuffix,instr,typ) \ -extern __inline__ unsigned sz __in##fnsuffix (unsigned int port) \ -{ \ - unsigned long value; \ - __asm__ __volatile__( \ - "ldr%?" ##instr## " %0, [%1, %2] @ in"###fnsuffix \ - : "=&r" (value) \ - : "r" (PCIO_BASE), typ (port)); \ - return (unsigned sz)value; \ +#define DECLARE_DYN_IN(sz,fnsuffix,instr,typ) \ +extern __inline__ unsigned sz \ +__in##fnsuffix (unsigned int port) \ +{ \ + unsigned long value; \ + __asm__ __volatile__( \ + "ldr%?" ##instr## " %0, [%1, %2] @ in"###fnsuffix \ + : "=&r" (value) \ + : "r" (PCIO_BASE), typ (port)); \ + return (unsigned sz)value; \ } -extern __inline__ unsigned int __ioaddr (unsigned int port) \ -{ \ - return (unsigned int)(PCIO_BASE + port); \ +extern __inline__ unsigned int __ioaddr (unsigned int port) \ +{ \ + return (unsigned int)(PCIO_BASE + port); \ } #define DECLARE_IO(sz,fnsuffix,instr,typ) \ @@ -64,65 +67,65 @@ DECLARE_IO(long,l,"","Jr") * These have to be macros for the 'J' constraint to work - * +/-4096 immediate operand. */ -#define __outbc(value,port) \ -({ \ - __asm__ __volatile__( \ - "str%?b %0, [%1, %2] @ outbc" \ - : \ - : "r" (value), "r" (PCIO_BASE), "Jr" (port)); \ +#define __outbc(value,port) \ +({ \ + __asm__ __volatile__( \ + "str%?b %0, [%1, %2] @ outbc" \ + : \ + : "r" (value), "r" (PCIO_BASE), "Jr" (port)); \ }) -#define __inbc(port) \ -({ \ - unsigned char result; \ - __asm__ __volatile__( \ - "ldr%?b %0, [%1, %2] @ inbc" \ - : "=r" (result) \ - : "r" (PCIO_BASE), "Jr" (port)); \ - result; \ +#define __inbc(port) \ +({ \ + unsigned char result; \ + __asm__ __volatile__( \ + "ldr%?b %0, [%1, %2] @ inbc" \ + : "=r" (result) \ + : "r" (PCIO_BASE), "Jr" (port)); \ + result; \ }) -#define __outwc(value,port) \ -({ \ - __asm__ __volatile__( \ - "str%?h %0, [%1, %2] @ outwc" \ - : \ - : "r" (value), "r" (PCIO_BASE), "r" (port)); \ +#define __outwc(value,port) \ +({ \ + __asm__ __volatile__( \ + "str%?h %0, [%1, %2] @ outwc" \ + : \ + : "r" (value), "r" (PCIO_BASE), "r" (port)); \ }) -#define __inwc(port) \ -({ \ - unsigned short result; \ - __asm__ __volatile__( \ - "ldr%?h %0, [%1, %2] @ inwc" \ - : "=r" (result) \ - : "r" (PCIO_BASE), "r" (port)); \ - result & 0xffff; \ +#define __inwc(port) \ +({ \ + unsigned short result; \ + __asm__ __volatile__( \ + "ldr%?h %0, [%1, %2] @ inwc" \ + : "=r" (result) \ + : "r" (PCIO_BASE), "r" (port)); \ + result & 0xffff; \ }) -#define __outlc(value,port) \ -({ \ - __asm__ __volatile__( \ - "str%? %0, [%1, %2] @ outlc" \ - : \ - : "r" (value), "r" (PCIO_BASE), "Jr" (port)); \ +#define __outlc(value,port) \ +({ \ + __asm__ __volatile__( \ + "str%? %0, [%1, %2] @ outlc" \ + : \ + : "r" (value), "r" (PCIO_BASE), "Jr" (port)); \ }) -#define __inlc(port) \ -({ \ - unsigned long result; \ - __asm__ __volatile__( \ - "ldr%? %0, [%1, %2] @ inlc" \ - : "=r" (result) \ - : "r" (PCIO_BASE), "Jr" (port)); \ - result; \ +#define __inlc(port) \ +({ \ + unsigned long result; \ + __asm__ __volatile__( \ + "ldr%? %0, [%1, %2] @ inlc" \ + : "=r" (result) \ + : "r" (PCIO_BASE), "Jr" (port)); \ + result; \ }) -#define __ioaddrc(port) \ -({ \ - unsigned long addr; \ - addr = PCIO_BASE + port; \ - addr; \ +#define __ioaddrc(port) \ +({ \ + unsigned long addr; \ + addr = PCIO_BASE + port; \ + addr; \ }) /* @@ -130,20 +133,22 @@ DECLARE_IO(long,l,"","Jr") * * IO address has already been translated to a virtual address */ -#define outb_t(v,p) \ +#define outb_t(v,p) \ (*(volatile unsigned char *)(p) = (v)) -#define inb_t(p) \ +#define inb_t(p) \ (*(volatile unsigned char *)(p)) -#define outl_t(v,p) \ +#define outl_t(v,p) \ (*(volatile unsigned long *)(p) = (v)) -#define inl_t(p) \ +#define inl_t(p) \ (*(volatile unsigned long *)(p)) /* - * ioremap support + * ioremap support - validate a PCI memory address, + * and convert a PCI memory address to a physical + * address for the page tables. */ #define valid_ioaddr(iomem,size) ((iomem) < 0x80000000 && (iomem) + (size) <= 0x80000000) #define io_to_phys(iomem) ((iomem) + DC21285_PCI_MEM) @@ -153,58 +158,48 @@ DECLARE_IO(long,l,"","Jr") * is using read*() and so on with addresses they didn't get from ioremap * this can go away. */ -#define IO_FUDGE_FACTOR 0xe0000000 +#define IO_FUDGE_FACTOR PCIMEM_BASE -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); -} +/* + * ioremap takes a PCI memory address, as specified in + * linux/Documentation/IO-mapping.txt + */ +#define ioremap(iomem_addr,size) \ +({ \ + unsigned long _addr = (iomem_addr), _size = (size); \ + void *_ret = NULL; \ + if (valid_ioaddr(_addr, _size)) { \ + _addr = io_to_phys(_addr); \ + _ret = __ioremap(_addr, _size, 0) - IO_FUDGE_FACTOR; \ + } \ + _ret; }) #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 *)(IO_FUDGE_FACTOR + (addr)) = b; -} - -static inline unsigned char readb(unsigned int addr) -{ - return *(volatile unsigned char *)(IO_FUDGE_FACTOR + (addr)); +#define DECLARE_PCI_WRITE(typ,fnsuffix) \ +static inline void write##fnsuffix(unsigned typ val, unsigned int addr) \ +{ \ + *(volatile unsigned typ *)(IO_FUDGE_FACTOR + addr) = val; \ } -static inline void writew(unsigned short b, unsigned int addr) -{ - *(volatile unsigned short *)(IO_FUDGE_FACTOR + (addr)) = b; +#define DECLARE_PCI_READ(typ,fnsuffix) \ +static inline unsigned typ read##fnsuffix (unsigned int addr) \ +{ \ + return *(volatile unsigned typ *)(IO_FUDGE_FACTOR + addr); \ } -static inline unsigned short readw(unsigned int addr) -{ - return *(volatile unsigned short *)(IO_FUDGE_FACTOR + (addr)); -} +#define DECLARE_PCI(typ,fnsuffix) \ + DECLARE_PCI_WRITE(typ,fnsuffix) \ + DECLARE_PCI_READ(typ,fnsuffix) -static inline void writel(unsigned long b, unsigned int addr) -{ - *(volatile unsigned long *)(IO_FUDGE_FACTOR + (addr)) = b; -} +DECLARE_PCI(char,b) +DECLARE_PCI(short,w) +DECLARE_PCI(long,l) -static inline unsigned short readl(unsigned int addr) -{ - return *(volatile unsigned long *)(IO_FUDGE_FACTOR + (addr)); -} +#undef DECLARE_PCI +#undef DECLARE_PCI_READ +#undef DECLARE_PCI_WRITE #endif |