10c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer#ifndef _IO_H
20c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer#define __IO_H
36e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood
46e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood#include "types.h"
56e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood
60c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer/*
70c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer * Low-level I/O routines.
80c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer *
9b8b572e1015f81b4e748417be2629dfe51ab99f9Stephen Rothwell * Copied from <file:arch/powerpc/include/asm/io.h> (which has no copyright)
100c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer */
110c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greerstatic inline int in_8(const volatile unsigned char *addr)
120c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer{
130c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer	int ret;
140c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer
150c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer	__asm__ __volatile__("lbz%U1%X1 %0,%1; twi 0,%0,0; isync"
160c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer			     : "=r" (ret) : "m" (*addr));
170c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer	return ret;
180c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer}
190c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer
200c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greerstatic inline void out_8(volatile unsigned char *addr, int val)
210c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer{
220c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer	__asm__ __volatile__("stb%U0%X0 %1,%0; sync"
230c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer			     : "=m" (*addr) : "r" (val));
240c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer}
250c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer
266e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Woodstatic inline unsigned in_le16(const volatile u16 *addr)
276e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood{
286e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood	unsigned ret;
296e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood
306e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood	__asm__ __volatile__("lhbrx %0,0,%1; twi 0,%0,0; isync"
316e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood			     : "=r" (ret) : "r" (addr), "m" (*addr));
326e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood
336e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood	return ret;
346e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood}
356e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood
366e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Woodstatic inline unsigned in_be16(const volatile u16 *addr)
376e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood{
386e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood	unsigned ret;
396e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood
406e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood	__asm__ __volatile__("lhz%U1%X1 %0,%1; twi 0,%0,0; isync"
416e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood			     : "=r" (ret) : "m" (*addr));
426e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood	return ret;
436e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood}
446e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood
456e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Woodstatic inline void out_le16(volatile u16 *addr, int val)
466e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood{
476e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood	__asm__ __volatile__("sthbrx %1,0,%2; sync" : "=m" (*addr)
486e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood			     : "r" (val), "r" (addr));
496e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood}
506e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood
516e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Woodstatic inline void out_be16(volatile u16 *addr, int val)
526e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood{
536e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood	__asm__ __volatile__("sth%U0%X0 %1,%0; sync"
546e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood			     : "=m" (*addr) : "r" (val));
556e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood}
566e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood
570c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greerstatic inline unsigned in_le32(const volatile unsigned *addr)
580c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer{
590c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer	unsigned ret;
600c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer
610c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer	__asm__ __volatile__("lwbrx %0,0,%1; twi 0,%0,0; isync"
620c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer			     : "=r" (ret) : "r" (addr), "m" (*addr));
630c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer	return ret;
640c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer}
650c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer
660c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greerstatic inline unsigned in_be32(const volatile unsigned *addr)
670c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer{
680c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer	unsigned ret;
690c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer
700c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer	__asm__ __volatile__("lwz%U1%X1 %0,%1; twi 0,%0,0; isync"
710c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer			     : "=r" (ret) : "m" (*addr));
720c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer	return ret;
730c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer}
740c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer
750c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greerstatic inline void out_le32(volatile unsigned *addr, int val)
760c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer{
770c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer	__asm__ __volatile__("stwbrx %1,0,%2; sync" : "=m" (*addr)
780c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer			     : "r" (val), "r" (addr));
790c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer}
800c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer
810c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greerstatic inline void out_be32(volatile unsigned *addr, int val)
820c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer{
830c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer	__asm__ __volatile__("stw%U0%X0 %1,%0; sync"
840c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer			     : "=m" (*addr) : "r" (val));
850c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer}
860c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer
876e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Woodstatic inline void sync(void)
886e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood{
896e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood	asm volatile("sync" : : : "memory");
906e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood}
916e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood
926e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Woodstatic inline void eieio(void)
936e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood{
946e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood	asm volatile("eieio" : : : "memory");
956e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood}
966e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood
976e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Woodstatic inline void barrier(void)
986e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood{
996e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood	asm volatile("" : : : "memory");
1006e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood}
1016e913c67b3eb93e2b8bc1dc0ff854f00a760f41bScott Wood
1020c176fa80fdfa9b4e0753e37223b056994c818d2Mark A. Greer#endif /* _IO_H */
103