2019-06-04 10:11:33 +02:00
// SPDX-License-Identifier: GPL-2.0-only
2013-01-22 17:00:52 +05:30
/*
* Copyright ( C ) 2012 Synopsys , Inc . ( www . synopsys . com )
*
* Based on reduced version of METAG
*/
# include <linux/init.h>
# include <linux/reboot.h>
# include <linux/memblock.h>
# include <linux/of.h>
# include <linux/of_fdt.h>
2013-01-18 15:12:26 +05:30
# include <asm/mach_desc.h>
2013-01-22 17:00:52 +05:30
2015-02-03 20:08:52 -05:00
# ifdef CONFIG_SERIAL_EARLYCON
2014-10-28 15:04:05 +05:30
static unsigned int __initdata arc_base_baud ;
unsigned int __init arc_early_base_baud ( void )
{
return arc_base_baud / 16 ;
}
static void __init arc_set_early_base_baud ( unsigned long dt_root )
{
if ( of_flat_dt_is_compatible ( dt_root , " abilis,arc-tb10x " ) )
2016-02-01 16:31:14 +03:00
arc_base_baud = 166666666 ; /* Fixed 166.6MHz clk (TB10x) */
2017-08-15 21:13:55 +03:00
else if ( of_flat_dt_is_compatible ( dt_root , " snps,arc-sdp " ) | |
of_flat_dt_is_compatible ( dt_root , " snps,hsdk " ) )
arc_base_baud = 33333333 ; /* Fixed 33MHz clk (AXS10x & HSDK) */
2014-10-28 15:04:05 +05:30
else
2016-02-01 16:31:14 +03:00
arc_base_baud = 50000000 ; /* Fixed default 50MHz */
2014-10-28 15:04:05 +05:30
}
# else
# define arc_set_early_base_baud(dt_root)
# endif
2013-08-27 21:43:12 -05:00
static const void * __init arch_get_next_mach ( const char * const * * match )
{
static const struct machine_desc * mdesc = __arch_info_begin ;
const struct machine_desc * m = mdesc ;
if ( m > = __arch_info_end )
return NULL ;
mdesc + + ;
* match = m - > dt_compat ;
return m ;
}
2013-01-22 17:00:52 +05:30
/**
* setup_machine_fdt - Machine setup when an dtb was passed to the kernel
* @ dt : virtual address pointer to dt blob
*
* If a dtb was passed to the kernel , then use it to choose the correct
* machine_desc and to setup the system .
*/
2013-08-27 21:43:12 -05:00
const struct machine_desc * __init setup_machine_fdt ( void * dt )
2013-01-22 17:00:52 +05:30
{
2013-08-27 21:43:12 -05:00
const struct machine_desc * mdesc ;
2013-01-22 17:00:52 +05:30
unsigned long dt_root ;
2013-08-26 10:12:22 -05:00
if ( ! early_init_dt_scan ( dt ) )
2013-01-18 15:12:26 +05:30
return NULL ;
2013-01-22 17:00:52 +05:30
2013-08-27 21:43:12 -05:00
mdesc = of_flat_dt_match_machine ( NULL , arch_get_next_mach ) ;
if ( ! mdesc )
2013-01-18 15:12:26 +05:30
machine_halt ( ) ;
2013-01-22 17:00:52 +05:30
2013-08-27 21:43:12 -05:00
dt_root = of_get_flat_dt_root ( ) ;
2014-10-28 15:04:05 +05:30
arc_set_early_base_baud ( dt_root ) ;
2013-08-27 21:43:12 -05:00
return mdesc ;
2013-01-22 17:00:52 +05:30
}