|  | /* | 
|  | * 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> | 
|  | #include <asm/clk.h> | 
|  | #include <asm/mach_desc.h> | 
|  |  | 
|  | 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; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * 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. | 
|  | */ | 
|  | const struct machine_desc * __init setup_machine_fdt(void *dt) | 
|  | { | 
|  | const struct machine_desc *mdesc; | 
|  | unsigned long dt_root; | 
|  | void *clk; | 
|  | unsigned long len; | 
|  |  | 
|  | if (!early_init_dt_scan(dt)) | 
|  | return NULL; | 
|  |  | 
|  | mdesc = of_flat_dt_match_machine(NULL, arch_get_next_mach); | 
|  | if (!mdesc) | 
|  | machine_halt(); | 
|  |  | 
|  | dt_root = of_get_flat_dt_root(); | 
|  | clk = of_get_flat_dt_prop(dt_root, "clock-frequency", &len); | 
|  | if (clk) | 
|  | arc_set_core_freq(of_read_ulong(clk, len/4)); | 
|  |  | 
|  | return mdesc; | 
|  | } |