io_generic.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:4k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* $Id: io_generic.c,v 1.12 2000/11/14 16:45:11 sugioka Exp $
  2.  *
  3.  * linux/arch/sh/kernel/io_generic.c
  4.  *
  5.  * Copyright (C) 2000  Niibe Yutaka
  6.  *
  7.  * Generic I/O routine. These can be used where a machine specific version
  8.  * is not required.
  9.  *
  10.  * This file is subject to the terms and conditions of the GNU General Public
  11.  * License.  See the file "COPYING" in the main directory of this archive
  12.  * for more details.
  13.  *
  14.  */
  15. #include <asm/io.h>
  16. #include <asm/machvec.h>
  17. #include <linux/module.h>
  18. #if defined(__sh3__)
  19. /* I'm not sure SH7709 has this kind of bug */
  20. #define SH3_PCMCIA_BUG_WORKAROUND 1
  21. #define DUMMY_READ_AREA6   0xba000000
  22. #endif
  23. #define PORT2ADDR(x) (sh_mv.mv_isa_port2addr(x))
  24. unsigned long generic_io_base;
  25. static inline void delay(void)
  26. {
  27. ctrl_inw(0xa0000000);
  28. }
  29. unsigned char generic_inb(unsigned long port)
  30. {
  31. return *(volatile unsigned char*)PORT2ADDR(port);
  32. }
  33. unsigned short generic_inw(unsigned long port)
  34. {
  35. return *(volatile unsigned short*)PORT2ADDR(port);
  36. }
  37. unsigned int generic_inl(unsigned long port)
  38. {
  39. return *(volatile unsigned long*)PORT2ADDR(port);
  40. }
  41. unsigned char generic_inb_p(unsigned long port)
  42. {
  43. unsigned long v = *(volatile unsigned char*)PORT2ADDR(port);
  44. delay();
  45. return v;
  46. }
  47. unsigned short generic_inw_p(unsigned long port)
  48. {
  49. unsigned long v = *(volatile unsigned short*)PORT2ADDR(port);
  50. delay();
  51. return v;
  52. }
  53. unsigned int generic_inl_p(unsigned long port)
  54. {
  55. unsigned long v = *(volatile unsigned long*)PORT2ADDR(port);
  56. delay();
  57. return v;
  58. }
  59. void generic_insb(unsigned long port, void *buffer, unsigned long count)
  60. {
  61. unsigned char *buf=buffer;
  62. while(count--) *buf++=inb(port);
  63. }
  64. void generic_insw(unsigned long port, void *buffer, unsigned long count)
  65. {
  66. unsigned short *buf=buffer;
  67. while(count--) *buf++=inw(port);
  68. #ifdef SH3_PCMCIA_BUG_WORKAROUND
  69. ctrl_inb (DUMMY_READ_AREA6);
  70. #endif
  71. }
  72. void generic_insl(unsigned long port, void *buffer, unsigned long count)
  73. {
  74. unsigned long *buf=buffer;
  75. while(count--) *buf++=inl(port);
  76. #ifdef SH3_PCMCIA_BUG_WORKAROUND
  77. ctrl_inb (DUMMY_READ_AREA6);
  78. #endif
  79. }
  80. void generic_outb(unsigned char b, unsigned long port)
  81. {
  82. *(volatile unsigned char*)PORT2ADDR(port) = b;
  83. }
  84. void generic_outw(unsigned short b, unsigned long port)
  85. {
  86. *(volatile unsigned short*)PORT2ADDR(port) = b;
  87. }
  88. void generic_outl(unsigned int b, unsigned long port)
  89. {
  90.         *(volatile unsigned long*)PORT2ADDR(port) = b;
  91. }
  92. void generic_outb_p(unsigned char b, unsigned long port)
  93. {
  94. *(volatile unsigned char*)PORT2ADDR(port) = b;
  95. delay();
  96. }
  97. void generic_outw_p(unsigned short b, unsigned long port)
  98. {
  99. *(volatile unsigned short*)PORT2ADDR(port) = b;
  100. delay();
  101. }
  102. void generic_outl_p(unsigned int b, unsigned long port)
  103. {
  104. *(volatile unsigned long*)PORT2ADDR(port) = b;
  105. delay();
  106. }
  107. void generic_outsb(unsigned long port, const void *buffer, unsigned long count)
  108. {
  109. const unsigned char *buf=buffer;
  110. while(count--) outb(*buf++, port);
  111. }
  112. void generic_outsw(unsigned long port, const void *buffer, unsigned long count)
  113. {
  114. const unsigned short *buf=buffer;
  115. while(count--) outw(*buf++, port);
  116. #ifdef SH3_PCMCIA_BUG_WORKAROUND
  117. ctrl_inb (DUMMY_READ_AREA6);
  118. #endif
  119. }
  120. void generic_outsl(unsigned long port, const void *buffer, unsigned long count)
  121. {
  122. const unsigned long *buf=buffer;
  123. while(count--) outl(*buf++, port);
  124. #ifdef SH3_PCMCIA_BUG_WORKAROUND
  125. ctrl_inb (DUMMY_READ_AREA6);
  126. #endif
  127. }
  128. unsigned char generic_readb(unsigned long addr)
  129. {
  130. return *(volatile unsigned char*)addr;
  131. }
  132. unsigned short generic_readw(unsigned long addr)
  133. {
  134. return *(volatile unsigned short*)addr;
  135. }
  136. unsigned int generic_readl(unsigned long addr)
  137. {
  138. return *(volatile unsigned long*)addr;
  139. }
  140. void generic_writeb(unsigned char b, unsigned long addr)
  141. {
  142. *(volatile unsigned char*)addr = b;
  143. }
  144. void generic_writew(unsigned short b, unsigned long addr)
  145. {
  146. *(volatile unsigned short*)addr = b;
  147. }
  148. void generic_writel(unsigned int b, unsigned long addr)
  149. {
  150.         *(volatile unsigned long*)addr = b;
  151. }
  152. void * generic_ioremap(unsigned long offset, unsigned long size)
  153. {
  154. return (void *) P2SEGADDR(offset);
  155. }
  156. EXPORT_SYMBOL(generic_ioremap);
  157. void generic_iounmap(void *addr)
  158. {
  159. }
  160. EXPORT_SYMBOL(generic_iounmap);
  161. unsigned long generic_isa_port2addr(unsigned long offset)
  162. {
  163. return offset + generic_io_base;
  164. }