/*
 * arch/arm/mach-kirkwood/include/mach/io.h
 *
 * This file is licensed under the terms of the GNU General Public
 * License version 2.  This program is licensed "as is" without any
 * warranty of any kind, whether express or implied.
 */

#ifndef __ASM_ARCH_IO_H
#define __ASM_ARCH_IO_H

#include "kirkwood.h"

#define IO_SPACE_LIMIT		0xffffffff

static inline void __iomem *__io(unsigned long addr)
{
	return (void __iomem *)((addr - KIRKWOOD_PCIE_IO_BUS_BASE)
					+ KIRKWOOD_PCIE_IO_VIRT_BASE);
}

static inline void __iomem *
__arch_ioremap(unsigned long paddr, size_t size, unsigned int mtype)
{
	void __iomem *retval;
	unsigned long offs = paddr - KIRKWOOD_REGS_PHYS_BASE;
	if (mtype == MT_DEVICE && size && offs < KIRKWOOD_REGS_SIZE &&
	    size <= KIRKWOOD_REGS_SIZE && offs + size <= KIRKWOOD_REGS_SIZE) {
		retval = (void __iomem *)KIRKWOOD_REGS_VIRT_BASE + offs;
	} else {
		retval = __arm_ioremap(paddr, size, mtype);
	}

	return retval;
}

static inline void
__arch_iounmap(void __iomem *addr)
{
	if (addr < (void __iomem *)KIRKWOOD_REGS_VIRT_BASE ||
	    addr >= (void __iomem *)(KIRKWOOD_REGS_VIRT_BASE + KIRKWOOD_REGS_SIZE))
		__iounmap(addr);
}

#define __arch_ioremap(p, s, m)	__arch_ioremap(p, s, m)
#define __arch_iounmap(a)	__arch_iounmap(a)
#define __io(a)			__io(a)
#define __mem_pci(a)		(a)


#endif
