2013-01-20 22:02:01 +01:00
/*
* 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 .
*
* Copyright ( C ) 2008 Imre Kaloz < kaloz @ openwrt . org >
* Copyright ( C ) 2008 - 2009 Gabor Juhos < juhosg @ openwrt . org >
* Copyright ( C ) 2013 John Crispin < blogic @ openwrt . org >
*/
# include <linux/io.h>
# include <linux/clk.h>
# include <linux/init.h>
2013-04-13 15:15:51 +02:00
# include <linux/sizes.h>
2013-01-20 22:02:01 +01:00
# include <linux/of_fdt.h>
# include <linux/kernel.h>
# include <linux/bootmem.h>
# include <linux/of_platform.h>
# include <linux/of_address.h>
# include <asm/reboot.h>
# include <asm/bootinfo.h>
# include <asm/addrspace.h>
2013-09-07 14:58:54 -05:00
# include <asm/prom.h>
2013-01-20 22:02:01 +01:00
# include "common.h"
__iomem void * rt_sysc_membase ;
__iomem void * rt_memc_membase ;
__iomem void * plat_of_remap_node ( const char * node )
{
struct resource res ;
struct device_node * np ;
np = of_find_compatible_node ( NULL , NULL , node ) ;
if ( ! np )
panic ( " Failed to find %s node " , node ) ;
if ( of_address_to_resource ( np , 0 , & res ) )
panic ( " Failed to get resource for %s " , node ) ;
if ( ( request_mem_region ( res . start ,
resource_size ( & res ) ,
res . name ) < 0 ) )
panic ( " Failed to request resources for %s " , node ) ;
return ioremap_nocache ( res . start , resource_size ( & res ) ) ;
}
void __init device_tree_init ( void )
{
2014-04-02 19:07:24 -05:00
unflatten_and_copy_device_tree ( ) ;
2013-01-20 22:02:01 +01:00
}
void __init plat_mem_setup ( void )
{
set_io_port_base ( KSEG1 ) ;
/*
* Load the builtin devicetree . This causes the chosen node to be
* parsed resulting in our memory appearing
*/
2014-03-31 15:13:07 -05:00
__dt_setup_arch ( __dtb_start ) ;
2013-04-13 15:15:51 +02:00
if ( soc_info . mem_size )
2013-06-06 12:55:53 +00:00
add_memory_region ( soc_info . mem_base , soc_info . mem_size * SZ_1M ,
2013-04-13 15:15:51 +02:00
BOOT_MEM_RAM ) ;
else
detect_memory_region ( soc_info . mem_base ,
soc_info . mem_size_min * SZ_1M ,
soc_info . mem_size_max * SZ_1M ) ;
2013-01-20 22:02:01 +01:00
}
static int __init plat_of_setup ( void )
{
static struct of_device_id of_ids [ 3 ] ;
int len = sizeof ( of_ids [ 0 ] . compatible ) ;
if ( ! of_have_populated_dt ( ) )
panic ( " device tree not present " ) ;
2013-05-26 07:01:46 +00:00
strlcpy ( of_ids [ 0 ] . compatible , soc_info . compatible , len ) ;
2014-07-26 15:59:57 +02:00
strlcpy ( of_ids [ 1 ] . compatible , " palmbus " , len ) ;
2013-01-20 22:02:01 +01:00
if ( of_platform_populate ( NULL , of_ids , NULL , NULL ) )
2013-09-18 16:05:26 +02:00
panic ( " failed to populate DT " ) ;
2013-01-20 22:02:01 +01:00
2013-09-04 00:16:59 +02:00
/* make sure ithat the reset controller is setup early */
ralink_rst_init ( ) ;
2013-01-20 22:02:01 +01:00
return 0 ;
}
arch_initcall ( plat_of_setup ) ;