2013-01-22 17:00:52 +05:30
/*
* 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 15:12:20 +05:30
# include <asm/clk.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 )
{
unsigned int core_clk = arc_get_core_freq ( ) ;
if ( of_flat_dt_is_compatible ( dt_root , " abilis,arc-tb10x " ) )
arc_base_baud = core_clk / 3 ;
2015-02-02 19:23:21 +05:30
else if ( of_flat_dt_is_compatible ( dt_root , " snps,arc-sdp " ) )
2015-03-09 14:33:40 +05:30
arc_base_baud = 33333333 ; /* Fixed 33MHz clk (AXS10x) */
2014-10-28 15:04:05 +05:30
else
arc_base_baud = core_clk ;
}
# 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 ;
2014-06-23 11:42:44 +05:30
const void * clk ;
2014-04-01 23:49:03 -05:00
int len ;
2013-01-22 17:00:52 +05:30
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 ( ) ;
2013-01-18 15:12:20 +05:30
clk = of_get_flat_dt_prop ( dt_root , " clock-frequency " , & len ) ;
if ( clk )
arc_set_core_freq ( of_read_ulong ( clk , len / 4 ) ) ;
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
}