sh: se7206: Make the I/O port routines less stupid.
The port routines were logically inverted, and the MRSHPC range had no upper bound, causing 8 and 16-bit port I/O to get mangled. Signed-off-by: Paul Mundt <lethal@linux-sh.org>
This commit is contained in:
parent
ded5431ff3
commit
dfcb76089a
@ -26,22 +26,22 @@ static inline void delay(void)
|
||||
static inline volatile __u16 *
|
||||
port2adr(unsigned int port)
|
||||
{
|
||||
if (port >= 0x2000)
|
||||
if (port >= 0x2000 && port < 0x2020)
|
||||
return (volatile __u16 *) (PA_MRSHPC + (port - 0x2000));
|
||||
else if (port >= 0x300 || port < 0x310)
|
||||
else if (port >= 0x300 && port < 0x310)
|
||||
return (volatile __u16 *) (PA_SMSC + (port - 0x300));
|
||||
}
|
||||
|
||||
unsigned char se7206_inb(unsigned long port)
|
||||
{
|
||||
return (*port2adr(port))&0xff;
|
||||
return (*port2adr(port)) & 0xff;
|
||||
}
|
||||
|
||||
unsigned char se7206_inb_p(unsigned long port)
|
||||
{
|
||||
unsigned long v;
|
||||
|
||||
v = (*port2adr(port))&0xff;
|
||||
v = (*port2adr(port)) & 0xff;
|
||||
delay();
|
||||
return v;
|
||||
}
|
||||
@ -51,12 +51,6 @@ unsigned short se7206_inw(unsigned long port)
|
||||
return *port2adr(port);;
|
||||
}
|
||||
|
||||
unsigned int se7206_inl(unsigned long port)
|
||||
{
|
||||
maybebadio(port);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void se7206_outb(unsigned char value, unsigned long port)
|
||||
{
|
||||
*(port2adr(port)) = value;
|
||||
@ -73,11 +67,6 @@ void se7206_outw(unsigned short value, unsigned long port)
|
||||
*port2adr(port) = value;
|
||||
}
|
||||
|
||||
void se7206_outl(unsigned int value, unsigned long port)
|
||||
{
|
||||
maybebadio(port);
|
||||
}
|
||||
|
||||
void se7206_insb(unsigned long port, void *addr, unsigned long count)
|
||||
{
|
||||
volatile __u16 *p = port2adr(port);
|
||||
@ -95,11 +84,6 @@ void se7206_insw(unsigned long port, void *addr, unsigned long count)
|
||||
*ap++ = *p;
|
||||
}
|
||||
|
||||
void se7206_insl(unsigned long port, void *addr, unsigned long count)
|
||||
{
|
||||
maybebadio(port);
|
||||
}
|
||||
|
||||
void se7206_outsb(unsigned long port, const void *addr, unsigned long count)
|
||||
{
|
||||
volatile __u16 *p = port2adr(port);
|
||||
@ -116,8 +100,3 @@ void se7206_outsw(unsigned long port, const void *addr, unsigned long count)
|
||||
while (count--)
|
||||
*p = *ap++;
|
||||
}
|
||||
|
||||
void se7206_outsl(unsigned long port, const void *addr, unsigned long count)
|
||||
{
|
||||
maybebadio(port);
|
||||
}
|
||||
|
@ -6,9 +6,7 @@
|
||||
* Copyright (C) 2007 Paul Mundt
|
||||
*
|
||||
* Hitachi 7206 SolutionEngine Support.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <asm/se7206.h>
|
||||
@ -81,24 +79,18 @@ static struct sh_machine_vector mv_se __initmv = {
|
||||
.mv_nr_irqs = 256,
|
||||
.mv_inb = se7206_inb,
|
||||
.mv_inw = se7206_inw,
|
||||
.mv_inl = se7206_inl,
|
||||
.mv_outb = se7206_outb,
|
||||
.mv_outw = se7206_outw,
|
||||
.mv_outl = se7206_outl,
|
||||
|
||||
.mv_inb_p = se7206_inb_p,
|
||||
.mv_inw_p = se7206_inw,
|
||||
.mv_inl_p = se7206_inl,
|
||||
.mv_outb_p = se7206_outb_p,
|
||||
.mv_outw_p = se7206_outw,
|
||||
.mv_outl_p = se7206_outl,
|
||||
|
||||
.mv_insb = se7206_insb,
|
||||
.mv_insw = se7206_insw,
|
||||
.mv_insl = se7206_insl,
|
||||
.mv_outsb = se7206_outsb,
|
||||
.mv_outsw = se7206_outsw,
|
||||
.mv_outsl = se7206_outsl,
|
||||
|
||||
.mv_init_irq = init_se7206_IRQ,
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user