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 10IO_CONCAT(__IO_PREFIX,ioread8)(const void __iomem *a) 11{ 12 return __kernel_ldbu(*(const volatile u8 __force *)a); 13} 14 15__EXTERN_INLINE u16 16IO_CONCAT(__IO_PREFIX,ioread16)(const void __iomem *a) 17{ 18 return __kernel_ldwu(*(const volatile u16 __force *)a); 19} 20 21__EXTERN_INLINE void 22IO_CONCAT(__IO_PREFIX,iowrite8)(u8 b, void __iomem *a) 23{ 24 __kernel_stb(b, *(volatile u8 __force *)a); 25} 26 27__EXTERN_INLINE void 28IO_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 36IO_CONCAT(__IO_PREFIX,ioread32)(const void __iomem *a) 37{ 38 return *(const volatile u32 __force *)a; 39} 40 41__EXTERN_INLINE void 42IO_CONCAT(__IO_PREFIX,iowrite32)(u32 b, void __iomem *a) 43{ 44 *(volatile u32 __force *)a = b; 45} 46 47__EXTERN_INLINE u64 48IO_CONCAT(__IO_PREFIX,ioread64)(const void __iomem *a) 49{ 50 return *(const volatile u64 __force *)a; 51} 52 53__EXTERN_INLINE void 54IO_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 62IO_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 68IO_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 74IO_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 80IO_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 86IO_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 93IO_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 100IO_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 107IO_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 116IO_CONCAT(__IO_PREFIX,readl)(const volatile void __iomem *a) 117{ 118 return *(const volatile u32 __force *)a; 119} 120 121__EXTERN_INLINE u64 122IO_CONCAT(__IO_PREFIX,readq)(const volatile void __iomem *a) 123{ 124 return *(const volatile u64 __force *)a; 125} 126 127__EXTERN_INLINE void 128IO_CONCAT(__IO_PREFIX,writel)(u32 b, volatile void __iomem *a) 129{ 130 *(volatile u32 __force *)a = b; 131} 132 133__EXTERN_INLINE void 134IO_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