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