| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* Trivial implementations of basic i/o routines.  Assumes that all | 
 | 2 |    of the hard work has been done by ioremap and ioportmap, and that | 
 | 3 |    access to i/o space is linear.  */ | 
 | 4 |  | 
 | 5 | /* This file may be included multiple times.  */ | 
 | 6 |  | 
 | 7 | #if IO_CONCAT(__IO_PREFIX,trivial_io_bw) | 
 | 8 | __EXTERN_INLINE unsigned int | 
 | 9 | IO_CONCAT(__IO_PREFIX,ioread8)(void __iomem *a) | 
 | 10 | { | 
 | 11 | 	return __kernel_ldbu(*(volatile u8 __force *)a); | 
 | 12 | } | 
 | 13 |  | 
 | 14 | __EXTERN_INLINE unsigned int | 
 | 15 | IO_CONCAT(__IO_PREFIX,ioread16)(void __iomem *a) | 
 | 16 | { | 
 | 17 | 	return __kernel_ldwu(*(volatile u16 __force *)a); | 
 | 18 | } | 
 | 19 |  | 
 | 20 | __EXTERN_INLINE void | 
 | 21 | IO_CONCAT(__IO_PREFIX,iowrite8)(u8 b, void __iomem *a) | 
 | 22 | { | 
 | 23 | 	__kernel_stb(b, *(volatile u8 __force *)a); | 
 | 24 | } | 
 | 25 |  | 
 | 26 | __EXTERN_INLINE void | 
 | 27 | IO_CONCAT(__IO_PREFIX,iowrite16)(u16 b, void __iomem *a) | 
 | 28 | { | 
 | 29 | 	__kernel_stw(b, *(volatile u16 __force *)a); | 
 | 30 | } | 
 | 31 | #endif | 
 | 32 |  | 
 | 33 | #if IO_CONCAT(__IO_PREFIX,trivial_io_lq) | 
 | 34 | __EXTERN_INLINE unsigned int | 
 | 35 | IO_CONCAT(__IO_PREFIX,ioread32)(void __iomem *a) | 
 | 36 | { | 
 | 37 | 	return *(volatile u32 __force *)a; | 
 | 38 | } | 
 | 39 |  | 
 | 40 | __EXTERN_INLINE void | 
 | 41 | IO_CONCAT(__IO_PREFIX,iowrite32)(u32 b, void __iomem *a) | 
 | 42 | { | 
 | 43 | 	*(volatile u32 __force *)a = b; | 
 | 44 | } | 
 | 45 | #endif | 
 | 46 |  | 
 | 47 | #if IO_CONCAT(__IO_PREFIX,trivial_rw_bw) == 1 | 
 | 48 | __EXTERN_INLINE u8 | 
 | 49 | IO_CONCAT(__IO_PREFIX,readb)(const volatile void __iomem *a) | 
 | 50 | { | 
 | 51 | 	return __kernel_ldbu(*(const volatile u8 __force *)a); | 
 | 52 | } | 
 | 53 |  | 
 | 54 | __EXTERN_INLINE u16 | 
 | 55 | IO_CONCAT(__IO_PREFIX,readw)(const volatile void __iomem *a) | 
 | 56 | { | 
 | 57 | 	return __kernel_ldwu(*(const volatile u16 __force *)a); | 
 | 58 | } | 
 | 59 |  | 
 | 60 | __EXTERN_INLINE void | 
 | 61 | IO_CONCAT(__IO_PREFIX,writeb)(u8 b, volatile void __iomem *a) | 
 | 62 | { | 
 | 63 | 	__kernel_stb(b, *(volatile u8 __force *)a); | 
 | 64 | } | 
 | 65 |  | 
 | 66 | __EXTERN_INLINE void | 
 | 67 | IO_CONCAT(__IO_PREFIX,writew)(u16 b, volatile void __iomem *a) | 
 | 68 | { | 
 | 69 | 	__kernel_stw(b, *(volatile u16 __force *)a); | 
 | 70 | } | 
 | 71 | #elif IO_CONCAT(__IO_PREFIX,trivial_rw_bw) == 2 | 
 | 72 | __EXTERN_INLINE u8 | 
 | 73 | IO_CONCAT(__IO_PREFIX,readb)(const volatile void __iomem *a) | 
 | 74 | { | 
| Ivan Kokshaysky | 9548b20 | 2007-12-17 16:19:57 -0800 | [diff] [blame] | 75 | 	void __iomem *addr = (void __iomem *)a; | 
 | 76 | 	return IO_CONCAT(__IO_PREFIX,ioread8)(addr); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 77 | } | 
 | 78 |  | 
 | 79 | __EXTERN_INLINE u16 | 
 | 80 | IO_CONCAT(__IO_PREFIX,readw)(const volatile void __iomem *a) | 
 | 81 | { | 
| Ivan Kokshaysky | 9548b20 | 2007-12-17 16:19:57 -0800 | [diff] [blame] | 82 | 	void __iomem *addr = (void __iomem *)a; | 
 | 83 | 	return IO_CONCAT(__IO_PREFIX,ioread16)(addr); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 84 | } | 
 | 85 |  | 
 | 86 | __EXTERN_INLINE void | 
 | 87 | IO_CONCAT(__IO_PREFIX,writeb)(u8 b, volatile void __iomem *a) | 
 | 88 | { | 
| Ivan Kokshaysky | 9548b20 | 2007-12-17 16:19:57 -0800 | [diff] [blame] | 89 | 	void __iomem *addr = (void __iomem *)a; | 
 | 90 | 	IO_CONCAT(__IO_PREFIX,iowrite8)(b, addr); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 91 | } | 
 | 92 |  | 
 | 93 | __EXTERN_INLINE void | 
 | 94 | IO_CONCAT(__IO_PREFIX,writew)(u16 b, volatile void __iomem *a) | 
 | 95 | { | 
| Ivan Kokshaysky | 9548b20 | 2007-12-17 16:19:57 -0800 | [diff] [blame] | 96 | 	void __iomem *addr = (void __iomem *)a; | 
 | 97 | 	IO_CONCAT(__IO_PREFIX,iowrite16)(b, addr); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 98 | } | 
 | 99 | #endif | 
 | 100 |  | 
 | 101 | #if IO_CONCAT(__IO_PREFIX,trivial_rw_lq) == 1 | 
 | 102 | __EXTERN_INLINE u32 | 
 | 103 | IO_CONCAT(__IO_PREFIX,readl)(const volatile void __iomem *a) | 
 | 104 | { | 
 | 105 | 	return *(const volatile u32 __force *)a; | 
 | 106 | } | 
 | 107 |  | 
 | 108 | __EXTERN_INLINE u64 | 
 | 109 | IO_CONCAT(__IO_PREFIX,readq)(const volatile void __iomem *a) | 
 | 110 | { | 
 | 111 | 	return *(const volatile u64 __force *)a; | 
 | 112 | } | 
 | 113 |  | 
 | 114 | __EXTERN_INLINE void | 
 | 115 | IO_CONCAT(__IO_PREFIX,writel)(u32 b, volatile void __iomem *a) | 
 | 116 | { | 
 | 117 | 	*(volatile u32 __force *)a = b; | 
 | 118 | } | 
 | 119 |  | 
 | 120 | __EXTERN_INLINE void | 
 | 121 | IO_CONCAT(__IO_PREFIX,writeq)(u64 b, volatile void __iomem *a) | 
 | 122 | { | 
 | 123 | 	*(volatile u64 __force *)a = b; | 
 | 124 | } | 
 | 125 | #endif | 
 | 126 |  | 
 | 127 | #if IO_CONCAT(__IO_PREFIX,trivial_iounmap) | 
 | 128 | __EXTERN_INLINE void IO_CONCAT(__IO_PREFIX,iounmap)(volatile void __iomem *a) | 
 | 129 | { | 
 | 130 | } | 
 | 131 | #endif |