2013-01-22 15:30:52 +04:00
/*
* Copyright ( C ) 2012 Synopsys , Inc . ( www . synopsys . com )
*
* Based on reduced version of METAG
*
* 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/init.h>
# include <linux/reboot.h>
# include <linux/memblock.h>
# include <linux/of.h>
# include <linux/of_fdt.h>
2013-01-18 13:42:26 +04:00
# include <asm/mach_desc.h>
2013-01-22 15:30:52 +04:00
2015-02-04 04:08:52 +03:00
# ifdef CONFIG_SERIAL_EARLYCON
2014-10-28 12:34:05 +03:00
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) */
2016-11-08 16:20:59 +03:00
else if ( of_flat_dt_is_compatible ( dt_root , " ezchip,arc-nps " ) )
arc_base_baud = 800000000 ; /* Fixed 800MHz clk (NPS) */
2014-10-28 12:34:05 +03:00
else
2016-02-01 16:31:14 +03:00
arc_base_baud = 50000000 ; /* Fixed default 50MHz */
2014-10-28 12:34:05 +03:00
}
# else
# define arc_set_early_base_baud(dt_root)
# endif
2013-08-28 06:43:12 +04: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 15:30:52 +04:00
/**
* 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-28 06:43:12 +04:00
const struct machine_desc * __init setup_machine_fdt ( void * dt )
2013-01-22 15:30:52 +04:00
{
2013-08-28 06:43:12 +04:00
const struct machine_desc * mdesc ;
2013-01-22 15:30:52 +04:00
unsigned long dt_root ;
2013-08-26 19:12:22 +04:00
if ( ! early_init_dt_scan ( dt ) )
2013-01-18 13:42:26 +04:00
return NULL ;
2013-01-22 15:30:52 +04:00
2013-08-28 06:43:12 +04:00
mdesc = of_flat_dt_match_machine ( NULL , arch_get_next_mach ) ;
if ( ! mdesc )
2013-01-18 13:42:26 +04:00
machine_halt ( ) ;
2013-01-22 15:30:52 +04:00
2013-08-28 06:43:12 +04:00
dt_root = of_get_flat_dt_root ( ) ;
2014-10-28 12:34:05 +03:00
arc_set_early_base_baud ( dt_root ) ;
2013-08-28 06:43:12 +04:00
return mdesc ;
2013-01-22 15:30:52 +04:00
}