Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dfcb7608 authored by Paul Mundt's avatar Paul Mundt
Browse files

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: default avatarPaul Mundt <lethal@linux-sh.org>
parent ded5431f
Loading
Loading
Loading
Loading
+4 −25
Original line number Original line Diff line number Diff line
@@ -26,9 +26,9 @@ static inline void delay(void)
static inline volatile __u16 *
static inline volatile __u16 *
port2adr(unsigned int port)
port2adr(unsigned int port)
{
{
	if (port >= 0x2000)
	if (port >= 0x2000 && port < 0x2020)
		return (volatile __u16 *) (PA_MRSHPC + (port - 0x2000));
		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));
		return (volatile __u16 *) (PA_SMSC + (port - 0x300));
}
}


@@ -51,12 +51,6 @@ unsigned short se7206_inw(unsigned long port)
	return *port2adr(port);;
	return *port2adr(port);;
}
}


unsigned int se7206_inl(unsigned long port)
{
	maybebadio(port);
	return 0;
}

void se7206_outb(unsigned char value, unsigned long port)
void se7206_outb(unsigned char value, unsigned long port)
{
{
	*(port2adr(port)) = value;
	*(port2adr(port)) = value;
@@ -73,11 +67,6 @@ void se7206_outw(unsigned short value, unsigned long port)
	*port2adr(port) = value;
	*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)
void se7206_insb(unsigned long port, void *addr, unsigned long count)
{
{
	volatile __u16 *p = port2adr(port);
	volatile __u16 *p = port2adr(port);
@@ -95,11 +84,6 @@ void se7206_insw(unsigned long port, void *addr, unsigned long count)
		*ap++ = *p;
		*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)
void se7206_outsb(unsigned long port, const void *addr, unsigned long count)
{
{
	volatile __u16 *p = port2adr(port);
	volatile __u16 *p = port2adr(port);
@@ -116,8 +100,3 @@ void se7206_outsw(unsigned long port, const void *addr, unsigned long count)
	while (count--)
	while (count--)
		*p = *ap++;
		*p = *ap++;
}
}

void se7206_outsl(unsigned long port, const void *addr, unsigned long count)
{
	maybebadio(port);
}
+0 −8
Original line number Original line Diff line number Diff line
@@ -6,9 +6,7 @@
 * Copyright (C) 2007  Paul Mundt
 * Copyright (C) 2007  Paul Mundt
 *
 *
 * Hitachi 7206 SolutionEngine Support.
 * Hitachi 7206 SolutionEngine Support.
 *
 */
 */

#include <linux/init.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/platform_device.h>
#include <asm/se7206.h>
#include <asm/se7206.h>
@@ -81,24 +79,18 @@ static struct sh_machine_vector mv_se __initmv = {
	.mv_nr_irqs		= 256,
	.mv_nr_irqs		= 256,
	.mv_inb			= se7206_inb,
	.mv_inb			= se7206_inb,
	.mv_inw			= se7206_inw,
	.mv_inw			= se7206_inw,
	.mv_inl			= se7206_inl,
	.mv_outb		= se7206_outb,
	.mv_outb		= se7206_outb,
	.mv_outw		= se7206_outw,
	.mv_outw		= se7206_outw,
	.mv_outl		= se7206_outl,


	.mv_inb_p		= se7206_inb_p,
	.mv_inb_p		= se7206_inb_p,
	.mv_inw_p		= se7206_inw,
	.mv_inw_p		= se7206_inw,
	.mv_inl_p		= se7206_inl,
	.mv_outb_p		= se7206_outb_p,
	.mv_outb_p		= se7206_outb_p,
	.mv_outw_p		= se7206_outw,
	.mv_outw_p		= se7206_outw,
	.mv_outl_p		= se7206_outl,


	.mv_insb		= se7206_insb,
	.mv_insb		= se7206_insb,
	.mv_insw		= se7206_insw,
	.mv_insw		= se7206_insw,
	.mv_insl		= se7206_insl,
	.mv_outsb		= se7206_outsb,
	.mv_outsb		= se7206_outsb,
	.mv_outsw		= se7206_outsw,
	.mv_outsw		= se7206_outsw,
	.mv_outsl		= se7206_outsl,


	.mv_init_irq		= init_se7206_IRQ,
	.mv_init_irq		= init_se7206_IRQ,
};
};