2009-11-28 08:17:18 +01:00
/*
* Copyright ( C ) 2008 - 2009 ST - Ericsson
*
* Author : Srinidhi KASAGAR < srinidhi . kasagar @ stericsson . com >
*
* 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/types.h>
# include <linux/init.h>
# include <linux/device.h>
# include <linux/amba/bus.h>
# include <linux/irq.h>
2010-03-03 04:54:37 +01:00
# include <linux/gpio.h>
2009-11-28 08:17:18 +01:00
# include <linux/platform_device.h>
2010-03-01 05:03:31 +01:00
# include <linux/io.h>
2009-11-28 08:17:18 +01:00
2010-03-01 05:03:31 +01:00
# include <asm/localtimer.h>
2009-11-28 08:17:18 +01:00
# include <asm/mach/map.h>
2010-03-01 05:03:31 +01:00
# include <plat/mtu.h>
2009-11-28 08:17:18 +01:00
# include <mach/hardware.h>
2010-03-01 05:03:31 +01:00
# include <mach/setup.h>
2009-11-28 08:17:18 +01:00
2010-03-03 04:54:37 +01:00
static struct nmk_gpio_platform_data u8500_gpio_data [ ] = {
GPIO_DATA ( " GPIO-0-31 " , 0 ) ,
GPIO_DATA ( " GPIO-32-63 " , 32 ) , /* 37..63 not routed to pin */
GPIO_DATA ( " GPIO-64-95 " , 64 ) ,
GPIO_DATA ( " GPIO-96-127 " , 96 ) , /* 97..127 not routed to pin */
GPIO_DATA ( " GPIO-128-159 " , 128 ) ,
GPIO_DATA ( " GPIO-160-191 " , 160 ) , /* 172..191 not routed to pin */
GPIO_DATA ( " GPIO-192-223 " , 192 ) ,
GPIO_DATA ( " GPIO-224-255 " , 224 ) , /* 231..255 not routed to pin */
GPIO_DATA ( " GPIO-256-288 " , 256 ) , /* 258..288 not routed to pin */
} ;
static struct resource u8500_gpio_resources [ ] = {
GPIO_RESOURCE ( 0 ) ,
GPIO_RESOURCE ( 1 ) ,
GPIO_RESOURCE ( 2 ) ,
GPIO_RESOURCE ( 3 ) ,
GPIO_RESOURCE ( 4 ) ,
GPIO_RESOURCE ( 5 ) ,
GPIO_RESOURCE ( 6 ) ,
GPIO_RESOURCE ( 7 ) ,
GPIO_RESOURCE ( 8 ) ,
} ;
static struct platform_device u8500_gpio_devs [ ] = {
GPIO_DEVICE ( 0 ) ,
GPIO_DEVICE ( 1 ) ,
GPIO_DEVICE ( 2 ) ,
GPIO_DEVICE ( 3 ) ,
GPIO_DEVICE ( 4 ) ,
GPIO_DEVICE ( 5 ) ,
GPIO_DEVICE ( 6 ) ,
GPIO_DEVICE ( 7 ) ,
GPIO_DEVICE ( 8 ) ,
} ;
2009-11-28 08:17:18 +01:00
static struct platform_device * platform_devs [ ] __initdata = {
2010-03-03 04:54:37 +01:00
& u8500_gpio_devs [ 0 ] ,
& u8500_gpio_devs [ 1 ] ,
& u8500_gpio_devs [ 2 ] ,
& u8500_gpio_devs [ 3 ] ,
& u8500_gpio_devs [ 4 ] ,
& u8500_gpio_devs [ 5 ] ,
& u8500_gpio_devs [ 6 ] ,
& u8500_gpio_devs [ 7 ] ,
& u8500_gpio_devs [ 8 ] ,
2009-11-28 08:17:18 +01:00
} ;
/* minimum static i/o mapping required to boot U8500 platforms */
static struct map_desc u8500_io_desc [ ] __initdata = {
2010-03-01 05:07:47 +01:00
__IO_DEV_DESC ( U8500_PRCMU_BASE , SZ_4K ) ,
2010-05-03 07:34:53 +01:00
__IO_DEV_DESC ( U8500_GPIO0_BASE , SZ_4K ) ,
2010-03-03 04:54:37 +01:00
__IO_DEV_DESC ( U8500_GPIO1_BASE , SZ_4K ) ,
__IO_DEV_DESC ( U8500_GPIO2_BASE , SZ_4K ) ,
__IO_DEV_DESC ( U8500_GPIO3_BASE , SZ_4K ) ,
2009-11-28 08:17:18 +01:00
} ;
2010-03-01 05:05:56 +01:00
static struct map_desc u8500ed_io_desc [ ] __initdata = {
__IO_DEV_DESC ( U8500_MTU0_BASE_ED , SZ_4K ) ,
2010-03-01 05:07:47 +01:00
__IO_DEV_DESC ( U8500_CLKRST7_BASE_ED , SZ_8K ) ,
2010-03-01 05:05:56 +01:00
} ;
static struct map_desc u8500v1_io_desc [ ] __initdata = {
2010-05-03 07:34:53 +01:00
__IO_DEV_DESC ( U8500_MTU0_BASE , SZ_4K ) ,
2010-03-01 05:05:56 +01:00
} ;
2009-11-28 08:17:18 +01:00
void __init u8500_map_io ( void )
{
2010-05-03 07:39:02 +01:00
ux500_map_io ( ) ;
2009-11-28 08:17:18 +01:00
iotable_init ( u8500_io_desc , ARRAY_SIZE ( u8500_io_desc ) ) ;
2010-03-01 05:05:56 +01:00
if ( cpu_is_u8500ed ( ) )
iotable_init ( u8500ed_io_desc , ARRAY_SIZE ( u8500ed_io_desc ) ) ;
else
iotable_init ( u8500v1_io_desc , ARRAY_SIZE ( u8500v1_io_desc ) ) ;
2009-11-28 08:17:18 +01:00
}
/*
* This function is called from the board init
*/
void __init u8500_init_devices ( void )
{
/* Register the platform devices */
platform_add_devices ( platform_devs , ARRAY_SIZE ( platform_devs ) ) ;
return ;
}
2010-03-01 05:03:31 +01:00
static void __init u8500_timer_init ( void )
{
# ifdef CONFIG_LOCAL_TIMERS
/* Setup the local timer base */
twd_base = __io_address ( U8500_TWD_BASE ) ;
# endif
/* Setup the MTU base */
2010-03-01 05:05:56 +01:00
if ( cpu_is_u8500ed ( ) )
mtu_base = __io_address ( U8500_MTU0_BASE_ED ) ;
else
2010-05-03 07:34:53 +01:00
mtu_base = __io_address ( U8500_MTU0_BASE ) ;
2010-03-01 05:03:31 +01:00
nmdk_timer_init ( ) ;
}
struct sys_timer u8500_timer = {
. init = u8500_timer_init ,
} ;