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 10 IO_CONCAT(__IO_PREFIX,ioread8)(void __iomem *a) 11 { 12 return __kernel_ldbu(*(volatile u8 __force *)a); 13 } 14 15 __EXTERN_INLINE unsigned int 16 IO_CONCAT(__IO_PREFIX,ioread16)(void __iomem *a) 17 { 18 return __kernel_ldwu(*(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 unsigned int 36 IO_CONCAT(__IO_PREFIX,ioread32)(void __iomem *a) 37 { 38 return *(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 #endif 47 48 #if IO_CONCAT(__IO_PREFIX,trivial_rw_bw) == 1 49 __EXTERN_INLINE u8 50 IO_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 56 IO_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 62 IO_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 68 IO_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 74 IO_CONCAT(__IO_PREFIX,readb)(const volatile void __iomem *a) 75 { 76 void __iomem *addr = (void __iomem *)a; 77 return IO_CONCAT(__IO_PREFIX,ioread8)(addr); 78 } 79 80 __EXTERN_INLINE u16 81 IO_CONCAT(__IO_PREFIX,readw)(const volatile void __iomem *a) 82 { 83 void __iomem *addr = (void __iomem *)a; 84 return IO_CONCAT(__IO_PREFIX,ioread16)(addr); 85 } 86 87 __EXTERN_INLINE void 88 IO_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 95 IO_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 104 IO_CONCAT(__IO_PREFIX,readl)(const volatile void __iomem *a) 105 { 106 return *(const volatile u32 __force *)a; 107 } 108 109 __EXTERN_INLINE u64 110 IO_CONCAT(__IO_PREFIX,readq)(const volatile void __iomem *a) 111 { 112 return *(const volatile u64 __force *)a; 113 } 114 115 __EXTERN_INLINE void 116 IO_CONCAT(__IO_PREFIX,writel)(u32 b, volatile void __iomem *a) 117 { 118 *(volatile u32 __force *)a = b; 119 } 120 121 __EXTERN_INLINE void 122 IO_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 133