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:20 +04:00
# include <asm/clk.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 )
{
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 16:53:21 +03:00
else if ( of_flat_dt_is_compatible ( dt_root , " snps,arc-sdp " ) )
2015-03-09 12:03:40 +03:00
arc_base_baud = 33333333 ; /* Fixed 33MHz clk (AXS10x) */
2014-10-28 12:34:05 +03:00
else
arc_base_baud = core_clk ;
}
# 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 ;
2014-06-23 10:12:44 +04:00
const void * clk ;
2014-04-02 08:49:03 +04:00
int len ;
2013-01-22 15:30:52 +04:00
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 ( ) ;
2013-01-18 13:42:20 +04:00
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 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
}