1#ifndef _IO_H
2#define __IO_H
3/*
4 * Low-level I/O routines.
5 *
6 * Copied from <file:include/asm-powerpc/io.h> (which has no copyright)
7 */
8static inline int in_8(const volatile unsigned char *addr)
9{
10	int ret;
11
12	__asm__ __volatile__("lbz%U1%X1 %0,%1; twi 0,%0,0; isync"
13			     : "=r" (ret) : "m" (*addr));
14	return ret;
15}
16
17static inline void out_8(volatile unsigned char *addr, int val)
18{
19	__asm__ __volatile__("stb%U0%X0 %1,%0; sync"
20			     : "=m" (*addr) : "r" (val));
21}
22
23static inline unsigned in_le32(const volatile unsigned *addr)
24{
25	unsigned ret;
26
27	__asm__ __volatile__("lwbrx %0,0,%1; twi 0,%0,0; isync"
28			     : "=r" (ret) : "r" (addr), "m" (*addr));
29	return ret;
30}
31
32static inline unsigned in_be32(const volatile unsigned *addr)
33{
34	unsigned ret;
35
36	__asm__ __volatile__("lwz%U1%X1 %0,%1; twi 0,%0,0; isync"
37			     : "=r" (ret) : "m" (*addr));
38	return ret;
39}
40
41static inline void out_le32(volatile unsigned *addr, int val)
42{
43	__asm__ __volatile__("stwbrx %1,0,%2; sync" : "=m" (*addr)
44			     : "r" (val), "r" (addr));
45}
46
47static inline void out_be32(volatile unsigned *addr, int val)
48{
49	__asm__ __volatile__("stw%U0%X0 %1,%0; sync"
50			     : "=m" (*addr) : "r" (val));
51}
52
53#endif /* _IO_H */
54