io.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:6k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * linux/include/asm-arm/arch-shark/io.h
  3.  *
  4.  * by Alexander Schulz
  5.  *
  6.  * derived from:
  7.  * linux/include/asm-arm/arch-ebsa110/io.h
  8.  * Copyright (C) 1997,1998 Russell King
  9.  */
  10. #ifndef __ASM_ARM_ARCH_IO_H
  11. #define __ASM_ARM_ARCH_IO_H
  12. #define iomem_valid_addr(off,sz) (1)
  13. #define iomem_to_phys(off) (off)
  14. #define IO_SPACE_LIMIT 0xffffffff
  15. /*
  16.  * We use two different types of addressing - PC style addresses, and ARM
  17.  * addresses.  PC style accesses the PC hardware with the normal PC IO
  18.  * addresses, eg 0x3f8 for serial#1.  ARM addresses are 0x80000000+
  19.  * and are translated to the start of IO.
  20.  */
  21. #define __PORT_PCIO(x) (!((x) & 0x80000000))
  22. /*
  23.  * Dynamic IO functions - let the compiler
  24.  * optimize the expressions
  25.  */
  26. #define DECLARE_DYN_OUT(fnsuffix,instr)
  27. static inline void __out##fnsuffix (unsigned int value, unsigned int port)
  28. {
  29. unsigned long temp;
  30. __asm__ __volatile__(
  31. "tst %2, #0x80000000nt"
  32. "mov %0, %4nt"
  33. "addeq %0, %0, %3nt"
  34. "str" instr " %1, [%0, %2] @ out" #fnsuffix
  35. : "=&r" (temp)
  36. : "r" (value), "r" (port), "Ir" (PCIO_BASE - IO_BASE), "Ir" (IO_BASE)
  37. : "cc");
  38. }
  39. #define DECLARE_DYN_IN(sz,fnsuffix,instr)
  40. static inline unsigned sz __in##fnsuffix (unsigned int port)
  41. {
  42. unsigned long temp, value;
  43. __asm__ __volatile__(
  44. "tst %2, #0x80000000nt"
  45. "mov %0, %4nt"
  46. "addeq %0, %0, %3nt"
  47. "ldr" instr " %1, [%0, %2] @ in" #fnsuffix
  48. : "=&r" (temp), "=r" (value)
  49. : "r" (port), "Ir" (PCIO_BASE - IO_BASE), "Ir" (IO_BASE)
  50. : "cc");
  51. return (unsigned sz)value;
  52. }
  53. static inline unsigned int __ioaddr (unsigned int port)
  54. {
  55. if (__PORT_PCIO(port))
  56. return (unsigned int)(PCIO_BASE + (port));
  57. else
  58. return (unsigned int)(IO_BASE + (port));
  59. }
  60. #define DECLARE_IO(sz,fnsuffix,instr)
  61. DECLARE_DYN_OUT(fnsuffix,instr)
  62. DECLARE_DYN_IN(sz,fnsuffix,instr)
  63. DECLARE_IO(char,b,"b")
  64. DECLARE_IO(short,w,"h")
  65. DECLARE_IO(long,l,"")
  66. #undef DECLARE_IO
  67. #undef DECLARE_DYN_OUT
  68. #undef DECLARE_DYN_IN
  69. /*
  70.  * Constant address IO functions
  71.  *
  72.  * These have to be macros for the 'J' constraint to work -
  73.  * +/-4096 immediate operand.
  74.  */
  75. #define __outbc(value,port)
  76. ({
  77. if (__PORT_PCIO((port)))
  78. __asm__ __volatile__(
  79. "strb %0, [%1, %2] @ outbc"
  80. : : "r" (value), "r" (PCIO_BASE), "Jr" (port));
  81. else
  82. __asm__ __volatile__(
  83. "strb %0, [%1, %2] @ outbc"
  84. : : "r" (value), "r" (IO_BASE), "r" (port));
  85. })
  86. #define __inbc(port)
  87. ({
  88. unsigned char result;                                                   
  89. if (__PORT_PCIO((port)))
  90. __asm__ __volatile__(
  91. "ldrb %0, [%1, %2] @ inbc"
  92. : "=r" (result) : "r" (PCIO_BASE), "Jr" (port));
  93. else
  94. __asm__ __volatile__(
  95. "ldrb %0, [%1, %2] @ inbc"
  96. : "=r" (result) : "r" (IO_BASE), "r" (port));
  97. result;
  98. })
  99. #define __outwc(value,port)
  100. ({
  101. unsigned long v = value;
  102. if (__PORT_PCIO((port)))
  103. __asm__ __volatile__(
  104. "strh %0, [%1, %2] @ outwc"
  105. : : "r" (v|v<<16), "r" (PCIO_BASE), "Jr" (port));
  106. else
  107. __asm__ __volatile__(
  108. "strh %0, [%1, %2] @ outwc"
  109. : : "r" (v|v<<16), "r" (IO_BASE), "r" (port));
  110. })
  111. #define __inwc(port)
  112. ({
  113. unsigned short result;
  114. if (__PORT_PCIO((port)))
  115. __asm__ __volatile__(
  116. "ldrh %0, [%1, %2] @ inwc"
  117. : "=r" (result) : "r" (PCIO_BASE), "Jr" (port));
  118. else
  119. __asm__ __volatile__(
  120. "ldrh %0, [%1, %2] @ inwc"
  121. : "=r" (result) : "r" (IO_BASE), "r" (port));
  122. result & 0xffff;
  123. })
  124. #define __outlc(value,port)
  125. ({
  126. unsigned long v = value;
  127. if (__PORT_PCIO((port)))
  128. __asm__ __volatile__(
  129. "str %0, [%1, %2] @ outlc"
  130. : : "r" (v), "r" (PCIO_BASE), "Jr" (port));
  131. else
  132. __asm__ __volatile__(
  133. "str %0, [%1, %2] @ outlc"
  134. : : "r" (v), "r" (IO_BASE), "r" (port));
  135. })
  136. #define __inlc(port)
  137. ({
  138. unsigned long result;
  139. if (__PORT_PCIO((port)))
  140. __asm__ __volatile__(
  141. "ldr %0, [%1, %2] @ inlc"
  142. : "=r" (result) : "r" (PCIO_BASE), "Jr" (port));
  143. else
  144. __asm__ __volatile__(
  145. "ldr %0, [%1, %2] @ inlc"
  146. : "=r" (result) : "r" (IO_BASE), "r" (port));
  147. result;
  148. })
  149. #define __ioaddrc(port)
  150. ({
  151. unsigned long addr;
  152. if (__PORT_PCIO((port)))
  153. addr = PCIO_BASE + (port);
  154. else
  155. addr = IO_BASE + (port);
  156. addr;
  157. })
  158. #define __mem_pci(addr) addr
  159. #define inb(p)   (__builtin_constant_p((p)) ? __inbc(p)    : __inb(p))
  160. #define inw(p)   (__builtin_constant_p((p)) ? __inwc(p)    : __inw(p))
  161. #define inl(p)   (__builtin_constant_p((p)) ? __inlc(p)    : __inl(p))
  162. #define outb(v,p) (__builtin_constant_p((p)) ? __outbc(v,p) : __outb(v,p))
  163. #define outw(v,p) (__builtin_constant_p((p)) ? __outwc(v,p) : __outw(v,p))
  164. #define outl(v,p) (__builtin_constant_p((p)) ? __outlc(v,p) : __outl(v,p))
  165. #define __arch_getw(addr) (*(volatile unsigned short *)(addr))
  166. #define __arch_putw(b,addr) (*(volatile unsigned short *)(addr) = (b))
  167. /*
  168.  * Translated address IO functions
  169.  *
  170.  * IO address has already been translated to a virtual address
  171.  */
  172. #define outb_t(v,p)
  173. (*(volatile unsigned char *)(p) = (v))
  174. #define inb_t(p)
  175. (*(volatile unsigned char *)(p))
  176. #define outl_t(v,p)
  177. (*(volatile unsigned long *)(p) = (v))
  178. #define inl_t(p)
  179. (*(volatile unsigned long *)(p))
  180. #endif