/* $Id: io.c,v 1.5 2004/02/22 23:08:43 kkojima Exp $
 *
 * linux/arch/sh/boards/se/7206/io.c
 *
 * Copyright (C) 2006 Yoshinori Sato
 *
 * I/O routine for Hitachi 7206 SolutionEngine.
 *
 */

#include <linux/kernel.h>
#include <linux/types.h>
#include <asm/io.h>
#include <mach-se/mach/se7206.h>


static inline void delay(void)
{
	ctrl_inw(0x20000000);  /* P2 ROM Area */
}

/* MS7750 requires special versions of in*, out* routines, since
   PC-like io ports are located at upper half byte of 16-bit word which
   can be accessed only with 16-bit wide.  */

static inline volatile __u16 *
port2adr(unsigned int port)
{
	if (port >= 0x2000 && port < 0x2020)
		return (volatile __u16 *) (PA_MRSHPC + (port - 0x2000));
	else if (port >= 0x300 && port < 0x310)
		return (volatile __u16 *) (PA_SMSC + (port - 0x300));

	return (volatile __u16 *)port;
}

unsigned char se7206_inb(unsigned long port)
{
	return (*port2adr(port)) & 0xff;
}

unsigned char se7206_inb_p(unsigned long port)
{
	unsigned long v;

	v = (*port2adr(port)) & 0xff;
	delay();
	return v;
}

unsigned short se7206_inw(unsigned long port)
{
	return *port2adr(port);
}

void se7206_outb(unsigned char value, unsigned long port)
{
	*(port2adr(port)) = value;
}

void se7206_outb_p(unsigned char value, unsigned long port)
{
	*(port2adr(port)) = value;
	delay();
}

void se7206_outw(unsigned short value, unsigned long port)
{
	*port2adr(port) = value;
}

void se7206_insb(unsigned long port, void *addr, unsigned long count)
{
	volatile __u16 *p = port2adr(port);
	__u8 *ap = addr;

	while (count--)
		*ap++ = *p;
}

void se7206_insw(unsigned long port, void *addr, unsigned long count)
{
	volatile __u16 *p = port2adr(port);
	__u16 *ap = addr;
	while (count--)
		*ap++ = *p;
}

void se7206_outsb(unsigned long port, const void *addr, unsigned long count)
{
	volatile __u16 *p = port2adr(port);
	const __u8 *ap = addr;

	while (count--)
		*p = *ap++;
}

void se7206_outsw(unsigned long port, const void *addr, unsigned long count)
{
	volatile __u16 *p = port2adr(port);
	const __u16 *ap = addr;
	while (count--)
		*p = *ap++;
}
