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