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
26b0b1d60a64054697ef828e0565f006cc0f823590Dan Williamsvoid * __iomem __iop13xx_io(unsigned long io_addr)
27b0b1d60a64054697ef828e0565f006cc0f823590Dan Williams{
28b0b1d60a64054697ef828e0565f006cc0f823590Dan Williams	void __iomem * io_virt;
29b0b1d60a64054697ef828e0565f006cc0f823590Dan Williams
30b0b1d60a64054697ef828e0565f006cc0f823590Dan Williams	switch (io_addr) {
31b0b1d60a64054697ef828e0565f006cc0f823590Dan Williams	case IOP13XX_PCIE_LOWER_IO_PA ... IOP13XX_PCIE_UPPER_IO_PA:
32b0b1d60a64054697ef828e0565f006cc0f823590Dan Williams		io_virt = (void *) IOP13XX_PCIE_IO_PHYS_TO_VIRT(io_addr);
33b0b1d60a64054697ef828e0565f006cc0f823590Dan Williams		break;
34b0b1d60a64054697ef828e0565f006cc0f823590Dan Williams	case IOP13XX_PCIX_LOWER_IO_PA ... IOP13XX_PCIX_UPPER_IO_PA:
35b0b1d60a64054697ef828e0565f006cc0f823590Dan Williams		io_virt = (void *) IOP13XX_PCIX_IO_PHYS_TO_VIRT(io_addr);
36b0b1d60a64054697ef828e0565f006cc0f823590Dan Williams		break;
37b0b1d60a64054697ef828e0565f006cc0f823590Dan Williams	default:
38b0b1d60a64054697ef828e0565f006cc0f823590Dan Williams		BUG();
39b0b1d60a64054697ef828e0565f006cc0f823590Dan Williams	}
40b0b1d60a64054697ef828e0565f006cc0f823590Dan Williams
41b0b1d60a64054697ef828e0565f006cc0f823590Dan Williams	return io_virt;
42b0b1d60a64054697ef828e0565f006cc0f823590Dan Williams}
43b0b1d60a64054697ef828e0565f006cc0f823590Dan WilliamsEXPORT_SYMBOL(__iop13xx_io);
44b0b1d60a64054697ef828e0565f006cc0f823590Dan Williams
451dfe34ae794c13b11192baac022826f9c53fe377Rob Herringstatic void __iomem *__iop13xx_ioremap_caller(unsigned long cookie,
461dfe34ae794c13b11192baac022826f9c53fe377Rob Herring	size_t size, unsigned int mtype, void *caller)
47285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams{
48285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	void __iomem * retval;
49285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams
50285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	switch (cookie) {
51285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	case IOP13XX_PCIX_LOWER_MEM_RA ... IOP13XX_PCIX_UPPER_MEM_RA:
52285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams		if (unlikely(!iop13xx_atux_mem_base))
53285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams			retval = NULL;
54285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams		else
55285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams			retval = (void *)(iop13xx_atux_mem_base +
56285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams			         (cookie - IOP13XX_PCIX_LOWER_MEM_RA));
57285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams		break;
58285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	case IOP13XX_PCIE_LOWER_MEM_RA ... IOP13XX_PCIE_UPPER_MEM_RA:
59285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams		if (unlikely(!iop13xx_atue_mem_base))
60285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams			retval = NULL;
61285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams		else
62285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams			retval = (void *)(iop13xx_atue_mem_base +
63285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams			         (cookie - IOP13XX_PCIE_LOWER_MEM_RA));
64285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams		break;
65285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	case IOP13XX_PBI_LOWER_MEM_RA ... IOP13XX_PBI_UPPER_MEM_RA:
6631aa8fd6fd30b0f36416df7d09619768d26b4332Russell King		retval = __arm_ioremap_caller(IOP13XX_PBI_LOWER_MEM_PA +
673603ab2b62ad8372fc93816b080b370dd55d7cecRussell King				       (cookie - IOP13XX_PBI_LOWER_MEM_RA),
6831aa8fd6fd30b0f36416df7d09619768d26b4332Russell King				       size, mtype, __builtin_return_address(0));
69285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams		break;
70285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	case IOP13XX_PCIE_LOWER_IO_PA ... IOP13XX_PCIE_UPPER_IO_PA:
71285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams		retval = (void *) IOP13XX_PCIE_IO_PHYS_TO_VIRT(cookie);
72285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams		break;
73285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	case IOP13XX_PCIX_LOWER_IO_PA ... IOP13XX_PCIX_UPPER_IO_PA:
74285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams		retval = (void *) IOP13XX_PCIX_IO_PHYS_TO_VIRT(cookie);
75285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams		break;
76285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	case IOP13XX_PMMR_PHYS_MEM_BASE ... IOP13XX_PMMR_UPPER_MEM_PA:
77285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams		retval = (void *) IOP13XX_PMMR_PHYS_TO_VIRT(cookie);
78285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams		break;
79285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	default:
8031aa8fd6fd30b0f36416df7d09619768d26b4332Russell King		retval = __arm_ioremap_caller(cookie, size, mtype,
811dfe34ae794c13b11192baac022826f9c53fe377Rob Herring				caller);
82285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	}
83285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams
84285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	return retval;
85285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams}
86285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams
871dfe34ae794c13b11192baac022826f9c53fe377Rob Herringstatic void __iop13xx_iounmap(volatile void __iomem *addr)
88285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams{
89285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	if (iop13xx_atue_mem_base)
90285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams		if (addr >= (void __iomem *) iop13xx_atue_mem_base &&
91285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	 	    addr < (void __iomem *) (iop13xx_atue_mem_base +
92285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	 	    			     iop13xx_atue_mem_size))
93285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams		    goto skip;
94285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams
95285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	if (iop13xx_atux_mem_base)
96285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams		if (addr >= (void __iomem *) iop13xx_atux_mem_base &&
97285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	 	    addr < (void __iomem *) (iop13xx_atux_mem_base +
98285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	 	    			     iop13xx_atux_mem_size))
99285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams		    goto skip;
100285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams
101285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	switch ((u32) addr) {
102285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	case IOP13XX_PCIE_LOWER_IO_VA ... IOP13XX_PCIE_UPPER_IO_VA:
103285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	case IOP13XX_PCIX_LOWER_IO_VA ... IOP13XX_PCIX_UPPER_IO_VA:
104285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	case IOP13XX_PMMR_VIRT_MEM_BASE ... IOP13XX_PMMR_UPPER_MEM_VA:
105285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams		goto skip;
106285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	}
107285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	__iounmap(addr);
108285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams
109285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williamsskip:
110285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams	return;
111285f5fa7e9a35e75d9022f9b036ed709721c5cdfDan Williams}
1121dfe34ae794c13b11192baac022826f9c53fe377Rob Herring
1131dfe34ae794c13b11192baac022826f9c53fe377Rob Herringvoid __init iop13xx_init_early(void)
1141dfe34ae794c13b11192baac022826f9c53fe377Rob Herring{
1151dfe34ae794c13b11192baac022826f9c53fe377Rob Herring	arch_ioremap_caller = __iop13xx_ioremap_caller;
1161dfe34ae794c13b11192baac022826f9c53fe377Rob Herring	arch_iounmap = __iop13xx_iounmap;
1171dfe34ae794c13b11192baac022826f9c53fe377Rob Herring}
118