2019-06-04 10:11:33 +02:00
// SPDX-License-Identifier: GPL-2.0-only
2011-03-30 09:27:47 +02:00
/*
*
2016-05-05 09:57:56 +02:00
* Copyright ( C ) 2010 John Crispin < john @ phrozen . org >
2011-03-30 09:27:47 +02:00
*/
2011-11-10 21:33:07 +01:00
# include <linux/export.h>
2011-03-30 09:27:47 +02:00
# include <linux/clk.h>
2018-10-30 15:09:49 -07:00
# include <linux/memblock.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
2016-12-27 16:31:43 +01:00
/*
* This is needed by the VPE loader code , just set it to 0 and assume
* that the firmware hardcodes this value to something useful .
*/
unsigned long physical_memsize = 0L ;
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
{
2016-03-19 18:28:51 +01:00
void * dtb ;
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 ) ;
2016-06-20 11:27:37 +02:00
if ( fw_passed_dtb ) /* UHI interface */
dtb = ( void * ) fw_passed_dtb ;
2016-03-19 18:28:51 +01:00
else if ( __dtb_start ! = __dtb_end )
dtb = ( void * ) __dtb_start ;
else
panic ( " no dtb found " ) ;
2012-04-13 20:56:13 +02:00
/*
2016-03-19 18:28:51 +01:00
* Load the devicetree . This causes the chosen node to be
2012-04-13 20:56:13 +02:00
* parsed resulting in our memory appearing
*/
2016-03-19 18:28:51 +01:00
__dt_setup_arch ( dtb ) ;
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
}