diff options
author | Rich Felker <dalias@libc.org> | 2016-01-23 00:45:41 +0000 |
---|---|---|
committer | Rich Felker <dalias@libc.org> | 2016-03-17 19:46:11 +0000 |
commit | 7480e0aabd5f9e6c3e3b72ed206e89284e90f11f (patch) | |
tree | afcdb346dbec13ea4be79f062e9f849caedceaae /arch/sh/kernel/setup.c | |
parent | 45624ac38926c8c2f1a63b4a39e7b1997743e1b3 (diff) | |
download | lwn-7480e0aabd5f9e6c3e3b72ed206e89284e90f11f.tar.gz lwn-7480e0aabd5f9e6c3e3b72ed206e89284e90f11f.zip |
sh: add device tree support and generic board using device tree
Add a new pseudo-board, within the existing SH boards/machine-vectors
framework, which does not represent any actual hardware but instead
requires all hardware to be described by the device tree blob provided
by the boot loader. Changes made are thus non-invasive and do not risk
breaking support for legacy boards.
New hardware, including the open-hardware J2 and associated SoC
devices, will use device free from the outset. Legacy SH boards can
transition to device tree once all their hardware has device tree
bindings, driver support for device tree, and a dts file for the
board.
It is intented that, once all boards are supported in the new
framework, the existing machine-vectors framework should be removed
and the new device tree setup code integrated directly.
Signed-off-by: Rich Felker <dalias@libc.org>
Diffstat (limited to 'arch/sh/kernel/setup.c')
-rw-r--r-- | arch/sh/kernel/setup.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/arch/sh/kernel/setup.c b/arch/sh/kernel/setup.c index de19cfa768f2..efb60ce720a7 100644 --- a/arch/sh/kernel/setup.c +++ b/arch/sh/kernel/setup.c @@ -29,6 +29,8 @@ #include <linux/delay.h> #include <linux/platform_device.h> #include <linux/memblock.h> +#include <linux/of.h> +#include <linux/of_fdt.h> #include <asm/uaccess.h> #include <asm/io.h> #include <asm/page.h> @@ -172,6 +174,7 @@ disable: #endif } +#ifndef CONFIG_GENERIC_CALIBRATE_DELAY void calibrate_delay(void) { struct clk *clk = clk_get(NULL, "cpu_clk"); @@ -187,6 +190,7 @@ void calibrate_delay(void) (loops_per_jiffy/(5000/HZ)) % 100, loops_per_jiffy); } +#endif void __init __add_active_range(unsigned int nid, unsigned long start_pfn, unsigned long end_pfn) @@ -238,6 +242,29 @@ void __init __weak plat_early_device_setup(void) { } +#ifdef CONFIG_OF +void __ref sh_fdt_init(phys_addr_t dt_phys) +{ + static int done = 0; + void *dt_virt; + + /* Avoid calling an __init function on secondary cpus. */ + if (done) return; + + dt_virt = phys_to_virt(dt_phys); + + if (!dt_virt || !early_init_dt_scan(dt_virt)) { + pr_crit("Error: invalid device tree blob" + " at physical address %p\n", (void *)dt_phys); + + while (true) + cpu_relax(); + } + + done = 1; +} +#endif + void __init setup_arch(char **cmdline_p) { enable_mmu(); |