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