summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2018-10-26 15:09:58 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2018-10-26 15:09:58 -0400
commitb27186abb37b7bd19e0ca434f4f425c807dbd708 (patch)
tree8f20702cf0744cc66907d3b8578a8083cd25d680
parent0ef7791e2bfb2e10aa95dc492eab72074cef9942 (diff)
parentd061864b89c3234b53d8884027b0cd6f06bd3149 (diff)
Merge tag 'devicetree-for-4.20' of git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux
Pull Devicetree updates from Rob Herring: "A bit bigger than normal as I've been busy this cycle. There's a few things with dependencies and a few things subsystem maintainers didn't pick up, so I'm taking them thru my tree. The fixes from Johan didn't get into linux-next, but they've been waiting for some time now and they are what's left of what subsystem maintainers didn't pick up. Summary: - Sync dtc with upstream version v1.4.7-14-gc86da84d30e4 - Work to get rid of direct accesses to struct device_node name and type pointers in preparation for removing them. New helpers for parsing DT cpu nodes and conversions to use the helpers. printk conversions to %pOFn for printing DT node names. Most went thru subystem trees, so this is the remainder. - Fixes to DT child node lookups to actually be restricted to child nodes instead of treewide. - Refactoring of dtb targets out of arch code. This makes the support more uniform and enables building all dtbs on c6x, microblaze, and powerpc. - Various DT binding updates for Renesas r8a7744 SoC - Vendor prefixes for Facebook, OLPC - Restructuring of some ARM binding docs moving some peripheral bindings out of board/SoC binding files - New "secure-chosen" binding for secure world settings on ARM - Dual licensing of 2 DT IRQ binding headers" * tag 'devicetree-for-4.20' of git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux: (78 commits) ARM: dt: relicense two DT binding IRQ headers power: supply: twl4030-charger: fix OF sibling-node lookup NFC: nfcmrvl_uart: fix OF child-node lookup net: stmmac: dwmac-sun8i: fix OF child-node lookup net: bcmgenet: fix OF child-node lookup drm/msm: fix OF child-node lookup drm/mediatek: fix OF sibling-node lookup of: Add missing exports of node name compare functions dt-bindings: Add OLPC vendor prefix dt-bindings: misc: bk4: Add device tree binding for Liebherr's BK4 SPI bus dt-bindings: thermal: samsung: Add SPDX license identifier dt-bindings: clock: samsung: Add SPDX license identifiers dt-bindings: timer: ostm: Add R7S9210 support dt-bindings: phy: rcar-gen2: Add r8a7744 support dt-bindings: can: rcar_can: Add r8a7744 support dt-bindings: timer: renesas, cmt: Document r8a7744 CMT support dt-bindings: watchdog: renesas-wdt: Document r8a7744 support dt-bindings: thermal: rcar: Add device tree support for r8a7744 Documentation: dt: Add binding for /secure-chosen/stdout-path dt-bindings: arm: zte: Move sysctrl bindings to their own doc ...
-rw-r--r--Documentation/devicetree/bindings/arm/al,alpine.txt72
-rw-r--r--Documentation/devicetree/bindings/arm/atmel-at91.txt170
-rw-r--r--Documentation/devicetree/bindings/arm/atmel-sysregs.txt171
-rw-r--r--Documentation/devicetree/bindings/arm/cpu-enable-method/al,alpine-smp34
-rw-r--r--Documentation/devicetree/bindings/arm/cpus.txt4
-rw-r--r--Documentation/devicetree/bindings/arm/freescale/fsl,layerscape-dcfg.txt19
-rw-r--r--Documentation/devicetree/bindings/arm/freescale/fsl,layerscape-scfg.txt19
-rw-r--r--Documentation/devicetree/bindings/arm/fsl.txt39
-rw-r--r--Documentation/devicetree/bindings/arm/secure.txt19
-rw-r--r--Documentation/devicetree/bindings/arm/zte,sysctrl.txt30
-rw-r--r--Documentation/devicetree/bindings/arm/zte.txt27
-rw-r--r--Documentation/devicetree/bindings/crypto/hisilicon,hip07-sec.txt2
-rw-r--r--Documentation/devicetree/bindings/fpga/fpga-region.txt4
-rw-r--r--Documentation/devicetree/bindings/i2c/i2c.txt2
-rw-r--r--Documentation/devicetree/bindings/mfd/arizona.txt2
-rw-r--r--Documentation/devicetree/bindings/misc/lwn-bk4.txt26
-rw-r--r--Documentation/devicetree/bindings/net/can/rcar_can.txt1
-rw-r--r--Documentation/devicetree/bindings/phy/rcar-gen2-phy.txt1
-rw-r--r--Documentation/devicetree/bindings/reset/fsl,imx7-src.txt2
-rw-r--r--Documentation/devicetree/bindings/timer/renesas,cmt.txt2
-rw-r--r--Documentation/devicetree/bindings/timer/renesas,ostm.txt3
-rw-r--r--Documentation/devicetree/bindings/vendor-prefixes.txt2
-rw-r--r--Documentation/devicetree/bindings/watchdog/renesas-wdt.txt1
-rw-r--r--Makefile37
-rw-r--r--arch/arc/Makefile6
-rw-r--r--arch/arm/Makefile20
-rw-r--r--arch/arm/boot/compressed/libfdt_env.h2
-rw-r--r--arch/arm/kernel/devtree.c5
-rw-r--r--arch/arm/kernel/topology.c6
-rw-r--r--arch/arm/mach-shmobile/pm-rcar-gen2.c8
-rw-r--r--arch/arm/mach-shmobile/pm-rmobile.c2
-rw-r--r--arch/arm/mach-shmobile/timer.c10
-rw-r--r--arch/arm64/Makefile17
-rw-r--r--arch/arm64/kernel/smp.c2
-rw-r--r--arch/c6x/Makefile2
-rw-r--r--arch/c6x/boot/dts/Makefile17
-rw-r--r--arch/c6x/boot/dts/linked_dtb.S2
-rw-r--r--arch/c6x/include/asm/sections.h1
-rw-r--r--arch/c6x/kernel/setup.c15
-rw-r--r--arch/c6x/kernel/vmlinux.lds.S10
-rw-r--r--arch/h8300/Makefile11
-rw-r--r--arch/microblaze/Makefile4
-rw-r--r--arch/microblaze/boot/dts/Makefile4
-rw-r--r--arch/microblaze/kernel/cpu/cpuinfo.c6
-rw-r--r--arch/mips/Makefile15
-rw-r--r--arch/nds32/Makefile2
-rw-r--r--arch/nios2/Makefile11
-rw-r--r--arch/nios2/boot/Makefile22
-rw-r--r--arch/nios2/boot/dts/Makefile6
-rw-r--r--arch/nios2/boot/linked_dtb.S19
-rw-r--r--arch/nios2/kernel/cpuinfo.c4
-rw-r--r--arch/nios2/kernel/time.c4
-rw-r--r--arch/openrisc/kernel/setup.c3
-rw-r--r--arch/powerpc/Makefile3
-rw-r--r--arch/powerpc/boot/Makefile55
-rw-r--r--arch/powerpc/boot/dts/Makefile6
-rw-r--r--arch/powerpc/boot/dts/fsl/Makefile4
-rw-r--r--arch/powerpc/boot/libfdt_env.h2
-rw-r--r--arch/powerpc/platforms/4xx/soc.c2
-rw-r--r--arch/powerpc/platforms/8xx/m8xx_setup.c5
-rw-r--r--arch/powerpc/platforms/powermac/feature.c51
-rw-r--r--arch/powerpc/platforms/powermac/setup.c15
-rw-r--r--arch/sh/boards/of-generic.c2
-rw-r--r--arch/sparc/include/asm/prom.h3
-rw-r--r--arch/x86/kernel/devicetree.c2
-rw-r--r--arch/xtensa/Makefile12
-rw-r--r--arch/xtensa/platforms/xtfpga/setup.c6
-rw-r--r--drivers/bus/fsl-mc/fsl-mc-bus.c6
-rw-r--r--drivers/bus/mvebu-mbus.c2
-rw-r--r--drivers/clk/mvebu/clk-cpu.c4
-rw-r--r--drivers/edac/cpc925_edac.c20
-rw-r--r--drivers/firmware/scpi_pm_domain.c2
-rw-r--r--drivers/gpu/drm/mediatek/mtk_hdmi.c5
-rw-r--r--drivers/gpu/drm/msm/adreno/adreno_gpu.c5
-rw-r--r--drivers/iommu/fsl_pamu.c2
-rw-r--r--drivers/net/ethernet/broadcom/genet/bcmmii.c2
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c12
-rw-r--r--drivers/nfc/nfcmrvl/uart.c5
-rw-r--r--drivers/of/base.c47
-rw-r--r--drivers/of/device.c5
-rw-r--r--drivers/of/of_mdio.c12
-rw-r--r--drivers/of/of_numa.c19
-rw-r--r--drivers/of/of_private.h8
-rw-r--r--drivers/of/overlay.c4
-rw-r--r--drivers/of/platform.c8
-rw-r--r--drivers/of/unittest-data/overlay_15.dts4
-rw-r--r--drivers/of/unittest-data/tests-overlay.dtsi4
-rw-r--r--drivers/of/unittest.c29
-rw-r--r--drivers/power/supply/twl4030_charger.c5
-rw-r--r--drivers/soc/dove/pmu.c8
-rw-r--r--drivers/soc/fsl/qe/qe_tdm.c4
-rw-r--r--drivers/soc/qcom/apr.c2
-rw-r--r--drivers/soc/rockchip/pm_domains.c44
-rw-r--r--drivers/soc/tegra/pmc.c12
-rw-r--r--drivers/soc/ti/knav_dma.c8
-rw-r--r--drivers/soc/ti/knav_qmss_queue.c8
-rw-r--r--drivers/video/fbdev/fsl-diu-fb.c2
-rw-r--r--include/dt-bindings/clock/exynos3250.h5
-rw-r--r--include/dt-bindings/clock/exynos4.h7
-rw-r--r--include/dt-bindings/clock/exynos5250.h7
-rw-r--r--include/dt-bindings/clock/exynos5260-clk.h7
-rw-r--r--include/dt-bindings/clock/exynos5410.h7
-rw-r--r--include/dt-bindings/clock/exynos5420.h7
-rw-r--r--include/dt-bindings/clock/exynos5433.h5
-rw-r--r--include/dt-bindings/clock/exynos7-clk.h7
-rw-r--r--include/dt-bindings/clock/s3c2410.h5
-rw-r--r--include/dt-bindings/clock/s3c2412.h5
-rw-r--r--include/dt-bindings/clock/s3c2443.h5
-rw-r--r--include/dt-bindings/interrupt-controller/arm-gic.h2
-rw-r--r--include/dt-bindings/interrupt-controller/irq.h2
-rw-r--r--include/dt-bindings/thermal/thermal_exynos.h12
-rw-r--r--include/linux/libfdt_env.h1
-rw-r--r--include/linux/of.h19
-rw-r--r--lib/vsprintf.c7
-rw-r--r--scripts/Makefile3
-rw-r--r--scripts/Makefile.lib2
-rw-r--r--scripts/dtc/Makefile9
-rw-r--r--scripts/dtc/Makefile.dtc4
-rw-r--r--scripts/dtc/checks.c143
-rw-r--r--scripts/dtc/data.c4
-rw-r--r--scripts/dtc/dtc-parser.y16
-rw-r--r--scripts/dtc/dtc.c11
-rw-r--r--scripts/dtc/dtc.h13
-rw-r--r--scripts/dtc/flattree.c2
-rw-r--r--scripts/dtc/libfdt/fdt.c81
-rw-r--r--scripts/dtc/libfdt/fdt_addresses.c35
-rw-r--r--scripts/dtc/libfdt/fdt_overlay.c6
-rw-r--r--scripts/dtc/libfdt/fdt_ro.c199
-rw-r--r--scripts/dtc/libfdt/fdt_rw.c28
-rw-r--r--scripts/dtc/libfdt/fdt_sw.c109
-rw-r--r--scripts/dtc/libfdt/libfdt.h76
-rw-r--r--scripts/dtc/libfdt/libfdt_env.h1
-rw-r--r--scripts/dtc/libfdt/libfdt_internal.h5
-rw-r--r--scripts/dtc/livetree.c12
-rw-r--r--scripts/dtc/treesource.c225
-rwxr-xr-xscripts/dtc/update-dtc-source.sh2
-rw-r--r--scripts/dtc/util.c23
-rw-r--r--scripts/dtc/util.h20
-rw-r--r--scripts/dtc/version_gen.h2
-rw-r--r--scripts/dtc/yamltree.c247
140 files changed, 1736 insertions, 1043 deletions
diff --git a/Documentation/devicetree/bindings/arm/al,alpine.txt b/Documentation/devicetree/bindings/arm/al,alpine.txt
index f404a4f9b165..d00debe2e86f 100644
--- a/Documentation/devicetree/bindings/arm/al,alpine.txt
+++ b/Documentation/devicetree/bindings/arm/al,alpine.txt
@@ -14,75 +14,3 @@ compatible: must contain "al,alpine"
14 14
15 ... 15 ...
16} 16}
17
18* CPU node:
19
20The Alpine platform includes cortex-a15 cores.
21enable-method: must be "al,alpine-smp" to allow smp [1]
22
23Example:
24
25cpus {
26 #address-cells = <1>;
27 #size-cells = <0>;
28 enable-method = "al,alpine-smp";
29
30 cpu@0 {
31 compatible = "arm,cortex-a15";
32 device_type = "cpu";
33 reg = <0>;
34 };
35
36 cpu@1 {
37 compatible = "arm,cortex-a15";
38 device_type = "cpu";
39 reg = <1>;
40 };
41
42 cpu@2 {
43 compatible = "arm,cortex-a15";
44 device_type = "cpu";
45 reg = <2>;
46 };
47
48 cpu@3 {
49 compatible = "arm,cortex-a15";
50 device_type = "cpu";
51 reg = <3>;
52 };
53};
54
55
56* Alpine CPU resume registers
57
58The CPU resume register are used to define required resume address after
59reset.
60
61Properties:
62- compatible : Should contain "al,alpine-cpu-resume".
63- reg : Offset and length of the register set for the device
64
65Example:
66
67cpu_resume {
68 compatible = "al,alpine-cpu-resume";
69 reg = <0xfbff5ed0 0x30>;
70};
71
72* Alpine System-Fabric Service Registers
73
74The System-Fabric Service Registers allow various operation on CPU and
75system fabric, like powering CPUs off.
76
77Properties:
78- compatible : Should contain "al,alpine-sysfabric-service" and "syscon".
79- reg : Offset and length of the register set for the device
80
81Example:
82
83nb_service {
84 compatible = "al,alpine-sysfabric-service", "syscon";
85 reg = <0xfb070000 0x10000>;
86};
87
88[1] arm/cpu-enable-method/al,alpine-smp
diff --git a/Documentation/devicetree/bindings/arm/atmel-at91.txt b/Documentation/devicetree/bindings/arm/atmel-at91.txt
index 31220b54d85d..4bf1b4da7659 100644
--- a/Documentation/devicetree/bindings/arm/atmel-at91.txt
+++ b/Documentation/devicetree/bindings/arm/atmel-at91.txt
@@ -70,173 +70,3 @@ compatible: must be one of:
70 - "atmel,samv71q19" 70 - "atmel,samv71q19"
71 - "atmel,samv71q20" 71 - "atmel,samv71q20"
72 - "atmel,samv71q21" 72 - "atmel,samv71q21"
73
74Chipid required properties:
75- compatible: Should be "atmel,sama5d2-chipid"
76- reg : Should contain registers location and length
77
78PIT Timer required properties:
79- compatible: Should be "atmel,at91sam9260-pit"
80- reg: Should contain registers location and length
81- interrupts: Should contain interrupt for the PIT which is the IRQ line
82 shared across all System Controller members.
83
84System Timer (ST) required properties:
85- compatible: Should be "atmel,at91rm9200-st", "syscon", "simple-mfd"
86- reg: Should contain registers location and length
87- interrupts: Should contain interrupt for the ST which is the IRQ line
88 shared across all System Controller members.
89- clocks: phandle to input clock.
90Its subnodes can be:
91- watchdog: compatible should be "atmel,at91rm9200-wdt"
92
93RSTC Reset Controller required properties:
94- compatible: Should be "atmel,<chip>-rstc".
95 <chip> can be "at91sam9260" or "at91sam9g45" or "sama5d3"
96- reg: Should contain registers location and length
97- clocks: phandle to input clock.
98
99Example:
100
101 rstc@fffffd00 {
102 compatible = "atmel,at91sam9260-rstc";
103 reg = <0xfffffd00 0x10>;
104 clocks = <&clk32k>;
105 };
106
107RAMC SDRAM/DDR Controller required properties:
108- compatible: Should be "atmel,at91rm9200-sdramc", "syscon"
109 "atmel,at91sam9260-sdramc",
110 "atmel,at91sam9g45-ddramc",
111 "atmel,sama5d3-ddramc",
112- reg: Should contain registers location and length
113
114Examples:
115
116 ramc0: ramc@ffffe800 {
117 compatible = "atmel,at91sam9g45-ddramc";
118 reg = <0xffffe800 0x200>;
119 };
120
121SHDWC Shutdown Controller
122
123required properties:
124- compatible: Should be "atmel,<chip>-shdwc".
125 <chip> can be "at91sam9260", "at91sam9rl" or "at91sam9x5".
126- reg: Should contain registers location and length
127- clocks: phandle to input clock.
128
129optional properties:
130- atmel,wakeup-mode: String, operation mode of the wakeup mode.
131 Supported values are: "none", "high", "low", "any".
132- atmel,wakeup-counter: Counter on Wake-up 0 (between 0x0 and 0xf).
133
134optional at91sam9260 properties:
135- atmel,wakeup-rtt-timer: boolean to enable Real-time Timer Wake-up.
136
137optional at91sam9rl properties:
138- atmel,wakeup-rtc-timer: boolean to enable Real-time Clock Wake-up.
139- atmel,wakeup-rtt-timer: boolean to enable Real-time Timer Wake-up.
140
141optional at91sam9x5 properties:
142- atmel,wakeup-rtc-timer: boolean to enable Real-time Clock Wake-up.
143
144Example:
145
146 shdwc@fffffd10 {
147 compatible = "atmel,at91sam9260-shdwc";
148 reg = <0xfffffd10 0x10>;
149 clocks = <&clk32k>;
150 };
151
152SHDWC SAMA5D2-Compatible Shutdown Controller
153
1541) shdwc node
155
156required properties:
157- compatible: should be "atmel,sama5d2-shdwc".
158- reg: should contain registers location and length
159- clocks: phandle to input clock.
160- #address-cells: should be one. The cell is the wake-up input index.
161- #size-cells: should be zero.
162
163optional properties:
164
165- debounce-delay-us: minimum wake-up inputs debouncer period in
166 microseconds. It's usually a board-related property.
167- atmel,wakeup-rtc-timer: boolean to enable Real-Time Clock wake-up.
168
169The node contains child nodes for each wake-up input that the platform uses.
170
1712) input nodes
172
173Wake-up input nodes are usually described in the "board" part of the Device
174Tree. Note also that input 0 is linked to the wake-up pin and is frequently
175used.
176
177Required properties:
178- reg: should contain the wake-up input index [0 - 15].
179
180Optional properties:
181- atmel,wakeup-active-high: boolean, the corresponding wake-up input described
182 by the child, forces the wake-up of the core power supply on a high level.
183 The default is to be active low.
184
185Example:
186
187On the SoC side:
188 shdwc@f8048010 {
189 compatible = "atmel,sama5d2-shdwc";
190 reg = <0xf8048010 0x10>;
191 clocks = <&clk32k>;
192 #address-cells = <1>;
193 #size-cells = <0>;
194 atmel,wakeup-rtc-timer;
195 };
196
197On the board side:
198 shdwc@f8048010 {
199 debounce-delay-us = <976>;
200
201 input@0 {
202 reg = <0>;
203 };
204
205 input@1 {
206 reg = <1>;
207 atmel,wakeup-active-high;
208 };
209 };
210
211Special Function Registers (SFR)
212
213Special Function Registers (SFR) manage specific aspects of the integrated
214memory, bridge implementations, processor and other functionality not controlled
215elsewhere.
216
217required properties:
218- compatible: Should be "atmel,<chip>-sfr", "syscon" or
219 "atmel,<chip>-sfrbu", "syscon"
220 <chip> can be "sama5d3", "sama5d4" or "sama5d2".
221- reg: Should contain registers location and length
222
223 sfr@f0038000 {
224 compatible = "atmel,sama5d3-sfr", "syscon";
225 reg = <0xf0038000 0x60>;
226 };
227
228Security Module (SECUMOD)
229
230The Security Module macrocell provides all necessary secure functions to avoid
231voltage, temperature, frequency and mechanical attacks on the chip. It also
232embeds secure memories that can be scrambled
233
234required properties:
235- compatible: Should be "atmel,<chip>-secumod", "syscon".
236 <chip> can be "sama5d2".
237- reg: Should contain registers location and length
238
239 secumod@fc040000 {
240 compatible = "atmel,sama5d2-secumod", "syscon";
241 reg = <0xfc040000 0x100>;
242 };
diff --git a/Documentation/devicetree/bindings/arm/atmel-sysregs.txt b/Documentation/devicetree/bindings/arm/atmel-sysregs.txt
new file mode 100644
index 000000000000..4b96608ad692
--- /dev/null
+++ b/Documentation/devicetree/bindings/arm/atmel-sysregs.txt
@@ -0,0 +1,171 @@
1Atmel system registers
2
3Chipid required properties:
4- compatible: Should be "atmel,sama5d2-chipid"
5- reg : Should contain registers location and length
6
7PIT Timer required properties:
8- compatible: Should be "atmel,at91sam9260-pit"
9- reg: Should contain registers location and length
10- interrupts: Should contain interrupt for the PIT which is the IRQ line
11 shared across all System Controller members.
12
13System Timer (ST) required properties:
14- compatible: Should be "atmel,at91rm9200-st", "syscon", "simple-mfd"
15- reg: Should contain registers location and length
16- interrupts: Should contain interrupt for the ST which is the IRQ line
17 shared across all System Controller members.
18- clocks: phandle to input clock.
19Its subnodes can be:
20- watchdog: compatible should be "atmel,at91rm9200-wdt"
21
22RSTC Reset Controller required properties:
23- compatible: Should be "atmel,<chip>-rstc".
24 <chip> can be "at91sam9260" or "at91sam9g45" or "sama5d3"
25- reg: Should contain registers location and length
26- clocks: phandle to input clock.
27
28Example:
29
30 rstc@fffffd00 {
31 compatible = "atmel,at91sam9260-rstc";
32 reg = <0xfffffd00 0x10>;
33 clocks = <&clk32k>;
34 };
35
36RAMC SDRAM/DDR Controller required properties:
37- compatible: Should be "atmel,at91rm9200-sdramc", "syscon"
38 "atmel,at91sam9260-sdramc",
39 "atmel,at91sam9g45-ddramc",
40 "atmel,sama5d3-ddramc",
41- reg: Should contain registers location and length
42
43Examples:
44
45 ramc0: ramc@ffffe800 {
46 compatible = "atmel,at91sam9g45-ddramc";
47 reg = <0xffffe800 0x200>;
48 };
49
50SHDWC Shutdown Controller
51
52required properties:
53- compatible: Should be "atmel,<chip>-shdwc".
54 <chip> can be "at91sam9260", "at91sam9rl" or "at91sam9x5".
55- reg: Should contain registers location and length
56- clocks: phandle to input clock.
57
58optional properties:
59- atmel,wakeup-mode: String, operation mode of the wakeup mode.
60 Supported values are: "none", "high", "low", "any".
61- atmel,wakeup-counter: Counter on Wake-up 0 (between 0x0 and 0xf).
62
63optional at91sam9260 properties:
64- atmel,wakeup-rtt-timer: boolean to enable Real-time Timer Wake-up.
65
66optional at91sam9rl properties:
67- atmel,wakeup-rtc-timer: boolean to enable Real-time Clock Wake-up.
68- atmel,wakeup-rtt-timer: boolean to enable Real-time Timer Wake-up.
69
70optional at91sam9x5 properties:
71- atmel,wakeup-rtc-timer: boolean to enable Real-time Clock Wake-up.
72
73Example:
74
75 shdwc@fffffd10 {
76 compatible = "atmel,at91sam9260-shdwc";
77 reg = <0xfffffd10 0x10>;
78 clocks = <&clk32k>;
79 };
80
81SHDWC SAMA5D2-Compatible Shutdown Controller
82
831) shdwc node
84
85required properties:
86- compatible: should be "atmel,sama5d2-shdwc".
87- reg: should contain registers location and length
88- clocks: phandle to input clock.
89- #address-cells: should be one. The cell is the wake-up input index.
90- #size-cells: should be zero.
91
92optional properties:
93
94- debounce-delay-us: minimum wake-up inputs debouncer period in
95 microseconds. It's usually a board-related property.
96- atmel,wakeup-rtc-timer: boolean to enable Real-Time Clock wake-up.
97
98The node contains child nodes for each wake-up input that the platform uses.
99
1002) input nodes
101
102Wake-up input nodes are usually described in the "board" part of the Device
103Tree. Note also that input 0 is linked to the wake-up pin and is frequently
104used.
105
106Required properties:
107- reg: should contain the wake-up input index [0 - 15].
108
109Optional properties:
110- atmel,wakeup-active-high: boolean, the corresponding wake-up input described
111 by the child, forces the wake-up of the core power supply on a high level.
112 The default is to be active low.
113
114Example:
115
116On the SoC side:
117 shdwc@f8048010 {
118 compatible = "atmel,sama5d2-shdwc";
119 reg = <0xf8048010 0x10>;
120 clocks = <&clk32k>;
121 #address-cells = <1>;
122 #size-cells = <0>;
123 atmel,wakeup-rtc-timer;
124 };
125
126On the board side:
127 shdwc@f8048010 {
128 debounce-delay-us = <976>;
129
130 input@0 {
131 reg = <0>;
132 };
133
134 input@1 {
135 reg = <1>;
136 atmel,wakeup-active-high;
137 };
138 };
139
140Special Function Registers (SFR)
141
142Special Function Registers (SFR) manage specific aspects of the integrated
143memory, bridge implementations, processor and other functionality not controlled
144elsewhere.
145
146required properties:
147- compatible: Should be "atmel,<chip>-sfr", "syscon" or
148 "atmel,<chip>-sfrbu", "syscon"
149 <chip> can be "sama5d3", "sama5d4" or "sama5d2".
150- reg: Should contain registers location and length
151
152 sfr@f0038000 {
153 compatible = "atmel,sama5d3-sfr", "syscon";
154 reg = <0xf0038000 0x60>;
155 };
156
157Security Module (SECUMOD)
158
159The Security Module macrocell provides all necessary secure functions to avoid
160voltage, temperature, frequency and mechanical attacks on the chip. It also
161embeds secure memories that can be scrambled
162
163required properties:
164- compatible: Should be "atmel,<chip>-secumod", "syscon".
165 <chip> can be "sama5d2".
166- reg: Should contain registers location and length
167
168 secumod@fc040000 {
169 compatible = "atmel,sama5d2-secumod", "syscon";
170 reg = <0xfc040000 0x100>;
171 };
diff --git a/Documentation/devicetree/bindings/arm/cpu-enable-method/al,alpine-smp b/Documentation/devicetree/bindings/arm/cpu-enable-method/al,alpine-smp
index c2e0cc5e4cfd..35e5afb6d9ad 100644
--- a/Documentation/devicetree/bindings/arm/cpu-enable-method/al,alpine-smp
+++ b/Documentation/devicetree/bindings/arm/cpu-enable-method/al,alpine-smp
@@ -14,7 +14,28 @@ Related properties: (none)
14 14
15Note: 15Note:
16This enable method requires valid nodes compatible with 16This enable method requires valid nodes compatible with
17"al,alpine-cpu-resume" and "al,alpine-nb-service"[1]. 17"al,alpine-cpu-resume" and "al,alpine-nb-service".
18
19
20* Alpine CPU resume registers
21
22The CPU resume register are used to define required resume address after
23reset.
24
25Properties:
26- compatible : Should contain "al,alpine-cpu-resume".
27- reg : Offset and length of the register set for the device
28
29
30* Alpine System-Fabric Service Registers
31
32The System-Fabric Service Registers allow various operation on CPU and
33system fabric, like powering CPUs off.
34
35Properties:
36- compatible : Should contain "al,alpine-sysfabric-service" and "syscon".
37- reg : Offset and length of the register set for the device
38
18 39
19Example: 40Example:
20 41
@@ -48,5 +69,12 @@ cpus {
48 }; 69 };
49}; 70};
50 71
51-- 72cpu_resume {
52[1] arm/al,alpine.txt 73 compatible = "al,alpine-cpu-resume";
74 reg = <0xfbff5ed0 0x30>;
75};
76
77nb_service {
78 compatible = "al,alpine-sysfabric-service", "syscon";
79 reg = <0xfb070000 0x10000>;
80};
diff --git a/Documentation/devicetree/bindings/arm/cpus.txt b/Documentation/devicetree/bindings/arm/cpus.txt
index 96dfccc0faa8..b0198a1cf403 100644
--- a/Documentation/devicetree/bindings/arm/cpus.txt
+++ b/Documentation/devicetree/bindings/arm/cpus.txt
@@ -276,7 +276,7 @@ described below.
276 Usage: optional 276 Usage: optional
277 Value type: <prop-encoded-array> 277 Value type: <prop-encoded-array>
278 Definition: A u32 value that represents the running time dynamic 278 Definition: A u32 value that represents the running time dynamic
279 power coefficient in units of mW/MHz/uV^2. The 279 power coefficient in units of uW/MHz/V^2. The
280 coefficient can either be calculated from power 280 coefficient can either be calculated from power
281 measurements or derived by analysis. 281 measurements or derived by analysis.
282 282
@@ -287,7 +287,7 @@ described below.
287 287
288 Pdyn = dynamic-power-coefficient * V^2 * f 288 Pdyn = dynamic-power-coefficient * V^2 * f
289 289
290 where voltage is in uV, frequency is in MHz. 290 where voltage is in V, frequency is in MHz.
291 291
292Example 1 (dual-cluster big.LITTLE system 32-bit): 292Example 1 (dual-cluster big.LITTLE system 32-bit):
293 293
diff --git a/Documentation/devicetree/bindings/arm/freescale/fsl,layerscape-dcfg.txt b/Documentation/devicetree/bindings/arm/freescale/fsl,layerscape-dcfg.txt
new file mode 100644
index 000000000000..b5cb374dc47d
--- /dev/null
+++ b/Documentation/devicetree/bindings/arm/freescale/fsl,layerscape-dcfg.txt
@@ -0,0 +1,19 @@
1Freescale DCFG
2
3DCFG is the device configuration unit, that provides general purpose
4configuration and status for the device. Such as setting the secondary
5core start address and release the secondary core from holdoff and startup.
6
7Required properties:
8 - compatible: Should contain a chip-specific compatible string,
9 Chip-specific strings are of the form "fsl,<chip>-dcfg",
10 The following <chip>s are known to be supported:
11 ls1012a, ls1021a, ls1043a, ls1046a, ls2080a.
12
13 - reg : should contain base address and length of DCFG memory-mapped registers
14
15Example:
16 dcfg: dcfg@1ee0000 {
17 compatible = "fsl,ls1021a-dcfg";
18 reg = <0x0 0x1ee0000 0x0 0x10000>;
19 };
diff --git a/Documentation/devicetree/bindings/arm/freescale/fsl,layerscape-scfg.txt b/Documentation/devicetree/bindings/arm/freescale/fsl,layerscape-scfg.txt
new file mode 100644
index 000000000000..0ab67b0b216d
--- /dev/null
+++ b/Documentation/devicetree/bindings/arm/freescale/fsl,layerscape-scfg.txt
@@ -0,0 +1,19 @@
1Freescale SCFG
2
3SCFG is the supplemental configuration unit, that provides SoC specific
4configuration and status registers for the chip. Such as getting PEX port
5status.
6
7Required properties:
8 - compatible: Should contain a chip-specific compatible string,
9 Chip-specific strings are of the form "fsl,<chip>-scfg",
10 The following <chip>s are known to be supported:
11 ls1012a, ls1021a, ls1043a, ls1046a, ls2080a.
12
13 - reg: should contain base address and length of SCFG memory-mapped registers
14
15Example:
16 scfg: scfg@1570000 {
17 compatible = "fsl,ls1021a-scfg";
18 reg = <0x0 0x1570000 0x0 0x10000>;
19 };
diff --git a/Documentation/devicetree/bindings/arm/fsl.txt b/Documentation/devicetree/bindings/arm/fsl.txt
index 8a1baa2b9723..1e775aaa5c5b 100644
--- a/Documentation/devicetree/bindings/arm/fsl.txt
+++ b/Documentation/devicetree/bindings/arm/fsl.txt
@@ -101,45 +101,6 @@ Freescale LS1021A Platform Device Tree Bindings
101Required root node compatible properties: 101Required root node compatible properties:
102 - compatible = "fsl,ls1021a"; 102 - compatible = "fsl,ls1021a";
103 103
104Freescale SoC-specific Device Tree Bindings
105-------------------------------------------
106
107Freescale SCFG
108 SCFG is the supplemental configuration unit, that provides SoC specific
109configuration and status registers for the chip. Such as getting PEX port
110status.
111 Required properties:
112 - compatible: Should contain a chip-specific compatible string,
113 Chip-specific strings are of the form "fsl,<chip>-scfg",
114 The following <chip>s are known to be supported:
115 ls1012a, ls1021a, ls1043a, ls1046a, ls2080a.
116
117 - reg: should contain base address and length of SCFG memory-mapped registers
118
119Example:
120 scfg: scfg@1570000 {
121 compatible = "fsl,ls1021a-scfg";
122 reg = <0x0 0x1570000 0x0 0x10000>;
123 };
124
125Freescale DCFG
126 DCFG is the device configuration unit, that provides general purpose
127configuration and status for the device. Such as setting the secondary
128core start address and release the secondary core from holdoff and startup.
129 Required properties:
130 - compatible: Should contain a chip-specific compatible string,
131 Chip-specific strings are of the form "fsl,<chip>-dcfg",
132 The following <chip>s are known to be supported:
133 ls1012a, ls1021a, ls1043a, ls1046a, ls2080a.
134
135 - reg : should contain base address and length of DCFG memory-mapped registers
136
137Example:
138 dcfg: dcfg@1ee0000 {
139 compatible = "fsl,ls1021a-dcfg";
140 reg = <0x0 0x1ee0000 0x0 0x10000>;
141 };
142
143Freescale ARMv8 based Layerscape SoC family Device Tree Bindings 104Freescale ARMv8 based Layerscape SoC family Device Tree Bindings
144---------------------------------------------------------------- 105----------------------------------------------------------------
145 106
diff --git a/Documentation/devicetree/bindings/arm/secure.txt b/Documentation/devicetree/bindings/arm/secure.txt
index e31303fb233a..f27bbff2c780 100644
--- a/Documentation/devicetree/bindings/arm/secure.txt
+++ b/Documentation/devicetree/bindings/arm/secure.txt
@@ -32,7 +32,8 @@ describe the view of Secure world using the standard bindings. These
32secure- bindings only need to be used where both the Secure and Normal 32secure- bindings only need to be used where both the Secure and Normal
33world views need to be described in a single device tree. 33world views need to be described in a single device tree.
34 34
35Valid Secure world properties: 35Valid Secure world properties
36-----------------------------
36 37
37- secure-status : specifies whether the device is present and usable 38- secure-status : specifies whether the device is present and usable
38 in the secure world. The combination of this with "status" allows 39 in the secure world. The combination of this with "status" allows
@@ -51,3 +52,19 @@ Valid Secure world properties:
51 status = "disabled"; secure-status = "okay"; /* S-only */ 52 status = "disabled"; secure-status = "okay"; /* S-only */
52 status = "disabled"; /* disabled in both */ 53 status = "disabled"; /* disabled in both */
53 status = "disabled"; secure-status = "disabled"; /* disabled in both */ 54 status = "disabled"; secure-status = "disabled"; /* disabled in both */
55
56The secure-chosen node
57----------------------
58
59Similar to the /chosen node which serves as a place for passing data
60between firmware and the operating system, the /secure-chosen node may
61be used to pass data to the Secure OS. Only the properties defined
62below may appear in the /secure-chosen node.
63
64- stdout-path : specifies the device to be used by the Secure OS for
65 its console output. The syntax is the same as for /chosen/stdout-path.
66 If the /secure-chosen node exists but the stdout-path property is not
67 present, the Secure OS should not perform any console output. If
68 /secure-chosen does not exist, the Secure OS should use the value of
69 /chosen/stdout-path instead (that is, use the same device as the
70 Normal world OS).
diff --git a/Documentation/devicetree/bindings/arm/zte,sysctrl.txt b/Documentation/devicetree/bindings/arm/zte,sysctrl.txt
new file mode 100644
index 000000000000..7e66b7f7ba96
--- /dev/null
+++ b/Documentation/devicetree/bindings/arm/zte,sysctrl.txt
@@ -0,0 +1,30 @@
1ZTE sysctrl Registers
2
3Registers for 'zte,zx296702' SoC:
4
5System management required properties:
6 - compatible = "zte,sysctrl"
7
8Low power management required properties:
9 - compatible = "zte,zx296702-pcu"
10
11Bus matrix required properties:
12 - compatible = "zte,zx-bus-matrix"
13
14
15Registers for 'zte,zx296718' SoC:
16
17System management required properties:
18 - compatible = "zte,zx296718-aon-sysctrl"
19 - compatible = "zte,zx296718-sysctrl"
20
21Example:
22aon_sysctrl: aon-sysctrl@116000 {
23 compatible = "zte,zx296718-aon-sysctrl", "syscon";
24 reg = <0x116000 0x1000>;
25};
26
27sysctrl: sysctrl@1463000 {
28 compatible = "zte,zx296718-sysctrl", "syscon";
29 reg = <0x1463000 0x1000>;
30};
diff --git a/Documentation/devicetree/bindings/arm/zte.txt b/Documentation/devicetree/bindings/arm/zte.txt
index 83369785d29c..340612794a37 100644
--- a/Documentation/devicetree/bindings/arm/zte.txt
+++ b/Documentation/devicetree/bindings/arm/zte.txt
@@ -1,20 +1,10 @@
1ZTE platforms device tree bindings 1ZTE platforms device tree bindings
2---------------------------------------
3 2
3---------------------------------------
4- ZX296702 board: 4- ZX296702 board:
5 Required root node properties: 5 Required root node properties:
6 - compatible = "zte,zx296702-ad1", "zte,zx296702" 6 - compatible = "zte,zx296702-ad1", "zte,zx296702"
7 7
8System management required properties:
9 - compatible = "zte,sysctrl"
10
11Low power management required properties:
12 - compatible = "zte,zx296702-pcu"
13
14Bus matrix required properties:
15 - compatible = "zte,zx-bus-matrix"
16
17
18--------------------------------------- 8---------------------------------------
19- ZX296718 SoC: 9- ZX296718 SoC:
20 Required root node properties: 10 Required root node properties:
@@ -22,18 +12,3 @@ Bus matrix required properties:
22 12
23ZX296718 EVB board: 13ZX296718 EVB board:
24 - "zte,zx296718-evb" 14 - "zte,zx296718-evb"
25
26System management required properties:
27 - compatible = "zte,zx296718-aon-sysctrl"
28 - compatible = "zte,zx296718-sysctrl"
29
30Example:
31aon_sysctrl: aon-sysctrl@116000 {
32 compatible = "zte,zx296718-aon-sysctrl", "syscon";
33 reg = <0x116000 0x1000>;
34};
35
36sysctrl: sysctrl@1463000 {
37 compatible = "zte,zx296718-sysctrl", "syscon";
38 reg = <0x1463000 0x1000>;
39};
diff --git a/Documentation/devicetree/bindings/crypto/hisilicon,hip07-sec.txt b/Documentation/devicetree/bindings/crypto/hisilicon,hip07-sec.txt
index 78d2db9d4de5..d28fd1af01b4 100644
--- a/Documentation/devicetree/bindings/crypto/hisilicon,hip07-sec.txt
+++ b/Documentation/devicetree/bindings/crypto/hisilicon,hip07-sec.txt
@@ -24,7 +24,7 @@ Optional properties:
24 24
25Example: 25Example:
26 26
27p1_sec_a: crypto@400,d2000000 { 27p1_sec_a: crypto@400d2000000 {
28 compatible = "hisilicon,hip07-sec"; 28 compatible = "hisilicon,hip07-sec";
29 reg = <0x400 0xd0000000 0x0 0x10000 29 reg = <0x400 0xd0000000 0x0 0x10000
30 0x400 0xd2000000 0x0 0x10000 30 0x400 0xd2000000 0x0 0x10000
diff --git a/Documentation/devicetree/bindings/fpga/fpga-region.txt b/Documentation/devicetree/bindings/fpga/fpga-region.txt
index 6db8aeda461a..90c44694a30b 100644
--- a/Documentation/devicetree/bindings/fpga/fpga-region.txt
+++ b/Documentation/devicetree/bindings/fpga/fpga-region.txt
@@ -415,7 +415,7 @@ DT Overlay contains:
415 firmware-name = "base.rbf"; 415 firmware-name = "base.rbf";
416 416
417 fpga-bridge@4400 { 417 fpga-bridge@4400 {
418 compatible = "altr,freeze-bridge"; 418 compatible = "altr,freeze-bridge-controller";
419 reg = <0x4400 0x10>; 419 reg = <0x4400 0x10>;
420 420
421 fpga_region1: fpga-region1 { 421 fpga_region1: fpga-region1 {
@@ -427,7 +427,7 @@ DT Overlay contains:
427 }; 427 };
428 428
429 fpga-bridge@4420 { 429 fpga-bridge@4420 {
430 compatible = "altr,freeze-bridge"; 430 compatible = "altr,freeze-bridge-controller";
431 reg = <0x4420 0x10>; 431 reg = <0x4420 0x10>;
432 432
433 fpga_region2: fpga-region2 { 433 fpga_region2: fpga-region2 {
diff --git a/Documentation/devicetree/bindings/i2c/i2c.txt b/Documentation/devicetree/bindings/i2c/i2c.txt
index 11263982470e..44efafdfd7f5 100644
--- a/Documentation/devicetree/bindings/i2c/i2c.txt
+++ b/Documentation/devicetree/bindings/i2c/i2c.txt
@@ -84,7 +84,7 @@ Binding may contain optional "interrupts" property, describing interrupts
84used by the device. I2C core will assign "irq" interrupt (or the very first 84used by the device. I2C core will assign "irq" interrupt (or the very first
85interrupt if not using interrupt names) as primary interrupt for the slave. 85interrupt if not using interrupt names) as primary interrupt for the slave.
86 86
87Alternatively, devices supporting SMbus Host Notify, and connected to 87Alternatively, devices supporting SMBus Host Notify, and connected to
88adapters that support this feature, may use "host-notify" property. I2C 88adapters that support this feature, may use "host-notify" property. I2C
89core will create a virtual interrupt for Host Notify and assign it as 89core will create a virtual interrupt for Host Notify and assign it as
90primary interrupt for the slave. 90primary interrupt for the slave.
diff --git a/Documentation/devicetree/bindings/mfd/arizona.txt b/Documentation/devicetree/bindings/mfd/arizona.txt
index 9b62831fdf3e..148ef621a5e5 100644
--- a/Documentation/devicetree/bindings/mfd/arizona.txt
+++ b/Documentation/devicetree/bindings/mfd/arizona.txt
@@ -76,7 +76,7 @@ Deprecated properties:
76Also see child specific device properties: 76Also see child specific device properties:
77 Regulator - ../regulator/arizona-regulator.txt 77 Regulator - ../regulator/arizona-regulator.txt
78 Extcon - ../extcon/extcon-arizona.txt 78 Extcon - ../extcon/extcon-arizona.txt
79 Sound - ../sound/arizona.txt 79 Sound - ../sound/wlf,arizona.txt
80 80
81Example: 81Example:
82 82
diff --git a/Documentation/devicetree/bindings/misc/lwn-bk4.txt b/Documentation/devicetree/bindings/misc/lwn-bk4.txt
new file mode 100644
index 000000000000..d6a8c188c087
--- /dev/null
+++ b/Documentation/devicetree/bindings/misc/lwn-bk4.txt
@@ -0,0 +1,26 @@
1* Liebherr's BK4 controller external SPI
2
3A device which handles data acquisition from compatible industrial
4peripherals.
5The SPI is used for data and management purposes in both master and
6slave modes.
7
8Required properties:
9
10- compatible : Should be "lwn,bk4"
11
12Required SPI properties:
13
14- reg : Should be address of the device chip select within
15 the controller.
16
17- spi-max-frequency : Maximum SPI clocking speed of device in Hz, should be
18 30MHz at most for the Liebherr's BK4 external bus.
19
20Example:
21
22spidev0: spi@0 {
23 compatible = "lwn,bk4";
24 spi-max-frequency = <30000000>;
25 reg = <0>;
26};
diff --git a/Documentation/devicetree/bindings/net/can/rcar_can.txt b/Documentation/devicetree/bindings/net/can/rcar_can.txt
index 94a7f33ac5e9..cc4372842bf3 100644
--- a/Documentation/devicetree/bindings/net/can/rcar_can.txt
+++ b/Documentation/devicetree/bindings/net/can/rcar_can.txt
@@ -3,6 +3,7 @@ Renesas R-Car CAN controller Device Tree Bindings
3 3
4Required properties: 4Required properties:
5- compatible: "renesas,can-r8a7743" if CAN controller is a part of R8A7743 SoC. 5- compatible: "renesas,can-r8a7743" if CAN controller is a part of R8A7743 SoC.
6 "renesas,can-r8a7744" if CAN controller is a part of R8A7744 SoC.
6 "renesas,can-r8a7745" if CAN controller is a part of R8A7745 SoC. 7 "renesas,can-r8a7745" if CAN controller is a part of R8A7745 SoC.
7 "renesas,can-r8a7778" if CAN controller is a part of R8A7778 SoC. 8 "renesas,can-r8a7778" if CAN controller is a part of R8A7778 SoC.
8 "renesas,can-r8a7779" if CAN controller is a part of R8A7779 SoC. 9 "renesas,can-r8a7779" if CAN controller is a part of R8A7779 SoC.
diff --git a/Documentation/devicetree/bindings/phy/rcar-gen2-phy.txt b/Documentation/devicetree/bindings/phy/rcar-gen2-phy.txt
index eeb9e1874ea6..4f0879a0ca12 100644
--- a/Documentation/devicetree/bindings/phy/rcar-gen2-phy.txt
+++ b/Documentation/devicetree/bindings/phy/rcar-gen2-phy.txt
@@ -5,6 +5,7 @@ This file provides information on what the device node for the R-Car generation
5 5
6Required properties: 6Required properties:
7- compatible: "renesas,usb-phy-r8a7743" if the device is a part of R8A7743 SoC. 7- compatible: "renesas,usb-phy-r8a7743" if the device is a part of R8A7743 SoC.
8 "renesas,usb-phy-r8a7744" if the device is a part of R8A7744 SoC.
8 "renesas,usb-phy-r8a7745" if the device is a part of R8A7745 SoC. 9 "renesas,usb-phy-r8a7745" if the device is a part of R8A7745 SoC.
9 "renesas,usb-phy-r8a7790" if the device is a part of R8A7790 SoC. 10 "renesas,usb-phy-r8a7790" if the device is a part of R8A7790 SoC.
10 "renesas,usb-phy-r8a7791" if the device is a part of R8A7791 SoC. 11 "renesas,usb-phy-r8a7791" if the device is a part of R8A7791 SoC.
diff --git a/Documentation/devicetree/bindings/reset/fsl,imx7-src.txt b/Documentation/devicetree/bindings/reset/fsl,imx7-src.txt
index 5e1afc3d8480..1ab1d109318e 100644
--- a/Documentation/devicetree/bindings/reset/fsl,imx7-src.txt
+++ b/Documentation/devicetree/bindings/reset/fsl,imx7-src.txt
@@ -5,7 +5,7 @@ Please also refer to reset.txt in this directory for common reset
5controller binding usage. 5controller binding usage.
6 6
7Required properties: 7Required properties:
8- compatible: Should be "fsl,imx7-src", "syscon" 8- compatible: Should be "fsl,imx7d-src", "syscon"
9- reg: should be register base and length as documented in the 9- reg: should be register base and length as documented in the
10 datasheet 10 datasheet
11- interrupts: Should contain SRC interrupt 11- interrupts: Should contain SRC interrupt
diff --git a/Documentation/devicetree/bindings/timer/renesas,cmt.txt b/Documentation/devicetree/bindings/timer/renesas,cmt.txt
index 49948fcc0631..33992679a8bd 100644
--- a/Documentation/devicetree/bindings/timer/renesas,cmt.txt
+++ b/Documentation/devicetree/bindings/timer/renesas,cmt.txt
@@ -24,6 +24,8 @@ Required Properties:
24 - "renesas,r8a73a4-cmt1" for the 48-bit CMT1 device included in r8a73a4. 24 - "renesas,r8a73a4-cmt1" for the 48-bit CMT1 device included in r8a73a4.
25 - "renesas,r8a7743-cmt0" for the 32-bit CMT0 device included in r8a7743. 25 - "renesas,r8a7743-cmt0" for the 32-bit CMT0 device included in r8a7743.
26 - "renesas,r8a7743-cmt1" for the 48-bit CMT1 device included in r8a7743. 26 - "renesas,r8a7743-cmt1" for the 48-bit CMT1 device included in r8a7743.
27 - "renesas,r8a7744-cmt0" for the 32-bit CMT0 device included in r8a7744.
28 - "renesas,r8a7744-cmt1" for the 48-bit CMT1 device included in r8a7744.
27 - "renesas,r8a7745-cmt0" for the 32-bit CMT0 device included in r8a7745. 29 - "renesas,r8a7745-cmt0" for the 32-bit CMT0 device included in r8a7745.
28 - "renesas,r8a7745-cmt1" for the 48-bit CMT1 device included in r8a7745. 30 - "renesas,r8a7745-cmt1" for the 48-bit CMT1 device included in r8a7745.
29 - "renesas,r8a7790-cmt0" for the 32-bit CMT0 device included in r8a7790. 31 - "renesas,r8a7790-cmt0" for the 32-bit CMT0 device included in r8a7790.
diff --git a/Documentation/devicetree/bindings/timer/renesas,ostm.txt b/Documentation/devicetree/bindings/timer/renesas,ostm.txt
index be3ae0fdf775..81a78f8bcf17 100644
--- a/Documentation/devicetree/bindings/timer/renesas,ostm.txt
+++ b/Documentation/devicetree/bindings/timer/renesas,ostm.txt
@@ -9,7 +9,8 @@ Channels are independent from each other.
9Required Properties: 9Required Properties:
10 10
11 - compatible: must be one or more of the following: 11 - compatible: must be one or more of the following:
12 - "renesas,r7s72100-ostm" for the r7s72100 OSTM 12 - "renesas,r7s72100-ostm" for the R7S72100 (RZ/A1) OSTM
13 - "renesas,r7s9210-ostm" for the R7S9210 (RZ/A2) OSTM
13 - "renesas,ostm" for any OSTM 14 - "renesas,ostm" for any OSTM
14 This is a fallback for the above renesas,*-ostm entries 15 This is a fallback for the above renesas,*-ostm entries
15 16
diff --git a/Documentation/devicetree/bindings/vendor-prefixes.txt b/Documentation/devicetree/bindings/vendor-prefixes.txt
index f26bf667e530..376f24484182 100644
--- a/Documentation/devicetree/bindings/vendor-prefixes.txt
+++ b/Documentation/devicetree/bindings/vendor-prefixes.txt
@@ -127,6 +127,7 @@ everspin Everspin Technologies, Inc.
127exar Exar Corporation 127exar Exar Corporation
128excito Excito 128excito Excito
129ezchip EZchip Semiconductor 129ezchip EZchip Semiconductor
130facebook Facebook
130fairphone Fairphone B.V. 131fairphone Fairphone B.V.
131faraday Faraday Technology Corporation 132faraday Faraday Technology Corporation
132fastrax Fastrax Oy 133fastrax Fastrax Oy
@@ -275,6 +276,7 @@ nxp NXP Semiconductors
275okaya Okaya Electric America, Inc. 276okaya Okaya Electric America, Inc.
276oki Oki Electric Industry Co., Ltd. 277oki Oki Electric Industry Co., Ltd.
277olimex OLIMEX Ltd. 278olimex OLIMEX Ltd.
279olpc One Laptop Per Child
278onion Onion Corporation 280onion Onion Corporation
279onnn ON Semiconductor Corp. 281onnn ON Semiconductor Corp.
280ontat On Tat Industrial Company 282ontat On Tat Industrial Company
diff --git a/Documentation/devicetree/bindings/watchdog/renesas-wdt.txt b/Documentation/devicetree/bindings/watchdog/renesas-wdt.txt
index 9407212a85a8..d72d1181ec62 100644
--- a/Documentation/devicetree/bindings/watchdog/renesas-wdt.txt
+++ b/Documentation/devicetree/bindings/watchdog/renesas-wdt.txt
@@ -6,6 +6,7 @@ Required properties:
6 version. 6 version.
7 Examples with soctypes are: 7 Examples with soctypes are:
8 - "renesas,r8a7743-wdt" (RZ/G1M) 8 - "renesas,r8a7743-wdt" (RZ/G1M)
9 - "renesas,r8a7744-wdt" (RZ/G1N)
9 - "renesas,r8a7745-wdt" (RZ/G1E) 10 - "renesas,r8a7745-wdt" (RZ/G1E)
10 - "renesas,r8a774a1-wdt" (RZ/G2M) 11 - "renesas,r8a774a1-wdt" (RZ/G2M)
11 - "renesas,r8a7790-wdt" (R-Car H2) 12 - "renesas,r8a7790-wdt" (R-Car H2)
diff --git a/Makefile b/Makefile
index 2fc5732a4f9e..7d4ba5196010 100644
--- a/Makefile
+++ b/Makefile
@@ -1063,7 +1063,7 @@ include/config/kernel.release: $(srctree)/Makefile FORCE
1063# Carefully list dependencies so we do not try to build scripts twice 1063# Carefully list dependencies so we do not try to build scripts twice
1064# in parallel 1064# in parallel
1065PHONY += scripts 1065PHONY += scripts
1066scripts: scripts_basic asm-generic gcc-plugins $(autoksyms_h) 1066scripts: scripts_basic scripts_dtc asm-generic gcc-plugins $(autoksyms_h)
1067 $(Q)$(MAKE) $(build)=$(@) 1067 $(Q)$(MAKE) $(build)=$(@)
1068 1068
1069# Things we need to do before we recursively start building the kernel 1069# Things we need to do before we recursively start building the kernel
@@ -1213,6 +1213,35 @@ kselftest-merge:
1213 +$(Q)$(MAKE) -f $(srctree)/Makefile olddefconfig 1213 +$(Q)$(MAKE) -f $(srctree)/Makefile olddefconfig
1214 1214
1215# --------------------------------------------------------------------------- 1215# ---------------------------------------------------------------------------
1216# Devicetree files
1217
1218ifneq ($(wildcard $(srctree)/arch/$(SRCARCH)/boot/dts/),)
1219dtstree := arch/$(SRCARCH)/boot/dts
1220endif
1221
1222ifneq ($(dtstree),)
1223
1224%.dtb: prepare3 scripts_dtc
1225 $(Q)$(MAKE) $(build)=$(dtstree) $(dtstree)/$@
1226
1227PHONY += dtbs dtbs_install
1228dtbs: prepare3 scripts_dtc
1229 $(Q)$(MAKE) $(build)=$(dtstree)
1230
1231dtbs_install:
1232 $(Q)$(MAKE) $(dtbinst)=$(dtstree)
1233
1234ifdef CONFIG_OF_EARLY_FLATTREE
1235all: dtbs
1236endif
1237
1238endif
1239
1240PHONY += scripts_dtc
1241scripts_dtc: scripts_basic
1242 $(Q)$(MAKE) $(build)=scripts/dtc
1243
1244# ---------------------------------------------------------------------------
1216# Modules 1245# Modules
1217 1246
1218ifdef CONFIG_MODULES 1247ifdef CONFIG_MODULES
@@ -1421,6 +1450,12 @@ help:
1421 @echo ' kselftest-merge - Merge all the config dependencies of kselftest to existing' 1450 @echo ' kselftest-merge - Merge all the config dependencies of kselftest to existing'
1422 @echo ' .config.' 1451 @echo ' .config.'
1423 @echo '' 1452 @echo ''
1453 @$(if $(dtstree), \
1454 echo 'Devicetree:'; \
1455 echo '* dtbs - Build device tree blobs for enabled boards'; \
1456 echo ' dtbs_install - Install dtbs to $(INSTALL_DTBS_PATH)'; \
1457 echo '')
1458
1424 @echo 'Userspace tools targets:' 1459 @echo 'Userspace tools targets:'
1425 @echo ' use "make tools/help"' 1460 @echo ' use "make tools/help"'
1426 @echo ' or "cd tools; make help"' 1461 @echo ' or "cd tools; make help"'
diff --git a/arch/arc/Makefile b/arch/arc/Makefile
index 644815c0516e..c64c505d966c 100644
--- a/arch/arc/Makefile
+++ b/arch/arc/Makefile
@@ -102,11 +102,5 @@ boot_targets += uImage uImage.bin uImage.gz
102$(boot_targets): vmlinux 102$(boot_targets): vmlinux
103 $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@ 103 $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
104 104
105%.dtb %.dtb.S %.dtb.o: scripts
106 $(Q)$(MAKE) $(build)=$(boot)/dts $(boot)/dts/$@
107
108dtbs: scripts
109 $(Q)$(MAKE) $(build)=$(boot)/dts
110
111archclean: 105archclean:
112 $(Q)$(MAKE) $(clean)=$(boot) 106 $(Q)$(MAKE) $(clean)=$(boot)
diff --git a/arch/arm/Makefile b/arch/arm/Makefile
index 5c91e0093ee8..05a91d8b89f3 100644
--- a/arch/arm/Makefile
+++ b/arch/arm/Makefile
@@ -303,12 +303,7 @@ else
303KBUILD_IMAGE := $(boot)/zImage 303KBUILD_IMAGE := $(boot)/zImage
304endif 304endif
305 305
306# Build the DT binary blobs if we have OF configured 306all: $(notdir $(KBUILD_IMAGE))
307ifeq ($(CONFIG_USE_OF),y)
308KBUILD_DTBS := dtbs
309endif
310
311all: $(notdir $(KBUILD_IMAGE)) $(KBUILD_DTBS)
312 307
313 308
314archheaders: 309archheaders:
@@ -335,17 +330,6 @@ $(BOOT_TARGETS): vmlinux
335$(INSTALL_TARGETS): 330$(INSTALL_TARGETS):
336 $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $@ 331 $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $@
337 332
338%.dtb: | scripts
339 $(Q)$(MAKE) $(build)=$(boot)/dts MACHINE=$(MACHINE) $(boot)/dts/$@
340
341PHONY += dtbs dtbs_install
342
343dtbs: prepare scripts
344 $(Q)$(MAKE) $(build)=$(boot)/dts
345
346dtbs_install:
347 $(Q)$(MAKE) $(dtbinst)=$(boot)/dts
348
349PHONY += vdso_install 333PHONY += vdso_install
350vdso_install: 334vdso_install:
351ifeq ($(CONFIG_VDSO),y) 335ifeq ($(CONFIG_VDSO),y)
@@ -367,8 +351,6 @@ define archhelp
367 echo ' uImage - U-Boot wrapped zImage' 351 echo ' uImage - U-Boot wrapped zImage'
368 echo ' bootpImage - Combined zImage and initial RAM disk' 352 echo ' bootpImage - Combined zImage and initial RAM disk'
369 echo ' (supply initrd image via make variable INITRD=<path>)' 353 echo ' (supply initrd image via make variable INITRD=<path>)'
370 echo '* dtbs - Build device tree blobs for enabled boards'
371 echo ' dtbs_install - Install dtbs to $(INSTALL_DTBS_PATH)'
372 echo ' install - Install uncompressed kernel' 354 echo ' install - Install uncompressed kernel'
373 echo ' zinstall - Install compressed kernel' 355 echo ' zinstall - Install compressed kernel'
374 echo ' uinstall - Install U-Boot wrapped compressed kernel' 356 echo ' uinstall - Install U-Boot wrapped compressed kernel'
diff --git a/arch/arm/boot/compressed/libfdt_env.h b/arch/arm/boot/compressed/libfdt_env.h
index 07437816e098..b36c0289a308 100644
--- a/arch/arm/boot/compressed/libfdt_env.h
+++ b/arch/arm/boot/compressed/libfdt_env.h
@@ -6,6 +6,8 @@
6#include <linux/string.h> 6#include <linux/string.h>
7#include <asm/byteorder.h> 7#include <asm/byteorder.h>
8 8
9#define INT_MAX ((int)(~0U>>1))
10
9typedef __be16 fdt16_t; 11typedef __be16 fdt16_t;
10typedef __be32 fdt32_t; 12typedef __be32 fdt32_t;
11typedef __be64 fdt64_t; 13typedef __be64 fdt64_t;
diff --git a/arch/arm/kernel/devtree.c b/arch/arm/kernel/devtree.c
index ecaa68dd1af5..13bcd3b867cb 100644
--- a/arch/arm/kernel/devtree.c
+++ b/arch/arm/kernel/devtree.c
@@ -87,14 +87,11 @@ void __init arm_dt_init_cpu_maps(void)
87 if (!cpus) 87 if (!cpus)
88 return; 88 return;
89 89
90 for_each_child_of_node(cpus, cpu) { 90 for_each_of_cpu_node(cpu) {
91 const __be32 *cell; 91 const __be32 *cell;
92 int prop_bytes; 92 int prop_bytes;
93 u32 hwid; 93 u32 hwid;
94 94
95 if (of_node_cmp(cpu->type, "cpu"))
96 continue;
97
98 pr_debug(" * %pOF...\n", cpu); 95 pr_debug(" * %pOF...\n", cpu);
99 /* 96 /*
100 * A device tree containing CPU nodes with missing "reg" 97 * A device tree containing CPU nodes with missing "reg"
diff --git a/arch/arm/kernel/topology.c b/arch/arm/kernel/topology.c
index 24ac3cab411d..60e375ce1ab2 100644
--- a/arch/arm/kernel/topology.c
+++ b/arch/arm/kernel/topology.c
@@ -94,12 +94,6 @@ static void __init parse_dt_topology(void)
94 __cpu_capacity = kcalloc(nr_cpu_ids, sizeof(*__cpu_capacity), 94 __cpu_capacity = kcalloc(nr_cpu_ids, sizeof(*__cpu_capacity),
95 GFP_NOWAIT); 95 GFP_NOWAIT);
96 96
97 cn = of_find_node_by_path("/cpus");
98 if (!cn) {
99 pr_err("No CPU information found in DT\n");
100 return;
101 }
102
103 for_each_possible_cpu(cpu) { 97 for_each_possible_cpu(cpu) {
104 const u32 *rate; 98 const u32 *rate;
105 int len; 99 int len;
diff --git a/arch/arm/mach-shmobile/pm-rcar-gen2.c b/arch/arm/mach-shmobile/pm-rcar-gen2.c
index 345af3ebcc3a..7efe95bd584f 100644
--- a/arch/arm/mach-shmobile/pm-rcar-gen2.c
+++ b/arch/arm/mach-shmobile/pm-rcar-gen2.c
@@ -50,7 +50,7 @@ void __init rcar_gen2_pm_init(void)
50 void __iomem *p; 50 void __iomem *p;
51 u32 bar; 51 u32 bar;
52 static int once; 52 static int once;
53 struct device_node *np, *cpus; 53 struct device_node *np;
54 bool has_a7 = false; 54 bool has_a7 = false;
55 bool has_a15 = false; 55 bool has_a15 = false;
56 struct resource res; 56 struct resource res;
@@ -59,11 +59,7 @@ void __init rcar_gen2_pm_init(void)
59 if (once++) 59 if (once++)
60 return; 60 return;
61 61
62 cpus = of_find_node_by_path("/cpus"); 62 for_each_of_cpu_node(np) {
63 if (!cpus)
64 return;
65
66 for_each_child_of_node(cpus, np) {
67 if (of_device_is_compatible(np, "arm,cortex-a15")) 63 if (of_device_is_compatible(np, "arm,cortex-a15"))
68 has_a15 = true; 64 has_a15 = true;
69 else if (of_device_is_compatible(np, "arm,cortex-a7")) 65 else if (of_device_is_compatible(np, "arm,cortex-a7"))
diff --git a/arch/arm/mach-shmobile/pm-rmobile.c b/arch/arm/mach-shmobile/pm-rmobile.c
index e348bcfe389d..94fdeef11b81 100644
--- a/arch/arm/mach-shmobile/pm-rmobile.c
+++ b/arch/arm/mach-shmobile/pm-rmobile.c
@@ -202,7 +202,7 @@ static void __init get_special_pds(void)
202 const struct of_device_id *id; 202 const struct of_device_id *id;
203 203
204 /* PM domains containing CPUs */ 204 /* PM domains containing CPUs */
205 for_each_node_by_type(np, "cpu") 205 for_each_of_cpu_node(np)
206 add_special_pd(np, PD_CPU); 206 add_special_pd(np, PD_CPU);
207 207
208 /* PM domain containing console */ 208 /* PM domain containing console */
diff --git a/arch/arm/mach-shmobile/timer.c b/arch/arm/mach-shmobile/timer.c
index 828e8aea037e..e48b0939693f 100644
--- a/arch/arm/mach-shmobile/timer.c
+++ b/arch/arm/mach-shmobile/timer.c
@@ -22,22 +22,16 @@
22 22
23void __init shmobile_init_delay(void) 23void __init shmobile_init_delay(void)
24{ 24{
25 struct device_node *np, *cpus; 25 struct device_node *np;
26 u32 max_freq = 0; 26 u32 max_freq = 0;
27 27
28 cpus = of_find_node_by_path("/cpus"); 28 for_each_of_cpu_node(np) {
29 if (!cpus)
30 return;
31
32 for_each_child_of_node(cpus, np) {
33 u32 freq; 29 u32 freq;
34 30
35 if (!of_property_read_u32(np, "clock-frequency", &freq)) 31 if (!of_property_read_u32(np, "clock-frequency", &freq))
36 max_freq = max(max_freq, freq); 32 max_freq = max(max_freq, freq);
37 } 33 }
38 34
39 of_node_put(cpus);
40
41 if (!max_freq) 35 if (!max_freq)
42 return; 36 return;
43 37
diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile
index 106039d25e2f..b4e994cd3a42 100644
--- a/arch/arm64/Makefile
+++ b/arch/arm64/Makefile
@@ -113,9 +113,8 @@ core-$(CONFIG_EFI_STUB) += $(objtree)/drivers/firmware/efi/libstub/lib.a
113# Default target when executing plain make 113# Default target when executing plain make
114boot := arch/arm64/boot 114boot := arch/arm64/boot
115KBUILD_IMAGE := $(boot)/Image.gz 115KBUILD_IMAGE := $(boot)/Image.gz
116KBUILD_DTBS := dtbs
117 116
118all: Image.gz $(KBUILD_DTBS) 117all: Image.gz
119 118
120 119
121Image: vmlinux 120Image: vmlinux
@@ -127,17 +126,6 @@ Image.%: Image
127zinstall install: 126zinstall install:
128 $(Q)$(MAKE) $(build)=$(boot) $@ 127 $(Q)$(MAKE) $(build)=$(boot) $@
129 128
130%.dtb: scripts
131 $(Q)$(MAKE) $(build)=$(boot)/dts $(boot)/dts/$@
132
133PHONY += dtbs dtbs_install
134
135dtbs: prepare scripts
136 $(Q)$(MAKE) $(build)=$(boot)/dts
137
138dtbs_install:
139 $(Q)$(MAKE) $(dtbinst)=$(boot)/dts
140
141PHONY += vdso_install 129PHONY += vdso_install
142vdso_install: 130vdso_install:
143 $(Q)$(MAKE) $(build)=arch/arm64/kernel/vdso $@ 131 $(Q)$(MAKE) $(build)=arch/arm64/kernel/vdso $@
@@ -145,7 +133,6 @@ vdso_install:
145# We use MRPROPER_FILES and CLEAN_FILES now 133# We use MRPROPER_FILES and CLEAN_FILES now
146archclean: 134archclean:
147 $(Q)$(MAKE) $(clean)=$(boot) 135 $(Q)$(MAKE) $(clean)=$(boot)
148 $(Q)$(MAKE) $(clean)=$(boot)/dts
149 136
150# We need to generate vdso-offsets.h before compiling certain files in kernel/. 137# We need to generate vdso-offsets.h before compiling certain files in kernel/.
151# In order to do that, we should use the archprepare target, but we can't since 138# In order to do that, we should use the archprepare target, but we can't since
@@ -160,8 +147,6 @@ vdso_prepare: prepare0
160define archhelp 147define archhelp
161 echo '* Image.gz - Compressed kernel image (arch/$(ARCH)/boot/Image.gz)' 148 echo '* Image.gz - Compressed kernel image (arch/$(ARCH)/boot/Image.gz)'
162 echo ' Image - Uncompressed kernel image (arch/$(ARCH)/boot/Image)' 149 echo ' Image - Uncompressed kernel image (arch/$(ARCH)/boot/Image)'
163 echo '* dtbs - Build device tree blobs for enabled boards'
164 echo ' dtbs_install - Install dtbs to $(INSTALL_DTBS_PATH)'
165 echo ' install - Install uncompressed kernel' 150 echo ' install - Install uncompressed kernel'
166 echo ' zinstall - Install compressed kernel' 151 echo ' zinstall - Install compressed kernel'
167 echo ' Install using (your) ~/bin/installkernel or' 152 echo ' Install using (your) ~/bin/installkernel or'
diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c
index 25fcd22a4bb2..96b8f2f51ab2 100644
--- a/arch/arm64/kernel/smp.c
+++ b/arch/arm64/kernel/smp.c
@@ -602,7 +602,7 @@ static void __init of_parse_and_init_cpus(void)
602{ 602{
603 struct device_node *dn; 603 struct device_node *dn;
604 604
605 for_each_node_by_type(dn, "cpu") { 605 for_each_of_cpu_node(dn) {
606 u64 hwid = of_get_cpu_mpidr(dn); 606 u64 hwid = of_get_cpu_mpidr(dn);
607 607
608 if (hwid == INVALID_HWID) 608 if (hwid == INVALID_HWID)
diff --git a/arch/c6x/Makefile b/arch/c6x/Makefile
index 3fe8a948e94c..b7aa854f7008 100644
--- a/arch/c6x/Makefile
+++ b/arch/c6x/Makefile
@@ -40,9 +40,7 @@ boot := arch/$(ARCH)/boot
40DTB:=$(subst dtbImage.,,$(filter dtbImage.%, $(MAKECMDGOALS))) 40DTB:=$(subst dtbImage.,,$(filter dtbImage.%, $(MAKECMDGOALS)))
41export DTB 41export DTB
42 42
43ifneq ($(DTB),)
44core-y += $(boot)/dts/ 43core-y += $(boot)/dts/
45endif
46 44
47# With make 3.82 we cannot mix normal and wildcard targets 45# With make 3.82 we cannot mix normal and wildcard targets
48 46
diff --git a/arch/c6x/boot/dts/Makefile b/arch/c6x/boot/dts/Makefile
index b212d278ebc4..f438285c3640 100644
--- a/arch/c6x/boot/dts/Makefile
+++ b/arch/c6x/boot/dts/Makefile
@@ -5,15 +5,12 @@
5 5
6DTC_FLAGS ?= -p 1024 6DTC_FLAGS ?= -p 1024
7 7
8dtb-$(CONFIG_SOC_TMS320C6455) += dsk6455.dtb
9dtb-$(CONFIG_SOC_TMS320C6457) += evmc6457.dtb
10dtb-$(CONFIG_SOC_TMS320C6472) += evmc6472.dtb
11dtb-$(CONFIG_SOC_TMS320C6474) += evmc6474.dtb
12dtb-$(CONFIG_SOC_TMS320C6678) += evmc6678.dtb
13
8ifneq ($(DTB),) 14ifneq ($(DTB),)
9obj-y += linked_dtb.o 15obj-y += $(DTB).dtb.o
10endif 16endif
11
12quiet_cmd_cp = CP $< $@$2
13 cmd_cp = cat $< >$@$2 || (rm -f $@ && echo false)
14
15# Generate builtin.dtb from $(DTB).dtb
16$(obj)/builtin.dtb: $(obj)/$(DTB).dtb
17 $(call if_changed,cp)
18
19$(obj)/linked_dtb.o: $(obj)/builtin.dtb
diff --git a/arch/c6x/boot/dts/linked_dtb.S b/arch/c6x/boot/dts/linked_dtb.S
deleted file mode 100644
index cf347f1d16ce..000000000000
--- a/arch/c6x/boot/dts/linked_dtb.S
+++ /dev/null
@@ -1,2 +0,0 @@
1.section __fdt_blob,"a"
2.incbin "arch/c6x/boot/dts/builtin.dtb"
diff --git a/arch/c6x/include/asm/sections.h b/arch/c6x/include/asm/sections.h
index d6c591ab5b7e..dc2f15eb3bde 100644
--- a/arch/c6x/include/asm/sections.h
+++ b/arch/c6x/include/asm/sections.h
@@ -8,6 +8,5 @@ extern char _vectors_start[];
8extern char _vectors_end[]; 8extern char _vectors_end[];
9 9
10extern char _data_lma[]; 10extern char _data_lma[];
11extern char _fdt_start[], _fdt_end[];
12 11
13#endif /* _ASM_C6X_SECTIONS_H */ 12#endif /* _ASM_C6X_SECTIONS_H */
diff --git a/arch/c6x/kernel/setup.c b/arch/c6x/kernel/setup.c
index 786e36e2f61d..05d96a9541b5 100644
--- a/arch/c6x/kernel/setup.c
+++ b/arch/c6x/kernel/setup.c
@@ -96,7 +96,7 @@ static void __init get_cpuinfo(void)
96 unsigned long core_khz; 96 unsigned long core_khz;
97 u64 tmp; 97 u64 tmp;
98 struct cpuinfo_c6x *p; 98 struct cpuinfo_c6x *p;
99 struct device_node *node, *np; 99 struct device_node *node;
100 100
101 p = &per_cpu(cpu_data, smp_processor_id()); 101 p = &per_cpu(cpu_data, smp_processor_id());
102 102
@@ -190,13 +190,8 @@ static void __init get_cpuinfo(void)
190 190
191 p->core_id = get_coreid(); 191 p->core_id = get_coreid();
192 192
193 node = of_find_node_by_name(NULL, "cpus"); 193 for_each_of_cpu_node(node)
194 if (node) { 194 ++c6x_num_cores;
195 for_each_child_of_node(node, np)
196 if (!strcmp("cpu", np->name))
197 ++c6x_num_cores;
198 of_node_put(node);
199 }
200 195
201 node = of_find_node_by_name(NULL, "soc"); 196 node = of_find_node_by_name(NULL, "soc");
202 if (node) { 197 if (node) {
@@ -270,7 +265,7 @@ int __init c6x_add_memory(phys_addr_t start, unsigned long size)
270notrace void __init machine_init(unsigned long dt_ptr) 265notrace void __init machine_init(unsigned long dt_ptr)
271{ 266{
272 void *dtb = __va(dt_ptr); 267 void *dtb = __va(dt_ptr);
273 void *fdt = _fdt_start; 268 void *fdt = __dtb_start;
274 269
275 /* interrupts must be masked */ 270 /* interrupts must be masked */
276 set_creg(IER, 2); 271 set_creg(IER, 2);
@@ -363,7 +358,7 @@ void __init setup_arch(char **cmdline_p)
363 memory_end >> PAGE_SHIFT); 358 memory_end >> PAGE_SHIFT);
364 memblock_reserve(memory_start, bootmap_size); 359 memblock_reserve(memory_start, bootmap_size);
365 360
366 unflatten_device_tree(); 361 unflatten_and_copy_device_tree();
367 362
368 c6x_cache_init(); 363 c6x_cache_init();
369 364
diff --git a/arch/c6x/kernel/vmlinux.lds.S b/arch/c6x/kernel/vmlinux.lds.S
index 1fba5b421eee..584bab2bace6 100644
--- a/arch/c6x/kernel/vmlinux.lds.S
+++ b/arch/c6x/kernel/vmlinux.lds.S
@@ -90,16 +90,6 @@ SECTIONS
90 *(.switch) 90 *(.switch)
91 } 91 }
92 92
93 . = ALIGN (8) ;
94 __fdt_blob : AT(ADDR(__fdt_blob) - LOAD_OFFSET)
95 {
96 _fdt_start = . ; /* place for fdt blob */
97 *(__fdt_blob) ; /* Any link-placed DTB */
98 BYTE(0); /* section always has contents */
99 . = _fdt_start + 0x4000; /* Pad up to 16kbyte */
100 _fdt_end = . ;
101 }
102
103 _etext = .; 93 _etext = .;
104 94
105 /* 95 /*
diff --git a/arch/h8300/Makefile b/arch/h8300/Makefile
index 58634e6bae92..4003ddc616e1 100644
--- a/arch/h8300/Makefile
+++ b/arch/h8300/Makefile
@@ -31,21 +31,12 @@ CROSS_COMPILE := h8300-unknown-linux-
31endif 31endif
32 32
33core-y += arch/$(ARCH)/kernel/ arch/$(ARCH)/mm/ 33core-y += arch/$(ARCH)/kernel/ arch/$(ARCH)/mm/
34ifneq '$(CONFIG_H8300_BUILTIN_DTB)' '""' 34core-y += arch/$(ARCH)/boot/dts/
35core-y += arch/h8300/boot/dts/
36endif
37 35
38libs-y += arch/$(ARCH)/lib/ 36libs-y += arch/$(ARCH)/lib/
39 37
40boot := arch/h8300/boot 38boot := arch/h8300/boot
41 39
42%.dtb %.dtb.S %.dtb.o: | scripts
43 $(Q)$(MAKE) $(build)=arch/h8300/boot/dts arch/h8300/boot/dts/$@
44
45PHONY += dtbs
46dtbs: scripts
47 $(Q)$(MAKE) $(build)=arch/h8300/boot/dts
48
49archmrproper: 40archmrproper:
50 41
51archclean: 42archclean:
diff --git a/arch/microblaze/Makefile b/arch/microblaze/Makefile
index 4f3ab5707265..0823d291fbeb 100644
--- a/arch/microblaze/Makefile
+++ b/arch/microblaze/Makefile
@@ -65,9 +65,7 @@ boot := arch/microblaze/boot
65# Are we making a simpleImage.<boardname> target? If so, crack out the boardname 65# Are we making a simpleImage.<boardname> target? If so, crack out the boardname
66DTB:=$(subst simpleImage.,,$(filter simpleImage.%, $(MAKECMDGOALS))) 66DTB:=$(subst simpleImage.,,$(filter simpleImage.%, $(MAKECMDGOALS)))
67 67
68ifneq ($(DTB),) 68core-y += $(boot)/dts/
69 core-y += $(boot)/dts/
70endif
71 69
72# defines filename extension depending memory management type 70# defines filename extension depending memory management type
73ifeq ($(CONFIG_MMU),) 71ifeq ($(CONFIG_MMU),)
diff --git a/arch/microblaze/boot/dts/Makefile b/arch/microblaze/boot/dts/Makefile
index 1f77913d404d..c7324e74f9ef 100644
--- a/arch/microblaze/boot/dts/Makefile
+++ b/arch/microblaze/boot/dts/Makefile
@@ -1,6 +1,9 @@
1# SPDX-License-Identifier: GPL-2.0 1# SPDX-License-Identifier: GPL-2.0
2# 2#
3 3
4dtb-y := system.dtb
5
6ifneq ($(DTB),)
4obj-y += linked_dtb.o 7obj-y += linked_dtb.o
5 8
6# Ensure system.dtb exists 9# Ensure system.dtb exists
@@ -11,6 +14,7 @@ ifneq ($(DTB),system)
11$(obj)/system.dtb: $(obj)/$(DTB).dtb 14$(obj)/system.dtb: $(obj)/$(DTB).dtb
12 $(call if_changed,cp) 15 $(call if_changed,cp)
13endif 16endif
17endif
14 18
15quiet_cmd_cp = CP $< $@$2 19quiet_cmd_cp = CP $< $@$2
16 cmd_cp = cat $< >$@$2 || (rm -f $@ && echo false) 20 cmd_cp = cat $< >$@$2 || (rm -f $@ && echo false)
diff --git a/arch/microblaze/kernel/cpu/cpuinfo.c b/arch/microblaze/kernel/cpu/cpuinfo.c
index 96b3f26d16be..ef2f49471a2a 100644
--- a/arch/microblaze/kernel/cpu/cpuinfo.c
+++ b/arch/microblaze/kernel/cpu/cpuinfo.c
@@ -89,9 +89,9 @@ static struct device_node *cpu;
89 89
90void __init setup_cpuinfo(void) 90void __init setup_cpuinfo(void)
91{ 91{
92 cpu = (struct device_node *) of_find_node_by_type(NULL, "cpu"); 92 cpu = of_get_cpu_node(0, NULL);
93 if (!cpu) 93 if (!cpu)
94 pr_err("You don't have cpu!!!\n"); 94 pr_err("You don't have cpu or are missing cpu reg property!!!\n");
95 95
96 pr_info("%s: initialising\n", __func__); 96 pr_info("%s: initialising\n", __func__);
97 97
@@ -117,6 +117,8 @@ void __init setup_cpuinfo(void)
117 if (cpuinfo.mmu_privins) 117 if (cpuinfo.mmu_privins)
118 pr_warn("%s: Stream instructions enabled" 118 pr_warn("%s: Stream instructions enabled"
119 " - USERSPACE CAN LOCK THIS KERNEL!\n", __func__); 119 " - USERSPACE CAN LOCK THIS KERNEL!\n", __func__);
120
121 of_node_put(cpu);
120} 122}
121 123
122void __init setup_cpuinfo_clk(void) 124void __init setup_cpuinfo_clk(void)
diff --git a/arch/mips/Makefile b/arch/mips/Makefile
index d74b3742fa5d..d43eeaa6d75b 100644
--- a/arch/mips/Makefile
+++ b/arch/mips/Makefile
@@ -407,18 +407,7 @@ endif
407CLEAN_FILES += vmlinux.32 vmlinux.64 407CLEAN_FILES += vmlinux.32 vmlinux.64
408 408
409# device-trees 409# device-trees
410core-$(CONFIG_BUILTIN_DTB) += arch/mips/boot/dts/ 410core-y += arch/mips/boot/dts/
411
412%.dtb %.dtb.S %.dtb.o: | scripts
413 $(Q)$(MAKE) $(build)=arch/mips/boot/dts arch/mips/boot/dts/$@
414
415PHONY += dtbs
416dtbs: scripts
417 $(Q)$(MAKE) $(build)=arch/mips/boot/dts
418
419PHONY += dtbs_install
420dtbs_install:
421 $(Q)$(MAKE) $(dtbinst)=arch/mips/boot/dts
422 411
423archprepare: 412archprepare:
424ifdef CONFIG_MIPS32_N32 413ifdef CONFIG_MIPS32_N32
@@ -461,8 +450,6 @@ define archhelp
461 echo ' uImage.lzma - U-Boot image (lzma)' 450 echo ' uImage.lzma - U-Boot image (lzma)'
462 echo ' uImage.lzo - U-Boot image (lzo)' 451 echo ' uImage.lzo - U-Boot image (lzo)'
463 echo ' uzImage.bin - U-Boot image (self-extracting)' 452 echo ' uzImage.bin - U-Boot image (self-extracting)'
464 echo ' dtbs - Device-tree blobs for enabled boards'
465 echo ' dtbs_install - Install dtbs to $(INSTALL_DTBS_PATH)'
466 echo 453 echo
467 echo ' These will be default as appropriate for a configured platform.' 454 echo ' These will be default as appropriate for a configured platform.'
468 echo 455 echo
diff --git a/arch/nds32/Makefile b/arch/nds32/Makefile
index 3509fac10491..9f525ed70049 100644
--- a/arch/nds32/Makefile
+++ b/arch/nds32/Makefile
@@ -47,7 +47,7 @@ CHECKFLAGS += -D__NDS32_EB__
47endif 47endif
48 48
49boot := arch/nds32/boot 49boot := arch/nds32/boot
50core-$(BUILTIN_DTB) += $(boot)/dts/ 50core-y += $(boot)/dts/
51 51
52.PHONY: FORCE 52.PHONY: FORCE
53 53
diff --git a/arch/nios2/Makefile b/arch/nios2/Makefile
index 8673a79dca9c..52c03e60b114 100644
--- a/arch/nios2/Makefile
+++ b/arch/nios2/Makefile
@@ -49,21 +49,13 @@ BOOT_TARGETS = vmImage zImage
49PHONY += $(BOOT_TARGETS) install 49PHONY += $(BOOT_TARGETS) install
50KBUILD_IMAGE := $(nios2-boot)/vmImage 50KBUILD_IMAGE := $(nios2-boot)/vmImage
51 51
52ifneq ($(CONFIG_NIOS2_DTB_SOURCE),"") 52core-y += $(nios2-boot)/dts/
53 core-y += $(nios2-boot)/
54endif
55 53
56all: vmImage 54all: vmImage
57 55
58archclean: 56archclean:
59 $(Q)$(MAKE) $(clean)=$(nios2-boot) 57 $(Q)$(MAKE) $(clean)=$(nios2-boot)
60 58
61%.dtb: | scripts
62 $(Q)$(MAKE) $(build)=$(nios2-boot) $(nios2-boot)/$@
63
64dtbs:
65 $(Q)$(MAKE) $(build)=$(nios2-boot) $(nios2-boot)/$@
66
67$(BOOT_TARGETS): vmlinux 59$(BOOT_TARGETS): vmlinux
68 $(Q)$(MAKE) $(build)=$(nios2-boot) $(nios2-boot)/$@ 60 $(Q)$(MAKE) $(build)=$(nios2-boot) $(nios2-boot)/$@
69 61
@@ -76,5 +68,4 @@ define archhelp
76 echo ' (your) ~/bin/$(INSTALLKERNEL) or' 68 echo ' (your) ~/bin/$(INSTALLKERNEL) or'
77 echo ' (distribution) /sbin/$(INSTALLKERNEL) or' 69 echo ' (distribution) /sbin/$(INSTALLKERNEL) or'
78 echo ' install to $$(INSTALL_PATH)' 70 echo ' install to $$(INSTALL_PATH)'
79 echo ' dtbs - Build device tree blobs for enabled boards'
80endef 71endef
diff --git a/arch/nios2/boot/Makefile b/arch/nios2/boot/Makefile
index 2ba23a679732..37dfc7e584bc 100644
--- a/arch/nios2/boot/Makefile
+++ b/arch/nios2/boot/Makefile
@@ -31,27 +31,5 @@ $(obj)/zImage: $(obj)/compressed/vmlinux FORCE
31$(obj)/compressed/vmlinux: $(obj)/vmlinux.gz FORCE 31$(obj)/compressed/vmlinux: $(obj)/vmlinux.gz FORCE
32 $(Q)$(MAKE) $(build)=$(obj)/compressed $@ 32 $(Q)$(MAKE) $(build)=$(obj)/compressed $@
33 33
34# Rule to build device tree blobs
35DTB_SRC := $(patsubst "%",%,$(CONFIG_NIOS2_DTB_SOURCE))
36
37# Make sure the generated dtb gets removed during clean
38extra-$(CONFIG_NIOS2_DTB_SOURCE_BOOL) += system.dtb
39
40$(obj)/system.dtb: $(DTB_SRC) FORCE
41 $(call cmd,dtc)
42
43# Ensure system.dtb exists
44$(obj)/linked_dtb.o: $(obj)/system.dtb
45
46obj-$(CONFIG_NIOS2_DTB_SOURCE_BOOL) += linked_dtb.o
47
48targets += $(dtb-y)
49
50# Rule to build device tree blobs with make command
51$(obj)/%.dtb: $(src)/dts/%.dts FORCE
52 $(call if_changed_dep,dtc)
53
54$(obj)/dtbs: $(addprefix $(obj)/, $(dtb-y))
55
56install: 34install:
57 sh $(srctree)/$(src)/install.sh $(KERNELRELEASE) $(BOOTIMAGE) System.map "$(INSTALL_PATH)" 35 sh $(srctree)/$(src)/install.sh $(KERNELRELEASE) $(BOOTIMAGE) System.map "$(INSTALL_PATH)"
diff --git a/arch/nios2/boot/dts/Makefile b/arch/nios2/boot/dts/Makefile
new file mode 100644
index 000000000000..a91a0b09be63
--- /dev/null
+++ b/arch/nios2/boot/dts/Makefile
@@ -0,0 +1,6 @@
1# SPDX-License-Identifier: GPL-2.0
2
3obj-y := $(patsubst "%.dts",%.dtb.o,$(CONFIG_NIOS2_DTB_SOURCE))
4
5dtstree := $(srctree)/$(src)
6dtb-$(CONFIG_OF_ALL_DTBS) := $(patsubst $(dtstree)/%.dts,%.dtb, $(wildcard $(dtstree)/*.dts))
diff --git a/arch/nios2/boot/linked_dtb.S b/arch/nios2/boot/linked_dtb.S
deleted file mode 100644
index 071f922db338..000000000000
--- a/arch/nios2/boot/linked_dtb.S
+++ /dev/null
@@ -1,19 +0,0 @@
1/*
2 * Copyright (C) 2011 Thomas Chou <thomas@wytron.com.tw>
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
16 *
17 */
18.section .dtb.init.rodata,"a"
19.incbin "arch/nios2/boot/system.dtb"
diff --git a/arch/nios2/kernel/cpuinfo.c b/arch/nios2/kernel/cpuinfo.c
index 93207718bb22..ccc1d2a15a0a 100644
--- a/arch/nios2/kernel/cpuinfo.c
+++ b/arch/nios2/kernel/cpuinfo.c
@@ -47,7 +47,7 @@ void __init setup_cpuinfo(void)
47 const char *str; 47 const char *str;
48 int len; 48 int len;
49 49
50 cpu = of_find_node_by_type(NULL, "cpu"); 50 cpu = of_get_cpu_node(0, NULL);
51 if (!cpu) 51 if (!cpu)
52 panic("%s: No CPU found in devicetree!\n", __func__); 52 panic("%s: No CPU found in devicetree!\n", __func__);
53 53
@@ -120,6 +120,8 @@ void __init setup_cpuinfo(void)
120 cpuinfo.reset_addr = fcpu(cpu, "altr,reset-addr"); 120 cpuinfo.reset_addr = fcpu(cpu, "altr,reset-addr");
121 cpuinfo.exception_addr = fcpu(cpu, "altr,exception-addr"); 121 cpuinfo.exception_addr = fcpu(cpu, "altr,exception-addr");
122 cpuinfo.fast_tlb_miss_exc_addr = fcpu(cpu, "altr,fast-tlb-miss-addr"); 122 cpuinfo.fast_tlb_miss_exc_addr = fcpu(cpu, "altr,fast-tlb-miss-addr");
123
124 of_node_put(cpu);
123} 125}
124 126
125#ifdef CONFIG_PROC_FS 127#ifdef CONFIG_PROC_FS
diff --git a/arch/nios2/kernel/time.c b/arch/nios2/kernel/time.c
index ab88b6dd4679..54467d0085a1 100644
--- a/arch/nios2/kernel/time.c
+++ b/arch/nios2/kernel/time.c
@@ -214,12 +214,12 @@ static int __init nios2_timer_get_base_and_freq(struct device_node *np,
214{ 214{
215 *base = of_iomap(np, 0); 215 *base = of_iomap(np, 0);
216 if (!*base) { 216 if (!*base) {
217 pr_crit("Unable to map reg for %s\n", np->name); 217 pr_crit("Unable to map reg for %pOFn\n", np);
218 return -ENXIO; 218 return -ENXIO;
219 } 219 }
220 220
221 if (of_property_read_u32(np, "clock-frequency", freq)) { 221 if (of_property_read_u32(np, "clock-frequency", freq)) {
222 pr_crit("Unable to get %s clock frequency\n", np->name); 222 pr_crit("Unable to get %pOFn clock frequency\n", np);
223 return -EINVAL; 223 return -EINVAL;
224 } 224 }
225 225
diff --git a/arch/openrisc/kernel/setup.c b/arch/openrisc/kernel/setup.c
index 9d28ab14d139..e17fcd83120f 100644
--- a/arch/openrisc/kernel/setup.c
+++ b/arch/openrisc/kernel/setup.c
@@ -158,9 +158,8 @@ static struct device_node *setup_find_cpu_node(int cpu)
158{ 158{
159 u32 hwid; 159 u32 hwid;
160 struct device_node *cpun; 160 struct device_node *cpun;
161 struct device_node *cpus = of_find_node_by_path("/cpus");
162 161
163 for_each_available_child_of_node(cpus, cpun) { 162 for_each_of_cpu_node(cpun) {
164 if (of_property_read_u32(cpun, "reg", &hwid)) 163 if (of_property_read_u32(cpun, "reg", &hwid))
165 continue; 164 continue;
166 if (hwid == cpu) 165 if (hwid == cpu)
diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile
index 11a1acba164a..42f225f6ec93 100644
--- a/arch/powerpc/Makefile
+++ b/arch/powerpc/Makefile
@@ -293,9 +293,6 @@ $(BOOT_TARGETS2): vmlinux
293bootwrapper_install: 293bootwrapper_install:
294 $(Q)$(MAKE) $(build)=$(boot) $(patsubst %,$(boot)/%,$@) 294 $(Q)$(MAKE) $(build)=$(boot) $(patsubst %,$(boot)/%,$@)
295 295
296%.dtb: scripts
297 $(Q)$(MAKE) $(build)=$(boot) $(patsubst %,$(boot)/%,$@)
298
299# Used to create 'merged defconfigs' 296# Used to create 'merged defconfigs'
300# To use it $(call) it with the first argument as the base defconfig 297# To use it $(call) it with the first argument as the base defconfig
301# and the second argument as a space separated list of .config files to merge, 298# and the second argument as a space separated list of .config files to merge,
diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile
index 0fb96c26136f..bca5c23767df 100644
--- a/arch/powerpc/boot/Makefile
+++ b/arch/powerpc/boot/Makefile
@@ -304,9 +304,9 @@ image-$(CONFIG_PPC_ADDER875) += cuImage.adder875-uboot \
304 dtbImage.adder875-redboot 304 dtbImage.adder875-redboot
305 305
306# Board ports in arch/powerpc/platform/52xx/Kconfig 306# Board ports in arch/powerpc/platform/52xx/Kconfig
307image-$(CONFIG_PPC_LITE5200) += cuImage.lite5200 lite5200.dtb 307image-$(CONFIG_PPC_LITE5200) += cuImage.lite5200
308image-$(CONFIG_PPC_LITE5200) += cuImage.lite5200b lite5200b.dtb 308image-$(CONFIG_PPC_LITE5200) += cuImage.lite5200b
309image-$(CONFIG_PPC_MEDIA5200) += cuImage.media5200 media5200.dtb 309image-$(CONFIG_PPC_MEDIA5200) += cuImage.media5200
310 310
311# Board ports in arch/powerpc/platform/82xx/Kconfig 311# Board ports in arch/powerpc/platform/82xx/Kconfig
312image-$(CONFIG_MPC8272_ADS) += cuImage.mpc8272ads 312image-$(CONFIG_MPC8272_ADS) += cuImage.mpc8272ads
@@ -381,11 +381,11 @@ $(addprefix $(obj)/, $(sort $(filter zImage.%, $(image-y)))): vmlinux $(wrapperb
381 $(call if_changed,wrap,$(subst $(obj)/zImage.,,$@)) 381 $(call if_changed,wrap,$(subst $(obj)/zImage.,,$@))
382 382
383# dtbImage% - a dtbImage is a zImage with an embedded device tree blob 383# dtbImage% - a dtbImage is a zImage with an embedded device tree blob
384$(obj)/dtbImage.initrd.%: vmlinux $(wrapperbits) $(obj)/%.dtb FORCE 384$(obj)/dtbImage.initrd.%: vmlinux $(wrapperbits) $(obj)/dts/%.dtb FORCE
385 $(call if_changed,wrap,$*,,$(obj)/$*.dtb,$(obj)/ramdisk.image.gz) 385 $(call if_changed,wrap,$*,,$(obj)/dts/$*.dtb,$(obj)/ramdisk.image.gz)
386 386
387$(obj)/dtbImage.%: vmlinux $(wrapperbits) $(obj)/%.dtb FORCE 387$(obj)/dtbImage.%: vmlinux $(wrapperbits) $(obj)/dts/%.dtb FORCE
388 $(call if_changed,wrap,$*,,$(obj)/$*.dtb) 388 $(call if_changed,wrap,$*,,$(obj)/dts/$*.dtb)
389 389
390# This cannot be in the root of $(src) as the zImage rule always adds a $(obj) 390# This cannot be in the root of $(src) as the zImage rule always adds a $(obj)
391# prefix 391# prefix
@@ -395,36 +395,33 @@ $(obj)/vmlinux.strip: vmlinux
395$(obj)/uImage: vmlinux $(wrapperbits) FORCE 395$(obj)/uImage: vmlinux $(wrapperbits) FORCE
396 $(call if_changed,wrap,uboot) 396 $(call if_changed,wrap,uboot)
397 397
398$(obj)/uImage.initrd.%: vmlinux $(obj)/%.dtb $(wrapperbits) FORCE 398$(obj)/uImage.initrd.%: vmlinux $(obj)/dts/%.dtb $(wrapperbits) FORCE
399 $(call if_changed,wrap,uboot-$*,,$(obj)/$*.dtb,$(obj)/ramdisk.image.gz) 399 $(call if_changed,wrap,uboot-$*,,$(obj)/dts/$*.dtb,$(obj)/ramdisk.image.gz)
400 400
401$(obj)/uImage.%: vmlinux $(obj)/%.dtb $(wrapperbits) FORCE 401$(obj)/uImage.%: vmlinux $(obj)/dts/%.dtb $(wrapperbits) FORCE
402 $(call if_changed,wrap,uboot-$*,,$(obj)/$*.dtb) 402 $(call if_changed,wrap,uboot-$*,,$(obj)/dts/$*.dtb)
403 403
404$(obj)/cuImage.initrd.%: vmlinux $(obj)/%.dtb $(wrapperbits) FORCE 404$(obj)/cuImage.initrd.%: vmlinux $(obj)/dts/%.dtb $(wrapperbits) FORCE
405 $(call if_changed,wrap,cuboot-$*,,$(obj)/$*.dtb,$(obj)/ramdisk.image.gz) 405 $(call if_changed,wrap,cuboot-$*,,$(obj)/dts/$*.dtb,$(obj)/ramdisk.image.gz)
406 406
407$(obj)/cuImage.%: vmlinux $(obj)/%.dtb $(wrapperbits) FORCE 407$(obj)/cuImage.%: vmlinux $(obj)/dts/%.dtb $(wrapperbits) FORCE
408 $(call if_changed,wrap,cuboot-$*,,$(obj)/$*.dtb) 408 $(call if_changed,wrap,cuboot-$*,,$(obj)/dts/$*.dtb)
409 409
410$(obj)/simpleImage.initrd.%: vmlinux $(obj)/%.dtb $(wrapperbits) FORCE 410$(obj)/simpleImage.initrd.%: vmlinux $(obj)/dts/%.dtb $(wrapperbits) FORCE
411 $(call if_changed,wrap,simpleboot-$*,,$(obj)/$*.dtb,$(obj)/ramdisk.image.gz) 411 $(call if_changed,wrap,simpleboot-$*,,$(obj)/dts/$*.dtb,$(obj)/ramdisk.image.gz)
412 412
413$(obj)/simpleImage.%: vmlinux $(obj)/%.dtb $(wrapperbits) FORCE 413$(obj)/simpleImage.%: vmlinux $(obj)/dts/%.dtb $(wrapperbits) FORCE
414 $(call if_changed,wrap,simpleboot-$*,,$(obj)/$*.dtb) 414 $(call if_changed,wrap,simpleboot-$*,,$(obj)/dts/$*.dtb)
415 415
416$(obj)/treeImage.initrd.%: vmlinux $(obj)/%.dtb $(wrapperbits) FORCE 416$(obj)/treeImage.initrd.%: vmlinux $(obj)/dts/%.dtb $(wrapperbits) FORCE
417 $(call if_changed,wrap,treeboot-$*,,$(obj)/$*.dtb,$(obj)/ramdisk.image.gz) 417 $(call if_changed,wrap,treeboot-$*,,$(obj)/dts/$*.dtb,$(obj)/ramdisk.image.gz)
418 418
419$(obj)/treeImage.%: vmlinux $(obj)/%.dtb $(wrapperbits) FORCE 419$(obj)/treeImage.%: vmlinux $(obj)/dts/%.dtb $(wrapperbits) FORCE
420 $(call if_changed,wrap,treeboot-$*,,$(obj)/$*.dtb) 420 $(call if_changed,wrap,treeboot-$*,,$(obj)/dts/$*.dtb)
421 421
422# Rule to build device tree blobs 422# Needed for the above targets to work with dts/fsl/ files
423$(obj)/%.dtb: $(src)/dts/%.dts FORCE 423$(obj)/dts/%.dtb: $(obj)/dts/fsl/%.dtb
424 $(call if_changed_dep,dtc) 424 @cp $< $@
425
426$(obj)/%.dtb: $(src)/dts/fsl/%.dts FORCE
427 $(call if_changed_dep,dtc)
428 425
429# If there isn't a platform selected then just strip the vmlinux. 426# If there isn't a platform selected then just strip the vmlinux.
430ifeq (,$(image-y)) 427ifeq (,$(image-y))
diff --git a/arch/powerpc/boot/dts/Makefile b/arch/powerpc/boot/dts/Makefile
new file mode 100644
index 000000000000..fb335d05aae8
--- /dev/null
+++ b/arch/powerpc/boot/dts/Makefile
@@ -0,0 +1,6 @@
1# SPDX-License-Identifier: GPL-2.0
2
3subdir-y += fsl
4
5dtstree := $(srctree)/$(src)
6dtb-$(CONFIG_OF_ALL_DTBS) := $(patsubst $(dtstree)/%.dts,%.dtb, $(wildcard $(dtstree)/*.dts))
diff --git a/arch/powerpc/boot/dts/fsl/Makefile b/arch/powerpc/boot/dts/fsl/Makefile
new file mode 100644
index 000000000000..3bae982641e9
--- /dev/null
+++ b/arch/powerpc/boot/dts/fsl/Makefile
@@ -0,0 +1,4 @@
1# SPDX-License-Identifier: GPL-2.0
2
3dtstree := $(srctree)/$(src)
4dtb-$(CONFIG_OF_ALL_DTBS) := $(patsubst $(dtstree)/%.dts,%.dtb, $(wildcard $(dtstree)/*.dts))
diff --git a/arch/powerpc/boot/libfdt_env.h b/arch/powerpc/boot/libfdt_env.h
index 2a0c8b1bf147..2abc8e83b95e 100644
--- a/arch/powerpc/boot/libfdt_env.h
+++ b/arch/powerpc/boot/libfdt_env.h
@@ -5,6 +5,8 @@
5#include <types.h> 5#include <types.h>
6#include <string.h> 6#include <string.h>
7 7
8#define INT_MAX ((int)(~0U>>1))
9
8#include "of.h" 10#include "of.h"
9 11
10typedef unsigned long uintptr_t; 12typedef unsigned long uintptr_t;
diff --git a/arch/powerpc/platforms/4xx/soc.c b/arch/powerpc/platforms/4xx/soc.c
index 5e36508b2a70..1844bf502fcf 100644
--- a/arch/powerpc/platforms/4xx/soc.c
+++ b/arch/powerpc/platforms/4xx/soc.c
@@ -200,7 +200,7 @@ void ppc4xx_reset_system(char *cmd)
200 u32 reset_type = DBCR0_RST_SYSTEM; 200 u32 reset_type = DBCR0_RST_SYSTEM;
201 const u32 *prop; 201 const u32 *prop;
202 202
203 np = of_find_node_by_type(NULL, "cpu"); 203 np = of_get_cpu_node(0, NULL);
204 if (np) { 204 if (np) {
205 prop = of_get_property(np, "reset-type", NULL); 205 prop = of_get_property(np, "reset-type", NULL);
206 206
diff --git a/arch/powerpc/platforms/8xx/m8xx_setup.c b/arch/powerpc/platforms/8xx/m8xx_setup.c
index 027c42d8966c..f1c805c8adbc 100644
--- a/arch/powerpc/platforms/8xx/m8xx_setup.c
+++ b/arch/powerpc/platforms/8xx/m8xx_setup.c
@@ -66,7 +66,7 @@ static int __init get_freq(char *name, unsigned long *val)
66 int found = 0; 66 int found = 0;
67 67
68 /* The cpu node should have timebase and clock frequency properties */ 68 /* The cpu node should have timebase and clock frequency properties */
69 cpu = of_find_node_by_type(NULL, "cpu"); 69 cpu = of_get_cpu_node(0, NULL);
70 70
71 if (cpu) { 71 if (cpu) {
72 fp = of_get_property(cpu, name, NULL); 72 fp = of_get_property(cpu, name, NULL);
@@ -147,8 +147,9 @@ void __init mpc8xx_calibrate_decr(void)
147 * we have to enable the timebase). The decrementer interrupt 147 * we have to enable the timebase). The decrementer interrupt
148 * is wired into the vector table, nothing to do here for that. 148 * is wired into the vector table, nothing to do here for that.
149 */ 149 */
150 cpu = of_find_node_by_type(NULL, "cpu"); 150 cpu = of_get_cpu_node(0, NULL);
151 virq= irq_of_parse_and_map(cpu, 0); 151 virq= irq_of_parse_and_map(cpu, 0);
152 of_node_put(cpu);
152 irq = virq_to_hw(virq); 153 irq = virq_to_hw(virq);
153 154
154 sys_tmr2 = immr_map(im_sit); 155 sys_tmr2 = immr_map(im_sit);
diff --git a/arch/powerpc/platforms/powermac/feature.c b/arch/powerpc/platforms/powermac/feature.c
index 4eb8cb38fc69..ed2f54b3f173 100644
--- a/arch/powerpc/platforms/powermac/feature.c
+++ b/arch/powerpc/platforms/powermac/feature.c
@@ -1049,7 +1049,6 @@ core99_reset_cpu(struct device_node *node, long param, long value)
1049 unsigned long flags; 1049 unsigned long flags;
1050 struct macio_chip *macio; 1050 struct macio_chip *macio;
1051 struct device_node *np; 1051 struct device_node *np;
1052 struct device_node *cpus;
1053 const int dflt_reset_lines[] = { KL_GPIO_RESET_CPU0, 1052 const int dflt_reset_lines[] = { KL_GPIO_RESET_CPU0,
1054 KL_GPIO_RESET_CPU1, 1053 KL_GPIO_RESET_CPU1,
1055 KL_GPIO_RESET_CPU2, 1054 KL_GPIO_RESET_CPU2,
@@ -1059,10 +1058,7 @@ core99_reset_cpu(struct device_node *node, long param, long value)
1059 if (macio->type != macio_keylargo) 1058 if (macio->type != macio_keylargo)
1060 return -ENODEV; 1059 return -ENODEV;
1061 1060
1062 cpus = of_find_node_by_path("/cpus"); 1061 for_each_of_cpu_node(np) {
1063 if (cpus == NULL)
1064 return -ENODEV;
1065 for (np = cpus->child; np != NULL; np = np->sibling) {
1066 const u32 *num = of_get_property(np, "reg", NULL); 1062 const u32 *num = of_get_property(np, "reg", NULL);
1067 const u32 *rst = of_get_property(np, "soft-reset", NULL); 1063 const u32 *rst = of_get_property(np, "soft-reset", NULL);
1068 if (num == NULL || rst == NULL) 1064 if (num == NULL || rst == NULL)
@@ -1072,7 +1068,6 @@ core99_reset_cpu(struct device_node *node, long param, long value)
1072 break; 1068 break;
1073 } 1069 }
1074 } 1070 }
1075 of_node_put(cpus);
1076 if (np == NULL || reset_io == 0) 1071 if (np == NULL || reset_io == 0)
1077 reset_io = dflt_reset_lines[param]; 1072 reset_io = dflt_reset_lines[param];
1078 1073
@@ -1504,16 +1499,12 @@ static long g5_reset_cpu(struct device_node *node, long param, long value)
1504 unsigned long flags; 1499 unsigned long flags;
1505 struct macio_chip *macio; 1500 struct macio_chip *macio;
1506 struct device_node *np; 1501 struct device_node *np;
1507 struct device_node *cpus;
1508 1502
1509 macio = &macio_chips[0]; 1503 macio = &macio_chips[0];
1510 if (macio->type != macio_keylargo2 && macio->type != macio_shasta) 1504 if (macio->type != macio_keylargo2 && macio->type != macio_shasta)
1511 return -ENODEV; 1505 return -ENODEV;
1512 1506
1513 cpus = of_find_node_by_path("/cpus"); 1507 for_each_of_cpu_node(np) {
1514 if (cpus == NULL)
1515 return -ENODEV;
1516 for (np = cpus->child; np != NULL; np = np->sibling) {
1517 const u32 *num = of_get_property(np, "reg", NULL); 1508 const u32 *num = of_get_property(np, "reg", NULL);
1518 const u32 *rst = of_get_property(np, "soft-reset", NULL); 1509 const u32 *rst = of_get_property(np, "soft-reset", NULL);
1519 if (num == NULL || rst == NULL) 1510 if (num == NULL || rst == NULL)
@@ -1523,7 +1514,6 @@ static long g5_reset_cpu(struct device_node *node, long param, long value)
1523 break; 1514 break;
1524 } 1515 }
1525 } 1516 }
1526 of_node_put(cpus);
1527 if (np == NULL || reset_io == 0) 1517 if (np == NULL || reset_io == 0)
1528 return -ENODEV; 1518 return -ENODEV;
1529 1519
@@ -2515,31 +2505,26 @@ found:
2515 * supposed to be set when not supported, but I'm not very confident 2505 * supposed to be set when not supported, but I'm not very confident
2516 * that all Apple OF revs did it properly, I do it the paranoid way. 2506 * that all Apple OF revs did it properly, I do it the paranoid way.
2517 */ 2507 */
2518 while (uninorth_base && uninorth_rev > 3) { 2508 if (uninorth_base && uninorth_rev > 3) {
2519 struct device_node *cpus = of_find_node_by_path("/cpus");
2520 struct device_node *np; 2509 struct device_node *np;
2521 2510
2522 if (!cpus || !cpus->child) { 2511 for_each_of_cpu_node(np) {
2523 printk(KERN_WARNING "Can't find CPU(s) in device tree !\n"); 2512 int cpu_count = 1;
2524 of_node_put(cpus); 2513
2525 break; 2514 /* Nap mode not supported on SMP */
2526 } 2515 if (of_get_property(np, "flush-on-lock", NULL) ||
2527 np = cpus->child; 2516 (cpu_count > 1)) {
2528 /* Nap mode not supported on SMP */ 2517 powersave_nap = 0;
2529 if (np->sibling) { 2518 of_node_put(np);
2530 of_node_put(cpus); 2519 break;
2531 break; 2520 }
2532 } 2521
2533 /* Nap mode not supported if flush-on-lock property is present */ 2522 cpu_count++;
2534 if (of_get_property(np, "flush-on-lock", NULL)) { 2523 powersave_nap = 1;
2535 of_node_put(cpus);
2536 break;
2537 } 2524 }
2538 of_node_put(cpus);
2539 powersave_nap = 1;
2540 printk(KERN_DEBUG "Processor NAP mode on idle enabled.\n");
2541 break;
2542 } 2525 }
2526 if (powersave_nap)
2527 printk(KERN_DEBUG "Processor NAP mode on idle enabled.\n");
2543 2528
2544 /* On CPUs that support it (750FX), lowspeed by default during 2529 /* On CPUs that support it (750FX), lowspeed by default during
2545 * NAP mode 2530 * NAP mode
diff --git a/arch/powerpc/platforms/powermac/setup.c b/arch/powerpc/platforms/powermac/setup.c
index 3a529fcdae97..2f00e3daafb0 100644
--- a/arch/powerpc/platforms/powermac/setup.c
+++ b/arch/powerpc/platforms/powermac/setup.c
@@ -243,10 +243,9 @@ static void __init l2cr_init(void)
243{ 243{
244 /* Checks "l2cr-value" property in the registry */ 244 /* Checks "l2cr-value" property in the registry */
245 if (cpu_has_feature(CPU_FTR_L2CR)) { 245 if (cpu_has_feature(CPU_FTR_L2CR)) {
246 struct device_node *np = of_find_node_by_name(NULL, "cpus"); 246 struct device_node *np;
247 if (!np) 247
248 np = of_find_node_by_type(NULL, "cpu"); 248 for_each_of_cpu_node(np) {
249 if (np) {
250 const unsigned int *l2cr = 249 const unsigned int *l2cr =
251 of_get_property(np, "l2cr-value", NULL); 250 of_get_property(np, "l2cr-value", NULL);
252 if (l2cr) { 251 if (l2cr) {
@@ -256,6 +255,7 @@ static void __init l2cr_init(void)
256 _set_L2CR(ppc_override_l2cr_value); 255 _set_L2CR(ppc_override_l2cr_value);
257 } 256 }
258 of_node_put(np); 257 of_node_put(np);
258 break;
259 } 259 }
260 } 260 }
261 261
@@ -279,8 +279,8 @@ static void __init pmac_setup_arch(void)
279 /* Set loops_per_jiffy to a half-way reasonable value, 279 /* Set loops_per_jiffy to a half-way reasonable value,
280 for use until calibrate_delay gets called. */ 280 for use until calibrate_delay gets called. */
281 loops_per_jiffy = 50000000 / HZ; 281 loops_per_jiffy = 50000000 / HZ;
282 cpu = of_find_node_by_type(NULL, "cpu"); 282
283 if (cpu != NULL) { 283 for_each_of_cpu_node(cpu) {
284 fp = of_get_property(cpu, "clock-frequency", NULL); 284 fp = of_get_property(cpu, "clock-frequency", NULL);
285 if (fp != NULL) { 285 if (fp != NULL) {
286 if (pvr >= 0x30 && pvr < 0x80) 286 if (pvr >= 0x30 && pvr < 0x80)
@@ -292,8 +292,9 @@ static void __init pmac_setup_arch(void)
292 else 292 else
293 /* 601, 603, etc. */ 293 /* 601, 603, etc. */
294 loops_per_jiffy = *fp / (2 * HZ); 294 loops_per_jiffy = *fp / (2 * HZ);
295 of_node_put(cpu);
296 break;
295 } 297 }
296 of_node_put(cpu);
297 } 298 }
298 299
299 /* See if newworld or oldworld */ 300 /* See if newworld or oldworld */
diff --git a/arch/sh/boards/of-generic.c b/arch/sh/boards/of-generic.c
index 26789ad28193..cde370cad4ae 100644
--- a/arch/sh/boards/of-generic.c
+++ b/arch/sh/boards/of-generic.c
@@ -64,7 +64,7 @@ static void sh_of_smp_probe(void)
64 64
65 init_cpu_possible(cpumask_of(0)); 65 init_cpu_possible(cpumask_of(0));
66 66
67 for_each_node_by_type(np, "cpu") { 67 for_each_of_cpu_node(np) {
68 const __be32 *cell = of_get_property(np, "reg", NULL); 68 const __be32 *cell = of_get_property(np, "reg", NULL);
69 u64 id = -1; 69 u64 id = -1;
70 if (cell) id = of_read_number(cell, of_n_addr_cells(np)); 70 if (cell) id = of_read_number(cell, of_n_addr_cells(np));
diff --git a/arch/sparc/include/asm/prom.h b/arch/sparc/include/asm/prom.h
index d955c8df62d6..1902db27ff4b 100644
--- a/arch/sparc/include/asm/prom.h
+++ b/arch/sparc/include/asm/prom.h
@@ -24,9 +24,6 @@
24#include <linux/atomic.h> 24#include <linux/atomic.h>
25#include <linux/irqdomain.h> 25#include <linux/irqdomain.h>
26 26
27#define OF_ROOT_NODE_ADDR_CELLS_DEFAULT 2
28#define OF_ROOT_NODE_SIZE_CELLS_DEFAULT 1
29
30#define of_compat_cmp(s1, s2, l) strncmp((s1), (s2), (l)) 27#define of_compat_cmp(s1, s2, l) strncmp((s1), (s2), (l))
31#define of_prop_cmp(s1, s2) strcasecmp((s1), (s2)) 28#define of_prop_cmp(s1, s2) strcasecmp((s1), (s2))
32#define of_node_cmp(s1, s2) strcmp((s1), (s2)) 29#define of_node_cmp(s1, s2) strcmp((s1), (s2))
diff --git a/arch/x86/kernel/devicetree.c b/arch/x86/kernel/devicetree.c
index f39f3a06c26f..7299dcbf8e85 100644
--- a/arch/x86/kernel/devicetree.c
+++ b/arch/x86/kernel/devicetree.c
@@ -140,7 +140,7 @@ static void __init dtb_cpu_setup(void)
140 int ret; 140 int ret;
141 141
142 version = GET_APIC_VERSION(apic_read(APIC_LVR)); 142 version = GET_APIC_VERSION(apic_read(APIC_LVR));
143 for_each_node_by_type(dn, "cpu") { 143 for_each_of_cpu_node(dn) {
144 ret = of_property_read_u32(dn, "reg", &apic_id); 144 ret = of_property_read_u32(dn, "reg", &apic_id);
145 if (ret < 0) { 145 if (ret < 0) {
146 pr_warn("%pOF: missing local APIC ID\n", dn); 146 pr_warn("%pOF: missing local APIC ID\n", dn);
diff --git a/arch/xtensa/Makefile b/arch/xtensa/Makefile
index d67e30faff9c..be060dfb1cc3 100644
--- a/arch/xtensa/Makefile
+++ b/arch/xtensa/Makefile
@@ -80,28 +80,18 @@ LIBGCC := $(shell $(CC) $(KBUILD_CFLAGS) -print-libgcc-file-name)
80head-y := arch/xtensa/kernel/head.o 80head-y := arch/xtensa/kernel/head.o
81core-y += arch/xtensa/kernel/ arch/xtensa/mm/ 81core-y += arch/xtensa/kernel/ arch/xtensa/mm/
82core-y += $(buildvar) $(buildplf) 82core-y += $(buildvar) $(buildplf)
83core-y += arch/xtensa/boot/dts/
83 84
84libs-y += arch/xtensa/lib/ $(LIBGCC) 85libs-y += arch/xtensa/lib/ $(LIBGCC)
85drivers-$(CONFIG_OPROFILE) += arch/xtensa/oprofile/ 86drivers-$(CONFIG_OPROFILE) += arch/xtensa/oprofile/
86 87
87ifneq ($(CONFIG_BUILTIN_DTB),"")
88core-$(CONFIG_OF) += arch/xtensa/boot/dts/
89endif
90
91boot := arch/xtensa/boot 88boot := arch/xtensa/boot
92 89
93all Image zImage uImage: vmlinux 90all Image zImage uImage: vmlinux
94 $(Q)$(MAKE) $(build)=$(boot) $@ 91 $(Q)$(MAKE) $(build)=$(boot) $@
95 92
96%.dtb:
97 $(Q)$(MAKE) $(build)=$(boot)/dts $(boot)/dts/$@
98
99dtbs: scripts
100 $(Q)$(MAKE) $(build)=$(boot)/dts
101
102define archhelp 93define archhelp
103 @echo '* Image - Kernel ELF image with reset vector' 94 @echo '* Image - Kernel ELF image with reset vector'
104 @echo '* zImage - Compressed kernel image (arch/xtensa/boot/images/zImage.*)' 95 @echo '* zImage - Compressed kernel image (arch/xtensa/boot/images/zImage.*)'
105 @echo '* uImage - U-Boot wrapped image' 96 @echo '* uImage - U-Boot wrapped image'
106 @echo ' dtbs - Build device tree blobs for enabled boards'
107endef 97endef
diff --git a/arch/xtensa/platforms/xtfpga/setup.c b/arch/xtensa/platforms/xtfpga/setup.c
index 42285f35d313..820e8738af11 100644
--- a/arch/xtensa/platforms/xtfpga/setup.c
+++ b/arch/xtensa/platforms/xtfpga/setup.c
@@ -94,7 +94,7 @@ static void __init xtfpga_clk_setup(struct device_node *np)
94 u32 freq; 94 u32 freq;
95 95
96 if (!base) { 96 if (!base) {
97 pr_err("%s: invalid address\n", np->name); 97 pr_err("%pOFn: invalid address\n", np);
98 return; 98 return;
99 } 99 }
100 100
@@ -103,12 +103,12 @@ static void __init xtfpga_clk_setup(struct device_node *np)
103 clk = clk_register_fixed_rate(NULL, np->name, NULL, 0, freq); 103 clk = clk_register_fixed_rate(NULL, np->name, NULL, 0, freq);
104 104
105 if (IS_ERR(clk)) { 105 if (IS_ERR(clk)) {
106 pr_err("%s: clk registration failed\n", np->name); 106 pr_err("%pOFn: clk registration failed\n", np);
107 return; 107 return;
108 } 108 }
109 109
110 if (of_clk_add_provider(np, of_clk_src_simple_get, clk)) { 110 if (of_clk_add_provider(np, of_clk_src_simple_get, clk)) {
111 pr_err("%s: clk provider registration failed\n", np->name); 111 pr_err("%pOFn: clk provider registration failed\n", np);
112 return; 112 return;
113 } 113 }
114} 114}
diff --git a/drivers/bus/fsl-mc/fsl-mc-bus.c b/drivers/bus/fsl-mc/fsl-mc-bus.c
index 439ba5c23693..f0404c6d1ff4 100644
--- a/drivers/bus/fsl-mc/fsl-mc-bus.c
+++ b/drivers/bus/fsl-mc/fsl-mc-bus.c
@@ -706,8 +706,8 @@ static int parse_mc_ranges(struct device *dev,
706 *ranges_start = of_get_property(mc_node, "ranges", &ranges_len); 706 *ranges_start = of_get_property(mc_node, "ranges", &ranges_len);
707 if (!(*ranges_start) || !ranges_len) { 707 if (!(*ranges_start) || !ranges_len) {
708 dev_warn(dev, 708 dev_warn(dev,
709 "missing or empty ranges property for device tree node '%s'\n", 709 "missing or empty ranges property for device tree node '%pOFn'\n",
710 mc_node->name); 710 mc_node);
711 return 0; 711 return 0;
712 } 712 }
713 713
@@ -730,7 +730,7 @@ static int parse_mc_ranges(struct device *dev,
730 730
731 tuple_len = range_tuple_cell_count * sizeof(__be32); 731 tuple_len = range_tuple_cell_count * sizeof(__be32);
732 if (ranges_len % tuple_len != 0) { 732 if (ranges_len % tuple_len != 0) {
733 dev_err(dev, "malformed ranges property '%s'\n", mc_node->name); 733 dev_err(dev, "malformed ranges property '%pOFn'\n", mc_node);
734 return -EINVAL; 734 return -EINVAL;
735 } 735 }
736 736
diff --git a/drivers/bus/mvebu-mbus.c b/drivers/bus/mvebu-mbus.c
index 70db4d5638a6..5b2a11a88951 100644
--- a/drivers/bus/mvebu-mbus.c
+++ b/drivers/bus/mvebu-mbus.c
@@ -1229,7 +1229,7 @@ mbus_parse_ranges(struct device_node *node,
1229 tuple_len = (*cell_count) * sizeof(__be32); 1229 tuple_len = (*cell_count) * sizeof(__be32);
1230 1230
1231 if (ranges_len % tuple_len) { 1231 if (ranges_len % tuple_len) {
1232 pr_warn("malformed ranges entry '%s'\n", node->name); 1232 pr_warn("malformed ranges entry '%pOFn'\n", node);
1233 return -EINVAL; 1233 return -EINVAL;
1234 } 1234 }
1235 return 0; 1235 return 0;
diff --git a/drivers/clk/mvebu/clk-cpu.c b/drivers/clk/mvebu/clk-cpu.c
index 072aa38374ce..3045067448fb 100644
--- a/drivers/clk/mvebu/clk-cpu.c
+++ b/drivers/clk/mvebu/clk-cpu.c
@@ -183,7 +183,7 @@ static void __init of_cpu_clk_setup(struct device_node *node)
183 pr_warn("%s: pmu-dfs base register not set, dynamic frequency scaling not available\n", 183 pr_warn("%s: pmu-dfs base register not set, dynamic frequency scaling not available\n",
184 __func__); 184 __func__);
185 185
186 for_each_node_by_type(dn, "cpu") 186 for_each_of_cpu_node(dn)
187 ncpus++; 187 ncpus++;
188 188
189 cpuclk = kcalloc(ncpus, sizeof(*cpuclk), GFP_KERNEL); 189 cpuclk = kcalloc(ncpus, sizeof(*cpuclk), GFP_KERNEL);
@@ -194,7 +194,7 @@ static void __init of_cpu_clk_setup(struct device_node *node)
194 if (WARN_ON(!clks)) 194 if (WARN_ON(!clks))
195 goto clks_out; 195 goto clks_out;
196 196
197 for_each_node_by_type(dn, "cpu") { 197 for_each_of_cpu_node(dn) {
198 struct clk_init_data init; 198 struct clk_init_data init;
199 struct clk *clk; 199 struct clk *clk;
200 char *clk_name = kzalloc(5, GFP_KERNEL); 200 char *clk_name = kzalloc(5, GFP_KERNEL);
diff --git a/drivers/edac/cpc925_edac.c b/drivers/edac/cpc925_edac.c
index 2c98e020df05..3c0881ac9880 100644
--- a/drivers/edac/cpc925_edac.c
+++ b/drivers/edac/cpc925_edac.c
@@ -593,8 +593,7 @@ static void cpc925_mc_check(struct mem_ctl_info *mci)
593/******************** CPU err device********************************/ 593/******************** CPU err device********************************/
594static u32 cpc925_cpu_mask_disabled(void) 594static u32 cpc925_cpu_mask_disabled(void)
595{ 595{
596 struct device_node *cpus; 596 struct device_node *cpunode;
597 struct device_node *cpunode = NULL;
598 static u32 mask = 0; 597 static u32 mask = 0;
599 598
600 /* use cached value if available */ 599 /* use cached value if available */
@@ -603,20 +602,8 @@ static u32 cpc925_cpu_mask_disabled(void)
603 602
604 mask = APIMASK_ADI0 | APIMASK_ADI1; 603 mask = APIMASK_ADI0 | APIMASK_ADI1;
605 604
606 cpus = of_find_node_by_path("/cpus"); 605 for_each_of_cpu_node(cpunode) {
607 if (cpus == NULL) {
608 cpc925_printk(KERN_DEBUG, "No /cpus node !\n");
609 return 0;
610 }
611
612 while ((cpunode = of_get_next_child(cpus, cpunode)) != NULL) {
613 const u32 *reg = of_get_property(cpunode, "reg", NULL); 606 const u32 *reg = of_get_property(cpunode, "reg", NULL);
614
615 if (strcmp(cpunode->type, "cpu")) {
616 cpc925_printk(KERN_ERR, "Not a cpu node in /cpus: %s\n", cpunode->name);
617 continue;
618 }
619
620 if (reg == NULL || *reg > 2) { 607 if (reg == NULL || *reg > 2) {
621 cpc925_printk(KERN_ERR, "Bad reg value at %pOF\n", cpunode); 608 cpc925_printk(KERN_ERR, "Bad reg value at %pOF\n", cpunode);
622 continue; 609 continue;
@@ -633,9 +620,6 @@ static u32 cpc925_cpu_mask_disabled(void)
633 "Assuming PI id is equal to CPU MPIC id!\n"); 620 "Assuming PI id is equal to CPU MPIC id!\n");
634 } 621 }
635 622
636 of_node_put(cpunode);
637 of_node_put(cpus);
638
639 return mask; 623 return mask;
640} 624}
641 625
diff --git a/drivers/firmware/scpi_pm_domain.c b/drivers/firmware/scpi_pm_domain.c
index f395dec27113..390aa13391e4 100644
--- a/drivers/firmware/scpi_pm_domain.c
+++ b/drivers/firmware/scpi_pm_domain.c
@@ -121,7 +121,7 @@ static int scpi_pm_domain_probe(struct platform_device *pdev)
121 121
122 scpi_pd->domain = i; 122 scpi_pd->domain = i;
123 scpi_pd->ops = scpi_ops; 123 scpi_pd->ops = scpi_ops;
124 sprintf(scpi_pd->name, "%s.%d", np->name, i); 124 sprintf(scpi_pd->name, "%pOFn.%d", np, i);
125 scpi_pd->genpd.name = scpi_pd->name; 125 scpi_pd->genpd.name = scpi_pd->name;
126 scpi_pd->genpd.power_off = scpi_pd_power_off; 126 scpi_pd->genpd.power_off = scpi_pd_power_off;
127 scpi_pd->genpd.power_on = scpi_pd_power_on; 127 scpi_pd->genpd.power_on = scpi_pd_power_on;
diff --git a/drivers/gpu/drm/mediatek/mtk_hdmi.c b/drivers/gpu/drm/mediatek/mtk_hdmi.c
index 2d45d1dd9554..643f5edd68fe 100644
--- a/drivers/gpu/drm/mediatek/mtk_hdmi.c
+++ b/drivers/gpu/drm/mediatek/mtk_hdmi.c
@@ -1446,8 +1446,7 @@ static int mtk_hdmi_dt_parse_pdata(struct mtk_hdmi *hdmi,
1446 } 1446 }
1447 1447
1448 /* The CEC module handles HDMI hotplug detection */ 1448 /* The CEC module handles HDMI hotplug detection */
1449 cec_np = of_find_compatible_node(np->parent, NULL, 1449 cec_np = of_get_compatible_child(np->parent, "mediatek,mt8173-cec");
1450 "mediatek,mt8173-cec");
1451 if (!cec_np) { 1450 if (!cec_np) {
1452 dev_err(dev, "Failed to find CEC node\n"); 1451 dev_err(dev, "Failed to find CEC node\n");
1453 return -EINVAL; 1452 return -EINVAL;
@@ -1457,8 +1456,10 @@ static int mtk_hdmi_dt_parse_pdata(struct mtk_hdmi *hdmi,
1457 if (!cec_pdev) { 1456 if (!cec_pdev) {
1458 dev_err(hdmi->dev, "Waiting for CEC device %pOF\n", 1457 dev_err(hdmi->dev, "Waiting for CEC device %pOF\n",
1459 cec_np); 1458 cec_np);
1459 of_node_put(cec_np);
1460 return -EPROBE_DEFER; 1460 return -EPROBE_DEFER;
1461 } 1461 }
1462 of_node_put(cec_np);
1462 hdmi->cec_dev = &cec_pdev->dev; 1463 hdmi->cec_dev = &cec_pdev->dev;
1463 1464
1464 /* 1465 /*
diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
index da1363a0c54d..93d70f4a2154 100644
--- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c
+++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
@@ -633,8 +633,7 @@ static int adreno_get_legacy_pwrlevels(struct device *dev)
633 struct device_node *child, *node; 633 struct device_node *child, *node;
634 int ret; 634 int ret;
635 635
636 node = of_find_compatible_node(dev->of_node, NULL, 636 node = of_get_compatible_child(dev->of_node, "qcom,gpu-pwrlevels");
637 "qcom,gpu-pwrlevels");
638 if (!node) { 637 if (!node) {
639 dev_err(dev, "Could not find the GPU powerlevels\n"); 638 dev_err(dev, "Could not find the GPU powerlevels\n");
640 return -ENXIO; 639 return -ENXIO;
@@ -655,6 +654,8 @@ static int adreno_get_legacy_pwrlevels(struct device *dev)
655 dev_pm_opp_add(dev, val, 0); 654 dev_pm_opp_add(dev, val, 0);
656 } 655 }
657 656
657 of_node_put(node);
658
658 return 0; 659 return 0;
659} 660}
660 661
diff --git a/drivers/iommu/fsl_pamu.c b/drivers/iommu/fsl_pamu.c
index 8540625796a1..1b955aea44dd 100644
--- a/drivers/iommu/fsl_pamu.c
+++ b/drivers/iommu/fsl_pamu.c
@@ -543,7 +543,7 @@ u32 get_stash_id(u32 stash_dest_hint, u32 vcpu)
543 return ~(u32)0; 543 return ~(u32)0;
544 } 544 }
545 545
546 for_each_node_by_type(node, "cpu") { 546 for_each_of_cpu_node(node) {
547 prop = of_get_property(node, "reg", &len); 547 prop = of_get_property(node, "reg", &len);
548 for (i = 0; i < len / sizeof(u32); i++) { 548 for (i = 0; i < len / sizeof(u32); i++) {
549 if (be32_to_cpup(&prop[i]) == vcpu) { 549 if (be32_to_cpup(&prop[i]) == vcpu) {
diff --git a/drivers/net/ethernet/broadcom/genet/bcmmii.c b/drivers/net/ethernet/broadcom/genet/bcmmii.c
index 35564a8a48f9..a6cbaca37e94 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmmii.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmmii.c
@@ -341,7 +341,7 @@ static struct device_node *bcmgenet_mii_of_find_mdio(struct bcmgenet_priv *priv)
341 if (!compat) 341 if (!compat)
342 return NULL; 342 return NULL;
343 343
344 priv->mdio_dn = of_find_compatible_node(dn, NULL, compat); 344 priv->mdio_dn = of_get_compatible_child(dn, compat);
345 kfree(compat); 345 kfree(compat);
346 if (!priv->mdio_dn) { 346 if (!priv->mdio_dn) {
347 dev_err(kdev, "unable to find MDIO bus node\n"); 347 dev_err(kdev, "unable to find MDIO bus node\n");
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
index f9a61f90cfbc..0f660af01a4b 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
@@ -714,8 +714,9 @@ static int get_ephy_nodes(struct stmmac_priv *priv)
714 return -ENODEV; 714 return -ENODEV;
715 } 715 }
716 716
717 mdio_internal = of_find_compatible_node(mdio_mux, NULL, 717 mdio_internal = of_get_compatible_child(mdio_mux,
718 "allwinner,sun8i-h3-mdio-internal"); 718 "allwinner,sun8i-h3-mdio-internal");
719 of_node_put(mdio_mux);
719 if (!mdio_internal) { 720 if (!mdio_internal) {
720 dev_err(priv->device, "Cannot get internal_mdio node\n"); 721 dev_err(priv->device, "Cannot get internal_mdio node\n");
721 return -ENODEV; 722 return -ENODEV;
@@ -729,13 +730,20 @@ static int get_ephy_nodes(struct stmmac_priv *priv)
729 gmac->rst_ephy = of_reset_control_get_exclusive(iphynode, NULL); 730 gmac->rst_ephy = of_reset_control_get_exclusive(iphynode, NULL);
730 if (IS_ERR(gmac->rst_ephy)) { 731 if (IS_ERR(gmac->rst_ephy)) {
731 ret = PTR_ERR(gmac->rst_ephy); 732 ret = PTR_ERR(gmac->rst_ephy);
732 if (ret == -EPROBE_DEFER) 733 if (ret == -EPROBE_DEFER) {
734 of_node_put(iphynode);
735 of_node_put(mdio_internal);
733 return ret; 736 return ret;
737 }
734 continue; 738 continue;
735 } 739 }
736 dev_info(priv->device, "Found internal PHY node\n"); 740 dev_info(priv->device, "Found internal PHY node\n");
741 of_node_put(iphynode);
742 of_node_put(mdio_internal);
737 return 0; 743 return 0;
738 } 744 }
745
746 of_node_put(mdio_internal);
739 return -ENODEV; 747 return -ENODEV;
740} 748}
741 749
diff --git a/drivers/nfc/nfcmrvl/uart.c b/drivers/nfc/nfcmrvl/uart.c
index 91162f8e0366..9a22056e8d9e 100644
--- a/drivers/nfc/nfcmrvl/uart.c
+++ b/drivers/nfc/nfcmrvl/uart.c
@@ -73,10 +73,9 @@ static int nfcmrvl_uart_parse_dt(struct device_node *node,
73 struct device_node *matched_node; 73 struct device_node *matched_node;
74 int ret; 74 int ret;
75 75
76 matched_node = of_find_compatible_node(node, NULL, "marvell,nfc-uart"); 76 matched_node = of_get_compatible_child(node, "marvell,nfc-uart");
77 if (!matched_node) { 77 if (!matched_node) {
78 matched_node = of_find_compatible_node(node, NULL, 78 matched_node = of_get_compatible_child(node, "mrvl,nfc-uart");
79 "mrvl,nfc-uart");
80 if (!matched_node) 79 if (!matched_node)
81 return -ENODEV; 80 return -ENODEV;
82 } 81 }
diff --git a/drivers/of/base.c b/drivers/of/base.c
index 90bf7d9fa17b..13ebb16be64e 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -67,6 +67,7 @@ bool of_node_name_eq(const struct device_node *np, const char *name)
67 67
68 return (strlen(name) == len) && (strncmp(node_name, name, len) == 0); 68 return (strlen(name) == len) && (strncmp(node_name, name, len) == 0);
69} 69}
70EXPORT_SYMBOL(of_node_name_eq);
70 71
71bool of_node_name_prefix(const struct device_node *np, const char *prefix) 72bool of_node_name_prefix(const struct device_node *np, const char *prefix)
72{ 73{
@@ -75,6 +76,7 @@ bool of_node_name_prefix(const struct device_node *np, const char *prefix)
75 76
76 return strncmp(kbasename(np->full_name), prefix, strlen(prefix)) == 0; 77 return strncmp(kbasename(np->full_name), prefix, strlen(prefix)) == 0;
77} 78}
79EXPORT_SYMBOL(of_node_name_prefix);
78 80
79int of_n_addr_cells(struct device_node *np) 81int of_n_addr_cells(struct device_node *np)
80{ 82{
@@ -330,6 +332,8 @@ static bool __of_find_n_match_cpu_property(struct device_node *cpun,
330 332
331 ac = of_n_addr_cells(cpun); 333 ac = of_n_addr_cells(cpun);
332 cell = of_get_property(cpun, prop_name, &prop_len); 334 cell = of_get_property(cpun, prop_name, &prop_len);
335 if (!cell && !ac && arch_match_cpu_phys_id(cpu, 0))
336 return true;
333 if (!cell || !ac) 337 if (!cell || !ac)
334 return false; 338 return false;
335 prop_len /= sizeof(*cell) * ac; 339 prop_len /= sizeof(*cell) * ac;
@@ -390,7 +394,7 @@ struct device_node *of_get_cpu_node(int cpu, unsigned int *thread)
390{ 394{
391 struct device_node *cpun; 395 struct device_node *cpun;
392 396
393 for_each_node_by_type(cpun, "cpu") { 397 for_each_of_cpu_node(cpun) {
394 if (arch_find_n_match_cpu_physical_id(cpun, cpu, thread)) 398 if (arch_find_n_match_cpu_physical_id(cpun, cpu, thread))
395 return cpun; 399 return cpun;
396 } 400 }
@@ -745,6 +749,45 @@ struct device_node *of_get_next_available_child(const struct device_node *node,
745EXPORT_SYMBOL(of_get_next_available_child); 749EXPORT_SYMBOL(of_get_next_available_child);
746 750
747/** 751/**
752 * of_get_next_cpu_node - Iterate on cpu nodes
753 * @prev: previous child of the /cpus node, or NULL to get first
754 *
755 * Returns a cpu node pointer with refcount incremented, use of_node_put()
756 * on it when done. Returns NULL when prev is the last child. Decrements
757 * the refcount of prev.
758 */
759struct device_node *of_get_next_cpu_node(struct device_node *prev)
760{
761 struct device_node *next = NULL;
762 unsigned long flags;
763 struct device_node *node;
764
765 if (!prev)
766 node = of_find_node_by_path("/cpus");
767
768 raw_spin_lock_irqsave(&devtree_lock, flags);
769 if (prev)
770 next = prev->sibling;
771 else if (node) {
772 next = node->child;
773 of_node_put(node);
774 }
775 for (; next; next = next->sibling) {
776 if (!(of_node_name_eq(next, "cpu") ||
777 (next->type && !of_node_cmp(next->type, "cpu"))))
778 continue;
779 if (!__of_device_is_available(next))
780 continue;
781 if (of_node_get(next))
782 break;
783 }
784 of_node_put(prev);
785 raw_spin_unlock_irqrestore(&devtree_lock, flags);
786 return next;
787}
788EXPORT_SYMBOL(of_get_next_cpu_node);
789
790/**
748 * of_get_compatible_child - Find compatible child node 791 * of_get_compatible_child - Find compatible child node
749 * @parent: parent node 792 * @parent: parent node
750 * @compatible: compatible string 793 * @compatible: compatible string
@@ -2013,7 +2056,7 @@ struct device_node *of_find_next_cache_node(const struct device_node *np)
2013 /* OF on pmac has nodes instead of properties named "l2-cache" 2056 /* OF on pmac has nodes instead of properties named "l2-cache"
2014 * beneath CPU nodes. 2057 * beneath CPU nodes.
2015 */ 2058 */
2016 if (!strcmp(np->type, "cpu")) 2059 if (IS_ENABLED(CONFIG_PPC_PMAC) && !strcmp(np->type, "cpu"))
2017 for_each_child_of_node(np, child) 2060 for_each_child_of_node(np, child)
2018 if (!strcmp(child->type, "cache")) 2061 if (!strcmp(child->type, "cache"))
2019 return child; 2062 return child;
diff --git a/drivers/of/device.c b/drivers/of/device.c
index c7fa5a9697c9..0f27fad9fe94 100644
--- a/drivers/of/device.c
+++ b/drivers/of/device.c
@@ -207,7 +207,8 @@ static ssize_t of_device_get_modalias(struct device *dev, char *str, ssize_t len
207 return -ENODEV; 207 return -ENODEV;
208 208
209 /* Name & Type */ 209 /* Name & Type */
210 csize = snprintf(str, len, "of:N%sT%s", dev->of_node->name, 210 /* %p eats all alphanum characters, so %c must be used here */
211 csize = snprintf(str, len, "of:N%pOFn%c%s", dev->of_node, 'T',
211 dev->of_node->type); 212 dev->of_node->type);
212 tsize = csize; 213 tsize = csize;
213 len -= csize; 214 len -= csize;
@@ -286,7 +287,7 @@ void of_device_uevent(struct device *dev, struct kobj_uevent_env *env)
286 if ((!dev) || (!dev->of_node)) 287 if ((!dev) || (!dev->of_node))
287 return; 288 return;
288 289
289 add_uevent_var(env, "OF_NAME=%s", dev->of_node->name); 290 add_uevent_var(env, "OF_NAME=%pOFn", dev->of_node);
290 add_uevent_var(env, "OF_FULLNAME=%pOF", dev->of_node); 291 add_uevent_var(env, "OF_FULLNAME=%pOF", dev->of_node);
291 if (dev->of_node->type && strcmp("<NULL>", dev->of_node->type) != 0) 292 if (dev->of_node->type && strcmp("<NULL>", dev->of_node->type) != 0)
292 add_uevent_var(env, "OF_TYPE=%s", dev->of_node->type); 293 add_uevent_var(env, "OF_TYPE=%s", dev->of_node->type);
diff --git a/drivers/of/of_mdio.c b/drivers/of/of_mdio.c
index e92391d6d1bd..5ad1342f5682 100644
--- a/drivers/of/of_mdio.c
+++ b/drivers/of/of_mdio.c
@@ -97,8 +97,8 @@ static int of_mdiobus_register_phy(struct mii_bus *mdio,
97 return rc; 97 return rc;
98 } 98 }
99 99
100 dev_dbg(&mdio->dev, "registered phy %s at address %i\n", 100 dev_dbg(&mdio->dev, "registered phy %pOFn at address %i\n",
101 child->name, addr); 101 child, addr);
102 return 0; 102 return 0;
103} 103}
104 104
@@ -127,8 +127,8 @@ static int of_mdiobus_register_device(struct mii_bus *mdio,
127 return rc; 127 return rc;
128 } 128 }
129 129
130 dev_dbg(&mdio->dev, "registered mdio device %s at address %i\n", 130 dev_dbg(&mdio->dev, "registered mdio device %pOFn at address %i\n",
131 child->name, addr); 131 child, addr);
132 return 0; 132 return 0;
133} 133}
134 134
@@ -263,8 +263,8 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np)
263 continue; 263 continue;
264 264
265 /* be noisy to encourage people to set reg property */ 265 /* be noisy to encourage people to set reg property */
266 dev_info(&mdio->dev, "scan phy %s at address %i\n", 266 dev_info(&mdio->dev, "scan phy %pOFn at address %i\n",
267 child->name, addr); 267 child, addr);
268 268
269 if (of_mdiobus_child_is_phy(child)) { 269 if (of_mdiobus_child_is_phy(child)) {
270 rc = of_mdiobus_register_phy(mdio, child, addr); 270 rc = of_mdiobus_register_phy(mdio, child, addr);
diff --git a/drivers/of/of_numa.c b/drivers/of/of_numa.c
index 27d9b4bba535..35c64a4295e0 100644
--- a/drivers/of/of_numa.c
+++ b/drivers/of/of_numa.c
@@ -24,18 +24,9 @@ static void __init of_numa_parse_cpu_nodes(void)
24{ 24{
25 u32 nid; 25 u32 nid;
26 int r; 26 int r;
27 struct device_node *cpus; 27 struct device_node *np;
28 struct device_node *np = NULL;
29
30 cpus = of_find_node_by_path("/cpus");
31 if (!cpus)
32 return;
33
34 for_each_child_of_node(cpus, np) {
35 /* Skip things that are not CPUs */
36 if (of_node_cmp(np->type, "cpu") != 0)
37 continue;
38 28
29 for_each_of_cpu_node(np) {
39 r = of_property_read_u32(np, "numa-node-id", &nid); 30 r = of_property_read_u32(np, "numa-node-id", &nid);
40 if (r) 31 if (r)
41 continue; 32 continue;
@@ -46,8 +37,6 @@ static void __init of_numa_parse_cpu_nodes(void)
46 else 37 else
47 node_set(nid, numa_nodes_parsed); 38 node_set(nid, numa_nodes_parsed);
48 } 39 }
49
50 of_node_put(cpus);
51} 40}
52 41
53static int __init of_numa_parse_memory_nodes(void) 42static int __init of_numa_parse_memory_nodes(void)
@@ -163,8 +152,8 @@ int of_node_to_nid(struct device_node *device)
163 np = of_get_next_parent(np); 152 np = of_get_next_parent(np);
164 } 153 }
165 if (np && r) 154 if (np && r)
166 pr_warn("Invalid \"numa-node-id\" property in node %s\n", 155 pr_warn("Invalid \"numa-node-id\" property in node %pOFn\n",
167 np->name); 156 np);
168 of_node_put(np); 157 of_node_put(np);
169 158
170 /* 159 /*
diff --git a/drivers/of/of_private.h b/drivers/of/of_private.h
index 216175d11d3d..5d1567025358 100644
--- a/drivers/of/of_private.h
+++ b/drivers/of/of_private.h
@@ -27,6 +27,14 @@ struct alias_prop {
27 char stem[0]; 27 char stem[0];
28}; 28};
29 29
30#if defined(CONFIG_SPARC)
31#define OF_ROOT_NODE_ADDR_CELLS_DEFAULT 2
32#else
33#define OF_ROOT_NODE_ADDR_CELLS_DEFAULT 1
34#endif
35
36#define OF_ROOT_NODE_SIZE_CELLS_DEFAULT 1
37
30extern struct mutex of_mutex; 38extern struct mutex of_mutex;
31extern struct list_head aliases_lookup; 39extern struct list_head aliases_lookup;
32extern struct kset *of_kset; 40extern struct kset *of_kset;
diff --git a/drivers/of/overlay.c b/drivers/of/overlay.c
index eda57ef12fd0..42b1f73ac5f6 100644
--- a/drivers/of/overlay.c
+++ b/drivers/of/overlay.c
@@ -425,8 +425,8 @@ static int build_changeset_next_level(struct overlay_changeset *ovcs,
425 for_each_child_of_node(overlay_node, child) { 425 for_each_child_of_node(overlay_node, child) {
426 ret = add_changeset_node(ovcs, target_node, child); 426 ret = add_changeset_node(ovcs, target_node, child);
427 if (ret) { 427 if (ret) {
428 pr_debug("Failed to apply node @%pOF/%s, err=%d\n", 428 pr_debug("Failed to apply node @%pOF/%pOFn, err=%d\n",
429 target_node, child->name, ret); 429 target_node, child, ret);
430 of_node_put(child); 430 of_node_put(child);
431 return ret; 431 return ret;
432 } 432 }
diff --git a/drivers/of/platform.c b/drivers/of/platform.c
index 6c59673933e9..04ad312fd85b 100644
--- a/drivers/of/platform.c
+++ b/drivers/of/platform.c
@@ -91,8 +91,8 @@ static void of_device_make_bus_id(struct device *dev)
91 */ 91 */
92 reg = of_get_property(node, "reg", NULL); 92 reg = of_get_property(node, "reg", NULL);
93 if (reg && (addr = of_translate_address(node, reg)) != OF_BAD_ADDR) { 93 if (reg && (addr = of_translate_address(node, reg)) != OF_BAD_ADDR) {
94 dev_set_name(dev, dev_name(dev) ? "%llx.%s:%s" : "%llx.%s", 94 dev_set_name(dev, dev_name(dev) ? "%llx.%pOFn:%s" : "%llx.%pOFn",
95 (unsigned long long)addr, node->name, 95 (unsigned long long)addr, node,
96 dev_name(dev)); 96 dev_name(dev));
97 return; 97 return;
98 } 98 }
@@ -142,8 +142,8 @@ struct platform_device *of_device_alloc(struct device_node *np,
142 WARN_ON(rc); 142 WARN_ON(rc);
143 } 143 }
144 if (of_irq_to_resource_table(np, res, num_irq) != num_irq) 144 if (of_irq_to_resource_table(np, res, num_irq) != num_irq)
145 pr_debug("not all legacy IRQ resources mapped for %s\n", 145 pr_debug("not all legacy IRQ resources mapped for %pOFn\n",
146 np->name); 146 np);
147 } 147 }
148 148
149 dev->dev.of_node = of_node_get(np); 149 dev->dev.of_node = of_node_get(np);
diff --git a/drivers/of/unittest-data/overlay_15.dts b/drivers/of/unittest-data/overlay_15.dts
index b98f2514df4b..5728490474f6 100644
--- a/drivers/of/unittest-data/overlay_15.dts
+++ b/drivers/of/unittest-data/overlay_15.dts
@@ -20,8 +20,8 @@
20 #size-cells = <0>; 20 #size-cells = <0>;
21 reg = <0>; 21 reg = <0>;
22 22
23 test-mux-dev { 23 test-mux-dev@20 {
24 reg = <32>; 24 reg = <0x20>;
25 compatible = "unittest-i2c-dev"; 25 compatible = "unittest-i2c-dev";
26 status = "okay"; 26 status = "okay";
27 }; 27 };
diff --git a/drivers/of/unittest-data/tests-overlay.dtsi b/drivers/of/unittest-data/tests-overlay.dtsi
index 25cf397b8f6b..4ea024d908ee 100644
--- a/drivers/of/unittest-data/tests-overlay.dtsi
+++ b/drivers/of/unittest-data/tests-overlay.dtsi
@@ -103,8 +103,8 @@
103 #size-cells = <0>; 103 #size-cells = <0>;
104 reg = <0>; 104 reg = <0>;
105 105
106 test-mux-dev { 106 test-mux-dev@20 {
107 reg = <32>; 107 reg = <0x20>;
108 compatible = "unittest-i2c-dev"; 108 compatible = "unittest-i2c-dev";
109 status = "okay"; 109 status = "okay";
110 }; 110 };
diff --git a/drivers/of/unittest.c b/drivers/of/unittest.c
index 41b49716ac75..a3a6866765f2 100644
--- a/drivers/of/unittest.c
+++ b/drivers/of/unittest.c
@@ -212,8 +212,8 @@ static int __init of_unittest_check_node_linkage(struct device_node *np)
212 212
213 for_each_child_of_node(np, child) { 213 for_each_child_of_node(np, child) {
214 if (child->parent != np) { 214 if (child->parent != np) {
215 pr_err("Child node %s links to wrong parent %s\n", 215 pr_err("Child node %pOFn links to wrong parent %pOFn\n",
216 child->name, np->name); 216 child, np);
217 rc = -EINVAL; 217 rc = -EINVAL;
218 goto put_child; 218 goto put_child;
219 } 219 }
@@ -299,6 +299,10 @@ static void __init of_unittest_printf(void)
299 299
300 of_unittest_printf_one(np, "%pOF", full_name); 300 of_unittest_printf_one(np, "%pOF", full_name);
301 of_unittest_printf_one(np, "%pOFf", full_name); 301 of_unittest_printf_one(np, "%pOFf", full_name);
302 of_unittest_printf_one(np, "%pOFn", "dev");
303 of_unittest_printf_one(np, "%2pOFn", "dev");
304 of_unittest_printf_one(np, "%5pOFn", " dev");
305 of_unittest_printf_one(np, "%pOFnc", "dev:test-sub-device");
302 of_unittest_printf_one(np, "%pOFp", phandle_str); 306 of_unittest_printf_one(np, "%pOFp", phandle_str);
303 of_unittest_printf_one(np, "%pOFP", "dev@100"); 307 of_unittest_printf_one(np, "%pOFP", "dev@100");
304 of_unittest_printf_one(np, "ABC %pOFP ABC", "ABC dev@100 ABC"); 308 of_unittest_printf_one(np, "ABC %pOFP ABC", "ABC dev@100 ABC");
@@ -1046,16 +1050,16 @@ static void __init of_unittest_platform_populate(void)
1046 for_each_child_of_node(np, child) { 1050 for_each_child_of_node(np, child) {
1047 for_each_child_of_node(child, grandchild) 1051 for_each_child_of_node(child, grandchild)
1048 unittest(of_find_device_by_node(grandchild), 1052 unittest(of_find_device_by_node(grandchild),
1049 "Could not create device for node '%s'\n", 1053 "Could not create device for node '%pOFn'\n",
1050 grandchild->name); 1054 grandchild);
1051 } 1055 }
1052 1056
1053 of_platform_depopulate(&test_bus->dev); 1057 of_platform_depopulate(&test_bus->dev);
1054 for_each_child_of_node(np, child) { 1058 for_each_child_of_node(np, child) {
1055 for_each_child_of_node(child, grandchild) 1059 for_each_child_of_node(child, grandchild)
1056 unittest(!of_find_device_by_node(grandchild), 1060 unittest(!of_find_device_by_node(grandchild),
1057 "device didn't get destroyed '%s'\n", 1061 "device didn't get destroyed '%pOFn'\n",
1058 grandchild->name); 1062 grandchild);
1059 } 1063 }
1060 1064
1061 platform_device_unregister(test_bus); 1065 platform_device_unregister(test_bus);
@@ -2357,11 +2361,14 @@ static __init void of_unittest_overlay_high_level(void)
2357 } 2361 }
2358 } 2362 }
2359 2363
2360 for (np = overlay_base_root->child; np; np = np->sibling) { 2364 for_each_child_of_node(overlay_base_root, np) {
2361 if (of_get_child_by_name(of_root, np->name)) { 2365 struct device_node *base_child;
2362 unittest(0, "illegal node name in overlay_base %s", 2366 for_each_child_of_node(of_root, base_child) {
2363 np->name); 2367 if (!strcmp(np->full_name, base_child->full_name)) {
2364 return; 2368 unittest(0, "illegal node name in overlay_base %pOFn",
2369 np);
2370 return;
2371 }
2365 } 2372 }
2366 } 2373 }
2367 2374
diff --git a/drivers/power/supply/twl4030_charger.c b/drivers/power/supply/twl4030_charger.c
index 80582c8f98fa..0e202d4273fb 100644
--- a/drivers/power/supply/twl4030_charger.c
+++ b/drivers/power/supply/twl4030_charger.c
@@ -1022,12 +1022,13 @@ static int twl4030_bci_probe(struct platform_device *pdev)
1022 if (bci->dev->of_node) { 1022 if (bci->dev->of_node) {
1023 struct device_node *phynode; 1023 struct device_node *phynode;
1024 1024
1025 phynode = of_find_compatible_node(bci->dev->of_node->parent, 1025 phynode = of_get_compatible_child(bci->dev->of_node->parent,
1026 NULL, "ti,twl4030-usb"); 1026 "ti,twl4030-usb");
1027 if (phynode) { 1027 if (phynode) {
1028 bci->usb_nb.notifier_call = twl4030_bci_usb_ncb; 1028 bci->usb_nb.notifier_call = twl4030_bci_usb_ncb;
1029 bci->transceiver = devm_usb_get_phy_by_node( 1029 bci->transceiver = devm_usb_get_phy_by_node(
1030 bci->dev, phynode, &bci->usb_nb); 1030 bci->dev, phynode, &bci->usb_nb);
1031 of_node_put(phynode);
1031 if (IS_ERR(bci->transceiver)) { 1032 if (IS_ERR(bci->transceiver)) {
1032 ret = PTR_ERR(bci->transceiver); 1033 ret = PTR_ERR(bci->transceiver);
1033 if (ret == -EPROBE_DEFER) 1034 if (ret == -EPROBE_DEFER)
diff --git a/drivers/soc/dove/pmu.c b/drivers/soc/dove/pmu.c
index 5abb08ffb74d..ffc5311c0ed8 100644
--- a/drivers/soc/dove/pmu.c
+++ b/drivers/soc/dove/pmu.c
@@ -383,7 +383,7 @@ int __init dove_init_pmu(void)
383 383
384 domains_node = of_get_child_by_name(np_pmu, "domains"); 384 domains_node = of_get_child_by_name(np_pmu, "domains");
385 if (!domains_node) { 385 if (!domains_node) {
386 pr_err("%s: failed to find domains sub-node\n", np_pmu->name); 386 pr_err("%pOFn: failed to find domains sub-node\n", np_pmu);
387 return 0; 387 return 0;
388 } 388 }
389 389
@@ -396,7 +396,7 @@ int __init dove_init_pmu(void)
396 pmu->pmc_base = of_iomap(pmu->of_node, 0); 396 pmu->pmc_base = of_iomap(pmu->of_node, 0);
397 pmu->pmu_base = of_iomap(pmu->of_node, 1); 397 pmu->pmu_base = of_iomap(pmu->of_node, 1);
398 if (!pmu->pmc_base || !pmu->pmu_base) { 398 if (!pmu->pmc_base || !pmu->pmu_base) {
399 pr_err("%s: failed to map PMU\n", np_pmu->name); 399 pr_err("%pOFn: failed to map PMU\n", np_pmu);
400 iounmap(pmu->pmu_base); 400 iounmap(pmu->pmu_base);
401 iounmap(pmu->pmc_base); 401 iounmap(pmu->pmc_base);
402 kfree(pmu); 402 kfree(pmu);
@@ -414,7 +414,7 @@ int __init dove_init_pmu(void)
414 break; 414 break;
415 415
416 domain->pmu = pmu; 416 domain->pmu = pmu;
417 domain->base.name = kstrdup(np->name, GFP_KERNEL); 417 domain->base.name = kasprintf(GFP_KERNEL, "%pOFn", np);
418 if (!domain->base.name) { 418 if (!domain->base.name) {
419 kfree(domain); 419 kfree(domain);
420 break; 420 break;
@@ -444,7 +444,7 @@ int __init dove_init_pmu(void)
444 /* Loss of the interrupt controller is not a fatal error. */ 444 /* Loss of the interrupt controller is not a fatal error. */
445 parent_irq = irq_of_parse_and_map(pmu->of_node, 0); 445 parent_irq = irq_of_parse_and_map(pmu->of_node, 0);
446 if (!parent_irq) { 446 if (!parent_irq) {
447 pr_err("%s: no interrupt specified\n", np_pmu->name); 447 pr_err("%pOFn: no interrupt specified\n", np_pmu);
448 } else { 448 } else {
449 ret = dove_init_pmu_irq(pmu, parent_irq); 449 ret = dove_init_pmu_irq(pmu, parent_irq);
450 if (ret) 450 if (ret)
diff --git a/drivers/soc/fsl/qe/qe_tdm.c b/drivers/soc/fsl/qe/qe_tdm.c
index f744c214f680..f78c34647ca2 100644
--- a/drivers/soc/fsl/qe/qe_tdm.c
+++ b/drivers/soc/fsl/qe/qe_tdm.c
@@ -131,7 +131,7 @@ int ucc_of_parse_tdm(struct device_node *np, struct ucc_tdm *utdm,
131 131
132 pdev = of_find_device_by_node(np2); 132 pdev = of_find_device_by_node(np2);
133 if (!pdev) { 133 if (!pdev) {
134 pr_err("%s: failed to lookup pdev\n", np2->name); 134 pr_err("%pOFn: failed to lookup pdev\n", np2);
135 of_node_put(np2); 135 of_node_put(np2);
136 return -EINVAL; 136 return -EINVAL;
137 } 137 }
@@ -153,7 +153,7 @@ int ucc_of_parse_tdm(struct device_node *np, struct ucc_tdm *utdm,
153 pdev = of_find_device_by_node(np2); 153 pdev = of_find_device_by_node(np2);
154 if (!pdev) { 154 if (!pdev) {
155 ret = -EINVAL; 155 ret = -EINVAL;
156 pr_err("%s: failed to lookup pdev\n", np2->name); 156 pr_err("%pOFn: failed to lookup pdev\n", np2);
157 of_node_put(np2); 157 of_node_put(np2);
158 goto err_miss_siram_property; 158 goto err_miss_siram_property;
159 } 159 }
diff --git a/drivers/soc/qcom/apr.c b/drivers/soc/qcom/apr.c
index 57af8a537332..4bda793ba6ae 100644
--- a/drivers/soc/qcom/apr.c
+++ b/drivers/soc/qcom/apr.c
@@ -219,7 +219,7 @@ static int apr_add_device(struct device *dev, struct device_node *np,
219 adev->domain_id = id->domain_id; 219 adev->domain_id = id->domain_id;
220 adev->version = id->svc_version; 220 adev->version = id->svc_version;
221 if (np) 221 if (np)
222 strncpy(adev->name, np->name, APR_NAME_SIZE); 222 snprintf(adev->name, APR_NAME_SIZE, "%pOFn", np);
223 else 223 else
224 strncpy(adev->name, id->name, APR_NAME_SIZE); 224 strncpy(adev->name, id->name, APR_NAME_SIZE);
225 225
diff --git a/drivers/soc/rockchip/pm_domains.c b/drivers/soc/rockchip/pm_domains.c
index 6dff8682155f..6f86a726bb45 100644
--- a/drivers/soc/rockchip/pm_domains.c
+++ b/drivers/soc/rockchip/pm_domains.c
@@ -392,21 +392,21 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu,
392 error = of_property_read_u32(node, "reg", &id); 392 error = of_property_read_u32(node, "reg", &id);
393 if (error) { 393 if (error) {
394 dev_err(pmu->dev, 394 dev_err(pmu->dev,
395 "%s: failed to retrieve domain id (reg): %d\n", 395 "%pOFn: failed to retrieve domain id (reg): %d\n",
396 node->name, error); 396 node, error);
397 return -EINVAL; 397 return -EINVAL;
398 } 398 }
399 399
400 if (id >= pmu->info->num_domains) { 400 if (id >= pmu->info->num_domains) {
401 dev_err(pmu->dev, "%s: invalid domain id %d\n", 401 dev_err(pmu->dev, "%pOFn: invalid domain id %d\n",
402 node->name, id); 402 node, id);
403 return -EINVAL; 403 return -EINVAL;
404 } 404 }
405 405
406 pd_info = &pmu->info->domain_info[id]; 406 pd_info = &pmu->info->domain_info[id];
407 if (!pd_info) { 407 if (!pd_info) {
408 dev_err(pmu->dev, "%s: undefined domain id %d\n", 408 dev_err(pmu->dev, "%pOFn: undefined domain id %d\n",
409 node->name, id); 409 node, id);
410 return -EINVAL; 410 return -EINVAL;
411 } 411 }
412 412
@@ -424,8 +424,8 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu,
424 if (!pd->clks) 424 if (!pd->clks)
425 return -ENOMEM; 425 return -ENOMEM;
426 } else { 426 } else {
427 dev_dbg(pmu->dev, "%s: doesn't have clocks: %d\n", 427 dev_dbg(pmu->dev, "%pOFn: doesn't have clocks: %d\n",
428 node->name, pd->num_clks); 428 node, pd->num_clks);
429 pd->num_clks = 0; 429 pd->num_clks = 0;
430 } 430 }
431 431
@@ -434,8 +434,8 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu,
434 if (IS_ERR(pd->clks[i].clk)) { 434 if (IS_ERR(pd->clks[i].clk)) {
435 error = PTR_ERR(pd->clks[i].clk); 435 error = PTR_ERR(pd->clks[i].clk);
436 dev_err(pmu->dev, 436 dev_err(pmu->dev,
437 "%s: failed to get clk at index %d: %d\n", 437 "%pOFn: failed to get clk at index %d: %d\n",
438 node->name, i, error); 438 node, i, error);
439 return error; 439 return error;
440 } 440 }
441 } 441 }
@@ -486,8 +486,8 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu,
486 error = rockchip_pd_power(pd, true); 486 error = rockchip_pd_power(pd, true);
487 if (error) { 487 if (error) {
488 dev_err(pmu->dev, 488 dev_err(pmu->dev,
489 "failed to power on domain '%s': %d\n", 489 "failed to power on domain '%pOFn': %d\n",
490 node->name, error); 490 node, error);
491 goto err_unprepare_clocks; 491 goto err_unprepare_clocks;
492 } 492 }
493 493
@@ -575,24 +575,24 @@ static int rockchip_pm_add_subdomain(struct rockchip_pmu *pmu,
575 error = of_property_read_u32(parent, "reg", &idx); 575 error = of_property_read_u32(parent, "reg", &idx);
576 if (error) { 576 if (error) {
577 dev_err(pmu->dev, 577 dev_err(pmu->dev,
578 "%s: failed to retrieve domain id (reg): %d\n", 578 "%pOFn: failed to retrieve domain id (reg): %d\n",
579 parent->name, error); 579 parent, error);
580 goto err_out; 580 goto err_out;
581 } 581 }
582 parent_domain = pmu->genpd_data.domains[idx]; 582 parent_domain = pmu->genpd_data.domains[idx];
583 583
584 error = rockchip_pm_add_one_domain(pmu, np); 584 error = rockchip_pm_add_one_domain(pmu, np);
585 if (error) { 585 if (error) {
586 dev_err(pmu->dev, "failed to handle node %s: %d\n", 586 dev_err(pmu->dev, "failed to handle node %pOFn: %d\n",
587 np->name, error); 587 np, error);
588 goto err_out; 588 goto err_out;
589 } 589 }
590 590
591 error = of_property_read_u32(np, "reg", &idx); 591 error = of_property_read_u32(np, "reg", &idx);
592 if (error) { 592 if (error) {
593 dev_err(pmu->dev, 593 dev_err(pmu->dev,
594 "%s: failed to retrieve domain id (reg): %d\n", 594 "%pOFn: failed to retrieve domain id (reg): %d\n",
595 np->name, error); 595 np, error);
596 goto err_out; 596 goto err_out;
597 } 597 }
598 child_domain = pmu->genpd_data.domains[idx]; 598 child_domain = pmu->genpd_data.domains[idx];
@@ -683,16 +683,16 @@ static int rockchip_pm_domain_probe(struct platform_device *pdev)
683 for_each_available_child_of_node(np, node) { 683 for_each_available_child_of_node(np, node) {
684 error = rockchip_pm_add_one_domain(pmu, node); 684 error = rockchip_pm_add_one_domain(pmu, node);
685 if (error) { 685 if (error) {
686 dev_err(dev, "failed to handle node %s: %d\n", 686 dev_err(dev, "failed to handle node %pOFn: %d\n",
687 node->name, error); 687 node, error);
688 of_node_put(node); 688 of_node_put(node);
689 goto err_out; 689 goto err_out;
690 } 690 }
691 691
692 error = rockchip_pm_add_subdomain(pmu, node); 692 error = rockchip_pm_add_subdomain(pmu, node);
693 if (error < 0) { 693 if (error < 0) {
694 dev_err(dev, "failed to handle subdomain node %s: %d\n", 694 dev_err(dev, "failed to handle subdomain node %pOFn: %d\n",
695 node->name, error); 695 node, error);
696 of_node_put(node); 696 of_node_put(node);
697 goto err_out; 697 goto err_out;
698 } 698 }
diff --git a/drivers/soc/tegra/pmc.c b/drivers/soc/tegra/pmc.c
index 2d6f3fcf3211..acbe63e925d5 100644
--- a/drivers/soc/tegra/pmc.c
+++ b/drivers/soc/tegra/pmc.c
@@ -796,7 +796,7 @@ static void tegra_powergate_add(struct tegra_pmc *pmc, struct device_node *np)
796 796
797 id = tegra_powergate_lookup(pmc, np->name); 797 id = tegra_powergate_lookup(pmc, np->name);
798 if (id < 0) { 798 if (id < 0) {
799 pr_err("powergate lookup failed for %s: %d\n", np->name, id); 799 pr_err("powergate lookup failed for %pOFn: %d\n", np, id);
800 goto free_mem; 800 goto free_mem;
801 } 801 }
802 802
@@ -816,13 +816,13 @@ static void tegra_powergate_add(struct tegra_pmc *pmc, struct device_node *np)
816 816
817 err = tegra_powergate_of_get_clks(pg, np); 817 err = tegra_powergate_of_get_clks(pg, np);
818 if (err < 0) { 818 if (err < 0) {
819 pr_err("failed to get clocks for %s: %d\n", np->name, err); 819 pr_err("failed to get clocks for %pOFn: %d\n", np, err);
820 goto set_available; 820 goto set_available;
821 } 821 }
822 822
823 err = tegra_powergate_of_get_resets(pg, np, off); 823 err = tegra_powergate_of_get_resets(pg, np, off);
824 if (err < 0) { 824 if (err < 0) {
825 pr_err("failed to get resets for %s: %d\n", np->name, err); 825 pr_err("failed to get resets for %pOFn: %d\n", np, err);
826 goto remove_clks; 826 goto remove_clks;
827 } 827 }
828 828
@@ -851,15 +851,15 @@ static void tegra_powergate_add(struct tegra_pmc *pmc, struct device_node *np)
851 851
852 err = pm_genpd_init(&pg->genpd, NULL, off); 852 err = pm_genpd_init(&pg->genpd, NULL, off);
853 if (err < 0) { 853 if (err < 0) {
854 pr_err("failed to initialise PM domain %s: %d\n", np->name, 854 pr_err("failed to initialise PM domain %pOFn: %d\n", np,
855 err); 855 err);
856 goto remove_resets; 856 goto remove_resets;
857 } 857 }
858 858
859 err = of_genpd_add_provider_simple(np, &pg->genpd); 859 err = of_genpd_add_provider_simple(np, &pg->genpd);
860 if (err < 0) { 860 if (err < 0) {
861 pr_err("failed to add PM domain provider for %s: %d\n", 861 pr_err("failed to add PM domain provider for %pOFn: %d\n",
862 np->name, err); 862 np, err);
863 goto remove_genpd; 863 goto remove_genpd;
864 } 864 }
865 865
diff --git a/drivers/soc/ti/knav_dma.c b/drivers/soc/ti/knav_dma.c
index 224d7ddeeb76..bbd4e5bc8707 100644
--- a/drivers/soc/ti/knav_dma.c
+++ b/drivers/soc/ti/knav_dma.c
@@ -544,15 +544,15 @@ static void __iomem *pktdma_get_regs(struct knav_dma_device *dma,
544 544
545 ret = of_address_to_resource(node, index, &res); 545 ret = of_address_to_resource(node, index, &res);
546 if (ret) { 546 if (ret) {
547 dev_err(dev, "Can't translate of node(%s) address for index(%d)\n", 547 dev_err(dev, "Can't translate of node(%pOFn) address for index(%d)\n",
548 node->name, index); 548 node, index);
549 return ERR_PTR(ret); 549 return ERR_PTR(ret);
550 } 550 }
551 551
552 regs = devm_ioremap_resource(kdev->dev, &res); 552 regs = devm_ioremap_resource(kdev->dev, &res);
553 if (IS_ERR(regs)) 553 if (IS_ERR(regs))
554 dev_err(dev, "Failed to map register base for index(%d) node(%s)\n", 554 dev_err(dev, "Failed to map register base for index(%d) node(%pOFn)\n",
555 index, node->name); 555 index, node);
556 if (_size) 556 if (_size)
557 *_size = resource_size(&res); 557 *_size = resource_size(&res);
558 558
diff --git a/drivers/soc/ti/knav_qmss_queue.c b/drivers/soc/ti/knav_qmss_queue.c
index 6755f2af5619..b5d5673c255c 100644
--- a/drivers/soc/ti/knav_qmss_queue.c
+++ b/drivers/soc/ti/knav_qmss_queue.c
@@ -1382,15 +1382,15 @@ static void __iomem *knav_queue_map_reg(struct knav_device *kdev,
1382 1382
1383 ret = of_address_to_resource(node, index, &res); 1383 ret = of_address_to_resource(node, index, &res);
1384 if (ret) { 1384 if (ret) {
1385 dev_err(kdev->dev, "Can't translate of node(%s) address for index(%d)\n", 1385 dev_err(kdev->dev, "Can't translate of node(%pOFn) address for index(%d)\n",
1386 node->name, index); 1386 node, index);
1387 return ERR_PTR(ret); 1387 return ERR_PTR(ret);
1388 } 1388 }
1389 1389
1390 regs = devm_ioremap_resource(kdev->dev, &res); 1390 regs = devm_ioremap_resource(kdev->dev, &res);
1391 if (IS_ERR(regs)) 1391 if (IS_ERR(regs))
1392 dev_err(kdev->dev, "Failed to map register base for index(%d) node(%s)\n", 1392 dev_err(kdev->dev, "Failed to map register base for index(%d) node(%pOFn)\n",
1393 index, node->name); 1393 index, node);
1394 return regs; 1394 return regs;
1395} 1395}
1396 1396
diff --git a/drivers/video/fbdev/fsl-diu-fb.c b/drivers/video/fbdev/fsl-diu-fb.c
index bc9eb8afc313..332a56b6811f 100644
--- a/drivers/video/fbdev/fsl-diu-fb.c
+++ b/drivers/video/fbdev/fsl-diu-fb.c
@@ -1925,7 +1925,7 @@ static int __init fsl_diu_init(void)
1925 pr_info("Freescale Display Interface Unit (DIU) framebuffer driver\n"); 1925 pr_info("Freescale Display Interface Unit (DIU) framebuffer driver\n");
1926 1926
1927#ifdef CONFIG_NOT_COHERENT_CACHE 1927#ifdef CONFIG_NOT_COHERENT_CACHE
1928 np = of_find_node_by_type(NULL, "cpu"); 1928 np = of_get_cpu_node(0, NULL);
1929 if (!np) { 1929 if (!np) {
1930 pr_err("fsl-diu-fb: can't find 'cpu' device node\n"); 1930 pr_err("fsl-diu-fb: can't find 'cpu' device node\n");
1931 return -ENODEV; 1931 return -ENODEV;
diff --git a/include/dt-bindings/clock/exynos3250.h b/include/dt-bindings/clock/exynos3250.h
index c796ff02ceeb..fe8214017b46 100644
--- a/include/dt-bindings/clock/exynos3250.h
+++ b/include/dt-bindings/clock/exynos3250.h
@@ -1,11 +1,8 @@
1/* SPDX-License-Identifier: GPL-2.0 */
1/* 2/*
2 * Copyright (c) 2014 Samsung Electronics Co., Ltd. 3 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
3 * Author: Tomasz Figa <t.figa@samsung.com> 4 * Author: Tomasz Figa <t.figa@samsung.com>
4 * 5 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
8 *
9 * Device Tree binding constants for Samsung Exynos3250 clock controllers. 6 * Device Tree binding constants for Samsung Exynos3250 clock controllers.
10 */ 7 */
11 8
diff --git a/include/dt-bindings/clock/exynos4.h b/include/dt-bindings/clock/exynos4.h
index e9f9d400c322..5b1d68512360 100644
--- a/include/dt-bindings/clock/exynos4.h
+++ b/include/dt-bindings/clock/exynos4.h
@@ -1,13 +1,10 @@
1/* SPDX-License-Identifier: GPL-2.0 */
1/* 2/*
2 * Copyright (c) 2013 Samsung Electronics Co., Ltd. 3 * Copyright (c) 2013 Samsung Electronics Co., Ltd.
3 * Author: Andrzej Hajda <a.hajda@samsung.com> 4 * Author: Andrzej Hajda <a.hajda@samsung.com>
4 * 5 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
8 *
9 * Device Tree binding constants for Exynos4 clock controller. 6 * Device Tree binding constants for Exynos4 clock controller.
10*/ 7 */
11 8
12#ifndef _DT_BINDINGS_CLOCK_EXYNOS_4_H 9#ifndef _DT_BINDINGS_CLOCK_EXYNOS_4_H
13#define _DT_BINDINGS_CLOCK_EXYNOS_4_H 10#define _DT_BINDINGS_CLOCK_EXYNOS_4_H
diff --git a/include/dt-bindings/clock/exynos5250.h b/include/dt-bindings/clock/exynos5250.h
index 15508adcdfde..bc8a3c53a54b 100644
--- a/include/dt-bindings/clock/exynos5250.h
+++ b/include/dt-bindings/clock/exynos5250.h
@@ -1,13 +1,10 @@
1/* SPDX-License-Identifier: GPL-2.0 */
1/* 2/*
2 * Copyright (c) 2013 Samsung Electronics Co., Ltd. 3 * Copyright (c) 2013 Samsung Electronics Co., Ltd.
3 * Author: Andrzej Hajda <a.hajda@samsung.com> 4 * Author: Andrzej Hajda <a.hajda@samsung.com>
4 * 5 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
8 *
9 * Device Tree binding constants for Exynos5250 clock controller. 6 * Device Tree binding constants for Exynos5250 clock controller.
10*/ 7 */
11 8
12#ifndef _DT_BINDINGS_CLOCK_EXYNOS_5250_H 9#ifndef _DT_BINDINGS_CLOCK_EXYNOS_5250_H
13#define _DT_BINDINGS_CLOCK_EXYNOS_5250_H 10#define _DT_BINDINGS_CLOCK_EXYNOS_5250_H
diff --git a/include/dt-bindings/clock/exynos5260-clk.h b/include/dt-bindings/clock/exynos5260-clk.h
index a4bac9a1764f..98a58cbd81b2 100644
--- a/include/dt-bindings/clock/exynos5260-clk.h
+++ b/include/dt-bindings/clock/exynos5260-clk.h
@@ -1,13 +1,10 @@
1/* SPDX-License-Identifier: GPL-2.0 */
1/* 2/*
2 * Copyright (c) 2014 Samsung Electronics Co., Ltd. 3 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
3 * Author: Rahul Sharma <rahul.sharma@samsung.com> 4 * Author: Rahul Sharma <rahul.sharma@samsung.com>
4 * 5 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
8 *
9 * Provides Constants for Exynos5260 clocks. 6 * Provides Constants for Exynos5260 clocks.
10*/ 7 */
11 8
12#ifndef _DT_BINDINGS_CLK_EXYNOS5260_H 9#ifndef _DT_BINDINGS_CLK_EXYNOS5260_H
13#define _DT_BINDINGS_CLK_EXYNOS5260_H 10#define _DT_BINDINGS_CLK_EXYNOS5260_H
diff --git a/include/dt-bindings/clock/exynos5410.h b/include/dt-bindings/clock/exynos5410.h
index 6cb4e90f81fc..f179eabbcdb7 100644
--- a/include/dt-bindings/clock/exynos5410.h
+++ b/include/dt-bindings/clock/exynos5410.h
@@ -1,13 +1,10 @@
1/* SPDX-License-Identifier: GPL-2.0 */
1/* 2/*
2 * Copyright (c) 2014 Samsung Electronics Co., Ltd. 3 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
3 * Copyright (c) 2016 Krzysztof Kozlowski 4 * Copyright (c) 2016 Krzysztof Kozlowski
4 * 5 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
8 *
9 * Device Tree binding constants for Exynos5421 clock controller. 6 * Device Tree binding constants for Exynos5421 clock controller.
10*/ 7 */
11 8
12#ifndef _DT_BINDINGS_CLOCK_EXYNOS_5410_H 9#ifndef _DT_BINDINGS_CLOCK_EXYNOS_5410_H
13#define _DT_BINDINGS_CLOCK_EXYNOS_5410_H 10#define _DT_BINDINGS_CLOCK_EXYNOS_5410_H
diff --git a/include/dt-bindings/clock/exynos5420.h b/include/dt-bindings/clock/exynos5420.h
index 2740ae0424a9..355f469943f1 100644
--- a/include/dt-bindings/clock/exynos5420.h
+++ b/include/dt-bindings/clock/exynos5420.h
@@ -1,13 +1,10 @@
1/* SPDX-License-Identifier: GPL-2.0 */
1/* 2/*
2 * Copyright (c) 2013 Samsung Electronics Co., Ltd. 3 * Copyright (c) 2013 Samsung Electronics Co., Ltd.
3 * Author: Andrzej Hajda <a.hajda@samsung.com> 4 * Author: Andrzej Hajda <a.hajda@samsung.com>
4 * 5 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
8 *
9 * Device Tree binding constants for Exynos5420 clock controller. 6 * Device Tree binding constants for Exynos5420 clock controller.
10*/ 7 */
11 8
12#ifndef _DT_BINDINGS_CLOCK_EXYNOS_5420_H 9#ifndef _DT_BINDINGS_CLOCK_EXYNOS_5420_H
13#define _DT_BINDINGS_CLOCK_EXYNOS_5420_H 10#define _DT_BINDINGS_CLOCK_EXYNOS_5420_H
diff --git a/include/dt-bindings/clock/exynos5433.h b/include/dt-bindings/clock/exynos5433.h
index be39d23e6a32..98bd85ce1e45 100644
--- a/include/dt-bindings/clock/exynos5433.h
+++ b/include/dt-bindings/clock/exynos5433.h
@@ -1,10 +1,7 @@
1/* SPDX-License-Identifier: GPL-2.0 */
1/* 2/*
2 * Copyright (c) 2014 Samsung Electronics Co., Ltd. 3 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
3 * Author: Chanwoo Choi <cw00.choi@samsung.com> 4 * Author: Chanwoo Choi <cw00.choi@samsung.com>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
8 */ 5 */
9 6
10#ifndef _DT_BINDINGS_CLOCK_EXYNOS5433_H 7#ifndef _DT_BINDINGS_CLOCK_EXYNOS5433_H
diff --git a/include/dt-bindings/clock/exynos7-clk.h b/include/dt-bindings/clock/exynos7-clk.h
index 10c558611085..fce33c7050c8 100644
--- a/include/dt-bindings/clock/exynos7-clk.h
+++ b/include/dt-bindings/clock/exynos7-clk.h
@@ -1,11 +1,8 @@
1/* SPDX-License-Identifier: GPL-2.0 */
1/* 2/*
2 * Copyright (c) 2014 Samsung Electronics Co., Ltd. 3 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
3 * Author: Naveen Krishna Ch <naveenkrishna.ch@gmail.com> 4 * Author: Naveen Krishna Ch <naveenkrishna.ch@gmail.com>
4 * 5 */
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
8*/
9 6
10#ifndef _DT_BINDINGS_CLOCK_EXYNOS7_H 7#ifndef _DT_BINDINGS_CLOCK_EXYNOS7_H
11#define _DT_BINDINGS_CLOCK_EXYNOS7_H 8#define _DT_BINDINGS_CLOCK_EXYNOS7_H
diff --git a/include/dt-bindings/clock/s3c2410.h b/include/dt-bindings/clock/s3c2410.h
index 352a7673fc69..0fb65c3f2f59 100644
--- a/include/dt-bindings/clock/s3c2410.h
+++ b/include/dt-bindings/clock/s3c2410.h
@@ -1,10 +1,7 @@
1/* SPDX-License-Identifier: GPL-2.0 */
1/* 2/*
2 * Copyright (c) 2013 Heiko Stuebner <heiko@sntech.de> 3 * Copyright (c) 2013 Heiko Stuebner <heiko@sntech.de>
3 * 4 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 *
8 * Device Tree binding constants clock controllers of Samsung S3C2410 and later. 5 * Device Tree binding constants clock controllers of Samsung S3C2410 and later.
9 */ 6 */
10 7
diff --git a/include/dt-bindings/clock/s3c2412.h b/include/dt-bindings/clock/s3c2412.h
index aac1dcfda81c..b4656156cc0f 100644
--- a/include/dt-bindings/clock/s3c2412.h
+++ b/include/dt-bindings/clock/s3c2412.h
@@ -1,10 +1,7 @@
1/* SPDX-License-Identifier: GPL-2.0 */
1/* 2/*
2 * Copyright (c) 2013 Heiko Stuebner <heiko@sntech.de> 3 * Copyright (c) 2013 Heiko Stuebner <heiko@sntech.de>
3 * 4 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 *
8 * Device Tree binding constants clock controllers of Samsung S3C2412. 5 * Device Tree binding constants clock controllers of Samsung S3C2412.
9 */ 6 */
10 7
diff --git a/include/dt-bindings/clock/s3c2443.h b/include/dt-bindings/clock/s3c2443.h
index f3ba68a25ecb..a9d2f105d536 100644
--- a/include/dt-bindings/clock/s3c2443.h
+++ b/include/dt-bindings/clock/s3c2443.h
@@ -1,10 +1,7 @@
1/* SPDX-License-Identifier: GPL-2.0 */
1/* 2/*
2 * Copyright (c) 2013 Heiko Stuebner <heiko@sntech.de> 3 * Copyright (c) 2013 Heiko Stuebner <heiko@sntech.de>
3 * 4 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 *
8 * Device Tree binding constants clock controllers of Samsung S3C2443 and later. 5 * Device Tree binding constants clock controllers of Samsung S3C2443 and later.
9 */ 6 */
10 7
diff --git a/include/dt-bindings/interrupt-controller/arm-gic.h b/include/dt-bindings/interrupt-controller/arm-gic.h
index 0c85f65c81c7..35b6f69b7db6 100644
--- a/include/dt-bindings/interrupt-controller/arm-gic.h
+++ b/include/dt-bindings/interrupt-controller/arm-gic.h
@@ -1,4 +1,4 @@
1/* SPDX-License-Identifier: GPL-2.0 */ 1/* SPDX-License-Identifier: GPL-2.0 OR MIT */
2/* 2/*
3 * This header provides constants for the ARM GIC. 3 * This header provides constants for the ARM GIC.
4 */ 4 */
diff --git a/include/dt-bindings/interrupt-controller/irq.h b/include/dt-bindings/interrupt-controller/irq.h
index a8b310555f14..9e3d183e1381 100644
--- a/include/dt-bindings/interrupt-controller/irq.h
+++ b/include/dt-bindings/interrupt-controller/irq.h
@@ -1,4 +1,4 @@
1/* SPDX-License-Identifier: GPL-2.0 */ 1/* SPDX-License-Identifier: GPL-2.0 OR MIT */
2/* 2/*
3 * This header provides constants for most IRQ bindings. 3 * This header provides constants for most IRQ bindings.
4 * 4 *
diff --git a/include/dt-bindings/thermal/thermal_exynos.h b/include/dt-bindings/thermal/thermal_exynos.h
index 0646500bca69..642e4e7f4084 100644
--- a/include/dt-bindings/thermal/thermal_exynos.h
+++ b/include/dt-bindings/thermal/thermal_exynos.h
@@ -1,19 +1,9 @@
1/* SPDX-License-Identifier: GPL-2.0+ */
1/* 2/*
2 * thermal_exynos.h - Samsung EXYNOS TMU device tree definitions 3 * thermal_exynos.h - Samsung EXYNOS TMU device tree definitions
3 * 4 *
4 * Copyright (C) 2014 Samsung Electronics 5 * Copyright (C) 2014 Samsung Electronics
5 * Lukasz Majewski <l.majewski@samsung.com> 6 * Lukasz Majewski <l.majewski@samsung.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 */ 7 */
18 8
19#ifndef _EXYNOS_THERMAL_TMU_DT_H 9#ifndef _EXYNOS_THERMAL_TMU_DT_H
diff --git a/include/linux/libfdt_env.h b/include/linux/libfdt_env.h
index c6ac1fe7ec68..edb0f0c30904 100644
--- a/include/linux/libfdt_env.h
+++ b/include/linux/libfdt_env.h
@@ -2,6 +2,7 @@
2#ifndef LIBFDT_ENV_H 2#ifndef LIBFDT_ENV_H
3#define LIBFDT_ENV_H 3#define LIBFDT_ENV_H
4 4
5#include <linux/kernel.h> /* For INT_MAX */
5#include <linux/string.h> 6#include <linux/string.h>
6 7
7#include <asm/byteorder.h> 8#include <asm/byteorder.h>
diff --git a/include/linux/of.h b/include/linux/of.h
index bf577ca3c8e7..ab96025b2382 100644
--- a/include/linux/of.h
+++ b/include/linux/of.h
@@ -247,12 +247,6 @@ static inline unsigned long of_read_ulong(const __be32 *cell, int size)
247#include <asm/prom.h> 247#include <asm/prom.h>
248#endif 248#endif
249 249
250/* Default #address and #size cells. Allow arch asm/prom.h to override */
251#if !defined(OF_ROOT_NODE_ADDR_CELLS_DEFAULT)
252#define OF_ROOT_NODE_ADDR_CELLS_DEFAULT 1
253#define OF_ROOT_NODE_SIZE_CELLS_DEFAULT 1
254#endif
255
256#define OF_IS_DYNAMIC(x) test_bit(OF_DYNAMIC, &x->_flags) 250#define OF_IS_DYNAMIC(x) test_bit(OF_DYNAMIC, &x->_flags)
257#define OF_MARK_DYNAMIC(x) set_bit(OF_DYNAMIC, &x->_flags) 251#define OF_MARK_DYNAMIC(x) set_bit(OF_DYNAMIC, &x->_flags)
258 252
@@ -353,6 +347,8 @@ extern const void *of_get_property(const struct device_node *node,
353 const char *name, 347 const char *name,
354 int *lenp); 348 int *lenp);
355extern struct device_node *of_get_cpu_node(int cpu, unsigned int *thread); 349extern struct device_node *of_get_cpu_node(int cpu, unsigned int *thread);
350extern struct device_node *of_get_next_cpu_node(struct device_node *prev);
351
356#define for_each_property_of_node(dn, pp) \ 352#define for_each_property_of_node(dn, pp) \
357 for (pp = dn->properties; pp != NULL; pp = pp->next) 353 for (pp = dn->properties; pp != NULL; pp = pp->next)
358 354
@@ -758,6 +754,11 @@ static inline struct device_node *of_get_cpu_node(int cpu,
758 return NULL; 754 return NULL;
759} 755}
760 756
757static inline struct device_node *of_get_next_cpu_node(struct device_node *prev)
758{
759 return NULL;
760}
761
761static inline int of_n_addr_cells(struct device_node *np) 762static inline int of_n_addr_cells(struct device_node *np)
762{ 763{
763 return 0; 764 return 0;
@@ -1001,7 +1002,7 @@ static inline struct device_node *of_find_matching_node(
1001 1002
1002static inline const char *of_node_get_device_type(const struct device_node *np) 1003static inline const char *of_node_get_device_type(const struct device_node *np)
1003{ 1004{
1004 return of_get_property(np, "type", NULL); 1005 return of_get_property(np, "device_type", NULL);
1005} 1006}
1006 1007
1007static inline bool of_node_is_type(const struct device_node *np, const char *type) 1008static inline bool of_node_is_type(const struct device_node *np, const char *type)
@@ -1228,6 +1229,10 @@ static inline int of_property_read_s32(const struct device_node *np,
1228 for (child = of_get_next_available_child(parent, NULL); child != NULL; \ 1229 for (child = of_get_next_available_child(parent, NULL); child != NULL; \
1229 child = of_get_next_available_child(parent, child)) 1230 child = of_get_next_available_child(parent, child))
1230 1231
1232#define for_each_of_cpu_node(cpu) \
1233 for (cpu = of_get_next_cpu_node(NULL); cpu != NULL; \
1234 cpu = of_get_next_cpu_node(cpu))
1235
1231#define for_each_node_with_property(dn, prop_name) \ 1236#define for_each_node_with_property(dn, prop_name) \
1232 for (dn = of_find_node_with_property(NULL, prop_name); dn; \ 1237 for (dn = of_find_node_with_property(NULL, prop_name); dn; \
1233 dn = of_find_node_with_property(dn, prop_name)) 1238 dn = of_find_node_with_property(dn, prop_name))
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index ad4fbe5bc730..37a54a6dd594 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -1684,6 +1684,7 @@ char *device_node_string(char *buf, char *end, struct device_node *dn,
1684 fmt = "f"; 1684 fmt = "f";
1685 1685
1686 for (pass = false; strspn(fmt,"fnpPFcC"); fmt++, pass = true) { 1686 for (pass = false; strspn(fmt,"fnpPFcC"); fmt++, pass = true) {
1687 int precision;
1687 if (pass) { 1688 if (pass) {
1688 if (buf < end) 1689 if (buf < end)
1689 *buf = ':'; 1690 *buf = ':';
@@ -1695,7 +1696,11 @@ char *device_node_string(char *buf, char *end, struct device_node *dn,
1695 buf = device_node_gen_full_name(dn, buf, end); 1696 buf = device_node_gen_full_name(dn, buf, end);
1696 break; 1697 break;
1697 case 'n': /* name */ 1698 case 'n': /* name */
1698 buf = string(buf, end, dn->name, str_spec); 1699 p = kbasename(of_node_full_name(dn));
1700 precision = str_spec.precision;
1701 str_spec.precision = strchrnul(p, '@') - p;
1702 buf = string(buf, end, p, str_spec);
1703 str_spec.precision = precision;
1699 break; 1704 break;
1700 case 'p': /* phandle */ 1705 case 'p': /* phandle */
1701 buf = number(buf, end, (unsigned int)dn->phandle, num_spec); 1706 buf = number(buf, end, (unsigned int)dn->phandle, num_spec);
diff --git a/scripts/Makefile b/scripts/Makefile
index 61affa300d25..ece52ff20171 100644
--- a/scripts/Makefile
+++ b/scripts/Makefile
@@ -39,8 +39,7 @@ build_unifdef: $(obj)/unifdef
39subdir-$(CONFIG_MODVERSIONS) += genksyms 39subdir-$(CONFIG_MODVERSIONS) += genksyms
40subdir-y += mod 40subdir-y += mod
41subdir-$(CONFIG_SECURITY_SELINUX) += selinux 41subdir-$(CONFIG_SECURITY_SELINUX) += selinux
42subdir-$(CONFIG_DTC) += dtc
43subdir-$(CONFIG_GDB_SCRIPTS) += gdb 42subdir-$(CONFIG_GDB_SCRIPTS) += gdb
44 43
45# Let clean descend into subdirs 44# Let clean descend into subdirs
46subdir- += basic kconfig package gcc-plugins 45subdir- += basic dtc kconfig package gcc-plugins
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
index 61e596650ed3..8fe4468f9bda 100644
--- a/scripts/Makefile.lib
+++ b/scripts/Makefile.lib
@@ -283,7 +283,7 @@ $(obj)/%.dtb.S: $(obj)/%.dtb FORCE
283 283
284quiet_cmd_dtc = DTC $@ 284quiet_cmd_dtc = DTC $@
285cmd_dtc = mkdir -p $(dir ${dtc-tmp}) ; \ 285cmd_dtc = mkdir -p $(dir ${dtc-tmp}) ; \
286 $(CPP) $(dtc_cpp_flags) -x assembler-with-cpp -o $(dtc-tmp) $< ; \ 286 $(HOSTCC) -E $(dtc_cpp_flags) -x assembler-with-cpp -o $(dtc-tmp) $< ; \
287 $(DTC) -O dtb -o $@ -b 0 \ 287 $(DTC) -O dtb -o $@ -b 0 \
288 $(addprefix -i,$(dir $<) $(DTC_INCLUDE)) $(DTC_FLAGS) \ 288 $(addprefix -i,$(dir $<) $(DTC_INCLUDE)) $(DTC_FLAGS) \
289 -d $(depfile).dtc.tmp $(dtc-tmp) ; \ 289 -d $(depfile).dtc.tmp $(dtc-tmp) ; \
diff --git a/scripts/dtc/Makefile b/scripts/dtc/Makefile
index 1c943e03eaf2..056d5da6c477 100644
--- a/scripts/dtc/Makefile
+++ b/scripts/dtc/Makefile
@@ -1,7 +1,7 @@
1# SPDX-License-Identifier: GPL-2.0 1# SPDX-License-Identifier: GPL-2.0
2# scripts/dtc makefile 2# scripts/dtc makefile
3 3
4hostprogs-y := dtc 4hostprogs-$(CONFIG_DTC) := dtc
5always := $(hostprogs-y) 5always := $(hostprogs-y)
6 6
7dtc-objs := dtc.o flattree.o fstree.o data.o livetree.o treesource.o \ 7dtc-objs := dtc.o flattree.o fstree.o data.o livetree.o treesource.o \
@@ -11,6 +11,13 @@ dtc-objs += dtc-lexer.lex.o dtc-parser.tab.o
11# Source files need to get at the userspace version of libfdt_env.h to compile 11# Source files need to get at the userspace version of libfdt_env.h to compile
12HOST_EXTRACFLAGS := -I$(src)/libfdt 12HOST_EXTRACFLAGS := -I$(src)/libfdt
13 13
14ifeq ($(wildcard /usr/include/yaml.h),)
15HOST_EXTRACFLAGS += -DNO_YAML
16else
17dtc-objs += yamltree.o
18HOSTLDLIBS_dtc := -lyaml
19endif
20
14# Generated files need one more search path to include headers in source tree 21# Generated files need one more search path to include headers in source tree
15HOSTCFLAGS_dtc-lexer.lex.o := -I$(src) 22HOSTCFLAGS_dtc-lexer.lex.o := -I$(src)
16HOSTCFLAGS_dtc-parser.tab.o := -I$(src) 23HOSTCFLAGS_dtc-parser.tab.o := -I$(src)
diff --git a/scripts/dtc/Makefile.dtc b/scripts/dtc/Makefile.dtc
index bece49b35535..d4375630a7f7 100644
--- a/scripts/dtc/Makefile.dtc
+++ b/scripts/dtc/Makefile.dtc
@@ -14,5 +14,9 @@ DTC_SRCS = \
14 treesource.c \ 14 treesource.c \
15 util.c 15 util.c
16 16
17ifneq ($(NO_YAML),1)
18DTC_SRCS += yamltree.c
19endif
20
17DTC_GEN_SRCS = dtc-lexer.lex.c dtc-parser.tab.c 21DTC_GEN_SRCS = dtc-lexer.lex.c dtc-parser.tab.c
18DTC_OBJS = $(DTC_SRCS:%.c=%.o) $(DTC_GEN_SRCS:%.c=%.o) 22DTC_OBJS = $(DTC_SRCS:%.c=%.o) $(DTC_GEN_SRCS:%.c=%.o)
diff --git a/scripts/dtc/checks.c b/scripts/dtc/checks.c
index a2cc1036c915..9c9b0c328af6 100644
--- a/scripts/dtc/checks.c
+++ b/scripts/dtc/checks.c
@@ -962,6 +962,143 @@ static void check_simple_bus_reg(struct check *c, struct dt_info *dti, struct no
962} 962}
963WARNING(simple_bus_reg, check_simple_bus_reg, NULL, &reg_format, &simple_bus_bridge); 963WARNING(simple_bus_reg, check_simple_bus_reg, NULL, &reg_format, &simple_bus_bridge);
964 964
965static const struct bus_type i2c_bus = {
966 .name = "i2c-bus",
967};
968
969static void check_i2c_bus_bridge(struct check *c, struct dt_info *dti, struct node *node)
970{
971 if (strprefixeq(node->name, node->basenamelen, "i2c-bus") ||
972 strprefixeq(node->name, node->basenamelen, "i2c-arb")) {
973 node->bus = &i2c_bus;
974 } else if (strprefixeq(node->name, node->basenamelen, "i2c")) {
975 struct node *child;
976 for_each_child(node, child) {
977 if (strprefixeq(child->name, node->basenamelen, "i2c-bus"))
978 return;
979 }
980 node->bus = &i2c_bus;
981 } else
982 return;
983
984 if (!node->children)
985 return;
986
987 if (node_addr_cells(node) != 1)
988 FAIL(c, dti, node, "incorrect #address-cells for I2C bus");
989 if (node_size_cells(node) != 0)
990 FAIL(c, dti, node, "incorrect #size-cells for I2C bus");
991
992}
993WARNING(i2c_bus_bridge, check_i2c_bus_bridge, NULL, &addr_size_cells);
994
995static void check_i2c_bus_reg(struct check *c, struct dt_info *dti, struct node *node)
996{
997 struct property *prop;
998 const char *unitname = get_unitname(node);
999 char unit_addr[17];
1000 uint32_t reg = 0;
1001 int len;
1002 cell_t *cells = NULL;
1003
1004 if (!node->parent || (node->parent->bus != &i2c_bus))
1005 return;
1006
1007 prop = get_property(node, "reg");
1008 if (prop)
1009 cells = (cell_t *)prop->val.val;
1010
1011 if (!cells) {
1012 FAIL(c, dti, node, "missing or empty reg property");
1013 return;
1014 }
1015
1016 reg = fdt32_to_cpu(*cells);
1017 snprintf(unit_addr, sizeof(unit_addr), "%x", reg);
1018 if (!streq(unitname, unit_addr))
1019 FAIL(c, dti, node, "I2C bus unit address format error, expected \"%s\"",
1020 unit_addr);
1021
1022 for (len = prop->val.len; len > 0; len -= 4) {
1023 reg = fdt32_to_cpu(*(cells++));
1024 if (reg > 0x3ff)
1025 FAIL_PROP(c, dti, node, prop, "I2C address must be less than 10-bits, got \"0x%x\"",
1026 reg);
1027
1028 }
1029}
1030WARNING(i2c_bus_reg, check_i2c_bus_reg, NULL, &reg_format, &i2c_bus_bridge);
1031
1032static const struct bus_type spi_bus = {
1033 .name = "spi-bus",
1034};
1035
1036static void check_spi_bus_bridge(struct check *c, struct dt_info *dti, struct node *node)
1037{
1038
1039 if (strprefixeq(node->name, node->basenamelen, "spi")) {
1040 node->bus = &spi_bus;
1041 } else {
1042 /* Try to detect SPI buses which don't have proper node name */
1043 struct node *child;
1044
1045 if (node_addr_cells(node) != 1 || node_size_cells(node) != 0)
1046 return;
1047
1048 for_each_child(node, child) {
1049 struct property *prop;
1050 for_each_property(child, prop) {
1051 if (strprefixeq(prop->name, 4, "spi-")) {
1052 node->bus = &spi_bus;
1053 break;
1054 }
1055 }
1056 if (node->bus == &spi_bus)
1057 break;
1058 }
1059
1060 if (node->bus == &spi_bus && get_property(node, "reg"))
1061 FAIL(c, dti, node, "node name for SPI buses should be 'spi'");
1062 }
1063 if (node->bus != &spi_bus || !node->children)
1064 return;
1065
1066 if (node_addr_cells(node) != 1)
1067 FAIL(c, dti, node, "incorrect #address-cells for SPI bus");
1068 if (node_size_cells(node) != 0)
1069 FAIL(c, dti, node, "incorrect #size-cells for SPI bus");
1070
1071}
1072WARNING(spi_bus_bridge, check_spi_bus_bridge, NULL, &addr_size_cells);
1073
1074static void check_spi_bus_reg(struct check *c, struct dt_info *dti, struct node *node)
1075{
1076 struct property *prop;
1077 const char *unitname = get_unitname(node);
1078 char unit_addr[9];
1079 uint32_t reg = 0;
1080 cell_t *cells = NULL;
1081
1082 if (!node->parent || (node->parent->bus != &spi_bus))
1083 return;
1084
1085 prop = get_property(node, "reg");
1086 if (prop)
1087 cells = (cell_t *)prop->val.val;
1088
1089 if (!cells) {
1090 FAIL(c, dti, node, "missing or empty reg property");
1091 return;
1092 }
1093
1094 reg = fdt32_to_cpu(*cells);
1095 snprintf(unit_addr, sizeof(unit_addr), "%x", reg);
1096 if (!streq(unitname, unit_addr))
1097 FAIL(c, dti, node, "SPI bus unit address format error, expected \"%s\"",
1098 unit_addr);
1099}
1100WARNING(spi_bus_reg, check_spi_bus_reg, NULL, &reg_format, &spi_bus_bridge);
1101
965static void check_unit_address_format(struct check *c, struct dt_info *dti, 1102static void check_unit_address_format(struct check *c, struct dt_info *dti,
966 struct node *node) 1103 struct node *node)
967{ 1104{
@@ -1582,6 +1719,12 @@ static struct check *check_table[] = {
1582 &simple_bus_bridge, 1719 &simple_bus_bridge,
1583 &simple_bus_reg, 1720 &simple_bus_reg,
1584 1721
1722 &i2c_bus_bridge,
1723 &i2c_bus_reg,
1724
1725 &spi_bus_bridge,
1726 &spi_bus_reg,
1727
1585 &avoid_default_addr_size, 1728 &avoid_default_addr_size,
1586 &avoid_unnecessary_addr_size, 1729 &avoid_unnecessary_addr_size,
1587 &unique_unit_address, 1730 &unique_unit_address,
diff --git a/scripts/dtc/data.c b/scripts/dtc/data.c
index aa37a16c8891..4a204145cc7b 100644
--- a/scripts/dtc/data.c
+++ b/scripts/dtc/data.c
@@ -74,7 +74,8 @@ struct data data_copy_escape_string(const char *s, int len)
74 struct data d; 74 struct data d;
75 char *q; 75 char *q;
76 76
77 d = data_grow_for(empty_data, len + 1); 77 d = data_add_marker(empty_data, TYPE_STRING, NULL);
78 d = data_grow_for(d, len + 1);
78 79
79 q = d.val; 80 q = d.val;
80 while (i < len) { 81 while (i < len) {
@@ -94,6 +95,7 @@ struct data data_copy_file(FILE *f, size_t maxlen)
94{ 95{
95 struct data d = empty_data; 96 struct data d = empty_data;
96 97
98 d = data_add_marker(d, TYPE_NONE, NULL);
97 while (!feof(f) && (d.len < maxlen)) { 99 while (!feof(f) && (d.len < maxlen)) {
98 size_t chunksize, ret; 100 size_t chunksize, ret;
99 101
diff --git a/scripts/dtc/dtc-parser.y b/scripts/dtc/dtc-parser.y
index 011a5b25539a..dd70ebf386f4 100644
--- a/scripts/dtc/dtc-parser.y
+++ b/scripts/dtc/dtc-parser.y
@@ -287,6 +287,7 @@ propdata:
287 } 287 }
288 | propdataprefix DT_REF 288 | propdataprefix DT_REF
289 { 289 {
290 $1 = data_add_marker($1, TYPE_STRING, $2);
290 $$ = data_add_marker($1, REF_PATH, $2); 291 $$ = data_add_marker($1, REF_PATH, $2);
291 } 292 }
292 | propdataprefix DT_INCBIN '(' DT_STRING ',' integer_prim ',' integer_prim ')' 293 | propdataprefix DT_INCBIN '(' DT_STRING ',' integer_prim ',' integer_prim ')'
@@ -340,22 +341,27 @@ arrayprefix:
340 DT_BITS DT_LITERAL '<' 341 DT_BITS DT_LITERAL '<'
341 { 342 {
342 unsigned long long bits; 343 unsigned long long bits;
344 enum markertype type = TYPE_UINT32;
343 345
344 bits = $2; 346 bits = $2;
345 347
346 if ((bits != 8) && (bits != 16) && 348 switch (bits) {
347 (bits != 32) && (bits != 64)) { 349 case 8: type = TYPE_UINT8; break;
350 case 16: type = TYPE_UINT16; break;
351 case 32: type = TYPE_UINT32; break;
352 case 64: type = TYPE_UINT64; break;
353 default:
348 ERROR(&@2, "Array elements must be" 354 ERROR(&@2, "Array elements must be"
349 " 8, 16, 32 or 64-bits"); 355 " 8, 16, 32 or 64-bits");
350 bits = 32; 356 bits = 32;
351 } 357 }
352 358
353 $$.data = empty_data; 359 $$.data = data_add_marker(empty_data, type, NULL);
354 $$.bits = bits; 360 $$.bits = bits;
355 } 361 }
356 | '<' 362 | '<'
357 { 363 {
358 $$.data = empty_data; 364 $$.data = data_add_marker(empty_data, TYPE_UINT32, NULL);
359 $$.bits = 32; 365 $$.bits = 32;
360 } 366 }
361 | arrayprefix integer_prim 367 | arrayprefix integer_prim
@@ -499,7 +505,7 @@ integer_unary:
499bytestring: 505bytestring:
500 /* empty */ 506 /* empty */
501 { 507 {
502 $$ = empty_data; 508 $$ = data_add_marker(empty_data, TYPE_UINT8, NULL);
503 } 509 }
504 | bytestring DT_BYTE 510 | bytestring DT_BYTE
505 { 511 {
diff --git a/scripts/dtc/dtc.c b/scripts/dtc/dtc.c
index c36994e6eac5..64134aadb997 100644
--- a/scripts/dtc/dtc.c
+++ b/scripts/dtc/dtc.c
@@ -95,6 +95,9 @@ static const char * const usage_opts_help[] = {
95 "\n\tOutput formats are:\n" 95 "\n\tOutput formats are:\n"
96 "\t\tdts - device tree source text\n" 96 "\t\tdts - device tree source text\n"
97 "\t\tdtb - device tree blob\n" 97 "\t\tdtb - device tree blob\n"
98#ifndef NO_YAML
99 "\t\tyaml - device tree encoded as YAML\n"
100#endif
98 "\t\tasm - assembler source", 101 "\t\tasm - assembler source",
99 "\n\tBlob version to produce, defaults to "stringify(DEFAULT_FDT_VERSION)" (for dtb and asm output)", 102 "\n\tBlob version to produce, defaults to "stringify(DEFAULT_FDT_VERSION)" (for dtb and asm output)",
100 "\n\tOutput dependency file", 103 "\n\tOutput dependency file",
@@ -128,6 +131,8 @@ static const char *guess_type_by_name(const char *fname, const char *fallback)
128 return fallback; 131 return fallback;
129 if (!strcasecmp(s, ".dts")) 132 if (!strcasecmp(s, ".dts"))
130 return "dts"; 133 return "dts";
134 if (!strcasecmp(s, ".yaml"))
135 return "yaml";
131 if (!strcasecmp(s, ".dtb")) 136 if (!strcasecmp(s, ".dtb"))
132 return "dtb"; 137 return "dtb";
133 return fallback; 138 return fallback;
@@ -350,6 +355,12 @@ int main(int argc, char *argv[])
350 355
351 if (streq(outform, "dts")) { 356 if (streq(outform, "dts")) {
352 dt_to_source(outf, dti); 357 dt_to_source(outf, dti);
358#ifndef NO_YAML
359 } else if (streq(outform, "yaml")) {
360 if (!streq(inform, "dts"))
361 die("YAML output format requires dts input format\n");
362 dt_to_yaml(outf, dti);
363#endif
353 } else if (streq(outform, "dtb")) { 364 } else if (streq(outform, "dtb")) {
354 dt_to_blob(outf, dti, outversion); 365 dt_to_blob(outf, dti, outversion);
355 } else if (streq(outform, "asm")) { 366 } else if (streq(outform, "asm")) {
diff --git a/scripts/dtc/dtc.h b/scripts/dtc/dtc.h
index 6d667701ab6a..cbe541525c2c 100644
--- a/scripts/dtc/dtc.h
+++ b/scripts/dtc/dtc.h
@@ -74,10 +74,17 @@ typedef uint32_t cell_t;
74 74
75/* Data blobs */ 75/* Data blobs */
76enum markertype { 76enum markertype {
77 TYPE_NONE,
77 REF_PHANDLE, 78 REF_PHANDLE,
78 REF_PATH, 79 REF_PATH,
79 LABEL, 80 LABEL,
81 TYPE_UINT8,
82 TYPE_UINT16,
83 TYPE_UINT32,
84 TYPE_UINT64,
85 TYPE_STRING,
80}; 86};
87extern const char *markername(enum markertype markertype);
81 88
82struct marker { 89struct marker {
83 enum markertype type; 90 enum markertype type;
@@ -101,6 +108,8 @@ struct data {
101 for_each_marker(m) \ 108 for_each_marker(m) \
102 if ((m)->type == (t)) 109 if ((m)->type == (t))
103 110
111size_t type_marker_length(struct marker *m);
112
104void data_free(struct data d); 113void data_free(struct data d);
105 114
106struct data data_grow_for(struct data d, int xlen); 115struct data data_grow_for(struct data d, int xlen);
@@ -290,6 +299,10 @@ struct dt_info *dt_from_blob(const char *fname);
290void dt_to_source(FILE *f, struct dt_info *dti); 299void dt_to_source(FILE *f, struct dt_info *dti);
291struct dt_info *dt_from_source(const char *f); 300struct dt_info *dt_from_source(const char *f);
292 301
302/* YAML source */
303
304void dt_to_yaml(FILE *f, struct dt_info *dti);
305
293/* FS trees */ 306/* FS trees */
294 307
295struct dt_info *dt_from_fs(const char *dirname); 308struct dt_info *dt_from_fs(const char *dirname);
diff --git a/scripts/dtc/flattree.c b/scripts/dtc/flattree.c
index 8d268fb785db..851ea87dbc0f 100644
--- a/scripts/dtc/flattree.c
+++ b/scripts/dtc/flattree.c
@@ -393,7 +393,7 @@ void dt_to_blob(FILE *f, struct dt_info *dti, int version)
393 padlen = 0; 393 padlen = 0;
394 if (quiet < 1) 394 if (quiet < 1)
395 fprintf(stderr, 395 fprintf(stderr,
396 "Warning: blob size %d >= minimum size %d\n", 396 "Warning: blob size %"PRIu32" >= minimum size %d\n",
397 fdt32_to_cpu(fdt.totalsize), minsize); 397 fdt32_to_cpu(fdt.totalsize), minsize);
398 } 398 }
399 } 399 }
diff --git a/scripts/dtc/libfdt/fdt.c b/scripts/dtc/libfdt/fdt.c
index 7855a1787763..ae03b1112961 100644
--- a/scripts/dtc/libfdt/fdt.c
+++ b/scripts/dtc/libfdt/fdt.c
@@ -55,7 +55,12 @@
55 55
56#include "libfdt_internal.h" 56#include "libfdt_internal.h"
57 57
58int fdt_check_header(const void *fdt) 58/*
59 * Minimal sanity check for a read-only tree. fdt_ro_probe_() checks
60 * that the given buffer contains what appears to be a flattened
61 * device tree with sane information in its header.
62 */
63int fdt_ro_probe_(const void *fdt)
59{ 64{
60 if (fdt_magic(fdt) == FDT_MAGIC) { 65 if (fdt_magic(fdt) == FDT_MAGIC) {
61 /* Complete tree */ 66 /* Complete tree */
@@ -74,6 +79,78 @@ int fdt_check_header(const void *fdt)
74 return 0; 79 return 0;
75} 80}
76 81
82static int check_off_(uint32_t hdrsize, uint32_t totalsize, uint32_t off)
83{
84 return (off >= hdrsize) && (off <= totalsize);
85}
86
87static int check_block_(uint32_t hdrsize, uint32_t totalsize,
88 uint32_t base, uint32_t size)
89{
90 if (!check_off_(hdrsize, totalsize, base))
91 return 0; /* block start out of bounds */
92 if ((base + size) < base)
93 return 0; /* overflow */
94 if (!check_off_(hdrsize, totalsize, base + size))
95 return 0; /* block end out of bounds */
96 return 1;
97}
98
99size_t fdt_header_size_(uint32_t version)
100{
101 if (version <= 1)
102 return FDT_V1_SIZE;
103 else if (version <= 2)
104 return FDT_V2_SIZE;
105 else if (version <= 3)
106 return FDT_V3_SIZE;
107 else if (version <= 16)
108 return FDT_V16_SIZE;
109 else
110 return FDT_V17_SIZE;
111}
112
113int fdt_check_header(const void *fdt)
114{
115 size_t hdrsize;
116
117 if (fdt_magic(fdt) != FDT_MAGIC)
118 return -FDT_ERR_BADMAGIC;
119 hdrsize = fdt_header_size(fdt);
120 if ((fdt_version(fdt) < FDT_FIRST_SUPPORTED_VERSION)
121 || (fdt_last_comp_version(fdt) > FDT_LAST_SUPPORTED_VERSION))
122 return -FDT_ERR_BADVERSION;
123 if (fdt_version(fdt) < fdt_last_comp_version(fdt))
124 return -FDT_ERR_BADVERSION;
125
126 if ((fdt_totalsize(fdt) < hdrsize)
127 || (fdt_totalsize(fdt) > INT_MAX))
128 return -FDT_ERR_TRUNCATED;
129
130 /* Bounds check memrsv block */
131 if (!check_off_(hdrsize, fdt_totalsize(fdt), fdt_off_mem_rsvmap(fdt)))
132 return -FDT_ERR_TRUNCATED;
133
134 /* Bounds check structure block */
135 if (fdt_version(fdt) < 17) {
136 if (!check_off_(hdrsize, fdt_totalsize(fdt),
137 fdt_off_dt_struct(fdt)))
138 return -FDT_ERR_TRUNCATED;
139 } else {
140 if (!check_block_(hdrsize, fdt_totalsize(fdt),
141 fdt_off_dt_struct(fdt),
142 fdt_size_dt_struct(fdt)))
143 return -FDT_ERR_TRUNCATED;
144 }
145
146 /* Bounds check strings block */
147 if (!check_block_(hdrsize, fdt_totalsize(fdt),
148 fdt_off_dt_strings(fdt), fdt_size_dt_strings(fdt)))
149 return -FDT_ERR_TRUNCATED;
150
151 return 0;
152}
153
77const void *fdt_offset_ptr(const void *fdt, int offset, unsigned int len) 154const void *fdt_offset_ptr(const void *fdt, int offset, unsigned int len)
78{ 155{
79 unsigned absoffset = offset + fdt_off_dt_struct(fdt); 156 unsigned absoffset = offset + fdt_off_dt_struct(fdt);
@@ -244,7 +321,7 @@ const char *fdt_find_string_(const char *strtab, int tabsize, const char *s)
244 321
245int fdt_move(const void *fdt, void *buf, int bufsize) 322int fdt_move(const void *fdt, void *buf, int bufsize)
246{ 323{
247 FDT_CHECK_HEADER(fdt); 324 FDT_RO_PROBE(fdt);
248 325
249 if (fdt_totalsize(fdt) > bufsize) 326 if (fdt_totalsize(fdt) > bufsize)
250 return -FDT_ERR_NOSPACE; 327 return -FDT_ERR_NOSPACE;
diff --git a/scripts/dtc/libfdt/fdt_addresses.c b/scripts/dtc/libfdt/fdt_addresses.c
index eff4dbcc729d..49537b578d03 100644
--- a/scripts/dtc/libfdt/fdt_addresses.c
+++ b/scripts/dtc/libfdt/fdt_addresses.c
@@ -1,6 +1,7 @@
1/* 1/*
2 * libfdt - Flat Device Tree manipulation 2 * libfdt - Flat Device Tree manipulation
3 * Copyright (C) 2014 David Gibson <david@gibson.dropbear.id.au> 3 * Copyright (C) 2014 David Gibson <david@gibson.dropbear.id.au>
4 * Copyright (C) 2018 embedded brains GmbH
4 * 5 *
5 * libfdt is dual licensed: you can use it either under the terms of 6 * libfdt is dual licensed: you can use it either under the terms of
6 * the GPL, or the BSD license, at your option. 7 * the GPL, or the BSD license, at your option.
@@ -55,42 +56,32 @@
55 56
56#include "libfdt_internal.h" 57#include "libfdt_internal.h"
57 58
58int fdt_address_cells(const void *fdt, int nodeoffset) 59static int fdt_cells(const void *fdt, int nodeoffset, const char *name)
59{ 60{
60 const fdt32_t *ac; 61 const fdt32_t *c;
61 int val; 62 int val;
62 int len; 63 int len;
63 64
64 ac = fdt_getprop(fdt, nodeoffset, "#address-cells", &len); 65 c = fdt_getprop(fdt, nodeoffset, name, &len);
65 if (!ac) 66 if (!c)
66 return 2; 67 return 2;
67 68
68 if (len != sizeof(*ac)) 69 if (len != sizeof(*c))
69 return -FDT_ERR_BADNCELLS; 70 return -FDT_ERR_BADNCELLS;
70 71
71 val = fdt32_to_cpu(*ac); 72 val = fdt32_to_cpu(*c);
72 if ((val <= 0) || (val > FDT_MAX_NCELLS)) 73 if ((val <= 0) || (val > FDT_MAX_NCELLS))
73 return -FDT_ERR_BADNCELLS; 74 return -FDT_ERR_BADNCELLS;
74 75
75 return val; 76 return val;
76} 77}
77 78
78int fdt_size_cells(const void *fdt, int nodeoffset) 79int fdt_address_cells(const void *fdt, int nodeoffset)
79{ 80{
80 const fdt32_t *sc; 81 return fdt_cells(fdt, nodeoffset, "#address-cells");
81 int val; 82}
82 int len;
83
84 sc = fdt_getprop(fdt, nodeoffset, "#size-cells", &len);
85 if (!sc)
86 return 2;
87
88 if (len != sizeof(*sc))
89 return -FDT_ERR_BADNCELLS;
90
91 val = fdt32_to_cpu(*sc);
92 if ((val < 0) || (val > FDT_MAX_NCELLS))
93 return -FDT_ERR_BADNCELLS;
94 83
95 return val; 84int fdt_size_cells(const void *fdt, int nodeoffset)
85{
86 return fdt_cells(fdt, nodeoffset, "#size-cells");
96} 87}
diff --git a/scripts/dtc/libfdt/fdt_overlay.c b/scripts/dtc/libfdt/fdt_overlay.c
index bf75388ec9a2..5fdab6c6371d 100644
--- a/scripts/dtc/libfdt/fdt_overlay.c
+++ b/scripts/dtc/libfdt/fdt_overlay.c
@@ -697,7 +697,7 @@ static int get_path_len(const void *fdt, int nodeoffset)
697 int len = 0, namelen; 697 int len = 0, namelen;
698 const char *name; 698 const char *name;
699 699
700 FDT_CHECK_HEADER(fdt); 700 FDT_RO_PROBE(fdt);
701 701
702 for (;;) { 702 for (;;) {
703 name = fdt_get_name(fdt, nodeoffset, &namelen); 703 name = fdt_get_name(fdt, nodeoffset, &namelen);
@@ -866,8 +866,8 @@ int fdt_overlay_apply(void *fdt, void *fdto)
866 uint32_t delta = fdt_get_max_phandle(fdt); 866 uint32_t delta = fdt_get_max_phandle(fdt);
867 int ret; 867 int ret;
868 868
869 FDT_CHECK_HEADER(fdt); 869 FDT_RO_PROBE(fdt);
870 FDT_CHECK_HEADER(fdto); 870 FDT_RO_PROBE(fdto);
871 871
872 ret = overlay_adjust_local_phandles(fdto, delta); 872 ret = overlay_adjust_local_phandles(fdto, delta);
873 if (ret) 873 if (ret)
diff --git a/scripts/dtc/libfdt/fdt_ro.c b/scripts/dtc/libfdt/fdt_ro.c
index dfb3236da388..eafc14282892 100644
--- a/scripts/dtc/libfdt/fdt_ro.c
+++ b/scripts/dtc/libfdt/fdt_ro.c
@@ -76,17 +76,72 @@ static int fdt_nodename_eq_(const void *fdt, int offset,
76 return 0; 76 return 0;
77} 77}
78 78
79const char *fdt_get_string(const void *fdt, int stroffset, int *lenp)
80{
81 uint32_t absoffset = stroffset + fdt_off_dt_strings(fdt);
82 size_t len;
83 int err;
84 const char *s, *n;
85
86 err = fdt_ro_probe_(fdt);
87 if (err != 0)
88 goto fail;
89
90 err = -FDT_ERR_BADOFFSET;
91 if (absoffset >= fdt_totalsize(fdt))
92 goto fail;
93 len = fdt_totalsize(fdt) - absoffset;
94
95 if (fdt_magic(fdt) == FDT_MAGIC) {
96 if (stroffset < 0)
97 goto fail;
98 if (fdt_version(fdt) >= 17) {
99 if (stroffset >= fdt_size_dt_strings(fdt))
100 goto fail;
101 if ((fdt_size_dt_strings(fdt) - stroffset) < len)
102 len = fdt_size_dt_strings(fdt) - stroffset;
103 }
104 } else if (fdt_magic(fdt) == FDT_SW_MAGIC) {
105 if ((stroffset >= 0)
106 || (stroffset < -fdt_size_dt_strings(fdt)))
107 goto fail;
108 if ((-stroffset) < len)
109 len = -stroffset;
110 } else {
111 err = -FDT_ERR_INTERNAL;
112 goto fail;
113 }
114
115 s = (const char *)fdt + absoffset;
116 n = memchr(s, '\0', len);
117 if (!n) {
118 /* missing terminating NULL */
119 err = -FDT_ERR_TRUNCATED;
120 goto fail;
121 }
122
123 if (lenp)
124 *lenp = n - s;
125 return s;
126
127fail:
128 if (lenp)
129 *lenp = err;
130 return NULL;
131}
132
79const char *fdt_string(const void *fdt, int stroffset) 133const char *fdt_string(const void *fdt, int stroffset)
80{ 134{
81 return (const char *)fdt + fdt_off_dt_strings(fdt) + stroffset; 135 return fdt_get_string(fdt, stroffset, NULL);
82} 136}
83 137
84static int fdt_string_eq_(const void *fdt, int stroffset, 138static int fdt_string_eq_(const void *fdt, int stroffset,
85 const char *s, int len) 139 const char *s, int len)
86{ 140{
87 const char *p = fdt_string(fdt, stroffset); 141 int slen;
142 const char *p = fdt_get_string(fdt, stroffset, &slen);
88 143
89 return (strlen(p) == len) && (memcmp(p, s, len) == 0); 144 return p && (slen == len) && (memcmp(p, s, len) == 0);
90} 145}
91 146
92uint32_t fdt_get_max_phandle(const void *fdt) 147uint32_t fdt_get_max_phandle(const void *fdt)
@@ -115,21 +170,42 @@ uint32_t fdt_get_max_phandle(const void *fdt)
115 return 0; 170 return 0;
116} 171}
117 172
173static const struct fdt_reserve_entry *fdt_mem_rsv(const void *fdt, int n)
174{
175 int offset = n * sizeof(struct fdt_reserve_entry);
176 int absoffset = fdt_off_mem_rsvmap(fdt) + offset;
177
178 if (absoffset < fdt_off_mem_rsvmap(fdt))
179 return NULL;
180 if (absoffset > fdt_totalsize(fdt) - sizeof(struct fdt_reserve_entry))
181 return NULL;
182 return fdt_mem_rsv_(fdt, n);
183}
184
118int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size) 185int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size)
119{ 186{
120 FDT_CHECK_HEADER(fdt); 187 const struct fdt_reserve_entry *re;
121 *address = fdt64_to_cpu(fdt_mem_rsv_(fdt, n)->address); 188
122 *size = fdt64_to_cpu(fdt_mem_rsv_(fdt, n)->size); 189 FDT_RO_PROBE(fdt);
190 re = fdt_mem_rsv(fdt, n);
191 if (!re)
192 return -FDT_ERR_BADOFFSET;
193
194 *address = fdt64_ld(&re->address);
195 *size = fdt64_ld(&re->size);
123 return 0; 196 return 0;
124} 197}
125 198
126int fdt_num_mem_rsv(const void *fdt) 199int fdt_num_mem_rsv(const void *fdt)
127{ 200{
128 int i = 0; 201 int i;
202 const struct fdt_reserve_entry *re;
129 203
130 while (fdt64_to_cpu(fdt_mem_rsv_(fdt, i)->size) != 0) 204 for (i = 0; (re = fdt_mem_rsv(fdt, i)) != NULL; i++) {
131 i++; 205 if (fdt64_ld(&re->size) == 0)
132 return i; 206 return i;
207 }
208 return -FDT_ERR_TRUNCATED;
133} 209}
134 210
135static int nextprop_(const void *fdt, int offset) 211static int nextprop_(const void *fdt, int offset)
@@ -161,7 +237,7 @@ int fdt_subnode_offset_namelen(const void *fdt, int offset,
161{ 237{
162 int depth; 238 int depth;
163 239
164 FDT_CHECK_HEADER(fdt); 240 FDT_RO_PROBE(fdt);
165 241
166 for (depth = 0; 242 for (depth = 0;
167 (offset >= 0) && (depth >= 0); 243 (offset >= 0) && (depth >= 0);
@@ -187,7 +263,7 @@ int fdt_path_offset_namelen(const void *fdt, const char *path, int namelen)
187 const char *p = path; 263 const char *p = path;
188 int offset = 0; 264 int offset = 0;
189 265
190 FDT_CHECK_HEADER(fdt); 266 FDT_RO_PROBE(fdt);
191 267
192 /* see if we have an alias */ 268 /* see if we have an alias */
193 if (*path != '/') { 269 if (*path != '/') {
@@ -237,7 +313,7 @@ const char *fdt_get_name(const void *fdt, int nodeoffset, int *len)
237 const char *nameptr; 313 const char *nameptr;
238 int err; 314 int err;
239 315
240 if (((err = fdt_check_header(fdt)) != 0) 316 if (((err = fdt_ro_probe_(fdt)) != 0)
241 || ((err = fdt_check_node_offset_(fdt, nodeoffset)) < 0)) 317 || ((err = fdt_check_node_offset_(fdt, nodeoffset)) < 0))
242 goto fail; 318 goto fail;
243 319
@@ -303,7 +379,7 @@ static const struct fdt_property *fdt_get_property_by_offset_(const void *fdt,
303 prop = fdt_offset_ptr_(fdt, offset); 379 prop = fdt_offset_ptr_(fdt, offset);
304 380
305 if (lenp) 381 if (lenp)
306 *lenp = fdt32_to_cpu(prop->len); 382 *lenp = fdt32_ld(&prop->len);
307 383
308 return prop; 384 return prop;
309} 385}
@@ -340,7 +416,7 @@ static const struct fdt_property *fdt_get_property_namelen_(const void *fdt,
340 offset = -FDT_ERR_INTERNAL; 416 offset = -FDT_ERR_INTERNAL;
341 break; 417 break;
342 } 418 }
343 if (fdt_string_eq_(fdt, fdt32_to_cpu(prop->nameoff), 419 if (fdt_string_eq_(fdt, fdt32_ld(&prop->nameoff),
344 name, namelen)) { 420 name, namelen)) {
345 if (poffset) 421 if (poffset)
346 *poffset = offset; 422 *poffset = offset;
@@ -393,7 +469,7 @@ const void *fdt_getprop_namelen(const void *fdt, int nodeoffset,
393 469
394 /* Handle realignment */ 470 /* Handle realignment */
395 if (fdt_version(fdt) < 0x10 && (poffset + sizeof(*prop)) % 8 && 471 if (fdt_version(fdt) < 0x10 && (poffset + sizeof(*prop)) % 8 &&
396 fdt32_to_cpu(prop->len) >= 8) 472 fdt32_ld(&prop->len) >= 8)
397 return prop->data + 4; 473 return prop->data + 4;
398 return prop->data; 474 return prop->data;
399} 475}
@@ -406,12 +482,22 @@ const void *fdt_getprop_by_offset(const void *fdt, int offset,
406 prop = fdt_get_property_by_offset_(fdt, offset, lenp); 482 prop = fdt_get_property_by_offset_(fdt, offset, lenp);
407 if (!prop) 483 if (!prop)
408 return NULL; 484 return NULL;
409 if (namep) 485 if (namep) {
410 *namep = fdt_string(fdt, fdt32_to_cpu(prop->nameoff)); 486 const char *name;
487 int namelen;
488 name = fdt_get_string(fdt, fdt32_ld(&prop->nameoff),
489 &namelen);
490 if (!name) {
491 if (lenp)
492 *lenp = namelen;
493 return NULL;
494 }
495 *namep = name;
496 }
411 497
412 /* Handle realignment */ 498 /* Handle realignment */
413 if (fdt_version(fdt) < 0x10 && (offset + sizeof(*prop)) % 8 && 499 if (fdt_version(fdt) < 0x10 && (offset + sizeof(*prop)) % 8 &&
414 fdt32_to_cpu(prop->len) >= 8) 500 fdt32_ld(&prop->len) >= 8)
415 return prop->data + 4; 501 return prop->data + 4;
416 return prop->data; 502 return prop->data;
417} 503}
@@ -436,7 +522,7 @@ uint32_t fdt_get_phandle(const void *fdt, int nodeoffset)
436 return 0; 522 return 0;
437 } 523 }
438 524
439 return fdt32_to_cpu(*php); 525 return fdt32_ld(php);
440} 526}
441 527
442const char *fdt_get_alias_namelen(const void *fdt, 528const char *fdt_get_alias_namelen(const void *fdt,
@@ -462,7 +548,7 @@ int fdt_get_path(const void *fdt, int nodeoffset, char *buf, int buflen)
462 int offset, depth, namelen; 548 int offset, depth, namelen;
463 const char *name; 549 const char *name;
464 550
465 FDT_CHECK_HEADER(fdt); 551 FDT_RO_PROBE(fdt);
466 552
467 if (buflen < 2) 553 if (buflen < 2)
468 return -FDT_ERR_NOSPACE; 554 return -FDT_ERR_NOSPACE;
@@ -514,7 +600,7 @@ int fdt_supernode_atdepth_offset(const void *fdt, int nodeoffset,
514 int offset, depth; 600 int offset, depth;
515 int supernodeoffset = -FDT_ERR_INTERNAL; 601 int supernodeoffset = -FDT_ERR_INTERNAL;
516 602
517 FDT_CHECK_HEADER(fdt); 603 FDT_RO_PROBE(fdt);
518 604
519 if (supernodedepth < 0) 605 if (supernodedepth < 0)
520 return -FDT_ERR_NOTFOUND; 606 return -FDT_ERR_NOTFOUND;
@@ -573,7 +659,7 @@ int fdt_node_offset_by_prop_value(const void *fdt, int startoffset,
573 const void *val; 659 const void *val;
574 int len; 660 int len;
575 661
576 FDT_CHECK_HEADER(fdt); 662 FDT_RO_PROBE(fdt);
577 663
578 /* FIXME: The algorithm here is pretty horrible: we scan each 664 /* FIXME: The algorithm here is pretty horrible: we scan each
579 * property of a node in fdt_getprop(), then if that didn't 665 * property of a node in fdt_getprop(), then if that didn't
@@ -599,7 +685,7 @@ int fdt_node_offset_by_phandle(const void *fdt, uint32_t phandle)
599 if ((phandle == 0) || (phandle == -1)) 685 if ((phandle == 0) || (phandle == -1))
600 return -FDT_ERR_BADPHANDLE; 686 return -FDT_ERR_BADPHANDLE;
601 687
602 FDT_CHECK_HEADER(fdt); 688 FDT_RO_PROBE(fdt);
603 689
604 /* FIXME: The algorithm here is pretty horrible: we 690 /* FIXME: The algorithm here is pretty horrible: we
605 * potentially scan each property of a node in 691 * potentially scan each property of a node in
@@ -752,7 +838,7 @@ int fdt_node_offset_by_compatible(const void *fdt, int startoffset,
752{ 838{
753 int offset, err; 839 int offset, err;
754 840
755 FDT_CHECK_HEADER(fdt); 841 FDT_RO_PROBE(fdt);
756 842
757 /* FIXME: The algorithm here is pretty horrible: we scan each 843 /* FIXME: The algorithm here is pretty horrible: we scan each
758 * property of a node in fdt_node_check_compatible(), then if 844 * property of a node in fdt_node_check_compatible(), then if
@@ -771,3 +857,66 @@ int fdt_node_offset_by_compatible(const void *fdt, int startoffset,
771 857
772 return offset; /* error from fdt_next_node() */ 858 return offset; /* error from fdt_next_node() */
773} 859}
860
861int fdt_check_full(const void *fdt, size_t bufsize)
862{
863 int err;
864 int num_memrsv;
865 int offset, nextoffset = 0;
866 uint32_t tag;
867 unsigned depth = 0;
868 const void *prop;
869 const char *propname;
870
871 if (bufsize < FDT_V1_SIZE)
872 return -FDT_ERR_TRUNCATED;
873 err = fdt_check_header(fdt);
874 if (err != 0)
875 return err;
876 if (bufsize < fdt_totalsize(fdt))
877 return -FDT_ERR_TRUNCATED;
878
879 num_memrsv = fdt_num_mem_rsv(fdt);
880 if (num_memrsv < 0)
881 return num_memrsv;
882
883 while (1) {
884 offset = nextoffset;
885 tag = fdt_next_tag(fdt, offset, &nextoffset);
886
887 if (nextoffset < 0)
888 return nextoffset;
889
890 switch (tag) {
891 case FDT_NOP:
892 break;
893
894 case FDT_END:
895 if (depth != 0)
896 return -FDT_ERR_BADSTRUCTURE;
897 return 0;
898
899 case FDT_BEGIN_NODE:
900 depth++;
901 if (depth > INT_MAX)
902 return -FDT_ERR_BADSTRUCTURE;
903 break;
904
905 case FDT_END_NODE:
906 if (depth == 0)
907 return -FDT_ERR_BADSTRUCTURE;
908 depth--;
909 break;
910
911 case FDT_PROP:
912 prop = fdt_getprop_by_offset(fdt, offset, &propname,
913 &err);
914 if (!prop)
915 return err;
916 break;
917
918 default:
919 return -FDT_ERR_INTERNAL;
920 }
921 }
922}
diff --git a/scripts/dtc/libfdt/fdt_rw.c b/scripts/dtc/libfdt/fdt_rw.c
index 9b829051e444..2e49855d7cf8 100644
--- a/scripts/dtc/libfdt/fdt_rw.c
+++ b/scripts/dtc/libfdt/fdt_rw.c
@@ -67,9 +67,9 @@ static int fdt_blocks_misordered_(const void *fdt,
67 (fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt))); 67 (fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt)));
68} 68}
69 69
70static int fdt_rw_check_header_(void *fdt) 70static int fdt_rw_probe_(void *fdt)
71{ 71{
72 FDT_CHECK_HEADER(fdt); 72 FDT_RO_PROBE(fdt);
73 73
74 if (fdt_version(fdt) < 17) 74 if (fdt_version(fdt) < 17)
75 return -FDT_ERR_BADVERSION; 75 return -FDT_ERR_BADVERSION;
@@ -82,10 +82,10 @@ static int fdt_rw_check_header_(void *fdt)
82 return 0; 82 return 0;
83} 83}
84 84
85#define FDT_RW_CHECK_HEADER(fdt) \ 85#define FDT_RW_PROBE(fdt) \
86 { \ 86 { \
87 int err_; \ 87 int err_; \
88 if ((err_ = fdt_rw_check_header_(fdt)) != 0) \ 88 if ((err_ = fdt_rw_probe_(fdt)) != 0) \
89 return err_; \ 89 return err_; \
90 } 90 }
91 91
@@ -176,7 +176,7 @@ int fdt_add_mem_rsv(void *fdt, uint64_t address, uint64_t size)
176 struct fdt_reserve_entry *re; 176 struct fdt_reserve_entry *re;
177 int err; 177 int err;
178 178
179 FDT_RW_CHECK_HEADER(fdt); 179 FDT_RW_PROBE(fdt);
180 180
181 re = fdt_mem_rsv_w_(fdt, fdt_num_mem_rsv(fdt)); 181 re = fdt_mem_rsv_w_(fdt, fdt_num_mem_rsv(fdt));
182 err = fdt_splice_mem_rsv_(fdt, re, 0, 1); 182 err = fdt_splice_mem_rsv_(fdt, re, 0, 1);
@@ -192,7 +192,7 @@ int fdt_del_mem_rsv(void *fdt, int n)
192{ 192{
193 struct fdt_reserve_entry *re = fdt_mem_rsv_w_(fdt, n); 193 struct fdt_reserve_entry *re = fdt_mem_rsv_w_(fdt, n);
194 194
195 FDT_RW_CHECK_HEADER(fdt); 195 FDT_RW_PROBE(fdt);
196 196
197 if (n >= fdt_num_mem_rsv(fdt)) 197 if (n >= fdt_num_mem_rsv(fdt))
198 return -FDT_ERR_NOTFOUND; 198 return -FDT_ERR_NOTFOUND;
@@ -252,7 +252,7 @@ int fdt_set_name(void *fdt, int nodeoffset, const char *name)
252 int oldlen, newlen; 252 int oldlen, newlen;
253 int err; 253 int err;
254 254
255 FDT_RW_CHECK_HEADER(fdt); 255 FDT_RW_PROBE(fdt);
256 256
257 namep = (char *)(uintptr_t)fdt_get_name(fdt, nodeoffset, &oldlen); 257 namep = (char *)(uintptr_t)fdt_get_name(fdt, nodeoffset, &oldlen);
258 if (!namep) 258 if (!namep)
@@ -275,7 +275,7 @@ int fdt_setprop_placeholder(void *fdt, int nodeoffset, const char *name,
275 struct fdt_property *prop; 275 struct fdt_property *prop;
276 int err; 276 int err;
277 277
278 FDT_RW_CHECK_HEADER(fdt); 278 FDT_RW_PROBE(fdt);
279 279
280 err = fdt_resize_property_(fdt, nodeoffset, name, len, &prop); 280 err = fdt_resize_property_(fdt, nodeoffset, name, len, &prop);
281 if (err == -FDT_ERR_NOTFOUND) 281 if (err == -FDT_ERR_NOTFOUND)
@@ -308,7 +308,7 @@ int fdt_appendprop(void *fdt, int nodeoffset, const char *name,
308 struct fdt_property *prop; 308 struct fdt_property *prop;
309 int err, oldlen, newlen; 309 int err, oldlen, newlen;
310 310
311 FDT_RW_CHECK_HEADER(fdt); 311 FDT_RW_PROBE(fdt);
312 312
313 prop = fdt_get_property_w(fdt, nodeoffset, name, &oldlen); 313 prop = fdt_get_property_w(fdt, nodeoffset, name, &oldlen);
314 if (prop) { 314 if (prop) {
@@ -334,7 +334,7 @@ int fdt_delprop(void *fdt, int nodeoffset, const char *name)
334 struct fdt_property *prop; 334 struct fdt_property *prop;
335 int len, proplen; 335 int len, proplen;
336 336
337 FDT_RW_CHECK_HEADER(fdt); 337 FDT_RW_PROBE(fdt);
338 338
339 prop = fdt_get_property_w(fdt, nodeoffset, name, &len); 339 prop = fdt_get_property_w(fdt, nodeoffset, name, &len);
340 if (!prop) 340 if (!prop)
@@ -354,7 +354,7 @@ int fdt_add_subnode_namelen(void *fdt, int parentoffset,
354 uint32_t tag; 354 uint32_t tag;
355 fdt32_t *endtag; 355 fdt32_t *endtag;
356 356
357 FDT_RW_CHECK_HEADER(fdt); 357 FDT_RW_PROBE(fdt);
358 358
359 offset = fdt_subnode_offset_namelen(fdt, parentoffset, name, namelen); 359 offset = fdt_subnode_offset_namelen(fdt, parentoffset, name, namelen);
360 if (offset >= 0) 360 if (offset >= 0)
@@ -394,7 +394,7 @@ int fdt_del_node(void *fdt, int nodeoffset)
394{ 394{
395 int endoffset; 395 int endoffset;
396 396
397 FDT_RW_CHECK_HEADER(fdt); 397 FDT_RW_PROBE(fdt);
398 398
399 endoffset = fdt_node_end_offset_(fdt, nodeoffset); 399 endoffset = fdt_node_end_offset_(fdt, nodeoffset);
400 if (endoffset < 0) 400 if (endoffset < 0)
@@ -435,7 +435,7 @@ int fdt_open_into(const void *fdt, void *buf, int bufsize)
435 const char *fdtend = fdtstart + fdt_totalsize(fdt); 435 const char *fdtend = fdtstart + fdt_totalsize(fdt);
436 char *tmp; 436 char *tmp;
437 437
438 FDT_CHECK_HEADER(fdt); 438 FDT_RO_PROBE(fdt);
439 439
440 mem_rsv_size = (fdt_num_mem_rsv(fdt)+1) 440 mem_rsv_size = (fdt_num_mem_rsv(fdt)+1)
441 * sizeof(struct fdt_reserve_entry); 441 * sizeof(struct fdt_reserve_entry);
@@ -494,7 +494,7 @@ int fdt_pack(void *fdt)
494{ 494{
495 int mem_rsv_size; 495 int mem_rsv_size;
496 496
497 FDT_RW_CHECK_HEADER(fdt); 497 FDT_RW_PROBE(fdt);
498 498
499 mem_rsv_size = (fdt_num_mem_rsv(fdt)+1) 499 mem_rsv_size = (fdt_num_mem_rsv(fdt)+1)
500 * sizeof(struct fdt_reserve_entry); 500 * sizeof(struct fdt_reserve_entry);
diff --git a/scripts/dtc/libfdt/fdt_sw.c b/scripts/dtc/libfdt/fdt_sw.c
index 6d33cc29d022..9fa4a94d83c3 100644
--- a/scripts/dtc/libfdt/fdt_sw.c
+++ b/scripts/dtc/libfdt/fdt_sw.c
@@ -55,21 +55,77 @@
55 55
56#include "libfdt_internal.h" 56#include "libfdt_internal.h"
57 57
58static int fdt_sw_check_header_(void *fdt) 58static int fdt_sw_probe_(void *fdt)
59{ 59{
60 if (fdt_magic(fdt) != FDT_SW_MAGIC) 60 if (fdt_magic(fdt) == FDT_MAGIC)
61 return -FDT_ERR_BADSTATE;
62 else if (fdt_magic(fdt) != FDT_SW_MAGIC)
61 return -FDT_ERR_BADMAGIC; 63 return -FDT_ERR_BADMAGIC;
62 /* FIXME: should check more details about the header state */
63 return 0; 64 return 0;
64} 65}
65 66
66#define FDT_SW_CHECK_HEADER(fdt) \ 67#define FDT_SW_PROBE(fdt) \
68 { \
69 int err; \
70 if ((err = fdt_sw_probe_(fdt)) != 0) \
71 return err; \
72 }
73
74/* 'memrsv' state: Initial state after fdt_create()
75 *
76 * Allowed functions:
77 * fdt_add_reservmap_entry()
78 * fdt_finish_reservemap() [moves to 'struct' state]
79 */
80static int fdt_sw_probe_memrsv_(void *fdt)
81{
82 int err = fdt_sw_probe_(fdt);
83 if (err)
84 return err;
85
86 if (fdt_off_dt_strings(fdt) != 0)
87 return -FDT_ERR_BADSTATE;
88 return 0;
89}
90
91#define FDT_SW_PROBE_MEMRSV(fdt) \
92 { \
93 int err; \
94 if ((err = fdt_sw_probe_memrsv_(fdt)) != 0) \
95 return err; \
96 }
97
98/* 'struct' state: Enter this state after fdt_finish_reservemap()
99 *
100 * Allowed functions:
101 * fdt_begin_node()
102 * fdt_end_node()
103 * fdt_property*()
104 * fdt_finish() [moves to 'complete' state]
105 */
106static int fdt_sw_probe_struct_(void *fdt)
107{
108 int err = fdt_sw_probe_(fdt);
109 if (err)
110 return err;
111
112 if (fdt_off_dt_strings(fdt) != fdt_totalsize(fdt))
113 return -FDT_ERR_BADSTATE;
114 return 0;
115}
116
117#define FDT_SW_PROBE_STRUCT(fdt) \
67 { \ 118 { \
68 int err; \ 119 int err; \
69 if ((err = fdt_sw_check_header_(fdt)) != 0) \ 120 if ((err = fdt_sw_probe_struct_(fdt)) != 0) \
70 return err; \ 121 return err; \
71 } 122 }
72 123
124/* 'complete' state: Enter this state after fdt_finish()
125 *
126 * Allowed functions: none
127 */
128
73static void *fdt_grab_space_(void *fdt, size_t len) 129static void *fdt_grab_space_(void *fdt, size_t len)
74{ 130{
75 int offset = fdt_size_dt_struct(fdt); 131 int offset = fdt_size_dt_struct(fdt);
@@ -87,9 +143,11 @@ static void *fdt_grab_space_(void *fdt, size_t len)
87 143
88int fdt_create(void *buf, int bufsize) 144int fdt_create(void *buf, int bufsize)
89{ 145{
146 const size_t hdrsize = FDT_ALIGN(sizeof(struct fdt_header),
147 sizeof(struct fdt_reserve_entry));
90 void *fdt = buf; 148 void *fdt = buf;
91 149
92 if (bufsize < sizeof(struct fdt_header)) 150 if (bufsize < hdrsize)
93 return -FDT_ERR_NOSPACE; 151 return -FDT_ERR_NOSPACE;
94 152
95 memset(buf, 0, bufsize); 153 memset(buf, 0, bufsize);
@@ -99,10 +157,9 @@ int fdt_create(void *buf, int bufsize)
99 fdt_set_last_comp_version(fdt, FDT_FIRST_SUPPORTED_VERSION); 157 fdt_set_last_comp_version(fdt, FDT_FIRST_SUPPORTED_VERSION);
100 fdt_set_totalsize(fdt, bufsize); 158 fdt_set_totalsize(fdt, bufsize);
101 159
102 fdt_set_off_mem_rsvmap(fdt, FDT_ALIGN(sizeof(struct fdt_header), 160 fdt_set_off_mem_rsvmap(fdt, hdrsize);
103 sizeof(struct fdt_reserve_entry)));
104 fdt_set_off_dt_struct(fdt, fdt_off_mem_rsvmap(fdt)); 161 fdt_set_off_dt_struct(fdt, fdt_off_mem_rsvmap(fdt));
105 fdt_set_off_dt_strings(fdt, bufsize); 162 fdt_set_off_dt_strings(fdt, 0);
106 163
107 return 0; 164 return 0;
108} 165}
@@ -112,11 +169,14 @@ int fdt_resize(void *fdt, void *buf, int bufsize)
112 size_t headsize, tailsize; 169 size_t headsize, tailsize;
113 char *oldtail, *newtail; 170 char *oldtail, *newtail;
114 171
115 FDT_SW_CHECK_HEADER(fdt); 172 FDT_SW_PROBE(fdt);
116 173
117 headsize = fdt_off_dt_struct(fdt); 174 headsize = fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt);
118 tailsize = fdt_size_dt_strings(fdt); 175 tailsize = fdt_size_dt_strings(fdt);
119 176
177 if ((headsize + tailsize) > fdt_totalsize(fdt))
178 return -FDT_ERR_INTERNAL;
179
120 if ((headsize + tailsize) > bufsize) 180 if ((headsize + tailsize) > bufsize)
121 return -FDT_ERR_NOSPACE; 181 return -FDT_ERR_NOSPACE;
122 182
@@ -133,8 +193,9 @@ int fdt_resize(void *fdt, void *buf, int bufsize)
133 memmove(buf, fdt, headsize); 193 memmove(buf, fdt, headsize);
134 } 194 }
135 195
136 fdt_set_off_dt_strings(buf, bufsize);
137 fdt_set_totalsize(buf, bufsize); 196 fdt_set_totalsize(buf, bufsize);
197 if (fdt_off_dt_strings(buf))
198 fdt_set_off_dt_strings(buf, bufsize);
138 199
139 return 0; 200 return 0;
140} 201}
@@ -144,10 +205,7 @@ int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size)
144 struct fdt_reserve_entry *re; 205 struct fdt_reserve_entry *re;
145 int offset; 206 int offset;
146 207
147 FDT_SW_CHECK_HEADER(fdt); 208 FDT_SW_PROBE_MEMRSV(fdt);
148
149 if (fdt_size_dt_struct(fdt))
150 return -FDT_ERR_BADSTATE;
151 209
152 offset = fdt_off_dt_struct(fdt); 210 offset = fdt_off_dt_struct(fdt);
153 if ((offset + sizeof(*re)) > fdt_totalsize(fdt)) 211 if ((offset + sizeof(*re)) > fdt_totalsize(fdt))
@@ -164,16 +222,23 @@ int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size)
164 222
165int fdt_finish_reservemap(void *fdt) 223int fdt_finish_reservemap(void *fdt)
166{ 224{
167 return fdt_add_reservemap_entry(fdt, 0, 0); 225 int err = fdt_add_reservemap_entry(fdt, 0, 0);
226
227 if (err)
228 return err;
229
230 fdt_set_off_dt_strings(fdt, fdt_totalsize(fdt));
231 return 0;
168} 232}
169 233
170int fdt_begin_node(void *fdt, const char *name) 234int fdt_begin_node(void *fdt, const char *name)
171{ 235{
172 struct fdt_node_header *nh; 236 struct fdt_node_header *nh;
173 int namelen = strlen(name) + 1; 237 int namelen;
174 238
175 FDT_SW_CHECK_HEADER(fdt); 239 FDT_SW_PROBE_STRUCT(fdt);
176 240
241 namelen = strlen(name) + 1;
177 nh = fdt_grab_space_(fdt, sizeof(*nh) + FDT_TAGALIGN(namelen)); 242 nh = fdt_grab_space_(fdt, sizeof(*nh) + FDT_TAGALIGN(namelen));
178 if (! nh) 243 if (! nh)
179 return -FDT_ERR_NOSPACE; 244 return -FDT_ERR_NOSPACE;
@@ -187,7 +252,7 @@ int fdt_end_node(void *fdt)
187{ 252{
188 fdt32_t *en; 253 fdt32_t *en;
189 254
190 FDT_SW_CHECK_HEADER(fdt); 255 FDT_SW_PROBE_STRUCT(fdt);
191 256
192 en = fdt_grab_space_(fdt, FDT_TAGSIZE); 257 en = fdt_grab_space_(fdt, FDT_TAGSIZE);
193 if (! en) 258 if (! en)
@@ -225,7 +290,7 @@ int fdt_property_placeholder(void *fdt, const char *name, int len, void **valp)
225 struct fdt_property *prop; 290 struct fdt_property *prop;
226 int nameoff; 291 int nameoff;
227 292
228 FDT_SW_CHECK_HEADER(fdt); 293 FDT_SW_PROBE_STRUCT(fdt);
229 294
230 nameoff = fdt_find_add_string_(fdt, name); 295 nameoff = fdt_find_add_string_(fdt, name);
231 if (nameoff == 0) 296 if (nameoff == 0)
@@ -262,7 +327,7 @@ int fdt_finish(void *fdt)
262 uint32_t tag; 327 uint32_t tag;
263 int offset, nextoffset; 328 int offset, nextoffset;
264 329
265 FDT_SW_CHECK_HEADER(fdt); 330 FDT_SW_PROBE_STRUCT(fdt);
266 331
267 /* Add terminator */ 332 /* Add terminator */
268 end = fdt_grab_space_(fdt, sizeof(*end)); 333 end = fdt_grab_space_(fdt, sizeof(*end));
diff --git a/scripts/dtc/libfdt/libfdt.h b/scripts/dtc/libfdt/libfdt.h
index 1e27780e1185..2bd151dd355f 100644
--- a/scripts/dtc/libfdt/libfdt.h
+++ b/scripts/dtc/libfdt/libfdt.h
@@ -90,8 +90,9 @@
90 90
91/* Error codes: codes for bad device tree blobs */ 91/* Error codes: codes for bad device tree blobs */
92#define FDT_ERR_TRUNCATED 8 92#define FDT_ERR_TRUNCATED 8
93 /* FDT_ERR_TRUNCATED: Structure block of the given device tree 93 /* FDT_ERR_TRUNCATED: FDT or a sub-block is improperly
94 * ends without an FDT_END tag. */ 94 * terminated (overflows, goes outside allowed bounds, or
95 * isn't properly terminated). */
95#define FDT_ERR_BADMAGIC 9 96#define FDT_ERR_BADMAGIC 9
96 /* FDT_ERR_BADMAGIC: Given "device tree" appears not to be a 97 /* FDT_ERR_BADMAGIC: Given "device tree" appears not to be a
97 * device tree at all - it is missing the flattened device 98 * device tree at all - it is missing the flattened device
@@ -153,6 +154,29 @@ static inline void *fdt_offset_ptr_w(void *fdt, int offset, int checklen)
153 154
154uint32_t fdt_next_tag(const void *fdt, int offset, int *nextoffset); 155uint32_t fdt_next_tag(const void *fdt, int offset, int *nextoffset);
155 156
157/*
158 * Alignment helpers:
159 * These helpers access words from a device tree blob. They're
160 * built to work even with unaligned pointers on platforms (ike
161 * ARM) that don't like unaligned loads and stores
162 */
163
164static inline uint32_t fdt32_ld(const fdt32_t *p)
165{
166 fdt32_t v;
167
168 memcpy(&v, p, sizeof(v));
169 return fdt32_to_cpu(v);
170}
171
172static inline uint64_t fdt64_ld(const fdt64_t *p)
173{
174 fdt64_t v;
175
176 memcpy(&v, p, sizeof(v));
177 return fdt64_to_cpu(v);
178}
179
156/**********************************************************************/ 180/**********************************************************************/
157/* Traversal functions */ 181/* Traversal functions */
158/**********************************************************************/ 182/**********************************************************************/
@@ -213,7 +237,7 @@ int fdt_next_subnode(const void *fdt, int offset);
213/* General functions */ 237/* General functions */
214/**********************************************************************/ 238/**********************************************************************/
215#define fdt_get_header(fdt, field) \ 239#define fdt_get_header(fdt, field) \
216 (fdt32_to_cpu(((const struct fdt_header *)(fdt))->field)) 240 (fdt32_ld(&((const struct fdt_header *)(fdt))->field))
217#define fdt_magic(fdt) (fdt_get_header(fdt, magic)) 241#define fdt_magic(fdt) (fdt_get_header(fdt, magic))
218#define fdt_totalsize(fdt) (fdt_get_header(fdt, totalsize)) 242#define fdt_totalsize(fdt) (fdt_get_header(fdt, totalsize))
219#define fdt_off_dt_struct(fdt) (fdt_get_header(fdt, off_dt_struct)) 243#define fdt_off_dt_struct(fdt) (fdt_get_header(fdt, off_dt_struct))
@@ -244,18 +268,31 @@ fdt_set_hdr_(size_dt_struct);
244#undef fdt_set_hdr_ 268#undef fdt_set_hdr_
245 269
246/** 270/**
247 * fdt_check_header - sanity check a device tree or possible device tree 271 * fdt_header_size - return the size of the tree's header
272 * @fdt: pointer to a flattened device tree
273 */
274size_t fdt_header_size_(uint32_t version);
275static inline size_t fdt_header_size(const void *fdt)
276{
277 return fdt_header_size_(fdt_version(fdt));
278}
279
280/**
281 * fdt_check_header - sanity check a device tree header
282
248 * @fdt: pointer to data which might be a flattened device tree 283 * @fdt: pointer to data which might be a flattened device tree
249 * 284 *
250 * fdt_check_header() checks that the given buffer contains what 285 * fdt_check_header() checks that the given buffer contains what
251 * appears to be a flattened device tree with sane information in its 286 * appears to be a flattened device tree, and that the header contains
252 * header. 287 * valid information (to the extent that can be determined from the
288 * header alone).
253 * 289 *
254 * returns: 290 * returns:
255 * 0, if the buffer appears to contain a valid device tree 291 * 0, if the buffer appears to contain a valid device tree
256 * -FDT_ERR_BADMAGIC, 292 * -FDT_ERR_BADMAGIC,
257 * -FDT_ERR_BADVERSION, 293 * -FDT_ERR_BADVERSION,
258 * -FDT_ERR_BADSTATE, standard meanings, as above 294 * -FDT_ERR_BADSTATE,
295 * -FDT_ERR_TRUNCATED, standard meanings, as above
259 */ 296 */
260int fdt_check_header(const void *fdt); 297int fdt_check_header(const void *fdt);
261 298
@@ -284,6 +321,24 @@ int fdt_move(const void *fdt, void *buf, int bufsize);
284/* Read-only functions */ 321/* Read-only functions */
285/**********************************************************************/ 322/**********************************************************************/
286 323
324int fdt_check_full(const void *fdt, size_t bufsize);
325
326/**
327 * fdt_get_string - retrieve a string from the strings block of a device tree
328 * @fdt: pointer to the device tree blob
329 * @stroffset: offset of the string within the strings block (native endian)
330 * @lenp: optional pointer to return the string's length
331 *
332 * fdt_get_string() retrieves a pointer to a single string from the
333 * strings block of the device tree blob at fdt, and optionally also
334 * returns the string's length in *lenp.
335 *
336 * returns:
337 * a pointer to the string, on success
338 * NULL, if stroffset is out of bounds, or doesn't point to a valid string
339 */
340const char *fdt_get_string(const void *fdt, int stroffset, int *lenp);
341
287/** 342/**
288 * fdt_string - retrieve a string from the strings block of a device tree 343 * fdt_string - retrieve a string from the strings block of a device tree
289 * @fdt: pointer to the device tree blob 344 * @fdt: pointer to the device tree blob
@@ -294,7 +349,7 @@ int fdt_move(const void *fdt, void *buf, int bufsize);
294 * 349 *
295 * returns: 350 * returns:
296 * a pointer to the string, on success 351 * a pointer to the string, on success
297 * NULL, if stroffset is out of bounds 352 * NULL, if stroffset is out of bounds, or doesn't point to a valid string
298 */ 353 */
299const char *fdt_string(const void *fdt, int stroffset); 354const char *fdt_string(const void *fdt, int stroffset);
300 355
@@ -1090,7 +1145,7 @@ int fdt_address_cells(const void *fdt, int nodeoffset);
1090 * 1145 *
1091 * returns: 1146 * returns:
1092 * 0 <= n < FDT_MAX_NCELLS, on success 1147 * 0 <= n < FDT_MAX_NCELLS, on success
1093 * 2, if the node has no #address-cells property 1148 * 2, if the node has no #size-cells property
1094 * -FDT_ERR_BADNCELLS, if the node has a badly formatted or invalid 1149 * -FDT_ERR_BADNCELLS, if the node has a badly formatted or invalid
1095 * #size-cells property 1150 * #size-cells property
1096 * -FDT_ERR_BADMAGIC, 1151 * -FDT_ERR_BADMAGIC,
@@ -1313,10 +1368,13 @@ static inline int fdt_property_u64(void *fdt, const char *name, uint64_t val)
1313 fdt64_t tmp = cpu_to_fdt64(val); 1368 fdt64_t tmp = cpu_to_fdt64(val);
1314 return fdt_property(fdt, name, &tmp, sizeof(tmp)); 1369 return fdt_property(fdt, name, &tmp, sizeof(tmp));
1315} 1370}
1371
1372#ifndef SWIG /* Not available in Python */
1316static inline int fdt_property_cell(void *fdt, const char *name, uint32_t val) 1373static inline int fdt_property_cell(void *fdt, const char *name, uint32_t val)
1317{ 1374{
1318 return fdt_property_u32(fdt, name, val); 1375 return fdt_property_u32(fdt, name, val);
1319} 1376}
1377#endif
1320 1378
1321/** 1379/**
1322 * fdt_property_placeholder - add a new property and return a ptr to its value 1380 * fdt_property_placeholder - add a new property and return a ptr to its value
diff --git a/scripts/dtc/libfdt/libfdt_env.h b/scripts/dtc/libfdt/libfdt_env.h
index bd2474628775..eb2053845c9c 100644
--- a/scripts/dtc/libfdt/libfdt_env.h
+++ b/scripts/dtc/libfdt/libfdt_env.h
@@ -56,6 +56,7 @@
56#include <stdint.h> 56#include <stdint.h>
57#include <stdlib.h> 57#include <stdlib.h>
58#include <string.h> 58#include <string.h>
59#include <limits.h>
59 60
60#ifdef __CHECKER__ 61#ifdef __CHECKER__
61#define FDT_FORCE __attribute__((force)) 62#define FDT_FORCE __attribute__((force))
diff --git a/scripts/dtc/libfdt/libfdt_internal.h b/scripts/dtc/libfdt/libfdt_internal.h
index 7681e192295b..4109f890ae60 100644
--- a/scripts/dtc/libfdt/libfdt_internal.h
+++ b/scripts/dtc/libfdt/libfdt_internal.h
@@ -55,10 +55,11 @@
55#define FDT_ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1)) 55#define FDT_ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1))
56#define FDT_TAGALIGN(x) (FDT_ALIGN((x), FDT_TAGSIZE)) 56#define FDT_TAGALIGN(x) (FDT_ALIGN((x), FDT_TAGSIZE))
57 57
58#define FDT_CHECK_HEADER(fdt) \ 58int fdt_ro_probe_(const void *fdt);
59#define FDT_RO_PROBE(fdt) \
59 { \ 60 { \
60 int err_; \ 61 int err_; \
61 if ((err_ = fdt_check_header(fdt)) != 0) \ 62 if ((err_ = fdt_ro_probe_(fdt)) != 0) \
62 return err_; \ 63 return err_; \
63 } 64 }
64 65
diff --git a/scripts/dtc/livetree.c b/scripts/dtc/livetree.c
index 6e4c367f54b3..4ff0679e0062 100644
--- a/scripts/dtc/livetree.c
+++ b/scripts/dtc/livetree.c
@@ -594,6 +594,7 @@ struct node *get_node_by_ref(struct node *tree, const char *ref)
594cell_t get_node_phandle(struct node *root, struct node *node) 594cell_t get_node_phandle(struct node *root, struct node *node)
595{ 595{
596 static cell_t phandle = 1; /* FIXME: ick, static local */ 596 static cell_t phandle = 1; /* FIXME: ick, static local */
597 struct data d = empty_data;
597 598
598 if ((node->phandle != 0) && (node->phandle != -1)) 599 if ((node->phandle != 0) && (node->phandle != -1))
599 return node->phandle; 600 return node->phandle;
@@ -603,17 +604,16 @@ cell_t get_node_phandle(struct node *root, struct node *node)
603 604
604 node->phandle = phandle; 605 node->phandle = phandle;
605 606
607 d = data_add_marker(d, TYPE_UINT32, NULL);
608 d = data_append_cell(d, phandle);
609
606 if (!get_property(node, "linux,phandle") 610 if (!get_property(node, "linux,phandle")
607 && (phandle_format & PHANDLE_LEGACY)) 611 && (phandle_format & PHANDLE_LEGACY))
608 add_property(node, 612 add_property(node, build_property("linux,phandle", d));
609 build_property("linux,phandle",
610 data_append_cell(empty_data, phandle)));
611 613
612 if (!get_property(node, "phandle") 614 if (!get_property(node, "phandle")
613 && (phandle_format & PHANDLE_EPAPR)) 615 && (phandle_format & PHANDLE_EPAPR))
614 add_property(node, 616 add_property(node, build_property("phandle", d));
615 build_property("phandle",
616 data_append_cell(empty_data, phandle)));
617 617
618 /* If the node *does* have a phandle property, we must 618 /* If the node *does* have a phandle property, we must
619 * be dealing with a self-referencing phandle, which will be 619 * be dealing with a self-referencing phandle, which will be
diff --git a/scripts/dtc/treesource.c b/scripts/dtc/treesource.c
index 2461a3d068a0..f2874f1d1465 100644
--- a/scripts/dtc/treesource.c
+++ b/scripts/dtc/treesource.c
@@ -61,24 +61,14 @@ static bool isstring(char c)
61 || strchr("\a\b\t\n\v\f\r", c)); 61 || strchr("\a\b\t\n\v\f\r", c));
62} 62}
63 63
64static void write_propval_string(FILE *f, struct data val) 64static void write_propval_string(FILE *f, const char *s, size_t len)
65{ 65{
66 const char *str = val.val; 66 const char *end = s + len - 1;
67 int i; 67 assert(*end == '\0');
68 struct marker *m = val.markers;
69
70 assert(str[val.len-1] == '\0');
71 68
72 while (m && (m->offset == 0)) {
73 if (m->type == LABEL)
74 fprintf(f, "%s: ", m->ref);
75 m = m->next;
76 }
77 fprintf(f, "\""); 69 fprintf(f, "\"");
78 70 while (s < end) {
79 for (i = 0; i < (val.len-1); i++) { 71 char c = *s++;
80 char c = str[i];
81
82 switch (c) { 72 switch (c) {
83 case '\a': 73 case '\a':
84 fprintf(f, "\\a"); 74 fprintf(f, "\\a");
@@ -108,91 +98,78 @@ static void write_propval_string(FILE *f, struct data val)
108 fprintf(f, "\\\""); 98 fprintf(f, "\\\"");
109 break; 99 break;
110 case '\0': 100 case '\0':
111 fprintf(f, "\", "); 101 fprintf(f, "\\0");
112 while (m && (m->offset <= (i + 1))) {
113 if (m->type == LABEL) {
114 assert(m->offset == (i+1));
115 fprintf(f, "%s: ", m->ref);
116 }
117 m = m->next;
118 }
119 fprintf(f, "\"");
120 break; 102 break;
121 default: 103 default:
122 if (isprint((unsigned char)c)) 104 if (isprint((unsigned char)c))
123 fprintf(f, "%c", c); 105 fprintf(f, "%c", c);
124 else 106 else
125 fprintf(f, "\\x%02hhx", c); 107 fprintf(f, "\\x%02"PRIx8, c);
126 } 108 }
127 } 109 }
128 fprintf(f, "\""); 110 fprintf(f, "\"");
129
130 /* Wrap up any labels at the end of the value */
131 for_each_marker_of_type(m, LABEL) {
132 assert (m->offset == val.len);
133 fprintf(f, " %s:", m->ref);
134 }
135} 111}
136 112
137static void write_propval_cells(FILE *f, struct data val) 113static void write_propval_int(FILE *f, const char *p, size_t len, size_t width)
138{ 114{
139 void *propend = val.val + val.len; 115 const char *end = p + len;
140 fdt32_t *cp = (fdt32_t *)val.val; 116 assert(len % width == 0);
141 struct marker *m = val.markers;
142
143 fprintf(f, "<");
144 for (;;) {
145 while (m && (m->offset <= ((char *)cp - val.val))) {
146 if (m->type == LABEL) {
147 assert(m->offset == ((char *)cp - val.val));
148 fprintf(f, "%s: ", m->ref);
149 }
150 m = m->next;
151 }
152 117
153 fprintf(f, "0x%x", fdt32_to_cpu(*cp++)); 118 for (; p < end; p += width) {
154 if ((void *)cp >= propend) 119 switch (width) {
120 case 1:
121 fprintf(f, " %02"PRIx8, *(const uint8_t*)p);
122 break;
123 case 2:
124 fprintf(f, " 0x%02"PRIx16, fdt16_to_cpu(*(const fdt16_t*)p));
125 break;
126 case 4:
127 fprintf(f, " 0x%02"PRIx32, fdt32_to_cpu(*(const fdt32_t*)p));
128 break;
129 case 8:
130 fprintf(f, " 0x%02"PRIx64, fdt64_to_cpu(*(const fdt64_t*)p));
155 break; 131 break;
156 fprintf(f, " "); 132 }
157 } 133 }
134}
158 135
159 /* Wrap up any labels at the end of the value */ 136static bool has_data_type_information(struct marker *m)
160 for_each_marker_of_type(m, LABEL) { 137{
161 assert (m->offset == val.len); 138 return m->type >= TYPE_UINT8;
162 fprintf(f, " %s:", m->ref);
163 }
164 fprintf(f, ">");
165} 139}
166 140
167static void write_propval_bytes(FILE *f, struct data val) 141static struct marker *next_type_marker(struct marker *m)
168{ 142{
169 void *propend = val.val + val.len; 143 while (m && !has_data_type_information(m))
170 const char *bp = val.val; 144 m = m->next;
171 struct marker *m = val.markers; 145 return m;
172 146}
173 fprintf(f, "[");
174 for (;;) {
175 while (m && (m->offset == (bp-val.val))) {
176 if (m->type == LABEL)
177 fprintf(f, "%s: ", m->ref);
178 m = m->next;
179 }
180 147
181 fprintf(f, "%02hhx", (unsigned char)(*bp++)); 148size_t type_marker_length(struct marker *m)
182 if ((const void *)bp >= propend) 149{
183 break; 150 struct marker *next = next_type_marker(m->next);
184 fprintf(f, " ");
185 }
186 151
187 /* Wrap up any labels at the end of the value */ 152 if (next)
188 for_each_marker_of_type(m, LABEL) { 153 return next->offset - m->offset;
189 assert (m->offset == val.len); 154 return 0;
190 fprintf(f, " %s:", m->ref);
191 }
192 fprintf(f, "]");
193} 155}
194 156
195static void write_propval(FILE *f, struct property *prop) 157static const char *delim_start[] = {
158 [TYPE_UINT8] = "[",
159 [TYPE_UINT16] = "/bits/ 16 <",
160 [TYPE_UINT32] = "<",
161 [TYPE_UINT64] = "/bits/ 64 <",
162 [TYPE_STRING] = "",
163};
164static const char *delim_end[] = {
165 [TYPE_UINT8] = " ]",
166 [TYPE_UINT16] = " >",
167 [TYPE_UINT32] = " >",
168 [TYPE_UINT64] = " >",
169 [TYPE_STRING] = "",
170};
171
172static enum markertype guess_value_type(struct property *prop)
196{ 173{
197 int len = prop->val.len; 174 int len = prop->val.len;
198 const char *p = prop->val.val; 175 const char *p = prop->val.val;
@@ -201,11 +178,6 @@ static void write_propval(FILE *f, struct property *prop)
201 int nnotstringlbl = 0, nnotcelllbl = 0; 178 int nnotstringlbl = 0, nnotcelllbl = 0;
202 int i; 179 int i;
203 180
204 if (len == 0) {
205 fprintf(f, ";\n");
206 return;
207 }
208
209 for (i = 0; i < len; i++) { 181 for (i = 0; i < len; i++) {
210 if (! isstring(p[i])) 182 if (! isstring(p[i]))
211 nnotstring++; 183 nnotstring++;
@@ -220,17 +192,91 @@ static void write_propval(FILE *f, struct property *prop)
220 nnotcelllbl++; 192 nnotcelllbl++;
221 } 193 }
222 194
223 fprintf(f, " = ");
224 if ((p[len-1] == '\0') && (nnotstring == 0) && (nnul < (len-nnul)) 195 if ((p[len-1] == '\0') && (nnotstring == 0) && (nnul < (len-nnul))
225 && (nnotstringlbl == 0)) { 196 && (nnotstringlbl == 0)) {
226 write_propval_string(f, prop->val); 197 return TYPE_STRING;
227 } else if (((len % sizeof(cell_t)) == 0) && (nnotcelllbl == 0)) { 198 } else if (((len % sizeof(cell_t)) == 0) && (nnotcelllbl == 0)) {
228 write_propval_cells(f, prop->val); 199 return TYPE_UINT32;
229 } else {
230 write_propval_bytes(f, prop->val);
231 } 200 }
232 201
233 fprintf(f, ";\n"); 202 return TYPE_UINT8;
203}
204
205static void write_propval(FILE *f, struct property *prop)
206{
207 size_t len = prop->val.len;
208 struct marker *m = prop->val.markers;
209 struct marker dummy_marker;
210 enum markertype emit_type = TYPE_NONE;
211
212 if (len == 0) {
213 fprintf(f, ";\n");
214 return;
215 }
216
217 fprintf(f, " = ");
218
219 if (!next_type_marker(m)) {
220 /* data type information missing, need to guess */
221 dummy_marker.type = guess_value_type(prop);
222 dummy_marker.next = prop->val.markers;
223 dummy_marker.offset = 0;
224 dummy_marker.ref = NULL;
225 m = &dummy_marker;
226 }
227
228 struct marker *m_label = prop->val.markers;
229 for_each_marker(m) {
230 size_t chunk_len;
231 const char *p = &prop->val.val[m->offset];
232
233 if (!has_data_type_information(m))
234 continue;
235
236 chunk_len = type_marker_length(m);
237 if (!chunk_len)
238 chunk_len = len - m->offset;
239
240 if (emit_type != TYPE_NONE)
241 fprintf(f, "%s, ", delim_end[emit_type]);
242 emit_type = m->type;
243
244 for_each_marker_of_type(m_label, LABEL) {
245 if (m_label->offset > m->offset)
246 break;
247 fprintf(f, "%s: ", m_label->ref);
248 }
249
250 fprintf(f, "%s", delim_start[emit_type]);
251
252 if (chunk_len <= 0)
253 continue;
254
255 switch(emit_type) {
256 case TYPE_UINT16:
257 write_propval_int(f, p, chunk_len, 2);
258 break;
259 case TYPE_UINT32:
260 write_propval_int(f, p, chunk_len, 4);
261 break;
262 case TYPE_UINT64:
263 write_propval_int(f, p, chunk_len, 8);
264 break;
265 case TYPE_STRING:
266 write_propval_string(f, p, chunk_len);
267 break;
268 default:
269 write_propval_int(f, p, chunk_len, 1);
270 }
271 }
272
273 /* Wrap up any labels at the end of the value */
274 for_each_marker_of_type(m_label, LABEL) {
275 assert (m_label->offset == len);
276 fprintf(f, " %s:", m_label->ref);
277 }
278
279 fprintf(f, "%s;\n", delim_end[emit_type] ? : "");
234} 280}
235 281
236static void write_tree_source_node(FILE *f, struct node *tree, int level) 282static void write_tree_source_node(FILE *f, struct node *tree, int level)
@@ -281,4 +327,3 @@ void dt_to_source(FILE *f, struct dt_info *dti)
281 327
282 write_tree_source_node(f, dti->dt, 0); 328 write_tree_source_node(f, dti->dt, 0);
283} 329}
284
diff --git a/scripts/dtc/update-dtc-source.sh b/scripts/dtc/update-dtc-source.sh
index 1a009fd195d0..7dd29a0362b8 100755
--- a/scripts/dtc/update-dtc-source.sh
+++ b/scripts/dtc/update-dtc-source.sh
@@ -32,7 +32,7 @@ DTC_UPSTREAM_PATH=`pwd`/../dtc
32DTC_LINUX_PATH=`pwd`/scripts/dtc 32DTC_LINUX_PATH=`pwd`/scripts/dtc
33 33
34DTC_SOURCE="checks.c data.c dtc.c dtc.h flattree.c fstree.c livetree.c srcpos.c \ 34DTC_SOURCE="checks.c data.c dtc.c dtc.h flattree.c fstree.c livetree.c srcpos.c \
35 srcpos.h treesource.c util.c util.h version_gen.h Makefile.dtc \ 35 srcpos.h treesource.c util.c util.h version_gen.h yamltree.c Makefile.dtc \
36 dtc-lexer.l dtc-parser.y" 36 dtc-lexer.l dtc-parser.y"
37LIBFDT_SOURCE="Makefile.libfdt fdt.c fdt.h fdt_addresses.c fdt_empty_tree.c \ 37LIBFDT_SOURCE="Makefile.libfdt fdt.c fdt.h fdt_addresses.c fdt_empty_tree.c \
38 fdt_overlay.c fdt_ro.c fdt_rw.c fdt_strerror.c fdt_sw.c \ 38 fdt_overlay.c fdt_ro.c fdt_rw.c fdt_strerror.c fdt_sw.c \
diff --git a/scripts/dtc/util.c b/scripts/dtc/util.c
index 9953c32a0244..a69b7a13463d 100644
--- a/scripts/dtc/util.c
+++ b/scripts/dtc/util.c
@@ -227,11 +227,11 @@ char get_escape_char(const char *s, int *i)
227 return val; 227 return val;
228} 228}
229 229
230int utilfdt_read_err_len(const char *filename, char **buffp, off_t *len) 230int utilfdt_read_err(const char *filename, char **buffp, size_t *len)
231{ 231{
232 int fd = 0; /* assume stdin */ 232 int fd = 0; /* assume stdin */
233 char *buf = NULL; 233 char *buf = NULL;
234 off_t bufsize = 1024, offset = 0; 234 size_t bufsize = 1024, offset = 0;
235 int ret = 0; 235 int ret = 0;
236 236
237 *buffp = NULL; 237 *buffp = NULL;
@@ -264,20 +264,15 @@ int utilfdt_read_err_len(const char *filename, char **buffp, off_t *len)
264 free(buf); 264 free(buf);
265 else 265 else
266 *buffp = buf; 266 *buffp = buf;
267 *len = bufsize; 267 if (len)
268 *len = bufsize;
268 return ret; 269 return ret;
269} 270}
270 271
271int utilfdt_read_err(const char *filename, char **buffp) 272char *utilfdt_read(const char *filename, size_t *len)
272{
273 off_t len;
274 return utilfdt_read_err_len(filename, buffp, &len);
275}
276
277char *utilfdt_read_len(const char *filename, off_t *len)
278{ 273{
279 char *buff; 274 char *buff;
280 int ret = utilfdt_read_err_len(filename, &buff, len); 275 int ret = utilfdt_read_err(filename, &buff, len);
281 276
282 if (ret) { 277 if (ret) {
283 fprintf(stderr, "Couldn't open blob from '%s': %s\n", filename, 278 fprintf(stderr, "Couldn't open blob from '%s': %s\n", filename,
@@ -288,12 +283,6 @@ char *utilfdt_read_len(const char *filename, off_t *len)
288 return buff; 283 return buff;
289} 284}
290 285
291char *utilfdt_read(const char *filename)
292{
293 off_t len;
294 return utilfdt_read_len(filename, &len);
295}
296
297int utilfdt_write_err(const char *filename, const void *blob) 286int utilfdt_write_err(const char *filename, const void *blob)
298{ 287{
299 int fd = 1; /* assume stdout */ 288 int fd = 1; /* assume stdout */
diff --git a/scripts/dtc/util.h b/scripts/dtc/util.h
index 66fba8ea709b..f6cea8274174 100644
--- a/scripts/dtc/util.h
+++ b/scripts/dtc/util.h
@@ -98,16 +98,10 @@ char get_escape_char(const char *s, int *i);
98 * stderr. 98 * stderr.
99 * 99 *
100 * @param filename The filename to read, or - for stdin 100 * @param filename The filename to read, or - for stdin
101 * @return Pointer to allocated buffer containing fdt, or NULL on error
102 */
103char *utilfdt_read(const char *filename);
104
105/**
106 * Like utilfdt_read(), but also passes back the size of the file read.
107 *
108 * @param len If non-NULL, the amount of data we managed to read 101 * @param len If non-NULL, the amount of data we managed to read
102 * @return Pointer to allocated buffer containing fdt, or NULL on error
109 */ 103 */
110char *utilfdt_read_len(const char *filename, off_t *len); 104char *utilfdt_read(const char *filename, size_t *len);
111 105
112/** 106/**
113 * Read a device tree file into a buffer. Does not report errors, but only 107 * Read a device tree file into a buffer. Does not report errors, but only
@@ -116,16 +110,10 @@ char *utilfdt_read_len(const char *filename, off_t *len);
116 * 110 *
117 * @param filename The filename to read, or - for stdin 111 * @param filename The filename to read, or - for stdin
118 * @param buffp Returns pointer to buffer containing fdt 112 * @param buffp Returns pointer to buffer containing fdt
119 * @return 0 if ok, else an errno value representing the error
120 */
121int utilfdt_read_err(const char *filename, char **buffp);
122
123/**
124 * Like utilfdt_read_err(), but also passes back the size of the file read.
125 *
126 * @param len If non-NULL, the amount of data we managed to read 113 * @param len If non-NULL, the amount of data we managed to read
114 * @return 0 if ok, else an errno value representing the error
127 */ 115 */
128int utilfdt_read_err_len(const char *filename, char **buffp, off_t *len); 116int utilfdt_read_err(const char *filename, char **buffp, size_t *len);
129 117
130/** 118/**
131 * Write a device tree buffer to a file. This will report any errors on 119 * Write a device tree buffer to a file. This will report any errors on
diff --git a/scripts/dtc/version_gen.h b/scripts/dtc/version_gen.h
index b00f14ff7a17..6d23fd095f16 100644
--- a/scripts/dtc/version_gen.h
+++ b/scripts/dtc/version_gen.h
@@ -1 +1 @@
#define DTC_VERSION "DTC 1.4.6-g84e414b0" #define DTC_VERSION "DTC 1.4.7-gc86da84d"
diff --git a/scripts/dtc/yamltree.c b/scripts/dtc/yamltree.c
new file mode 100644
index 000000000000..a00285a5a9ec
--- /dev/null
+++ b/scripts/dtc/yamltree.c
@@ -0,0 +1,247 @@
1/*
2 * (C) Copyright Linaro, Ltd. 2018
3 * (C) Copyright Arm Holdings. 2017
4 * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; either version 2 of the
9 * License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
19 * USA
20 */
21
22#include <stdlib.h>
23#include <yaml.h>
24#include "dtc.h"
25#include "srcpos.h"
26
27char *yaml_error_name[] = {
28 [YAML_NO_ERROR] = "no error",
29 [YAML_MEMORY_ERROR] = "memory error",
30 [YAML_READER_ERROR] = "reader error",
31 [YAML_SCANNER_ERROR] = "scanner error",
32 [YAML_PARSER_ERROR] = "parser error",
33 [YAML_COMPOSER_ERROR] = "composer error",
34 [YAML_WRITER_ERROR] = "writer error",
35 [YAML_EMITTER_ERROR] = "emitter error",
36};
37
38#define yaml_emitter_emit_or_die(emitter, event) ( \
39{ \
40 if (!yaml_emitter_emit(emitter, event)) \
41 die("yaml '%s': %s in %s, line %i\n", \
42 yaml_error_name[(emitter)->error], \
43 (emitter)->problem, __func__, __LINE__); \
44})
45
46static void yaml_propval_int(yaml_emitter_t *emitter, struct marker *markers, char *data, int len, int width)
47{
48 yaml_event_t event;
49 void *tag;
50 int off, start_offset = markers->offset;
51
52 switch(width) {
53 case 1: tag = "!u8"; break;
54 case 2: tag = "!u16"; break;
55 case 4: tag = "!u32"; break;
56 case 8: tag = "!u64"; break;
57 default:
58 die("Invalid width %i", width);
59 }
60 assert(len % width == 0);
61
62 yaml_sequence_start_event_initialize(&event, NULL,
63 (yaml_char_t *)tag, width == 4, YAML_FLOW_SEQUENCE_STYLE);
64 yaml_emitter_emit_or_die(emitter, &event);
65
66 for (off = 0; off < len; off += width) {
67 char buf[32];
68 struct marker *m;
69 bool is_phandle = false;
70
71 switch(width) {
72 case 1:
73 sprintf(buf, "0x%"PRIx8, *(uint8_t*)(data + off));
74 break;
75 case 2:
76 sprintf(buf, "0x%"PRIx16, fdt16_to_cpu(*(fdt16_t*)(data + off)));
77 break;
78 case 4:
79 sprintf(buf, "0x%"PRIx32, fdt32_to_cpu(*(fdt32_t*)(data + off)));
80 m = markers;
81 is_phandle = false;
82 for_each_marker_of_type(m, REF_PHANDLE) {
83 if (m->offset == (start_offset + off)) {
84 is_phandle = true;
85 break;
86 }
87 }
88 break;
89 case 8:
90 sprintf(buf, "0x%"PRIx64, fdt64_to_cpu(*(fdt64_t*)(data + off)));
91 break;
92 }
93
94 if (is_phandle)
95 yaml_scalar_event_initialize(&event, NULL,
96 (yaml_char_t*)"!phandle", (yaml_char_t *)buf,
97 strlen(buf), 0, 0, YAML_PLAIN_SCALAR_STYLE);
98 else
99 yaml_scalar_event_initialize(&event, NULL,
100 (yaml_char_t*)YAML_INT_TAG, (yaml_char_t *)buf,
101 strlen(buf), 1, 1, YAML_PLAIN_SCALAR_STYLE);
102 yaml_emitter_emit_or_die(emitter, &event);
103 }
104
105 yaml_sequence_end_event_initialize(&event);
106 yaml_emitter_emit_or_die(emitter, &event);
107}
108
109static void yaml_propval_string(yaml_emitter_t *emitter, char *str, int len)
110{
111 yaml_event_t event;
112 int i;
113
114 assert(str[len-1] == '\0');
115
116 /* Make sure the entire string is in the lower 7-bit ascii range */
117 for (i = 0; i < len; i++)
118 assert(isascii(str[i]));
119
120 yaml_scalar_event_initialize(&event, NULL,
121 (yaml_char_t *)YAML_STR_TAG, (yaml_char_t*)str,
122 len-1, 0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE);
123 yaml_emitter_emit_or_die(emitter, &event);
124}
125
126static void yaml_propval(yaml_emitter_t *emitter, struct property *prop)
127{
128 yaml_event_t event;
129 int len = prop->val.len;
130 struct marker *m = prop->val.markers;
131
132 /* Emit the property name */
133 yaml_scalar_event_initialize(&event, NULL,
134 (yaml_char_t *)YAML_STR_TAG, (yaml_char_t*)prop->name,
135 strlen(prop->name), 1, 1, YAML_PLAIN_SCALAR_STYLE);
136 yaml_emitter_emit_or_die(emitter, &event);
137
138 /* Boolean properties are easiest to deal with. Length is zero, so just emit 'true' */
139 if (len == 0) {
140 yaml_scalar_event_initialize(&event, NULL,
141 (yaml_char_t *)YAML_BOOL_TAG,
142 (yaml_char_t*)"true",
143 strlen("true"), 1, 0, YAML_PLAIN_SCALAR_STYLE);
144 yaml_emitter_emit_or_die(emitter, &event);
145 return;
146 }
147
148 if (!m)
149 die("No markers present in property '%s' value\n", prop->name);
150
151 yaml_sequence_start_event_initialize(&event, NULL,
152 (yaml_char_t *)YAML_SEQ_TAG, 1, YAML_FLOW_SEQUENCE_STYLE);
153 yaml_emitter_emit_or_die(emitter, &event);
154
155 for_each_marker(m) {
156 int chunk_len;
157 char *data = &prop->val.val[m->offset];
158
159 if (m->type < TYPE_UINT8)
160 continue;
161
162 chunk_len = type_marker_length(m) ? : len;
163 assert(chunk_len > 0);
164 len -= chunk_len;
165
166 switch(m->type) {
167 case TYPE_UINT16:
168 yaml_propval_int(emitter, m, data, chunk_len, 2);
169 break;
170 case TYPE_UINT32:
171 yaml_propval_int(emitter, m, data, chunk_len, 4);
172 break;
173 case TYPE_UINT64:
174 yaml_propval_int(emitter, m, data, chunk_len, 8);
175 break;
176 case TYPE_STRING:
177 yaml_propval_string(emitter, data, chunk_len);
178 break;
179 default:
180 yaml_propval_int(emitter, m, data, chunk_len, 1);
181 break;
182 }
183 }
184
185 yaml_sequence_end_event_initialize(&event);
186 yaml_emitter_emit_or_die(emitter, &event);
187}
188
189
190static void yaml_tree(struct node *tree, yaml_emitter_t *emitter)
191{
192 struct property *prop;
193 struct node *child;
194 yaml_event_t event;
195
196 if (tree->deleted)
197 return;
198
199 yaml_mapping_start_event_initialize(&event, NULL,
200 (yaml_char_t *)YAML_MAP_TAG, 1, YAML_ANY_MAPPING_STYLE);
201 yaml_emitter_emit_or_die(emitter, &event);
202
203 for_each_property(tree, prop)
204 yaml_propval(emitter, prop);
205
206 /* Loop over all the children, emitting them into the map */
207 for_each_child(tree, child) {
208 yaml_scalar_event_initialize(&event, NULL,
209 (yaml_char_t *)YAML_STR_TAG, (yaml_char_t*)child->name,
210 strlen(child->name), 1, 0, YAML_PLAIN_SCALAR_STYLE);
211 yaml_emitter_emit_or_die(emitter, &event);
212 yaml_tree(child, emitter);
213 }
214
215 yaml_mapping_end_event_initialize(&event);
216 yaml_emitter_emit_or_die(emitter, &event);
217}
218
219void dt_to_yaml(FILE *f, struct dt_info *dti)
220{
221 yaml_emitter_t emitter;
222 yaml_event_t event;
223
224 yaml_emitter_initialize(&emitter);
225 yaml_emitter_set_output_file(&emitter, f);
226 yaml_stream_start_event_initialize(&event, YAML_UTF8_ENCODING);
227 yaml_emitter_emit_or_die(&emitter, &event);
228
229 yaml_document_start_event_initialize(&event, NULL, NULL, NULL, 0);
230 yaml_emitter_emit_or_die(&emitter, &event);
231
232 yaml_sequence_start_event_initialize(&event, NULL, (yaml_char_t *)YAML_SEQ_TAG, 1, YAML_ANY_SEQUENCE_STYLE);
233 yaml_emitter_emit_or_die(&emitter, &event);
234
235 yaml_tree(dti->dt, &emitter);
236
237 yaml_sequence_end_event_initialize(&event);
238 yaml_emitter_emit_or_die(&emitter, &event);
239
240 yaml_document_end_event_initialize(&event, 0);
241 yaml_emitter_emit_or_die(&emitter, &event);
242
243 yaml_stream_end_event_initialize(&event);
244 yaml_emitter_emit_or_die(&emitter, &event);
245
246 yaml_emitter_delete(&emitter);
247}