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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * linux/include/asm-m68k/io.h 
  3.  *
  4.  * 4/1/00 RZ: - rewritten to avoid clashes between ISA/PCI and other
  5.  *              IO access
  6.  *            - added Q40 support
  7.  *            - added skeleton for GG-II and Amiga PCMCIA
  8.  * 2/3/01 RZ: - moved a few more defs into raw_io.h
  9.  *
  10.  * inX/outX/readX/writeX should not be used by any driver unless it does
  11.  * ISA or PCI access. Other drivers should use function defined in raw_io.h
  12.  * or define its own macros on top of these.
  13.  *
  14.  *    inX(),outX()              are for PCI and ISA I/O
  15.  *    readX(),writeX()          are for PCI memory
  16.  *    isa_readX(),isa_writeX()  are for ISA memory
  17.  *
  18.  * moved mem{cpy,set}_*io inside CONFIG_PCI
  19.  */
  20. #ifndef _IO_H
  21. #define _IO_H
  22. #ifdef __KERNEL__
  23. #include <linux/config.h>
  24. #include <asm/raw_io.h>
  25. #include <asm/virtconvert.h>
  26. #ifdef CONFIG_ATARI
  27. #include <asm/atarihw.h>
  28. #endif
  29. /*
  30.  * IO/MEM definitions for various ISA bridges
  31.  */
  32. #ifdef CONFIG_Q40
  33. #define q40_isa_io_base  0xff400000
  34. #define q40_isa_mem_base 0xff800000
  35. #define Q40_ISA_IO_B(ioaddr) (q40_isa_io_base+1+4*((unsigned long)(ioaddr)))
  36. #define Q40_ISA_IO_W(ioaddr) (q40_isa_io_base+  4*((unsigned long)(ioaddr)))
  37. #define Q40_ISA_MEM_B(madr)  (q40_isa_mem_base+1+4*((unsigned long)(madr)))
  38. #define Q40_ISA_MEM_W(madr)  (q40_isa_mem_base+  4*((unsigned long)(madr)))
  39. #define MULTI_ISA 0
  40. #endif /* Q40 */
  41. /* GG-II Zorro to ISA bridge */
  42. #ifdef CONFIG_GG2
  43. extern unsigned long gg2_isa_base;
  44. #define GG2_ISA_IO_B(ioaddr) (gg2_isa_base+1+((unsigned long)(ioaddr)*4))
  45. #define GG2_ISA_IO_W(ioaddr) (gg2_isa_base+  ((unsigned long)(ioaddr)*4))
  46. #define GG2_ISA_MEM_B(madr)  (gg2_isa_base+1+(((unsigned long)(madr)*4) & 0xfffff))
  47. #define GG2_ISA_MEM_W(madr)  (gg2_isa_base+  (((unsigned long)(madr)*4) & 0xfffff))
  48. #ifndef MULTI_ISA
  49. #define MULTI_ISA 0
  50. #else 
  51. #undef MULTI_ISA
  52. #define MULTI_ISA 1
  53. #endif
  54. #endif /* GG2 */
  55. #ifdef CONFIG_AMIGA_PCMCIA
  56. #include <asm/amigayle.h>
  57. #define AG_ISA_IO_B(ioaddr) ( GAYLE_IO+(ioaddr)+(((ioaddr)&1)*GAYLE_ODD) )
  58. #define AG_ISA_IO_W(ioaddr) ( GAYLE_IO+(ioaddr) )
  59. #ifndef MULTI_ISA
  60. #define MULTI_ISA 0
  61. #else 
  62. #undef MULTI_ISA
  63. #define MULTI_ISA 1
  64. #endif
  65. #endif /* AMIGA_PCMCIA */
  66. #ifdef CONFIG_ISA
  67. #if MULTI_ISA == 0
  68. #undef MULTI_ISA
  69. #endif
  70. #define Q40_ISA (1)
  71. #define GG2_ISA (2)
  72. #define AG_ISA  (3)
  73. #if defined(CONFIG_Q40) && !defined(MULTI_ISA)
  74. #define ISA_TYPE Q40_ISA
  75. #define ISA_SEX  0
  76. #endif
  77. #if defined(CONFIG_AMIGA_PCMCIA) && !defined(MULTI_ISA)
  78. #define ISA_TYPE AG_ISA
  79. #define ISA_SEX  1
  80. #endif 
  81. #if defined(CONFIG_GG2) && !defined(MULTI_ISA)
  82. #define ISA_TYPE GG2_ISA
  83. #define ISA_SEX  0
  84. #endif
  85. #ifdef MULTI_ISA
  86. extern int isa_type;
  87. extern int isa_sex;
  88. #define ISA_TYPE isa_type
  89. #define ISA_SEX  isa_sex
  90. #endif
  91. /*
  92.  * define inline addr translation functions. Normally only one variant will
  93.  * be compiled in so the case statement will be optimised away
  94.  */
  95. static inline unsigned long isa_itb(long addr)
  96. {
  97.   switch(ISA_TYPE)
  98.     {
  99. #ifdef CONFIG_Q40
  100.     case Q40_ISA: return Q40_ISA_IO_B(addr);
  101. #endif
  102. #ifdef CONFIG_GG2
  103.     case GG2_ISA: return GG2_ISA_IO_B(addr);
  104. #endif
  105. #ifdef CONFIG_AMIGA_PCMCIA
  106.     case AG_ISA: return AG_ISA_IO_B(addr);
  107. #endif
  108.     default: return 0; /* avoid warnings, just in case */
  109.     }
  110. }
  111. static inline unsigned long isa_itw(long addr)
  112. {
  113.   switch(ISA_TYPE)
  114.     {
  115. #ifdef CONFIG_Q40
  116.     case Q40_ISA: return Q40_ISA_IO_W(addr);
  117. #endif
  118. #ifdef CONFIG_GG2
  119.     case GG2_ISA: return GG2_ISA_IO_W(addr);
  120. #endif
  121. #ifdef CONFIG_AMIGA_PCMCIA
  122.     case AG_ISA: return AG_ISA_IO_W(addr);
  123. #endif
  124.     default: return 0; /* avoid warnings, just in case */
  125.     }
  126. }
  127. static inline unsigned long isa_mtb(long addr)
  128. {
  129.   switch(ISA_TYPE)
  130.     {
  131. #ifdef CONFIG_Q40
  132.     case Q40_ISA: return Q40_ISA_MEM_B(addr);
  133. #endif
  134. #ifdef CONFIG_GG2
  135.     case GG2_ISA: return GG2_ISA_MEM_B(addr);
  136. #endif
  137.       /* FIXME: any ISA mem mapping for PCMCIA? */
  138.     default: return 0; /* avoid warnings, just in case */
  139.     }
  140. }
  141. static inline unsigned long isa_mtw(long addr)
  142. {
  143.   switch(ISA_TYPE)
  144.     {
  145. #ifdef CONFIG_Q40
  146.     case Q40_ISA: return Q40_ISA_MEM_W(addr);
  147. #endif
  148. #ifdef CONFIG_GG2
  149.     case GG2_ISA: return GG2_ISA_MEM_W(addr);
  150. #endif
  151.     default: return 0; /* avoid warnings, just in case */
  152.     }
  153. }
  154. #define isa_inb(port)      in_8(isa_itb(port))
  155. #define isa_inw(port)      (ISA_SEX ? in_be16(isa_itw(port)) : in_le16(isa_itw(port)))
  156. #define isa_outb(val,port) out_8(isa_itb(port),(val))
  157. #define isa_outw(val,port) (ISA_SEX ? out_be16(isa_itw(port),(val)) : out_le16(isa_itw(port),(val)))
  158. #define isa_readb(p)       in_8(isa_mtb(p))
  159. #define isa_readw(p)       in_le16(isa_mtw(p))
  160. #define isa_writeb(val,p)  out_8(isa_mtb(p),(val))
  161. #define isa_writew(val,p)  out_le16(isa_mtw(p),(val))
  162. static inline void isa_delay(void)
  163. {
  164.   switch(ISA_TYPE)
  165.     {
  166. #ifdef CONFIG_Q40
  167.     case Q40_ISA: isa_outb(0,0x80); break;
  168. #endif
  169. #ifdef CONFIG_GG2
  170.     case GG2_ISA: break;
  171. #endif
  172. #ifdef CONFIG_AMIGA_PCMCIA
  173.     case AG_ISA: break;
  174. #endif
  175.     default: break; /* avoid warnings */
  176.     }
  177. }
  178. #define isa_inb_p(p)      ({unsigned char v=isa_inb(p);isa_delay();v;})
  179. #define isa_outb_p(v,p)   ({isa_outb((v),(p));isa_delay();})
  180. #define isa_insb(port, buf, nr) raw_insb(isa_itb(port), (buf), (nr))
  181. #define isa_outsb(port, buf, nr) raw_outsb(isa_itb(port), (buf), (nr))
  182. #define isa_insw(port, buf, nr)     
  183.        (ISA_SEX ? raw_insw(isa_itw(port), (buf), (nr)) :    
  184.                   raw_insw_swapw(isa_itw(port), (buf), (nr)))
  185. #define isa_outsw(port, buf, nr)    
  186.        (ISA_SEX ? raw_outsw(isa_itw(port), (buf), (nr)) :  
  187.                   raw_outsw_swapw(isa_itw(port), (buf), (nr)))
  188. #endif  /* CONFIG_ISA */
  189. #if defined(CONFIG_ISA) && !defined(CONFIG_PCI) 
  190. #define inb     isa_inb
  191. #define inb_p   isa_inb_p
  192. #define outb    isa_outb
  193. #define outb_p  isa_outb_p
  194. #define inw     isa_inw
  195. #define outw    isa_outw
  196. #define inl     isa_inw
  197. #define outl    isa_outw
  198. #define insb    isa_insb
  199. #define insw    isa_insw
  200. #define outsb   isa_outsb
  201. #define outsw   isa_outsw
  202. #define readb   isa_readb
  203. #define readw   isa_readw
  204. #define writeb  isa_writeb
  205. #define writew  isa_writew
  206. #endif /* CONFIG_ISA */
  207. #if defined(CONFIG_PCI)
  208. #define inl(port)        in_le32(port)
  209. #define outl(val,port)   out_le32((port),(val))
  210. #define readl(addr)      in_le32(addr)
  211. #define writel(val,addr) out_le32((addr),(val))
  212. /* those can be defined for both ISA and PCI - it wont work though */
  213. #define readb(addr)       in_8(addr)
  214. #define readw(addr)       in_le16(addr)
  215. #define writeb(val,addr)  out_8((addr),(val))
  216. #define writew(val,addr)  out_le16((addr),(val))
  217. #ifndef CONFIG_ISA
  218. #define inb(port)      in_8(port)
  219. #define outb(val,port) out_8((port),(val))
  220. #define inw(port)      in_le16(port)
  221. #define outw(val,port) out_le16((port),(val))
  222. #else
  223. /*
  224.  * kernel with both ISA and PCI compiled in, those have 
  225.  * conflicting defs for in/out. Simply consider port < 1024 
  226.  * ISA and everything else PCI. read,write not defined
  227.  * in this case
  228.  */
  229. #define inb(port) ((port)<1024 ? isa_inb(port) : in_8(port))
  230. #define inb_p(port) ((port)<1024 ? isa_inb_p(port) : in_8(port))
  231. #define inw(port) ((port)<1024 ? isa_inw(port) : in_le16(port))
  232. #define outb(val,port) ((port)<1024 ? isa_outb((val),(port)) : out_8((port),(val)))
  233. #define outb_p(val,port) ((port)<1024 ? isa_outb_p((val),(port)) : out_8((port),(val)))
  234. #define outw(val,port) ((port)<1024 ? isa_outw((val),(port)) : out_le16((port),(val)))
  235. #endif
  236. #endif /* CONFIG_PCI */
  237. /* Values for nocacheflag and cmode */
  238. #define IOMAP_FULL_CACHING 0
  239. #define IOMAP_NOCACHE_SER 1
  240. #define IOMAP_NOCACHE_NONSER 2
  241. #define IOMAP_WRITETHROUGH 3
  242. /*
  243.  * Change "struct page" to physical address.
  244.  */
  245. #define page_to_phys(page) ((page - mem_map) << PAGE_SHIFT)
  246. extern void iounmap(void *addr);
  247. extern void *__ioremap(unsigned long physaddr, unsigned long size,
  248.        int cacheflag);
  249. extern void __iounmap(void *addr, unsigned long size);
  250. extern inline void *ioremap(unsigned long physaddr, unsigned long size)
  251. {
  252. return __ioremap(physaddr, size, IOMAP_NOCACHE_SER);
  253. }
  254. extern inline void *ioremap_nocache(unsigned long physaddr, unsigned long size)
  255. {
  256. return __ioremap(physaddr, size, IOMAP_NOCACHE_SER);
  257. }
  258. extern inline void *ioremap_writethrough(unsigned long physaddr,
  259.  unsigned long size)
  260. {
  261. return __ioremap(physaddr, size, IOMAP_WRITETHROUGH);
  262. }
  263. extern inline void *ioremap_fullcache(unsigned long physaddr,
  264.       unsigned long size)
  265. {
  266. return __ioremap(physaddr, size, IOMAP_FULL_CACHING);
  267. }
  268. /* m68k caches aren't DMA coherent */
  269. extern void dma_cache_wback_inv(unsigned long start, unsigned long size);
  270. extern void dma_cache_wback(unsigned long start, unsigned long size);
  271. extern void dma_cache_inv(unsigned long start, unsigned long size);
  272. #ifndef CONFIG_SUN3
  273. #define IO_SPACE_LIMIT 0xffff
  274. #else
  275. #define IO_SPACE_LIMIT 0x0fffffff
  276. #endif
  277. #endif /* __KERNEL__ */
  278. #endif /* _IO_H */