linux/arch/arc/kernel/devtree.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2012 Synopsys, Inc. (www.synopsys.com)
   3 *
   4 * Based on reduced version of METAG
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License version 2 as
   8 * published by the Free Software Foundation.
   9 */
  10
  11
  12#include <linux/init.h>
  13#include <linux/reboot.h>
  14#include <linux/memblock.h>
  15#include <linux/of.h>
  16#include <linux/of_fdt.h>
  17#include <asm/clk.h>
  18#include <asm/mach_desc.h>
  19
  20#ifdef CONFIG_SERIAL_EARLYCON
  21
  22static unsigned int __initdata arc_base_baud;
  23
  24unsigned int __init arc_early_base_baud(void)
  25{
  26        return arc_base_baud/16;
  27}
  28
  29static void __init arc_set_early_base_baud(unsigned long dt_root)
  30{
  31        unsigned int core_clk = arc_get_core_freq();
  32
  33        if (of_flat_dt_is_compatible(dt_root, "abilis,arc-tb10x"))
  34                arc_base_baud = core_clk/3;
  35        else if (of_flat_dt_is_compatible(dt_root, "snps,arc-sdp"))
  36                arc_base_baud = 33333333;       /* Fixed 33MHz clk (AXS10x) */
  37        else
  38                arc_base_baud = core_clk;
  39}
  40#else
  41#define arc_set_early_base_baud(dt_root)
  42#endif
  43
  44static const void * __init arch_get_next_mach(const char *const **match)
  45{
  46        static const struct machine_desc *mdesc = __arch_info_begin;
  47        const struct machine_desc *m = mdesc;
  48
  49        if (m >= __arch_info_end)
  50                return NULL;
  51
  52        mdesc++;
  53        *match = m->dt_compat;
  54        return m;
  55}
  56
  57/**
  58 * setup_machine_fdt - Machine setup when an dtb was passed to the kernel
  59 * @dt:         virtual address pointer to dt blob
  60 *
  61 * If a dtb was passed to the kernel, then use it to choose the correct
  62 * machine_desc and to setup the system.
  63 */
  64const struct machine_desc * __init setup_machine_fdt(void *dt)
  65{
  66        const struct machine_desc *mdesc;
  67        unsigned long dt_root;
  68        const void *clk;
  69        int len;
  70
  71        if (!early_init_dt_scan(dt))
  72                return NULL;
  73
  74        mdesc = of_flat_dt_match_machine(NULL, arch_get_next_mach);
  75        if (!mdesc)
  76                machine_halt();
  77
  78        dt_root = of_get_flat_dt_root();
  79        clk = of_get_flat_dt_prop(dt_root, "clock-frequency", &len);
  80        if (clk)
  81                arc_set_core_freq(of_read_ulong(clk, len/4));
  82
  83        arc_set_early_base_baud(dt_root);
  84
  85        return mdesc;
  86}
  87