* data to/from the right byte-lanes.
*/
-#define vip volatile int *
-#define vuip volatile unsigned int *
-#define vulp volatile unsigned long *
-
-__EXTERN_INLINE u8 apecs_inb(unsigned long addr)
+#define vip volatile int __force *
+#define vuip volatile unsigned int __force *
+#define vulp volatile unsigned long __force *
+
+#define APECS_SET_HAE \
+ do { \
+ if (addr >= (1UL << 24)) { \
+ unsigned long msb = addr & 0xf8000000; \
+ addr -= msb; \
+ set_hae(msb); \
+ } \
+ } while (0)
+
+__EXTERN_INLINE unsigned int apecs_ioread8(void __iomem *xaddr)
{
- long result = *(vip) ((addr << 5) + APECS_IO + 0x00);
+ unsigned long addr = (unsigned long) xaddr;
+ unsigned long result, base_and_type;
+
+ if (addr >= APECS_DENSE_MEM) {
+ addr -= APECS_DENSE_MEM;
+ APECS_SET_HAE;
+ base_and_type = APECS_SPARSE_MEM + 0x00;
+ } else {
+ addr -= APECS_IO;
+ base_and_type = APECS_IO + 0x00;
+ }
+
+ result = *(vip) ((addr << 5) + base_and_type);
return __kernel_extbl(result, addr & 3);
}
-__EXTERN_INLINE void apecs_outb(u8 b, unsigned long addr)
+__EXTERN_INLINE void apecs_iowrite8(u8 b, void __iomem *xaddr)
{
- unsigned long w;
+ unsigned long addr = (unsigned long) xaddr;
+ unsigned long w, base_and_type;
+
+ if (addr >= APECS_DENSE_MEM) {
+ addr -= APECS_DENSE_MEM;
+ APECS_SET_HAE;
+ base_and_type = APECS_SPARSE_MEM + 0x00;
+ } else {
+ addr -= APECS_IO;
+ base_and_type = APECS_IO + 0x00;
+ }
w = __kernel_insbl(b, addr & 3);
- *(vuip) ((addr << 5) + APECS_IO + 0x00) = w;
- mb();
-}
-
-__EXTERN_INLINE u16 apecs_inw(unsigned long addr)
-{
- long result = *(vip) ((addr << 5) + APECS_IO + 0x08);
- return __kernel_extwl(result, addr & 3);
+ *(vuip) ((addr << 5) + base_and_type) = w;
}
-__EXTERN_INLINE void apecs_outw(u16 b, unsigned long addr)
-{
- unsigned long w;
-
- w = __kernel_inswl(b, addr & 3);
- *(vuip) ((addr << 5) + APECS_IO + 0x08) = w;
- mb();
-}
-
-__EXTERN_INLINE u32 apecs_inl(unsigned long addr)
-{
- return *(vuip) ((addr << 5) + APECS_IO + 0x18);
-}
-
-__EXTERN_INLINE void apecs_outl(u32 b, unsigned long addr)
-{
- *(vuip) ((addr << 5) + APECS_IO + 0x18) = b;
- mb();
-}
-
-
-/*
- * Memory functions. 64-bit and 32-bit accesses are done through
- * dense memory space, everything else through sparse space.
- */
-
-__EXTERN_INLINE u8 apecs_readb(unsigned long addr)
+__EXTERN_INLINE unsigned int apecs_ioread16(void __iomem *xaddr)
{
- unsigned long result, msb;
-
- addr -= APECS_DENSE_MEM;
- if (addr >= (1UL << 24)) {
- msb = addr & 0xf8000000;
- addr -= msb;
- set_hae(msb);
+ unsigned long addr = (unsigned long) xaddr;
+ unsigned long result, base_and_type;
+
+ if (addr >= APECS_DENSE_MEM) {
+ addr -= APECS_DENSE_MEM;
+ APECS_SET_HAE;
+ base_and_type = APECS_SPARSE_MEM + 0x08;
+ } else {
+ addr -= APECS_IO;
+ base_and_type = APECS_IO + 0x08;
}
- result = *(vip) ((addr << 5) + APECS_SPARSE_MEM + 0x00);
- return __kernel_extbl(result, addr & 3);
-}
-__EXTERN_INLINE u16 apecs_readw(unsigned long addr)
-{
- unsigned long result, msb;
-
- addr -= APECS_DENSE_MEM;
- if (addr >= (1UL << 24)) {
- msb = addr & 0xf8000000;
- addr -= msb;
- set_hae(msb);
- }
- result = *(vip) ((addr << 5) + APECS_SPARSE_MEM + 0x08);
+ result = *(vip) ((addr << 5) + base_and_type);
return __kernel_extwl(result, addr & 3);
}
-__EXTERN_INLINE u32 apecs_readl(unsigned long addr)
-{
- return (*(vuip)addr) & 0xffffffff;
-}
-
-__EXTERN_INLINE u64 apecs_readq(unsigned long addr)
-{
- return *(vulp)addr;
-}
-
-__EXTERN_INLINE void apecs_writeb(u8 b, unsigned long addr)
+__EXTERN_INLINE void apecs_iowrite16(u16 b, void __iomem *xaddr)
{
- unsigned long msb;
-
- addr -= APECS_DENSE_MEM;
- if (addr >= (1UL << 24)) {
- msb = addr & 0xf8000000;
- addr -= msb;
- set_hae(msb);
+ unsigned long addr = (unsigned long) xaddr;
+ unsigned long w, base_and_type;
+
+ if (addr >= APECS_DENSE_MEM) {
+ addr -= APECS_DENSE_MEM;
+ APECS_SET_HAE;
+ base_and_type = APECS_SPARSE_MEM + 0x08;
+ } else {
+ addr -= APECS_IO;
+ base_and_type = APECS_IO + 0x08;
}
- *(vuip) ((addr << 5) + APECS_SPARSE_MEM + 0x00) = b * 0x01010101;
+
+ w = __kernel_inswl(b, addr & 3);
+ *(vuip) ((addr << 5) + base_and_type) = w;
}
-__EXTERN_INLINE void apecs_writew(u16 b, unsigned long addr)
+__EXTERN_INLINE unsigned int apecs_ioread32(void __iomem *xaddr)
{
- unsigned long msb;
-
- addr -= APECS_DENSE_MEM;
- if (addr >= (1UL << 24)) {
- msb = addr & 0xf8000000;
- addr -= msb;
- set_hae(msb);
- }
- *(vuip) ((addr << 5) + APECS_SPARSE_MEM + 0x08) = b * 0x00010001;
+ unsigned long addr = (unsigned long) xaddr;
+ if (addr < APECS_DENSE_MEM)
+ addr = ((addr - APECS_IO) << 5) + APECS_IO + 0x18;
+ return *(vuip)addr;
}
-__EXTERN_INLINE void apecs_writel(u32 b, unsigned long addr)
+__EXTERN_INLINE void apecs_iowrite32(u32 b, void __iomem *xaddr)
{
+ unsigned long addr = (unsigned long) xaddr;
+ if (addr < APECS_DENSE_MEM)
+ addr = ((addr - APECS_IO) << 5) + APECS_IO + 0x18;
*(vuip)addr = b;
}
-__EXTERN_INLINE void apecs_writeq(u64 b, unsigned long addr)
+__EXTERN_INLINE void __iomem *apecs_ioportmap(unsigned long addr)
{
- *(vulp)addr = b;
+ return (void __iomem *)(addr + APECS_IO);
}
-__EXTERN_INLINE unsigned long apecs_ioremap(unsigned long addr,
- unsigned long size
- __attribute__((unused)))
+__EXTERN_INLINE void __iomem *apecs_ioremap(unsigned long addr,
+ unsigned long size)
{
- return addr + APECS_DENSE_MEM;
+ return (void __iomem *)(addr + APECS_DENSE_MEM);
}
-__EXTERN_INLINE void apecs_iounmap(unsigned long addr)
+__EXTERN_INLINE int apecs_is_ioaddr(unsigned long addr)
{
- return;
+ return addr >= IDENT_ADDR + 0x180000000UL;
}
-__EXTERN_INLINE int apecs_is_ioaddr(unsigned long addr)
+__EXTERN_INLINE int apecs_is_mmio(const volatile void __iomem *addr)
{
- return addr >= IDENT_ADDR + 0x180000000UL;
+ return (unsigned long)addr >= APECS_DENSE_MEM;
}
+#undef APECS_SET_HAE
+
#undef vip
#undef vuip
#undef vulp
-#ifdef __WANT_IO_DEF
-
-#define __inb(p) apecs_inb((unsigned long)(p))
-#define __inw(p) apecs_inw((unsigned long)(p))
-#define __inl(p) apecs_inl((unsigned long)(p))
-#define __outb(x,p) apecs_outb((x),(unsigned long)(p))
-#define __outw(x,p) apecs_outw((x),(unsigned long)(p))
-#define __outl(x,p) apecs_outl((x),(unsigned long)(p))
-#define __readb(a) apecs_readb((unsigned long)(a))
-#define __readw(a) apecs_readw((unsigned long)(a))
-#define __readl(a) apecs_readl((unsigned long)(a))
-#define __readq(a) apecs_readq((unsigned long)(a))
-#define __writeb(x,a) apecs_writeb((x),(unsigned long)(a))
-#define __writew(x,a) apecs_writew((x),(unsigned long)(a))
-#define __writel(x,a) apecs_writel((x),(unsigned long)(a))
-#define __writeq(x,a) apecs_writeq((x),(unsigned long)(a))
-#define __ioremap(a,s) apecs_ioremap((unsigned long)(a),(s))
-#define __iounmap(a) apecs_iounmap((unsigned long)(a))
-#define __is_ioaddr(a) apecs_is_ioaddr((unsigned long)(a))
-
-#define __raw_readl(a) __readl(a)
-#define __raw_readq(a) __readq(a)
-#define __raw_writel(v,a) __writel((v),(a))
-#define __raw_writeq(v,a) __writeq((v),(a))
-
-#endif /* __WANT_IO_DEF */
+#undef __IO_PREFIX
+#define __IO_PREFIX apecs
+#define apecs_trivial_io_bw 0
+#define apecs_trivial_io_lq 0
+#define apecs_trivial_rw_bw 2
+#define apecs_trivial_rw_lq 1
+#define apecs_trivial_iounmap 1
+#include <asm/io_trivial.h>
#ifdef __IO_EXTERN_INLINE
#undef __EXTERN_INLINE