2006-12-07 02:59:39 +01:00
/*
* iop13xx custom ioremap implementation
* Copyright ( c ) 2005 - 2006 , Intel Corporation .
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms and conditions of the GNU General Public License ,
* version 2 , as published by the Free Software Foundation .
*
* This program is distributed in the hope it will be useful , but WITHOUT
* ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE . See the GNU General Public License for
* more details .
*
* You should have received a copy of the GNU General Public License along with
* this program ; if not , write to the Free Software Foundation , Inc . , 59 Temple
* Place - Suite 330 , Boston , MA 02111 - 1307 USA .
*
*/
# include <linux/kernel.h>
# include <linux/module.h>
2008-09-06 12:10:45 +01:00
# include <linux/io.h>
2008-08-05 16:14:15 +01:00
# include <mach/hardware.h>
2006-12-07 02:59:39 +01:00
2012-02-29 10:58:05 -06:00
# include "pci.h"
2013-05-16 19:40:22 +01:00
static void __iomem * __iop13xx_ioremap_caller ( phys_addr_t cookie ,
2012-02-29 10:56:15 -06:00
size_t size , unsigned int mtype , void * caller )
2006-12-07 02:59:39 +01:00
{
void __iomem * retval ;
switch ( cookie ) {
case IOP13XX_PCIX_LOWER_MEM_RA . . . IOP13XX_PCIX_UPPER_MEM_RA :
if ( unlikely ( ! iop13xx_atux_mem_base ) )
retval = NULL ;
else
2012-09-14 20:17:50 +00:00
retval = ( iop13xx_atux_mem_base +
2006-12-07 02:59:39 +01:00
( cookie - IOP13XX_PCIX_LOWER_MEM_RA ) ) ;
break ;
case IOP13XX_PCIE_LOWER_MEM_RA . . . IOP13XX_PCIE_UPPER_MEM_RA :
if ( unlikely ( ! iop13xx_atue_mem_base ) )
retval = NULL ;
else
2012-09-14 20:17:50 +00:00
retval = ( iop13xx_atue_mem_base +
2006-12-07 02:59:39 +01:00
( cookie - IOP13XX_PCIE_LOWER_MEM_RA ) ) ;
break ;
case IOP13XX_PBI_LOWER_MEM_RA . . . IOP13XX_PBI_UPPER_MEM_RA :
2009-12-18 11:10:03 +00:00
retval = __arm_ioremap_caller ( IOP13XX_PBI_LOWER_MEM_PA +
2007-05-05 20:59:27 +01:00
( cookie - IOP13XX_PBI_LOWER_MEM_RA ) ,
2009-12-18 11:10:03 +00:00
size , mtype , __builtin_return_address ( 0 ) ) ;
2006-12-07 02:59:39 +01:00
break ;
case IOP13XX_PMMR_PHYS_MEM_BASE . . . IOP13XX_PMMR_UPPER_MEM_PA :
2012-09-14 20:17:50 +00:00
retval = IOP13XX_PMMR_PHYS_TO_VIRT ( cookie ) ;
2006-12-07 02:59:39 +01:00
break ;
default :
2009-12-18 11:10:03 +00:00
retval = __arm_ioremap_caller ( cookie , size , mtype ,
2012-02-29 10:56:15 -06:00
caller ) ;
2006-12-07 02:59:39 +01:00
}
return retval ;
}
2012-02-29 10:56:15 -06:00
static void __iop13xx_iounmap ( volatile void __iomem * addr )
2006-12-07 02:59:39 +01:00
{
if ( iop13xx_atue_mem_base )
if ( addr > = ( void __iomem * ) iop13xx_atue_mem_base & &
addr < ( void __iomem * ) ( iop13xx_atue_mem_base +
iop13xx_atue_mem_size ) )
goto skip ;
if ( iop13xx_atux_mem_base )
if ( addr > = ( void __iomem * ) iop13xx_atux_mem_base & &
addr < ( void __iomem * ) ( iop13xx_atux_mem_base +
iop13xx_atux_mem_size ) )
goto skip ;
switch ( ( u32 ) addr ) {
2012-09-14 20:17:50 +00:00
case ( u32 ) IOP13XX_PMMR_VIRT_MEM_BASE . . . ( u32 ) IOP13XX_PMMR_UPPER_MEM_VA :
2006-12-07 02:59:39 +01:00
goto skip ;
}
__iounmap ( addr ) ;
skip :
return ;
}
2012-02-29 10:56:15 -06:00
void __init iop13xx_init_early ( void )
{
arch_ioremap_caller = __iop13xx_ioremap_caller ;
arch_iounmap = __iop13xx_iounmap ;
}