io_trivial.h (3206B)
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 unsigned int 10IO_CONCAT(__IO_PREFIX,ioread8)(const void __iomem *a) 11{ 12 return __kernel_ldbu(*(const volatile u8 __force *)a); 13} 14 15__EXTERN_INLINE unsigned int 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 unsigned int 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#endif 47 48#if IO_CONCAT(__IO_PREFIX,trivial_rw_bw) == 1 49__EXTERN_INLINE u8 50IO_CONCAT(__IO_PREFIX,readb)(const volatile void __iomem *a) 51{ 52 return __kernel_ldbu(*(const volatile u8 __force *)a); 53} 54 55__EXTERN_INLINE u16 56IO_CONCAT(__IO_PREFIX,readw)(const volatile void __iomem *a) 57{ 58 return __kernel_ldwu(*(const volatile u16 __force *)a); 59} 60 61__EXTERN_INLINE void 62IO_CONCAT(__IO_PREFIX,writeb)(u8 b, volatile void __iomem *a) 63{ 64 __kernel_stb(b, *(volatile u8 __force *)a); 65} 66 67__EXTERN_INLINE void 68IO_CONCAT(__IO_PREFIX,writew)(u16 b, volatile void __iomem *a) 69{ 70 __kernel_stw(b, *(volatile u16 __force *)a); 71} 72#elif IO_CONCAT(__IO_PREFIX,trivial_rw_bw) == 2 73__EXTERN_INLINE u8 74IO_CONCAT(__IO_PREFIX,readb)(const volatile void __iomem *a) 75{ 76 const void __iomem *addr = (const void __iomem *)a; 77 return IO_CONCAT(__IO_PREFIX,ioread8)(addr); 78} 79 80__EXTERN_INLINE u16 81IO_CONCAT(__IO_PREFIX,readw)(const volatile void __iomem *a) 82{ 83 const void __iomem *addr = (const void __iomem *)a; 84 return IO_CONCAT(__IO_PREFIX,ioread16)(addr); 85} 86 87__EXTERN_INLINE void 88IO_CONCAT(__IO_PREFIX,writeb)(u8 b, volatile void __iomem *a) 89{ 90 void __iomem *addr = (void __iomem *)a; 91 IO_CONCAT(__IO_PREFIX,iowrite8)(b, addr); 92} 93 94__EXTERN_INLINE void 95IO_CONCAT(__IO_PREFIX,writew)(u16 b, volatile void __iomem *a) 96{ 97 void __iomem *addr = (void __iomem *)a; 98 IO_CONCAT(__IO_PREFIX,iowrite16)(b, addr); 99} 100#endif 101 102#if IO_CONCAT(__IO_PREFIX,trivial_rw_lq) == 1 103__EXTERN_INLINE u32 104IO_CONCAT(__IO_PREFIX,readl)(const volatile void __iomem *a) 105{ 106 return *(const volatile u32 __force *)a; 107} 108 109__EXTERN_INLINE u64 110IO_CONCAT(__IO_PREFIX,readq)(const volatile void __iomem *a) 111{ 112 return *(const volatile u64 __force *)a; 113} 114 115__EXTERN_INLINE void 116IO_CONCAT(__IO_PREFIX,writel)(u32 b, volatile void __iomem *a) 117{ 118 *(volatile u32 __force *)a = b; 119} 120 121__EXTERN_INLINE void 122IO_CONCAT(__IO_PREFIX,writeq)(u64 b, volatile void __iomem *a) 123{ 124 *(volatile u64 __force *)a = b; 125} 126#endif 127 128#if IO_CONCAT(__IO_PREFIX,trivial_iounmap) 129__EXTERN_INLINE void IO_CONCAT(__IO_PREFIX,iounmap)(volatile void __iomem *a) 130{ 131} 132#endif