|
@@ -54,7 +54,7 @@
|
|
|
/*
|
|
|
* map I/O ports to memory-mapped addresses
|
|
|
*/
|
|
|
-static unsigned long microdev_isa_port2addr(unsigned long offset)
|
|
|
+void __iomem *microdev_ioport_map(unsigned long offset, unsigned int len)
|
|
|
{
|
|
|
unsigned long result;
|
|
|
|
|
@@ -72,16 +72,6 @@ static unsigned long microdev_isa_port2addr(unsigned long offset)
|
|
|
* Configuration Registers
|
|
|
*/
|
|
|
result = IO_SUPERIO_PHYS + (offset << 1);
|
|
|
-#if 0
|
|
|
- } else if (offset == KBD_DATA_REG || offset == KBD_CNTL_REG ||
|
|
|
- offset == KBD_STATUS_REG) {
|
|
|
- /*
|
|
|
- * SMSC FDC37C93xAPM SuperIO chip
|
|
|
- *
|
|
|
- * PS/2 Keyboard + Mouse (ports 0x60 and 0x64).
|
|
|
- */
|
|
|
- result = IO_SUPERIO_PHYS + (offset << 1);
|
|
|
-#endif
|
|
|
} else if (((offset >= IO_IDE1_BASE) &&
|
|
|
(offset < IO_IDE1_BASE + IO_IDE_EXTENT)) ||
|
|
|
(offset == IO_IDE1_MISC)) {
|
|
@@ -131,237 +121,5 @@ static unsigned long microdev_isa_port2addr(unsigned long offset)
|
|
|
result = PVR;
|
|
|
}
|
|
|
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-#define PORT2ADDR(x) (microdev_isa_port2addr(x))
|
|
|
-
|
|
|
-static inline void delay(void)
|
|
|
-{
|
|
|
-#if defined(CONFIG_PCI)
|
|
|
- /* System board present, just make a dummy SRAM access. (CS0 will be
|
|
|
- mapped to PCI memory, probably good to avoid it.) */
|
|
|
- __raw_readw(0xa6800000);
|
|
|
-#else
|
|
|
- /* CS0 will be mapped to flash, ROM etc so safe to access it. */
|
|
|
- __raw_readw(0xa0000000);
|
|
|
-#endif
|
|
|
-}
|
|
|
-
|
|
|
-unsigned char microdev_inb(unsigned long port)
|
|
|
-{
|
|
|
-#ifdef CONFIG_PCI
|
|
|
- if (port >= PCIBIOS_MIN_IO)
|
|
|
- return microdev_pci_inb(port);
|
|
|
-#endif
|
|
|
- return *(volatile unsigned char*)PORT2ADDR(port);
|
|
|
-}
|
|
|
-
|
|
|
-unsigned short microdev_inw(unsigned long port)
|
|
|
-{
|
|
|
-#ifdef CONFIG_PCI
|
|
|
- if (port >= PCIBIOS_MIN_IO)
|
|
|
- return microdev_pci_inw(port);
|
|
|
-#endif
|
|
|
- return *(volatile unsigned short*)PORT2ADDR(port);
|
|
|
-}
|
|
|
-
|
|
|
-unsigned int microdev_inl(unsigned long port)
|
|
|
-{
|
|
|
-#ifdef CONFIG_PCI
|
|
|
- if (port >= PCIBIOS_MIN_IO)
|
|
|
- return microdev_pci_inl(port);
|
|
|
-#endif
|
|
|
- return *(volatile unsigned int*)PORT2ADDR(port);
|
|
|
-}
|
|
|
-
|
|
|
-void microdev_outw(unsigned short b, unsigned long port)
|
|
|
-{
|
|
|
-#ifdef CONFIG_PCI
|
|
|
- if (port >= PCIBIOS_MIN_IO) {
|
|
|
- microdev_pci_outw(b, port);
|
|
|
- return;
|
|
|
- }
|
|
|
-#endif
|
|
|
- *(volatile unsigned short*)PORT2ADDR(port) = b;
|
|
|
-}
|
|
|
-
|
|
|
-void microdev_outb(unsigned char b, unsigned long port)
|
|
|
-{
|
|
|
-#ifdef CONFIG_PCI
|
|
|
- if (port >= PCIBIOS_MIN_IO) {
|
|
|
- microdev_pci_outb(b, port);
|
|
|
- return;
|
|
|
- }
|
|
|
-#endif
|
|
|
-
|
|
|
- /*
|
|
|
- * There is a board feature with the current SH4-202 MicroDev in
|
|
|
- * that the 2 byte enables (nBE0 and nBE1) are tied together (and
|
|
|
- * to the Chip Select Line (Ethernet_CS)). Due to this connectivity,
|
|
|
- * it is not possible to safely perform 8-bit writes to the
|
|
|
- * Ethernet registers, as 16-bits will be consumed from the Data
|
|
|
- * lines (corrupting the other byte). Hence, this function is
|
|
|
- * written to implement 16-bit read/modify/write for all byte-wide
|
|
|
- * accesses.
|
|
|
- *
|
|
|
- * Note: there is no problem with byte READS (even or odd).
|
|
|
- *
|
|
|
- * Sean McGoogan - 16th June 2003.
|
|
|
- */
|
|
|
- if ((port >= IO_LAN91C111_BASE) &&
|
|
|
- (port < IO_LAN91C111_BASE + IO_LAN91C111_EXTENT)) {
|
|
|
- /*
|
|
|
- * Then are trying to perform a byte-write to the
|
|
|
- * LAN91C111. This needs special care.
|
|
|
- */
|
|
|
- if (port % 2 == 1) { /* is the port odd ? */
|
|
|
- /* unset bit-0, i.e. make even */
|
|
|
- const unsigned long evenPort = port-1;
|
|
|
- unsigned short word;
|
|
|
-
|
|
|
- /*
|
|
|
- * do a 16-bit read/write to write to 'port',
|
|
|
- * preserving even byte.
|
|
|
- *
|
|
|
- * Even addresses are bits 0-7
|
|
|
- * Odd addresses are bits 8-15
|
|
|
- */
|
|
|
- word = microdev_inw(evenPort);
|
|
|
- word = (word & 0xffu) | (b << 8);
|
|
|
- microdev_outw(word, evenPort);
|
|
|
- } else {
|
|
|
- /* else, we are trying to do an even byte write */
|
|
|
- unsigned short word;
|
|
|
-
|
|
|
- /*
|
|
|
- * do a 16-bit read/write to write to 'port',
|
|
|
- * preserving odd byte.
|
|
|
- *
|
|
|
- * Even addresses are bits 0-7
|
|
|
- * Odd addresses are bits 8-15
|
|
|
- */
|
|
|
- word = microdev_inw(port);
|
|
|
- word = (word & 0xff00u) | (b);
|
|
|
- microdev_outw(word, port);
|
|
|
- }
|
|
|
- } else {
|
|
|
- *(volatile unsigned char*)PORT2ADDR(port) = b;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-void microdev_outl(unsigned int b, unsigned long port)
|
|
|
-{
|
|
|
-#ifdef CONFIG_PCI
|
|
|
- if (port >= PCIBIOS_MIN_IO) {
|
|
|
- microdev_pci_outl(b, port);
|
|
|
- return;
|
|
|
- }
|
|
|
-#endif
|
|
|
- *(volatile unsigned int*)PORT2ADDR(port) = b;
|
|
|
-}
|
|
|
-
|
|
|
-unsigned char microdev_inb_p(unsigned long port)
|
|
|
-{
|
|
|
- unsigned char v = microdev_inb(port);
|
|
|
- delay();
|
|
|
- return v;
|
|
|
-}
|
|
|
-
|
|
|
-unsigned short microdev_inw_p(unsigned long port)
|
|
|
-{
|
|
|
- unsigned short v = microdev_inw(port);
|
|
|
- delay();
|
|
|
- return v;
|
|
|
-}
|
|
|
-
|
|
|
-unsigned int microdev_inl_p(unsigned long port)
|
|
|
-{
|
|
|
- unsigned int v = microdev_inl(port);
|
|
|
- delay();
|
|
|
- return v;
|
|
|
-}
|
|
|
-
|
|
|
-void microdev_outb_p(unsigned char b, unsigned long port)
|
|
|
-{
|
|
|
- microdev_outb(b, port);
|
|
|
- delay();
|
|
|
-}
|
|
|
-
|
|
|
-void microdev_outw_p(unsigned short b, unsigned long port)
|
|
|
-{
|
|
|
- microdev_outw(b, port);
|
|
|
- delay();
|
|
|
-}
|
|
|
-
|
|
|
-void microdev_outl_p(unsigned int b, unsigned long port)
|
|
|
-{
|
|
|
- microdev_outl(b, port);
|
|
|
- delay();
|
|
|
-}
|
|
|
-
|
|
|
-void microdev_insb(unsigned long port, void *buffer, unsigned long count)
|
|
|
-{
|
|
|
- volatile unsigned char *port_addr;
|
|
|
- unsigned char *buf = buffer;
|
|
|
-
|
|
|
- port_addr = (volatile unsigned char *)PORT2ADDR(port);
|
|
|
-
|
|
|
- while (count--)
|
|
|
- *buf++ = *port_addr;
|
|
|
-}
|
|
|
-
|
|
|
-void microdev_insw(unsigned long port, void *buffer, unsigned long count)
|
|
|
-{
|
|
|
- volatile unsigned short *port_addr;
|
|
|
- unsigned short *buf = buffer;
|
|
|
-
|
|
|
- port_addr = (volatile unsigned short *)PORT2ADDR(port);
|
|
|
-
|
|
|
- while (count--)
|
|
|
- *buf++ = *port_addr;
|
|
|
-}
|
|
|
-
|
|
|
-void microdev_insl(unsigned long port, void *buffer, unsigned long count)
|
|
|
-{
|
|
|
- volatile unsigned long *port_addr;
|
|
|
- unsigned int *buf = buffer;
|
|
|
-
|
|
|
- port_addr = (volatile unsigned long *)PORT2ADDR(port);
|
|
|
-
|
|
|
- while (count--)
|
|
|
- *buf++ = *port_addr;
|
|
|
-}
|
|
|
-
|
|
|
-void microdev_outsb(unsigned long port, const void *buffer, unsigned long count)
|
|
|
-{
|
|
|
- volatile unsigned char *port_addr;
|
|
|
- const unsigned char *buf = buffer;
|
|
|
-
|
|
|
- port_addr = (volatile unsigned char *)PORT2ADDR(port);
|
|
|
-
|
|
|
- while (count--)
|
|
|
- *port_addr = *buf++;
|
|
|
-}
|
|
|
-
|
|
|
-void microdev_outsw(unsigned long port, const void *buffer, unsigned long count)
|
|
|
-{
|
|
|
- volatile unsigned short *port_addr;
|
|
|
- const unsigned short *buf = buffer;
|
|
|
-
|
|
|
- port_addr = (volatile unsigned short *)PORT2ADDR(port);
|
|
|
-
|
|
|
- while (count--)
|
|
|
- *port_addr = *buf++;
|
|
|
-}
|
|
|
-
|
|
|
-void microdev_outsl(unsigned long port, const void *buffer, unsigned long count)
|
|
|
-{
|
|
|
- volatile unsigned long *port_addr;
|
|
|
- const unsigned int *buf = buffer;
|
|
|
-
|
|
|
- port_addr = (volatile unsigned long *)PORT2ADDR(port);
|
|
|
-
|
|
|
- while (count--)
|
|
|
- *port_addr = *buf++;
|
|
|
+ return (void __iomem *)result;
|
|
|
}
|