2005-07-10 19:58:12 +01: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/module.h>
# include <linux/kernel.h>
# include <linux/init.h>
2008-09-06 12:10:45 +01:00
# include <linux/io.h>
2005-07-10 19:58:12 +01:00
2006-02-08 22:06:45 +00:00
# include <asm/tlb.h>
2005-07-10 19:58:12 +01:00
# include <asm/mach/map.h>
2012-02-24 10:34:34 -08:00
2009-10-20 09:40:47 -07:00
# include <plat/mux.h>
# include <plat/tc.h>
2012-04-13 06:34:26 -06:00
# include <plat/dma.h>
2005-07-10 19:58:12 +01:00
2012-02-24 10:34:34 -08:00
# include "iomap.h"
# include "common.h"
2009-12-08 16:29:38 -07:00
# include "clock.h"
2005-07-10 19:58:12 +01: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 15:19:00 +01:00
{
2009-08-28 10:50:37 -07:00
. virtual = OMAP1_IO_VIRT ,
. pfn = __phys_to_pfn ( OMAP1_IO_PHYS ) ,
. length = OMAP1_IO_SIZE ,
2005-10-28 15:19:00 +01:00
. type = MT_DEVICE
}
2005-07-10 19:58:12 +01:00
} ;
2009-09-22 05:58:08 +01:00
# if defined (CONFIG_ARCH_OMAP730) || defined (CONFIG_ARCH_OMAP850)
2009-09-22 10:02:58 +01:00
static struct map_desc omap7xx_io_desc [ ] __initdata = {
2005-10-28 15:19:00 +01:00
{
2009-09-22 07:34:13 +01:00
. virtual = OMAP7XX_DSP_BASE ,
. pfn = __phys_to_pfn ( OMAP7XX_DSP_START ) ,
. length = OMAP7XX_DSP_SIZE ,
2005-10-28 15:19:00 +01:00
. type = MT_DEVICE
} , {
2009-09-22 07:34:13 +01:00
. virtual = OMAP7XX_DSPREG_BASE ,
. pfn = __phys_to_pfn ( OMAP7XX_DSPREG_START ) ,
. length = OMAP7XX_DSPREG_SIZE ,
2005-10-28 15:19:00 +01:00
. type = MT_DEVICE
}
2005-07-10 19:58:12 +01:00
} ;
# endif
2005-11-10 14:26:48 +00:00
# ifdef CONFIG_ARCH_OMAP15XX
2005-07-10 19:58:12 +01:00
static struct map_desc omap1510_io_desc [ ] __initdata = {
2005-10-28 15:19:00 +01: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 19:58:12 +01:00
} ;
# endif
# if defined(CONFIG_ARCH_OMAP16XX)
2005-09-08 23:07:38 +01:00
static struct map_desc omap16xx_io_desc [ ] __initdata = {
2005-10-28 15:19:00 +01: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 19:58:12 +01:00
} ;
# endif
2006-02-08 22:06:45 +00:00
/*
2011-10-05 15:14:02 -07:00
* Maps common IO regions for omap1
2006-02-08 22:06:45 +00:00
*/
2011-10-05 15:14:02 -07:00
static void __init omap1_map_common_io ( void )
2005-07-10 19:58:12 +01:00
{
iotable_init ( omap_io_desc , ARRAY_SIZE ( omap_io_desc ) ) ;
2011-10-05 15:14:02 -07:00
}
2005-07-10 19:58:12 +01:00
2009-09-22 05:58:08 +01:00
# if defined (CONFIG_ARCH_OMAP730) || defined (CONFIG_ARCH_OMAP850)
2011-10-05 15:14:02 -07:00
void __init omap7xx_map_io ( void )
{
omap1_map_common_io ( ) ;
iotable_init ( omap7xx_io_desc , ARRAY_SIZE ( omap7xx_io_desc ) ) ;
}
2005-07-10 19:58:12 +01:00
# endif
2011-10-05 15:14:02 -07:00
2005-11-10 14:26:48 +00:00
# ifdef CONFIG_ARCH_OMAP15XX
2011-10-05 15:14:02 -07:00
void __init omap15xx_map_io ( void )
{
omap1_map_common_io ( ) ;
iotable_init ( omap1510_io_desc , ARRAY_SIZE ( omap1510_io_desc ) ) ;
}
2005-07-10 19:58:12 +01:00
# endif
2011-10-05 15:14:02 -07:00
# if defined(CONFIG_ARCH_OMAP16XX)
void __init omap16xx_map_io ( void )
{
omap1_map_common_io ( ) ;
iotable_init ( omap16xx_io_desc , ARRAY_SIZE ( omap16xx_io_desc ) ) ;
2006-02-08 22:06:45 +00:00
}
2011-10-05 15:14:02 -07:00
# endif
2005-09-08 23:07:38 +01:00
2006-02-08 22:06:45 +00:00
/*
2011-10-05 15:14:02 -07:00
* Common low - level hardware init for omap1 .
2006-02-08 22:06:45 +00:00
*/
2012-03-05 16:11:04 -08:00
void __init omap1_init_early ( void )
2006-02-08 22:06:45 +00:00
{
2011-10-05 15:14:02 -07:00
omap_check_revision ( ) ;
2005-07-10 19:58:12 +01: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 14:26:48 +00:00
omap1_clk_init ( ) ;
2006-02-08 22:06:45 +00:00
omap1_mux_init ( ) ;
2011-11-01 13:47:27 +01:00
omap_init_consistent_dma_size ( ) ;
2005-07-10 19:58:12 +01:00
}
2005-09-08 23:07:38 +01:00
2012-04-26 13:49:29 +08:00
void __init omap1_init_late ( void )
{
omap_serial_wakeup_init ( ) ;
}
2010-12-10 09:46:24 -08:00
/*
* NOTE : Please use ioremap + __raw_read / write where possible instead of these
*/
u8 omap_readb ( u32 pa )
{
return __raw_readb ( OMAP1_IO_ADDRESS ( pa ) ) ;
}
EXPORT_SYMBOL ( omap_readb ) ;
u16 omap_readw ( u32 pa )
{
return __raw_readw ( OMAP1_IO_ADDRESS ( pa ) ) ;
}
EXPORT_SYMBOL ( omap_readw ) ;
u32 omap_readl ( u32 pa )
{
return __raw_readl ( OMAP1_IO_ADDRESS ( pa ) ) ;
}
EXPORT_SYMBOL ( omap_readl ) ;
void omap_writeb ( u8 v , u32 pa )
{
__raw_writeb ( v , OMAP1_IO_ADDRESS ( pa ) ) ;
}
EXPORT_SYMBOL ( omap_writeb ) ;
void omap_writew ( u16 v , u32 pa )
{
__raw_writew ( v , OMAP1_IO_ADDRESS ( pa ) ) ;
}
EXPORT_SYMBOL ( omap_writew ) ;
void omap_writel ( u32 v , u32 pa )
{
__raw_writel ( v , OMAP1_IO_ADDRESS ( pa ) ) ;
}
EXPORT_SYMBOL ( omap_writel ) ;