Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
0c176fa8 | 2 | #ifndef _IO_H |
c03719ef | 3 | #define _IO_H |
6e913c67 SW |
4 | |
5 | #include "types.h" | |
6 | ||
0c176fa8 MG |
7 | /* |
8 | * Low-level I/O routines. | |
9 | * | |
b8b572e1 | 10 | * Copied from <file:arch/powerpc/include/asm/io.h> (which has no copyright) |
0c176fa8 MG |
11 | */ |
12 | static inline int in_8(const volatile unsigned char *addr) | |
13 | { | |
14 | int ret; | |
15 | ||
16 | __asm__ __volatile__("lbz%U1%X1 %0,%1; twi 0,%0,0; isync" | |
17 | : "=r" (ret) : "m" (*addr)); | |
18 | return ret; | |
19 | } | |
20 | ||
21 | static inline void out_8(volatile unsigned char *addr, int val) | |
22 | { | |
23 | __asm__ __volatile__("stb%U0%X0 %1,%0; sync" | |
24 | : "=m" (*addr) : "r" (val)); | |
25 | } | |
26 | ||
6e913c67 SW |
27 | static inline unsigned in_le16(const volatile u16 *addr) |
28 | { | |
29 | unsigned ret; | |
30 | ||
31 | __asm__ __volatile__("lhbrx %0,0,%1; twi 0,%0,0; isync" | |
32 | : "=r" (ret) : "r" (addr), "m" (*addr)); | |
33 | ||
34 | return ret; | |
35 | } | |
36 | ||
37 | static inline unsigned in_be16(const volatile u16 *addr) | |
38 | { | |
39 | unsigned ret; | |
40 | ||
41 | __asm__ __volatile__("lhz%U1%X1 %0,%1; twi 0,%0,0; isync" | |
42 | : "=r" (ret) : "m" (*addr)); | |
43 | return ret; | |
44 | } | |
45 | ||
46 | static inline void out_le16(volatile u16 *addr, int val) | |
47 | { | |
48 | __asm__ __volatile__("sthbrx %1,0,%2; sync" : "=m" (*addr) | |
49 | : "r" (val), "r" (addr)); | |
50 | } | |
51 | ||
52 | static inline void out_be16(volatile u16 *addr, int val) | |
53 | { | |
54 | __asm__ __volatile__("sth%U0%X0 %1,%0; sync" | |
55 | : "=m" (*addr) : "r" (val)); | |
56 | } | |
57 | ||
0c176fa8 MG |
58 | static inline unsigned in_le32(const volatile unsigned *addr) |
59 | { | |
60 | unsigned ret; | |
61 | ||
62 | __asm__ __volatile__("lwbrx %0,0,%1; twi 0,%0,0; isync" | |
63 | : "=r" (ret) : "r" (addr), "m" (*addr)); | |
64 | return ret; | |
65 | } | |
66 | ||
67 | static inline unsigned in_be32(const volatile unsigned *addr) | |
68 | { | |
69 | unsigned ret; | |
70 | ||
71 | __asm__ __volatile__("lwz%U1%X1 %0,%1; twi 0,%0,0; isync" | |
72 | : "=r" (ret) : "m" (*addr)); | |
73 | return ret; | |
74 | } | |
75 | ||
76 | static inline void out_le32(volatile unsigned *addr, int val) | |
77 | { | |
78 | __asm__ __volatile__("stwbrx %1,0,%2; sync" : "=m" (*addr) | |
79 | : "r" (val), "r" (addr)); | |
80 | } | |
81 | ||
82 | static inline void out_be32(volatile unsigned *addr, int val) | |
83 | { | |
84 | __asm__ __volatile__("stw%U0%X0 %1,%0; sync" | |
85 | : "=m" (*addr) : "r" (val)); | |
86 | } | |
87 | ||
6e913c67 SW |
88 | static inline void sync(void) |
89 | { | |
90 | asm volatile("sync" : : : "memory"); | |
91 | } | |
92 | ||
93 | static inline void eieio(void) | |
94 | { | |
95 | asm volatile("eieio" : : : "memory"); | |
96 | } | |
97 | ||
98 | static inline void barrier(void) | |
99 | { | |
100 | asm volatile("" : : : "memory"); | |
101 | } | |
102 | ||
0c176fa8 | 103 | #endif /* _IO_H */ |