#ifndef _H8300_IO_H
#define _H8300_IO_H

#ifdef __KERNEL__

#include <asm-generic/io.h>

/* H8/300 internal I/O functions */
static inline unsigned char ctrl_inb(unsigned long addr)
{
	return *(volatile unsigned char *)addr;
}

static inline unsigned short ctrl_inw(unsigned long addr)
{
	return *(volatile unsigned short *)addr;
}

static inline unsigned long ctrl_inl(unsigned long addr)
{
	return *(volatile unsigned long *)addr;
}

static inline void ctrl_outb(unsigned char b, unsigned long addr)
{
	*(volatile unsigned char *)addr = b;
}

static inline void ctrl_outw(unsigned short b, unsigned long addr)
{
	*(volatile unsigned short *)addr = b;
}

static inline void ctrl_outl(unsigned long b, unsigned long addr)
{
	*(volatile unsigned long *)addr = b;
}

static inline void ctrl_bclr(int b, unsigned long addr)
{
	if (__builtin_constant_p(b))
		__asm__("bclr %1,%0" : : "WU"(addr), "i"(b));
	else
		__asm__("bclr %w1,%0" : : "WU"(addr), "r"(b));
}

static inline void ctrl_bset(int b, unsigned long addr)
{
	if (__builtin_constant_p(b))
		__asm__("bset %1,%0" : : "WU"(addr), "i"(b));
	else
		__asm__("bset %w1,%0" : : "WU"(addr), "r"(b));
}

#endif /* __KERNEL__ */

#endif /* _H8300_IO_H */
