io.h 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  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. */
  8. static inline int in_8(const volatile unsigned char *addr)
  9. {
  10. int ret;
  11. __asm__ __volatile__("lbz%U1%X1 %0,%1; twi 0,%0,0; isync"
  12. : "=r" (ret) : "m" (*addr));
  13. return ret;
  14. }
  15. static inline void out_8(volatile unsigned char *addr, int val)
  16. {
  17. __asm__ __volatile__("stb%U0%X0 %1,%0; sync"
  18. : "=m" (*addr) : "r" (val));
  19. }
  20. static inline unsigned in_le32(const volatile unsigned *addr)
  21. {
  22. unsigned ret;
  23. __asm__ __volatile__("lwbrx %0,0,%1; twi 0,%0,0; isync"
  24. : "=r" (ret) : "r" (addr), "m" (*addr));
  25. return ret;
  26. }
  27. static inline unsigned in_be32(const volatile unsigned *addr)
  28. {
  29. unsigned ret;
  30. __asm__ __volatile__("lwz%U1%X1 %0,%1; twi 0,%0,0; isync"
  31. : "=r" (ret) : "m" (*addr));
  32. return ret;
  33. }
  34. static inline void out_le32(volatile unsigned *addr, int val)
  35. {
  36. __asm__ __volatile__("stwbrx %1,0,%2; sync" : "=m" (*addr)
  37. : "r" (val), "r" (addr));
  38. }
  39. static inline void out_be32(volatile unsigned *addr, int val)
  40. {
  41. __asm__ __volatile__("stw%U0%X0 %1,%0; sync"
  42. : "=m" (*addr) : "r" (val));
  43. }
  44. #endif /* _IO_H */