1285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams/*
2285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams * iop13xx custom ioremap implementation
3285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams * Copyright (c) 2005-2006, Intel Corporation.
4285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams *
5285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams * This program is free software; you can redistribute it and/or modify it
6285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams * under the terms and conditions of the GNU General Public License,
7285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams * version 2, as published by the Free Software Foundation.
8285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams *
9285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams * This program is distributed in the hope it will be useful, but WITHOUT
10285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
12285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams * more details.
13285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams *
14285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams * You should have received a copy of the GNU General Public License along with
15285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
16285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams * Place - Suite 330, Boston, MA 02111-1307 USA.
17285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams *
18285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams */
19285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams#include <linux/kernel.h>
20285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams#include <linux/module.h>
21fced80c735941fa518ac67c0b61bbe153fb8c050Russell King#include <linux/io.h>
22a09e64fbc0094e3073dbb09c3b4bfe4ab669244bRussell King#include <mach/hardware.h>
23285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams
2417d971e5dceef87bb6fe179a942c8f6191afbab9Rob Herring#include "pci.h"
2517d971e5dceef87bb6fe179a942c8f6191afbab9Rob Herring
269b97173e785a54c5df0aa23d1e1f680f61e36e43Laura Abbottstatic void __iomem *__iop13xx_ioremap_caller(phys_addr_t cookie,
271dfe34ae794c13b11192baac022826f9c53fe377Rob Herring	size_t size, unsigned int mtype, void *caller)
28285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams{
29285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	void __iomem * retval;
30285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams
31285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	switch (cookie) {
32285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	case IOP13XX_PCIX_LOWER_MEM_RA ... IOP13XX_PCIX_UPPER_MEM_RA:
33285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams		if (unlikely(!iop13xx_atux_mem_base))
34285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams			retval = NULL;
35285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams		else
36abf2ba152f5aa31ee56a63b28b04a76d8def6366Arnd Bergmann			retval = (iop13xx_atux_mem_base +
37285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams			         (cookie - IOP13XX_PCIX_LOWER_MEM_RA));
38285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams		break;
39285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	case IOP13XX_PCIE_LOWER_MEM_RA ... IOP13XX_PCIE_UPPER_MEM_RA:
40285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams		if (unlikely(!iop13xx_atue_mem_base))
41285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams			retval = NULL;
42285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams		else
43abf2ba152f5aa31ee56a63b28b04a76d8def6366Arnd Bergmann			retval = (iop13xx_atue_mem_base +
44285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams			         (cookie - IOP13XX_PCIE_LOWER_MEM_RA));
45285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams		break;
46285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	case IOP13XX_PBI_LOWER_MEM_RA ... IOP13XX_PBI_UPPER_MEM_RA:
4731aa8fd6fd30b0f36416df7d09619768d26b4332Russell King		retval = __arm_ioremap_caller(IOP13XX_PBI_LOWER_MEM_PA +
483603ab2b62ad8372fc93816b080b370dd55d7cecRussell King				       (cookie - IOP13XX_PBI_LOWER_MEM_RA),
4931aa8fd6fd30b0f36416df7d09619768d26b4332Russell King				       size, mtype, __builtin_return_address(0));
50285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams		break;
51285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	case IOP13XX_PMMR_PHYS_MEM_BASE ... IOP13XX_PMMR_UPPER_MEM_PA:
52abf2ba152f5aa31ee56a63b28b04a76d8def6366Arnd Bergmann		retval = IOP13XX_PMMR_PHYS_TO_VIRT(cookie);
53285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams		break;
54285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	default:
5531aa8fd6fd30b0f36416df7d09619768d26b4332Russell King		retval = __arm_ioremap_caller(cookie, size, mtype,
561dfe34ae794c13b11192baac022826f9c53fe377Rob Herring				caller);
57285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	}
58285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams
59285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	return retval;
60285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams}
61285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams
621dfe34ae794c13b11192baac022826f9c53fe377Rob Herringstatic void __iop13xx_iounmap(volatile void __iomem *addr)
63285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams{
64285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	if (iop13xx_atue_mem_base)
65285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams		if (addr >= (void __iomem *) iop13xx_atue_mem_base &&
66285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	 	    addr < (void __iomem *) (iop13xx_atue_mem_base +
67285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	 	    			     iop13xx_atue_mem_size))
68285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams		    goto skip;
69285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams
70285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	if (iop13xx_atux_mem_base)
71285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams		if (addr >= (void __iomem *) iop13xx_atux_mem_base &&
72285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	 	    addr < (void __iomem *) (iop13xx_atux_mem_base +
73285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	 	    			     iop13xx_atux_mem_size))
74285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams		    goto skip;
75285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams
76285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	switch ((u32) addr) {
77abf2ba152f5aa31ee56a63b28b04a76d8def6366Arnd Bergmann	case (u32)IOP13XX_PMMR_VIRT_MEM_BASE ... (u32)IOP13XX_PMMR_UPPER_MEM_VA:
78285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams		goto skip;
79285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	}
80285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	__iounmap(addr);
81285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams
82285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williamsskip:
83285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	return;
84285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams}
851dfe34ae794c13b11192baac022826f9c53fe377Rob Herring
861dfe34ae794c13b11192baac022826f9c53fe377Rob Herringvoid __init iop13xx_init_early(void)
871dfe34ae794c13b11192baac022826f9c53fe377Rob Herring{
881dfe34ae794c13b11192baac022826f9c53fe377Rob Herring	arch_ioremap_caller = __iop13xx_ioremap_caller;
891dfe34ae794c13b11192baac022826f9c53fe377Rob Herring	arch_iounmap = __iop13xx_iounmap;
901dfe34ae794c13b11192baac022826f9c53fe377Rob Herring}
91