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