Device tree changes for v3.8
Bug fixes, little cleanups, and documentation changes. The most invasive thing here touches a bunch of the arch directories to use a common build rule for .dtb files. There are no major changes to functionality here other than a ew new helper functions. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) iQIcBAABAgAGBQJQx2/sAAoJEEFnBt12D9kB8aYP/iInsIXDi6c0sGRNgYoFBZUH pGZH/PGcZjDD2WPUOos56KTDsWt2kIZm/4ck1mBmXMD5pKM4znIQyMTkhKFiyO0l CARwCjyRuaHQJHt88Pcaqhk34HGLgV7ntImMHwpIn0mNbjx7hruk9aU9Jqdcd32j 2ANbUYU9ikgq0e9s/+xQfB6QZxH1zecQkMalhQWvihtVybpG3xW67IROZv/69uL0 OtHZZJ7nCwXcEb84rcEHU781tO0CoQhr/pId7DirQEKaD8oNLHsejFEgGEFfFrvZ eFmJP/YmZh7Ll+NNTMHnQwyDNa2LFuLazbjaqCqUHQgcw9daFFeP5ga3Uqp7WZbU 4kIxBQJ3byELnttFVQbsMQag+IAgmgfp8YdJFk3VTJDJKwpMJAO1sQeoEUHnnWAr cyyCzROaFt1hUkhRiXso+IYNLvb60o0/2NJRTiObPdljy9OSXW6O3wFEGk9F/6u0 jgl9tisfLUL0orKnJ5tR3kbHaJKQd+6HgBRJNiuB+9FYO43j1cY/sYggSNCkiCMy RvlGYDCJ+lfmZdZ4T+QYLpjsOenFosV0JZGU6MVlZmEGzTtLyhALZQKNHuxLw1Nc oTe8Fx5aJrWEYe/HGqm4C43DqEiQUCmZ9NPae0JyfocmjuwARSnepvWe1XZNa/8t aNfK6UkTO/IL3zOtOHfd =LB3n -----END PGP SIGNATURE----- Merge tag 'devicetree-for-linus' of git://git.secretlab.ca/git/linux-2.6 Pull device tree changes from Grant Likely: "Here are the DT changes I've got queued up for v3.8. As described below, there are a lot of bug fixes here and documentation updates but nothing major: Bug fixes, little cleanups, and documentation changes. The most invasive thing here touches a bunch of the arch directories to use a common build rule for .dtb files. There are no major changes to functionality here other than a few new helper functions." * tag 'devicetree-for-linus' of git://git.secretlab.ca/git/linux-2.6: (34 commits) arm64: Fix the dtbs target building mtd: nand: davinci: fix the binding documentation rtc: rtc-mv: Add the device tree binding documentation devicetree/bindings: Move gpio-leds binding into leds directory of/vendor-prefixes: add Imagination Technologies microblaze: use new common dtc rule c6x: use new common dtc rule openrisc: use new common dtc rule arm64: Add dtbs target for building all the enabled dtb files arm64: use new common dtc rule ARM: dt: change .dtb build rules to build in dts directory kbuild: centralize .dts->.dtb rule Fix build when CONFIG_W1_MASTER_GPIO=m b exporting "allnodes" of/spi: Honour "status=disabled" property of device of_mdio: Honour "status=disabled" property of device of_i2c: Honour "status=disabled" property of device powerpc: Fix fallout from device_node->name constification of: add 'const' for of_parse_phandle parameter *np Documentation: correct of_platform_populate() argument list script: dtc: clean generated files ...
This commit is contained in:
commit
b58ed041a3
65 changed files with 358 additions and 208 deletions
|
@ -23,29 +23,16 @@ Recommended properties :
|
|||
- ti,davinci-nand-buswidth: buswidth 8 or 16
|
||||
- ti,davinci-nand-use-bbt: use flash based bad block table support.
|
||||
|
||||
Example (enbw_cmc board):
|
||||
aemif@60000000 {
|
||||
compatible = "ti,davinci-aemif";
|
||||
#address-cells = <2>;
|
||||
#size-cells = <1>;
|
||||
reg = <0x68000000 0x80000>;
|
||||
ranges = <2 0 0x60000000 0x02000000
|
||||
3 0 0x62000000 0x02000000
|
||||
4 0 0x64000000 0x02000000
|
||||
5 0 0x66000000 0x02000000
|
||||
6 0 0x68000000 0x02000000>;
|
||||
nand@3,0 {
|
||||
compatible = "ti,davinci-nand";
|
||||
reg = <3 0x0 0x807ff
|
||||
6 0x0 0x8000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ti,davinci-chipselect = <1>;
|
||||
ti,davinci-mask-ale = <0>;
|
||||
ti,davinci-mask-cle = <0>;
|
||||
ti,davinci-mask-chipsel = <0>;
|
||||
ti,davinci-ecc-mode = "hw";
|
||||
ti,davinci-ecc-bits = <4>;
|
||||
ti,davinci-nand-use-bbt;
|
||||
};
|
||||
Example(da850 EVM ):
|
||||
nand_cs3@62000000 {
|
||||
compatible = "ti,davinci-nand";
|
||||
reg = <0x62000000 0x807ff
|
||||
0x68000000 0x8000>;
|
||||
ti,davinci-chipselect = <1>;
|
||||
ti,davinci-mask-ale = <0>;
|
||||
ti,davinci-mask-cle = <0>;
|
||||
ti,davinci-mask-chipsel = <0>;
|
||||
ti,davinci-ecc-mode = "hw";
|
||||
ti,davinci-ecc-bits = <4>;
|
||||
ti,davinci-nand-use-bbt;
|
||||
};
|
||||
|
|
|
@ -37,7 +37,7 @@ L2: cache-controller {
|
|||
reg = <0xfff12000 0x1000>;
|
||||
arm,data-latency = <1 1 1>;
|
||||
arm,tag-latency = <2 2 2>;
|
||||
arm,filter-latency = <0x80000000 0x8000000>;
|
||||
arm,filter-ranges = <0x80000000 0x8000000>;
|
||||
cache-unified;
|
||||
cache-level = <2>;
|
||||
interrupts = <45>;
|
||||
|
|
18
Documentation/devicetree/bindings/i2c/i2c-mv64xxx.txt
Normal file
18
Documentation/devicetree/bindings/i2c/i2c-mv64xxx.txt
Normal file
|
@ -0,0 +1,18 @@
|
|||
|
||||
* Marvell MV64XXX I2C controller
|
||||
|
||||
Required properties :
|
||||
|
||||
- reg : Offset and length of the register set for the device
|
||||
- compatible : Should be "marvell,mv64xxx-i2c"
|
||||
- interrupts : The interrupt number
|
||||
- clock-frequency : Desired I2C bus clock frequency in Hz.
|
||||
|
||||
Examples:
|
||||
|
||||
i2c@11000 {
|
||||
compatible = "marvell,mv64xxx-i2c";
|
||||
reg = <0x11000 0x20>;
|
||||
interrupts = <29>;
|
||||
clock-frequency = <100000>;
|
||||
};
|
|
@ -31,21 +31,3 @@ Examples:
|
|||
reg = <0xd4025000 0x1000>;
|
||||
interrupts = <58>;
|
||||
};
|
||||
|
||||
* Marvell MV64XXX I2C controller
|
||||
|
||||
Required properties :
|
||||
|
||||
- reg : Offset and length of the register set for the device
|
||||
- compatible : Should be "marvell,mv64xxx-i2c"
|
||||
- interrupts : The interrupt number
|
||||
- clock-frequency : Desired I2C bus clock frequency in Hz.
|
||||
|
||||
Examples:
|
||||
|
||||
i2c@11000 {
|
||||
compatible = "marvell,mv64xxx-i2c";
|
||||
reg = <0x11000 0x20>;
|
||||
interrupts = <29>;
|
||||
clock-frequency = <100000>;
|
||||
};
|
23
Documentation/devicetree/bindings/leds/common.txt
Normal file
23
Documentation/devicetree/bindings/leds/common.txt
Normal file
|
@ -0,0 +1,23 @@
|
|||
Common leds properties.
|
||||
|
||||
Optional properties for child nodes:
|
||||
- label : The label for this LED. If omitted, the label is
|
||||
taken from the node name (excluding the unit address).
|
||||
|
||||
- linux,default-trigger : This parameter, if present, is a
|
||||
string defining the trigger assigned to the LED. Current triggers are:
|
||||
"backlight" - LED will act as a back-light, controlled by the framebuffer
|
||||
system
|
||||
"default-on" - LED will turn on (but for leds-gpio see "default-state"
|
||||
property in Documentation/devicetree/bindings/gpio/led.txt)
|
||||
"heartbeat" - LED "double" flashes at a load average based rate
|
||||
"ide-disk" - LED indicates disk activity
|
||||
"timer" - LED flashes at a fixed, configurable rate
|
||||
|
||||
Examples:
|
||||
|
||||
system-status {
|
||||
label = "Status";
|
||||
linux,default-trigger = "heartbeat";
|
||||
...
|
||||
};
|
|
@ -10,16 +10,10 @@ LED sub-node properties:
|
|||
- gpios : Should specify the LED's GPIO, see "gpios property" in
|
||||
Documentation/devicetree/bindings/gpio/gpio.txt. Active low LEDs should be
|
||||
indicated using flags in the GPIO specifier.
|
||||
- label : (optional) The label for this LED. If omitted, the label is
|
||||
taken from the node name (excluding the unit address).
|
||||
- linux,default-trigger : (optional) This parameter, if present, is a
|
||||
string defining the trigger assigned to the LED. Current triggers are:
|
||||
"backlight" - LED will act as a back-light, controlled by the framebuffer
|
||||
system
|
||||
"default-on" - LED will turn on, but see "default-state" below
|
||||
"heartbeat" - LED "double" flashes at a load average based rate
|
||||
"ide-disk" - LED indicates disk activity
|
||||
"timer" - LED flashes at a fixed, configurable rate
|
||||
- label : (optional)
|
||||
see Documentation/devicetree/bindings/leds/common.txt
|
||||
- linux,default-trigger : (optional)
|
||||
see Documentation/devicetree/bindings/leds/common.txt
|
||||
- default-state: (optional) The initial state of the LED. Valid
|
||||
values are "on", "off", and "keep". If the LED is already on or off
|
||||
and the default-state property is set the to same value, then no
|
18
Documentation/devicetree/bindings/rtc/orion-rtc.txt
Normal file
18
Documentation/devicetree/bindings/rtc/orion-rtc.txt
Normal file
|
@ -0,0 +1,18 @@
|
|||
* Mvebu Real Time Clock
|
||||
|
||||
RTC controller for the Kirkwood, the Dove, the Armada 370 and the
|
||||
Armada XP SoCs
|
||||
|
||||
Required properties:
|
||||
- compatible : Should be "marvell,orion-rtc"
|
||||
- reg: physical base address of the controller and length of memory mapped
|
||||
region.
|
||||
- interrupts: IRQ line for the RTC.
|
||||
|
||||
Example:
|
||||
|
||||
rtc@10300 {
|
||||
compatible = "marvell,orion-rtc";
|
||||
reg = <0xd0010300 0x20>;
|
||||
interrupts = <50>;
|
||||
};
|
|
@ -5,6 +5,7 @@ using them to avoid name-space collisions.
|
|||
|
||||
ad Avionic Design GmbH
|
||||
adi Analog Devices, Inc.
|
||||
ak Asahi Kasei Corp.
|
||||
amcc Applied Micro Circuits Corporation (APM, formally AMCC)
|
||||
apm Applied Micro Circuits Corporation (APM)
|
||||
arm ARM Ltd.
|
||||
|
@ -25,6 +26,7 @@ gef GE Fanuc Intelligent Platforms Embedded Systems, Inc.
|
|||
hp Hewlett Packard
|
||||
ibm International Business Machines (IBM)
|
||||
idt Integrated Device Technologies, Inc.
|
||||
img Imagination Technologies Ltd.
|
||||
intercontrol Inter Control Group
|
||||
linux Linux-specific binding
|
||||
marvell Marvell Technology Group Ltd.
|
||||
|
@ -34,8 +36,9 @@ national National Semiconductor
|
|||
nintendo Nintendo
|
||||
nvidia NVIDIA
|
||||
nxp NXP Semiconductors
|
||||
onnn ON Semiconductor Corp.
|
||||
picochip Picochip Ltd
|
||||
powervr Imagination Technologies
|
||||
powervr PowerVR (deprecated, use img)
|
||||
qcom Qualcomm, Inc.
|
||||
ramtron Ramtron International
|
||||
realtek Realtek Semiconductor Corp.
|
||||
|
@ -45,6 +48,7 @@ schindler Schindler
|
|||
sil Silicon Image
|
||||
simtek
|
||||
sirf SiRF Technology, Inc.
|
||||
snps Synopsys, Inc.
|
||||
st STMicroelectronics
|
||||
stericsson ST-Ericsson
|
||||
ti Texas Instruments
|
||||
|
|
|
@ -347,7 +347,7 @@ later), which will happily live at the base of the Linux /sys/devices
|
|||
tree. Therefore, if a DT node is at the root of the tree, then it
|
||||
really probably is best registered as a platform_device.
|
||||
|
||||
Linux board support code calls of_platform_populate(NULL, NULL, NULL)
|
||||
Linux board support code calls of_platform_populate(NULL, NULL, NULL, NULL)
|
||||
to kick off discovery of devices at the root of the tree. The
|
||||
parameters are all NULL because when starting from the root of the
|
||||
tree, there is no need to provide a starting node (the first NULL), a
|
||||
|
|
|
@ -1175,15 +1175,16 @@ When kbuild executes, the following steps are followed (roughly):
|
|||
in an init section in the image. Platform code *must* copy the
|
||||
blob to non-init memory prior to calling unflatten_device_tree().
|
||||
|
||||
To use this command, simply add *.dtb into obj-y or targets, or make
|
||||
some other target depend on %.dtb
|
||||
|
||||
A central rule exists to create $(obj)/%.dtb from $(src)/%.dts;
|
||||
architecture Makefiles do no need to explicitly write out that rule.
|
||||
|
||||
Example:
|
||||
#arch/x86/platform/ce4100/Makefile
|
||||
clean-files := *dtb.S
|
||||
|
||||
DTC_FLAGS := -p 1024
|
||||
obj-y += foo.dtb.o
|
||||
|
||||
$(obj)/%.dtb: $(src)/%.dts
|
||||
$(call cmd,dtc)
|
||||
targets += $(dtb-y)
|
||||
clean-files += *.dtb
|
||||
DTC_FLAGS ?= -p 1024
|
||||
|
||||
--- 6.8 Custom kbuild commands
|
||||
|
||||
|
|
|
@ -292,10 +292,10 @@ zinstall uinstall install: vmlinux
|
|||
$(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $@
|
||||
|
||||
%.dtb: scripts
|
||||
$(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@
|
||||
$(Q)$(MAKE) $(build)=$(boot)/dts MACHINE=$(MACHINE) $(boot)/dts/$@
|
||||
|
||||
dtbs: scripts
|
||||
$(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@
|
||||
$(Q)$(MAKE) $(build)=$(boot)/dts MACHINE=$(MACHINE) dtbs
|
||||
|
||||
# We use MRPROPER_FILES and CLEAN_FILES now
|
||||
archclean:
|
||||
|
|
|
@ -15,8 +15,6 @@ ifneq ($(MACHINE),)
|
|||
include $(srctree)/$(MACHINE)/Makefile.boot
|
||||
endif
|
||||
|
||||
include $(srctree)/arch/arm/boot/dts/Makefile
|
||||
|
||||
# Note: the following conditions must always be true:
|
||||
# ZRELADDR == virt_to_phys(PAGE_OFFSET + TEXT_OFFSET)
|
||||
# PARAMS_PHYS must be within 4MB of ZRELADDR
|
||||
|
@ -59,16 +57,6 @@ $(obj)/zImage: $(obj)/compressed/vmlinux FORCE
|
|||
|
||||
endif
|
||||
|
||||
targets += $(dtb-y)
|
||||
|
||||
# Rule to build device tree blobs
|
||||
$(obj)/%.dtb: $(src)/dts/%.dts FORCE
|
||||
$(call if_changed_dep,dtc)
|
||||
|
||||
$(obj)/dtbs: $(addprefix $(obj)/, $(dtb-y))
|
||||
|
||||
clean-files := *.dtb
|
||||
|
||||
ifneq ($(LOADADDR),)
|
||||
UIMAGE_LOADADDR=$(LOADADDR)
|
||||
else
|
||||
|
|
|
@ -120,4 +120,12 @@ dtb-$(CONFIG_ARCH_VT8500) += vt8500-bv07.dtb \
|
|||
wm8505-ref.dtb \
|
||||
wm8650-mid.dtb
|
||||
|
||||
targets += dtbs
|
||||
endif
|
||||
|
||||
# *.dtb used to be generated in the directory above. Clean out the
|
||||
# old build results so people don't accidentally use them.
|
||||
dtbs: $(addprefix $(obj)/, $(dtb-y))
|
||||
$(Q)rm -f $(obj)/../*.dtb
|
||||
|
||||
clean-files := *.dtb
|
||||
|
|
|
@ -523,12 +523,12 @@
|
|||
};
|
||||
|
||||
temperature-sensor@4c {
|
||||
compatible = "nct1008";
|
||||
compatible = "onnn,nct1008";
|
||||
reg = <0x4c>;
|
||||
};
|
||||
|
||||
magnetometer@c {
|
||||
compatible = "ak8975";
|
||||
compatible = "ak,ak8975";
|
||||
reg = <0xc>;
|
||||
interrupt-parent = <&gpio>;
|
||||
interrupts = <109 0x04>; /* gpio PN5 */
|
||||
|
|
|
@ -11,6 +11,8 @@
|
|||
#ifndef __ASMARM_PROM_H
|
||||
#define __ASMARM_PROM_H
|
||||
|
||||
#define HAVE_ARCH_DEVTREE_FIXUPS
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
|
||||
extern struct machine_desc *setup_machine_fdt(unsigned int dt_phys);
|
||||
|
|
|
@ -589,7 +589,7 @@ void __init v2m_dt_init_early(void)
|
|||
return;
|
||||
|
||||
/* Confirm board type against DT property, if available */
|
||||
if (of_property_read_u32(allnodes, "arm,hbi", &dt_hbi) == 0) {
|
||||
if (of_property_read_u32(of_allnodes, "arm,hbi", &dt_hbi) == 0) {
|
||||
int site = v2m_get_master_site();
|
||||
u32 id = readl(v2m_sysreg_base + (site == SYS_CFG_SITE_DB2 ?
|
||||
V2M_SYS_PROCID1 : V2M_SYS_PROCID0));
|
||||
|
|
|
@ -41,20 +41,24 @@ libs-y := arch/arm64/lib/ $(libs-y)
|
|||
libs-y += $(LIBGCC)
|
||||
|
||||
# Default target when executing plain make
|
||||
KBUILD_IMAGE := Image.gz
|
||||
KBUILD_IMAGE := Image.gz
|
||||
KBUILD_DTBS := dtbs
|
||||
|
||||
all: $(KBUILD_IMAGE)
|
||||
all: $(KBUILD_IMAGE) $(KBUILD_DTBS)
|
||||
|
||||
boot := arch/arm64/boot
|
||||
|
||||
Image Image.gz: vmlinux
|
||||
$(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@
|
||||
$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
|
||||
|
||||
zinstall install: vmlinux
|
||||
$(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $@
|
||||
$(Q)$(MAKE) $(build)=$(boot) $@
|
||||
|
||||
%.dtb:
|
||||
$(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@
|
||||
%.dtb: scripts
|
||||
$(Q)$(MAKE) $(build)=$(boot)/dts $(boot)/dts/$@
|
||||
|
||||
dtbs: scripts
|
||||
$(Q)$(MAKE) $(build)=$(boot)/dts dtbs
|
||||
|
||||
# We use MRPROPER_FILES and CLEAN_FILES now
|
||||
archclean:
|
||||
|
@ -63,6 +67,7 @@ archclean:
|
|||
define archhelp
|
||||
echo '* Image.gz - Compressed kernel image (arch/$(ARCH)/boot/Image.gz)'
|
||||
echo ' Image - Uncompressed kernel image (arch/$(ARCH)/boot/Image)'
|
||||
echo '* dtbs - Build device tree blobs for enabled boards'
|
||||
echo ' install - Install uncompressed kernel'
|
||||
echo ' zinstall - Install compressed kernel'
|
||||
echo ' Install using (your) ~/bin/installkernel or'
|
||||
|
|
|
@ -22,9 +22,6 @@ $(obj)/Image: vmlinux FORCE
|
|||
$(obj)/Image.gz: $(obj)/Image FORCE
|
||||
$(call if_changed,gzip)
|
||||
|
||||
$(obj)/%.dtb: $(src)/dts/%.dts
|
||||
$(call cmd,dtc)
|
||||
|
||||
install: $(obj)/Image
|
||||
$(CONFIG_SHELL) $(srctree)/$(src)/install.sh $(KERNELRELEASE) \
|
||||
$(obj)/Image System.map "$(INSTALL_PATH)"
|
||||
|
@ -32,5 +29,3 @@ install: $(obj)/Image
|
|||
zinstall: $(obj)/Image.gz
|
||||
$(CONFIG_SHELL) $(srctree)/$(src)/install.sh $(KERNELRELEASE) \
|
||||
$(obj)/Image.gz System.map "$(INSTALL_PATH)"
|
||||
|
||||
clean-files += *.dtb
|
||||
|
|
1
arch/arm64/boot/dts/.gitignore
vendored
Normal file
1
arch/arm64/boot/dts/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
*.dtb
|
5
arch/arm64/boot/dts/Makefile
Normal file
5
arch/arm64/boot/dts/Makefile
Normal file
|
@ -0,0 +1,5 @@
|
|||
targets += dtbs
|
||||
|
||||
dtbs: $(addprefix $(obj)/, $(dtb-y))
|
||||
|
||||
clean-files := *.dtb
|
|
@ -41,7 +41,7 @@ DTB:=$(subst dtbImage.,,$(filter dtbImage.%, $(MAKECMDGOALS)))
|
|||
export DTB
|
||||
|
||||
ifneq ($(DTB),)
|
||||
core-y += $(boot)/
|
||||
core-y += $(boot)/dts/
|
||||
endif
|
||||
|
||||
# With make 3.82 we cannot mix normal and wildcard targets
|
||||
|
|
|
@ -6,25 +6,5 @@ OBJCOPYFLAGS_vmlinux.bin := -O binary
|
|||
$(obj)/vmlinux.bin: vmlinux FORCE
|
||||
$(call if_changed,objcopy)
|
||||
|
||||
DTC_FLAGS ?= -p 1024
|
||||
|
||||
ifneq ($(DTB),)
|
||||
obj-y += linked_dtb.o
|
||||
endif
|
||||
|
||||
$(obj)/%.dtb: $(src)/dts/%.dts FORCE
|
||||
$(call if_changed_dep,dtc)
|
||||
|
||||
quiet_cmd_cp = CP $< $@$2
|
||||
cmd_cp = cat $< >$@$2 || (rm -f $@ && echo false)
|
||||
|
||||
# Generate builtin.dtb from $(DTB).dtb
|
||||
$(obj)/builtin.dtb: $(obj)/$(DTB).dtb
|
||||
$(call if_changed,cp)
|
||||
|
||||
$(obj)/linked_dtb.o: $(obj)/builtin.dtb
|
||||
|
||||
$(obj)/dtbImage.%: vmlinux
|
||||
$(call if_changed,objcopy)
|
||||
|
||||
clean-files := $(obj)/*.dtb
|
||||
|
|
20
arch/c6x/boot/dts/Makefile
Normal file
20
arch/c6x/boot/dts/Makefile
Normal file
|
@ -0,0 +1,20 @@
|
|||
#
|
||||
# Makefile for device trees
|
||||
#
|
||||
|
||||
DTC_FLAGS ?= -p 1024
|
||||
|
||||
ifneq ($(DTB),)
|
||||
obj-y += linked_dtb.o
|
||||
endif
|
||||
|
||||
quiet_cmd_cp = CP $< $@$2
|
||||
cmd_cp = cat $< >$@$2 || (rm -f $@ && echo false)
|
||||
|
||||
# Generate builtin.dtb from $(DTB).dtb
|
||||
$(obj)/builtin.dtb: $(obj)/$(DTB).dtb
|
||||
$(call if_changed,cp)
|
||||
|
||||
$(obj)/linked_dtb.o: $(obj)/builtin.dtb
|
||||
|
||||
clean-files := *.dtb
|
2
arch/c6x/boot/dts/linked_dtb.S
Normal file
2
arch/c6x/boot/dts/linked_dtb.S
Normal file
|
@ -0,0 +1,2 @@
|
|||
.section __fdt_blob,"a"
|
||||
.incbin "arch/c6x/boot/dts/builtin.dtb"
|
|
@ -1,2 +0,0 @@
|
|||
.section __fdt_blob,"a"
|
||||
.incbin "arch/c6x/boot/builtin.dtb"
|
|
@ -57,7 +57,7 @@ boot := arch/microblaze/boot
|
|||
DTB:=$(subst simpleImage.,,$(filter simpleImage.%, $(MAKECMDGOALS)))
|
||||
|
||||
ifneq ($(DTB),)
|
||||
core-y += $(boot)/
|
||||
core-y += $(boot)/dts/
|
||||
endif
|
||||
|
||||
# defines filename extension depending memory management type
|
||||
|
|
|
@ -2,21 +2,10 @@
|
|||
# arch/microblaze/boot/Makefile
|
||||
#
|
||||
|
||||
obj-y += linked_dtb.o
|
||||
|
||||
targets := linux.bin linux.bin.gz simpleImage.%
|
||||
|
||||
OBJCOPYFLAGS := -R .note -R .comment -R .note.gnu.build-id -O binary
|
||||
|
||||
# Ensure system.dtb exists
|
||||
$(obj)/linked_dtb.o: $(obj)/system.dtb
|
||||
|
||||
# Generate system.dtb from $(DTB).dtb
|
||||
ifneq ($(DTB),system)
|
||||
$(obj)/system.dtb: $(obj)/$(DTB).dtb
|
||||
$(call if_changed,cp)
|
||||
endif
|
||||
|
||||
$(obj)/linux.bin: vmlinux FORCE
|
||||
$(call if_changed,objcopy)
|
||||
$(call if_changed,uimage)
|
||||
|
@ -45,10 +34,4 @@ $(obj)/simpleImage.%: vmlinux FORCE
|
|||
@echo 'Kernel: $@ is ready' ' (#'`cat .version`')'
|
||||
|
||||
|
||||
# Rule to build device tree blobs
|
||||
DTC_FLAGS := -p 1024
|
||||
|
||||
$(obj)/%.dtb: $(src)/dts/%.dts FORCE
|
||||
$(call if_changed_dep,dtc)
|
||||
|
||||
clean-files += *.dtb simpleImage.*.unstrip linux.bin.ub
|
||||
clean-files += simpleImage.*.unstrip linux.bin.ub
|
||||
|
|
22
arch/microblaze/boot/dts/Makefile
Normal file
22
arch/microblaze/boot/dts/Makefile
Normal file
|
@ -0,0 +1,22 @@
|
|||
#
|
||||
# arch/microblaze/boot/Makefile
|
||||
#
|
||||
|
||||
obj-y += linked_dtb.o
|
||||
|
||||
# Ensure system.dtb exists
|
||||
$(obj)/linked_dtb.o: $(obj)/system.dtb
|
||||
|
||||
# Generate system.dtb from $(DTB).dtb
|
||||
ifneq ($(DTB),system)
|
||||
$(obj)/system.dtb: $(obj)/$(DTB).dtb
|
||||
$(call if_changed,cp)
|
||||
endif
|
||||
|
||||
quiet_cmd_cp = CP $< $@$2
|
||||
cmd_cp = cat $< >$@$2 || (rm -f $@ && echo false)
|
||||
|
||||
# Rule to build device tree blobs
|
||||
DTC_FLAGS := -p 1024
|
||||
|
||||
clean-files += *.dtb
|
2
arch/microblaze/boot/dts/linked_dtb.S
Normal file
2
arch/microblaze/boot/dts/linked_dtb.S
Normal file
|
@ -0,0 +1,2 @@
|
|||
.section __fdt_blob,"a"
|
||||
.incbin "arch/microblaze/boot/dts/system.dtb"
|
|
@ -1,3 +0,0 @@
|
|||
.section __fdt_blob,"a"
|
||||
.incbin "arch/microblaze/boot/system.dtb"
|
||||
|
|
@ -24,9 +24,6 @@ DTB_FILES = $(patsubst %.dts, %.dtb, $(DTS_FILES))
|
|||
|
||||
obj-y += $(patsubst %.dts, %.dtb.o, $(DTS_FILES))
|
||||
|
||||
$(obj)/%.dtb: $(src)/%.dts FORCE
|
||||
$(call if_changed_dep,dtc)
|
||||
|
||||
# Let's keep the .dtb files around in case we want to look at them.
|
||||
.SECONDARY: $(addprefix $(obj)/, $(DTB_FILES))
|
||||
|
||||
|
|
|
@ -1,4 +1 @@
|
|||
obj-$(CONFIG_DT_EASY50712) := easy50712.dtb.o
|
||||
|
||||
$(obj)/%.dtb: $(obj)/%.dts
|
||||
$(call if_changed,dtc)
|
||||
|
|
|
@ -1,4 +1 @@
|
|||
obj-$(CONFIG_DT_XLP_EVP) := xlp_evp.dtb.o
|
||||
|
||||
$(obj)/%.dtb: $(obj)/%.dts
|
||||
$(call if_changed,dtc)
|
||||
|
|
|
@ -50,6 +50,6 @@ BUILTIN_DTB := y
|
|||
else
|
||||
BUILTIN_DTB := n
|
||||
endif
|
||||
core-$(BUILTIN_DTB) += arch/openrisc/boot/
|
||||
core-$(BUILTIN_DTB) += arch/openrisc/boot/dts/
|
||||
|
||||
all: vmlinux
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
|
||||
|
||||
ifneq '$(CONFIG_OPENRISC_BUILTIN_DTB)' '""'
|
||||
BUILTIN_DTB := $(patsubst "%",%,$(CONFIG_OPENRISC_BUILTIN_DTB)).dtb.o
|
||||
else
|
||||
|
@ -10,6 +8,3 @@ obj-y += $(BUILTIN_DTB)
|
|||
clean-files := *.dtb.S
|
||||
|
||||
#DTC_FLAGS ?= -p 1024
|
||||
|
||||
$(obj)/%.dtb: $(src)/dts/%.dts FORCE
|
||||
$(call if_changed_dep,dtc)
|
|
@ -686,7 +686,7 @@ static int pmf_add_functions(struct pmf_device *dev, void *driverdata)
|
|||
int count = 0;
|
||||
|
||||
for (pp = dev->node->properties; pp != 0; pp = pp->next) {
|
||||
char *name;
|
||||
const char *name;
|
||||
if (strncmp(pp->name, PP_PREFIX, plen) != 0)
|
||||
continue;
|
||||
name = pp->name + plen;
|
||||
|
|
|
@ -281,12 +281,11 @@ static struct property *new_property(const char *name, const int length,
|
|||
if (!new)
|
||||
return NULL;
|
||||
|
||||
if (!(new->name = kmalloc(strlen(name) + 1, GFP_KERNEL)))
|
||||
if (!(new->name = kstrdup(name, GFP_KERNEL)))
|
||||
goto cleanup;
|
||||
if (!(new->value = kmalloc(length + 1, GFP_KERNEL)))
|
||||
goto cleanup;
|
||||
|
||||
strcpy(new->name, name);
|
||||
memcpy(new->value, value, length);
|
||||
*(((char *)new->value) + length) = 0;
|
||||
new->length = length;
|
||||
|
|
|
@ -136,7 +136,7 @@ static void __init setup_pci_atmu(struct pci_controller *hose,
|
|||
u32 pcicsrbar = 0, pcicsrbar_sz;
|
||||
u32 piwar = PIWAR_EN | PIWAR_PF | PIWAR_TGI_LOCAL |
|
||||
PIWAR_READ_SNOOP | PIWAR_WRITE_SNOOP;
|
||||
char *name = hose->dn->full_name;
|
||||
const char *name = hose->dn->full_name;
|
||||
const u64 *reg;
|
||||
int len;
|
||||
|
||||
|
|
|
@ -157,7 +157,7 @@ static int scom_debug_init_one(struct dentry *root, struct device_node *dn,
|
|||
ent->map = SCOM_MAP_INVALID;
|
||||
spin_lock_init(&ent->lock);
|
||||
snprintf(ent->name, 8, "scom%d", i);
|
||||
ent->blob.data = dn->full_name;
|
||||
ent->blob.data = (void*) dn->full_name;
|
||||
ent->blob.size = strlen(dn->full_name);
|
||||
|
||||
dir = debugfs_create_dir(ent->name, root);
|
||||
|
|
|
@ -88,7 +88,7 @@ struct pci_pbm_info {
|
|||
int chip_revision;
|
||||
|
||||
/* Name used for top-level resources. */
|
||||
char *name;
|
||||
const char *name;
|
||||
|
||||
/* OBP specific information. */
|
||||
struct platform_device *op;
|
||||
|
|
|
@ -9,10 +9,6 @@
|
|||
* kind, whether express or implied.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This driver can be used from the device tree, see
|
||||
* Documentation/devicetree/bindings/i2c/ocore-i2c.txt
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
|
|
|
@ -45,7 +45,8 @@ struct alias_prop {
|
|||
|
||||
static LIST_HEAD(aliases_lookup);
|
||||
|
||||
struct device_node *allnodes;
|
||||
struct device_node *of_allnodes;
|
||||
EXPORT_SYMBOL(of_allnodes);
|
||||
struct device_node *of_chosen;
|
||||
struct device_node *of_aliases;
|
||||
|
||||
|
@ -199,7 +200,7 @@ struct device_node *of_find_all_nodes(struct device_node *prev)
|
|||
struct device_node *np;
|
||||
|
||||
read_lock(&devtree_lock);
|
||||
np = prev ? prev->allnext : allnodes;
|
||||
np = prev ? prev->allnext : of_allnodes;
|
||||
for (; np != NULL; np = np->allnext)
|
||||
if (of_node_get(np))
|
||||
break;
|
||||
|
@ -422,7 +423,7 @@ EXPORT_SYMBOL(of_get_child_by_name);
|
|||
*/
|
||||
struct device_node *of_find_node_by_path(const char *path)
|
||||
{
|
||||
struct device_node *np = allnodes;
|
||||
struct device_node *np = of_allnodes;
|
||||
|
||||
read_lock(&devtree_lock);
|
||||
for (; np; np = np->allnext) {
|
||||
|
@ -452,7 +453,7 @@ struct device_node *of_find_node_by_name(struct device_node *from,
|
|||
struct device_node *np;
|
||||
|
||||
read_lock(&devtree_lock);
|
||||
np = from ? from->allnext : allnodes;
|
||||
np = from ? from->allnext : of_allnodes;
|
||||
for (; np; np = np->allnext)
|
||||
if (np->name && (of_node_cmp(np->name, name) == 0)
|
||||
&& of_node_get(np))
|
||||
|
@ -481,7 +482,7 @@ struct device_node *of_find_node_by_type(struct device_node *from,
|
|||
struct device_node *np;
|
||||
|
||||
read_lock(&devtree_lock);
|
||||
np = from ? from->allnext : allnodes;
|
||||
np = from ? from->allnext : of_allnodes;
|
||||
for (; np; np = np->allnext)
|
||||
if (np->type && (of_node_cmp(np->type, type) == 0)
|
||||
&& of_node_get(np))
|
||||
|
@ -512,7 +513,7 @@ struct device_node *of_find_compatible_node(struct device_node *from,
|
|||
struct device_node *np;
|
||||
|
||||
read_lock(&devtree_lock);
|
||||
np = from ? from->allnext : allnodes;
|
||||
np = from ? from->allnext : of_allnodes;
|
||||
for (; np; np = np->allnext) {
|
||||
if (type
|
||||
&& !(np->type && (of_node_cmp(np->type, type) == 0)))
|
||||
|
@ -545,7 +546,7 @@ struct device_node *of_find_node_with_property(struct device_node *from,
|
|||
struct property *pp;
|
||||
|
||||
read_lock(&devtree_lock);
|
||||
np = from ? from->allnext : allnodes;
|
||||
np = from ? from->allnext : of_allnodes;
|
||||
for (; np; np = np->allnext) {
|
||||
for (pp = np->properties; pp; pp = pp->next) {
|
||||
if (of_prop_cmp(pp->name, prop_name) == 0) {
|
||||
|
@ -594,27 +595,35 @@ const struct of_device_id *of_match_node(const struct of_device_id *matches,
|
|||
EXPORT_SYMBOL(of_match_node);
|
||||
|
||||
/**
|
||||
* of_find_matching_node - Find a node based on an of_device_id match
|
||||
* table.
|
||||
* of_find_matching_node_and_match - Find a node based on an of_device_id
|
||||
* match table.
|
||||
* @from: The node to start searching from or NULL, the node
|
||||
* you pass will not be searched, only the next one
|
||||
* will; typically, you pass what the previous call
|
||||
* returned. of_node_put() will be called on it
|
||||
* @matches: array of of device match structures to search in
|
||||
* @match Updated to point at the matches entry which matched
|
||||
*
|
||||
* Returns a node pointer with refcount incremented, use
|
||||
* of_node_put() on it when done.
|
||||
*/
|
||||
struct device_node *of_find_matching_node(struct device_node *from,
|
||||
const struct of_device_id *matches)
|
||||
struct device_node *of_find_matching_node_and_match(struct device_node *from,
|
||||
const struct of_device_id *matches,
|
||||
const struct of_device_id **match)
|
||||
{
|
||||
struct device_node *np;
|
||||
|
||||
if (match)
|
||||
*match = NULL;
|
||||
|
||||
read_lock(&devtree_lock);
|
||||
np = from ? from->allnext : allnodes;
|
||||
np = from ? from->allnext : of_allnodes;
|
||||
for (; np; np = np->allnext) {
|
||||
if (of_match_node(matches, np) && of_node_get(np))
|
||||
if (of_match_node(matches, np) && of_node_get(np)) {
|
||||
if (match)
|
||||
*match = matches;
|
||||
break;
|
||||
}
|
||||
}
|
||||
of_node_put(from);
|
||||
read_unlock(&devtree_lock);
|
||||
|
@ -661,7 +670,7 @@ struct device_node *of_find_node_by_phandle(phandle handle)
|
|||
struct device_node *np;
|
||||
|
||||
read_lock(&devtree_lock);
|
||||
for (np = allnodes; np; np = np->allnext)
|
||||
for (np = of_allnodes; np; np = np->allnext)
|
||||
if (np->phandle == handle)
|
||||
break;
|
||||
of_node_get(np);
|
||||
|
@ -670,6 +679,82 @@ struct device_node *of_find_node_by_phandle(phandle handle)
|
|||
}
|
||||
EXPORT_SYMBOL(of_find_node_by_phandle);
|
||||
|
||||
/**
|
||||
* of_property_read_u8_array - Find and read an array of u8 from a property.
|
||||
*
|
||||
* @np: device node from which the property value is to be read.
|
||||
* @propname: name of the property to be searched.
|
||||
* @out_value: pointer to return value, modified only if return value is 0.
|
||||
* @sz: number of array elements to read
|
||||
*
|
||||
* Search for a property in a device node and read 8-bit value(s) from
|
||||
* it. Returns 0 on success, -EINVAL if the property does not exist,
|
||||
* -ENODATA if property does not have a value, and -EOVERFLOW if the
|
||||
* property data isn't large enough.
|
||||
*
|
||||
* dts entry of array should be like:
|
||||
* property = /bits/ 8 <0x50 0x60 0x70>;
|
||||
*
|
||||
* The out_value is modified only if a valid u8 value can be decoded.
|
||||
*/
|
||||
int of_property_read_u8_array(const struct device_node *np,
|
||||
const char *propname, u8 *out_values, size_t sz)
|
||||
{
|
||||
struct property *prop = of_find_property(np, propname, NULL);
|
||||
const u8 *val;
|
||||
|
||||
if (!prop)
|
||||
return -EINVAL;
|
||||
if (!prop->value)
|
||||
return -ENODATA;
|
||||
if ((sz * sizeof(*out_values)) > prop->length)
|
||||
return -EOVERFLOW;
|
||||
|
||||
val = prop->value;
|
||||
while (sz--)
|
||||
*out_values++ = *val++;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(of_property_read_u8_array);
|
||||
|
||||
/**
|
||||
* of_property_read_u16_array - Find and read an array of u16 from a property.
|
||||
*
|
||||
* @np: device node from which the property value is to be read.
|
||||
* @propname: name of the property to be searched.
|
||||
* @out_value: pointer to return value, modified only if return value is 0.
|
||||
* @sz: number of array elements to read
|
||||
*
|
||||
* Search for a property in a device node and read 16-bit value(s) from
|
||||
* it. Returns 0 on success, -EINVAL if the property does not exist,
|
||||
* -ENODATA if property does not have a value, and -EOVERFLOW if the
|
||||
* property data isn't large enough.
|
||||
*
|
||||
* dts entry of array should be like:
|
||||
* property = /bits/ 16 <0x5000 0x6000 0x7000>;
|
||||
*
|
||||
* The out_value is modified only if a valid u16 value can be decoded.
|
||||
*/
|
||||
int of_property_read_u16_array(const struct device_node *np,
|
||||
const char *propname, u16 *out_values, size_t sz)
|
||||
{
|
||||
struct property *prop = of_find_property(np, propname, NULL);
|
||||
const __be16 *val;
|
||||
|
||||
if (!prop)
|
||||
return -EINVAL;
|
||||
if (!prop->value)
|
||||
return -ENODATA;
|
||||
if ((sz * sizeof(*out_values)) > prop->length)
|
||||
return -EOVERFLOW;
|
||||
|
||||
val = prop->value;
|
||||
while (sz--)
|
||||
*out_values++ = be16_to_cpup(val++);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(of_property_read_u16_array);
|
||||
|
||||
/**
|
||||
* of_property_read_u32_array - Find and read an array of 32 bit integers
|
||||
* from a property.
|
||||
|
@ -677,6 +762,7 @@ EXPORT_SYMBOL(of_find_node_by_phandle);
|
|||
* @np: device node from which the property value is to be read.
|
||||
* @propname: name of the property to be searched.
|
||||
* @out_value: pointer to return value, modified only if return value is 0.
|
||||
* @sz: number of array elements to read
|
||||
*
|
||||
* Search for a property in a device node and read 32-bit value(s) from
|
||||
* it. Returns 0 on success, -EINVAL if the property does not exist,
|
||||
|
@ -893,8 +979,8 @@ EXPORT_SYMBOL_GPL(of_property_count_strings);
|
|||
* Returns the device_node pointer with refcount incremented. Use
|
||||
* of_node_put() on it when done.
|
||||
*/
|
||||
struct device_node *
|
||||
of_parse_phandle(struct device_node *np, const char *phandle_name, int index)
|
||||
struct device_node *of_parse_phandle(const struct device_node *np,
|
||||
const char *phandle_name, int index)
|
||||
{
|
||||
const __be32 *phandle;
|
||||
int size;
|
||||
|
@ -1169,9 +1255,9 @@ void of_attach_node(struct device_node *np)
|
|||
|
||||
write_lock_irqsave(&devtree_lock, flags);
|
||||
np->sibling = np->parent->child;
|
||||
np->allnext = allnodes;
|
||||
np->allnext = of_allnodes;
|
||||
np->parent->child = np;
|
||||
allnodes = np;
|
||||
of_allnodes = np;
|
||||
write_unlock_irqrestore(&devtree_lock, flags);
|
||||
}
|
||||
|
||||
|
@ -1192,11 +1278,11 @@ void of_detach_node(struct device_node *np)
|
|||
if (!parent)
|
||||
goto out_unlock;
|
||||
|
||||
if (allnodes == np)
|
||||
allnodes = np->allnext;
|
||||
if (of_allnodes == np)
|
||||
of_allnodes = np->allnext;
|
||||
else {
|
||||
struct device_node *prev;
|
||||
for (prev = allnodes;
|
||||
for (prev = of_allnodes;
|
||||
prev->allnext != np;
|
||||
prev = prev->allnext)
|
||||
;
|
||||
|
|
|
@ -186,6 +186,8 @@ static unsigned long unflatten_dt_node(struct boot_param_header *blob,
|
|||
*/
|
||||
fpsize = 1;
|
||||
allocl = 2;
|
||||
l = 1;
|
||||
*pathp = '\0';
|
||||
} else {
|
||||
/* account for '/' and path size minus terminal 0
|
||||
* already in 'l'
|
||||
|
@ -198,10 +200,10 @@ static unsigned long unflatten_dt_node(struct boot_param_header *blob,
|
|||
np = unflatten_dt_alloc(&mem, sizeof(struct device_node) + allocl,
|
||||
__alignof__(struct device_node));
|
||||
if (allnextpp) {
|
||||
char *fn;
|
||||
memset(np, 0, sizeof(*np));
|
||||
np->full_name = ((char *)np) + sizeof(struct device_node);
|
||||
np->full_name = fn = ((char *)np) + sizeof(*np);
|
||||
if (new_format) {
|
||||
char *fn = np->full_name;
|
||||
/* rebuild full path for new format */
|
||||
if (dad && dad->parent) {
|
||||
strcpy(fn, dad->full_name);
|
||||
|
@ -215,9 +217,9 @@ static unsigned long unflatten_dt_node(struct boot_param_header *blob,
|
|||
fn += strlen(fn);
|
||||
}
|
||||
*(fn++) = '/';
|
||||
memcpy(fn, pathp, l);
|
||||
} else
|
||||
memcpy(np->full_name, pathp, l);
|
||||
}
|
||||
memcpy(fn, pathp, l);
|
||||
|
||||
prev_pp = &np->properties;
|
||||
**allnextpp = np;
|
||||
*allnextpp = &np->allnext;
|
||||
|
@ -459,7 +461,7 @@ int __init of_scan_flat_dt(int (*it)(unsigned long node,
|
|||
|
||||
do {
|
||||
u32 tag = be32_to_cpup((__be32 *)p);
|
||||
char *pathp;
|
||||
const char *pathp;
|
||||
|
||||
p += 4;
|
||||
if (tag == OF_DT_END_NODE) {
|
||||
|
@ -487,7 +489,7 @@ int __init of_scan_flat_dt(int (*it)(unsigned long node,
|
|||
pathp = (char *)p;
|
||||
p = ALIGN(p + strlen(pathp) + 1, 4);
|
||||
if ((*pathp) == '/') {
|
||||
char *lp, *np;
|
||||
const char *lp, *np;
|
||||
for (lp = NULL, np = pathp; *np; np++)
|
||||
if ((*np) == '/')
|
||||
lp = np+1;
|
||||
|
@ -710,7 +712,7 @@ int __init early_init_dt_scan_chosen(unsigned long node, const char *uname,
|
|||
*/
|
||||
void __init unflatten_device_tree(void)
|
||||
{
|
||||
__unflatten_device_tree(initial_boot_params, &allnodes,
|
||||
__unflatten_device_tree(initial_boot_params, &of_allnodes,
|
||||
early_init_dt_alloc_memory_arch);
|
||||
|
||||
/* Get pointer to "/chosen" and "/aliasas" nodes for use everywhere */
|
||||
|
|
|
@ -29,7 +29,7 @@ void of_i2c_register_devices(struct i2c_adapter *adap)
|
|||
|
||||
dev_dbg(&adap->dev, "of_i2c: walking child nodes\n");
|
||||
|
||||
for_each_child_of_node(adap->dev.of_node, node) {
|
||||
for_each_available_child_of_node(adap->dev.of_node, node) {
|
||||
struct i2c_board_info info = {};
|
||||
struct dev_archdata dev_ad = {};
|
||||
const __be32 *addr;
|
||||
|
|
|
@ -53,7 +53,7 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np)
|
|||
return rc;
|
||||
|
||||
/* Loop over the child nodes and register a phy_device for each one */
|
||||
for_each_child_of_node(np, child) {
|
||||
for_each_available_child_of_node(np, child) {
|
||||
const __be32 *paddr;
|
||||
u32 addr;
|
||||
int len;
|
||||
|
|
|
@ -241,15 +241,15 @@ void __init of_pdt_build_devicetree(phandle root_node, struct of_pdt_ops *ops)
|
|||
BUG_ON(!ops);
|
||||
of_pdt_prom_ops = ops;
|
||||
|
||||
allnodes = of_pdt_create_node(root_node, NULL);
|
||||
of_allnodes = of_pdt_create_node(root_node, NULL);
|
||||
#if defined(CONFIG_SPARC)
|
||||
allnodes->path_component_name = "";
|
||||
of_allnodes->path_component_name = "";
|
||||
#endif
|
||||
allnodes->full_name = "/";
|
||||
of_allnodes->full_name = "/";
|
||||
|
||||
nextp = &allnodes->allnext;
|
||||
allnodes->child = of_pdt_build_tree(allnodes,
|
||||
of_pdt_prom_ops->getchild(allnodes->phandle), &nextp);
|
||||
nextp = &of_allnodes->allnext;
|
||||
of_allnodes->child = of_pdt_build_tree(of_allnodes,
|
||||
of_pdt_prom_ops->getchild(of_allnodes->phandle), &nextp);
|
||||
|
||||
/* Get pointer to "/chosen" and "/aliasas" nodes for use everywhere */
|
||||
of_alias_scan(kernel_tree_alloc);
|
||||
|
|
|
@ -819,7 +819,7 @@ static void of_register_spi_devices(struct spi_master *master)
|
|||
if (!master->dev.of_node)
|
||||
return;
|
||||
|
||||
for_each_child_of_node(master->dev.of_node, nc) {
|
||||
for_each_available_child_of_node(master->dev.of_node, nc) {
|
||||
/* Alloc an spi_device */
|
||||
spi = spi_alloc_device(master);
|
||||
if (!spi) {
|
||||
|
|
|
@ -46,7 +46,7 @@ struct device_node {
|
|||
const char *name;
|
||||
const char *type;
|
||||
phandle phandle;
|
||||
char *full_name;
|
||||
const char *full_name;
|
||||
|
||||
struct property *properties;
|
||||
struct property *deadprops; /* removed properties */
|
||||
|
@ -60,7 +60,7 @@ struct device_node {
|
|||
unsigned long _flags;
|
||||
void *data;
|
||||
#if defined(CONFIG_SPARC)
|
||||
char *path_component_name;
|
||||
const char *path_component_name;
|
||||
unsigned int unique_id;
|
||||
struct of_irq_controller *irq_trans;
|
||||
#endif
|
||||
|
@ -88,14 +88,14 @@ static inline void of_node_put(struct device_node *node) { }
|
|||
#ifdef CONFIG_OF
|
||||
|
||||
/* Pointer for first entry in chain of all nodes. */
|
||||
extern struct device_node *allnodes;
|
||||
extern struct device_node *of_allnodes;
|
||||
extern struct device_node *of_chosen;
|
||||
extern struct device_node *of_aliases;
|
||||
extern rwlock_t devtree_lock;
|
||||
|
||||
static inline bool of_have_populated_dt(void)
|
||||
{
|
||||
return allnodes != NULL;
|
||||
return of_allnodes != NULL;
|
||||
}
|
||||
|
||||
static inline bool of_node_is_root(const struct device_node *node)
|
||||
|
@ -179,11 +179,22 @@ extern struct device_node *of_find_compatible_node(struct device_node *from,
|
|||
#define for_each_compatible_node(dn, type, compatible) \
|
||||
for (dn = of_find_compatible_node(NULL, type, compatible); dn; \
|
||||
dn = of_find_compatible_node(dn, type, compatible))
|
||||
extern struct device_node *of_find_matching_node(struct device_node *from,
|
||||
const struct of_device_id *matches);
|
||||
extern struct device_node *of_find_matching_node_and_match(
|
||||
struct device_node *from,
|
||||
const struct of_device_id *matches,
|
||||
const struct of_device_id **match);
|
||||
static inline struct device_node *of_find_matching_node(
|
||||
struct device_node *from,
|
||||
const struct of_device_id *matches)
|
||||
{
|
||||
return of_find_matching_node_and_match(from, matches, NULL);
|
||||
}
|
||||
#define for_each_matching_node(dn, matches) \
|
||||
for (dn = of_find_matching_node(NULL, matches); dn; \
|
||||
dn = of_find_matching_node(dn, matches))
|
||||
#define for_each_matching_node_and_match(dn, matches, match) \
|
||||
for (dn = of_find_matching_node_and_match(NULL, matches, match); \
|
||||
dn; dn = of_find_matching_node_and_match(dn, matches, match))
|
||||
extern struct device_node *of_find_node_by_path(const char *path);
|
||||
extern struct device_node *of_find_node_by_phandle(phandle handle);
|
||||
extern struct device_node *of_get_parent(const struct device_node *node);
|
||||
|
@ -223,6 +234,10 @@ extern struct device_node *of_find_node_with_property(
|
|||
extern struct property *of_find_property(const struct device_node *np,
|
||||
const char *name,
|
||||
int *lenp);
|
||||
extern int of_property_read_u8_array(const struct device_node *np,
|
||||
const char *propname, u8 *out_values, size_t sz);
|
||||
extern int of_property_read_u16_array(const struct device_node *np,
|
||||
const char *propname, u16 *out_values, size_t sz);
|
||||
extern int of_property_read_u32_array(const struct device_node *np,
|
||||
const char *propname,
|
||||
u32 *out_values,
|
||||
|
@ -255,7 +270,7 @@ extern int of_n_size_cells(struct device_node *np);
|
|||
extern const struct of_device_id *of_match_node(
|
||||
const struct of_device_id *matches, const struct device_node *node);
|
||||
extern int of_modalias_node(struct device_node *node, char *modalias, int len);
|
||||
extern struct device_node *of_parse_phandle(struct device_node *np,
|
||||
extern struct device_node *of_parse_phandle(const struct device_node *np,
|
||||
const char *phandle_name,
|
||||
int index);
|
||||
extern int of_parse_phandle_with_args(struct device_node *np,
|
||||
|
@ -364,6 +379,18 @@ static inline struct device_node *of_find_compatible_node(
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static inline int of_property_read_u8_array(const struct device_node *np,
|
||||
const char *propname, u8 *out_values, size_t sz)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static inline int of_property_read_u16_array(const struct device_node *np,
|
||||
const char *propname, u16 *out_values, size_t sz)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static inline int of_property_read_u32_array(const struct device_node *np,
|
||||
const char *propname,
|
||||
u32 *out_values, size_t sz)
|
||||
|
@ -411,7 +438,7 @@ static inline int of_property_match_string(struct device_node *np,
|
|||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static inline struct device_node *of_parse_phandle(struct device_node *np,
|
||||
static inline struct device_node *of_parse_phandle(const struct device_node *np,
|
||||
const char *phandle_name,
|
||||
int index)
|
||||
{
|
||||
|
@ -470,6 +497,20 @@ static inline bool of_property_read_bool(const struct device_node *np,
|
|||
return prop ? true : false;
|
||||
}
|
||||
|
||||
static inline int of_property_read_u8(const struct device_node *np,
|
||||
const char *propname,
|
||||
u8 *out_value)
|
||||
{
|
||||
return of_property_read_u8_array(np, propname, out_value, 1);
|
||||
}
|
||||
|
||||
static inline int of_property_read_u16(const struct device_node *np,
|
||||
const char *propname,
|
||||
u16 *out_value)
|
||||
{
|
||||
return of_property_read_u16_array(np, propname, out_value, 1);
|
||||
}
|
||||
|
||||
static inline int of_property_read_u32(const struct device_node *np,
|
||||
const char *propname,
|
||||
u32 *out_value)
|
||||
|
|
|
@ -266,6 +266,9 @@ $(obj)/%.dtb.S: $(obj)/%.dtb
|
|||
quiet_cmd_dtc = DTC $@
|
||||
cmd_dtc = $(objtree)/scripts/dtc/dtc -O dtb -o $@ -b 0 $(DTC_FLAGS) -d $(depfile) $<
|
||||
|
||||
$(obj)/%.dtb: $(src)/%.dts FORCE
|
||||
$(call if_changed_dep,dtc)
|
||||
|
||||
# Bzip2
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
|
|
@ -27,3 +27,5 @@ HOSTCFLAGS_dtc-parser.tab.o := $(HOSTCFLAGS_DTC)
|
|||
# dependencies on generated files need to be listed explicitly
|
||||
$(obj)/dtc-lexer.lex.o: $(obj)/dtc-parser.tab.h
|
||||
|
||||
# generated files need to be cleaned explicitly
|
||||
clean-files := dtc-lexer.lex.c dtc-parser.tab.c dtc-parser.tab.h
|
||||
|
|
Loading…
Reference in a new issue