Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /* Trivial implementations of basic i/o routines.  Assumes that all
0003    of the hard work has been done by ioremap and ioportmap, and that
0004    access to i/o space is linear.  */
0005 
0006 /* This file may be included multiple times.  */
0007 
0008 #if IO_CONCAT(__IO_PREFIX,trivial_io_bw)
0009 __EXTERN_INLINE unsigned int
0010 IO_CONCAT(__IO_PREFIX,ioread8)(const void __iomem *a)
0011 {
0012     return __kernel_ldbu(*(const volatile u8 __force *)a);
0013 }
0014 
0015 __EXTERN_INLINE unsigned int
0016 IO_CONCAT(__IO_PREFIX,ioread16)(const void __iomem *a)
0017 {
0018     return __kernel_ldwu(*(const volatile u16 __force *)a);
0019 }
0020 
0021 __EXTERN_INLINE void
0022 IO_CONCAT(__IO_PREFIX,iowrite8)(u8 b, void __iomem *a)
0023 {
0024     __kernel_stb(b, *(volatile u8 __force *)a);
0025 }
0026 
0027 __EXTERN_INLINE void
0028 IO_CONCAT(__IO_PREFIX,iowrite16)(u16 b, void __iomem *a)
0029 {
0030     __kernel_stw(b, *(volatile u16 __force *)a);
0031 }
0032 #endif
0033 
0034 #if IO_CONCAT(__IO_PREFIX,trivial_io_lq)
0035 __EXTERN_INLINE unsigned int
0036 IO_CONCAT(__IO_PREFIX,ioread32)(const void __iomem *a)
0037 {
0038     return *(const volatile u32 __force *)a;
0039 }
0040 
0041 __EXTERN_INLINE void
0042 IO_CONCAT(__IO_PREFIX,iowrite32)(u32 b, void __iomem *a)
0043 {
0044     *(volatile u32 __force *)a = b;
0045 }
0046 #endif
0047 
0048 #if IO_CONCAT(__IO_PREFIX,trivial_rw_bw) == 1
0049 __EXTERN_INLINE u8
0050 IO_CONCAT(__IO_PREFIX,readb)(const volatile void __iomem *a)
0051 {
0052     return __kernel_ldbu(*(const volatile u8 __force *)a);
0053 }
0054 
0055 __EXTERN_INLINE u16
0056 IO_CONCAT(__IO_PREFIX,readw)(const volatile void __iomem *a)
0057 {
0058     return __kernel_ldwu(*(const volatile u16 __force *)a);
0059 }
0060 
0061 __EXTERN_INLINE void
0062 IO_CONCAT(__IO_PREFIX,writeb)(u8 b, volatile void __iomem *a)
0063 {
0064     __kernel_stb(b, *(volatile u8 __force *)a);
0065 }
0066 
0067 __EXTERN_INLINE void
0068 IO_CONCAT(__IO_PREFIX,writew)(u16 b, volatile void __iomem *a)
0069 {
0070     __kernel_stw(b, *(volatile u16 __force *)a);
0071 }
0072 #elif IO_CONCAT(__IO_PREFIX,trivial_rw_bw) == 2
0073 __EXTERN_INLINE u8
0074 IO_CONCAT(__IO_PREFIX,readb)(const volatile void __iomem *a)
0075 {
0076     const void __iomem *addr = (const void __iomem *)a;
0077     return IO_CONCAT(__IO_PREFIX,ioread8)(addr);
0078 }
0079 
0080 __EXTERN_INLINE u16
0081 IO_CONCAT(__IO_PREFIX,readw)(const volatile void __iomem *a)
0082 {
0083     const void __iomem *addr = (const void __iomem *)a;
0084     return IO_CONCAT(__IO_PREFIX,ioread16)(addr);
0085 }
0086 
0087 __EXTERN_INLINE void
0088 IO_CONCAT(__IO_PREFIX,writeb)(u8 b, volatile void __iomem *a)
0089 {
0090     void __iomem *addr = (void __iomem *)a;
0091     IO_CONCAT(__IO_PREFIX,iowrite8)(b, addr);
0092 }
0093 
0094 __EXTERN_INLINE void
0095 IO_CONCAT(__IO_PREFIX,writew)(u16 b, volatile void __iomem *a)
0096 {
0097     void __iomem *addr = (void __iomem *)a;
0098     IO_CONCAT(__IO_PREFIX,iowrite16)(b, addr);
0099 }
0100 #endif
0101 
0102 #if IO_CONCAT(__IO_PREFIX,trivial_rw_lq) == 1
0103 __EXTERN_INLINE u32
0104 IO_CONCAT(__IO_PREFIX,readl)(const volatile void __iomem *a)
0105 {
0106     return *(const volatile u32 __force *)a;
0107 }
0108 
0109 __EXTERN_INLINE u64
0110 IO_CONCAT(__IO_PREFIX,readq)(const volatile void __iomem *a)
0111 {
0112     return *(const volatile u64 __force *)a;
0113 }
0114 
0115 __EXTERN_INLINE void
0116 IO_CONCAT(__IO_PREFIX,writel)(u32 b, volatile void __iomem *a)
0117 {
0118     *(volatile u32 __force *)a = b;
0119 }
0120 
0121 __EXTERN_INLINE void
0122 IO_CONCAT(__IO_PREFIX,writeq)(u64 b, volatile void __iomem *a)
0123 {
0124     *(volatile u64 __force *)a = b;
0125 }
0126 #endif
0127 
0128 #if IO_CONCAT(__IO_PREFIX,trivial_iounmap)
0129 __EXTERN_INLINE void IO_CONCAT(__IO_PREFIX,iounmap)(volatile void __iomem *a)
0130 {
0131 }
0132 #endif