io.h
上传用户:szlgq88
上传日期:2009-04-28
资源大小:48287k
文件大小:6k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * linux/include/asm-arm/arch-s3c2410/io.h
  3.  *  from linux/include/asm-arm/arch-rpc/io.h
  4.  *
  5.  * Copyright (C) 1997 Russell King
  6.  *      (C) 2003 Simtec Electronics
  7.  *
  8.  * Modifications:
  9.  *  06-Dec-1997 RMK Created.
  10.  *  02-Sep-2003 BJD Modified for S3C2410
  11.  *  10-Mar-2005 LCVR Changed S3C2410_VA to S3C24XX_VA
  12.  *  13-Oct-2005 BJD Fixed problems with LDRH/STRH offset range
  13.  */
  14. #ifndef __ASM_ARM_ARCH_IO_H
  15. #define __ASM_ARM_ARCH_IO_H
  16. #define IO_SPACE_LIMIT 0xffffffff
  17. /*
  18.  * We use two different types of addressing - PC style addresses, and ARM
  19.  * addresses.  PC style accesses the PC hardware with the normal PC IO
  20.  * addresses, eg 0x3f8 for serial#1.  ARM addresses are above A28
  21.  * and are translated to the start of IO.  Note that all addresses are
  22.  * not shifted left!
  23.  */
  24. #define __PORT_PCIO(x) ((x) < (1<<28))
  25. #define PCIO_BASE  (S3C24XX_VA_ISA_WORD)
  26. #define PCIO_BASE_b  (S3C24XX_VA_ISA_BYTE)
  27. #define PCIO_BASE_w  (S3C24XX_VA_ISA_WORD)
  28. #define PCIO_BASE_l  (S3C24XX_VA_ISA_WORD)
  29. /*
  30.  * Dynamic IO functions - let the compiler
  31.  * optimize the expressions
  32.  */
  33. #define DECLARE_DYN_OUT(sz,fnsuffix,instr) 
  34. static inline void __out##fnsuffix (unsigned int val, unsigned int port) 
  35. unsigned long temp;       
  36. __asm__ __volatile__(       
  37. "cmp %2, #(1<<28)nt"       
  38. "mov %0, %2nt"       
  39. "addcc %0, %0, %3nt"       
  40. "str" instr " %1, [%0, #0 ] @ out" #fnsuffix      
  41. : "=&r" (temp)       
  42. : "r" (val), "r" (port), "Ir" (PCIO_BASE_##fnsuffix)  
  43. : "cc");       
  44. }
  45. #define DECLARE_DYN_IN(sz,fnsuffix,instr)
  46. static inline unsigned sz __in##fnsuffix (unsigned int port)
  47. {
  48. unsigned long temp, value;
  49. __asm__ __volatile__(
  50. "cmp %2, #(1<<28)nt"
  51. "mov %0, %2nt"
  52. "addcc %0, %0, %3nt"
  53. "ldr" instr " %1, [%0, #0 ] @ in" #fnsuffix
  54. : "=&r" (temp), "=r" (value)
  55. : "r" (port), "Ir" (PCIO_BASE_##fnsuffix)
  56. : "cc");
  57. return (unsigned sz)value;
  58. }
  59. static inline void __iomem *__ioaddr (unsigned long port)
  60. {
  61. return __PORT_PCIO(port) ? (PCIO_BASE + port) : (void __iomem *)port;
  62. }
  63. #define DECLARE_IO(sz,fnsuffix,instr)
  64. DECLARE_DYN_IN(sz,fnsuffix,instr) 
  65. DECLARE_DYN_OUT(sz,fnsuffix,instr)
  66. DECLARE_IO(char,b,"b")
  67. DECLARE_IO(short,w,"h")
  68. DECLARE_IO(int,l,"")
  69. #undef DECLARE_IO
  70. #undef DECLARE_DYN_IN
  71. /*
  72.  * Constant address IO functions
  73.  *
  74.  * These have to be macros for the 'J' constraint to work -
  75.  * +/-4096 immediate operand.
  76.  */
  77. #define __outbc(value,port)
  78. ({
  79. if (__PORT_PCIO((port)))
  80. __asm__ __volatile__(
  81. "strb %0, [%1, %2] @ outbc"
  82. : : "r" (value), "r" (PCIO_BASE), "Jr" ((port)));
  83. else
  84. __asm__ __volatile__(
  85. "strb %0, [%1, #0] @ outbc"
  86. : : "r" (value), "r" ((port)));
  87. })
  88. #define __inbc(port)
  89. ({
  90. unsigned char result;
  91. if (__PORT_PCIO((port)))
  92. __asm__ __volatile__(
  93. "ldrb %0, [%1, %2] @ inbc"
  94. : "=r" (result) : "r" (PCIO_BASE), "Jr" ((port)));
  95. else
  96. __asm__ __volatile__(
  97. "ldrb %0, [%1, #0] @ inbc"
  98. : "=r" (result) : "r" ((port)));
  99. result;
  100. })
  101. #define __outwc(value,port)
  102. ({
  103. unsigned long v = value;
  104. if (__PORT_PCIO((port))) {
  105. if ((port) < 256 && (port) > -256)
  106. __asm__ __volatile__(
  107. "strh %0, [%1, %2] @ outwc"
  108. : : "r" (v), "r" (PCIO_BASE), "Jr" ((port)));
  109. else if ((port) > 0)
  110. __asm__ __volatile__(
  111. "strh %0, [%1, %2] @ outwc"
  112. : : "r" (v),
  113.     "r" (PCIO_BASE + ((port) & ~0xff)),
  114.      "Jr" (((port) & 0xff)));
  115. else
  116. __asm__ __volatile__(
  117. "strh %0, [%1, #0] @ outwc"
  118. : : "r" (v),
  119.     "r" (PCIO_BASE + (port)));
  120. } else
  121. __asm__ __volatile__(
  122. "strh %0, [%1, #0] @ outwc"
  123. : : "r" (v), "r" ((port)));
  124. })
  125. #define __inwc(port)
  126. ({
  127. unsigned short result;
  128. if (__PORT_PCIO((port))) {
  129. if ((port) < 256 && (port) > -256 )
  130. __asm__ __volatile__(
  131. "ldrh %0, [%1, %2] @ inwc"
  132. : "=r" (result)
  133. : "r" (PCIO_BASE),
  134.   "Jr" ((port)));
  135. else if ((port) > 0)
  136. __asm__ __volatile__(
  137. "ldrh %0, [%1, %2] @ inwc"
  138. : "=r" (result)
  139. : "r" (PCIO_BASE + ((port) & ~0xff)),
  140.   "Jr" (((port) & 0xff)));
  141. else
  142. __asm__ __volatile__(
  143. "ldrh %0, [%1, #0] @ inwc"
  144. : "=r" (result)
  145. : "r" (PCIO_BASE + ((port))));
  146. } else
  147. __asm__ __volatile__(
  148. "ldrh %0, [%1, #0] @ inwc"
  149. : "=r" (result) : "r" ((port)));
  150. result;
  151. })
  152. #define __outlc(value,port)
  153. ({
  154. unsigned long v = value;
  155. if (__PORT_PCIO((port)))
  156. __asm__ __volatile__(
  157. "str %0, [%1, %2] @ outlc"
  158. : : "r" (v), "r" (PCIO_BASE), "Jr" ((port)));
  159. else
  160. __asm__ __volatile__(
  161. "str %0, [%1, #0] @ outlc"
  162. : : "r" (v), "r" ((port)));
  163. })
  164. #define __inlc(port)
  165. ({
  166. unsigned long result;
  167. if (__PORT_PCIO((port)))
  168. __asm__ __volatile__(
  169. "ldr %0, [%1, %2] @ inlc"
  170. : "=r" (result) : "r" (PCIO_BASE), "Jr" ((port)));
  171. else
  172. __asm__ __volatile__(
  173. "ldr %0, [%1, #0] @ inlc"
  174. : "=r" (result) : "r" ((port)));
  175. result;
  176. })
  177. #define __ioaddrc(port) ((__PORT_PCIO(port) ? PCIO_BASE + (port) : (void __iomem *)(port)))
  178. #define inb(p) (__builtin_constant_p((p)) ? __inbc(p)    : __inb(p))
  179. #define inw(p) (__builtin_constant_p((p)) ? __inwc(p)    : __inw(p))
  180. #define inl(p) (__builtin_constant_p((p)) ? __inlc(p)    : __inl(p))
  181. #define outb(v,p) (__builtin_constant_p((p)) ? __outbc(v,p) : __outb(v,p))
  182. #define outw(v,p) (__builtin_constant_p((p)) ? __outwc(v,p) : __outw(v,p))
  183. #define outl(v,p) (__builtin_constant_p((p)) ? __outlc(v,p) : __outl(v,p))
  184. #define __ioaddr(p) (__builtin_constant_p((p)) ? __ioaddr(p)  : __ioaddrc(p))
  185. /* the following macro is deprecated */
  186. #define ioaddr(port) __ioaddr((port))
  187. #define insb(p,d,l) __raw_readsb(__ioaddr(p),d,l)
  188. #define insw(p,d,l) __raw_readsw(__ioaddr(p),d,l)
  189. #define insl(p,d,l) __raw_readsl(__ioaddr(p),d,l)
  190. #define outsb(p,d,l) __raw_writesb(__ioaddr(p),d,l)
  191. #define outsw(p,d,l) __raw_writesw(__ioaddr(p),d,l)
  192. #define outsl(p,d,l) __raw_writesl(__ioaddr(p),d,l)
  193. /*
  194.  * 1:1 mapping for ioremapped regions.
  195.  */
  196. #define __mem_pci(x) (x)
  197. #endif