diff options
Diffstat (limited to 'include/asm-generic/io.h')
| -rw-r--r-- | include/asm-generic/io.h | 102 | 
1 files changed, 76 insertions, 26 deletions
diff --git a/include/asm-generic/io.h b/include/asm-generic/io.h index 3577ca11a0b..975e1cc75ed 100644 --- a/include/asm-generic/io.h +++ b/include/asm-generic/io.h @@ -12,13 +12,14 @@  #define __ASM_GENERIC_IO_H  #include <asm/page.h> /* I/O is all done through memory accesses */ -#include <asm/cacheflush.h>  #include <linux/types.h>  #ifdef CONFIG_GENERIC_IOMAP  #include <asm-generic/iomap.h>  #endif +#include <asm-generic/pci_iomap.h> +  #ifndef mmiowb  #define mmiowb() do {} while (0)  #endif @@ -52,8 +53,18 @@ static inline u32 __raw_readl(const volatile void __iomem *addr)  #endif  #define readb __raw_readb -#define readw(addr) __le16_to_cpu(__raw_readw(addr)) -#define readl(addr) __le32_to_cpu(__raw_readl(addr)) + +#define readw readw +static inline u16 readw(const volatile void __iomem *addr) +{ +	return __le16_to_cpu(__raw_readw(addr)); +} + +#define readl readl +static inline u32 readl(const volatile void __iomem *addr) +{ +	return __le32_to_cpu(__raw_readl(addr)); +}  #ifndef __raw_writeb  static inline void __raw_writeb(u8 b, volatile void __iomem *addr) @@ -81,17 +92,31 @@ static inline void __raw_writel(u32 b, volatile void __iomem *addr)  #define writel(b,addr) __raw_writel(__cpu_to_le32(b),addr)  #ifdef CONFIG_64BIT +#ifndef __raw_readq  static inline u64 __raw_readq(const volatile void __iomem *addr)  {  	return *(const volatile u64 __force *) addr;  } -#define readq(addr) __le64_to_cpu(__raw_readq(addr)) +#endif + +#define readq readq +static inline u64 readq(const volatile void __iomem *addr) +{ +	return __le64_to_cpu(__raw_readq(addr)); +} +#ifndef __raw_writeq  static inline void __raw_writeq(u64 b, volatile void __iomem *addr)  {  	*(volatile u64 __force *) addr = b;  } -#define writeq(b,addr) __raw_writeq(__cpu_to_le64(b),addr) +#endif + +#define writeq(b, addr) __raw_writeq(__cpu_to_le64(b), addr) +#endif /* CONFIG_64BIT */ + +#ifndef PCI_IOBASE +#define PCI_IOBASE ((void __iomem *) 0)  #endif  /*****************************************************************************/ @@ -101,32 +126,32 @@ static inline void __raw_writeq(u64 b, volatile void __iomem *addr)  static inline u8 inb(unsigned long addr)  { -	return readb((volatile void __iomem *) addr); +	return readb(addr + PCI_IOBASE);  }  static inline u16 inw(unsigned long addr)  { -	return readw((volatile void __iomem *) addr); +	return readw(addr + PCI_IOBASE);  }  static inline u32 inl(unsigned long addr)  { -	return readl((volatile void __iomem *) addr); +	return readl(addr + PCI_IOBASE);  }  static inline void outb(u8 b, unsigned long addr)  { -	writeb(b, (volatile void __iomem *) addr); +	writeb(b, addr + PCI_IOBASE);  }  static inline void outw(u16 b, unsigned long addr)  { -	writew(b, (volatile void __iomem *) addr); +	writew(b, addr + PCI_IOBASE);  }  static inline void outl(u32 b, unsigned long addr)  { -	writel(b, (volatile void __iomem *) addr); +	writel(b, addr + PCI_IOBASE);  }  #define inb_p(addr)	inb(addr) @@ -142,7 +167,7 @@ static inline void insb(unsigned long addr, void *buffer, int count)  	if (count) {  		u8 *buf = buffer;  		do { -			u8 x = inb(addr); +			u8 x = __raw_readb(addr + PCI_IOBASE);  			*buf++ = x;  		} while (--count);  	} @@ -155,7 +180,7 @@ static inline void insw(unsigned long addr, void *buffer, int count)  	if (count) {  		u16 *buf = buffer;  		do { -			u16 x = inw(addr); +			u16 x = __raw_readw(addr + PCI_IOBASE);  			*buf++ = x;  		} while (--count);  	} @@ -168,7 +193,7 @@ static inline void insl(unsigned long addr, void *buffer, int count)  	if (count) {  		u32 *buf = buffer;  		do { -			u32 x = inl(addr); +			u32 x = __raw_readl(addr + PCI_IOBASE);  			*buf++ = x;  		} while (--count);  	} @@ -181,7 +206,7 @@ static inline void outsb(unsigned long addr, const void *buffer, int count)  	if (count) {  		const u8 *buf = buffer;  		do { -			outb(*buf++, addr); +			__raw_writeb(*buf++, addr + PCI_IOBASE);  		} while (--count);  	}  } @@ -193,7 +218,7 @@ static inline void outsw(unsigned long addr, const void *buffer, int count)  	if (count) {  		const u16 *buf = buffer;  		do { -			outw(*buf++, addr); +			__raw_writew(*buf++, addr + PCI_IOBASE);  		} while (--count);  	}  } @@ -205,7 +230,7 @@ static inline void outsl(unsigned long addr, const void *buffer, int count)  	if (count) {  		const u32 *buf = buffer;  		do { -			outl(*buf++, addr); +			__raw_writel(*buf++, addr + PCI_IOBASE);  		} while (--count);  	}  } @@ -214,15 +239,15 @@ static inline void outsl(unsigned long addr, const void *buffer, int count)  #ifndef CONFIG_GENERIC_IOMAP  #define ioread8(addr)		readb(addr)  #define ioread16(addr)		readw(addr) -#define ioread16be(addr)	be16_to_cpu(ioread16(addr)) +#define ioread16be(addr)	__be16_to_cpu(__raw_readw(addr))  #define ioread32(addr)		readl(addr) -#define ioread32be(addr)	be32_to_cpu(ioread32(addr)) +#define ioread32be(addr)	__be32_to_cpu(__raw_readl(addr))  #define iowrite8(v, addr)	writeb((v), (addr))  #define iowrite16(v, addr)	writew((v), (addr)) -#define iowrite16be(v, addr)	iowrite16(be16_to_cpu(v), (addr)) +#define iowrite16be(v, addr)	__raw_writew(__cpu_to_be16(v), addr)  #define iowrite32(v, addr)	writel((v), (addr)) -#define iowrite32be(v, addr)	iowrite32(be32_to_cpu(v), (addr)) +#define iowrite32be(v, addr)	__raw_writel(__cpu_to_be32(v), addr)  #define ioread8_rep(p, dst, count) \  	insb((unsigned long) (p), (dst), (count)) @@ -239,8 +264,9 @@ static inline void outsl(unsigned long addr, const void *buffer, int count)  	outsl((unsigned long) (p), (src), (count))  #endif /* CONFIG_GENERIC_IOMAP */ - -#define IO_SPACE_LIMIT 0xffffffff +#ifndef IO_SPACE_LIMIT +#define IO_SPACE_LIMIT 0xffff +#endif  #ifdef __KERNEL__ @@ -248,18 +274,21 @@ static inline void outsl(unsigned long addr, const void *buffer, int count)  #define __io_virt(x) ((void __force *) (x))  #ifndef CONFIG_GENERIC_IOMAP -/* Create a virtual mapping cookie for a PCI BAR (memory or IO) */  struct pci_dev;  extern void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long max); + +#ifndef pci_iounmap  static inline void pci_iounmap(struct pci_dev *dev, void __iomem *p)  {  } +#endif  #endif /* CONFIG_GENERIC_IOMAP */  /*   * Change virtual addresses to physical addresses and vv.   * These are pretty trivial   */ +#ifndef virt_to_phys  static inline unsigned long virt_to_phys(volatile void *address)  {  	return __pa((unsigned long)address); @@ -269,10 +298,15 @@ static inline void *phys_to_virt(unsigned long address)  {  	return __va(address);  } +#endif  /*   * Change "struct page" to physical address. + * + * This implementation is for the no-MMU case only... if you have an MMU + * you'll need to provide your own definitions.   */ +#ifndef CONFIG_MMU  static inline void __iomem *ioremap(phys_addr_t offset, unsigned long size)  {  	return (void __iomem*) (unsigned long)offset; @@ -288,10 +322,12 @@ static inline void __iomem *ioremap(phys_addr_t offset, unsigned long size)  #define ioremap_wc ioremap_nocache  #endif -static inline void iounmap(void *addr) +static inline void iounmap(void __iomem *addr)  {  } +#endif /* CONFIG_MMU */ +#ifdef CONFIG_HAS_IOPORT_MAP  #ifndef CONFIG_GENERIC_IOMAP  static inline void __iomem *ioport_map(unsigned long port, unsigned int nr)  { @@ -305,10 +341,16 @@ static inline void ioport_unmap(void __iomem *p)  extern void __iomem *ioport_map(unsigned long port, unsigned int nr);  extern void ioport_unmap(void __iomem *p);  #endif /* CONFIG_GENERIC_IOMAP */ +#endif /* CONFIG_HAS_IOPORT_MAP */ +#ifndef xlate_dev_kmem_ptr  #define xlate_dev_kmem_ptr(p)	p -#define xlate_dev_mem_ptr(p)	((void *) (p)) +#endif +#ifndef xlate_dev_mem_ptr +#define xlate_dev_mem_ptr(p)	__va(p) +#endif +#ifdef CONFIG_VIRT_TO_BUS  #ifndef virt_to_bus  static inline unsigned long virt_to_bus(volatile void *address)  { @@ -320,10 +362,18 @@ static inline void *bus_to_virt(unsigned long address)  	return (void *) address;  }  #endif +#endif +#ifndef memset_io  #define memset_io(a, b, c)	memset(__io_virt(a), (b), (c)) +#endif + +#ifndef memcpy_fromio  #define memcpy_fromio(a, b, c)	memcpy((a), __io_virt(b), (c)) +#endif +#ifndef memcpy_toio  #define memcpy_toio(a, b, c)	memcpy(__io_virt(a), (b), (c)) +#endif  #endif /* __KERNEL__ */  | 
