sh: mach-microdev: SuperIO-relative ioport mapping.
The microdev only has to contend with silly PIO mangling on anything within the SuperIO range. As each of the SuperIO modules is already speciail cased, we just shift that logic over to the ioport map. With microdev PCI never being merged (and being fudamentally broken in hardware), and the ethernet chip only doing 16-bit accesses already, there's no need to maintain any of the extra special casing. Kill it all off. Signed-off-by: Paul Mundt <lethal@linux-sh.org>
This commit is contained in:
parent
18cb657ca1
commit
46bc858720
@ -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;
|
||||
}
|
||||
|
@ -195,27 +195,6 @@ device_initcall(microdev_devices_setup);
|
||||
static struct sh_machine_vector mv_sh4202_microdev __initmv = {
|
||||
.mv_name = "SH4-202 MicroDev",
|
||||
.mv_nr_irqs = 72,
|
||||
|
||||
.mv_inb = microdev_inb,
|
||||
.mv_inw = microdev_inw,
|
||||
.mv_inl = microdev_inl,
|
||||
.mv_outb = microdev_outb,
|
||||
.mv_outw = microdev_outw,
|
||||
.mv_outl = microdev_outl,
|
||||
|
||||
.mv_inb_p = microdev_inb_p,
|
||||
.mv_inw_p = microdev_inw_p,
|
||||
.mv_inl_p = microdev_inl_p,
|
||||
.mv_outb_p = microdev_outb_p,
|
||||
.mv_outw_p = microdev_outw_p,
|
||||
.mv_outl_p = microdev_outl_p,
|
||||
|
||||
.mv_insb = microdev_insb,
|
||||
.mv_insw = microdev_insw,
|
||||
.mv_insl = microdev_insl,
|
||||
.mv_outsb = microdev_outsb,
|
||||
.mv_outsw = microdev_outsw,
|
||||
.mv_outsl = microdev_outsl,
|
||||
|
||||
.mv_ioport_map = microdev_ioport_map,
|
||||
.mv_init_irq = init_microdev_irq,
|
||||
};
|
||||
|
@ -68,13 +68,4 @@ extern void microdev_print_fpga_intc_status(void);
|
||||
#define __IO_PREFIX microdev
|
||||
#include <asm/io_generic.h>
|
||||
|
||||
#if defined(CONFIG_PCI)
|
||||
unsigned char microdev_pci_inb(unsigned long port);
|
||||
unsigned short microdev_pci_inw(unsigned long port);
|
||||
unsigned long microdev_pci_inl(unsigned long port);
|
||||
void microdev_pci_outb(unsigned char data, unsigned long port);
|
||||
void microdev_pci_outw(unsigned short data, unsigned long port);
|
||||
void microdev_pci_outl(unsigned long data, unsigned long port);
|
||||
#endif
|
||||
|
||||
#endif /* __ASM_SH_MICRODEV_H */
|
||||
|
Loading…
Reference in New Issue
Block a user