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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * This file is subject to the terms and conditions of the GNU General Public
  3.  * License.  See the file "COPYING" in the main directory of this archive
  4.  * for more details.
  5.  *
  6.  * Low level I/O functions for Jazz family machines.
  7.  *
  8.  * Copyright (C) 1997 by Ralf Baechle.
  9.  */
  10. #include <linux/string.h>
  11. #include <linux/spinlock.h>
  12. #include <asm/addrspace.h>
  13. #include <asm/system.h>
  14. #include <asm/jazz.h>
  15. /*
  16.  * Map an 16mb segment of the EISA address space to 0xe3000000;
  17.  */
  18. static inline void map_eisa_address(unsigned long address)
  19. {
  20.   /* XXX */
  21.   /* We've got an wired entry in the TLB.  We just need to modify it.
  22.      fast and clean.  But since we want to get rid of wired entries
  23.      things are a little bit more complicated ... */
  24. }
  25. static unsigned char jazz_readb(unsigned long addr)
  26. {
  27. unsigned char res;
  28. map_eisa_address(addr);
  29. addr &= 0xffffff;
  30. res = *(volatile unsigned char *) (JAZZ_EISA_BASE + addr);
  31. return res;
  32. }
  33. static unsigned short jazz_readw(unsigned long addr)
  34. {
  35. unsigned short res;
  36. map_eisa_address(addr);
  37. addr &= 0xffffff;
  38. res = *(volatile unsigned char *) (JAZZ_EISA_BASE + addr);
  39. return res;
  40. }
  41. static unsigned int jazz_readl(unsigned long addr)
  42. {
  43. unsigned int res;
  44. map_eisa_address(addr);
  45. addr &= 0xffffff;
  46. res = *(volatile unsigned char *) (JAZZ_EISA_BASE + addr);
  47. return res;
  48. }
  49. static void jazz_writeb(unsigned char val, unsigned long addr)
  50. {
  51. map_eisa_address(addr);
  52. addr &= 0xffffff;
  53. *(volatile unsigned char *) (JAZZ_EISA_BASE + addr) = val;
  54. }
  55. static void jazz_writew(unsigned short val, unsigned long addr)
  56. {
  57. map_eisa_address(addr);
  58. addr &= 0xffffff;
  59. *(volatile unsigned char *) (JAZZ_EISA_BASE + addr) = val;
  60. }
  61. static void jazz_writel(unsigned int val, unsigned long addr)
  62. {
  63. map_eisa_address(addr);
  64. addr &= 0xffffff;
  65. *(volatile unsigned char *) (JAZZ_EISA_BASE + addr) = val;
  66. }
  67. static void jazz_memset_io(unsigned long addr, int val, unsigned long len)
  68. {
  69. unsigned long waddr;
  70. waddr = JAZZ_EISA_BASE | (addr & 0xffffff);
  71. while(len) {
  72. unsigned long fraglen;
  73. fraglen = (~addr + 1) & 0xffffff;
  74. fraglen = (fraglen < len) ? fraglen : len;
  75. map_eisa_address(addr);
  76. memset((char *)waddr, val, fraglen);
  77. addr += fraglen;
  78. waddr = waddr + fraglen - 0x1000000;
  79. len -= fraglen;
  80. }
  81. }
  82. static void jazz_memcpy_fromio(unsigned long to, unsigned long from, unsigned long len)
  83. {
  84. unsigned long waddr;
  85. waddr = JAZZ_EISA_BASE | (from & 0xffffff);
  86. while(len) {
  87. unsigned long fraglen;
  88. fraglen = (~from + 1) & 0xffffff;
  89. fraglen = (fraglen < len) ? fraglen : len;
  90. map_eisa_address(from);
  91. memcpy((void *)to, (void *)waddr, fraglen);
  92. to += fraglen;
  93. from += fraglen;
  94. waddr = waddr + fraglen - 0x1000000;
  95. len -= fraglen;
  96. }
  97. }
  98. static void jazz_memcpy_toio(unsigned long to, unsigned long from, unsigned long len)
  99. {
  100. unsigned long waddr;
  101. waddr = JAZZ_EISA_BASE | (to & 0xffffff);
  102. while(len) {
  103. unsigned long fraglen;
  104. fraglen = (~to + 1) & 0xffffff;
  105. fraglen = (fraglen < len) ? fraglen : len;
  106. map_eisa_address(to);
  107. memcpy((char *)to + JAZZ_EISA_BASE, (void *)from, fraglen);
  108. to += fraglen;
  109. from += fraglen;
  110. waddr = waddr + fraglen - 0x1000000;
  111. len -= fraglen;
  112. }
  113. }