io.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. /*
  2. * Copyright (C) 2000 YAEGASHI Takeshi
  3. * Typical I/O routines for HD64461 system.
  4. */
  5. #include <asm/io.h>
  6. #include <asm/hd64461.h>
  7. #define MEM_BASE (CONFIG_HD64461_IOBASE - HD64461_STBCR)
  8. static __inline__ unsigned long PORT2ADDR(unsigned long port)
  9. {
  10. /* 16550A: HD64461 internal */
  11. if (0x3f8<=port && port<=0x3ff)
  12. return CONFIG_HD64461_IOBASE + 0x8000 + ((port-0x3f8)<<1);
  13. if (0x2f8<=port && port<=0x2ff)
  14. return CONFIG_HD64461_IOBASE + 0x7000 + ((port-0x2f8)<<1);
  15. #ifdef CONFIG_HD64461_ENABLER
  16. /* NE2000: HD64461 PCMCIA channel 0 (I/O) */
  17. if (0x300<=port && port<=0x31f)
  18. return 0xba000000 + port;
  19. /* ide0: HD64461 PCMCIA channel 1 (memory) */
  20. /* On HP690, CF in slot 1 is configured as a memory card
  21. device. See CF+ and CompactFlash Specification for the
  22. detail of CF's memory mapped addressing. */
  23. if (0x1f0<=port && port<=0x1f7) return 0xb5000000 + port;
  24. if (port == 0x3f6) return 0xb50001fe;
  25. if (port == 0x3f7) return 0xb50001ff;
  26. /* ide1 */
  27. if (0x170<=port && port<=0x177) return 0xba000000 + port;
  28. if (port == 0x376) return 0xba000376;
  29. if (port == 0x377) return 0xba000377;
  30. #endif
  31. /* ??? */
  32. if (port < 0xf000) return 0xa0000000 + port;
  33. /* PCMCIA channel 0, I/O (0xba000000) */
  34. if (port < 0x10000) return 0xba000000 + port - 0xf000;
  35. /* HD64461 internal devices (0xb0000000) */
  36. if (port < 0x20000) return CONFIG_HD64461_IOBASE + port - 0x10000;
  37. /* PCMCIA channel 0, I/O (0xba000000) */
  38. if (port < 0x30000) return 0xba000000 + port - 0x20000;
  39. /* PCMCIA channel 1, memory (0xb5000000) */
  40. if (port < 0x40000) return 0xb5000000 + port - 0x30000;
  41. /* Whole physical address space (0xa0000000) */
  42. return 0xa0000000 + (port & 0x1fffffff);
  43. }
  44. unsigned char hd64461_inb(unsigned long port)
  45. {
  46. return *(volatile unsigned char*)PORT2ADDR(port);
  47. }
  48. unsigned char hd64461_inb_p(unsigned long port)
  49. {
  50. unsigned long v = *(volatile unsigned char*)PORT2ADDR(port);
  51. ctrl_delay();
  52. return v;
  53. }
  54. unsigned short hd64461_inw(unsigned long port)
  55. {
  56. return *(volatile unsigned short*)PORT2ADDR(port);
  57. }
  58. unsigned int hd64461_inl(unsigned long port)
  59. {
  60. return *(volatile unsigned long*)PORT2ADDR(port);
  61. }
  62. void hd64461_outb(unsigned char b, unsigned long port)
  63. {
  64. *(volatile unsigned char*)PORT2ADDR(port) = b;
  65. }
  66. void hd64461_outb_p(unsigned char b, unsigned long port)
  67. {
  68. *(volatile unsigned char*)PORT2ADDR(port) = b;
  69. ctrl_delay();
  70. }
  71. void hd64461_outw(unsigned short b, unsigned long port)
  72. {
  73. *(volatile unsigned short*)PORT2ADDR(port) = b;
  74. }
  75. void hd64461_outl(unsigned int b, unsigned long port)
  76. {
  77. *(volatile unsigned long*)PORT2ADDR(port) = b;
  78. }
  79. void hd64461_insb(unsigned long port, void *buffer, unsigned long count)
  80. {
  81. volatile unsigned char* addr=(volatile unsigned char*)PORT2ADDR(port);
  82. unsigned char *buf=buffer;
  83. while(count--) *buf++=*addr;
  84. }
  85. void hd64461_insw(unsigned long port, void *buffer, unsigned long count)
  86. {
  87. volatile unsigned short* addr=(volatile unsigned short*)PORT2ADDR(port);
  88. unsigned short *buf=buffer;
  89. while(count--) *buf++=*addr;
  90. }
  91. void hd64461_insl(unsigned long port, void *buffer, unsigned long count)
  92. {
  93. volatile unsigned long* addr=(volatile unsigned long*)PORT2ADDR(port);
  94. unsigned long *buf=buffer;
  95. while(count--) *buf++=*addr;
  96. }
  97. void hd64461_outsb(unsigned long port, const void *buffer, unsigned long count)
  98. {
  99. volatile unsigned char* addr=(volatile unsigned char*)PORT2ADDR(port);
  100. const unsigned char *buf=buffer;
  101. while(count--) *addr=*buf++;
  102. }
  103. void hd64461_outsw(unsigned long port, const void *buffer, unsigned long count)
  104. {
  105. volatile unsigned short* addr=(volatile unsigned short*)PORT2ADDR(port);
  106. const unsigned short *buf=buffer;
  107. while(count--) *addr=*buf++;
  108. }
  109. void hd64461_outsl(unsigned long port, const void *buffer, unsigned long count)
  110. {
  111. volatile unsigned long* addr=(volatile unsigned long*)PORT2ADDR(port);
  112. const unsigned long *buf=buffer;
  113. while(count--) *addr=*buf++;
  114. }
  115. unsigned short hd64461_readw(void __iomem *addr)
  116. {
  117. return ctrl_inw(MEM_BASE+(unsigned long __force)addr);
  118. }
  119. void hd64461_writew(unsigned short b, void __iomem *addr)
  120. {
  121. ctrl_outw(b, MEM_BASE+(unsigned long __force)addr);
  122. }