2011-03-30 09:27:47 +02: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 ) 2010 John Crispin < blogic @ openwrt . org >
*/
2011-11-10 21:33:07 +01:00
# include <linux/export.h>
2011-03-30 09:27:47 +02:00
# include <linux/clk.h>
2012-07-22 08:56:00 +02:00
# include <linux/bootmem.h>
2012-04-13 20:56:13 +02:00
# include <linux/of_platform.h>
2012-07-22 08:56:00 +02:00
# include <linux/of_fdt.h>
2011-03-30 09:27:47 +02:00
# include <asm/bootinfo.h>
# include <asm/time.h>
2013-09-07 14:58:54 -05:00
# include <asm/prom.h>
2011-03-30 09:27:47 +02:00
# include <lantiq.h>
# include "prom.h"
# include "clk.h"
2012-04-13 20:56:13 +02:00
/* access to the ebu needs to be locked between different drivers */
DEFINE_SPINLOCK ( ebu_lock ) ;
EXPORT_SYMBOL_GPL ( ebu_lock ) ;
2011-03-30 09:27:47 +02:00
2012-04-13 20:56:13 +02:00
/*
* this struct is filled by the soc specific detection code and holds
* information about the specific soc type , revision and name
*/
static struct ltq_soc_info soc_info ;
2011-03-30 09:27:47 +02:00
const char * get_system_type ( void )
{
return soc_info . sys_type ;
}
2014-09-10 22:29:21 +02:00
int ltq_soc_type ( void )
{
return soc_info . type ;
}
2015-02-26 01:31:04 +02:00
void __init prom_free_prom_memory ( void )
2011-03-30 09:27:47 +02:00
{
}
static void __init prom_init_cmdline ( void )
{
int argc = fw_arg0 ;
char * * argv = ( char * * ) KSEG1ADDR ( fw_arg1 ) ;
int i ;
2012-05-02 12:27:39 +02:00
arcs_cmdline [ 0 ] = ' \0 ' ;
2011-03-30 09:27:47 +02:00
for ( i = 0 ; i < argc ; i + + ) {
2012-05-02 12:27:39 +02:00
char * p = ( char * ) KSEG1ADDR ( argv [ i ] ) ;
2011-03-30 09:27:47 +02:00
2012-05-02 12:27:39 +02:00
if ( CPHYSADDR ( p ) & & * p ) {
2011-03-30 09:27:47 +02:00
strlcat ( arcs_cmdline , p , sizeof ( arcs_cmdline ) ) ;
strlcat ( arcs_cmdline , " " , sizeof ( arcs_cmdline ) ) ;
}
}
}
2012-04-13 20:56:13 +02:00
void __init plat_mem_setup ( void )
2011-03-30 09:27:47 +02:00
{
2012-04-13 20:56:13 +02:00
ioport_resource . start = IOPORT_RESOURCE_START ;
ioport_resource . end = IOPORT_RESOURCE_END ;
iomem_resource . start = IOMEM_RESOURCE_START ;
iomem_resource . end = IOMEM_RESOURCE_END ;
set_io_port_base ( ( unsigned long ) 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 ) ;
2012-04-13 20:56:13 +02:00
}
2011-03-30 09:27:47 +02:00
2012-07-22 08:56:00 +02:00
void __init device_tree_init ( void )
{
2014-04-02 17:50:19 -05:00
unflatten_and_copy_device_tree ( ) ;
2012-07-22 08:56:00 +02:00
}
2012-04-13 20:56:13 +02:00
void __init prom_init ( void )
{
/* call the soc specific detetcion code and get it to fill soc_info */
2011-03-30 09:27:47 +02:00
ltq_soc_detect ( & soc_info ) ;
2012-04-13 20:56:13 +02:00
snprintf ( soc_info . sys_type , LTQ_SYS_TYPE_LEN - 1 , " %s rev %s " ,
soc_info . name , soc_info . rev_type ) ;
2011-03-30 09:27:47 +02:00
soc_info . sys_type [ LTQ_SYS_TYPE_LEN - 1 ] = ' \0 ' ;
pr_info ( " SoC: %s \n " , soc_info . sys_type ) ;
prom_init_cmdline ( ) ;
2012-04-30 11:33:05 +02:00
# if defined(CONFIG_MIPS_MT_SMP)
if ( register_vsmp_smp_ops ( ) )
panic ( " failed to register_vsmp_smp_ops() " ) ;
# endif
2011-03-30 09:27:47 +02:00
}
2012-04-13 20:56:13 +02:00
int __init plat_of_setup ( void )
{
2014-10-20 21:28:02 -07:00
return __dt_register_buses ( soc_info . compatible , " simple-bus " ) ;
2012-04-13 20:56:13 +02:00
}
arch_initcall ( plat_of_setup ) ;