2012-02-10 13:13:15 +09:00
/*
* SAMSUNG EXYNOS5250 Flattened Device Tree enabled machine
*
* Copyright ( c ) 2012 Samsung Electronics Co . , Ltd .
* http : //www.samsung.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/of_platform.h>
# include <linux/serial_core.h>
2012-10-23 22:51:33 +09:00
# include <linux/memblock.h>
# include <linux/of_fdt.h>
2012-02-10 13:13:15 +09:00
# include <asm/mach/arch.h>
# include <asm/hardware/gic.h>
# include <mach/map.h>
# include <plat/cpu.h>
# include <plat/regs-serial.h>
2012-10-23 22:51:33 +09:00
# include <plat/mfc.h>
2012-02-10 13:13:15 +09:00
# include "common.h"
/*
* The following lookup table is used to override device names when devices
* are registered from device tree . This is temporarily added to enable
* device tree support addition for the EXYNOS5 architecture .
*
* For drivers that require platform data to be provided from the machine
* file , a platform data pointer can also be supplied along with the
* devices names . Usually , the platform data elements that cannot be parsed
* from the device tree by the drivers ( example : function pointers ) are
* supplied . But it should be noted that this is a temporary mechanism and
* at some point , the drivers should be capable of parsing all the platform
* data from the device tree .
*/
static const struct of_dev_auxdata exynos5250_auxdata_lookup [ ] __initconst = {
OF_DEV_AUXDATA ( " samsung,exynos4210-uart " , EXYNOS5_PA_UART0 ,
" exynos4210-uart.0 " , NULL ) ,
OF_DEV_AUXDATA ( " samsung,exynos4210-uart " , EXYNOS5_PA_UART1 ,
" exynos4210-uart.1 " , NULL ) ,
OF_DEV_AUXDATA ( " samsung,exynos4210-uart " , EXYNOS5_PA_UART2 ,
" exynos4210-uart.2 " , NULL ) ,
OF_DEV_AUXDATA ( " samsung,exynos4210-uart " , EXYNOS5_PA_UART3 ,
" exynos4210-uart.3 " , NULL ) ,
2012-05-15 15:56:57 +09:00
OF_DEV_AUXDATA ( " samsung,s3c2440-i2c " , EXYNOS5_PA_IIC ( 0 ) ,
" s3c2440-i2c.0 " , NULL ) ,
OF_DEV_AUXDATA ( " samsung,s3c2440-i2c " , EXYNOS5_PA_IIC ( 1 ) ,
" s3c2440-i2c.1 " , NULL ) ,
2012-09-26 08:54:42 +09:00
OF_DEV_AUXDATA ( " samsung,exynos5250-dw-mshc " , EXYNOS5_PA_DWMCI0 ,
" dw_mmc.0 " , NULL ) ,
OF_DEV_AUXDATA ( " samsung,exynos5250-dw-mshc " , EXYNOS5_PA_DWMCI1 ,
" dw_mmc.1 " , NULL ) ,
OF_DEV_AUXDATA ( " samsung,exynos5250-dw-mshc " , EXYNOS5_PA_DWMCI2 ,
" dw_mmc.2 " , NULL ) ,
OF_DEV_AUXDATA ( " samsung,exynos5250-dw-mshc " , EXYNOS5_PA_DWMCI3 ,
" dw_mmc.3 " , NULL ) ,
2012-07-14 10:54:31 +09:00
OF_DEV_AUXDATA ( " samsung,exynos4210-spi " , EXYNOS5_PA_SPI0 ,
" exynos4210-spi.0 " , NULL ) ,
OF_DEV_AUXDATA ( " samsung,exynos4210-spi " , EXYNOS5_PA_SPI1 ,
" exynos4210-spi.1 " , NULL ) ,
OF_DEV_AUXDATA ( " samsung,exynos4210-spi " , EXYNOS5_PA_SPI2 ,
" exynos4210-spi.2 " , NULL ) ,
2012-02-10 13:13:15 +09:00
OF_DEV_AUXDATA ( " arm,pl330 " , EXYNOS5_PA_PDMA0 , " dma-pl330.0 " , NULL ) ,
OF_DEV_AUXDATA ( " arm,pl330 " , EXYNOS5_PA_PDMA1 , " dma-pl330.1 " , NULL ) ,
2012-04-10 08:37:59 -07:00
OF_DEV_AUXDATA ( " arm,pl330 " , EXYNOS5_PA_MDMA1 , " dma-pl330.2 " , NULL ) ,
2012-09-07 14:13:08 +09:00
OF_DEV_AUXDATA ( " samsung,exynos5-gsc " , EXYNOS5_PA_GSC0 ,
" exynos-gsc.0 " , NULL ) ,
OF_DEV_AUXDATA ( " samsung,exynos5-gsc " , EXYNOS5_PA_GSC1 ,
" exynos-gsc.1 " , NULL ) ,
OF_DEV_AUXDATA ( " samsung,exynos5-gsc " , EXYNOS5_PA_GSC2 ,
" exynos-gsc.2 " , NULL ) ,
OF_DEV_AUXDATA ( " samsung,exynos5-gsc " , EXYNOS5_PA_GSC3 ,
" exynos-gsc.3 " , NULL ) ,
2012-10-23 22:51:33 +09:00
OF_DEV_AUXDATA ( " samsung,mfc-v6 " , 0x11000000 , " s5p-mfc-v6 " , NULL ) ,
2012-02-10 13:13:15 +09:00
{ } ,
} ;
static void __init exynos5250_dt_map_io ( void )
{
exynos_init_io ( NULL , 0 ) ;
s3c24xx_init_clocks ( 24000000 ) ;
}
static void __init exynos5250_dt_machine_init ( void )
{
of_platform_populate ( NULL , of_default_bus_match_table ,
exynos5250_auxdata_lookup , NULL ) ;
}
static char const * exynos5250_dt_compat [ ] __initdata = {
" samsung,exynos5250 " ,
NULL
} ;
2012-10-23 22:51:33 +09:00
static void __init exynos5_reserve ( void )
{
struct s5p_mfc_dt_meminfo mfc_mem ;
/* Reserve memory for MFC only if it's available */
mfc_mem . compatible = " samsung,mfc-v6 " ;
if ( of_scan_flat_dt ( s5p_fdt_find_mfc_mem , & mfc_mem ) )
s5p_mfc_reserve_mem ( mfc_mem . roff , mfc_mem . rsize , mfc_mem . loff ,
mfc_mem . lsize ) ;
}
2012-02-10 13:13:15 +09:00
DT_MACHINE_START ( EXYNOS5_DT , " SAMSUNG EXYNOS5 (Flattened Device Tree) " )
/* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */
. init_irq = exynos5_init_irq ,
2011-09-08 13:15:22 +01:00
. smp = smp_ops ( exynos_smp_ops ) ,
2012-02-10 13:13:15 +09:00
. map_io = exynos5250_dt_map_io ,
. handle_irq = gic_handle_irq ,
. init_machine = exynos5250_dt_machine_init ,
2012-04-26 10:35:40 +08:00
. init_late = exynos_init_late ,
2012-02-10 13:13:15 +09:00
. timer = & exynos4_timer ,
. dt_compat = exynos5250_dt_compat ,
. restart = exynos5_restart ,
2012-10-23 22:51:33 +09:00
. reserve = exynos5_reserve ,
2012-02-10 13:13:15 +09:00
MACHINE_END