2005-07-10 22:58:12 +04:00
/*
* linux / arch / arm / mach - omap1 / io . c
*
* OMAP1 I / O mapping code
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*/
# include <linux/config.h>
# include <linux/module.h>
# include <linux/kernel.h>
# include <linux/init.h>
2006-02-09 01:06:45 +03:00
# include <asm/tlb.h>
2005-07-10 22:58:12 +04:00
# include <asm/mach/map.h>
# include <asm/io.h>
2005-11-10 17:26:48 +03:00
# include <asm/arch/mux.h>
2005-07-10 22:58:12 +04:00
# include <asm/arch/tc.h>
2006-04-02 20:46:27 +04:00
# include <asm/arch/omapfb.h>
2005-07-10 22:58:12 +04:00
2005-11-10 17:26:48 +03:00
extern int omap1_clk_init ( void ) ;
2005-07-10 22:58:12 +04:00
extern void omap_check_revision ( void ) ;
2005-09-09 02:07:38 +04:00
extern void omap_sram_init ( void ) ;
2005-07-10 22:58:12 +04:00
/*
* The machine specific code may provide the extra mapping besides the
* default mapping provided here .
*/
static struct map_desc omap_io_desc [ ] __initdata = {
2005-10-28 18:19:00 +04:00
{
. virtual = IO_VIRT ,
. pfn = __phys_to_pfn ( IO_PHYS ) ,
. length = IO_SIZE ,
. type = MT_DEVICE
}
2005-07-10 22:58:12 +04:00
} ;
# ifdef CONFIG_ARCH_OMAP730
static struct map_desc omap730_io_desc [ ] __initdata = {
2005-10-28 18:19:00 +04:00
{
. virtual = OMAP730_DSP_BASE ,
. pfn = __phys_to_pfn ( OMAP730_DSP_START ) ,
. length = OMAP730_DSP_SIZE ,
. type = MT_DEVICE
} , {
. virtual = OMAP730_DSPREG_BASE ,
. pfn = __phys_to_pfn ( OMAP730_DSPREG_START ) ,
. length = OMAP730_DSPREG_SIZE ,
. type = MT_DEVICE
}
2005-07-10 22:58:12 +04:00
} ;
# endif
2005-11-10 17:26:48 +03:00
# ifdef CONFIG_ARCH_OMAP15XX
2005-07-10 22:58:12 +04:00
static struct map_desc omap1510_io_desc [ ] __initdata = {
2005-10-28 18:19:00 +04:00
{
. virtual = OMAP1510_DSP_BASE ,
. pfn = __phys_to_pfn ( OMAP1510_DSP_START ) ,
. length = OMAP1510_DSP_SIZE ,
. type = MT_DEVICE
} , {
. virtual = OMAP1510_DSPREG_BASE ,
. pfn = __phys_to_pfn ( OMAP1510_DSPREG_START ) ,
. length = OMAP1510_DSPREG_SIZE ,
. type = MT_DEVICE
}
2005-07-10 22:58:12 +04:00
} ;
# endif
# if defined(CONFIG_ARCH_OMAP16XX)
2005-09-09 02:07:38 +04:00
static struct map_desc omap16xx_io_desc [ ] __initdata = {
2005-10-28 18:19:00 +04:00
{
. virtual = OMAP16XX_DSP_BASE ,
. pfn = __phys_to_pfn ( OMAP16XX_DSP_START ) ,
. length = OMAP16XX_DSP_SIZE ,
. type = MT_DEVICE
} , {
. virtual = OMAP16XX_DSPREG_BASE ,
. pfn = __phys_to_pfn ( OMAP16XX_DSPREG_START ) ,
. length = OMAP16XX_DSPREG_SIZE ,
. type = MT_DEVICE
}
2005-07-10 22:58:12 +04:00
} ;
# endif
2006-02-09 01:06:45 +03:00
/*
* Maps common IO regions for omap1 . This should only get called from
* board specific init .
*/
void __init omap1_map_common_io ( void )
2005-07-10 22:58:12 +04:00
{
iotable_init ( omap_io_desc , ARRAY_SIZE ( omap_io_desc ) ) ;
2006-02-09 01:06:45 +03:00
/* Normally devicemaps_init() would flush caches and tlb after
* mdesc - > map_io ( ) , but we must also do it here because of the CPU
* revision check below .
*/
local_flush_tlb_all ( ) ;
flush_cache_all ( ) ;
/* We want to check CPU revision early for cpu_is_omapxxxx() macros.
* IO space mapping must be initialized before we can do that .
*/
2005-07-10 22:58:12 +04:00
omap_check_revision ( ) ;
# ifdef CONFIG_ARCH_OMAP730
if ( cpu_is_omap730 ( ) ) {
iotable_init ( omap730_io_desc , ARRAY_SIZE ( omap730_io_desc ) ) ;
}
# endif
2005-11-10 17:26:48 +03:00
# ifdef CONFIG_ARCH_OMAP15XX
2006-04-02 20:46:27 +04:00
if ( cpu_is_omap15xx ( ) ) {
2005-07-10 22:58:12 +04:00
iotable_init ( omap1510_io_desc , ARRAY_SIZE ( omap1510_io_desc ) ) ;
}
# endif
# if defined(CONFIG_ARCH_OMAP16XX)
2005-09-09 02:07:38 +04:00
if ( cpu_is_omap16xx ( ) ) {
iotable_init ( omap16xx_io_desc , ARRAY_SIZE ( omap16xx_io_desc ) ) ;
2005-07-10 22:58:12 +04:00
}
# endif
2005-09-09 02:07:38 +04:00
omap_sram_init ( ) ;
2006-04-02 20:46:27 +04:00
omapfb_reserve_mem ( ) ;
2006-02-09 01:06:45 +03:00
}
2005-09-09 02:07:38 +04:00
2006-02-09 01:06:45 +03:00
/*
* Common low - level hardware init for omap1 . This should only get called from
* board specific init .
*/
void __init omap1_init_common_hw ( )
{
2005-07-10 22:58:12 +04:00
/* REVISIT: Refer to OMAP5910 Errata, Advisory SYS_1: "Timeout Abort
* on a Posted Write in the TIPB Bridge " .
*/
omap_writew ( 0x0 , MPU_PUBLIC_TIPB_CNTL ) ;
omap_writew ( 0x0 , MPU_PRIVATE_TIPB_CNTL ) ;
/* Must init clocks early to assure that timer interrupt works
*/
2005-11-10 17:26:48 +03:00
omap1_clk_init ( ) ;
2005-07-10 22:58:12 +04:00
2006-02-09 01:06:45 +03:00
omap1_mux_init ( ) ;
2005-07-10 22:58:12 +04:00
}
2005-09-09 02:07:38 +04:00