mirror of https://gitee.com/openkylin/linux.git
Merge tag 'devicetree-for-4.21' of git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux
Pull Devicetree updates from Rob Herring: "The biggest highlight here is the start of using json-schema for DT bindings. Being able to validate bindings has been discussed for years with little progress. - Initial support for DT bindings using json-schema language. This is the start of converting DT bindings from free-form text to a structured format. - Reworking of initrd address initialization. This moves to using the phys address instead of virt addr in the DT parsing code. This rework was motivated by CONFIG_DEV_BLK_INITRD causing unnecessary rebuilding of lots of files. - Fix stale phandle entries in phandle cache - DT overlay validation improvements. This exposed several memory leak bugs which have been fixed. - Use node name and device_type helper functions in DT code - Last remaining conversions to using %pOFn printk specifier instead of device_node.name directly - Create new common RTC binding doc and move all trivial RTC devices out of trivial-devices.txt. - New bindings for Freescale MAG3110 magnetometer, Cadence Sierra PHY, and Xen shared memory - Update dtc to upstream version v1.4.7-57-gf267e674d145" * tag 'devicetree-for-4.21' of git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux: (68 commits) of: __of_detach_node() - remove node from phandle cache of: of_node_get()/of_node_put() nodes held in phandle cache gpio-omap.txt: add reg and interrupts properties dt-bindings: mrvl,intc: fix a trivial typo dt-bindings: iio: magnetometer: add dt-bindings for freescale mag3110 dt-bindings: Convert trivial-devices.txt to json-schema dt-bindings: arm: mrvl: amend Browstone compatible string dt-bindings: arm: Convert Tegra board/soc bindings to json-schema dt-bindings: arm: Convert ZTE board/soc bindings to json-schema dt-bindings: arm: Add missing Xilinx boards dt-bindings: arm: Convert Xilinx board/soc bindings to json-schema dt-bindings: arm: Convert VIA board/soc bindings to json-schema dt-bindings: arm: Convert ST STi board/soc bindings to json-schema dt-bindings: arm: Convert SPEAr board/soc bindings to json-schema dt-bindings: arm: Convert CSR SiRF board/soc bindings to json-schema dt-bindings: arm: Convert QCom board/soc bindings to json-schema dt-bindings: arm: Convert TI nspire board/soc bindings to json-schema dt-bindings: arm: Convert TI davinci board/soc bindings to json-schema dt-bindings: arm: Convert Calxeda board/soc bindings to json-schema dt-bindings: arm: Convert Altera board/soc bindings to json-schema ...
This commit is contained in:
commit
030672aea8
|
@ -15,6 +15,7 @@
|
|||
*.bin
|
||||
*.bz2
|
||||
*.c.[012]*.*
|
||||
*.dt.yaml
|
||||
*.dtb
|
||||
*.dtb.S
|
||||
*.dwo
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
# Makefile for Sphinx documentation
|
||||
#
|
||||
|
||||
subdir-y :=
|
||||
subdir-y := devicetree/bindings/
|
||||
|
||||
# You can set these variables from the command line.
|
||||
SPHINXBUILD = sphinx-build
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
*.example.dts
|
||||
processed-schema.yaml
|
|
@ -0,0 +1,27 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
DT_DOC_CHECKER ?= dt-doc-validate
|
||||
DT_EXTRACT_EX ?= dt-extract-example
|
||||
DT_MK_SCHEMA ?= dt-mk-schema
|
||||
DT_MK_SCHEMA_FLAGS := $(if $(DT_SCHEMA_FILES), -u)
|
||||
|
||||
quiet_cmd_chk_binding = CHKDT $(patsubst $(srctree)/%,%,$<)
|
||||
cmd_chk_binding = $(DT_DOC_CHECKER) $< ; \
|
||||
$(DT_EXTRACT_EX) $< > $@
|
||||
|
||||
$(obj)/%.example.dts: $(src)/%.yaml FORCE
|
||||
$(call if_changed,chk_binding)
|
||||
|
||||
DT_TMP_SCHEMA := processed-schema.yaml
|
||||
extra-y += $(DT_TMP_SCHEMA)
|
||||
|
||||
quiet_cmd_mk_schema = SCHEMA $@
|
||||
cmd_mk_schema = $(DT_MK_SCHEMA) $(DT_MK_SCHEMA_FLAGS) -o $@ $(filter-out FORCE, $^)
|
||||
|
||||
DT_DOCS = $(shell cd $(srctree)/$(src) && find * -name '*.yaml')
|
||||
DT_SCHEMA_FILES ?= $(addprefix $(src)/,$(DT_DOCS))
|
||||
|
||||
extra-y += $(patsubst $(src)/%.yaml,%.example.dts, $(DT_SCHEMA_FILES))
|
||||
extra-y += $(patsubst $(src)/%.yaml,%.example.dtb, $(DT_SCHEMA_FILES))
|
||||
|
||||
$(obj)/$(DT_TMP_SCHEMA): $(DT_SCHEMA_FILES) FORCE
|
||||
$(call if_changed,mk_schema)
|
|
@ -1,14 +0,0 @@
|
|||
Altera's SoCFPGA platform device tree bindings
|
||||
---------------------------------------------
|
||||
|
||||
Boards with Cyclone 5 SoC:
|
||||
Required root node properties:
|
||||
compatible = "altr,socfpga-cyclone5", "altr,socfpga";
|
||||
|
||||
Boards with Arria 5 SoC:
|
||||
Required root node properties:
|
||||
compatible = "altr,socfpga-arria5", "altr,socfpga";
|
||||
|
||||
Boards with Arria 10 SoC:
|
||||
Required root node properties:
|
||||
compatible = "altr,socfpga-arria10", "altr,socfpga";
|
|
@ -0,0 +1,20 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/arm/altera.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Altera's SoCFPGA platform device tree bindings
|
||||
|
||||
maintainers:
|
||||
- Dinh Nguyen <dinguyen@kernel.org>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
items:
|
||||
- enum:
|
||||
- altr,socfpga-cyclone5
|
||||
- altr,socfpga-arria5
|
||||
- altr,socfpga-arria10
|
||||
- const: altr,socfpga
|
||||
...
|
|
@ -1,11 +0,0 @@
|
|||
Altera SOCFPGA Clock Manager
|
||||
|
||||
Required properties:
|
||||
- compatible : "altr,clk-mgr"
|
||||
- reg : Should contain base address and length for Clock Manager
|
||||
|
||||
Example:
|
||||
clkmgr@ffd04000 {
|
||||
compatible = "altr,clk-mgr";
|
||||
reg = <0xffd04000 0x1000>;
|
||||
};
|
|
@ -0,0 +1,31 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/arm/altera/socfpga-clk-manager.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Altera SOCFPGA Clock Manager
|
||||
|
||||
maintainers:
|
||||
- Dinh Nguyen <dinguyen@kernel.org>
|
||||
|
||||
description: test
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
items:
|
||||
- const: altr,clk-mgr
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
|
||||
examples:
|
||||
- |
|
||||
clkmgr@ffd04000 {
|
||||
compatible = "altr,clk-mgr";
|
||||
reg = <0xffd04000 0x1000>;
|
||||
};
|
||||
|
||||
...
|
|
@ -1,15 +0,0 @@
|
|||
Calxeda Platforms Device Tree Bindings
|
||||
-----------------------------------------------
|
||||
|
||||
Boards with Calxeda Cortex-A9 based ECX-1000 (Highbank) SOC shall have the
|
||||
following properties.
|
||||
|
||||
Required root node properties:
|
||||
- compatible = "calxeda,highbank";
|
||||
|
||||
|
||||
Boards with Calxeda Cortex-A15 based ECX-2000 SOC shall have the following
|
||||
properties.
|
||||
|
||||
Required root node properties:
|
||||
- compatible = "calxeda,ecx-2000";
|
|
@ -0,0 +1,22 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/arm/calxeda.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Calxeda Platforms Device Tree Bindings
|
||||
|
||||
maintainers:
|
||||
- Rob Herring <robh@kernel.org>
|
||||
description: |+
|
||||
Bindings for boards with Calxeda Cortex-A9 based ECX-1000 (Highbank) SOC
|
||||
or Cortex-A15 based ECX-2000 SOCs
|
||||
|
||||
properties:
|
||||
$nodename:
|
||||
const: '/'
|
||||
compatible:
|
||||
items:
|
||||
- enum:
|
||||
- calxeda,highbank
|
||||
- calxeda,ecx-2000
|
|
@ -1,490 +0,0 @@
|
|||
=================
|
||||
ARM CPUs bindings
|
||||
=================
|
||||
|
||||
The device tree allows to describe the layout of CPUs in a system through
|
||||
the "cpus" node, which in turn contains a number of subnodes (ie "cpu")
|
||||
defining properties for every cpu.
|
||||
|
||||
Bindings for CPU nodes follow the Devicetree Specification, available from:
|
||||
|
||||
https://www.devicetree.org/specifications/
|
||||
|
||||
with updates for 32-bit and 64-bit ARM systems provided in this document.
|
||||
|
||||
================================
|
||||
Convention used in this document
|
||||
================================
|
||||
|
||||
This document follows the conventions described in the Devicetree
|
||||
Specification, with the addition:
|
||||
|
||||
- square brackets define bitfields, eg reg[7:0] value of the bitfield in
|
||||
the reg property contained in bits 7 down to 0
|
||||
|
||||
=====================================
|
||||
cpus and cpu node bindings definition
|
||||
=====================================
|
||||
|
||||
The ARM architecture, in accordance with the Devicetree Specification,
|
||||
requires the cpus and cpu nodes to be present and contain the properties
|
||||
described below.
|
||||
|
||||
- cpus node
|
||||
|
||||
Description: Container of cpu nodes
|
||||
|
||||
The node name must be "cpus".
|
||||
|
||||
A cpus node must define the following properties:
|
||||
|
||||
- #address-cells
|
||||
Usage: required
|
||||
Value type: <u32>
|
||||
|
||||
Definition depends on ARM architecture version and
|
||||
configuration:
|
||||
|
||||
# On uniprocessor ARM architectures previous to v7
|
||||
value must be 1, to enable a simple enumeration
|
||||
scheme for processors that do not have a HW CPU
|
||||
identification register.
|
||||
# On 32-bit ARM 11 MPcore, ARM v7 or later systems
|
||||
value must be 1, that corresponds to CPUID/MPIDR
|
||||
registers sizes.
|
||||
# On ARM v8 64-bit systems value should be set to 2,
|
||||
that corresponds to the MPIDR_EL1 register size.
|
||||
If MPIDR_EL1[63:32] value is equal to 0 on all CPUs
|
||||
in the system, #address-cells can be set to 1, since
|
||||
MPIDR_EL1[63:32] bits are not used for CPUs
|
||||
identification.
|
||||
- #size-cells
|
||||
Usage: required
|
||||
Value type: <u32>
|
||||
Definition: must be set to 0
|
||||
|
||||
- cpu node
|
||||
|
||||
Description: Describes a CPU in an ARM based system
|
||||
|
||||
PROPERTIES
|
||||
|
||||
- device_type
|
||||
Usage: required
|
||||
Value type: <string>
|
||||
Definition: must be "cpu"
|
||||
- reg
|
||||
Usage and definition depend on ARM architecture version and
|
||||
configuration:
|
||||
|
||||
# On uniprocessor ARM architectures previous to v7
|
||||
this property is required and must be set to 0.
|
||||
|
||||
# On ARM 11 MPcore based systems this property is
|
||||
required and matches the CPUID[11:0] register bits.
|
||||
|
||||
Bits [11:0] in the reg cell must be set to
|
||||
bits [11:0] in CPU ID register.
|
||||
|
||||
All other bits in the reg cell must be set to 0.
|
||||
|
||||
# On 32-bit ARM v7 or later systems this property is
|
||||
required and matches the CPU MPIDR[23:0] register
|
||||
bits.
|
||||
|
||||
Bits [23:0] in the reg cell must be set to
|
||||
bits [23:0] in MPIDR.
|
||||
|
||||
All other bits in the reg cell must be set to 0.
|
||||
|
||||
# On ARM v8 64-bit systems this property is required
|
||||
and matches the MPIDR_EL1 register affinity bits.
|
||||
|
||||
* If cpus node's #address-cells property is set to 2
|
||||
|
||||
The first reg cell bits [7:0] must be set to
|
||||
bits [39:32] of MPIDR_EL1.
|
||||
|
||||
The second reg cell bits [23:0] must be set to
|
||||
bits [23:0] of MPIDR_EL1.
|
||||
|
||||
* If cpus node's #address-cells property is set to 1
|
||||
|
||||
The reg cell bits [23:0] must be set to bits [23:0]
|
||||
of MPIDR_EL1.
|
||||
|
||||
All other bits in the reg cells must be set to 0.
|
||||
|
||||
- compatible:
|
||||
Usage: required
|
||||
Value type: <string>
|
||||
Definition: should be one of:
|
||||
"arm,arm710t"
|
||||
"arm,arm720t"
|
||||
"arm,arm740t"
|
||||
"arm,arm7ej-s"
|
||||
"arm,arm7tdmi"
|
||||
"arm,arm7tdmi-s"
|
||||
"arm,arm9es"
|
||||
"arm,arm9ej-s"
|
||||
"arm,arm920t"
|
||||
"arm,arm922t"
|
||||
"arm,arm925"
|
||||
"arm,arm926e-s"
|
||||
"arm,arm926ej-s"
|
||||
"arm,arm940t"
|
||||
"arm,arm946e-s"
|
||||
"arm,arm966e-s"
|
||||
"arm,arm968e-s"
|
||||
"arm,arm9tdmi"
|
||||
"arm,arm1020e"
|
||||
"arm,arm1020t"
|
||||
"arm,arm1022e"
|
||||
"arm,arm1026ej-s"
|
||||
"arm,arm1136j-s"
|
||||
"arm,arm1136jf-s"
|
||||
"arm,arm1156t2-s"
|
||||
"arm,arm1156t2f-s"
|
||||
"arm,arm1176jzf"
|
||||
"arm,arm1176jz-s"
|
||||
"arm,arm1176jzf-s"
|
||||
"arm,arm11mpcore"
|
||||
"arm,cortex-a5"
|
||||
"arm,cortex-a7"
|
||||
"arm,cortex-a8"
|
||||
"arm,cortex-a9"
|
||||
"arm,cortex-a12"
|
||||
"arm,cortex-a15"
|
||||
"arm,cortex-a17"
|
||||
"arm,cortex-a53"
|
||||
"arm,cortex-a57"
|
||||
"arm,cortex-a72"
|
||||
"arm,cortex-a73"
|
||||
"arm,cortex-m0"
|
||||
"arm,cortex-m0+"
|
||||
"arm,cortex-m1"
|
||||
"arm,cortex-m3"
|
||||
"arm,cortex-m4"
|
||||
"arm,cortex-r4"
|
||||
"arm,cortex-r5"
|
||||
"arm,cortex-r7"
|
||||
"brcm,brahma-b15"
|
||||
"brcm,brahma-b53"
|
||||
"brcm,vulcan"
|
||||
"cavium,thunder"
|
||||
"cavium,thunder2"
|
||||
"faraday,fa526"
|
||||
"intel,sa110"
|
||||
"intel,sa1100"
|
||||
"marvell,feroceon"
|
||||
"marvell,mohawk"
|
||||
"marvell,pj4a"
|
||||
"marvell,pj4b"
|
||||
"marvell,sheeva-v5"
|
||||
"nvidia,tegra132-denver"
|
||||
"nvidia,tegra186-denver"
|
||||
"nvidia,tegra194-carmel"
|
||||
"qcom,krait"
|
||||
"qcom,kryo"
|
||||
"qcom,kryo385"
|
||||
"qcom,scorpion"
|
||||
- enable-method
|
||||
Value type: <stringlist>
|
||||
Usage and definition depend on ARM architecture version.
|
||||
# On ARM v8 64-bit this property is required and must
|
||||
be one of:
|
||||
"psci"
|
||||
"spin-table"
|
||||
# On ARM 32-bit systems this property is optional and
|
||||
can be one of:
|
||||
"actions,s500-smp"
|
||||
"allwinner,sun6i-a31"
|
||||
"allwinner,sun8i-a23"
|
||||
"allwinner,sun9i-a80-smp"
|
||||
"amlogic,meson8-smp"
|
||||
"amlogic,meson8b-smp"
|
||||
"arm,realview-smp"
|
||||
"brcm,bcm11351-cpu-method"
|
||||
"brcm,bcm23550"
|
||||
"brcm,bcm2836-smp"
|
||||
"brcm,bcm-nsp-smp"
|
||||
"brcm,brahma-b15"
|
||||
"marvell,armada-375-smp"
|
||||
"marvell,armada-380-smp"
|
||||
"marvell,armada-390-smp"
|
||||
"marvell,armada-xp-smp"
|
||||
"marvell,98dx3236-smp"
|
||||
"mediatek,mt6589-smp"
|
||||
"mediatek,mt81xx-tz-smp"
|
||||
"qcom,gcc-msm8660"
|
||||
"qcom,kpss-acc-v1"
|
||||
"qcom,kpss-acc-v2"
|
||||
"renesas,apmu"
|
||||
"renesas,r9a06g032-smp"
|
||||
"rockchip,rk3036-smp"
|
||||
"rockchip,rk3066-smp"
|
||||
"ste,dbx500-smp"
|
||||
|
||||
- cpu-release-addr
|
||||
Usage: required for systems that have an "enable-method"
|
||||
property value of "spin-table".
|
||||
Value type: <prop-encoded-array>
|
||||
Definition:
|
||||
# On ARM v8 64-bit systems must be a two cell
|
||||
property identifying a 64-bit zero-initialised
|
||||
memory location.
|
||||
|
||||
- qcom,saw
|
||||
Usage: required for systems that have an "enable-method"
|
||||
property value of "qcom,kpss-acc-v1" or
|
||||
"qcom,kpss-acc-v2"
|
||||
Value type: <phandle>
|
||||
Definition: Specifies the SAW[1] node associated with this CPU.
|
||||
|
||||
- qcom,acc
|
||||
Usage: required for systems that have an "enable-method"
|
||||
property value of "qcom,kpss-acc-v1" or
|
||||
"qcom,kpss-acc-v2"
|
||||
Value type: <phandle>
|
||||
Definition: Specifies the ACC[2] node associated with this CPU.
|
||||
|
||||
- cpu-idle-states
|
||||
Usage: Optional
|
||||
Value type: <prop-encoded-array>
|
||||
Definition:
|
||||
# List of phandles to idle state nodes supported
|
||||
by this cpu [3].
|
||||
|
||||
- capacity-dmips-mhz
|
||||
Usage: Optional
|
||||
Value type: <u32>
|
||||
Definition:
|
||||
# u32 value representing CPU capacity [4] in
|
||||
DMIPS/MHz, relative to highest capacity-dmips-mhz
|
||||
in the system.
|
||||
|
||||
- rockchip,pmu
|
||||
Usage: optional for systems that have an "enable-method"
|
||||
property value of "rockchip,rk3066-smp"
|
||||
While optional, it is the preferred way to get access to
|
||||
the cpu-core power-domains.
|
||||
Value type: <phandle>
|
||||
Definition: Specifies the syscon node controlling the cpu core
|
||||
power domains.
|
||||
|
||||
- dynamic-power-coefficient
|
||||
Usage: optional
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: A u32 value that represents the running time dynamic
|
||||
power coefficient in units of uW/MHz/V^2. The
|
||||
coefficient can either be calculated from power
|
||||
measurements or derived by analysis.
|
||||
|
||||
The dynamic power consumption of the CPU is
|
||||
proportional to the square of the Voltage (V) and
|
||||
the clock frequency (f). The coefficient is used to
|
||||
calculate the dynamic power as below -
|
||||
|
||||
Pdyn = dynamic-power-coefficient * V^2 * f
|
||||
|
||||
where voltage is in V, frequency is in MHz.
|
||||
|
||||
Example 1 (dual-cluster big.LITTLE system 32-bit):
|
||||
|
||||
cpus {
|
||||
#size-cells = <0>;
|
||||
#address-cells = <1>;
|
||||
|
||||
cpu@0 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a15";
|
||||
reg = <0x0>;
|
||||
};
|
||||
|
||||
cpu@1 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a15";
|
||||
reg = <0x1>;
|
||||
};
|
||||
|
||||
cpu@100 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a7";
|
||||
reg = <0x100>;
|
||||
};
|
||||
|
||||
cpu@101 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a7";
|
||||
reg = <0x101>;
|
||||
};
|
||||
};
|
||||
|
||||
Example 2 (Cortex-A8 uniprocessor 32-bit system):
|
||||
|
||||
cpus {
|
||||
#size-cells = <0>;
|
||||
#address-cells = <1>;
|
||||
|
||||
cpu@0 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a8";
|
||||
reg = <0x0>;
|
||||
};
|
||||
};
|
||||
|
||||
Example 3 (ARM 926EJ-S uniprocessor 32-bit system):
|
||||
|
||||
cpus {
|
||||
#size-cells = <0>;
|
||||
#address-cells = <1>;
|
||||
|
||||
cpu@0 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,arm926ej-s";
|
||||
reg = <0x0>;
|
||||
};
|
||||
};
|
||||
|
||||
Example 4 (ARM Cortex-A57 64-bit system):
|
||||
|
||||
cpus {
|
||||
#size-cells = <0>;
|
||||
#address-cells = <2>;
|
||||
|
||||
cpu@0 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
reg = <0x0 0x0>;
|
||||
enable-method = "spin-table";
|
||||
cpu-release-addr = <0 0x20000000>;
|
||||
};
|
||||
|
||||
cpu@1 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
reg = <0x0 0x1>;
|
||||
enable-method = "spin-table";
|
||||
cpu-release-addr = <0 0x20000000>;
|
||||
};
|
||||
|
||||
cpu@100 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
reg = <0x0 0x100>;
|
||||
enable-method = "spin-table";
|
||||
cpu-release-addr = <0 0x20000000>;
|
||||
};
|
||||
|
||||
cpu@101 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
reg = <0x0 0x101>;
|
||||
enable-method = "spin-table";
|
||||
cpu-release-addr = <0 0x20000000>;
|
||||
};
|
||||
|
||||
cpu@10000 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
reg = <0x0 0x10000>;
|
||||
enable-method = "spin-table";
|
||||
cpu-release-addr = <0 0x20000000>;
|
||||
};
|
||||
|
||||
cpu@10001 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
reg = <0x0 0x10001>;
|
||||
enable-method = "spin-table";
|
||||
cpu-release-addr = <0 0x20000000>;
|
||||
};
|
||||
|
||||
cpu@10100 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
reg = <0x0 0x10100>;
|
||||
enable-method = "spin-table";
|
||||
cpu-release-addr = <0 0x20000000>;
|
||||
};
|
||||
|
||||
cpu@10101 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
reg = <0x0 0x10101>;
|
||||
enable-method = "spin-table";
|
||||
cpu-release-addr = <0 0x20000000>;
|
||||
};
|
||||
|
||||
cpu@100000000 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
reg = <0x1 0x0>;
|
||||
enable-method = "spin-table";
|
||||
cpu-release-addr = <0 0x20000000>;
|
||||
};
|
||||
|
||||
cpu@100000001 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
reg = <0x1 0x1>;
|
||||
enable-method = "spin-table";
|
||||
cpu-release-addr = <0 0x20000000>;
|
||||
};
|
||||
|
||||
cpu@100000100 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
reg = <0x1 0x100>;
|
||||
enable-method = "spin-table";
|
||||
cpu-release-addr = <0 0x20000000>;
|
||||
};
|
||||
|
||||
cpu@100000101 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
reg = <0x1 0x101>;
|
||||
enable-method = "spin-table";
|
||||
cpu-release-addr = <0 0x20000000>;
|
||||
};
|
||||
|
||||
cpu@100010000 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
reg = <0x1 0x10000>;
|
||||
enable-method = "spin-table";
|
||||
cpu-release-addr = <0 0x20000000>;
|
||||
};
|
||||
|
||||
cpu@100010001 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
reg = <0x1 0x10001>;
|
||||
enable-method = "spin-table";
|
||||
cpu-release-addr = <0 0x20000000>;
|
||||
};
|
||||
|
||||
cpu@100010100 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
reg = <0x1 0x10100>;
|
||||
enable-method = "spin-table";
|
||||
cpu-release-addr = <0 0x20000000>;
|
||||
};
|
||||
|
||||
cpu@100010101 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
reg = <0x1 0x10101>;
|
||||
enable-method = "spin-table";
|
||||
cpu-release-addr = <0 0x20000000>;
|
||||
};
|
||||
};
|
||||
|
||||
--
|
||||
[1] arm/msm/qcom,saw2.txt
|
||||
[2] arm/msm/qcom,kpss-acc.txt
|
||||
[3] ARM Linux kernel documentation - idle states bindings
|
||||
Documentation/devicetree/bindings/arm/idle-states.txt
|
||||
[4] ARM Linux kernel documentation - cpu capacity bindings
|
||||
Documentation/devicetree/bindings/arm/cpu-capacity.txt
|
|
@ -0,0 +1,507 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/arm/cpus.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: ARM CPUs bindings
|
||||
|
||||
maintainers:
|
||||
- Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
|
||||
|
||||
description: |+
|
||||
The device tree allows to describe the layout of CPUs in a system through
|
||||
the "cpus" node, which in turn contains a number of subnodes (ie "cpu")
|
||||
defining properties for every cpu.
|
||||
|
||||
Bindings for CPU nodes follow the Devicetree Specification, available from:
|
||||
|
||||
https://www.devicetree.org/specifications/
|
||||
|
||||
with updates for 32-bit and 64-bit ARM systems provided in this document.
|
||||
|
||||
================================
|
||||
Convention used in this document
|
||||
================================
|
||||
|
||||
This document follows the conventions described in the Devicetree
|
||||
Specification, with the addition:
|
||||
|
||||
- square brackets define bitfields, eg reg[7:0] value of the bitfield in
|
||||
the reg property contained in bits 7 down to 0
|
||||
|
||||
=====================================
|
||||
cpus and cpu node bindings definition
|
||||
=====================================
|
||||
|
||||
The ARM architecture, in accordance with the Devicetree Specification,
|
||||
requires the cpus and cpu nodes to be present and contain the properties
|
||||
described below.
|
||||
|
||||
properties:
|
||||
$nodename:
|
||||
const: cpus
|
||||
description: Container of cpu nodes
|
||||
|
||||
'#address-cells':
|
||||
enum: [1, 2]
|
||||
description: |
|
||||
Definition depends on ARM architecture version and configuration:
|
||||
|
||||
On uniprocessor ARM architectures previous to v7
|
||||
value must be 1, to enable a simple enumeration
|
||||
scheme for processors that do not have a HW CPU
|
||||
identification register.
|
||||
On 32-bit ARM 11 MPcore, ARM v7 or later systems
|
||||
value must be 1, that corresponds to CPUID/MPIDR
|
||||
registers sizes.
|
||||
On ARM v8 64-bit systems value should be set to 2,
|
||||
that corresponds to the MPIDR_EL1 register size.
|
||||
If MPIDR_EL1[63:32] value is equal to 0 on all CPUs
|
||||
in the system, #address-cells can be set to 1, since
|
||||
MPIDR_EL1[63:32] bits are not used for CPUs
|
||||
identification.
|
||||
|
||||
'#size-cells':
|
||||
const: 0
|
||||
|
||||
patternProperties:
|
||||
'^cpu@[0-9a-f]+$':
|
||||
properties:
|
||||
device_type:
|
||||
const: cpu
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
description: |
|
||||
Usage and definition depend on ARM architecture version and
|
||||
configuration:
|
||||
|
||||
On uniprocessor ARM architectures previous to v7
|
||||
this property is required and must be set to 0.
|
||||
|
||||
On ARM 11 MPcore based systems this property is
|
||||
required and matches the CPUID[11:0] register bits.
|
||||
|
||||
Bits [11:0] in the reg cell must be set to
|
||||
bits [11:0] in CPU ID register.
|
||||
|
||||
All other bits in the reg cell must be set to 0.
|
||||
|
||||
On 32-bit ARM v7 or later systems this property is
|
||||
required and matches the CPU MPIDR[23:0] register
|
||||
bits.
|
||||
|
||||
Bits [23:0] in the reg cell must be set to
|
||||
bits [23:0] in MPIDR.
|
||||
|
||||
All other bits in the reg cell must be set to 0.
|
||||
|
||||
On ARM v8 64-bit systems this property is required
|
||||
and matches the MPIDR_EL1 register affinity bits.
|
||||
|
||||
* If cpus node's #address-cells property is set to 2
|
||||
|
||||
The first reg cell bits [7:0] must be set to
|
||||
bits [39:32] of MPIDR_EL1.
|
||||
|
||||
The second reg cell bits [23:0] must be set to
|
||||
bits [23:0] of MPIDR_EL1.
|
||||
|
||||
* If cpus node's #address-cells property is set to 1
|
||||
|
||||
The reg cell bits [23:0] must be set to bits [23:0]
|
||||
of MPIDR_EL1.
|
||||
|
||||
All other bits in the reg cells must be set to 0.
|
||||
|
||||
compatible:
|
||||
items:
|
||||
- enum:
|
||||
- arm,arm710t
|
||||
- arm,arm720t
|
||||
- arm,arm740t
|
||||
- arm,arm7ej-s
|
||||
- arm,arm7tdmi
|
||||
- arm,arm7tdmi-s
|
||||
- arm,arm9es
|
||||
- arm,arm9ej-s
|
||||
- arm,arm920t
|
||||
- arm,arm922t
|
||||
- arm,arm925
|
||||
- arm,arm926e-s
|
||||
- arm,arm926ej-s
|
||||
- arm,arm940t
|
||||
- arm,arm946e-s
|
||||
- arm,arm966e-s
|
||||
- arm,arm968e-s
|
||||
- arm,arm9tdmi
|
||||
- arm,arm1020e
|
||||
- arm,arm1020t
|
||||
- arm,arm1022e
|
||||
- arm,arm1026ej-s
|
||||
- arm,arm1136j-s
|
||||
- arm,arm1136jf-s
|
||||
- arm,arm1156t2-s
|
||||
- arm,arm1156t2f-s
|
||||
- arm,arm1176jzf
|
||||
- arm,arm1176jz-s
|
||||
- arm,arm1176jzf-s
|
||||
- arm,arm11mpcore
|
||||
- arm,armv8 # Only for s/w models
|
||||
- arm,cortex-a5
|
||||
- arm,cortex-a7
|
||||
- arm,cortex-a8
|
||||
- arm,cortex-a9
|
||||
- arm,cortex-a12
|
||||
- arm,cortex-a15
|
||||
- arm,cortex-a17
|
||||
- arm,cortex-a53
|
||||
- arm,cortex-a57
|
||||
- arm,cortex-a72
|
||||
- arm,cortex-a73
|
||||
- arm,cortex-m0
|
||||
- arm,cortex-m0+
|
||||
- arm,cortex-m1
|
||||
- arm,cortex-m3
|
||||
- arm,cortex-m4
|
||||
- arm,cortex-r4
|
||||
- arm,cortex-r5
|
||||
- arm,cortex-r7
|
||||
- brcm,brahma-b15
|
||||
- brcm,brahma-b53
|
||||
- brcm,vulcan
|
||||
- cavium,thunder
|
||||
- cavium,thunder2
|
||||
- faraday,fa526
|
||||
- intel,sa110
|
||||
- intel,sa1100
|
||||
- marvell,feroceon
|
||||
- marvell,mohawk
|
||||
- marvell,pj4a
|
||||
- marvell,pj4b
|
||||
- marvell,sheeva-v5
|
||||
- marvell,sheeva-v7
|
||||
- nvidia,tegra132-denver
|
||||
- nvidia,tegra186-denver
|
||||
- nvidia,tegra194-carmel
|
||||
- qcom,krait
|
||||
- qcom,kryo
|
||||
- qcom,kryo385
|
||||
- qcom,scorpion
|
||||
|
||||
enable-method:
|
||||
allOf:
|
||||
- $ref: '/schemas/types.yaml#/definitions/string'
|
||||
- oneOf:
|
||||
# On ARM v8 64-bit this property is required
|
||||
- enum:
|
||||
- psci
|
||||
- spin-table
|
||||
# On ARM 32-bit systems this property is optional
|
||||
- enum:
|
||||
- actions,s500-smp
|
||||
- allwinner,sun6i-a31
|
||||
- allwinner,sun8i-a23
|
||||
- allwinner,sun9i-a80-smp
|
||||
- allwinner,sun8i-a83t-smp
|
||||
- amlogic,meson8-smp
|
||||
- amlogic,meson8b-smp
|
||||
- arm,realview-smp
|
||||
- brcm,bcm11351-cpu-method
|
||||
- brcm,bcm23550
|
||||
- brcm,bcm2836-smp
|
||||
- brcm,bcm63138
|
||||
- brcm,bcm-nsp-smp
|
||||
- brcm,brahma-b15
|
||||
- marvell,armada-375-smp
|
||||
- marvell,armada-380-smp
|
||||
- marvell,armada-390-smp
|
||||
- marvell,armada-xp-smp
|
||||
- marvell,98dx3236-smp
|
||||
- mediatek,mt6589-smp
|
||||
- mediatek,mt81xx-tz-smp
|
||||
- qcom,gcc-msm8660
|
||||
- qcom,kpss-acc-v1
|
||||
- qcom,kpss-acc-v2
|
||||
- renesas,apmu
|
||||
- renesas,r9a06g032-smp
|
||||
- rockchip,rk3036-smp
|
||||
- rockchip,rk3066-smp
|
||||
- ste,dbx500-smp
|
||||
|
||||
cpu-release-addr:
|
||||
$ref: '/schemas/types.yaml#/definitions/uint64'
|
||||
|
||||
description:
|
||||
Required for systems that have an "enable-method"
|
||||
property value of "spin-table".
|
||||
On ARM v8 64-bit systems must be a two cell
|
||||
property identifying a 64-bit zero-initialised
|
||||
memory location.
|
||||
|
||||
cpu-idle-states:
|
||||
$ref: '/schemas/types.yaml#/definitions/phandle-array'
|
||||
description: |
|
||||
List of phandles to idle state nodes supported
|
||||
by this cpu (see ./idle-states.txt).
|
||||
|
||||
capacity-dmips-mhz:
|
||||
$ref: '/schemas/types.yaml#/definitions/uint32'
|
||||
description:
|
||||
u32 value representing CPU capacity (see ./cpu-capacity.txt) in
|
||||
DMIPS/MHz, relative to highest capacity-dmips-mhz
|
||||
in the system.
|
||||
|
||||
dynamic-power-coefficient:
|
||||
$ref: '/schemas/types.yaml#/definitions/uint32'
|
||||
description:
|
||||
A u32 value that represents the running time dynamic
|
||||
power coefficient in units of uW/MHz/V^2. The
|
||||
coefficient can either be calculated from power
|
||||
measurements or derived by analysis.
|
||||
|
||||
The dynamic power consumption of the CPU is
|
||||
proportional to the square of the Voltage (V) and
|
||||
the clock frequency (f). The coefficient is used to
|
||||
calculate the dynamic power as below -
|
||||
|
||||
Pdyn = dynamic-power-coefficient * V^2 * f
|
||||
|
||||
where voltage is in V, frequency is in MHz.
|
||||
|
||||
qcom,saw:
|
||||
$ref: '/schemas/types.yaml#/definitions/phandle'
|
||||
description: |
|
||||
Specifies the SAW* node associated with this CPU.
|
||||
|
||||
Required for systems that have an "enable-method" property
|
||||
value of "qcom,kpss-acc-v1" or "qcom,kpss-acc-v2"
|
||||
|
||||
* arm/msm/qcom,saw2.txt
|
||||
|
||||
qcom,acc:
|
||||
$ref: '/schemas/types.yaml#/definitions/phandle'
|
||||
description: |
|
||||
Specifies the ACC* node associated with this CPU.
|
||||
|
||||
Required for systems that have an "enable-method" property
|
||||
value of "qcom,kpss-acc-v1" or "qcom,kpss-acc-v2"
|
||||
|
||||
* arm/msm/qcom,kpss-acc.txt
|
||||
|
||||
rockchip,pmu:
|
||||
$ref: '/schemas/types.yaml#/definitions/phandle'
|
||||
description: |
|
||||
Specifies the syscon node controlling the cpu core power domains.
|
||||
|
||||
Optional for systems that have an "enable-method"
|
||||
property value of "rockchip,rk3066-smp"
|
||||
While optional, it is the preferred way to get access to
|
||||
the cpu-core power-domains.
|
||||
|
||||
required:
|
||||
- device_type
|
||||
- reg
|
||||
- compatible
|
||||
|
||||
dependencies:
|
||||
cpu-release-addr: [enable-method]
|
||||
rockchip,pmu: [enable-method]
|
||||
|
||||
required:
|
||||
- '#address-cells'
|
||||
- '#size-cells'
|
||||
|
||||
examples:
|
||||
- |
|
||||
cpus {
|
||||
#size-cells = <0>;
|
||||
#address-cells = <1>;
|
||||
|
||||
cpu@0 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a15";
|
||||
reg = <0x0>;
|
||||
};
|
||||
|
||||
cpu@1 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a15";
|
||||
reg = <0x1>;
|
||||
};
|
||||
|
||||
cpu@100 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a7";
|
||||
reg = <0x100>;
|
||||
};
|
||||
|
||||
cpu@101 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a7";
|
||||
reg = <0x101>;
|
||||
};
|
||||
};
|
||||
|
||||
- |
|
||||
// Example 2 (Cortex-A8 uniprocessor 32-bit system):
|
||||
cpus {
|
||||
#size-cells = <0>;
|
||||
#address-cells = <1>;
|
||||
|
||||
cpu@0 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a8";
|
||||
reg = <0x0>;
|
||||
};
|
||||
};
|
||||
|
||||
- |
|
||||
// Example 3 (ARM 926EJ-S uniprocessor 32-bit system):
|
||||
cpus {
|
||||
#size-cells = <0>;
|
||||
#address-cells = <1>;
|
||||
|
||||
cpu@0 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,arm926ej-s";
|
||||
reg = <0x0>;
|
||||
};
|
||||
};
|
||||
|
||||
- |
|
||||
// Example 4 (ARM Cortex-A57 64-bit system):
|
||||
cpus {
|
||||
#size-cells = <0>;
|
||||
#address-cells = <2>;
|
||||
|
||||
cpu@0 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
reg = <0x0 0x0>;
|
||||
enable-method = "spin-table";
|
||||
cpu-release-addr = <0 0x20000000>;
|
||||
};
|
||||
|
||||
cpu@1 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
reg = <0x0 0x1>;
|
||||
enable-method = "spin-table";
|
||||
cpu-release-addr = <0 0x20000000>;
|
||||
};
|
||||
|
||||
cpu@100 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
reg = <0x0 0x100>;
|
||||
enable-method = "spin-table";
|
||||
cpu-release-addr = <0 0x20000000>;
|
||||
};
|
||||
|
||||
cpu@101 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
reg = <0x0 0x101>;
|
||||
enable-method = "spin-table";
|
||||
cpu-release-addr = <0 0x20000000>;
|
||||
};
|
||||
|
||||
cpu@10000 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
reg = <0x0 0x10000>;
|
||||
enable-method = "spin-table";
|
||||
cpu-release-addr = <0 0x20000000>;
|
||||
};
|
||||
|
||||
cpu@10001 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
reg = <0x0 0x10001>;
|
||||
enable-method = "spin-table";
|
||||
cpu-release-addr = <0 0x20000000>;
|
||||
};
|
||||
|
||||
cpu@10100 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
reg = <0x0 0x10100>;
|
||||
enable-method = "spin-table";
|
||||
cpu-release-addr = <0 0x20000000>;
|
||||
};
|
||||
|
||||
cpu@10101 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
reg = <0x0 0x10101>;
|
||||
enable-method = "spin-table";
|
||||
cpu-release-addr = <0 0x20000000>;
|
||||
};
|
||||
|
||||
cpu@100000000 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
reg = <0x1 0x0>;
|
||||
enable-method = "spin-table";
|
||||
cpu-release-addr = <0 0x20000000>;
|
||||
};
|
||||
|
||||
cpu@100000001 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
reg = <0x1 0x1>;
|
||||
enable-method = "spin-table";
|
||||
cpu-release-addr = <0 0x20000000>;
|
||||
};
|
||||
|
||||
cpu@100000100 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
reg = <0x1 0x100>;
|
||||
enable-method = "spin-table";
|
||||
cpu-release-addr = <0 0x20000000>;
|
||||
};
|
||||
|
||||
cpu@100000101 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
reg = <0x1 0x101>;
|
||||
enable-method = "spin-table";
|
||||
cpu-release-addr = <0 0x20000000>;
|
||||
};
|
||||
|
||||
cpu@100010000 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
reg = <0x1 0x10000>;
|
||||
enable-method = "spin-table";
|
||||
cpu-release-addr = <0 0x20000000>;
|
||||
};
|
||||
|
||||
cpu@100010001 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
reg = <0x1 0x10001>;
|
||||
enable-method = "spin-table";
|
||||
cpu-release-addr = <0 0x20000000>;
|
||||
};
|
||||
|
||||
cpu@100010100 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
reg = <0x1 0x10100>;
|
||||
enable-method = "spin-table";
|
||||
cpu-release-addr = <0 0x20000000>;
|
||||
};
|
||||
|
||||
cpu@100010101 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a57";
|
||||
reg = <0x1 0x10101>;
|
||||
enable-method = "spin-table";
|
||||
cpu-release-addr = <0 0x20000000>;
|
||||
};
|
||||
};
|
||||
...
|
|
@ -1,25 +0,0 @@
|
|||
Texas Instruments DaVinci Platforms Device Tree Bindings
|
||||
--------------------------------------------------------
|
||||
|
||||
DA850/OMAP-L138/AM18x Evaluation Module (EVM) board
|
||||
Required root node properties:
|
||||
- compatible = "ti,da850-evm", "ti,da850";
|
||||
|
||||
DA850/OMAP-L138/AM18x L138/C6748 Development Kit (LCDK) board
|
||||
Required root node properties:
|
||||
- compatible = "ti,da850-lcdk", "ti,da850";
|
||||
|
||||
EnBW AM1808 based CMC board
|
||||
Required root node properties:
|
||||
- compatible = "enbw,cmc", "ti,da850;
|
||||
|
||||
LEGO MINDSTORMS EV3 (AM1808 based)
|
||||
Required root node properties:
|
||||
- compatible = "lego,ev3", "ti,da850";
|
||||
|
||||
Generic DaVinci Boards
|
||||
----------------------
|
||||
|
||||
DA850/OMAP-L138/AM18x generic board
|
||||
Required root node properties:
|
||||
- compatible = "ti,da850";
|
|
@ -11,4 +11,4 @@ Required root node properties:
|
|||
|
||||
MMP2 Brownstone Board
|
||||
Required root node properties:
|
||||
- compatible = "mrvl,mmp2-brownstone";
|
||||
- compatible = "mrvl,mmp2-brownstone", "mrvl,mmp2";
|
||||
|
|
|
@ -1,14 +0,0 @@
|
|||
TI-NSPIRE calculators
|
||||
|
||||
Required properties:
|
||||
- compatible: Compatible property value should contain "ti,nspire".
|
||||
CX models should have "ti,nspire-cx"
|
||||
Touchpad models should have "ti,nspire-tp"
|
||||
Clickpad models should have "ti,nspire-clp"
|
||||
|
||||
Example:
|
||||
|
||||
/ {
|
||||
model = "TI-NSPIRE CX";
|
||||
compatible = "ti,nspire-cx";
|
||||
...
|
|
@ -1,46 +0,0 @@
|
|||
* ARM Primecell Peripherals
|
||||
|
||||
ARM, Ltd. Primecell peripherals have a standard id register that can be used to
|
||||
identify the peripheral type, vendor, and revision. This value can be used for
|
||||
driver matching.
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible : should be a specific name for the peripheral and
|
||||
"arm,primecell". The specific name will match the ARM
|
||||
engineering name for the logic block in the form: "arm,pl???"
|
||||
|
||||
Optional properties:
|
||||
|
||||
- arm,primecell-periphid : Value to override the h/w value with
|
||||
- clocks : From common clock binding. First clock is phandle to clock for apb
|
||||
pclk. Additional clocks are optional and specific to those peripherals.
|
||||
- clock-names : From common clock binding. Shall be "apb_pclk" for first clock.
|
||||
- dmas : From common DMA binding. If present, refers to one or more dma channels.
|
||||
- dma-names : From common DMA binding, needs to match the 'dmas' property.
|
||||
Devices with exactly one receive and transmit channel shall name
|
||||
these "rx" and "tx", respectively.
|
||||
- pinctrl-<n> : Pinctrl states as described in bindings/pinctrl/pinctrl-bindings.txt
|
||||
- pinctrl-names : Names corresponding to the numbered pinctrl states
|
||||
- interrupts : one or more interrupt specifiers
|
||||
- interrupt-names : names corresponding to the interrupts properties
|
||||
|
||||
Example:
|
||||
|
||||
serial@fff36000 {
|
||||
compatible = "arm,pl011", "arm,primecell";
|
||||
arm,primecell-periphid = <0x00341011>;
|
||||
|
||||
clocks = <&pclk>;
|
||||
clock-names = "apb_pclk";
|
||||
|
||||
dmas = <&dma-controller 4>, <&dma-controller 5>;
|
||||
dma-names = "rx", "tx";
|
||||
|
||||
pinctrl-0 = <&uart0_default_mux>, <&uart0_default_mode>;
|
||||
pinctrl-1 = <&uart0_sleep_mode>;
|
||||
pinctrl-names = "default","sleep";
|
||||
|
||||
interrupts = <0 11 0x4>;
|
||||
};
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/arm/primecell.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: ARM Primecell Peripherals
|
||||
|
||||
maintainers:
|
||||
- Rob Herring <robh@kernel.org>
|
||||
|
||||
description: |+
|
||||
ARM, Ltd. Primecell peripherals have a standard id register that can be used to
|
||||
identify the peripheral type, vendor, and revision. This value can be used for
|
||||
driver matching.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: arm,primecell
|
||||
description:
|
||||
Should be a specific name for the peripheral followed by "arm,primecell".
|
||||
The specific name will match the ARM engineering name for the logic block
|
||||
in the form "arm,pl???"
|
||||
|
||||
arm,primecell-periphid:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
description: Value to override the h/w ID value
|
||||
clocks:
|
||||
minItems: 1
|
||||
maxItems: 32
|
||||
clock-names:
|
||||
contains:
|
||||
const: apb_pclk
|
||||
additionalItems: true
|
||||
...
|
|
@ -1,57 +0,0 @@
|
|||
QCOM device tree bindings
|
||||
-------------------------
|
||||
|
||||
Some qcom based bootloaders identify the dtb blob based on a set of
|
||||
device properties like SoC and platform and revisions of those components.
|
||||
To support this scheme, we encode this information into the board compatible
|
||||
string.
|
||||
|
||||
Each board must specify a top-level board compatible string with the following
|
||||
format:
|
||||
|
||||
compatible = "qcom,<SoC>[-<soc_version>][-<foundry_id>]-<board>[/<subtype>][-<board_version>]"
|
||||
|
||||
The 'SoC' and 'board' elements are required. All other elements are optional.
|
||||
|
||||
The 'SoC' element must be one of the following strings:
|
||||
|
||||
apq8016
|
||||
apq8074
|
||||
apq8084
|
||||
apq8096
|
||||
msm8916
|
||||
msm8974
|
||||
msm8992
|
||||
msm8994
|
||||
msm8996
|
||||
mdm9615
|
||||
ipq8074
|
||||
sdm845
|
||||
|
||||
The 'board' element must be one of the following strings:
|
||||
|
||||
cdp
|
||||
liquid
|
||||
dragonboard
|
||||
mtp
|
||||
sbc
|
||||
hk01
|
||||
|
||||
The 'soc_version' and 'board_version' elements take the form of v<Major>.<Minor>
|
||||
where the minor number may be omitted when it's zero, i.e. v1.0 is the same
|
||||
as v1. If all versions of the 'board_version' elements match, then a
|
||||
wildcard '*' should be used, e.g. 'v*'.
|
||||
|
||||
The 'foundry_id' and 'subtype' elements are one or more digits from 0 to 9.
|
||||
|
||||
Examples:
|
||||
|
||||
"qcom,msm8916-v1-cdp-pm8916-v2.1"
|
||||
|
||||
A CDP board with an msm8916 SoC, version 1 paired with a pm8916 PMIC of version
|
||||
2.1.
|
||||
|
||||
"qcom,apq8074-v2.0-2-dragonboard/1-v0.1"
|
||||
|
||||
A dragonboard board v0.1 of subtype 1 with an apq8074 SoC version 2, made in
|
||||
foundry 2.
|
|
@ -0,0 +1,125 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/bindings/arm/qcom.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: QCOM device tree bindings
|
||||
|
||||
maintainers:
|
||||
- Stephen Boyd <sboyd@codeaurora.org>
|
||||
|
||||
description: |
|
||||
Some qcom based bootloaders identify the dtb blob based on a set of
|
||||
device properties like SoC and platform and revisions of those components.
|
||||
To support this scheme, we encode this information into the board compatible
|
||||
string.
|
||||
|
||||
Each board must specify a top-level board compatible string with the following
|
||||
format:
|
||||
|
||||
compatible = "qcom,<SoC>[-<soc_version>][-<foundry_id>]-<board>[/<subtype>][-<board_version>]"
|
||||
|
||||
The 'SoC' and 'board' elements are required. All other elements are optional.
|
||||
|
||||
The 'SoC' element must be one of the following strings:
|
||||
|
||||
apq8016
|
||||
apq8074
|
||||
apq8084
|
||||
apq8096
|
||||
msm8916
|
||||
msm8974
|
||||
msm8992
|
||||
msm8994
|
||||
msm8996
|
||||
mdm9615
|
||||
ipq8074
|
||||
sdm845
|
||||
|
||||
The 'board' element must be one of the following strings:
|
||||
|
||||
cdp
|
||||
liquid
|
||||
dragonboard
|
||||
mtp
|
||||
sbc
|
||||
hk01
|
||||
|
||||
The 'soc_version' and 'board_version' elements take the form of v<Major>.<Minor>
|
||||
where the minor number may be omitted when it's zero, i.e. v1.0 is the same
|
||||
as v1. If all versions of the 'board_version' elements match, then a
|
||||
wildcard '*' should be used, e.g. 'v*'.
|
||||
|
||||
The 'foundry_id' and 'subtype' elements are one or more digits from 0 to 9.
|
||||
|
||||
Examples:
|
||||
|
||||
"qcom,msm8916-v1-cdp-pm8916-v2.1"
|
||||
|
||||
A CDP board with an msm8916 SoC, version 1 paired with a pm8916 PMIC of version
|
||||
2.1.
|
||||
|
||||
"qcom,apq8074-v2.0-2-dragonboard/1-v0.1"
|
||||
|
||||
A dragonboard board v0.1 of subtype 1 with an apq8074 SoC version 2, made in
|
||||
foundry 2.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
oneOf:
|
||||
- items:
|
||||
- enum:
|
||||
- qcom,apq8016-sbc
|
||||
- const: qcom,apq8016
|
||||
|
||||
- items:
|
||||
- enum:
|
||||
- qcom,apq8064-cm-qs600
|
||||
- qcom,apq8064-ifc6410
|
||||
- const: qcom,apq8064
|
||||
|
||||
- items:
|
||||
- enum:
|
||||
- qcom,apq8074-dragonboard
|
||||
- const: qcom,apq8074
|
||||
|
||||
- items:
|
||||
- enum:
|
||||
- qcom,apq8060-dragonboard
|
||||
- qcom,msm8660-surf
|
||||
- const: qcom,msm8660
|
||||
|
||||
- items:
|
||||
- enum:
|
||||
- qcom,apq8084-mtp
|
||||
- qcom,apq8084-sbc
|
||||
- const: qcom,apq8084
|
||||
|
||||
- items:
|
||||
- enum:
|
||||
- qcom,msm8960-cdp
|
||||
- const: qcom,msm8960
|
||||
|
||||
- items:
|
||||
- const: qcom,msm8916-mtp/1
|
||||
- const: qcom,msm8916-mtp
|
||||
- const: qcom,msm8916
|
||||
|
||||
- items:
|
||||
- const: qcom,msm8996-mtp
|
||||
|
||||
- items:
|
||||
- const: qcom,ipq4019
|
||||
|
||||
- items:
|
||||
- enum:
|
||||
- qcom,ipq8064-ap148
|
||||
- const: qcom,ipq8064
|
||||
|
||||
- items:
|
||||
- enum:
|
||||
- qcom,ipq8074-hk01
|
||||
- const: qcom,ipq8074
|
||||
|
||||
...
|
|
@ -1,11 +0,0 @@
|
|||
CSR SiRFprimaII and SiRFmarco device tree bindings.
|
||||
========================================
|
||||
|
||||
Required root node properties:
|
||||
- compatible:
|
||||
- "sirf,atlas6-cb" : atlas6 "cb" evaluation board
|
||||
- "sirf,atlas6" : atlas6 device based board
|
||||
- "sirf,atlas7-cb" : atlas7 "cb" evaluation board
|
||||
- "sirf,atlas7" : atlas7 device based board
|
||||
- "sirf,prima2-cb" : prima2 "cb" evaluation board
|
||||
- "sirf,prima2" : prima2 device based board
|
|
@ -0,0 +1,27 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/arm/sirf.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: CSR SiRFprimaII and SiRFmarco device tree bindings.
|
||||
|
||||
maintainers:
|
||||
- Binghua Duan <binghua.duan@csr.com>
|
||||
- Barry Song <Baohua.Song@csr.com>
|
||||
|
||||
properties:
|
||||
$nodename:
|
||||
const: '/'
|
||||
compatible:
|
||||
oneOf:
|
||||
- items:
|
||||
- const: sirf,atlas6-cb
|
||||
- const: sirf,atlas6
|
||||
- items:
|
||||
- const: sirf,atlas7-cb
|
||||
- const: sirf,atlas7
|
||||
- items:
|
||||
- const: sirf,prima2-cb
|
||||
- const: sirf,prima2
|
||||
...
|
|
@ -1,26 +0,0 @@
|
|||
ST SPEAr Platforms Device Tree Bindings
|
||||
---------------------------------------
|
||||
|
||||
Boards with the ST SPEAr600 SoC shall have the following properties:
|
||||
Required root node property:
|
||||
compatible = "st,spear600";
|
||||
|
||||
Boards with the ST SPEAr300 SoC shall have the following properties:
|
||||
Required root node property:
|
||||
compatible = "st,spear300";
|
||||
|
||||
Boards with the ST SPEAr310 SoC shall have the following properties:
|
||||
Required root node property:
|
||||
compatible = "st,spear310";
|
||||
|
||||
Boards with the ST SPEAr320 SoC shall have the following properties:
|
||||
Required root node property:
|
||||
compatible = "st,spear320";
|
||||
|
||||
Boards with the ST SPEAr1310 SoC shall have the following properties:
|
||||
Required root node property:
|
||||
compatible = "st,spear1310";
|
||||
|
||||
Boards with the ST SPEAr1340 SoC shall have the following properties:
|
||||
Required root node property:
|
||||
compatible = "st,spear1340";
|
|
@ -0,0 +1,25 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/arm/spear.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: ST SPEAr Platforms Device Tree Bindings
|
||||
|
||||
maintainers:
|
||||
- Viresh Kumar <vireshk@kernel.org>
|
||||
- Stefan Roese <sr@denx.de>
|
||||
|
||||
properties:
|
||||
$nodename:
|
||||
const: '/'
|
||||
compatible:
|
||||
items:
|
||||
- enum:
|
||||
- st,spear600
|
||||
- st,spear300
|
||||
- st,spear310
|
||||
- st,spear320
|
||||
- st,spear1310
|
||||
- st,spear1340
|
||||
...
|
|
@ -1,23 +0,0 @@
|
|||
ST STi Platforms Device Tree Bindings
|
||||
---------------------------------------
|
||||
|
||||
Boards with the ST STiH415 SoC shall have the following properties:
|
||||
Required root node property:
|
||||
compatible = "st,stih415";
|
||||
|
||||
Boards with the ST STiH416 SoC shall have the following properties:
|
||||
Required root node property:
|
||||
compatible = "st,stih416";
|
||||
|
||||
Boards with the ST STiH407 SoC shall have the following properties:
|
||||
Required root node property:
|
||||
compatible = "st,stih407";
|
||||
|
||||
Boards with the ST STiH410 SoC shall have the following properties:
|
||||
Required root node property:
|
||||
compatible = "st,stih410";
|
||||
|
||||
Boards with the ST STiH418 SoC shall have the following properties:
|
||||
Required root node property:
|
||||
compatible = "st,stih418";
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/arm/sti.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: ST STi Platforms Device Tree Bindings
|
||||
|
||||
maintainers:
|
||||
- Patrice Chotard <patrice.chotard@st.com>
|
||||
|
||||
properties:
|
||||
$nodename:
|
||||
const: '/'
|
||||
compatible:
|
||||
items:
|
||||
- enum:
|
||||
- st,stih415
|
||||
- st,stih416
|
||||
- st,stih407
|
||||
- st,stih410
|
||||
- st,stih418
|
||||
...
|
|
@ -1,65 +0,0 @@
|
|||
NVIDIA Tegra device tree bindings
|
||||
-------------------------------------------
|
||||
|
||||
SoCs
|
||||
-------------------------------------------
|
||||
|
||||
Each device tree must specify which Tegra SoC it uses, using one of the
|
||||
following compatible values:
|
||||
|
||||
nvidia,tegra20
|
||||
nvidia,tegra30
|
||||
nvidia,tegra114
|
||||
nvidia,tegra124
|
||||
nvidia,tegra132
|
||||
nvidia,tegra210
|
||||
nvidia,tegra186
|
||||
nvidia,tegra194
|
||||
|
||||
Boards
|
||||
-------------------------------------------
|
||||
|
||||
Each device tree must specify which one or more of the following
|
||||
board-specific compatible values:
|
||||
|
||||
ad,medcom-wide
|
||||
ad,plutux
|
||||
ad,tamonten
|
||||
ad,tec
|
||||
compal,paz00
|
||||
compulab,trimslice
|
||||
nvidia,beaver
|
||||
nvidia,cardhu
|
||||
nvidia,cardhu-a02
|
||||
nvidia,cardhu-a04
|
||||
nvidia,dalmore
|
||||
nvidia,harmony
|
||||
nvidia,jetson-tk1
|
||||
nvidia,norrin
|
||||
nvidia,p2371-0000
|
||||
nvidia,p2371-2180
|
||||
nvidia,p2571
|
||||
nvidia,p2771-0000
|
||||
nvidia,p2972-0000
|
||||
nvidia,roth
|
||||
nvidia,seaboard
|
||||
nvidia,tn7
|
||||
nvidia,ventana
|
||||
toradex,apalis_t30
|
||||
toradex,apalis_t30-eval
|
||||
toradex,apalis_t30-v1.1
|
||||
toradex,apalis_t30-v1.1-eval
|
||||
toradex,apalis-tk1
|
||||
toradex,apalis-tk1-eval
|
||||
toradex,apalis-tk1-v1.2
|
||||
toradex,apalis-tk1-v1.2-eval
|
||||
toradex,colibri_t20
|
||||
toradex,colibri_t20-eval-v3
|
||||
toradex,colibri_t20-iris
|
||||
toradex,colibri_t30
|
||||
toradex,colibri_t30-eval-v3
|
||||
|
||||
Trusted Foundations
|
||||
-------------------------------------------
|
||||
Tegra supports the Trusted Foundation secure monitor. See the
|
||||
"tlm,trusted-foundations" binding's documentation for more details.
|
|
@ -0,0 +1,101 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/arm/tegra.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: NVIDIA Tegra device tree bindings
|
||||
|
||||
maintainers:
|
||||
- Thierry Reding <thierry.reding@gmail.com>
|
||||
- Jonathan Hunter <jonathanh@nvidia.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
oneOf:
|
||||
- items:
|
||||
- enum:
|
||||
- compal,paz00
|
||||
- compulab,trimslice
|
||||
- nvidia,harmony
|
||||
- nvidia,seaboard
|
||||
- nvidia,ventana
|
||||
- const: nvidia,tegra20
|
||||
- items:
|
||||
- enum:
|
||||
- ad,medcom-wide
|
||||
- ad,plutux
|
||||
- ad,tec
|
||||
- const: ad,tamonten
|
||||
- const: nvidia,tegra20
|
||||
- items:
|
||||
- enum:
|
||||
- toradex,colibri_t20-eval-v3
|
||||
- toradex,colibri_t20-iris
|
||||
- const: toradex,colibri_t20
|
||||
- const: nvidia,tegra20
|
||||
- items:
|
||||
- enum:
|
||||
- nvidia,beaver
|
||||
- const: nvidia,tegra30
|
||||
- items:
|
||||
- enum:
|
||||
- nvidia,cardhu-a02
|
||||
- nvidia,cardhu-a04
|
||||
- const: nvidia,cardhu
|
||||
- const: nvidia,tegra30
|
||||
- items:
|
||||
- const: toradex,apalis_t30-eval
|
||||
- const: toradex,apalis_t30
|
||||
- const: nvidia,tegra30
|
||||
- items:
|
||||
- const: toradex,apalis_t30-eval-v1.1
|
||||
- const: toradex,apalis_t30-eval
|
||||
- const: toradex,apalis_t30-v1.1
|
||||
- const: toradex,apalis_t30
|
||||
- const: nvidia,tegra30
|
||||
- items:
|
||||
- enum:
|
||||
- toradex,colibri_t30-eval-v3
|
||||
- const: toradex,colibri_t30
|
||||
- const: nvidia,tegra30
|
||||
- items:
|
||||
- enum:
|
||||
- nvidia,dalmore
|
||||
- nvidia,roth
|
||||
- nvidia,tn7
|
||||
- const: nvidia,tegra114
|
||||
- items:
|
||||
- enum:
|
||||
- nvidia,jetson-tk1
|
||||
- nvidia,venice2
|
||||
- const: nvidia,tegra124
|
||||
- items:
|
||||
- const: toradex,apalis-tk1-eval
|
||||
- const: toradex,apalis-tk1
|
||||
- const: nvidia,tegra124
|
||||
- items:
|
||||
- const: toradex,apalis-tk1-v1.2-eval
|
||||
- const: toradex,apalis-tk1-eval
|
||||
- const: toradex,apalis-tk1-v1.2
|
||||
- const: toradex,apalis-tk1
|
||||
- const: nvidia,tegra124
|
||||
- items:
|
||||
- enum:
|
||||
- nvidia,norrin
|
||||
- const: nvidia,tegra132
|
||||
- const: nvidia,tegra124
|
||||
- items:
|
||||
- enum:
|
||||
- nvidia,p2371-0000
|
||||
- nvidia,p2371-2180
|
||||
- nvidia,p2571
|
||||
- const: nvidia,tegra210
|
||||
- items:
|
||||
- enum:
|
||||
- nvidia,p2771-0000
|
||||
- const: nvidia,tegra186
|
||||
- items:
|
||||
- enum:
|
||||
- nvidia,p2972-0000
|
||||
- const: nvidia,tegra194
|
|
@ -0,0 +1,24 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/arm/ti/nspire.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: TI-NSPIRE calculators
|
||||
|
||||
maintainers:
|
||||
- Daniel Tang <dt.tangr@gmail.com>
|
||||
|
||||
properties:
|
||||
$nodename:
|
||||
const: '/'
|
||||
compatible:
|
||||
items:
|
||||
- enum:
|
||||
# CX models
|
||||
- ti,nspire-cx
|
||||
# Touchpad models
|
||||
- ti,nspire-tp
|
||||
# Clickpad models
|
||||
- ti,nspire-clp
|
||||
...
|
|
@ -0,0 +1,26 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/arm/ti/davinci.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Texas Instruments DaVinci Platforms Device Tree Bindings
|
||||
|
||||
maintainers:
|
||||
- Sekhar Nori <nsekhar@ti.com>
|
||||
|
||||
description:
|
||||
DA850/OMAP-L138/AM18x based boards
|
||||
|
||||
properties:
|
||||
$nodename:
|
||||
const: '/'
|
||||
compatible:
|
||||
items:
|
||||
- enum:
|
||||
- ti,da850-evm # DA850/OMAP-L138/AM18x Evaluation Module (EVM) board
|
||||
- ti,da850-lcdk # DA850/OMAP-L138/AM18x L138/C6748 Development Kit (LCDK) board
|
||||
- enbw,cmc # EnBW AM1808 based CMC board
|
||||
- lego,ev3 # LEGO MINDSTORMS EV3 (AM1808 based)
|
||||
- const: ti,da850
|
||||
...
|
|
@ -1,22 +0,0 @@
|
|||
VIA/Wondermedia VT8500 Platforms Device Tree Bindings
|
||||
---------------------------------------
|
||||
|
||||
Boards with the VIA VT8500 SoC shall have the following properties:
|
||||
Required root node property:
|
||||
compatible = "via,vt8500";
|
||||
|
||||
Boards with the Wondermedia WM8505 SoC shall have the following properties:
|
||||
Required root node property:
|
||||
compatible = "wm,wm8505";
|
||||
|
||||
Boards with the Wondermedia WM8650 SoC shall have the following properties:
|
||||
Required root node property:
|
||||
compatible = "wm,wm8650";
|
||||
|
||||
Boards with the Wondermedia WM8750 SoC shall have the following properties:
|
||||
Required root node property:
|
||||
compatible = "wm,wm8750";
|
||||
|
||||
Boards with the Wondermedia WM8850 SoC shall have the following properties:
|
||||
Required root node property:
|
||||
compatible = "wm,wm8850";
|
|
@ -0,0 +1,23 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/arm/vt8500.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: VIA/Wondermedia VT8500 Platforms Device Tree Bindings
|
||||
|
||||
maintainers:
|
||||
- Tony Prisk <linux@prisktech.co.nz>
|
||||
description: test
|
||||
|
||||
properties:
|
||||
$nodename:
|
||||
const: '/'
|
||||
compatible:
|
||||
items:
|
||||
- enum:
|
||||
- via,vt8500
|
||||
- wm,wm8505
|
||||
- wm,wm8650
|
||||
- wm,wm8750
|
||||
- wm,wm8850
|
|
@ -1,83 +0,0 @@
|
|||
Xilinx Zynq Platforms Device Tree Bindings
|
||||
|
||||
Boards with Zynq-7000 SOC based on an ARM Cortex A9 processor
|
||||
shall have the following properties.
|
||||
|
||||
Required root node properties:
|
||||
- compatible = "xlnx,zynq-7000";
|
||||
|
||||
Additional compatible strings:
|
||||
|
||||
- Adapteva Parallella board
|
||||
"adapteva,parallella"
|
||||
|
||||
- Avnet MicroZed board
|
||||
"avnet,zynq-microzed"
|
||||
"xlnx,zynq-microzed"
|
||||
|
||||
- Avnet ZedBoard board
|
||||
"avnet,zynq-zed"
|
||||
"xlnx,zynq-zed"
|
||||
|
||||
- Digilent Zybo board
|
||||
"digilent,zynq-zybo"
|
||||
|
||||
- Digilent Zybo Z7 board
|
||||
"digilent,zynq-zybo-z7"
|
||||
|
||||
- Xilinx CC108 internal board
|
||||
"xlnx,zynq-cc108"
|
||||
|
||||
- Xilinx ZC702 internal board
|
||||
"xlnx,zynq-zc702"
|
||||
|
||||
- Xilinx ZC706 internal board
|
||||
"xlnx,zynq-zc706"
|
||||
|
||||
- Xilinx ZC770 internal board, with different FMC cards
|
||||
"xlnx,zynq-zc770-xm010"
|
||||
"xlnx,zynq-zc770-xm011"
|
||||
"xlnx,zynq-zc770-xm012"
|
||||
"xlnx,zynq-zc770-xm013"
|
||||
|
||||
---------------------------------------------------------------
|
||||
|
||||
Xilinx Zynq UltraScale+ MPSoC Platforms Device Tree Bindings
|
||||
|
||||
Boards with ZynqMP SOC based on an ARM Cortex A53 processor
|
||||
shall have the following properties.
|
||||
|
||||
Required root node properties:
|
||||
- compatible = "xlnx,zynqmp";
|
||||
|
||||
|
||||
Additional compatible strings:
|
||||
|
||||
- Xilinx internal board zc1232
|
||||
"xlnx,zynqmp-zc1232-revA", "xlnx,zynqmp-zc1232"
|
||||
|
||||
- Xilinx internal board zc1254
|
||||
"xlnx,zynqmp-zc1254-revA", "xlnx,zynqmp-zc1254"
|
||||
|
||||
- Xilinx internal board zc1275
|
||||
"xlnx,zynqmp-zc1275-revA", "xlnx,zynqmp-zc1275"
|
||||
|
||||
- Xilinx internal board zc1751
|
||||
"xlnx,zynqmp-zc1751"
|
||||
|
||||
- Xilinx 96boards compatible board zcu100
|
||||
"xlnx,zynqmp-zcu100-revC", "xlnx,zynqmp-zcu100"
|
||||
|
||||
- Xilinx evaluation board zcu102
|
||||
"xlnx,zynqmp-zcu102-revA", "xlnx,zynqmp-zcu102"
|
||||
"xlnx,zynqmp-zcu102-revB", "xlnx,zynqmp-zcu102"
|
||||
"xlnx,zynqmp-zcu102-rev1.0", "xlnx,zynqmp-zcu102"
|
||||
|
||||
- Xilinx evaluation board zcu104
|
||||
"xlnx,zynqmp-zcu104-revA", "xlnx,zynqmp-zcu104"
|
||||
|
||||
- Xilinx evaluation board zcu106
|
||||
"xlnx,zynqmp-zcu106-revA", "xlnx,zynqmp-zcu106"
|
||||
|
||||
- Xilinx evaluation board zcu111
|
||||
"xlnx,zynqmp-zcu111-revA", "xlnx,zynqmp-zcu111"
|
|
@ -0,0 +1,114 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/arm/xilinx.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Xilinx Zynq Platforms Device Tree Bindings
|
||||
|
||||
maintainers:
|
||||
- Michal Simek <michal.simek@xilinx.com>
|
||||
|
||||
description: |
|
||||
Xilinx boards with Zynq-7000 SOC or Zynq UltraScale+ MPSoC
|
||||
|
||||
properties:
|
||||
$nodename:
|
||||
const: '/'
|
||||
compatible:
|
||||
oneOf:
|
||||
- items:
|
||||
- enum:
|
||||
- adapteva,parallella
|
||||
- digilent,zynq-zybo
|
||||
- digilent,zynq-zybo-z7
|
||||
- xlnx,zynq-cc108
|
||||
- xlnx,zynq-zc702
|
||||
- xlnx,zynq-zc706
|
||||
- xlnx,zynq-zc770-xm010
|
||||
- xlnx,zynq-zc770-xm011
|
||||
- xlnx,zynq-zc770-xm012
|
||||
- xlnx,zynq-zc770-xm013
|
||||
- const: xlnx,zynq-7000
|
||||
|
||||
- items:
|
||||
- const: avnet,zynq-microzed
|
||||
- const: xlnx,zynq-microzed
|
||||
- const: xlnx,zynq-7000
|
||||
|
||||
- items:
|
||||
- const: avnet,zynq-zed
|
||||
- const: xlnx,zynq-zed
|
||||
- const: xlnx,zynq-7000
|
||||
|
||||
- items:
|
||||
- enum:
|
||||
- xlnx,zynqmp-zc1751
|
||||
- const: xlnx,zynqmp
|
||||
|
||||
- description: Xilinx internal board zc1232
|
||||
items:
|
||||
- const: xlnx,zynqmp-zc1232-revA
|
||||
- const: xlnx,zynqmp-zc1232
|
||||
- const: xlnx,zynqmp
|
||||
|
||||
- description: Xilinx internal board zc1254
|
||||
items:
|
||||
- const: xlnx,zynqmp-zc1254-revA
|
||||
- const: xlnx,zynqmp-zc1254
|
||||
- const: xlnx,zynqmp
|
||||
|
||||
- description: Xilinx internal board zc1275
|
||||
items:
|
||||
- const: xlnx,zynqmp-zc1275-revA
|
||||
- const: xlnx,zynqmp-zc1275
|
||||
- const: xlnx,zynqmp
|
||||
|
||||
- description: Xilinx 96boards compatible board zcu100
|
||||
items:
|
||||
- const: xlnx,zynqmp-zcu100-revC
|
||||
- const: xlnx,zynqmp-zcu100
|
||||
- const: xlnx,zynqmp
|
||||
|
||||
- description: Xilinx 96boards compatible board Ultra96
|
||||
items:
|
||||
- const: avnet,ultra96-rev1
|
||||
- const: avnet,ultra96
|
||||
- const: xlnx,zynqmp-zcu100-revC
|
||||
- const: xlnx,zynqmp-zcu100
|
||||
- const: xlnx,zynqmp
|
||||
|
||||
- description: Xilinx evaluation board zcu102
|
||||
items:
|
||||
- enum:
|
||||
- xlnx,zynqmp-zcu102-revA
|
||||
- xlnx,zynqmp-zcu102-revB
|
||||
- xlnx,zynqmp-zcu102-rev1.0
|
||||
- const: xlnx,zynqmp-zcu102
|
||||
- const: xlnx,zynqmp
|
||||
|
||||
- description: Xilinx evaluation board zcu104
|
||||
items:
|
||||
- enum:
|
||||
- xlnx,zynqmp-zcu104-revA
|
||||
- xlnx,zynqmp-zcu104-rev1.0
|
||||
- const: xlnx,zynqmp-zcu104
|
||||
- const: xlnx,zynqmp
|
||||
|
||||
- description: Xilinx evaluation board zcu106
|
||||
items:
|
||||
- enum:
|
||||
- xlnx,zynqmp-zcu106-revA
|
||||
- xlnx,zynqmp-zcu106-rev1.0
|
||||
- const: xlnx,zynqmp-zcu106
|
||||
- const: xlnx,zynqmp
|
||||
|
||||
- description: Xilinx evaluation board zcu111
|
||||
items:
|
||||
- enum:
|
||||
- xlnx,zynqmp-zcu111-revA
|
||||
- xlnx,zynqmp-zcu11-rev1.0
|
||||
- const: xlnx,zynqmp-zcu111
|
||||
- const: xlnx,zynqmp
|
||||
|
||||
...
|
|
@ -1,14 +0,0 @@
|
|||
ZTE platforms device tree bindings
|
||||
|
||||
---------------------------------------
|
||||
- ZX296702 board:
|
||||
Required root node properties:
|
||||
- compatible = "zte,zx296702-ad1", "zte,zx296702"
|
||||
|
||||
---------------------------------------
|
||||
- ZX296718 SoC:
|
||||
Required root node properties:
|
||||
- compatible = "zte,zx296718"
|
||||
|
||||
ZX296718 EVB board:
|
||||
- "zte,zx296718-evb"
|
|
@ -0,0 +1,26 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/arm/zte.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: ZTE platforms device tree bindings
|
||||
|
||||
maintainers:
|
||||
- Jun Nie <jun.nie@linaro.org>
|
||||
|
||||
properties:
|
||||
$nodename:
|
||||
const: '/'
|
||||
compatible:
|
||||
oneOf:
|
||||
- items:
|
||||
- enum:
|
||||
- zte,zx296702-ad1
|
||||
- const: zte,zx296702
|
||||
- items:
|
||||
- enum:
|
||||
- zte,zx296718-evb
|
||||
- const: zte,zx296718
|
||||
|
||||
...
|
|
@ -0,0 +1,170 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
# Copyright 2018 Linaro Ltd.
|
||||
%YAML 1.2
|
||||
---
|
||||
# All the top-level keys are standard json-schema keywords except for
|
||||
# 'maintainers' and 'select'
|
||||
|
||||
# $id is a unique idenifier based on the filename. There may or may not be a
|
||||
# file present at the URL.
|
||||
$id: "http://devicetree.org/schemas/example-schema.yaml#"
|
||||
# $schema is the meta-schema this schema should be validated with.
|
||||
$schema: "http://devicetree.org/meta-schemas/core.yaml#"
|
||||
|
||||
title: An example schema annotated with jsonschema details
|
||||
|
||||
maintainers:
|
||||
- Rob Herring <robh@kernel.org>
|
||||
|
||||
description: |
|
||||
A more detailed multi-line description of the binding.
|
||||
|
||||
Details about the hardware device and any links to datasheets can go here.
|
||||
|
||||
Literal blocks are marked with the '|' at the beginning. The end is marked by
|
||||
indentation less than the first line of the literal block. Lines also cannot
|
||||
begin with a tab character.
|
||||
|
||||
select: false
|
||||
# 'select' is a schema applied to a DT node to determine if this binding
|
||||
# schema should be applied to the node. It is optional and by default the
|
||||
# possible compatible strings are extracted and used to match.
|
||||
|
||||
# In this case, a 'false' schema will never match.
|
||||
|
||||
properties:
|
||||
# A dictionary of DT properties for this binding schema
|
||||
compatible:
|
||||
# More complicated schema can use oneOf (XOR), anyOf (OR), or allOf (AND)
|
||||
# to handle different conditions.
|
||||
# In this case, it's needed to handle a variable number of values as there
|
||||
# isn't another way to express a constraint of the last string value.
|
||||
# The boolean schema must be a list of schemas.
|
||||
oneOf:
|
||||
- items:
|
||||
# items is a list of possible values for the property. The number of
|
||||
# values is determined by the number of elements in the list.
|
||||
# Order in lists is significant, order in dicts is not
|
||||
# Must be one of the 1st enums followed by the 2nd enum
|
||||
#
|
||||
# Each element in items should be 'enum' or 'const'
|
||||
- enum:
|
||||
- vendor,soc4-ip
|
||||
- vendor,soc3-ip
|
||||
- vendor,soc2-ip
|
||||
- enum:
|
||||
- vendor,soc1-ip
|
||||
# additionalItems being false is implied
|
||||
# minItems/maxItems equal to 2 is implied
|
||||
- items:
|
||||
# 'const' is just a special case of an enum with a single possible value
|
||||
- const: vendor,soc1-ip
|
||||
|
||||
reg:
|
||||
# The core schema already checks that reg values are numbers, so device
|
||||
# specific schema don't need to do those checks.
|
||||
# The description of each element defines the order and implicitly defines
|
||||
# the number of reg entries.
|
||||
items:
|
||||
- description: core registers
|
||||
- description: aux registers
|
||||
# minItems/maxItems equal to 2 is implied
|
||||
|
||||
reg-names:
|
||||
# The core schema enforces this is a string array
|
||||
items:
|
||||
- const: core
|
||||
- const: aux
|
||||
|
||||
clocks:
|
||||
# Cases that have only a single entry just need to express that with maxItems
|
||||
maxItems: 1
|
||||
description: bus clock
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: bus
|
||||
|
||||
interrupts:
|
||||
# Either 1 or 2 interrupts can be present
|
||||
minItems: 1
|
||||
maxItems: 2
|
||||
items:
|
||||
- description: tx or combined interrupt
|
||||
- description: rx interrupt
|
||||
description:
|
||||
A variable number of interrupts warrants a description of what conditions
|
||||
affect the number of interrupts. Otherwise, descriptions on standard
|
||||
properties are not necessary.
|
||||
|
||||
interrupt-names:
|
||||
# minItems must be specified here because the default would be 2
|
||||
minItems: 1
|
||||
maxItems: 2
|
||||
items:
|
||||
- const: tx irq
|
||||
- const: rx irq
|
||||
|
||||
# Property names starting with '#' must be quoted
|
||||
'#interrupt-cells':
|
||||
# A simple case where the value must always be '2'.
|
||||
# The core schema handles that this must be a single integer.
|
||||
const: 2
|
||||
|
||||
interrupt-controller: true
|
||||
# The core checks this is a boolean, so just have to list it here to be
|
||||
# valid for this binding.
|
||||
|
||||
clock-frequency:
|
||||
# The type is set in the core schema. Per device schema only need to set
|
||||
# constraints on the possible values.
|
||||
minimum: 100
|
||||
maximum: 400000
|
||||
# The value that should be used if the property is not present
|
||||
default: 200
|
||||
|
||||
foo-gpios:
|
||||
maxItems: 1
|
||||
description: A connection of the 'foo' gpio line.
|
||||
|
||||
vendor,int-property:
|
||||
description: Vendor specific properties must have a description
|
||||
# 'allOf' is the json-schema way of subclassing a schema. Here the base
|
||||
# type schema is referenced and then additional constraints on the values
|
||||
# are added.
|
||||
allOf:
|
||||
- $ref: /schemas/types.yaml#/definitions/uint32
|
||||
- enum: [2, 4, 6, 8, 10]
|
||||
|
||||
vendor,bool-property:
|
||||
description: Vendor specific properties must have a description
|
||||
# boolean properties is one case where the json-schema 'type' keyword
|
||||
# can be used directly
|
||||
type: boolean
|
||||
|
||||
vendor,string-array-property:
|
||||
description: Vendor specific properties should reference a type in the
|
||||
core schema.
|
||||
allOf:
|
||||
- $ref: /schemas/types.yaml#/definitions/string-array
|
||||
- items:
|
||||
- enum: [ foo, bar ]
|
||||
- enum: [ baz, boo ]
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- interrupt-controller
|
||||
|
||||
examples:
|
||||
# Examples are now compiled with dtc
|
||||
- |
|
||||
node@1000 {
|
||||
compatible = "vendor,soc4-ip", "vendor,soc1-ip";
|
||||
reg = <0x1000 0x80>,
|
||||
<0x3000 0x80>;
|
||||
reg-names = "core", "aux";
|
||||
interrupts = <10>;
|
||||
interrupt-controller;
|
||||
};
|
|
@ -5,6 +5,8 @@ Required properties:
|
|||
- "ti,omap2-gpio" for OMAP2 controllers
|
||||
- "ti,omap3-gpio" for OMAP3 controllers
|
||||
- "ti,omap4-gpio" for OMAP4 controllers
|
||||
- reg : Physical base address of the controller and length of memory mapped
|
||||
region.
|
||||
- gpio-controller : Marks the device node as a GPIO controller.
|
||||
- #gpio-cells : Should be two.
|
||||
- first cell is the pin number
|
||||
|
@ -18,6 +20,8 @@ Required properties:
|
|||
2 = high-to-low edge triggered.
|
||||
4 = active high level-sensitive.
|
||||
8 = active low level-sensitive.
|
||||
- interrupts : The interrupt the controller is rising as output when an
|
||||
interrupt occures
|
||||
|
||||
OMAP specific properties:
|
||||
- ti,hwmods: Name of the hwmod associated to the GPIO:
|
||||
|
@ -29,11 +33,13 @@ OMAP specific properties:
|
|||
|
||||
Example:
|
||||
|
||||
gpio4: gpio4 {
|
||||
gpio0: gpio@44e07000 {
|
||||
compatible = "ti,omap4-gpio";
|
||||
ti,hwmods = "gpio4";
|
||||
reg = <0x44e07000 0x1000>;
|
||||
ti,hwmods = "gpio1";
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <2>;
|
||||
interrupts = <96>;
|
||||
};
|
||||
|
|
|
@ -1,46 +0,0 @@
|
|||
Device-Tree bindings for i2c gpio driver
|
||||
|
||||
Required properties:
|
||||
- compatible = "i2c-gpio";
|
||||
- sda-gpios: gpio used for the sda signal, this should be flagged as
|
||||
active high using open drain with (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)
|
||||
from <dt-bindings/gpio/gpio.h> since the signal is by definition
|
||||
open drain.
|
||||
- scl-gpios: gpio used for the scl signal, this should be flagged as
|
||||
active high using open drain with (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)
|
||||
from <dt-bindings/gpio/gpio.h> since the signal is by definition
|
||||
open drain.
|
||||
|
||||
Optional properties:
|
||||
- i2c-gpio,scl-output-only: scl as output only
|
||||
- i2c-gpio,delay-us: delay between GPIO operations (may depend on each platform)
|
||||
- i2c-gpio,timeout-ms: timeout to get data
|
||||
|
||||
Deprecated properties, do not use in new device tree sources:
|
||||
- gpios: sda and scl gpio, alternative for {sda,scl}-gpios
|
||||
- i2c-gpio,sda-open-drain: this means that something outside of our
|
||||
control has put the GPIO line used for SDA into open drain mode, and
|
||||
that something is not the GPIO chip. It is essentially an
|
||||
inconsistency flag.
|
||||
- i2c-gpio,scl-open-drain: this means that something outside of our
|
||||
control has put the GPIO line used for SCL into open drain mode, and
|
||||
that something is not the GPIO chip. It is essentially an
|
||||
inconsistency flag.
|
||||
|
||||
Example nodes:
|
||||
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
|
||||
i2c@0 {
|
||||
compatible = "i2c-gpio";
|
||||
sda-gpios = <&pioA 23 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)>;
|
||||
scl-gpios = <&pioA 24 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)>;
|
||||
i2c-gpio,delay-us = <2>; /* ~100 kHz */
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
rv3029c2@56 {
|
||||
compatible = "rv3029c2";
|
||||
reg = <0x56>;
|
||||
};
|
||||
};
|
|
@ -0,0 +1,73 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/i2c/i2c-gpio.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Bindings for GPIO bitbanged I2C
|
||||
|
||||
maintainers:
|
||||
- Wolfram Sang <wolfram@the-dreams.de>
|
||||
|
||||
allOf:
|
||||
- $ref: /schemas/i2c/i2c-controller.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
items:
|
||||
- const: i2c-gpio
|
||||
|
||||
sda-gpios:
|
||||
description:
|
||||
gpio used for the sda signal, this should be flagged as
|
||||
active high using open drain with (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)
|
||||
from <dt-bindings/gpio/gpio.h> since the signal is by definition
|
||||
open drain.
|
||||
maxItems: 1
|
||||
|
||||
scl-gpios:
|
||||
description:
|
||||
gpio used for the scl signal, this should be flagged as
|
||||
active high using open drain with (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)
|
||||
from <dt-bindings/gpio/gpio.h> since the signal is by definition
|
||||
open drain.
|
||||
maxItems: 1
|
||||
|
||||
i2c-gpio,scl-output-only:
|
||||
description: scl as output only
|
||||
type: boolean
|
||||
|
||||
i2c-gpio,delay-us:
|
||||
description: delay between GPIO operations (may depend on each platform)
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
|
||||
i2c-gpio,timeout-ms:
|
||||
description: timeout to get data
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
|
||||
# Deprecated properties, do not use in new device tree sources:
|
||||
gpios:
|
||||
minItems: 2
|
||||
maxItems: 2
|
||||
description: sda and scl gpio, alternative for {sda,scl}-gpios
|
||||
|
||||
i2c-gpio,sda-open-drain:
|
||||
# Generate a warning if present
|
||||
not: true
|
||||
description: this means that something outside of our control has put
|
||||
the GPIO line used for SDA into open drain mode, and that something is
|
||||
not the GPIO chip. It is essentially an inconsistency flag.
|
||||
|
||||
i2c-gpio,scl-open-drain:
|
||||
# Generate a warning if present
|
||||
not: true
|
||||
description: this means that something outside of our control has put the
|
||||
GPIO line used for SCL into open drain mode, and that something is not
|
||||
the GPIO chip. It is essentially an inconsistency flag.
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- sda-gpios
|
||||
- scl-gpios
|
||||
|
||||
...
|
|
@ -0,0 +1,27 @@
|
|||
* FREESCALE MAG3110 magnetometer sensor
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible : should be "fsl,mag3110"
|
||||
- reg : the I2C address of the magnetometer
|
||||
|
||||
Optional properties:
|
||||
|
||||
- interrupts: the sole interrupt generated by the device
|
||||
|
||||
Refer to interrupt-controller/interrupts.txt for generic interrupt client
|
||||
node bindings.
|
||||
|
||||
- vdd-supply: phandle to the regulator that provides power to the sensor.
|
||||
- vddio-supply: phandle to the regulator that provides power to the sensor's IO.
|
||||
|
||||
Example:
|
||||
|
||||
magnetometer@e {
|
||||
compatible = "fsl,mag3110";
|
||||
reg = <0x0e>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c3_mag3110_int>;
|
||||
interrupt-parent = <&gpio3>;
|
||||
interrupts = <16 IRQ_TYPE_EDGE_RISING>;
|
||||
};
|
|
@ -5,7 +5,7 @@ Required properties:
|
|||
"mrvl,mmp2-mux-intc"
|
||||
- reg : Address and length of the register set of the interrupt controller.
|
||||
If the interrupt controller is intc, address and length means the range
|
||||
of the whold interrupt controller. If the interrupt controller is mux-intc,
|
||||
of the whole interrupt controller. If the interrupt controller is mux-intc,
|
||||
address and length means one register. Since address of mux-intc is in the
|
||||
range of intc. mux-intc is secondary interrupt controller.
|
||||
- reg-names : Name of the register set of the interrupt controller. It's
|
||||
|
|
|
@ -0,0 +1,67 @@
|
|||
Cadence Sierra PHY
|
||||
-----------------------
|
||||
|
||||
Required properties:
|
||||
- compatible: cdns,sierra-phy-t0
|
||||
- clocks: Must contain an entry in clock-names.
|
||||
See ../clocks/clock-bindings.txt for details.
|
||||
- clock-names: Must be "phy_clk"
|
||||
- resets: Must contain an entry for each in reset-names.
|
||||
See ../reset/reset.txt for details.
|
||||
- reset-names: Must include "sierra_reset" and "sierra_apb".
|
||||
"sierra_reset" must control the reset line to the PHY.
|
||||
"sierra_apb" must control the reset line to the APB PHY
|
||||
interface.
|
||||
- reg: register range for the PHY.
|
||||
- #address-cells: Must be 1
|
||||
- #size-cells: Must be 0
|
||||
|
||||
Optional properties:
|
||||
- cdns,autoconf: A boolean property whose presence indicates that the
|
||||
PHY registers will be configured by hardware. If not
|
||||
present, all sub-node optional properties must be
|
||||
provided.
|
||||
|
||||
Sub-nodes:
|
||||
Each group of PHY lanes with a single master lane should be represented as
|
||||
a sub-node. Note that the actual configuration of each lane is determined by
|
||||
hardware strapping, and must match the configuration specified here.
|
||||
|
||||
Sub-node required properties:
|
||||
- #phy-cells: Generic PHY binding; must be 0.
|
||||
- reg: The master lane number. This is the lowest numbered lane
|
||||
in the lane group.
|
||||
- resets: Must contain one entry which controls the reset line for the
|
||||
master lane of the sub-node.
|
||||
See ../reset/reset.txt for details.
|
||||
|
||||
Sub-node optional properties:
|
||||
- cdns,num-lanes: Number of lanes in this group. From 1 to 4. The
|
||||
group is made up of consecutive lanes.
|
||||
- cdns,phy-type: Can be PHY_TYPE_PCIE or PHY_TYPE_USB3, depending on
|
||||
configuration of lanes.
|
||||
|
||||
Example:
|
||||
pcie_phy4: pcie-phy@fd240000 {
|
||||
compatible = "cdns,sierra-phy-t0";
|
||||
reg = <0x0 0xfd240000 0x0 0x40000>;
|
||||
resets = <&phyrst 0>, <&phyrst 1>;
|
||||
reset-names = "sierra_reset", "sierra_apb";
|
||||
clocks = <&phyclock>;
|
||||
clock-names = "phy_clk";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
pcie0_phy0: pcie-phy@0 {
|
||||
reg = <0>;
|
||||
resets = <&phyrst 2>;
|
||||
cdns,num-lanes = <2>;
|
||||
#phy-cells = <0>;
|
||||
cdns,phy-type = <PHY_TYPE_PCIE>;
|
||||
};
|
||||
pcie0_phy1: pcie-phy@2 {
|
||||
reg = <2>;
|
||||
resets = <&phyrst 4>;
|
||||
cdns,num-lanes = <1>;
|
||||
#phy-cells = <0>;
|
||||
cdns,phy-type = <PHY_TYPE_PCIE>;
|
||||
};
|
|
@ -0,0 +1,24 @@
|
|||
* Xen hypervisor reserved-memory binding
|
||||
|
||||
Expose one or more memory regions as reserved-memory to the guest
|
||||
virtual machine. Typically, a region is configured at VM creation time
|
||||
to be a shared memory area across multiple virtual machines for
|
||||
communication among them.
|
||||
|
||||
For each of these pre-shared memory regions, a range is exposed under
|
||||
the /reserved-memory node as a child node. Each range sub-node is named
|
||||
xen-shmem@<address> and has the following properties:
|
||||
|
||||
- compatible:
|
||||
compatible = "xen,shared-memory-v1"
|
||||
|
||||
- reg:
|
||||
the base guest physical address and size of the shared memory region
|
||||
|
||||
- xen,offset: (borrower VMs only)
|
||||
64 bit integer offset within the owner virtual machine's shared
|
||||
memory region used for the mapping in the borrower VM.
|
||||
|
||||
- xen,id:
|
||||
a string that identifies the shared memory region as specified in
|
||||
the VM config file
|
|
@ -1,9 +1,10 @@
|
|||
Device-Tree bindings for Mediatek random number generator
|
||||
found in Mediatek SoC family
|
||||
found in MediaTek SoC family
|
||||
|
||||
Required properties:
|
||||
- compatible : Should be
|
||||
"mediatek,mt7622-rng", "mediatek,mt7623-rng" : for MT7622
|
||||
"mediatek,mt7629-rng", "mediatek,mt7623-rng" : for MT7629
|
||||
"mediatek,mt7623-rng" : for MT7623
|
||||
- clocks : list of clock specifiers, corresponding to
|
||||
entries in clock-names property;
|
||||
|
|
|
@ -0,0 +1,64 @@
|
|||
Generic device tree bindings for Real Time Clock devices
|
||||
========================================================
|
||||
|
||||
This document describes generic bindings which can be used to describe Real Time
|
||||
Clock devices in a device tree.
|
||||
|
||||
Required properties
|
||||
-------------------
|
||||
|
||||
- compatible : name of RTC device following generic names recommended practice.
|
||||
|
||||
For other required properties e.g. to describe register sets,
|
||||
clocks, etc. check the binding documentation of the specific driver.
|
||||
|
||||
Optional properties
|
||||
-------------------
|
||||
|
||||
- start-year : if provided, the default hardware range supported by the RTC is
|
||||
shifted so the first usable year is the specified one.
|
||||
|
||||
The following properties may not be supported by all drivers. However, if a
|
||||
driver wants to support one of the below features, it should adapt the bindings
|
||||
below.
|
||||
- trickle-resistor-ohms : Selected resistor for trickle charger. Should be given
|
||||
if trickle charger should be enabled
|
||||
- trickle-diode-disable : Do not use internal trickle charger diode Should be
|
||||
given if internal trickle charger diode should be
|
||||
disabled
|
||||
- wakeup-source : Enables wake up of host system on alarm
|
||||
|
||||
Trivial RTCs
|
||||
------------
|
||||
|
||||
This is a list of trivial RTC devices that have simple device tree
|
||||
bindings, consisting only of a compatible field, an address and
|
||||
possibly an interrupt line.
|
||||
|
||||
|
||||
Compatible Vendor / Chip
|
||||
========== =============
|
||||
abracon,abb5zes3 AB-RTCMC-32.768kHz-B5ZE-S3: Real Time Clock/Calendar Module with I2C Interface
|
||||
dallas,ds1374 I2C, 32-Bit Binary Counter Watchdog RTC with Trickle Charger and Reset Input/Output
|
||||
dallas,ds1672 Dallas DS1672 Real-time Clock
|
||||
dallas,ds3232 Extremely Accurate I²C RTC with Integrated Crystal and SRAM
|
||||
epson,rx8010 I2C-BUS INTERFACE REAL TIME CLOCK MODULE
|
||||
epson,rx8581 I2C-BUS INTERFACE REAL TIME CLOCK MODULE
|
||||
emmicro,em3027 EM Microelectronic EM3027 Real-time Clock
|
||||
isil,isl1208 Intersil ISL1208 Low Power RTC with Battery Backed SRAM
|
||||
isil,isl1218 Intersil ISL1218 Low Power RTC with Battery Backed SRAM
|
||||
isil,isl12022 Intersil ISL12022 Real-time Clock
|
||||
microcrystal,rv3029 Real Time Clock Module with I2C-Bus
|
||||
nxp,pcf2127 Real-time clock
|
||||
nxp,pcf2129 Real-time clock
|
||||
nxp,pcf8523 Real-time Clock
|
||||
nxp,pcf8563 Real-time clock/calendar
|
||||
nxp,pcf85063 Tiny Real-Time Clock
|
||||
pericom,pt7c4338 Real-time Clock Module
|
||||
ricoh,r2025sd I2C bus SERIAL INTERFACE REAL-TIME CLOCK IC
|
||||
ricoh,r2221tl I2C bus SERIAL INTERFACE REAL-TIME CLOCK IC
|
||||
ricoh,rs5c372a I2C bus SERIAL INTERFACE REAL-TIME CLOCK IC
|
||||
ricoh,rs5c372b I2C bus SERIAL INTERFACE REAL-TIME CLOCK IC
|
||||
ricoh,rv5c386 I2C bus SERIAL INTERFACE REAL-TIME CLOCK IC
|
||||
ricoh,rv5c387a I2C bus SERIAL INTERFACE REAL-TIME CLOCK IC
|
||||
sii,s35390a 2-wire CMOS real-time clock
|
|
@ -1,112 +0,0 @@
|
|||
* ARM architected timer
|
||||
|
||||
ARM cores may have a per-core architected timer, which provides per-cpu timers,
|
||||
or a memory mapped architected timer, which provides up to 8 frames with a
|
||||
physical and optional virtual timer per frame.
|
||||
|
||||
The per-core architected timer is attached to a GIC to deliver its
|
||||
per-processor interrupts via PPIs. The memory mapped timer is attached to a GIC
|
||||
to deliver its interrupts via SPIs.
|
||||
|
||||
** CP15 Timer node properties:
|
||||
|
||||
- compatible : Should at least contain one of
|
||||
"arm,armv7-timer"
|
||||
"arm,armv8-timer"
|
||||
|
||||
- interrupts : Interrupt list for secure, non-secure, virtual and
|
||||
hypervisor timers, in that order.
|
||||
|
||||
- clock-frequency : The frequency of the main counter, in Hz. Should be present
|
||||
only where necessary to work around broken firmware which does not configure
|
||||
CNTFRQ on all CPUs to a uniform correct value. Use of this property is
|
||||
strongly discouraged; fix your firmware unless absolutely impossible.
|
||||
|
||||
- always-on : a boolean property. If present, the timer is powered through an
|
||||
always-on power domain, therefore it never loses context.
|
||||
|
||||
- fsl,erratum-a008585 : A boolean property. Indicates the presence of
|
||||
QorIQ erratum A-008585, which says that reading the counter is
|
||||
unreliable unless the same value is returned by back-to-back reads.
|
||||
This also affects writes to the tval register, due to the implicit
|
||||
counter read.
|
||||
|
||||
- hisilicon,erratum-161010101 : A boolean property. Indicates the
|
||||
presence of Hisilicon erratum 161010101, which says that reading the
|
||||
counters is unreliable in some cases, and reads may return a value 32
|
||||
beyond the correct value. This also affects writes to the tval
|
||||
registers, due to the implicit counter read.
|
||||
|
||||
** Optional properties:
|
||||
|
||||
- arm,cpu-registers-not-fw-configured : Firmware does not initialize
|
||||
any of the generic timer CPU registers, which contain their
|
||||
architecturally-defined reset values. Only supported for 32-bit
|
||||
systems which follow the ARMv7 architected reset values.
|
||||
|
||||
- arm,no-tick-in-suspend : The main counter does not tick when the system is in
|
||||
low-power system suspend on some SoCs. This behavior does not match the
|
||||
Architecture Reference Manual's specification that the system counter "must
|
||||
be implemented in an always-on power domain."
|
||||
|
||||
|
||||
Example:
|
||||
|
||||
timer {
|
||||
compatible = "arm,cortex-a15-timer",
|
||||
"arm,armv7-timer";
|
||||
interrupts = <1 13 0xf08>,
|
||||
<1 14 0xf08>,
|
||||
<1 11 0xf08>,
|
||||
<1 10 0xf08>;
|
||||
clock-frequency = <100000000>;
|
||||
};
|
||||
|
||||
** Memory mapped timer node properties:
|
||||
|
||||
- compatible : Should at least contain "arm,armv7-timer-mem".
|
||||
|
||||
- clock-frequency : The frequency of the main counter, in Hz. Should be present
|
||||
only when firmware has not configured the MMIO CNTFRQ registers.
|
||||
|
||||
- reg : The control frame base address.
|
||||
|
||||
Note that #address-cells, #size-cells, and ranges shall be present to ensure
|
||||
the CPU can address a frame's registers.
|
||||
|
||||
A timer node has up to 8 frame sub-nodes, each with the following properties:
|
||||
|
||||
- frame-number: 0 to 7.
|
||||
|
||||
- interrupts : Interrupt list for physical and virtual timers in that order.
|
||||
The virtual timer interrupt is optional.
|
||||
|
||||
- reg : The first and second view base addresses in that order. The second view
|
||||
base address is optional.
|
||||
|
||||
- status : "disabled" indicates the frame is not available for use. Optional.
|
||||
|
||||
Example:
|
||||
|
||||
timer@f0000000 {
|
||||
compatible = "arm,armv7-timer-mem";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges;
|
||||
reg = <0xf0000000 0x1000>;
|
||||
clock-frequency = <50000000>;
|
||||
|
||||
frame@f0001000 {
|
||||
frame-number = <0>
|
||||
interrupts = <0 13 0x8>,
|
||||
<0 14 0x8>;
|
||||
reg = <0xf0001000 0x1000>,
|
||||
<0xf0002000 0x1000>;
|
||||
};
|
||||
|
||||
frame@f0003000 {
|
||||
frame-number = <1>
|
||||
interrupts = <0 15 0x8>;
|
||||
reg = <0xf0003000 0x1000>;
|
||||
};
|
||||
};
|
|
@ -0,0 +1,103 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/timer/arm,arch_timer.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: ARM architected timer
|
||||
|
||||
maintainers:
|
||||
- Marc Zyngier <marc.zyngier@arm.com>
|
||||
- Mark Rutland <mark.rutland@arm.com>
|
||||
description: |+
|
||||
ARM cores may have a per-core architected timer, which provides per-cpu timers,
|
||||
or a memory mapped architected timer, which provides up to 8 frames with a
|
||||
physical and optional virtual timer per frame.
|
||||
|
||||
The per-core architected timer is attached to a GIC to deliver its
|
||||
per-processor interrupts via PPIs. The memory mapped timer is attached to a GIC
|
||||
to deliver its interrupts via SPIs.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
oneOf:
|
||||
- items:
|
||||
- enum:
|
||||
- arm,cortex-a15-timer
|
||||
- enum:
|
||||
- arm,armv7-timer
|
||||
- items:
|
||||
- enum:
|
||||
- arm,armv7-timer
|
||||
- items:
|
||||
- enum:
|
||||
- arm,armv8-timer
|
||||
|
||||
interrupts:
|
||||
items:
|
||||
- description: secure timer irq
|
||||
- description: non-secure timer irq
|
||||
- description: virtual timer irq
|
||||
- description: hypervisor timer irq
|
||||
|
||||
clock-frequency:
|
||||
description: The frequency of the main counter, in Hz. Should be present
|
||||
only where necessary to work around broken firmware which does not configure
|
||||
CNTFRQ on all CPUs to a uniform correct value. Use of this property is
|
||||
strongly discouraged; fix your firmware unless absolutely impossible.
|
||||
|
||||
always-on:
|
||||
type: boolean
|
||||
description: If present, the timer is powered through an always-on power
|
||||
domain, therefore it never loses context.
|
||||
|
||||
fsl,erratum-a008585:
|
||||
type: boolean
|
||||
description: Indicates the presence of QorIQ erratum A-008585, which says
|
||||
that reading the counter is unreliable unless the same value is returned
|
||||
by back-to-back reads. This also affects writes to the tval register, due
|
||||
to the implicit counter read.
|
||||
|
||||
hisilicon,erratum-161010101:
|
||||
type: boolean
|
||||
description: Indicates the presence of Hisilicon erratum 161010101, which
|
||||
says that reading the counters is unreliable in some cases, and reads may
|
||||
return a value 32 beyond the correct value. This also affects writes to
|
||||
the tval registers, due to the implicit counter read.
|
||||
|
||||
arm,cpu-registers-not-fw-configured:
|
||||
type: boolean
|
||||
description: Firmware does not initialize any of the generic timer CPU
|
||||
registers, which contain their architecturally-defined reset values. Only
|
||||
supported for 32-bit systems which follow the ARMv7 architected reset
|
||||
values.
|
||||
|
||||
arm,no-tick-in-suspend:
|
||||
type: boolean
|
||||
description: The main counter does not tick when the system is in
|
||||
low-power system suspend on some SoCs. This behavior does not match the
|
||||
Architecture Reference Manual's specification that the system counter "must
|
||||
be implemented in an always-on power domain."
|
||||
|
||||
required:
|
||||
- compatible
|
||||
|
||||
oneOf:
|
||||
- required:
|
||||
- interrupts
|
||||
- required:
|
||||
- interrupts-extended
|
||||
|
||||
examples:
|
||||
- |
|
||||
timer {
|
||||
compatible = "arm,cortex-a15-timer",
|
||||
"arm,armv7-timer";
|
||||
interrupts = <1 13 0xf08>,
|
||||
<1 14 0xf08>,
|
||||
<1 11 0xf08>,
|
||||
<1 10 0xf08>;
|
||||
clock-frequency = <100000000>;
|
||||
};
|
||||
|
||||
...
|
|
@ -0,0 +1,120 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/timer/arm,arch_timer_mmio.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: ARM memory mapped architected timer
|
||||
|
||||
maintainers:
|
||||
- Marc Zyngier <marc.zyngier@arm.com>
|
||||
- Mark Rutland <mark.rutland@arm.com>
|
||||
|
||||
description: |+
|
||||
ARM cores may have a memory mapped architected timer, which provides up to 8
|
||||
frames with a physical and optional virtual timer per frame.
|
||||
|
||||
The memory mapped timer is attached to a GIC to deliver its interrupts via SPIs.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
items:
|
||||
- enum:
|
||||
- arm,armv7-timer-mem
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
description: The control frame base address
|
||||
|
||||
'#address-cells':
|
||||
enum: [1, 2]
|
||||
|
||||
'#size-cells':
|
||||
const: 1
|
||||
|
||||
clock-frequency:
|
||||
description: The frequency of the main counter, in Hz. Should be present
|
||||
only where necessary to work around broken firmware which does not configure
|
||||
CNTFRQ on all CPUs to a uniform correct value. Use of this property is
|
||||
strongly discouraged; fix your firmware unless absolutely impossible.
|
||||
|
||||
always-on:
|
||||
type: boolean
|
||||
description: If present, the timer is powered through an always-on power
|
||||
domain, therefore it never loses context.
|
||||
|
||||
arm,cpu-registers-not-fw-configured:
|
||||
type: boolean
|
||||
description: Firmware does not initialize any of the generic timer CPU
|
||||
registers, which contain their architecturally-defined reset values. Only
|
||||
supported for 32-bit systems which follow the ARMv7 architected reset
|
||||
values.
|
||||
|
||||
arm,no-tick-in-suspend:
|
||||
type: boolean
|
||||
description: The main counter does not tick when the system is in
|
||||
low-power system suspend on some SoCs. This behavior does not match the
|
||||
Architecture Reference Manual's specification that the system counter "must
|
||||
be implemented in an always-on power domain."
|
||||
|
||||
patternProperties:
|
||||
'^frame@[0-9a-z]*$':
|
||||
description: A timer node has up to 8 frame sub-nodes, each with the following properties.
|
||||
properties:
|
||||
frame-number:
|
||||
allOf:
|
||||
- $ref: "/schemas/types.yaml#/definitions/uint32"
|
||||
- minimum: 0
|
||||
maximum: 7
|
||||
|
||||
interrupts:
|
||||
minItems: 1
|
||||
maxItems: 2
|
||||
items:
|
||||
- description: physical timer irq
|
||||
- description: virtual timer irq
|
||||
|
||||
reg :
|
||||
minItems: 1
|
||||
maxItems: 2
|
||||
items:
|
||||
- description: 1st view base address
|
||||
- description: 2nd optional view base address
|
||||
|
||||
required:
|
||||
- frame-number
|
||||
- interrupts
|
||||
- reg
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- '#address-cells'
|
||||
- '#size-cells'
|
||||
|
||||
examples:
|
||||
- |
|
||||
timer@f0000000 {
|
||||
compatible = "arm,armv7-timer-mem";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges;
|
||||
reg = <0xf0000000 0x1000>;
|
||||
clock-frequency = <50000000>;
|
||||
|
||||
frame@f0001000 {
|
||||
frame-number = <0>;
|
||||
interrupts = <0 13 0x8>,
|
||||
<0 14 0x8>;
|
||||
reg = <0xf0001000 0x1000>,
|
||||
<0xf0002000 0x1000>;
|
||||
};
|
||||
|
||||
frame@f0003000 {
|
||||
frame-number = <1>;
|
||||
interrupts = <0 15 0x8>;
|
||||
reg = <0xf0003000 0x1000>;
|
||||
};
|
||||
};
|
||||
|
||||
...
|
|
@ -1,27 +0,0 @@
|
|||
|
||||
* ARM Global Timer
|
||||
Cortex-A9 are often associated with a per-core Global timer.
|
||||
|
||||
** Timer node required properties:
|
||||
|
||||
- compatible : should contain
|
||||
* "arm,cortex-a5-global-timer" for Cortex-A5 global timers.
|
||||
* "arm,cortex-a9-global-timer" for Cortex-A9 global
|
||||
timers or any compatible implementation. Note: driver
|
||||
supports versions r2p0 and above.
|
||||
|
||||
- interrupts : One interrupt to each core
|
||||
|
||||
- reg : Specify the base address and the size of the GT timer
|
||||
register window.
|
||||
|
||||
- clocks : Should be phandle to a clock.
|
||||
|
||||
Example:
|
||||
|
||||
timer@2c000600 {
|
||||
compatible = "arm,cortex-a9-global-timer";
|
||||
reg = <0x2c000600 0x20>;
|
||||
interrupts = <1 13 0xf01>;
|
||||
clocks = <&arm_periph_clk>;
|
||||
};
|
|
@ -0,0 +1,46 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/timer/arm,global_timer.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: ARM Global Timer
|
||||
|
||||
maintainers:
|
||||
- Stuart Menefy <stuart.menefy@st.com>
|
||||
|
||||
description:
|
||||
Cortex-A9 are often associated with a per-core Global timer.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
items:
|
||||
- enum:
|
||||
- arm,cortex-a5-global-timer
|
||||
- arm,cortex-a9-global-timer
|
||||
|
||||
description: driver supports versions r2p0 and above.
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- clocks
|
||||
|
||||
examples:
|
||||
- |
|
||||
timer@2c000600 {
|
||||
compatible = "arm,cortex-a9-global-timer";
|
||||
reg = <0x2c000600 0x20>;
|
||||
interrupts = <1 13 0xf01>;
|
||||
clocks = <&arm_periph_clk>;
|
||||
};
|
||||
...
|
|
@ -1,190 +0,0 @@
|
|||
This is a list of trivial i2c devices that have simple device tree
|
||||
bindings, consisting only of a compatible field, an address and
|
||||
possibly an interrupt line.
|
||||
|
||||
If a device needs more specific bindings, such as properties to
|
||||
describe some aspect of it, there needs to be a specific binding
|
||||
document for it just like any other devices.
|
||||
|
||||
|
||||
Compatible Vendor / Chip
|
||||
========== =============
|
||||
abracon,abb5zes3 AB-RTCMC-32.768kHz-B5ZE-S3: Real Time Clock/Calendar Module with I2C Interface
|
||||
ad,ad7414 SMBus/I2C Digital Temperature Sensor in 6-Pin SOT with SMBus Alert and Over Temperature Pin
|
||||
ad,adm9240 ADM9240: Complete System Hardware Monitor for uProcessor-Based Systems
|
||||
adi,adt7461 +/-1C TDM Extended Temp Range I.C
|
||||
adt7461 +/-1C TDM Extended Temp Range I.C
|
||||
adi,adt7473 +/-1C TDM Extended Temp Range I.C
|
||||
adi,adt7475 +/-1C TDM Extended Temp Range I.C
|
||||
adi,adt7476 +/-1C TDM Extended Temp Range I.C
|
||||
adi,adt7490 +/-1C TDM Extended Temp Range I.C
|
||||
adi,adxl345 Three-Axis Digital Accelerometer
|
||||
adi,adxl346 Three-Axis Digital Accelerometer (backward-compatibility value "adi,adxl345" must be listed too)
|
||||
ams,iaq-core AMS iAQ-Core VOC Sensor
|
||||
at,24c08 i2c serial eeprom (24cxx)
|
||||
atmel,at97sc3204t i2c trusted platform module (TPM)
|
||||
capella,cm32181 CM32181: Ambient Light Sensor
|
||||
capella,cm3232 CM3232: Ambient Light Sensor
|
||||
dallas,ds1374 I2C, 32-Bit Binary Counter Watchdog RTC with Trickle Charger and Reset Input/Output
|
||||
dallas,ds1631 High-Precision Digital Thermometer
|
||||
dallas,ds1672 Dallas DS1672 Real-time Clock
|
||||
dallas,ds1682 Total-Elapsed-Time Recorder with Alarm
|
||||
dallas,ds1775 Tiny Digital Thermometer and Thermostat
|
||||
dallas,ds3232 Extremely Accurate I²C RTC with Integrated Crystal and SRAM
|
||||
dallas,ds4510 CPU Supervisor with Nonvolatile Memory and Programmable I/O
|
||||
dallas,ds75 Digital Thermometer and Thermostat
|
||||
devantech,srf02 Devantech SRF02 ultrasonic ranger in I2C mode
|
||||
devantech,srf08 Devantech SRF08 ultrasonic ranger
|
||||
devantech,srf10 Devantech SRF10 ultrasonic ranger
|
||||
dlg,da9053 DA9053: flexible system level PMIC with multicore support
|
||||
dlg,da9063 DA9063: system PMIC for quad-core application processors
|
||||
domintech,dmard09 DMARD09: 3-axis Accelerometer
|
||||
domintech,dmard10 DMARD10: 3-axis Accelerometer
|
||||
epson,rx8010 I2C-BUS INTERFACE REAL TIME CLOCK MODULE
|
||||
epson,rx8581 I2C-BUS INTERFACE REAL TIME CLOCK MODULE
|
||||
emmicro,em3027 EM Microelectronic EM3027 Real-time Clock
|
||||
fsl,mag3110 MAG3110: Xtrinsic High Accuracy, 3D Magnetometer
|
||||
fsl,mma7660 MMA7660FC: 3-Axis Orientation/Motion Detection Sensor
|
||||
fsl,mma8450 MMA8450Q: Xtrinsic Low-power, 3-axis Xtrinsic Accelerometer
|
||||
fsl,mpl3115 MPL3115: Absolute Digital Pressure Sensor
|
||||
fsl,mpr121 MPR121: Proximity Capacitive Touch Sensor Controller
|
||||
fsl,sgtl5000 SGTL5000: Ultra Low-Power Audio Codec
|
||||
gmt,g751 G751: Digital Temperature Sensor and Thermal Watchdog with Two-Wire Interface
|
||||
infineon,slb9635tt Infineon SLB9635 (Soft-) I2C TPM (old protocol, max 100khz)
|
||||
infineon,slb9645tt Infineon SLB9645 I2C TPM (new protocol, max 400khz)
|
||||
infineon,tlv493d-a1b6 Infineon TLV493D-A1B6 I2C 3D Magnetic Sensor
|
||||
isil,isl1208 Intersil ISL1208 Low Power RTC with Battery Backed SRAM
|
||||
isil,isl1218 Intersil ISL1218 Low Power RTC with Battery Backed SRAM
|
||||
isil,isl12022 Intersil ISL12022 Real-time Clock
|
||||
isil,isl29028 Intersil ISL29028 Ambient Light and Proximity Sensor
|
||||
isil,isl29030 Intersil ISL29030 Ambient Light and Proximity Sensor
|
||||
maxim,ds1050 5 Bit Programmable, Pulse-Width Modulator
|
||||
maxim,max1237 Low-Power, 4-/12-Channel, 2-Wire Serial, 12-Bit ADCs
|
||||
maxim,max6621 PECI-to-I2C translator for PECI-to-SMBus/I2C protocol conversion
|
||||
maxim,max6625 9-Bit/12-Bit Temperature Sensors with I²C-Compatible Serial Interface
|
||||
mcube,mc3230 mCube 3-axis 8-bit digital accelerometer
|
||||
memsic,mxc6225 MEMSIC 2-axis 8-bit digital accelerometer
|
||||
microchip,mcp4017-502 Microchip 7-bit Single I2C Digital POT (5k)
|
||||
microchip,mcp4017-103 Microchip 7-bit Single I2C Digital POT (10k)
|
||||
microchip,mcp4017-503 Microchip 7-bit Single I2C Digital POT (50k)
|
||||
microchip,mcp4017-104 Microchip 7-bit Single I2C Digital POT (100k)
|
||||
microchip,mcp4018-502 Microchip 7-bit Single I2C Digital POT (5k)
|
||||
microchip,mcp4018-103 Microchip 7-bit Single I2C Digital POT (10k)
|
||||
microchip,mcp4018-503 Microchip 7-bit Single I2C Digital POT (50k)
|
||||
microchip,mcp4018-104 Microchip 7-bit Single I2C Digital POT (100k)
|
||||
microchip,mcp4019-502 Microchip 7-bit Single I2C Digital POT (5k)
|
||||
microchip,mcp4019-103 Microchip 7-bit Single I2C Digital POT (10k)
|
||||
microchip,mcp4019-503 Microchip 7-bit Single I2C Digital POT (50k)
|
||||
microchip,mcp4019-104 Microchip 7-bit Single I2C Digital POT (100k)
|
||||
microchip,mcp4531-502 Microchip 7-bit Single I2C Digital Potentiometer (5k)
|
||||
microchip,mcp4531-103 Microchip 7-bit Single I2C Digital Potentiometer (10k)
|
||||
microchip,mcp4531-503 Microchip 7-bit Single I2C Digital Potentiometer (50k)
|
||||
microchip,mcp4531-104 Microchip 7-bit Single I2C Digital Potentiometer (100k)
|
||||
microchip,mcp4532-502 Microchip 7-bit Single I2C Digital Potentiometer (5k)
|
||||
microchip,mcp4532-103 Microchip 7-bit Single I2C Digital Potentiometer (10k)
|
||||
microchip,mcp4532-503 Microchip 7-bit Single I2C Digital Potentiometer (50k)
|
||||
microchip,mcp4532-104 Microchip 7-bit Single I2C Digital Potentiometer (100k)
|
||||
microchip,mcp4541-502 Microchip 7-bit Single I2C Digital Potentiometer with NV Memory (5k)
|
||||
microchip,mcp4541-103 Microchip 7-bit Single I2C Digital Potentiometer with NV Memory (10k)
|
||||
microchip,mcp4541-503 Microchip 7-bit Single I2C Digital Potentiometer with NV Memory (50k)
|
||||
microchip,mcp4541-104 Microchip 7-bit Single I2C Digital Potentiometer with NV Memory (100k)
|
||||
microchip,mcp4542-502 Microchip 7-bit Single I2C Digital Potentiometer with NV Memory (5k)
|
||||
microchip,mcp4542-103 Microchip 7-bit Single I2C Digital Potentiometer with NV Memory (10k)
|
||||
microchip,mcp4542-503 Microchip 7-bit Single I2C Digital Potentiometer with NV Memory (50k)
|
||||
microchip,mcp4542-104 Microchip 7-bit Single I2C Digital Potentiometer with NV Memory (100k)
|
||||
microchip,mcp4551-502 Microchip 8-bit Single I2C Digital Potentiometer (5k)
|
||||
microchip,mcp4551-103 Microchip 8-bit Single I2C Digital Potentiometer (10k)
|
||||
microchip,mcp4551-503 Microchip 8-bit Single I2C Digital Potentiometer (50k)
|
||||
microchip,mcp4551-104 Microchip 8-bit Single I2C Digital Potentiometer (100k)
|
||||
microchip,mcp4552-502 Microchip 8-bit Single I2C Digital Potentiometer (5k)
|
||||
microchip,mcp4552-103 Microchip 8-bit Single I2C Digital Potentiometer (10k)
|
||||
microchip,mcp4552-503 Microchip 8-bit Single I2C Digital Potentiometer (50k)
|
||||
microchip,mcp4552-104 Microchip 8-bit Single I2C Digital Potentiometer (100k)
|
||||
microchip,mcp4561-502 Microchip 8-bit Single I2C Digital Potentiometer with NV Memory (5k)
|
||||
microchip,mcp4561-103 Microchip 8-bit Single I2C Digital Potentiometer with NV Memory (10k)
|
||||
microchip,mcp4561-503 Microchip 8-bit Single I2C Digital Potentiometer with NV Memory (50k)
|
||||
microchip,mcp4561-104 Microchip 8-bit Single I2C Digital Potentiometer with NV Memory (100k)
|
||||
microchip,mcp4562-502 Microchip 8-bit Single I2C Digital Potentiometer with NV Memory (5k)
|
||||
microchip,mcp4562-103 Microchip 8-bit Single I2C Digital Potentiometer with NV Memory (10k)
|
||||
microchip,mcp4562-503 Microchip 8-bit Single I2C Digital Potentiometer with NV Memory (50k)
|
||||
microchip,mcp4562-104 Microchip 8-bit Single I2C Digital Potentiometer with NV Memory (100k)
|
||||
microchip,mcp4631-502 Microchip 7-bit Dual I2C Digital Potentiometer (5k)
|
||||
microchip,mcp4631-103 Microchip 7-bit Dual I2C Digital Potentiometer (10k)
|
||||
microchip,mcp4631-503 Microchip 7-bit Dual I2C Digital Potentiometer (50k)
|
||||
microchip,mcp4631-104 Microchip 7-bit Dual I2C Digital Potentiometer (100k)
|
||||
microchip,mcp4632-502 Microchip 7-bit Dual I2C Digital Potentiometer (5k)
|
||||
microchip,mcp4632-103 Microchip 7-bit Dual I2C Digital Potentiometer (10k)
|
||||
microchip,mcp4632-503 Microchip 7-bit Dual I2C Digital Potentiometer (50k)
|
||||
microchip,mcp4632-104 Microchip 7-bit Dual I2C Digital Potentiometer (100k)
|
||||
microchip,mcp4641-502 Microchip 7-bit Dual I2C Digital Potentiometer with NV Memory (5k)
|
||||
microchip,mcp4641-103 Microchip 7-bit Dual I2C Digital Potentiometer with NV Memory (10k)
|
||||
microchip,mcp4641-503 Microchip 7-bit Dual I2C Digital Potentiometer with NV Memory (50k)
|
||||
microchip,mcp4641-104 Microchip 7-bit Dual I2C Digital Potentiometer with NV Memory (100k)
|
||||
microchip,mcp4642-502 Microchip 7-bit Dual I2C Digital Potentiometer with NV Memory (5k)
|
||||
microchip,mcp4642-103 Microchip 7-bit Dual I2C Digital Potentiometer with NV Memory (10k)
|
||||
microchip,mcp4642-503 Microchip 7-bit Dual I2C Digital Potentiometer with NV Memory (50k)
|
||||
microchip,mcp4642-104 Microchip 7-bit Dual I2C Digital Potentiometer with NV Memory (100k)
|
||||
microchip,mcp4651-502 Microchip 8-bit Dual I2C Digital Potentiometer (5k)
|
||||
microchip,mcp4651-103 Microchip 8-bit Dual I2C Digital Potentiometer (10k)
|
||||
microchip,mcp4651-503 Microchip 8-bit Dual I2C Digital Potentiometer (50k)
|
||||
microchip,mcp4651-104 Microchip 8-bit Dual I2C Digital Potentiometer (100k)
|
||||
microchip,mcp4652-502 Microchip 8-bit Dual I2C Digital Potentiometer (5k)
|
||||
microchip,mcp4652-103 Microchip 8-bit Dual I2C Digital Potentiometer (10k)
|
||||
microchip,mcp4652-503 Microchip 8-bit Dual I2C Digital Potentiometer (50k)
|
||||
microchip,mcp4652-104 Microchip 8-bit Dual I2C Digital Potentiometer (100k)
|
||||
microchip,mcp4661-502 Microchip 8-bit Dual I2C Digital Potentiometer with NV Memory (5k)
|
||||
microchip,mcp4661-103 Microchip 8-bit Dual I2C Digital Potentiometer with NV Memory (10k)
|
||||
microchip,mcp4661-503 Microchip 8-bit Dual I2C Digital Potentiometer with NV Memory (50k)
|
||||
microchip,mcp4661-104 Microchip 8-bit Dual I2C Digital Potentiometer with NV Memory (100k)
|
||||
microchip,mcp4662-502 Microchip 8-bit Dual I2C Digital Potentiometer with NV Memory (5k)
|
||||
microchip,mcp4662-103 Microchip 8-bit Dual I2C Digital Potentiometer with NV Memory (10k)
|
||||
microchip,mcp4662-503 Microchip 8-bit Dual I2C Digital Potentiometer with NV Memory (50k)
|
||||
microchip,mcp4662-104 Microchip 8-bit Dual I2C Digital Potentiometer with NV Memory (100k)
|
||||
microchip,tc654 PWM Fan Speed Controller With Fan Fault Detection
|
||||
microchip,tc655 PWM Fan Speed Controller With Fan Fault Detection
|
||||
microcrystal,rv3029 Real Time Clock Module with I2C-Bus
|
||||
miramems,da226 MiraMEMS DA226 2-axis 14-bit digital accelerometer
|
||||
miramems,da280 MiraMEMS DA280 3-axis 14-bit digital accelerometer
|
||||
miramems,da311 MiraMEMS DA311 3-axis 12-bit digital accelerometer
|
||||
national,lm63 Temperature sensor with integrated fan control
|
||||
national,lm75 I2C TEMP SENSOR
|
||||
national,lm80 Serial Interface ACPI-Compatible Microprocessor System Hardware Monitor
|
||||
national,lm85 Temperature sensor with integrated fan control
|
||||
national,lm92 ±0.33°C Accurate, 12-Bit + Sign Temperature Sensor and Thermal Window Comparator with Two-Wire Interface
|
||||
nuvoton,npct501 i2c trusted platform module (TPM)
|
||||
nuvoton,npct601 i2c trusted platform module (TPM2)
|
||||
nuvoton,w83773g Nuvoton Temperature Sensor
|
||||
nxp,pca9556 Octal SMBus and I2C registered interface
|
||||
nxp,pca9557 8-bit I2C-bus and SMBus I/O port with reset
|
||||
nxp,pcf2127 Real-time clock
|
||||
nxp,pcf2129 Real-time clock
|
||||
nxp,pcf8523 Real-time Clock
|
||||
nxp,pcf8563 Real-time clock/calendar
|
||||
nxp,pcf85063 Tiny Real-Time Clock
|
||||
oki,ml86v7667 OKI ML86V7667 video decoder
|
||||
ovti,ov5642 OV5642: Color CMOS QSXGA (5-megapixel) Image Sensor with OmniBSI and Embedded TrueFocus
|
||||
pericom,pt7c4338 Real-time Clock Module
|
||||
plx,pex8648 48-Lane, 12-Port PCI Express Gen 2 (5.0 GT/s) Switch
|
||||
pulsedlight,lidar-lite-v2 Pulsedlight LIDAR range-finding sensor
|
||||
ricoh,r2025sd I2C bus SERIAL INTERFACE REAL-TIME CLOCK IC
|
||||
ricoh,r2221tl I2C bus SERIAL INTERFACE REAL-TIME CLOCK IC
|
||||
ricoh,rs5c372a I2C bus SERIAL INTERFACE REAL-TIME CLOCK IC
|
||||
ricoh,rs5c372b I2C bus SERIAL INTERFACE REAL-TIME CLOCK IC
|
||||
ricoh,rv5c386 I2C bus SERIAL INTERFACE REAL-TIME CLOCK IC
|
||||
ricoh,rv5c387a I2C bus SERIAL INTERFACE REAL-TIME CLOCK IC
|
||||
samsung,24ad0xd1 S524AD0XF1 (128K/256K-bit Serial EEPROM for Low Power)
|
||||
sgx,vz89x SGX Sensortech VZ89X Sensors
|
||||
sii,s35390a 2-wire CMOS real-time clock
|
||||
silabs,si7020 Relative Humidity and Temperature Sensors
|
||||
skyworks,sky81452 Skyworks SKY81452: Six-Channel White LED Driver with Touch Panel Bias Supply
|
||||
st,24c256 i2c serial eeprom (24cxx)
|
||||
taos,tsl2550 Ambient Light Sensor with SMBUS/Two Wire Serial Interface
|
||||
ti,ads7828 8-Channels, 12-bit ADC
|
||||
ti,ads7830 8-Channels, 8-bit ADC
|
||||
ti,amc6821 Temperature Monitoring and Fan Control
|
||||
ti,tsc2003 I2C Touch-Screen Controller
|
||||
ti,tmp102 Low Power Digital Temperature Sensor with SMBUS/Two Wire Serial Interface
|
||||
ti,tmp103 Low Power Digital Temperature Sensor with SMBUS/Two Wire Serial Interface
|
||||
ti,tmp275 Digital Temperature Sensor
|
||||
winbond,w83793 Winbond/Nuvoton H/W Monitor
|
||||
winbond,wpct301 i2c trusted platform module (TPM)
|
|
@ -0,0 +1,342 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/trivial-devices.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Trivial I2C and SPI devices that have simple device tree bindings
|
||||
|
||||
maintainers:
|
||||
- Rob Herring <robh@kernel.org>
|
||||
|
||||
description: |
|
||||
This is a list of trivial I2C and SPI devices that have simple device tree
|
||||
bindings, consisting only of a compatible field, an address and possibly an
|
||||
interrupt line.
|
||||
|
||||
If a device needs more specific bindings, such as properties to
|
||||
describe some aspect of it, there needs to be a specific binding
|
||||
document for it just like any other devices.
|
||||
|
||||
properties:
|
||||
reg:
|
||||
maxItems: 1
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
compatible:
|
||||
items:
|
||||
- enum:
|
||||
# SMBus/I2C Digital Temperature Sensor in 6-Pin SOT with SMBus Alert and Over Temperature Pin
|
||||
- ad,ad7414
|
||||
# ADM9240: Complete System Hardware Monitor for uProcessor-Based Systems
|
||||
- ad,adm9240
|
||||
# +/-1C TDM Extended Temp Range I.C
|
||||
- adi,adt7461
|
||||
# +/-1C TDM Extended Temp Range I.C
|
||||
- adt7461
|
||||
# +/-1C TDM Extended Temp Range I.C
|
||||
- adi,adt7473
|
||||
# +/-1C TDM Extended Temp Range I.C
|
||||
- adi,adt7475
|
||||
# +/-1C TDM Extended Temp Range I.C
|
||||
- adi,adt7476
|
||||
# +/-1C TDM Extended Temp Range I.C
|
||||
- adi,adt7490
|
||||
# Three-Axis Digital Accelerometer
|
||||
- adi,adxl345
|
||||
# Three-Axis Digital Accelerometer (backward-compatibility value "adi,adxl345" must be listed too)
|
||||
- adi,adxl346
|
||||
# AMS iAQ-Core VOC Sensor
|
||||
- ams,iaq-core
|
||||
# i2c serial eeprom (24cxx)
|
||||
- at,24c08
|
||||
# i2c trusted platform module (TPM)
|
||||
- atmel,at97sc3204t
|
||||
# CM32181: Ambient Light Sensor
|
||||
- capella,cm32181
|
||||
# CM3232: Ambient Light Sensor
|
||||
- capella,cm3232
|
||||
# High-Precision Digital Thermometer
|
||||
- dallas,ds1631
|
||||
# Total-Elapsed-Time Recorder with Alarm
|
||||
- dallas,ds1682
|
||||
# Tiny Digital Thermometer and Thermostat
|
||||
- dallas,ds1775
|
||||
# CPU Supervisor with Nonvolatile Memory and Programmable I/O
|
||||
- dallas,ds4510
|
||||
# Digital Thermometer and Thermostat
|
||||
- dallas,ds75
|
||||
# Devantech SRF02 ultrasonic ranger in I2C mode
|
||||
- devantech,srf02
|
||||
# Devantech SRF08 ultrasonic ranger
|
||||
- devantech,srf08
|
||||
# Devantech SRF10 ultrasonic ranger
|
||||
- devantech,srf10
|
||||
# DA9053: flexible system level PMIC with multicore support
|
||||
- dlg,da9053
|
||||
# DA9063: system PMIC for quad-core application processors
|
||||
- dlg,da9063
|
||||
# DMARD09: 3-axis Accelerometer
|
||||
- domintech,dmard09
|
||||
# DMARD10: 3-axis Accelerometer
|
||||
- domintech,dmard10
|
||||
# MMA7660FC: 3-Axis Orientation/Motion Detection Sensor
|
||||
- fsl,mma7660
|
||||
# MMA8450Q: Xtrinsic Low-power, 3-axis Xtrinsic Accelerometer
|
||||
- fsl,mma8450
|
||||
# MPL3115: Absolute Digital Pressure Sensor
|
||||
- fsl,mpl3115
|
||||
# MPR121: Proximity Capacitive Touch Sensor Controller
|
||||
- fsl,mpr121
|
||||
# SGTL5000: Ultra Low-Power Audio Codec
|
||||
- fsl,sgtl5000
|
||||
# G751: Digital Temperature Sensor and Thermal Watchdog with Two-Wire Interface
|
||||
- gmt,g751
|
||||
# Infineon SLB9635 (Soft-) I2C TPM (old protocol, max 100khz)
|
||||
- infineon,slb9635tt
|
||||
# Infineon SLB9645 I2C TPM (new protocol, max 400khz)
|
||||
- infineon,slb9645tt
|
||||
# Infineon TLV493D-A1B6 I2C 3D Magnetic Sensor
|
||||
- infineon,tlv493d-a1b6
|
||||
# Intersil ISL29028 Ambient Light and Proximity Sensor
|
||||
- isil,isl29028
|
||||
# Intersil ISL29030 Ambient Light and Proximity Sensor
|
||||
- isil,isl29030
|
||||
# 5 Bit Programmable, Pulse-Width Modulator
|
||||
- maxim,ds1050
|
||||
# Low-Power, 4-/12-Channel, 2-Wire Serial, 12-Bit ADCs
|
||||
- maxim,max1237
|
||||
# PECI-to-I2C translator for PECI-to-SMBus/I2C protocol conversion
|
||||
- maxim,max6621
|
||||
# 9-Bit/12-Bit Temperature Sensors with I²C-Compatible Serial Interface
|
||||
- maxim,max6625
|
||||
# mCube 3-axis 8-bit digital accelerometer
|
||||
- mcube,mc3230
|
||||
# MEMSIC 2-axis 8-bit digital accelerometer
|
||||
- memsic,mxc6225
|
||||
# Microchip 7-bit Single I2C Digital POT (5k)
|
||||
- microchip,mcp4017-502
|
||||
# Microchip 7-bit Single I2C Digital POT (10k)
|
||||
- microchip,mcp4017-103
|
||||
# Microchip 7-bit Single I2C Digital POT (50k)
|
||||
- microchip,mcp4017-503
|
||||
# Microchip 7-bit Single I2C Digital POT (100k)
|
||||
- microchip,mcp4017-104
|
||||
# Microchip 7-bit Single I2C Digital POT (5k)
|
||||
- microchip,mcp4018-502
|
||||
# Microchip 7-bit Single I2C Digital POT (10k)
|
||||
- microchip,mcp4018-103
|
||||
# Microchip 7-bit Single I2C Digital POT (50k)
|
||||
- microchip,mcp4018-503
|
||||
# Microchip 7-bit Single I2C Digital POT (100k)
|
||||
- microchip,mcp4018-104
|
||||
# Microchip 7-bit Single I2C Digital POT (5k)
|
||||
- microchip,mcp4019-502
|
||||
# Microchip 7-bit Single I2C Digital POT (10k)
|
||||
- microchip,mcp4019-103
|
||||
# Microchip 7-bit Single I2C Digital POT (50k)
|
||||
- microchip,mcp4019-503
|
||||
# Microchip 7-bit Single I2C Digital POT (100k)
|
||||
- microchip,mcp4019-104
|
||||
# Microchip 7-bit Single I2C Digital Potentiometer (5k)
|
||||
- microchip,mcp4531-502
|
||||
# Microchip 7-bit Single I2C Digital Potentiometer (10k)
|
||||
- microchip,mcp4531-103
|
||||
# Microchip 7-bit Single I2C Digital Potentiometer (50k)
|
||||
- microchip,mcp4531-503
|
||||
# Microchip 7-bit Single I2C Digital Potentiometer (100k)
|
||||
- microchip,mcp4531-104
|
||||
# Microchip 7-bit Single I2C Digital Potentiometer (5k)
|
||||
- microchip,mcp4532-502
|
||||
# Microchip 7-bit Single I2C Digital Potentiometer (10k)
|
||||
- microchip,mcp4532-103
|
||||
# Microchip 7-bit Single I2C Digital Potentiometer (50k)
|
||||
- microchip,mcp4532-503
|
||||
# Microchip 7-bit Single I2C Digital Potentiometer (100k)
|
||||
- microchip,mcp4532-104
|
||||
# Microchip 7-bit Single I2C Digital Potentiometer with NV Memory (5k)
|
||||
- microchip,mcp4541-502
|
||||
# Microchip 7-bit Single I2C Digital Potentiometer with NV Memory (10k)
|
||||
- microchip,mcp4541-103
|
||||
# Microchip 7-bit Single I2C Digital Potentiometer with NV Memory (50k)
|
||||
- microchip,mcp4541-503
|
||||
# Microchip 7-bit Single I2C Digital Potentiometer with NV Memory (100k)
|
||||
- microchip,mcp4541-104
|
||||
# Microchip 7-bit Single I2C Digital Potentiometer with NV Memory (5k)
|
||||
- microchip,mcp4542-502
|
||||
# Microchip 7-bit Single I2C Digital Potentiometer with NV Memory (10k)
|
||||
- microchip,mcp4542-103
|
||||
# Microchip 7-bit Single I2C Digital Potentiometer with NV Memory (50k)
|
||||
- microchip,mcp4542-503
|
||||
# Microchip 7-bit Single I2C Digital Potentiometer with NV Memory (100k)
|
||||
- microchip,mcp4542-104
|
||||
# Microchip 8-bit Single I2C Digital Potentiometer (5k)
|
||||
- microchip,mcp4551-502
|
||||
# Microchip 8-bit Single I2C Digital Potentiometer (10k)
|
||||
- microchip,mcp4551-103
|
||||
# Microchip 8-bit Single I2C Digital Potentiometer (50k)
|
||||
- microchip,mcp4551-503
|
||||
# Microchip 8-bit Single I2C Digital Potentiometer (100k)
|
||||
- microchip,mcp4551-104
|
||||
# Microchip 8-bit Single I2C Digital Potentiometer (5k)
|
||||
- microchip,mcp4552-502
|
||||
# Microchip 8-bit Single I2C Digital Potentiometer (10k)
|
||||
- microchip,mcp4552-103
|
||||
# Microchip 8-bit Single I2C Digital Potentiometer (50k)
|
||||
- microchip,mcp4552-503
|
||||
# Microchip 8-bit Single I2C Digital Potentiometer (100k)
|
||||
- microchip,mcp4552-104
|
||||
# Microchip 8-bit Single I2C Digital Potentiometer with NV Memory (5k)
|
||||
- microchip,mcp4561-502
|
||||
# Microchip 8-bit Single I2C Digital Potentiometer with NV Memory (10k)
|
||||
- microchip,mcp4561-103
|
||||
# Microchip 8-bit Single I2C Digital Potentiometer with NV Memory (50k)
|
||||
- microchip,mcp4561-503
|
||||
# Microchip 8-bit Single I2C Digital Potentiometer with NV Memory (100k)
|
||||
- microchip,mcp4561-104
|
||||
# Microchip 8-bit Single I2C Digital Potentiometer with NV Memory (5k)
|
||||
- microchip,mcp4562-502
|
||||
# Microchip 8-bit Single I2C Digital Potentiometer with NV Memory (10k)
|
||||
- microchip,mcp4562-103
|
||||
# Microchip 8-bit Single I2C Digital Potentiometer with NV Memory (50k)
|
||||
- microchip,mcp4562-503
|
||||
# Microchip 8-bit Single I2C Digital Potentiometer with NV Memory (100k)
|
||||
- microchip,mcp4562-104
|
||||
# Microchip 7-bit Dual I2C Digital Potentiometer (5k)
|
||||
- microchip,mcp4631-502
|
||||
# Microchip 7-bit Dual I2C Digital Potentiometer (10k)
|
||||
- microchip,mcp4631-103
|
||||
# Microchip 7-bit Dual I2C Digital Potentiometer (50k)
|
||||
- microchip,mcp4631-503
|
||||
# Microchip 7-bit Dual I2C Digital Potentiometer (100k)
|
||||
- microchip,mcp4631-104
|
||||
# Microchip 7-bit Dual I2C Digital Potentiometer (5k)
|
||||
- microchip,mcp4632-502
|
||||
# Microchip 7-bit Dual I2C Digital Potentiometer (10k)
|
||||
- microchip,mcp4632-103
|
||||
# Microchip 7-bit Dual I2C Digital Potentiometer (50k)
|
||||
- microchip,mcp4632-503
|
||||
# Microchip 7-bit Dual I2C Digital Potentiometer (100k)
|
||||
- microchip,mcp4632-104
|
||||
# Microchip 7-bit Dual I2C Digital Potentiometer with NV Memory (5k)
|
||||
- microchip,mcp4641-502
|
||||
# Microchip 7-bit Dual I2C Digital Potentiometer with NV Memory (10k)
|
||||
- microchip,mcp4641-103
|
||||
# Microchip 7-bit Dual I2C Digital Potentiometer with NV Memory (50k)
|
||||
- microchip,mcp4641-503
|
||||
# Microchip 7-bit Dual I2C Digital Potentiometer with NV Memory (100k)
|
||||
- microchip,mcp4641-104
|
||||
# Microchip 7-bit Dual I2C Digital Potentiometer with NV Memory (5k)
|
||||
- microchip,mcp4642-502
|
||||
# Microchip 7-bit Dual I2C Digital Potentiometer with NV Memory (10k)
|
||||
- microchip,mcp4642-103
|
||||
# Microchip 7-bit Dual I2C Digital Potentiometer with NV Memory (50k)
|
||||
- microchip,mcp4642-503
|
||||
# Microchip 7-bit Dual I2C Digital Potentiometer with NV Memory (100k)
|
||||
- microchip,mcp4642-104
|
||||
# Microchip 8-bit Dual I2C Digital Potentiometer (5k)
|
||||
- microchip,mcp4651-502
|
||||
# Microchip 8-bit Dual I2C Digital Potentiometer (10k)
|
||||
- microchip,mcp4651-103
|
||||
# Microchip 8-bit Dual I2C Digital Potentiometer (50k)
|
||||
- microchip,mcp4651-503
|
||||
# Microchip 8-bit Dual I2C Digital Potentiometer (100k)
|
||||
- microchip,mcp4651-104
|
||||
# Microchip 8-bit Dual I2C Digital Potentiometer (5k)
|
||||
- microchip,mcp4652-502
|
||||
# Microchip 8-bit Dual I2C Digital Potentiometer (10k)
|
||||
- microchip,mcp4652-103
|
||||
# Microchip 8-bit Dual I2C Digital Potentiometer (50k)
|
||||
- microchip,mcp4652-503
|
||||
# Microchip 8-bit Dual I2C Digital Potentiometer (100k)
|
||||
- microchip,mcp4652-104
|
||||
# Microchip 8-bit Dual I2C Digital Potentiometer with NV Memory (5k)
|
||||
- microchip,mcp4661-502
|
||||
# Microchip 8-bit Dual I2C Digital Potentiometer with NV Memory (10k)
|
||||
- microchip,mcp4661-103
|
||||
# Microchip 8-bit Dual I2C Digital Potentiometer with NV Memory (50k)
|
||||
- microchip,mcp4661-503
|
||||
# Microchip 8-bit Dual I2C Digital Potentiometer with NV Memory (100k)
|
||||
- microchip,mcp4661-104
|
||||
# Microchip 8-bit Dual I2C Digital Potentiometer with NV Memory (5k)
|
||||
- microchip,mcp4662-502
|
||||
# Microchip 8-bit Dual I2C Digital Potentiometer with NV Memory (10k)
|
||||
- microchip,mcp4662-103
|
||||
# Microchip 8-bit Dual I2C Digital Potentiometer with NV Memory (50k)
|
||||
- microchip,mcp4662-503
|
||||
# Microchip 8-bit Dual I2C Digital Potentiometer with NV Memory (100k)
|
||||
- microchip,mcp4662-104
|
||||
# PWM Fan Speed Controller With Fan Fault Detection
|
||||
- microchip,tc654
|
||||
# PWM Fan Speed Controller With Fan Fault Detection
|
||||
- microchip,tc655
|
||||
# MiraMEMS DA226 2-axis 14-bit digital accelerometer
|
||||
- miramems,da226
|
||||
# MiraMEMS DA280 3-axis 14-bit digital accelerometer
|
||||
- miramems,da280
|
||||
# MiraMEMS DA311 3-axis 12-bit digital accelerometer
|
||||
- miramems,da311
|
||||
# Temperature sensor with integrated fan control
|
||||
- national,lm63
|
||||
# I2C TEMP SENSOR
|
||||
- national,lm75
|
||||
# Serial Interface ACPI-Compatible Microprocessor System Hardware Monitor
|
||||
- national,lm80
|
||||
# Temperature sensor with integrated fan control
|
||||
- national,lm85
|
||||
# ±0.33°C Accurate, 12-Bit + Sign Temperature Sensor and Thermal Window Comparator with Two-Wire Interface
|
||||
- national,lm92
|
||||
# i2c trusted platform module (TPM)
|
||||
- nuvoton,npct501
|
||||
# i2c trusted platform module (TPM2)
|
||||
- nuvoton,npct601
|
||||
# Nuvoton Temperature Sensor
|
||||
- nuvoton,w83773g
|
||||
# Octal SMBus and I2C registered interface
|
||||
- nxp,pca9556
|
||||
# 8-bit I2C-bus and SMBus I/O port with reset
|
||||
- nxp,pca9557
|
||||
# OKI ML86V7667 video decoder
|
||||
- oki,ml86v7667
|
||||
# OV5642: Color CMOS QSXGA (5-megapixel) Image Sensor with OmniBSI and Embedded TrueFocus
|
||||
- ovti,ov5642
|
||||
# 48-Lane, 12-Port PCI Express Gen 2 (5.0 GT/s) Switch
|
||||
- plx,pex8648
|
||||
# Pulsedlight LIDAR range-finding sensor
|
||||
- pulsedlight,lidar-lite-v2
|
||||
# S524AD0XF1 (128K/256K-bit Serial EEPROM for Low Power)
|
||||
- samsung,24ad0xd1
|
||||
# SGX Sensortech VZ89X Sensors
|
||||
- sgx,vz89x
|
||||
# Relative Humidity and Temperature Sensors
|
||||
- silabs,si7020
|
||||
# Skyworks SKY81452: Six-Channel White LED Driver with Touch Panel Bias Supply
|
||||
- skyworks,sky81452
|
||||
# i2c serial eeprom (24cxx)
|
||||
- st,24c256
|
||||
# Ambient Light Sensor with SMBUS/Two Wire Serial Interface
|
||||
- taos,tsl2550
|
||||
# 8-Channels, 12-bit ADC
|
||||
- ti,ads7828
|
||||
# 8-Channels, 8-bit ADC
|
||||
- ti,ads7830
|
||||
# Temperature Monitoring and Fan Control
|
||||
- ti,amc6821
|
||||
# I2C Touch-Screen Controller
|
||||
- ti,tsc2003
|
||||
# Low Power Digital Temperature Sensor with SMBUS/Two Wire Serial Interface
|
||||
- ti,tmp102
|
||||
# Low Power Digital Temperature Sensor with SMBUS/Two Wire Serial Interface
|
||||
- ti,tmp103
|
||||
# Digital Temperature Sensor
|
||||
- ti,tmp275
|
||||
# Winbond/Nuvoton H/W Monitor
|
||||
- winbond,w83793
|
||||
# i2c trusted platform module (TPM)
|
||||
- winbond,wpct301
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
|
||||
...
|
|
@ -1,10 +0,0 @@
|
|||
Todo list for devicetree:
|
||||
|
||||
=== General structure ===
|
||||
- Switch from custom lists to (h)list_head for nodes and properties structure
|
||||
|
||||
=== CONFIG_OF_DYNAMIC ===
|
||||
- Switch to RCU for tree updates and get rid of global spinlock
|
||||
- Document node lifecycle for CONFIG_OF_DYNAMIC
|
||||
- Always set ->full_name at of_attach_node() time
|
||||
- pseries: Get rid of open-coded tree modification from arch/powerpc/platforms/pseries/dlpar.c
|
|
@ -0,0 +1,130 @@
|
|||
# Writing DeviceTree Bindings in json-schema
|
||||
|
||||
Devicetree bindings are written using json-schema vocabulary. Schema files are
|
||||
written in a JSON compatible subset of YAML. YAML is used instead of JSON as it
|
||||
considered more human readable and has some advantages such as allowing
|
||||
comments (Prefixed with '#').
|
||||
|
||||
## Schema Contents
|
||||
|
||||
Each schema doc is a structured json-schema which is defined by a set of
|
||||
top-level properties. Generally, there is one binding defined per file. The
|
||||
top-level json-schema properties used are:
|
||||
|
||||
- __$id__ - A json-schema unique identifier string. The string must be a valid
|
||||
URI typically containing the binding's filename and path. For DT schema, it must
|
||||
begin with "http://devicetree.org/schemas/". The URL is used in constructing
|
||||
references to other files specified in schema "$ref" properties. A $ref values
|
||||
with a leading '/' will have the hostname prepended. A $ref value a relative
|
||||
path or filename only will be prepended with the hostname and path components
|
||||
of the current schema file's '$id' value. A URL is used even for local files,
|
||||
but there may not actually be files present at those locations.
|
||||
|
||||
- __$schema__ - Indicates the meta-schema the schema file adheres to.
|
||||
|
||||
- __title__ - A one line description on the contents of the binding schema.
|
||||
|
||||
- __maintainers__ - A DT specific property. Contains a list of email address(es)
|
||||
for maintainers of this binding.
|
||||
|
||||
- __description__ - Optional. A multi-line text block containing any detailed
|
||||
information about this binding. It should contain things such as what the block
|
||||
or device does, standards the device conforms to, and links to datasheets for
|
||||
more information.
|
||||
|
||||
- __select__ - Optional. A json-schema used to match nodes for applying the
|
||||
schema. By default without 'select', nodes are matched against their possible
|
||||
compatible string values or node name. Most bindings should not need select.
|
||||
|
||||
- __allOf__ - Optional. A list of other schemas to include. This is used to
|
||||
include other schemas the binding conforms to. This may be schemas for a
|
||||
particular class of devices such as I2C or SPI controllers.
|
||||
|
||||
- __properties__ - A set of sub-schema defining all the DT properties for the
|
||||
binding. The exact schema syntax depends on whether properties are known,
|
||||
common properties (e.g. 'interrupts') or are binding/vendor specific properties.
|
||||
|
||||
A property can also define a child DT node with child properties defined
|
||||
under it.
|
||||
|
||||
For more details on properties sections, see 'Property Schema' section.
|
||||
|
||||
- __patternProperties__ - Optional. Similar to 'properties', but names are regex.
|
||||
|
||||
- __required__ - A list of DT properties from the 'properties' section that
|
||||
must always be present.
|
||||
|
||||
- __examples__ - Optional. A list of one or more DTS hunks implementing the
|
||||
binding. Note: YAML doesn't allow leading tabs, so spaces must be used instead.
|
||||
|
||||
Unless noted otherwise, all properties are required.
|
||||
|
||||
## Property Schema
|
||||
|
||||
The 'properties' section of the schema contains all the DT properties for a
|
||||
binding. Each property contains a set of constraints using json-schema
|
||||
vocabulary for that property. The properties schemas are what is used for
|
||||
validation of DT files.
|
||||
|
||||
For common properties, only additional constraints not covered by the common
|
||||
binding schema need to be defined such as how many values are valid or what
|
||||
possible values are valid.
|
||||
|
||||
Vendor specific properties will typically need more detailed schema. With the
|
||||
exception of boolean properties, they should have a reference to a type in
|
||||
schemas/types.yaml. A "description" property is always required.
|
||||
|
||||
The Devicetree schemas don't exactly match the YAML encoded DT data produced by
|
||||
dtc. They are simplified to make them more compact and avoid a bunch of
|
||||
boilerplate. The tools process the schema files to produce the final schema for
|
||||
validation. There are currently 2 transformations the tools perform.
|
||||
|
||||
The default for arrays in json-schema is they are variable sized and allow more
|
||||
entries than explicitly defined. This can be restricted by defining 'minItems',
|
||||
'maxItems', and 'additionalItems'. However, for DeviceTree Schemas, a fixed
|
||||
size is desired in most cases, so these properties are added based on the
|
||||
number of entries in an 'items' list.
|
||||
|
||||
The YAML Devicetree format also makes all string values an array and scalar
|
||||
values a matrix (in order to define groupings) even when only a single value
|
||||
is present. Single entries in schemas are fixed up to match this encoding.
|
||||
|
||||
## Testing
|
||||
|
||||
### Dependencies
|
||||
|
||||
The DT schema project must be installed in order to validate the DT schema
|
||||
binding documents and validate DTS files using the DT schema. The DT schema
|
||||
project can be installed with pip:
|
||||
|
||||
`pip3 install git+https://github.com/robherring/yaml-bindings.git@master`
|
||||
|
||||
dtc must also be built with YAML output support enabled. This requires that
|
||||
libyaml and its headers be installed on the host system.
|
||||
|
||||
### Running checks
|
||||
|
||||
The DT schema binding documents must be validated using the meta-schema (the
|
||||
schema for the schema) to ensure they are both valid json-schema and valid
|
||||
binding schema. All of the DT binding documents can be validated using the
|
||||
`dt_binding_check` target:
|
||||
|
||||
`make dt_binding_check`
|
||||
|
||||
In order to perform validation of DT source files, use the `dtbs_check` target:
|
||||
|
||||
`make dtbs_check`
|
||||
|
||||
This will first run the `dt_binding_check` which generates the processed schema.
|
||||
|
||||
It is also possible to run checks with a single schema file by setting the
|
||||
'DT_SCHEMA_FILES' variable to a specific schema file.
|
||||
|
||||
`make dtbs_check DT_SCHEMA_FILES=Documentation/devicetree/bindings/trivial-devices.yaml`
|
||||
|
||||
|
||||
## json-schema Resources
|
||||
|
||||
[JSON-Schema Specifications](http://json-schema.org/)
|
||||
|
||||
[Using JSON Schema Book](http://usingjsonschema.com/)
|
|
@ -2353,7 +2353,7 @@ F: drivers/pinctrl/zte/
|
|||
F: drivers/soc/zte/
|
||||
F: drivers/thermal/zx2967_thermal.c
|
||||
F: drivers/watchdog/zx2967_wdt.c
|
||||
F: Documentation/devicetree/bindings/arm/zte.txt
|
||||
F: Documentation/devicetree/bindings/arm/zte.yaml
|
||||
F: Documentation/devicetree/bindings/clock/zx2967*.txt
|
||||
F: Documentation/devicetree/bindings/dma/zxdma.txt
|
||||
F: Documentation/devicetree/bindings/gpio/zx296702-gpio.txt
|
||||
|
|
13
Makefile
13
Makefile
|
@ -1230,10 +1230,13 @@ ifneq ($(dtstree),)
|
|||
%.dtb: prepare3 scripts_dtc
|
||||
$(Q)$(MAKE) $(build)=$(dtstree) $(dtstree)/$@
|
||||
|
||||
PHONY += dtbs dtbs_install
|
||||
dtbs: prepare3 scripts_dtc
|
||||
PHONY += dtbs dtbs_install dt_binding_check
|
||||
dtbs dtbs_check: prepare3 scripts_dtc
|
||||
$(Q)$(MAKE) $(build)=$(dtstree)
|
||||
|
||||
dtbs_check: export CHECK_DTBS=1
|
||||
dtbs_check: dt_binding_check
|
||||
|
||||
dtbs_install:
|
||||
$(Q)$(MAKE) $(dtbinst)=$(dtstree)
|
||||
|
||||
|
@ -1247,6 +1250,9 @@ PHONY += scripts_dtc
|
|||
scripts_dtc: scripts_basic
|
||||
$(Q)$(MAKE) $(build)=scripts/dtc
|
||||
|
||||
dt_binding_check: scripts_dtc
|
||||
$(Q)$(MAKE) $(build)=Documentation/devicetree/bindings
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Modules
|
||||
|
||||
|
@ -1609,7 +1615,8 @@ clean: $(clean-dirs)
|
|||
$(call cmd,rmfiles)
|
||||
@find $(if $(KBUILD_EXTMOD), $(KBUILD_EXTMOD), .) $(RCS_FIND_IGNORE) \
|
||||
\( -name '*.[aios]' -o -name '*.ko' -o -name '.*.cmd' \
|
||||
-o -name '*.ko.*' -o -name '*.dtb' -o -name '*.dtb.S' \
|
||||
-o -name '*.ko.*' \
|
||||
-o -name '*.dtb' -o -name '*.dtb.S' -o -name '*.dt.yaml' \
|
||||
-o -name '*.dwo' -o -name '*.lst' \
|
||||
-o -name '*.su' \
|
||||
-o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
|
||||
|
|
|
@ -78,24 +78,6 @@ void __init early_init_dt_add_memory_arch(u64 base, u64 size)
|
|||
base, TO_MB(size), !in_use ? "Not used":"");
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_INITRD
|
||||
static int __init early_initrd(char *p)
|
||||
{
|
||||
unsigned long start, size;
|
||||
char *endp;
|
||||
|
||||
start = memparse(p, &endp);
|
||||
if (*endp == ',') {
|
||||
size = memparse(endp + 1, NULL);
|
||||
|
||||
initrd_start = (unsigned long)__va(start);
|
||||
initrd_end = (unsigned long)__va(start + size);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
early_param("initrd", early_initrd);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* First memory setup routine called from setup_arch()
|
||||
* 1. setup swapper's mm @init_mm
|
||||
|
@ -140,8 +122,11 @@ void __init setup_arch_memory(void)
|
|||
memblock_reserve(low_mem_start, __pa(_end) - low_mem_start);
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_INITRD
|
||||
if (initrd_start)
|
||||
memblock_reserve(__pa(initrd_start), initrd_end - initrd_start);
|
||||
if (phys_initrd_size) {
|
||||
memblock_reserve(phys_initrd_start, phys_initrd_size);
|
||||
initrd_start = (unsigned long)__va(phys_initrd_start);
|
||||
initrd_end = initrd_start + phys_initrd_size;
|
||||
}
|
||||
#endif
|
||||
|
||||
early_init_fdt_reserve_self();
|
||||
|
|
|
@ -50,26 +50,7 @@ unsigned long __init __clear_cr(unsigned long mask)
|
|||
}
|
||||
#endif
|
||||
|
||||
static phys_addr_t phys_initrd_start __initdata = 0;
|
||||
static unsigned long phys_initrd_size __initdata = 0;
|
||||
|
||||
static int __init early_initrd(char *p)
|
||||
{
|
||||
phys_addr_t start;
|
||||
unsigned long size;
|
||||
char *endp;
|
||||
|
||||
start = memparse(p, &endp);
|
||||
if (*endp == ',') {
|
||||
size = memparse(endp + 1, NULL);
|
||||
|
||||
phys_initrd_start = start;
|
||||
phys_initrd_size = size;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
early_param("initrd", early_initrd);
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_INITRD
|
||||
static int __init parse_tag_initrd(const struct tag *tag)
|
||||
{
|
||||
pr_warn("ATAG_INITRD is deprecated; "
|
||||
|
@ -89,6 +70,7 @@ static int __init parse_tag_initrd2(const struct tag *tag)
|
|||
}
|
||||
|
||||
__tagtable(ATAG_INITRD2, parse_tag_initrd2);
|
||||
#endif
|
||||
|
||||
static void __init find_limits(unsigned long *min, unsigned long *max_low,
|
||||
unsigned long *max_high)
|
||||
|
@ -236,12 +218,6 @@ static void __init arm_initrd_init(void)
|
|||
phys_addr_t start;
|
||||
unsigned long size;
|
||||
|
||||
/* FDT scan will populate initrd_start */
|
||||
if (initrd_start && !phys_initrd_size) {
|
||||
phys_initrd_start = __virt_to_phys(initrd_start);
|
||||
phys_initrd_size = initrd_end - initrd_start;
|
||||
}
|
||||
|
||||
initrd_start = initrd_end = 0;
|
||||
|
||||
if (!phys_initrd_size)
|
||||
|
|
|
@ -171,14 +171,6 @@
|
|||
#define IOREMAP_MAX_ORDER (PMD_SHIFT)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_INITRD
|
||||
#define __early_init_dt_declare_initrd(__start, __end) \
|
||||
do { \
|
||||
initrd_start = (__start); \
|
||||
initrd_end = (__end); \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#include <linux/bitops.h>
|
||||
|
|
|
@ -63,24 +63,6 @@ EXPORT_SYMBOL(memstart_addr);
|
|||
|
||||
phys_addr_t arm64_dma_phys_limit __ro_after_init;
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_INITRD
|
||||
static int __init early_initrd(char *p)
|
||||
{
|
||||
unsigned long start, size;
|
||||
char *endp;
|
||||
|
||||
start = memparse(p, &endp);
|
||||
if (*endp == ',') {
|
||||
size = memparse(endp + 1, NULL);
|
||||
|
||||
initrd_start = start;
|
||||
initrd_end = start + size;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
early_param("initrd", early_initrd);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_KEXEC_CORE
|
||||
/*
|
||||
* reserve_crashkernel() - reserves memory for crash kernel
|
||||
|
@ -417,14 +399,14 @@ void __init arm64_memblock_init(void)
|
|||
memblock_add(__pa_symbol(_text), (u64)(_end - _text));
|
||||
}
|
||||
|
||||
if (IS_ENABLED(CONFIG_BLK_DEV_INITRD) && initrd_start) {
|
||||
if (IS_ENABLED(CONFIG_BLK_DEV_INITRD) && phys_initrd_size) {
|
||||
/*
|
||||
* Add back the memory we just removed if it results in the
|
||||
* initrd to become inaccessible via the linear mapping.
|
||||
* Otherwise, this is a no-op
|
||||
*/
|
||||
u64 base = initrd_start & PAGE_MASK;
|
||||
u64 size = PAGE_ALIGN(initrd_end) - base;
|
||||
u64 base = phys_initrd_start & PAGE_MASK;
|
||||
u64 size = PAGE_ALIGN(phys_initrd_size);
|
||||
|
||||
/*
|
||||
* We can only add back the initrd memory if we don't end up
|
||||
|
@ -468,15 +450,11 @@ void __init arm64_memblock_init(void)
|
|||
* pagetables with memblock.
|
||||
*/
|
||||
memblock_reserve(__pa_symbol(_text), _end - _text);
|
||||
#ifdef CONFIG_BLK_DEV_INITRD
|
||||
if (initrd_start) {
|
||||
memblock_reserve(initrd_start, initrd_end - initrd_start);
|
||||
|
||||
if (IS_ENABLED(CONFIG_BLK_DEV_INITRD) && phys_initrd_size) {
|
||||
/* the generic initrd code expects virtual addresses */
|
||||
initrd_start = __phys_to_virt(initrd_start);
|
||||
initrd_end = __phys_to_virt(initrd_end);
|
||||
initrd_start = __phys_to_virt(phys_initrd_start);
|
||||
initrd_end = initrd_start + phys_initrd_size;
|
||||
}
|
||||
#endif
|
||||
|
||||
early_init_fdt_scan_reserved_mem();
|
||||
|
||||
|
|
|
@ -21,8 +21,6 @@
|
|||
DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
|
||||
DEFINE_SPINLOCK(anon_alias_lock);
|
||||
extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
|
||||
extern unsigned long phys_initrd_start;
|
||||
extern unsigned long phys_initrd_size;
|
||||
|
||||
/*
|
||||
* empty_zero_page is a special page that is used for
|
||||
|
|
|
@ -270,6 +270,8 @@ int dlpar_detach_node(struct device_node *dn)
|
|||
if (rc)
|
||||
return rc;
|
||||
|
||||
of_node_put(dn);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -30,25 +30,6 @@
|
|||
|
||||
#include "mm.h"
|
||||
|
||||
static unsigned long phys_initrd_start __initdata = 0x01000000;
|
||||
static unsigned long phys_initrd_size __initdata = SZ_8M;
|
||||
|
||||
static int __init early_initrd(char *p)
|
||||
{
|
||||
unsigned long start, size;
|
||||
char *endp;
|
||||
|
||||
start = memparse(p, &endp);
|
||||
if (*endp == ',') {
|
||||
size = memparse(endp + 1, NULL);
|
||||
|
||||
phys_initrd_start = start;
|
||||
phys_initrd_size = size;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
early_param("initrd", early_initrd);
|
||||
|
||||
/*
|
||||
* This keeps memory configuration data used by a couple memory
|
||||
* initialization functions, as well as show_mem() for the skipping
|
||||
|
@ -156,6 +137,11 @@ void __init uc32_memblock_init(struct meminfo *mi)
|
|||
memblock_reserve(__pa(_text), _end - _text);
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_INITRD
|
||||
if (!phys_initrd_size) {
|
||||
phys_initrd_start = 0x01000000;
|
||||
phys_initrd_size = SZ_8M;
|
||||
}
|
||||
|
||||
if (phys_initrd_size) {
|
||||
memblock_reserve(phys_initrd_start, phys_initrd_size);
|
||||
|
||||
|
|
|
@ -1199,8 +1199,8 @@ static void __init gic_populate_ppi_partitions(struct device_node *gic_node)
|
|||
|
||||
part->partition_id = of_node_to_fwnode(child_part);
|
||||
|
||||
pr_info("GIC: PPI partition %s[%d] { ",
|
||||
child_part->name, part_idx);
|
||||
pr_info("GIC: PPI partition %pOFn[%d] { ",
|
||||
child_part, part_idx);
|
||||
|
||||
n = of_property_count_elems_of_size(child_part, "affinity",
|
||||
sizeof(u32));
|
||||
|
|
|
@ -64,14 +64,14 @@ static int __init orion_irq_init(struct device_node *np,
|
|||
num_chips * ORION_IRQS_PER_CHIP,
|
||||
&irq_generic_chip_ops, NULL);
|
||||
if (!orion_irq_domain)
|
||||
panic("%s: unable to add irq domain\n", np->name);
|
||||
panic("%pOFn: unable to add irq domain\n", np);
|
||||
|
||||
ret = irq_alloc_domain_generic_chips(orion_irq_domain,
|
||||
ORION_IRQS_PER_CHIP, 1, np->name,
|
||||
ORION_IRQS_PER_CHIP, 1, np->full_name,
|
||||
handle_level_irq, clr, 0,
|
||||
IRQ_GC_INIT_MASK_CACHE);
|
||||
if (ret)
|
||||
panic("%s: unable to alloc irq domain gc\n", np->name);
|
||||
panic("%pOFn: unable to alloc irq domain gc\n", np);
|
||||
|
||||
for (n = 0, base = 0; n < num_chips; n++, base += ORION_IRQS_PER_CHIP) {
|
||||
struct irq_chip_generic *gc =
|
||||
|
@ -80,12 +80,12 @@ static int __init orion_irq_init(struct device_node *np,
|
|||
of_address_to_resource(np, n, &r);
|
||||
|
||||
if (!request_mem_region(r.start, resource_size(&r), np->name))
|
||||
panic("%s: unable to request mem region %d",
|
||||
np->name, n);
|
||||
panic("%pOFn: unable to request mem region %d",
|
||||
np, n);
|
||||
|
||||
gc->reg_base = ioremap(r.start, resource_size(&r));
|
||||
if (!gc->reg_base)
|
||||
panic("%s: unable to map resource %d", np->name, n);
|
||||
panic("%pOFn: unable to map resource %d", np, n);
|
||||
|
||||
gc->chip_types[0].regs.mask = ORION_IRQ_MASK;
|
||||
gc->chip_types[0].chip.irq_mask = irq_gc_mask_clr_bit;
|
||||
|
@ -150,20 +150,20 @@ static int __init orion_bridge_irq_init(struct device_node *np,
|
|||
domain = irq_domain_add_linear(np, nrirqs,
|
||||
&irq_generic_chip_ops, NULL);
|
||||
if (!domain) {
|
||||
pr_err("%s: unable to add irq domain\n", np->name);
|
||||
pr_err("%pOFn: unable to add irq domain\n", np);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
ret = irq_alloc_domain_generic_chips(domain, nrirqs, 1, np->name,
|
||||
handle_edge_irq, clr, 0, IRQ_GC_INIT_MASK_CACHE);
|
||||
if (ret) {
|
||||
pr_err("%s: unable to alloc irq domain gc\n", np->name);
|
||||
pr_err("%pOFn: unable to alloc irq domain gc\n", np);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = of_address_to_resource(np, 0, &r);
|
||||
if (ret) {
|
||||
pr_err("%s: unable to get resource\n", np->name);
|
||||
pr_err("%pOFn: unable to get resource\n", np);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -175,14 +175,14 @@ static int __init orion_bridge_irq_init(struct device_node *np,
|
|||
/* Map the parent interrupt for the chained handler */
|
||||
irq = irq_of_parse_and_map(np, 0);
|
||||
if (irq <= 0) {
|
||||
pr_err("%s: unable to parse irq\n", np->name);
|
||||
pr_err("%pOFn: unable to parse irq\n", np);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
gc = irq_get_domain_generic_chip(domain, 0);
|
||||
gc->reg_base = ioremap(r.start, resource_size(&r));
|
||||
if (!gc->reg_base) {
|
||||
pr_err("%s: unable to map resource\n", np->name);
|
||||
pr_err("%pOFn: unable to map resource\n", np);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
|
|
@ -115,21 +115,21 @@ static int __init of_tb10x_init_irq(struct device_node *ictl,
|
|||
void __iomem *reg_base;
|
||||
|
||||
if (of_address_to_resource(ictl, 0, &mem)) {
|
||||
pr_err("%s: No registers declared in DeviceTree.\n",
|
||||
ictl->name);
|
||||
pr_err("%pOFn: No registers declared in DeviceTree.\n",
|
||||
ictl);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!request_mem_region(mem.start, resource_size(&mem),
|
||||
ictl->name)) {
|
||||
pr_err("%s: Request mem region failed.\n", ictl->name);
|
||||
ictl->full_name)) {
|
||||
pr_err("%pOFn: Request mem region failed.\n", ictl);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
reg_base = ioremap(mem.start, resource_size(&mem));
|
||||
if (!reg_base) {
|
||||
ret = -EBUSY;
|
||||
pr_err("%s: ioremap failed.\n", ictl->name);
|
||||
pr_err("%pOFn: ioremap failed.\n", ictl);
|
||||
goto ioremap_fail;
|
||||
}
|
||||
|
||||
|
@ -137,8 +137,8 @@ static int __init of_tb10x_init_irq(struct device_node *ictl,
|
|||
&irq_generic_chip_ops, NULL);
|
||||
if (!domain) {
|
||||
ret = -ENOMEM;
|
||||
pr_err("%s: Could not register interrupt domain.\n",
|
||||
ictl->name);
|
||||
pr_err("%pOFn: Could not register interrupt domain.\n",
|
||||
ictl);
|
||||
goto irq_domain_add_fail;
|
||||
}
|
||||
|
||||
|
@ -147,8 +147,8 @@ static int __init of_tb10x_init_irq(struct device_node *ictl,
|
|||
IRQ_NOREQUEST, IRQ_NOPROBE,
|
||||
IRQ_GC_INIT_MASK_CACHE);
|
||||
if (ret) {
|
||||
pr_err("%s: Could not allocate generic interrupt chip.\n",
|
||||
ictl->name);
|
||||
pr_err("%pOFn: Could not allocate generic interrupt chip.\n",
|
||||
ictl);
|
||||
goto gc_alloc_fail;
|
||||
}
|
||||
|
||||
|
|
|
@ -2146,8 +2146,8 @@ static int gpmc_probe_generic_child(struct platform_device *pdev,
|
|||
gpmc_s.device_width = GPMC_DEVWIDTH_16BIT;
|
||||
break;
|
||||
default:
|
||||
dev_err(&pdev->dev, "%s: invalid 'nand-bus-width'\n",
|
||||
child->name);
|
||||
dev_err(&pdev->dev, "%pOFn: invalid 'nand-bus-width'\n",
|
||||
child);
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
@ -2188,8 +2188,8 @@ static int gpmc_probe_generic_child(struct platform_device *pdev,
|
|||
|
||||
ret = gpmc_cs_set_timings(cs, &gpmc_t, &gpmc_s);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to set gpmc timings for: %s\n",
|
||||
child->name);
|
||||
dev_err(&pdev->dev, "failed to set gpmc timings for: %pOFn\n",
|
||||
child);
|
||||
goto err_cs;
|
||||
}
|
||||
|
||||
|
@ -2217,7 +2217,7 @@ static int gpmc_probe_generic_child(struct platform_device *pdev,
|
|||
|
||||
err_child_fail:
|
||||
|
||||
dev_err(&pdev->dev, "failed to create gpmc child %s\n", child->name);
|
||||
dev_err(&pdev->dev, "failed to create gpmc child %pOFn\n", child);
|
||||
ret = -ENODEV;
|
||||
|
||||
err_cs:
|
||||
|
@ -2267,14 +2267,10 @@ static void gpmc_probe_dt_children(struct platform_device *pdev)
|
|||
struct device_node *child;
|
||||
|
||||
for_each_available_child_of_node(pdev->dev.of_node, child) {
|
||||
|
||||
if (!child->name)
|
||||
continue;
|
||||
|
||||
ret = gpmc_probe_generic_child(pdev, child);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to probe DT child '%s': %d\n",
|
||||
child->name, ret);
|
||||
dev_err(&pdev->dev, "failed to probe DT child '%pOFn': %d\n",
|
||||
child, ret);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -139,8 +139,8 @@ static int exynos_srom_probe(struct platform_device *pdev)
|
|||
for_each_child_of_node(np, child) {
|
||||
if (exynos_srom_configure_bank(srom, child)) {
|
||||
dev_err(dev,
|
||||
"Could not decode bank configuration for %s\n",
|
||||
child->name);
|
||||
"Could not decode bank configuration for %pOFn\n",
|
||||
child);
|
||||
bad_bank_config = true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -345,7 +345,7 @@ static int load_one_timing(struct tegra_mc *mc,
|
|||
err = of_property_read_u32(node, "clock-frequency", &tmp);
|
||||
if (err) {
|
||||
dev_err(mc->dev,
|
||||
"timing %s: failed to read rate\n", node->name);
|
||||
"timing %pOFn: failed to read rate\n", node);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -360,8 +360,8 @@ static int load_one_timing(struct tegra_mc *mc,
|
|||
mc->soc->num_emem_regs);
|
||||
if (err) {
|
||||
dev_err(mc->dev,
|
||||
"timing %s: failed to read EMEM configuration\n",
|
||||
node->name);
|
||||
"timing %pOFn: failed to read EMEM configuration\n",
|
||||
node);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
@ -888,8 +888,8 @@ static int load_one_timing_from_dt(struct tegra_emc *emc,
|
|||
|
||||
err = of_property_read_u32(node, "clock-frequency", &value);
|
||||
if (err) {
|
||||
dev_err(emc->dev, "timing %s: failed to read rate: %d\n",
|
||||
node->name, err);
|
||||
dev_err(emc->dev, "timing %pOFn: failed to read rate: %d\n",
|
||||
node, err);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -900,16 +900,16 @@ static int load_one_timing_from_dt(struct tegra_emc *emc,
|
|||
ARRAY_SIZE(timing->emc_burst_data));
|
||||
if (err) {
|
||||
dev_err(emc->dev,
|
||||
"timing %s: failed to read emc burst data: %d\n",
|
||||
node->name, err);
|
||||
"timing %pOFn: failed to read emc burst data: %d\n",
|
||||
node, err);
|
||||
return err;
|
||||
}
|
||||
|
||||
#define EMC_READ_PROP(prop, dtprop) { \
|
||||
err = of_property_read_u32(node, dtprop, &timing->prop); \
|
||||
if (err) { \
|
||||
dev_err(emc->dev, "timing %s: failed to read " #prop ": %d\n", \
|
||||
node->name, err); \
|
||||
dev_err(emc->dev, "timing %pOFn: failed to read " #prop ": %d\n", \
|
||||
node, err); \
|
||||
return err; \
|
||||
} \
|
||||
}
|
||||
|
|
|
@ -212,7 +212,7 @@ static int powernv_flash_set_driver_info(struct device *dev,
|
|||
* Going to have to check what details I need to set and how to
|
||||
* get them
|
||||
*/
|
||||
mtd->name = of_get_property(dev->of_node, "name", NULL);
|
||||
mtd->name = devm_kasprintf(dev, GFP_KERNEL, "%pOFn", dev->of_node);
|
||||
mtd->type = MTD_NORFLASH;
|
||||
mtd->flags = MTD_WRITEABLE;
|
||||
mtd->size = size;
|
||||
|
|
|
@ -110,8 +110,8 @@ static int of_bus_pci_match(struct device_node *np)
|
|||
* "vci" is for the /chaos bridge on 1st-gen PCI powermacs
|
||||
* "ht" is hypertransport
|
||||
*/
|
||||
return !strcmp(np->type, "pci") || !strcmp(np->type, "pciex") ||
|
||||
!strcmp(np->type, "vci") || !strcmp(np->type, "ht");
|
||||
return of_node_is_type(np, "pci") || of_node_is_type(np, "pciex") ||
|
||||
of_node_is_type(np, "vci") || of_node_is_type(np, "ht");
|
||||
}
|
||||
|
||||
static void of_bus_pci_count_cells(struct device_node *np,
|
||||
|
@ -371,7 +371,7 @@ EXPORT_SYMBOL(of_pci_range_to_resource);
|
|||
|
||||
static int of_bus_isa_match(struct device_node *np)
|
||||
{
|
||||
return !strcmp(np->name, "isa");
|
||||
return of_node_name_eq(np, "isa");
|
||||
}
|
||||
|
||||
static void of_bus_isa_count_cells(struct device_node *child,
|
||||
|
|
|
@ -79,6 +79,13 @@ bool of_node_name_prefix(const struct device_node *np, const char *prefix)
|
|||
}
|
||||
EXPORT_SYMBOL(of_node_name_prefix);
|
||||
|
||||
static bool __of_node_is_type(const struct device_node *np, const char *type)
|
||||
{
|
||||
const char *match = __of_get_property(np, "device_type", NULL);
|
||||
|
||||
return np && match && type && !strcmp(match, type);
|
||||
}
|
||||
|
||||
int of_n_addr_cells(struct device_node *np)
|
||||
{
|
||||
u32 cells;
|
||||
|
@ -116,9 +123,6 @@ int __weak of_node_to_nid(struct device_node *np)
|
|||
}
|
||||
#endif
|
||||
|
||||
static struct device_node **phandle_cache;
|
||||
static u32 phandle_cache_mask;
|
||||
|
||||
/*
|
||||
* Assumptions behind phandle_cache implementation:
|
||||
* - phandle property values are in a contiguous range of 1..n
|
||||
|
@ -127,6 +131,66 @@ static u32 phandle_cache_mask;
|
|||
* - the phandle lookup overhead reduction provided by the cache
|
||||
* will likely be less
|
||||
*/
|
||||
|
||||
static struct device_node **phandle_cache;
|
||||
static u32 phandle_cache_mask;
|
||||
|
||||
/*
|
||||
* Caller must hold devtree_lock.
|
||||
*/
|
||||
static void __of_free_phandle_cache(void)
|
||||
{
|
||||
u32 cache_entries = phandle_cache_mask + 1;
|
||||
u32 k;
|
||||
|
||||
if (!phandle_cache)
|
||||
return;
|
||||
|
||||
for (k = 0; k < cache_entries; k++)
|
||||
of_node_put(phandle_cache[k]);
|
||||
|
||||
kfree(phandle_cache);
|
||||
phandle_cache = NULL;
|
||||
}
|
||||
|
||||
int of_free_phandle_cache(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
raw_spin_lock_irqsave(&devtree_lock, flags);
|
||||
|
||||
__of_free_phandle_cache();
|
||||
|
||||
raw_spin_unlock_irqrestore(&devtree_lock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#if !defined(CONFIG_MODULES)
|
||||
late_initcall_sync(of_free_phandle_cache);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Caller must hold devtree_lock.
|
||||
*/
|
||||
void __of_free_phandle_cache_entry(phandle handle)
|
||||
{
|
||||
phandle masked_handle;
|
||||
struct device_node *np;
|
||||
|
||||
if (!handle)
|
||||
return;
|
||||
|
||||
masked_handle = handle & phandle_cache_mask;
|
||||
|
||||
if (phandle_cache) {
|
||||
np = phandle_cache[masked_handle];
|
||||
if (np && handle == np->phandle) {
|
||||
of_node_put(np);
|
||||
phandle_cache[masked_handle] = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void of_populate_phandle_cache(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
@ -136,8 +200,7 @@ void of_populate_phandle_cache(void)
|
|||
|
||||
raw_spin_lock_irqsave(&devtree_lock, flags);
|
||||
|
||||
kfree(phandle_cache);
|
||||
phandle_cache = NULL;
|
||||
__of_free_phandle_cache();
|
||||
|
||||
for_each_of_allnodes(np)
|
||||
if (np->phandle && np->phandle != OF_PHANDLE_ILLEGAL)
|
||||
|
@ -155,30 +218,15 @@ void of_populate_phandle_cache(void)
|
|||
goto out;
|
||||
|
||||
for_each_of_allnodes(np)
|
||||
if (np->phandle && np->phandle != OF_PHANDLE_ILLEGAL)
|
||||
if (np->phandle && np->phandle != OF_PHANDLE_ILLEGAL) {
|
||||
of_node_get(np);
|
||||
phandle_cache[np->phandle & phandle_cache_mask] = np;
|
||||
}
|
||||
|
||||
out:
|
||||
raw_spin_unlock_irqrestore(&devtree_lock, flags);
|
||||
}
|
||||
|
||||
int of_free_phandle_cache(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
raw_spin_lock_irqsave(&devtree_lock, flags);
|
||||
|
||||
kfree(phandle_cache);
|
||||
phandle_cache = NULL;
|
||||
|
||||
raw_spin_unlock_irqrestore(&devtree_lock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#if !defined(CONFIG_MODULES)
|
||||
late_initcall_sync(of_free_phandle_cache);
|
||||
#endif
|
||||
|
||||
void __init of_core_init(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
|
@ -482,14 +530,14 @@ static int __of_device_is_compatible(const struct device_node *device,
|
|||
|
||||
/* Matching type is better than matching name */
|
||||
if (type && type[0]) {
|
||||
if (!device->type || of_node_cmp(type, device->type))
|
||||
if (!__of_node_is_type(device, type))
|
||||
return 0;
|
||||
score += 2;
|
||||
}
|
||||
|
||||
/* Matching name is a bit better than not */
|
||||
if (name && name[0]) {
|
||||
if (!device->name || of_node_cmp(name, device->name))
|
||||
if (!of_node_name_eq(device, name))
|
||||
return 0;
|
||||
score++;
|
||||
}
|
||||
|
@ -775,7 +823,7 @@ struct device_node *of_get_next_cpu_node(struct device_node *prev)
|
|||
}
|
||||
for (; next; next = next->sibling) {
|
||||
if (!(of_node_name_eq(next, "cpu") ||
|
||||
(next->type && !of_node_cmp(next->type, "cpu"))))
|
||||
__of_node_is_type(next, "cpu")))
|
||||
continue;
|
||||
if (of_node_get(next))
|
||||
break;
|
||||
|
@ -828,7 +876,7 @@ struct device_node *of_get_child_by_name(const struct device_node *node,
|
|||
struct device_node *child;
|
||||
|
||||
for_each_child_of_node(node, child)
|
||||
if (child->name && (of_node_cmp(child->name, name) == 0))
|
||||
if (of_node_name_eq(child, name))
|
||||
break;
|
||||
return child;
|
||||
}
|
||||
|
@ -954,8 +1002,7 @@ struct device_node *of_find_node_by_name(struct device_node *from,
|
|||
|
||||
raw_spin_lock_irqsave(&devtree_lock, flags);
|
||||
for_each_of_allnodes_from(from, np)
|
||||
if (np->name && (of_node_cmp(np->name, name) == 0)
|
||||
&& of_node_get(np))
|
||||
if (of_node_name_eq(np, name) && of_node_get(np))
|
||||
break;
|
||||
of_node_put(from);
|
||||
raw_spin_unlock_irqrestore(&devtree_lock, flags);
|
||||
|
@ -983,8 +1030,7 @@ struct device_node *of_find_node_by_type(struct device_node *from,
|
|||
|
||||
raw_spin_lock_irqsave(&devtree_lock, flags);
|
||||
for_each_of_allnodes_from(from, np)
|
||||
if (np->type && (of_node_cmp(np->type, type) == 0)
|
||||
&& of_node_get(np))
|
||||
if (__of_node_is_type(np, type) && of_node_get(np))
|
||||
break;
|
||||
of_node_put(from);
|
||||
raw_spin_unlock_irqrestore(&devtree_lock, flags);
|
||||
|
@ -1190,13 +1236,23 @@ struct device_node *of_find_node_by_phandle(phandle handle)
|
|||
if (phandle_cache[masked_handle] &&
|
||||
handle == phandle_cache[masked_handle]->phandle)
|
||||
np = phandle_cache[masked_handle];
|
||||
if (np && of_node_check_flag(np, OF_DETACHED)) {
|
||||
WARN_ON(1); /* did not uncache np on node removal */
|
||||
of_node_put(np);
|
||||
phandle_cache[masked_handle] = NULL;
|
||||
np = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (!np) {
|
||||
for_each_of_allnodes(np)
|
||||
if (np->phandle == handle) {
|
||||
if (phandle_cache)
|
||||
if (np->phandle == handle &&
|
||||
!of_node_check_flag(np, OF_DETACHED)) {
|
||||
if (phandle_cache) {
|
||||
/* will put when removed from cache */
|
||||
of_node_get(np);
|
||||
phandle_cache[masked_handle] = np;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -2108,9 +2164,9 @@ struct device_node *of_find_next_cache_node(const struct device_node *np)
|
|||
/* OF on pmac has nodes instead of properties named "l2-cache"
|
||||
* beneath CPU nodes.
|
||||
*/
|
||||
if (IS_ENABLED(CONFIG_PPC_PMAC) && !strcmp(np->type, "cpu"))
|
||||
if (IS_ENABLED(CONFIG_PPC_PMAC) && of_node_is_type(np, "cpu"))
|
||||
for_each_child_of_node(np, child)
|
||||
if (!strcmp(child->type, "cache"))
|
||||
if (of_node_is_type(child, "cache"))
|
||||
return child;
|
||||
|
||||
return NULL;
|
||||
|
|
|
@ -211,7 +211,7 @@ static ssize_t of_device_get_modalias(struct device *dev, char *str, ssize_t len
|
|||
/* Name & Type */
|
||||
/* %p eats all alphanum characters, so %c must be used here */
|
||||
csize = snprintf(str, len, "of:N%pOFn%c%s", dev->of_node, 'T',
|
||||
dev->of_node->type);
|
||||
of_node_get_device_type(dev->of_node));
|
||||
tsize = csize;
|
||||
len -= csize;
|
||||
if (str)
|
||||
|
@ -281,7 +281,7 @@ EXPORT_SYMBOL_GPL(of_device_modalias);
|
|||
*/
|
||||
void of_device_uevent(struct device *dev, struct kobj_uevent_env *env)
|
||||
{
|
||||
const char *compat;
|
||||
const char *compat, *type;
|
||||
struct alias_prop *app;
|
||||
struct property *p;
|
||||
int seen = 0;
|
||||
|
@ -291,8 +291,9 @@ void of_device_uevent(struct device *dev, struct kobj_uevent_env *env)
|
|||
|
||||
add_uevent_var(env, "OF_NAME=%pOFn", dev->of_node);
|
||||
add_uevent_var(env, "OF_FULLNAME=%pOF", dev->of_node);
|
||||
if (dev->of_node->type && strcmp("<NULL>", dev->of_node->type) != 0)
|
||||
add_uevent_var(env, "OF_TYPE=%s", dev->of_node->type);
|
||||
type = of_node_get_device_type(dev->of_node);
|
||||
if (type)
|
||||
add_uevent_var(env, "OF_TYPE=%s", type);
|
||||
|
||||
/* Since the compatible field can contain pretty much anything
|
||||
* it's not really legal to split it out with commas. We split it
|
||||
|
|
|
@ -205,15 +205,24 @@ static void __of_attach_node(struct device_node *np)
|
|||
const __be32 *phandle;
|
||||
int sz;
|
||||
|
||||
np->name = __of_get_property(np, "name", NULL) ? : "<NULL>";
|
||||
np->type = __of_get_property(np, "device_type", NULL) ? : "<NULL>";
|
||||
if (!of_node_check_flag(np, OF_OVERLAY)) {
|
||||
np->name = __of_get_property(np, "name", NULL);
|
||||
np->type = __of_get_property(np, "device_type", NULL);
|
||||
if (!np->name)
|
||||
np->name = "<NULL>";
|
||||
if (!np->type)
|
||||
np->type = "<NULL>";
|
||||
|
||||
phandle = __of_get_property(np, "phandle", &sz);
|
||||
if (!phandle)
|
||||
phandle = __of_get_property(np, "linux,phandle", &sz);
|
||||
if (IS_ENABLED(CONFIG_PPC_PSERIES) && !phandle)
|
||||
phandle = __of_get_property(np, "ibm,phandle", &sz);
|
||||
np->phandle = (phandle && (sz >= 4)) ? be32_to_cpup(phandle) : 0;
|
||||
phandle = __of_get_property(np, "phandle", &sz);
|
||||
if (!phandle)
|
||||
phandle = __of_get_property(np, "linux,phandle", &sz);
|
||||
if (IS_ENABLED(CONFIG_PPC_PSERIES) && !phandle)
|
||||
phandle = __of_get_property(np, "ibm,phandle", &sz);
|
||||
if (phandle && (sz >= 4))
|
||||
np->phandle = be32_to_cpup(phandle);
|
||||
else
|
||||
np->phandle = 0;
|
||||
}
|
||||
|
||||
np->child = NULL;
|
||||
np->sibling = np->parent->child;
|
||||
|
@ -268,13 +277,13 @@ void __of_detach_node(struct device_node *np)
|
|||
}
|
||||
|
||||
of_node_set_flag(np, OF_DETACHED);
|
||||
|
||||
/* race with of_find_node_by_phandle() prevented by devtree_lock */
|
||||
__of_free_phandle_cache_entry(np->phandle);
|
||||
}
|
||||
|
||||
/**
|
||||
* of_detach_node() - "Unplug" a node from the device tree.
|
||||
*
|
||||
* The caller must hold a reference to the node. The memory associated with
|
||||
* the node is not freed until its refcount goes to zero.
|
||||
*/
|
||||
int of_detach_node(struct device_node *np)
|
||||
{
|
||||
|
@ -330,6 +339,25 @@ void of_node_release(struct kobject *kobj)
|
|||
if (!of_node_check_flag(node, OF_DYNAMIC))
|
||||
return;
|
||||
|
||||
if (of_node_check_flag(node, OF_OVERLAY)) {
|
||||
|
||||
if (!of_node_check_flag(node, OF_OVERLAY_FREE_CSET)) {
|
||||
/* premature refcount of zero, do not free memory */
|
||||
pr_err("ERROR: memory leak before free overlay changeset, %pOF\n",
|
||||
node);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* If node->properties non-empty then properties were added
|
||||
* to this node either by different overlay that has not
|
||||
* yet been removed, or by a non-overlay mechanism.
|
||||
*/
|
||||
if (node->properties)
|
||||
pr_err("ERROR: %s(), unexpected properties in %pOF\n",
|
||||
__func__, node);
|
||||
}
|
||||
|
||||
property_list_free(node->properties);
|
||||
property_list_free(node->deadprops);
|
||||
|
||||
|
@ -434,6 +462,16 @@ struct device_node *__of_node_dup(const struct device_node *np,
|
|||
|
||||
static void __of_changeset_entry_destroy(struct of_changeset_entry *ce)
|
||||
{
|
||||
if (ce->action == OF_RECONFIG_ATTACH_NODE &&
|
||||
of_node_check_flag(ce->np, OF_OVERLAY)) {
|
||||
if (kref_read(&ce->np->kobj.kref) > 1) {
|
||||
pr_err("ERROR: memory leak, expected refcount 1 instead of %d, of_node_get()/of_node_put() unbalanced - destroy cset entry: attach overlay node %pOF\n",
|
||||
kref_read(&ce->np->kobj.kref), ce->np);
|
||||
} else {
|
||||
of_node_set_flag(ce->np, OF_OVERLAY_FREE_CSET);
|
||||
}
|
||||
}
|
||||
|
||||
of_node_put(ce->np);
|
||||
list_del(&ce->node);
|
||||
kfree(ce);
|
||||
|
|
|
@ -891,15 +891,20 @@ const void * __init of_flat_dt_match_machine(const void *default_match,
|
|||
}
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_INITRD
|
||||
#ifndef __early_init_dt_declare_initrd
|
||||
static void __early_init_dt_declare_initrd(unsigned long start,
|
||||
unsigned long end)
|
||||
{
|
||||
initrd_start = (unsigned long)__va(start);
|
||||
initrd_end = (unsigned long)__va(end);
|
||||
initrd_below_start_ok = 1;
|
||||
/* ARM64 would cause a BUG to occur here when CONFIG_DEBUG_VM is
|
||||
* enabled since __va() is called too early. ARM64 does make use
|
||||
* of phys_initrd_start/phys_initrd_size so we can skip this
|
||||
* conversion.
|
||||
*/
|
||||
if (!IS_ENABLED(CONFIG_ARM64)) {
|
||||
initrd_start = (unsigned long)__va(start);
|
||||
initrd_end = (unsigned long)__va(end);
|
||||
initrd_below_start_ok = 1;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* early_init_dt_check_for_initrd - Decode initrd location from flat tree
|
||||
|
@ -924,6 +929,8 @@ static void __init early_init_dt_check_for_initrd(unsigned long node)
|
|||
end = of_read_number(prop, len/4);
|
||||
|
||||
__early_init_dt_declare_initrd(start, end);
|
||||
phys_initrd_start = start;
|
||||
phys_initrd_size = end - start;
|
||||
|
||||
pr_debug("initrd_start=0x%llx initrd_end=0x%llx\n",
|
||||
(unsigned long long)start, (unsigned long long)end);
|
||||
|
@ -1200,8 +1207,12 @@ bool __init early_init_dt_verify(void *params)
|
|||
|
||||
void __init early_init_dt_scan_nodes(void)
|
||||
{
|
||||
int rc = 0;
|
||||
|
||||
/* Retrieve various information from the /chosen node */
|
||||
of_scan_flat_dt(early_init_dt_scan_chosen, boot_command_line);
|
||||
rc = of_scan_flat_dt(early_init_dt_scan_chosen, boot_command_line);
|
||||
if (!rc)
|
||||
pr_warn("No chosen node found, continuing without\n");
|
||||
|
||||
/* Initialize {size,address}-cells info */
|
||||
of_scan_flat_dt(early_init_dt_scan_root, NULL);
|
||||
|
|
|
@ -133,6 +133,9 @@ int __of_attach_node_sysfs(struct device_node *np)
|
|||
}
|
||||
if (!name)
|
||||
return -ENOMEM;
|
||||
|
||||
of_node_get(np);
|
||||
|
||||
rc = kobject_add(&np->kobj, parent, "%s", name);
|
||||
kfree(name);
|
||||
if (rc)
|
||||
|
@ -159,6 +162,5 @@ void __of_detach_node_sysfs(struct device_node *np)
|
|||
kobject_del(&np->kobj);
|
||||
}
|
||||
|
||||
/* finally remove the kobj_init ref */
|
||||
of_node_put(np);
|
||||
}
|
||||
|
|
|
@ -84,6 +84,10 @@ static inline void __of_detach_node_sysfs(struct device_node *np) {}
|
|||
int of_resolve_phandles(struct device_node *tree);
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_OF_DYNAMIC)
|
||||
void __of_free_phandle_cache_entry(phandle handle);
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_OF_OVERLAY)
|
||||
void of_overlay_mutex_lock(void);
|
||||
void of_overlay_mutex_unlock(void);
|
||||
|
|
|
@ -23,14 +23,34 @@
|
|||
|
||||
#include "of_private.h"
|
||||
|
||||
/**
|
||||
* struct target - info about current target node as recursing through overlay
|
||||
* @np: node where current level of overlay will be applied
|
||||
* @in_livetree: @np is a node in the live devicetree
|
||||
*
|
||||
* Used in the algorithm to create the portion of a changeset that describes
|
||||
* an overlay fragment, which is a devicetree subtree. Initially @np is a node
|
||||
* in the live devicetree where the overlay subtree is targeted to be grafted
|
||||
* into. When recursing to the next level of the overlay subtree, the target
|
||||
* also recurses to the next level of the live devicetree, as long as overlay
|
||||
* subtree node also exists in the live devicetree. When a node in the overlay
|
||||
* subtree does not exist at the same level in the live devicetree, target->np
|
||||
* points to a newly allocated node, and all subsequent targets in the subtree
|
||||
* will be newly allocated nodes.
|
||||
*/
|
||||
struct target {
|
||||
struct device_node *np;
|
||||
bool in_livetree;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct fragment - info about fragment nodes in overlay expanded device tree
|
||||
* @target: target of the overlay operation
|
||||
* @overlay: pointer to the __overlay__ node
|
||||
*/
|
||||
struct fragment {
|
||||
struct device_node *target;
|
||||
struct device_node *overlay;
|
||||
struct device_node *target;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -72,8 +92,7 @@ static int devicetree_corrupt(void)
|
|||
}
|
||||
|
||||
static int build_changeset_next_level(struct overlay_changeset *ovcs,
|
||||
struct device_node *target_node,
|
||||
const struct device_node *overlay_node);
|
||||
struct target *target, const struct device_node *overlay_node);
|
||||
|
||||
/*
|
||||
* of_resolve_phandles() finds the largest phandle in the live tree.
|
||||
|
@ -257,15 +276,23 @@ static struct property *dup_and_fixup_symbol_prop(
|
|||
/**
|
||||
* add_changeset_property() - add @overlay_prop to overlay changeset
|
||||
* @ovcs: overlay changeset
|
||||
* @target_node: where to place @overlay_prop in live tree
|
||||
* @target: where @overlay_prop will be placed
|
||||
* @overlay_prop: property to add or update, from overlay tree
|
||||
* @is_symbols_prop: 1 if @overlay_prop is from node "/__symbols__"
|
||||
*
|
||||
* If @overlay_prop does not already exist in @target_node, add changeset entry
|
||||
* to add @overlay_prop in @target_node, else add changeset entry to update
|
||||
* If @overlay_prop does not already exist in live devicetree, add changeset
|
||||
* entry to add @overlay_prop in @target, else add changeset entry to update
|
||||
* value of @overlay_prop.
|
||||
*
|
||||
* Some special properties are not updated (no error returned).
|
||||
* @target may be either in the live devicetree or in a new subtree that
|
||||
* is contained in the changeset.
|
||||
*
|
||||
* Some special properties are not added or updated (no error returned):
|
||||
* "name", "phandle", "linux,phandle".
|
||||
*
|
||||
* Properties "#address-cells" and "#size-cells" are not updated if they
|
||||
* are already in the live tree, but if present in the live tree, the values
|
||||
* in the overlay must match the values in the live tree.
|
||||
*
|
||||
* Update of property in symbols node is not allowed.
|
||||
*
|
||||
|
@ -273,19 +300,23 @@ static struct property *dup_and_fixup_symbol_prop(
|
|||
* invalid @overlay.
|
||||
*/
|
||||
static int add_changeset_property(struct overlay_changeset *ovcs,
|
||||
struct device_node *target_node,
|
||||
struct property *overlay_prop,
|
||||
struct target *target, struct property *overlay_prop,
|
||||
bool is_symbols_prop)
|
||||
{
|
||||
struct property *new_prop = NULL, *prop;
|
||||
int ret = 0;
|
||||
bool check_for_non_overlay_node = false;
|
||||
|
||||
prop = of_find_property(target_node, overlay_prop->name, NULL);
|
||||
if (target->in_livetree)
|
||||
if (!of_prop_cmp(overlay_prop->name, "name") ||
|
||||
!of_prop_cmp(overlay_prop->name, "phandle") ||
|
||||
!of_prop_cmp(overlay_prop->name, "linux,phandle"))
|
||||
return 0;
|
||||
|
||||
if (!of_prop_cmp(overlay_prop->name, "name") ||
|
||||
!of_prop_cmp(overlay_prop->name, "phandle") ||
|
||||
!of_prop_cmp(overlay_prop->name, "linux,phandle"))
|
||||
return 0;
|
||||
if (target->in_livetree)
|
||||
prop = of_find_property(target->np, overlay_prop->name, NULL);
|
||||
else
|
||||
prop = NULL;
|
||||
|
||||
if (is_symbols_prop) {
|
||||
if (prop)
|
||||
|
@ -298,12 +329,36 @@ static int add_changeset_property(struct overlay_changeset *ovcs,
|
|||
if (!new_prop)
|
||||
return -ENOMEM;
|
||||
|
||||
if (!prop)
|
||||
ret = of_changeset_add_property(&ovcs->cset, target_node,
|
||||
if (!prop) {
|
||||
check_for_non_overlay_node = true;
|
||||
if (!target->in_livetree) {
|
||||
new_prop->next = target->np->deadprops;
|
||||
target->np->deadprops = new_prop;
|
||||
}
|
||||
ret = of_changeset_add_property(&ovcs->cset, target->np,
|
||||
new_prop);
|
||||
else
|
||||
ret = of_changeset_update_property(&ovcs->cset, target_node,
|
||||
} else if (!of_prop_cmp(prop->name, "#address-cells")) {
|
||||
if (!of_prop_val_eq(prop, new_prop)) {
|
||||
pr_err("ERROR: changing value of #address-cells is not allowed in %pOF\n",
|
||||
target->np);
|
||||
ret = -EINVAL;
|
||||
}
|
||||
} else if (!of_prop_cmp(prop->name, "#size-cells")) {
|
||||
if (!of_prop_val_eq(prop, new_prop)) {
|
||||
pr_err("ERROR: changing value of #size-cells is not allowed in %pOF\n",
|
||||
target->np);
|
||||
ret = -EINVAL;
|
||||
}
|
||||
} else {
|
||||
check_for_non_overlay_node = true;
|
||||
ret = of_changeset_update_property(&ovcs->cset, target->np,
|
||||
new_prop);
|
||||
}
|
||||
|
||||
if (check_for_non_overlay_node &&
|
||||
!of_node_check_flag(target->np, OF_OVERLAY))
|
||||
pr_err("WARNING: memory leak will occur if overlay removed, property: %pOF/%s\n",
|
||||
target->np, new_prop->name);
|
||||
|
||||
if (ret) {
|
||||
kfree(new_prop->name);
|
||||
|
@ -315,14 +370,14 @@ static int add_changeset_property(struct overlay_changeset *ovcs,
|
|||
|
||||
/**
|
||||
* add_changeset_node() - add @node (and children) to overlay changeset
|
||||
* @ovcs: overlay changeset
|
||||
* @target_node: where to place @node in live tree
|
||||
* @node: node from within overlay device tree fragment
|
||||
* @ovcs: overlay changeset
|
||||
* @target: where @node will be placed in live tree or changeset
|
||||
* @node: node from within overlay device tree fragment
|
||||
*
|
||||
* If @node does not already exist in @target_node, add changeset entry
|
||||
* to add @node in @target_node.
|
||||
* If @node does not already exist in @target, add changeset entry
|
||||
* to add @node in @target.
|
||||
*
|
||||
* If @node already exists in @target_node, and the existing node has
|
||||
* If @node already exists in @target, and the existing node has
|
||||
* a phandle, the overlay node is not allowed to have a phandle.
|
||||
*
|
||||
* If @node has child nodes, add the children recursively via
|
||||
|
@ -342,49 +397,65 @@ static int add_changeset_property(struct overlay_changeset *ovcs,
|
|||
* a live devicetree created from Open Firmware.
|
||||
*
|
||||
* NOTE_2: Multiple mods of created nodes not supported.
|
||||
* If more than one fragment contains a node that does not already exist
|
||||
* in the live tree, then for each fragment of_changeset_attach_node()
|
||||
* will add a changeset entry to add the node. When the changeset is
|
||||
* applied, __of_attach_node() will attach the node twice (once for
|
||||
* each fragment). At this point the device tree will be corrupted.
|
||||
*
|
||||
* TODO: add integrity check to ensure that multiple fragments do not
|
||||
* create the same node.
|
||||
*
|
||||
* Returns 0 on success, -ENOMEM if memory allocation failure, or -EINVAL if
|
||||
* invalid @overlay.
|
||||
*/
|
||||
static int add_changeset_node(struct overlay_changeset *ovcs,
|
||||
struct device_node *target_node, struct device_node *node)
|
||||
struct target *target, struct device_node *node)
|
||||
{
|
||||
const char *node_kbasename;
|
||||
const __be32 *phandle;
|
||||
struct device_node *tchild;
|
||||
int ret = 0;
|
||||
struct target target_child;
|
||||
int ret = 0, size;
|
||||
|
||||
node_kbasename = kbasename(node->full_name);
|
||||
|
||||
for_each_child_of_node(target_node, tchild)
|
||||
for_each_child_of_node(target->np, tchild)
|
||||
if (!of_node_cmp(node_kbasename, kbasename(tchild->full_name)))
|
||||
break;
|
||||
|
||||
if (!tchild) {
|
||||
tchild = __of_node_dup(node, node_kbasename);
|
||||
tchild = __of_node_dup(NULL, node_kbasename);
|
||||
if (!tchild)
|
||||
return -ENOMEM;
|
||||
|
||||
tchild->parent = target_node;
|
||||
tchild->parent = target->np;
|
||||
tchild->name = __of_get_property(node, "name", NULL);
|
||||
tchild->type = __of_get_property(node, "device_type", NULL);
|
||||
|
||||
if (!tchild->name)
|
||||
tchild->name = "<NULL>";
|
||||
if (!tchild->type)
|
||||
tchild->type = "<NULL>";
|
||||
|
||||
/* ignore obsolete "linux,phandle" */
|
||||
phandle = __of_get_property(node, "phandle", &size);
|
||||
if (phandle && (size == 4))
|
||||
tchild->phandle = be32_to_cpup(phandle);
|
||||
|
||||
of_node_set_flag(tchild, OF_OVERLAY);
|
||||
|
||||
ret = of_changeset_attach_node(&ovcs->cset, tchild);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return build_changeset_next_level(ovcs, tchild, node);
|
||||
target_child.np = tchild;
|
||||
target_child.in_livetree = false;
|
||||
|
||||
ret = build_changeset_next_level(ovcs, &target_child, node);
|
||||
of_node_put(tchild);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (node->phandle && tchild->phandle)
|
||||
if (node->phandle && tchild->phandle) {
|
||||
ret = -EINVAL;
|
||||
else
|
||||
ret = build_changeset_next_level(ovcs, tchild, node);
|
||||
} else {
|
||||
target_child.np = tchild;
|
||||
target_child.in_livetree = target->in_livetree;
|
||||
ret = build_changeset_next_level(ovcs, &target_child, node);
|
||||
}
|
||||
of_node_put(tchild);
|
||||
|
||||
return ret;
|
||||
|
@ -393,7 +464,7 @@ static int add_changeset_node(struct overlay_changeset *ovcs,
|
|||
/**
|
||||
* build_changeset_next_level() - add level of overlay changeset
|
||||
* @ovcs: overlay changeset
|
||||
* @target_node: where to place @overlay_node in live tree
|
||||
* @target: where to place @overlay_node in live tree
|
||||
* @overlay_node: node from within an overlay device tree fragment
|
||||
*
|
||||
* Add the properties (if any) and nodes (if any) from @overlay_node to the
|
||||
|
@ -406,27 +477,26 @@ static int add_changeset_node(struct overlay_changeset *ovcs,
|
|||
* invalid @overlay_node.
|
||||
*/
|
||||
static int build_changeset_next_level(struct overlay_changeset *ovcs,
|
||||
struct device_node *target_node,
|
||||
const struct device_node *overlay_node)
|
||||
struct target *target, const struct device_node *overlay_node)
|
||||
{
|
||||
struct device_node *child;
|
||||
struct property *prop;
|
||||
int ret;
|
||||
|
||||
for_each_property_of_node(overlay_node, prop) {
|
||||
ret = add_changeset_property(ovcs, target_node, prop, 0);
|
||||
ret = add_changeset_property(ovcs, target, prop, 0);
|
||||
if (ret) {
|
||||
pr_debug("Failed to apply prop @%pOF/%s, err=%d\n",
|
||||
target_node, prop->name, ret);
|
||||
target->np, prop->name, ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
for_each_child_of_node(overlay_node, child) {
|
||||
ret = add_changeset_node(ovcs, target_node, child);
|
||||
ret = add_changeset_node(ovcs, target, child);
|
||||
if (ret) {
|
||||
pr_debug("Failed to apply node @%pOF/%pOFn, err=%d\n",
|
||||
target_node, child, ret);
|
||||
target->np, child, ret);
|
||||
of_node_put(child);
|
||||
return ret;
|
||||
}
|
||||
|
@ -439,17 +509,17 @@ static int build_changeset_next_level(struct overlay_changeset *ovcs,
|
|||
* Add the properties from __overlay__ node to the @ovcs->cset changeset.
|
||||
*/
|
||||
static int build_changeset_symbols_node(struct overlay_changeset *ovcs,
|
||||
struct device_node *target_node,
|
||||
struct target *target,
|
||||
const struct device_node *overlay_symbols_node)
|
||||
{
|
||||
struct property *prop;
|
||||
int ret;
|
||||
|
||||
for_each_property_of_node(overlay_symbols_node, prop) {
|
||||
ret = add_changeset_property(ovcs, target_node, prop, 1);
|
||||
ret = add_changeset_property(ovcs, target, prop, 1);
|
||||
if (ret) {
|
||||
pr_debug("Failed to apply prop @%pOF/%s, err=%d\n",
|
||||
target_node, prop->name, ret);
|
||||
pr_debug("Failed to apply symbols prop @%pOF/%s, err=%d\n",
|
||||
target->np, prop->name, ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
@ -457,6 +527,98 @@ static int build_changeset_symbols_node(struct overlay_changeset *ovcs,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int find_dup_cset_node_entry(struct overlay_changeset *ovcs,
|
||||
struct of_changeset_entry *ce_1)
|
||||
{
|
||||
struct of_changeset_entry *ce_2;
|
||||
char *fn_1, *fn_2;
|
||||
int node_path_match;
|
||||
|
||||
if (ce_1->action != OF_RECONFIG_ATTACH_NODE &&
|
||||
ce_1->action != OF_RECONFIG_DETACH_NODE)
|
||||
return 0;
|
||||
|
||||
ce_2 = ce_1;
|
||||
list_for_each_entry_continue(ce_2, &ovcs->cset.entries, node) {
|
||||
if ((ce_2->action != OF_RECONFIG_ATTACH_NODE &&
|
||||
ce_2->action != OF_RECONFIG_DETACH_NODE) ||
|
||||
of_node_cmp(ce_1->np->full_name, ce_2->np->full_name))
|
||||
continue;
|
||||
|
||||
fn_1 = kasprintf(GFP_KERNEL, "%pOF", ce_1->np);
|
||||
fn_2 = kasprintf(GFP_KERNEL, "%pOF", ce_2->np);
|
||||
node_path_match = !strcmp(fn_1, fn_2);
|
||||
kfree(fn_1);
|
||||
kfree(fn_2);
|
||||
if (node_path_match) {
|
||||
pr_err("ERROR: multiple fragments add and/or delete node %pOF\n",
|
||||
ce_1->np);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int find_dup_cset_prop(struct overlay_changeset *ovcs,
|
||||
struct of_changeset_entry *ce_1)
|
||||
{
|
||||
struct of_changeset_entry *ce_2;
|
||||
char *fn_1, *fn_2;
|
||||
int node_path_match;
|
||||
|
||||
if (ce_1->action != OF_RECONFIG_ADD_PROPERTY &&
|
||||
ce_1->action != OF_RECONFIG_REMOVE_PROPERTY &&
|
||||
ce_1->action != OF_RECONFIG_UPDATE_PROPERTY)
|
||||
return 0;
|
||||
|
||||
ce_2 = ce_1;
|
||||
list_for_each_entry_continue(ce_2, &ovcs->cset.entries, node) {
|
||||
if ((ce_2->action != OF_RECONFIG_ADD_PROPERTY &&
|
||||
ce_2->action != OF_RECONFIG_REMOVE_PROPERTY &&
|
||||
ce_2->action != OF_RECONFIG_UPDATE_PROPERTY) ||
|
||||
of_node_cmp(ce_1->np->full_name, ce_2->np->full_name))
|
||||
continue;
|
||||
|
||||
fn_1 = kasprintf(GFP_KERNEL, "%pOF", ce_1->np);
|
||||
fn_2 = kasprintf(GFP_KERNEL, "%pOF", ce_2->np);
|
||||
node_path_match = !strcmp(fn_1, fn_2);
|
||||
kfree(fn_1);
|
||||
kfree(fn_2);
|
||||
if (node_path_match &&
|
||||
!of_prop_cmp(ce_1->prop->name, ce_2->prop->name)) {
|
||||
pr_err("ERROR: multiple fragments add, update, and/or delete property %pOF/%s\n",
|
||||
ce_1->np, ce_1->prop->name);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* changeset_dup_entry_check() - check for duplicate entries
|
||||
* @ovcs: Overlay changeset
|
||||
*
|
||||
* Check changeset @ovcs->cset for multiple {add or delete} node entries for
|
||||
* the same node or duplicate {add, delete, or update} properties entries
|
||||
* for the same property.
|
||||
*
|
||||
* Returns 0 on success, or -EINVAL if duplicate changeset entry found.
|
||||
*/
|
||||
static int changeset_dup_entry_check(struct overlay_changeset *ovcs)
|
||||
{
|
||||
struct of_changeset_entry *ce_1;
|
||||
int dup_entry = 0;
|
||||
|
||||
list_for_each_entry(ce_1, &ovcs->cset.entries, node) {
|
||||
dup_entry |= find_dup_cset_node_entry(ovcs, ce_1);
|
||||
dup_entry |= find_dup_cset_prop(ovcs, ce_1);
|
||||
}
|
||||
|
||||
return dup_entry ? -EINVAL : 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* build_changeset() - populate overlay changeset in @ovcs from @ovcs->fragments
|
||||
* @ovcs: Overlay changeset
|
||||
|
@ -472,6 +634,7 @@ static int build_changeset_symbols_node(struct overlay_changeset *ovcs,
|
|||
static int build_changeset(struct overlay_changeset *ovcs)
|
||||
{
|
||||
struct fragment *fragment;
|
||||
struct target target;
|
||||
int fragments_count, i, ret;
|
||||
|
||||
/*
|
||||
|
@ -486,25 +649,32 @@ static int build_changeset(struct overlay_changeset *ovcs)
|
|||
for (i = 0; i < fragments_count; i++) {
|
||||
fragment = &ovcs->fragments[i];
|
||||
|
||||
ret = build_changeset_next_level(ovcs, fragment->target,
|
||||
target.np = fragment->target;
|
||||
target.in_livetree = true;
|
||||
ret = build_changeset_next_level(ovcs, &target,
|
||||
fragment->overlay);
|
||||
if (ret) {
|
||||
pr_debug("apply failed '%pOF'\n", fragment->target);
|
||||
pr_debug("fragment apply failed '%pOF'\n",
|
||||
fragment->target);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
if (ovcs->symbols_fragment) {
|
||||
fragment = &ovcs->fragments[ovcs->count - 1];
|
||||
ret = build_changeset_symbols_node(ovcs, fragment->target,
|
||||
|
||||
target.np = fragment->target;
|
||||
target.in_livetree = true;
|
||||
ret = build_changeset_symbols_node(ovcs, &target,
|
||||
fragment->overlay);
|
||||
if (ret) {
|
||||
pr_debug("apply failed '%pOF'\n", fragment->target);
|
||||
pr_debug("symbols fragment apply failed '%pOF'\n",
|
||||
fragment->target);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
return changeset_dup_entry_check(ovcs);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -514,7 +684,7 @@ static int build_changeset(struct overlay_changeset *ovcs)
|
|||
* 1) "target" property containing the phandle of the target
|
||||
* 2) "target-path" property containing the path of the target
|
||||
*/
|
||||
static struct device_node *find_target_node(struct device_node *info_node)
|
||||
static struct device_node *find_target(struct device_node *info_node)
|
||||
{
|
||||
struct device_node *node;
|
||||
const char *path;
|
||||
|
@ -620,7 +790,7 @@ static int init_overlay_changeset(struct overlay_changeset *ovcs,
|
|||
|
||||
fragment = &fragments[cnt];
|
||||
fragment->overlay = overlay_node;
|
||||
fragment->target = find_target_node(node);
|
||||
fragment->target = find_target(node);
|
||||
if (!fragment->target) {
|
||||
of_node_put(fragment->overlay);
|
||||
ret = -EINVAL;
|
||||
|
@ -808,7 +978,7 @@ static int of_overlay_apply(const void *fdt, struct device_node *tree,
|
|||
|
||||
ret = __of_changeset_apply_notify(&ovcs->cset);
|
||||
if (ret)
|
||||
pr_err("overlay changeset entry notify error %d\n", ret);
|
||||
pr_err("overlay apply changeset entry notify error %d\n", ret);
|
||||
/* notify failure is not fatal, continue */
|
||||
|
||||
list_add_tail(&ovcs->ovcs_list, &ovcs_list);
|
||||
|
@ -1067,7 +1237,7 @@ int of_overlay_remove(int *ovcs_id)
|
|||
|
||||
ret = __of_changeset_revert_notify(&ovcs->cset);
|
||||
if (ret)
|
||||
pr_err("overlay changeset entry notify error %d\n", ret);
|
||||
pr_err("overlay remove changeset entry notify error %d\n", ret);
|
||||
/* notify failure is not fatal, continue */
|
||||
|
||||
*ovcs_id = 0;
|
||||
|
|
|
@ -21,8 +21,6 @@
|
|||
|
||||
static struct of_pdt_ops *of_pdt_prom_ops __initdata;
|
||||
|
||||
void __initdata (*of_pdt_build_more)(struct device_node *dp);
|
||||
|
||||
#if defined(CONFIG_SPARC)
|
||||
unsigned int of_pdt_unique_id __initdata;
|
||||
|
||||
|
@ -189,9 +187,6 @@ static struct device_node * __init of_pdt_build_tree(struct device_node *parent,
|
|||
|
||||
dp->child = of_pdt_build_tree(dp, of_pdt_prom_ops->getchild(node));
|
||||
|
||||
if (of_pdt_build_more)
|
||||
of_pdt_build_more(dp);
|
||||
|
||||
node = of_pdt_prom_ops->getsibling(node);
|
||||
}
|
||||
|
||||
|
|
|
@ -571,7 +571,7 @@ struct device_node *of_graph_get_port_by_id(struct device_node *parent, u32 id)
|
|||
for_each_child_of_node(parent, port) {
|
||||
u32 port_id = 0;
|
||||
|
||||
if (of_node_cmp(port->name, "port") != 0)
|
||||
if (!of_node_name_eq(port, "port"))
|
||||
continue;
|
||||
of_property_read_u32(port, "reg", &port_id);
|
||||
if (id == port_id)
|
||||
|
@ -646,7 +646,7 @@ struct device_node *of_graph_get_next_endpoint(const struct device_node *parent,
|
|||
port = of_get_next_child(parent, port);
|
||||
if (!port)
|
||||
return NULL;
|
||||
} while (of_node_cmp(port->name, "port"));
|
||||
} while (!of_node_name_eq(port, "port"));
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(of_graph_get_next_endpoint);
|
||||
|
@ -715,7 +715,7 @@ struct device_node *of_graph_get_port_parent(struct device_node *node)
|
|||
/* Walk 3 levels up only if there is 'ports' node. */
|
||||
for (depth = 3; depth && node; depth--) {
|
||||
node = of_get_next_parent(node);
|
||||
if (depth == 2 && of_node_cmp(node->name, "ports"))
|
||||
if (depth == 2 && !of_node_name_eq(node, "ports"))
|
||||
break;
|
||||
}
|
||||
return node;
|
||||
|
@ -893,7 +893,7 @@ of_fwnode_get_named_child_node(const struct fwnode_handle *fwnode,
|
|||
struct device_node *child;
|
||||
|
||||
for_each_available_child_of_node(node, child)
|
||||
if (!of_node_cmp(child->name, childname))
|
||||
if (of_node_name_eq(child, childname))
|
||||
return of_fwnode_handle(child);
|
||||
|
||||
return NULL;
|
||||
|
@ -955,7 +955,7 @@ of_fwnode_graph_get_port_parent(struct fwnode_handle *fwnode)
|
|||
return NULL;
|
||||
|
||||
/* Is this the "ports" node? If not, it's the port parent. */
|
||||
if (of_node_cmp(np->name, "ports"))
|
||||
if (!of_node_name_eq(np, "ports"))
|
||||
return of_fwnode_handle(np);
|
||||
|
||||
return of_fwnode_handle(of_get_next_parent(np));
|
||||
|
|
|
@ -281,7 +281,7 @@ int of_resolve_phandles(struct device_node *overlay)
|
|||
adjust_overlay_phandles(overlay, phandle_delta);
|
||||
|
||||
for_each_child_of_node(overlay, local_fixups)
|
||||
if (!of_node_cmp(local_fixups->name, "__local_fixups__"))
|
||||
if (of_node_name_eq(local_fixups, "__local_fixups__"))
|
||||
break;
|
||||
|
||||
err = adjust_local_phandle_references(local_fixups, overlay, phandle_delta);
|
||||
|
@ -291,7 +291,7 @@ int of_resolve_phandles(struct device_node *overlay)
|
|||
overlay_fixups = NULL;
|
||||
|
||||
for_each_child_of_node(overlay, child) {
|
||||
if (!of_node_cmp(child->name, "__fixups__"))
|
||||
if (of_node_name_eq(child, "__fixups__"))
|
||||
overlay_fixups = child;
|
||||
}
|
||||
|
||||
|
|
|
@ -17,6 +17,8 @@ obj-$(CONFIG_OF_OVERLAY) += overlay.dtb.o \
|
|||
overlay_12.dtb.o \
|
||||
overlay_13.dtb.o \
|
||||
overlay_15.dtb.o \
|
||||
overlay_bad_add_dup_node.dtb.o \
|
||||
overlay_bad_add_dup_prop.dtb.o \
|
||||
overlay_bad_phandle.dtb.o \
|
||||
overlay_bad_symbol.dtb.o \
|
||||
overlay_base.dtb.o
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/dts-v1/;
|
||||
/plugin/;
|
||||
|
||||
/*
|
||||
* &electric_1/motor-1 and &spin_ctrl_1 are the same node:
|
||||
* /testcase-data-2/substation@100/motor-1
|
||||
*
|
||||
* Thus the new node "controller" in each fragment will
|
||||
* result in an attempt to add the same node twice.
|
||||
* This will result in an error and the overlay apply
|
||||
* will fail.
|
||||
*/
|
||||
|
||||
&electric_1 {
|
||||
|
||||
motor-1 {
|
||||
controller {
|
||||
power_bus = < 0x1 0x2 >;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&spin_ctrl_1 {
|
||||
controller {
|
||||
power_bus_emergency = < 0x101 0x102 >;
|
||||
};
|
||||
};
|
|
@ -0,0 +1,24 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/dts-v1/;
|
||||
/plugin/;
|
||||
|
||||
/*
|
||||
* &electric_1/motor-1 and &spin_ctrl_1 are the same node:
|
||||
* /testcase-data-2/substation@100/motor-1
|
||||
*
|
||||
* Thus the property "rpm_avail" in each fragment will
|
||||
* result in an attempt to update the same property twice.
|
||||
* This will result in an error and the overlay apply
|
||||
* will fail.
|
||||
*/
|
||||
|
||||
&electric_1 {
|
||||
|
||||
motor-1 {
|
||||
rpm_avail = < 100 >;
|
||||
};
|
||||
};
|
||||
|
||||
&spin_ctrl_1 {
|
||||
rpm_avail = < 100 200 >;
|
||||
};
|
|
@ -30,6 +30,7 @@ hvac_1: hvac-medium-1 {
|
|||
spin_ctrl_1: motor-1 {
|
||||
compatible = "ot,ferris-wheel-motor";
|
||||
spin = "clockwise";
|
||||
rpm_avail = < 50 >;
|
||||
};
|
||||
|
||||
spin_ctrl_2: motor-8 {
|
||||
|
|
|
@ -379,6 +379,7 @@ static void __init of_unittest_parse_phandle_with_args(void)
|
|||
for (i = 0; i < 8; i++) {
|
||||
bool passed = true;
|
||||
|
||||
memset(&args, 0, sizeof(args));
|
||||
rc = of_parse_phandle_with_args(np, "phandle-list",
|
||||
"#phandle-cells", i, &args);
|
||||
|
||||
|
@ -432,6 +433,7 @@ static void __init of_unittest_parse_phandle_with_args(void)
|
|||
}
|
||||
|
||||
/* Check for missing list property */
|
||||
memset(&args, 0, sizeof(args));
|
||||
rc = of_parse_phandle_with_args(np, "phandle-list-missing",
|
||||
"#phandle-cells", 0, &args);
|
||||
unittest(rc == -ENOENT, "expected:%i got:%i\n", -ENOENT, rc);
|
||||
|
@ -440,6 +442,7 @@ static void __init of_unittest_parse_phandle_with_args(void)
|
|||
unittest(rc == -ENOENT, "expected:%i got:%i\n", -ENOENT, rc);
|
||||
|
||||
/* Check for missing cells property */
|
||||
memset(&args, 0, sizeof(args));
|
||||
rc = of_parse_phandle_with_args(np, "phandle-list",
|
||||
"#phandle-cells-missing", 0, &args);
|
||||
unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
|
||||
|
@ -448,6 +451,7 @@ static void __init of_unittest_parse_phandle_with_args(void)
|
|||
unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
|
||||
|
||||
/* Check for bad phandle in list */
|
||||
memset(&args, 0, sizeof(args));
|
||||
rc = of_parse_phandle_with_args(np, "phandle-list-bad-phandle",
|
||||
"#phandle-cells", 0, &args);
|
||||
unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
|
||||
|
@ -456,6 +460,7 @@ static void __init of_unittest_parse_phandle_with_args(void)
|
|||
unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
|
||||
|
||||
/* Check for incorrectly formed argument list */
|
||||
memset(&args, 0, sizeof(args));
|
||||
rc = of_parse_phandle_with_args(np, "phandle-list-bad-args",
|
||||
"#phandle-cells", 1, &args);
|
||||
unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
|
||||
|
@ -506,6 +511,7 @@ static void __init of_unittest_parse_phandle_with_args_map(void)
|
|||
for (i = 0; i < 8; i++) {
|
||||
bool passed = true;
|
||||
|
||||
memset(&args, 0, sizeof(args));
|
||||
rc = of_parse_phandle_with_args_map(np, "phandle-list",
|
||||
"phandle", i, &args);
|
||||
|
||||
|
@ -563,21 +569,25 @@ static void __init of_unittest_parse_phandle_with_args_map(void)
|
|||
}
|
||||
|
||||
/* Check for missing list property */
|
||||
memset(&args, 0, sizeof(args));
|
||||
rc = of_parse_phandle_with_args_map(np, "phandle-list-missing",
|
||||
"phandle", 0, &args);
|
||||
unittest(rc == -ENOENT, "expected:%i got:%i\n", -ENOENT, rc);
|
||||
|
||||
/* Check for missing cells,map,mask property */
|
||||
memset(&args, 0, sizeof(args));
|
||||
rc = of_parse_phandle_with_args_map(np, "phandle-list",
|
||||
"phandle-missing", 0, &args);
|
||||
unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
|
||||
|
||||
/* Check for bad phandle in list */
|
||||
memset(&args, 0, sizeof(args));
|
||||
rc = of_parse_phandle_with_args_map(np, "phandle-list-bad-phandle",
|
||||
"phandle", 0, &args);
|
||||
unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
|
||||
|
||||
/* Check for incorrectly formed argument list */
|
||||
memset(&args, 0, sizeof(args));
|
||||
rc = of_parse_phandle_with_args_map(np, "phandle-list-bad-args",
|
||||
"phandle", 1, &args);
|
||||
unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
|
||||
|
@ -787,7 +797,7 @@ static void __init of_unittest_parse_interrupts(void)
|
|||
for (i = 0; i < 4; i++) {
|
||||
bool passed = true;
|
||||
|
||||
args.args_count = 0;
|
||||
memset(&args, 0, sizeof(args));
|
||||
rc = of_irq_parse_one(np, i, &args);
|
||||
|
||||
passed &= !rc;
|
||||
|
@ -808,7 +818,7 @@ static void __init of_unittest_parse_interrupts(void)
|
|||
for (i = 0; i < 4; i++) {
|
||||
bool passed = true;
|
||||
|
||||
args.args_count = 0;
|
||||
memset(&args, 0, sizeof(args));
|
||||
rc = of_irq_parse_one(np, i, &args);
|
||||
|
||||
/* Test the values from tests-phandle.dtsi */
|
||||
|
@ -864,6 +874,7 @@ static void __init of_unittest_parse_interrupts_extended(void)
|
|||
for (i = 0; i < 7; i++) {
|
||||
bool passed = true;
|
||||
|
||||
memset(&args, 0, sizeof(args));
|
||||
rc = of_irq_parse_one(np, i, &args);
|
||||
|
||||
/* Test the values from tests-phandle.dtsi */
|
||||
|
@ -1071,20 +1082,44 @@ static void __init of_unittest_platform_populate(void)
|
|||
* of np into dup node (present in live tree) and
|
||||
* updates parent of children of np to dup.
|
||||
*
|
||||
* @np: node already present in live tree
|
||||
* @np: node whose properties are being added to the live tree
|
||||
* @dup: node present in live tree to be updated
|
||||
*/
|
||||
static void update_node_properties(struct device_node *np,
|
||||
struct device_node *dup)
|
||||
{
|
||||
struct property *prop;
|
||||
struct property *save_next;
|
||||
struct device_node *child;
|
||||
|
||||
for_each_property_of_node(np, prop)
|
||||
of_add_property(dup, prop);
|
||||
int ret;
|
||||
|
||||
for_each_child_of_node(np, child)
|
||||
child->parent = dup;
|
||||
|
||||
/*
|
||||
* "unittest internal error: unable to add testdata property"
|
||||
*
|
||||
* If this message reports a property in node '/__symbols__' then
|
||||
* the respective unittest overlay contains a label that has the
|
||||
* same name as a label in the live devicetree. The label will
|
||||
* be in the live devicetree only if the devicetree source was
|
||||
* compiled with the '-@' option. If you encounter this error,
|
||||
* please consider renaming __all__ of the labels in the unittest
|
||||
* overlay dts files with an odd prefix that is unlikely to be
|
||||
* used in a real devicetree.
|
||||
*/
|
||||
|
||||
/*
|
||||
* open code for_each_property_of_node() because of_add_property()
|
||||
* sets prop->next to NULL
|
||||
*/
|
||||
for (prop = np->properties; prop != NULL; prop = save_next) {
|
||||
save_next = prop->next;
|
||||
ret = of_add_property(dup, prop);
|
||||
if (ret)
|
||||
pr_err("unittest internal error: unable to add testdata property %pOF/%s",
|
||||
np, prop->name);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1093,18 +1128,23 @@ static void update_node_properties(struct device_node *np,
|
|||
*
|
||||
* @np: Node to attach to live tree
|
||||
*/
|
||||
static int attach_node_and_children(struct device_node *np)
|
||||
static void attach_node_and_children(struct device_node *np)
|
||||
{
|
||||
struct device_node *next, *dup, *child;
|
||||
unsigned long flags;
|
||||
const char *full_name;
|
||||
|
||||
full_name = kasprintf(GFP_KERNEL, "%pOF", np);
|
||||
|
||||
if (!strcmp(full_name, "/__local_fixups__") ||
|
||||
!strcmp(full_name, "/__fixups__"))
|
||||
return;
|
||||
|
||||
dup = of_find_node_by_path(full_name);
|
||||
kfree(full_name);
|
||||
if (dup) {
|
||||
update_node_properties(np, dup);
|
||||
return 0;
|
||||
return;
|
||||
}
|
||||
|
||||
child = np->child;
|
||||
|
@ -1125,8 +1165,6 @@ static int attach_node_and_children(struct device_node *np)
|
|||
attach_node_and_children(child);
|
||||
child = next;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1433,8 +1471,7 @@ static void of_unittest_destroy_tracked_overlays(void)
|
|||
} while (defers > 0);
|
||||
}
|
||||
|
||||
static int __init of_unittest_apply_overlay(int overlay_nr, int unittest_nr,
|
||||
int *overlay_id)
|
||||
static int __init of_unittest_apply_overlay(int overlay_nr, int *overlay_id)
|
||||
{
|
||||
const char *overlay_name;
|
||||
|
||||
|
@ -1467,7 +1504,7 @@ static int __init of_unittest_apply_overlay_check(int overlay_nr,
|
|||
}
|
||||
|
||||
ovcs_id = 0;
|
||||
ret = of_unittest_apply_overlay(overlay_nr, unittest_nr, &ovcs_id);
|
||||
ret = of_unittest_apply_overlay(overlay_nr, &ovcs_id);
|
||||
if (ret != 0) {
|
||||
/* of_unittest_apply_overlay already called unittest() */
|
||||
return ret;
|
||||
|
@ -1503,7 +1540,7 @@ static int __init of_unittest_apply_revert_overlay_check(int overlay_nr,
|
|||
|
||||
/* apply the overlay */
|
||||
ovcs_id = 0;
|
||||
ret = of_unittest_apply_overlay(overlay_nr, unittest_nr, &ovcs_id);
|
||||
ret = of_unittest_apply_overlay(overlay_nr, &ovcs_id);
|
||||
if (ret != 0) {
|
||||
/* of_unittest_apply_overlay already called unittest() */
|
||||
return ret;
|
||||
|
@ -2161,10 +2198,12 @@ OVERLAY_INFO_EXTERN(overlay_11);
|
|||
OVERLAY_INFO_EXTERN(overlay_12);
|
||||
OVERLAY_INFO_EXTERN(overlay_13);
|
||||
OVERLAY_INFO_EXTERN(overlay_15);
|
||||
OVERLAY_INFO_EXTERN(overlay_bad_add_dup_node);
|
||||
OVERLAY_INFO_EXTERN(overlay_bad_add_dup_prop);
|
||||
OVERLAY_INFO_EXTERN(overlay_bad_phandle);
|
||||
OVERLAY_INFO_EXTERN(overlay_bad_symbol);
|
||||
|
||||
/* order of entries is hard-coded into users of overlays[] */
|
||||
/* entries found by name */
|
||||
static struct overlay_info overlays[] = {
|
||||
OVERLAY_INFO(overlay_base, -9999),
|
||||
OVERLAY_INFO(overlay, 0),
|
||||
|
@ -2183,9 +2222,12 @@ static struct overlay_info overlays[] = {
|
|||
OVERLAY_INFO(overlay_12, 0),
|
||||
OVERLAY_INFO(overlay_13, 0),
|
||||
OVERLAY_INFO(overlay_15, 0),
|
||||
OVERLAY_INFO(overlay_bad_add_dup_node, -EINVAL),
|
||||
OVERLAY_INFO(overlay_bad_add_dup_prop, -EINVAL),
|
||||
OVERLAY_INFO(overlay_bad_phandle, -EINVAL),
|
||||
OVERLAY_INFO(overlay_bad_symbol, -EINVAL),
|
||||
{}
|
||||
/* end marker */
|
||||
{.dtb_begin = NULL, .dtb_end = NULL, .expected_result = 0, .name = NULL}
|
||||
};
|
||||
|
||||
static struct device_node *overlay_base_root;
|
||||
|
@ -2215,6 +2257,19 @@ void __init unittest_unflatten_overlay_base(void)
|
|||
u32 data_size;
|
||||
void *new_fdt;
|
||||
u32 size;
|
||||
int found = 0;
|
||||
const char *overlay_name = "overlay_base";
|
||||
|
||||
for (info = overlays; info && info->name; info++) {
|
||||
if (!strcmp(overlay_name, info->name)) {
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!found) {
|
||||
pr_err("no overlay data for %s\n", overlay_name);
|
||||
return;
|
||||
}
|
||||
|
||||
info = &overlays[0];
|
||||
|
||||
|
@ -2262,11 +2317,10 @@ static int __init overlay_data_apply(const char *overlay_name, int *overlay_id)
|
|||
{
|
||||
struct overlay_info *info;
|
||||
int found = 0;
|
||||
int k;
|
||||
int ret;
|
||||
u32 size;
|
||||
|
||||
for (k = 0, info = overlays; info && info->name; info++, k++) {
|
||||
for (info = overlays; info && info->name; info++) {
|
||||
if (!strcmp(overlay_name, info->name)) {
|
||||
found = 1;
|
||||
break;
|
||||
|
@ -2339,7 +2393,7 @@ static __init void of_unittest_overlay_high_level(void)
|
|||
*/
|
||||
pprev = &overlay_base_root->child;
|
||||
for (np = overlay_base_root->child; np; np = np->sibling) {
|
||||
if (!of_node_cmp(np->name, "__local_fixups__")) {
|
||||
if (of_node_name_eq(np, "__local_fixups__")) {
|
||||
*pprev = np->sibling;
|
||||
break;
|
||||
}
|
||||
|
@ -2352,7 +2406,7 @@ static __init void of_unittest_overlay_high_level(void)
|
|||
/* will have to graft properties from node into live tree */
|
||||
pprev = &overlay_base_root->child;
|
||||
for (np = overlay_base_root->child; np; np = np->sibling) {
|
||||
if (!of_node_cmp(np->name, "__symbols__")) {
|
||||
if (of_node_name_eq(np, "__symbols__")) {
|
||||
overlay_base_symbols = np;
|
||||
*pprev = np->sibling;
|
||||
break;
|
||||
|
@ -2430,6 +2484,12 @@ static __init void of_unittest_overlay_high_level(void)
|
|||
unittest(overlay_data_apply("overlay", NULL),
|
||||
"Adding overlay 'overlay' failed\n");
|
||||
|
||||
unittest(overlay_data_apply("overlay_bad_add_dup_node", NULL),
|
||||
"Adding overlay 'overlay_bad_add_dup_node' failed\n");
|
||||
|
||||
unittest(overlay_data_apply("overlay_bad_add_dup_prop", NULL),
|
||||
"Adding overlay 'overlay_bad_add_dup_prop' failed\n");
|
||||
|
||||
unittest(overlay_data_apply("overlay_bad_phandle", NULL),
|
||||
"Adding overlay 'overlay_bad_phandle' failed\n");
|
||||
|
||||
|
|
|
@ -65,7 +65,7 @@ static int axxia_reset_probe(struct platform_device *pdev)
|
|||
|
||||
syscon = syscon_regmap_lookup_by_phandle(dev->of_node, "syscon");
|
||||
if (IS_ERR(syscon)) {
|
||||
pr_err("%s: syscon lookup failed\n", dev->of_node->name);
|
||||
pr_err("%pOFn: syscon lookup failed\n", dev->of_node);
|
||||
return PTR_ERR(syscon);
|
||||
}
|
||||
|
||||
|
|
|
@ -330,7 +330,7 @@ static int pm8941_wled_configure(struct pm8941_wled *wled, struct device *dev)
|
|||
|
||||
rc = of_property_read_string(dev->of_node, "label", &wled->name);
|
||||
if (rc)
|
||||
wled->name = dev->of_node->name;
|
||||
wled->name = devm_kasprintf(dev, GFP_KERNEL, "%pOFn", dev->of_node);
|
||||
|
||||
*cfg = pm8941_wled_config_defaults;
|
||||
for (i = 0; i < ARRAY_SIZE(u32_opts); ++i) {
|
||||
|
|
|
@ -21,4 +21,7 @@ extern int initrd_below_start_ok;
|
|||
extern unsigned long initrd_start, initrd_end;
|
||||
extern void free_initrd_mem(unsigned long, unsigned long);
|
||||
|
||||
extern phys_addr_t phys_initrd_start;
|
||||
extern unsigned long phys_initrd_size;
|
||||
|
||||
extern unsigned int real_root_dev;
|
||||
|
|
|
@ -137,11 +137,16 @@ extern struct device_node *of_aliases;
|
|||
extern struct device_node *of_stdout;
|
||||
extern raw_spinlock_t devtree_lock;
|
||||
|
||||
/* flag descriptions (need to be visible even when !CONFIG_OF) */
|
||||
#define OF_DYNAMIC 1 /* node and properties were allocated via kmalloc */
|
||||
#define OF_DETACHED 2 /* node has been detached from the device tree */
|
||||
#define OF_POPULATED 3 /* device already created for the node */
|
||||
#define OF_POPULATED_BUS 4 /* of_platform_populate recursed to children of this node */
|
||||
/*
|
||||
* struct device_node flag descriptions
|
||||
* (need to be visible even when !CONFIG_OF)
|
||||
*/
|
||||
#define OF_DYNAMIC 1 /* (and properties) allocated via kmalloc */
|
||||
#define OF_DETACHED 2 /* detached from the device tree */
|
||||
#define OF_POPULATED 3 /* device already created */
|
||||
#define OF_POPULATED_BUS 4 /* platform bus created for children */
|
||||
#define OF_OVERLAY 5 /* allocated for an overlay */
|
||||
#define OF_OVERLAY_FREE_CSET 6 /* in overlay cset being freed */
|
||||
|
||||
#define OF_BAD_ADDR ((u64)-1)
|
||||
|
||||
|
@ -984,6 +989,12 @@ static inline int of_map_rid(struct device_node *np, u32 rid,
|
|||
#define of_node_cmp(s1, s2) strcasecmp((s1), (s2))
|
||||
#endif
|
||||
|
||||
static inline int of_prop_val_eq(struct property *p1, struct property *p2)
|
||||
{
|
||||
return p1->length == p2->length &&
|
||||
!memcmp(p1->value, p2->value, (size_t)p1->length);
|
||||
}
|
||||
|
||||
#if defined(CONFIG_OF) && defined(CONFIG_NUMA)
|
||||
extern int of_node_to_nid(struct device_node *np);
|
||||
#else
|
||||
|
|
|
@ -35,6 +35,4 @@ extern void *prom_early_alloc(unsigned long size);
|
|||
/* for building the device tree */
|
||||
extern void of_pdt_build_devicetree(phandle root_node, struct of_pdt_ops *ops);
|
||||
|
||||
extern void (*of_pdt_build_more)(struct device_node *dp);
|
||||
|
||||
#endif /* _LINUX_OF_PDT_H */
|
||||
|
|
|
@ -16,6 +16,9 @@ int initrd_below_start_ok;
|
|||
unsigned int real_root_dev; /* do_proc_dointvec cannot handle kdev_t */
|
||||
static int __initdata mount_initrd = 1;
|
||||
|
||||
phys_addr_t phys_initrd_start __initdata;
|
||||
unsigned long phys_initrd_size __initdata;
|
||||
|
||||
static int __init no_initrd(char *str)
|
||||
{
|
||||
mount_initrd = 0;
|
||||
|
@ -24,6 +27,23 @@ static int __init no_initrd(char *str)
|
|||
|
||||
__setup("noinitrd", no_initrd);
|
||||
|
||||
static int __init early_initrd(char *p)
|
||||
{
|
||||
phys_addr_t start;
|
||||
unsigned long size;
|
||||
char *endp;
|
||||
|
||||
start = memparse(p, &endp);
|
||||
if (*endp == ',') {
|
||||
size = memparse(endp + 1, NULL);
|
||||
|
||||
phys_initrd_start = start;
|
||||
phys_initrd_size = size;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
early_param("initrd", early_initrd);
|
||||
|
||||
static int init_linuxrc(struct subprocess_info *info, struct cred *new)
|
||||
{
|
||||
ksys_unshare(CLONE_FS | CLONE_FILES);
|
||||
|
|
|
@ -61,6 +61,11 @@ real-obj-m := $(foreach m, $(obj-m), $(if $(strip $($(m:.o=-objs)) $($(m:.o=-y))
|
|||
extra-y += $(dtb-y)
|
||||
extra-$(CONFIG_OF_ALL_DTBS) += $(dtb-)
|
||||
|
||||
ifneq ($(CHECK_DTBS),)
|
||||
extra-y += $(patsubst %.dtb,%.dt.yaml, $(dtb-y))
|
||||
extra-$(CONFIG_OF_ALL_DTBS) += $(patsubst %.dtb,%.dt.yaml, $(dtb-))
|
||||
endif
|
||||
|
||||
# Add subdir path
|
||||
|
||||
extra-y := $(addprefix $(obj)/,$(extra-y))
|
||||
|
@ -251,7 +256,7 @@ DTC_FLAGS += -Wno-unit_address_vs_reg \
|
|||
-Wno-avoid_unnecessary_addr_size \
|
||||
-Wno-alias_paths \
|
||||
-Wno-graph_child_address \
|
||||
-Wno-graph_port \
|
||||
-Wno-simple_bus_reg \
|
||||
-Wno-unique_unit_address \
|
||||
-Wno-pci_device_reg
|
||||
endif
|
||||
|
@ -284,13 +289,28 @@ $(obj)/%.dtb.S: $(obj)/%.dtb FORCE
|
|||
quiet_cmd_dtc = DTC $@
|
||||
cmd_dtc = mkdir -p $(dir ${dtc-tmp}) ; \
|
||||
$(HOSTCC) -E $(dtc_cpp_flags) -x assembler-with-cpp -o $(dtc-tmp) $< ; \
|
||||
$(DTC) -O dtb -o $@ -b 0 \
|
||||
$(DTC) -O $(2) -o $@ -b 0 \
|
||||
$(addprefix -i,$(dir $<) $(DTC_INCLUDE)) $(DTC_FLAGS) \
|
||||
-d $(depfile).dtc.tmp $(dtc-tmp) ; \
|
||||
cat $(depfile).pre.tmp $(depfile).dtc.tmp > $(depfile)
|
||||
|
||||
$(obj)/%.dtb: $(src)/%.dts $(DTC) FORCE
|
||||
$(call if_changed_dep,dtc)
|
||||
$(call if_changed_dep,dtc,dtb)
|
||||
|
||||
DT_CHECKER ?= dt-validate
|
||||
DT_BINDING_DIR := Documentation/devicetree/bindings
|
||||
DT_TMP_SCHEMA := $(objtree)/$(DT_BINDING_DIR)/processed-schema.yaml
|
||||
|
||||
quiet_cmd_dtb_check = CHECK $@
|
||||
cmd_dtb_check = $(DT_CHECKER) -p $(DT_TMP_SCHEMA) $@ ;
|
||||
|
||||
define rule_dtc_dt_yaml
|
||||
$(call cmd_and_fixdep,dtc,yaml) \
|
||||
$(call echo-cmd,dtb_check) $(cmd_dtb_check)
|
||||
endef
|
||||
|
||||
$(obj)/%.dt.yaml: $(src)/%.dts $(DTC) $(DT_TMP_SCHEMA) FORCE
|
||||
$(call if_changed_rule,dtc_dt_yaml)
|
||||
|
||||
dtc-tmp = $(subst $(comma),_,$(dot-target).dts.tmp)
|
||||
|
||||
|
|
|
@ -12,6 +12,10 @@ dtc-objs += dtc-lexer.lex.o dtc-parser.tab.o
|
|||
HOST_EXTRACFLAGS := -I$(src)/libfdt
|
||||
|
||||
ifeq ($(wildcard /usr/include/yaml.h),)
|
||||
ifneq ($(CHECK_DTBS),)
|
||||
$(error dtc needs libyaml for DT schema validation support. \
|
||||
Install the necessary libyaml development package.)
|
||||
endif
|
||||
HOST_EXTRACFLAGS += -DNO_YAML
|
||||
else
|
||||
dtc-objs += yamltree.o
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
*/
|
||||
|
||||
#include "dtc.h"
|
||||
#include "srcpos.h"
|
||||
|
||||
#ifdef TRACE_CHECKS
|
||||
#define TRACE(c, ...) \
|
||||
|
@ -78,23 +79,56 @@ static inline void PRINTF(5, 6) check_msg(struct check *c, struct dt_info *dti,
|
|||
const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
char *str = NULL;
|
||||
struct srcpos *pos = NULL;
|
||||
char *file_str;
|
||||
|
||||
if ((c->warn && (quiet < 1))
|
||||
|| (c->error && (quiet < 2))) {
|
||||
fprintf(stderr, "%s: %s (%s): ",
|
||||
strcmp(dti->outname, "-") ? dti->outname : "<stdout>",
|
||||
(c->error) ? "ERROR" : "Warning", c->name);
|
||||
if (node) {
|
||||
fprintf(stderr, "%s", node->fullpath);
|
||||
if (prop)
|
||||
fprintf(stderr, ":%s", prop->name);
|
||||
fputs(": ", stderr);
|
||||
}
|
||||
vfprintf(stderr, fmt, ap);
|
||||
fprintf(stderr, "\n");
|
||||
if (!(c->warn && (quiet < 1)) && !(c->error && (quiet < 2)))
|
||||
return;
|
||||
|
||||
if (prop && prop->srcpos)
|
||||
pos = prop->srcpos;
|
||||
else if (node && node->srcpos)
|
||||
pos = node->srcpos;
|
||||
|
||||
if (pos) {
|
||||
file_str = srcpos_string(pos);
|
||||
xasprintf(&str, "%s", file_str);
|
||||
free(file_str);
|
||||
} else if (streq(dti->outname, "-")) {
|
||||
xasprintf(&str, "<stdout>");
|
||||
} else {
|
||||
xasprintf(&str, "%s", dti->outname);
|
||||
}
|
||||
|
||||
xasprintf_append(&str, ": %s (%s): ",
|
||||
(c->error) ? "ERROR" : "Warning", c->name);
|
||||
|
||||
if (node) {
|
||||
if (prop)
|
||||
xasprintf_append(&str, "%s:%s: ", node->fullpath, prop->name);
|
||||
else
|
||||
xasprintf_append(&str, "%s: ", node->fullpath);
|
||||
}
|
||||
|
||||
va_start(ap, fmt);
|
||||
xavsprintf_append(&str, fmt, ap);
|
||||
va_end(ap);
|
||||
|
||||
xasprintf_append(&str, "\n");
|
||||
|
||||
if (!prop && pos) {
|
||||
pos = node->srcpos;
|
||||
while (pos->next) {
|
||||
pos = pos->next;
|
||||
|
||||
file_str = srcpos_string(pos);
|
||||
xasprintf_append(&str, " also defined at %s\n", file_str);
|
||||
free(file_str);
|
||||
}
|
||||
}
|
||||
|
||||
fputs(str, stderr);
|
||||
}
|
||||
|
||||
#define FAIL(c, dti, node, ...) \
|
||||
|
@ -910,7 +944,7 @@ static bool node_is_compatible(struct node *node, const char *compat)
|
|||
|
||||
for (str = prop->val.val, end = str + prop->val.len; str < end;
|
||||
str += strnlen(str, end - str) + 1) {
|
||||
if (strprefixeq(str, end - str, compat))
|
||||
if (streq(str, compat))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -921,7 +955,8 @@ static void check_simple_bus_bridge(struct check *c, struct dt_info *dti, struct
|
|||
if (node_is_compatible(node, "simple-bus"))
|
||||
node->bus = &simple_bus;
|
||||
}
|
||||
WARNING(simple_bus_bridge, check_simple_bus_bridge, NULL, &addr_size_cells);
|
||||
WARNING(simple_bus_bridge, check_simple_bus_bridge, NULL,
|
||||
&addr_size_cells, &compatible_is_string_list);
|
||||
|
||||
static void check_simple_bus_reg(struct check *c, struct dt_info *dti, struct node *node)
|
||||
{
|
||||
|
@ -1035,6 +1070,7 @@ static const struct bus_type spi_bus = {
|
|||
|
||||
static void check_spi_bus_bridge(struct check *c, struct dt_info *dti, struct node *node)
|
||||
{
|
||||
int spi_addr_cells = 1;
|
||||
|
||||
if (strprefixeq(node->name, node->basenamelen, "spi")) {
|
||||
node->bus = &spi_bus;
|
||||
|
@ -1063,7 +1099,9 @@ static void check_spi_bus_bridge(struct check *c, struct dt_info *dti, struct no
|
|||
if (node->bus != &spi_bus || !node->children)
|
||||
return;
|
||||
|
||||
if (node_addr_cells(node) != 1)
|
||||
if (get_property(node, "spi-slave"))
|
||||
spi_addr_cells = 0;
|
||||
if (node_addr_cells(node) != spi_addr_cells)
|
||||
FAIL(c, dti, node, "incorrect #address-cells for SPI bus");
|
||||
if (node_size_cells(node) != 0)
|
||||
FAIL(c, dti, node, "incorrect #size-cells for SPI bus");
|
||||
|
@ -1082,6 +1120,9 @@ static void check_spi_bus_reg(struct check *c, struct dt_info *dti, struct node
|
|||
if (!node->parent || (node->parent->bus != &spi_bus))
|
||||
return;
|
||||
|
||||
if (get_property(node->parent, "spi-slave"))
|
||||
return;
|
||||
|
||||
prop = get_property(node, "reg");
|
||||
if (prop)
|
||||
cells = (cell_t *)prop->val.val;
|
||||
|
|
|
@ -213,14 +213,14 @@ static void PRINTF(1, 2) lexical_error(const char *fmt, ...);
|
|||
<*>\&{LABEL} { /* label reference */
|
||||
DPRINT("Ref: %s\n", yytext+1);
|
||||
yylval.labelref = xstrdup(yytext+1);
|
||||
return DT_REF;
|
||||
return DT_LABEL_REF;
|
||||
}
|
||||
|
||||
<*>"&{/"{PATHCHAR}*\} { /* new-style path reference */
|
||||
yytext[yyleng-1] = '\0';
|
||||
DPRINT("Ref: %s\n", yytext+2);
|
||||
yylval.labelref = xstrdup(yytext+2);
|
||||
return DT_REF;
|
||||
return DT_PATH_REF;
|
||||
}
|
||||
|
||||
<BYTESTRING>[0-9a-fA-F]{2} {
|
||||
|
|
|
@ -70,7 +70,8 @@ extern bool treesource_error;
|
|||
%token <byte> DT_BYTE
|
||||
%token <data> DT_STRING
|
||||
%token <labelref> DT_LABEL
|
||||
%token <labelref> DT_REF
|
||||
%token <labelref> DT_LABEL_REF
|
||||
%token <labelref> DT_PATH_REF
|
||||
%token DT_INCBIN
|
||||
|
||||
%type <data> propdata
|
||||
|
@ -83,6 +84,7 @@ extern bool treesource_error;
|
|||
%type <data> bytestring
|
||||
%type <prop> propdef
|
||||
%type <proplist> proplist
|
||||
%type <labelref> dt_ref
|
||||
|
||||
%type <node> devicetree
|
||||
%type <node> nodedef
|
||||
|
@ -158,6 +160,8 @@ memreserve:
|
|||
}
|
||||
;
|
||||
|
||||
dt_ref: DT_LABEL_REF | DT_PATH_REF;
|
||||
|
||||
devicetree:
|
||||
'/' nodedef
|
||||
{
|
||||
|
@ -167,7 +171,7 @@ devicetree:
|
|||
{
|
||||
$$ = merge_nodes($1, $3);
|
||||
}
|
||||
| DT_REF nodedef
|
||||
| dt_ref nodedef
|
||||
{
|
||||
/*
|
||||
* We rely on the rule being always:
|
||||
|
@ -176,9 +180,12 @@ devicetree:
|
|||
*/
|
||||
if (!($<flags>-1 & DTSF_PLUGIN))
|
||||
ERROR(&@2, "Label or path %s not found", $1);
|
||||
$$ = add_orphan_node(name_node(build_node(NULL, NULL), ""), $2, $1);
|
||||
$$ = add_orphan_node(
|
||||
name_node(build_node(NULL, NULL, NULL),
|
||||
""),
|
||||
$2, $1);
|
||||
}
|
||||
| devicetree DT_LABEL DT_REF nodedef
|
||||
| devicetree DT_LABEL dt_ref nodedef
|
||||
{
|
||||
struct node *target = get_node_by_ref($1, $3);
|
||||
|
||||
|
@ -189,7 +196,7 @@ devicetree:
|
|||
ERROR(&@3, "Label or path %s not found", $3);
|
||||
$$ = $1;
|
||||
}
|
||||
| devicetree DT_REF nodedef
|
||||
| devicetree DT_PATH_REF nodedef
|
||||
{
|
||||
/*
|
||||
* We rely on the rule being always:
|
||||
|
@ -208,7 +215,26 @@ devicetree:
|
|||
}
|
||||
$$ = $1;
|
||||
}
|
||||
| devicetree DT_DEL_NODE DT_REF ';'
|
||||
| devicetree DT_LABEL_REF nodedef
|
||||
{
|
||||
struct node *target = get_node_by_ref($1, $2);
|
||||
|
||||
if (target) {
|
||||
merge_nodes(target, $3);
|
||||
} else {
|
||||
/*
|
||||
* We rely on the rule being always:
|
||||
* versioninfo plugindecl memreserves devicetree
|
||||
* so $-1 is what we want (plugindecl)
|
||||
*/
|
||||
if ($<flags>-1 & DTSF_PLUGIN)
|
||||
add_orphan_node($1, $3, $2);
|
||||
else
|
||||
ERROR(&@2, "Label or path %s not found", $2);
|
||||
}
|
||||
$$ = $1;
|
||||
}
|
||||
| devicetree DT_DEL_NODE dt_ref ';'
|
||||
{
|
||||
struct node *target = get_node_by_ref($1, $3);
|
||||
|
||||
|
@ -220,7 +246,7 @@ devicetree:
|
|||
|
||||
$$ = $1;
|
||||
}
|
||||
| devicetree DT_OMIT_NO_REF DT_REF ';'
|
||||
| devicetree DT_OMIT_NO_REF dt_ref ';'
|
||||
{
|
||||
struct node *target = get_node_by_ref($1, $3);
|
||||
|
||||
|
@ -237,7 +263,7 @@ devicetree:
|
|||
nodedef:
|
||||
'{' proplist subnodes '}' ';'
|
||||
{
|
||||
$$ = build_node($2, $3);
|
||||
$$ = build_node($2, $3, &@$);
|
||||
}
|
||||
;
|
||||
|
||||
|
@ -255,11 +281,11 @@ proplist:
|
|||
propdef:
|
||||
DT_PROPNODENAME '=' propdata ';'
|
||||
{
|
||||
$$ = build_property($1, $3);
|
||||
$$ = build_property($1, $3, &@$);
|
||||
}
|
||||
| DT_PROPNODENAME ';'
|
||||
{
|
||||
$$ = build_property($1, empty_data);
|
||||
$$ = build_property($1, empty_data, &@$);
|
||||
}
|
||||
| DT_DEL_PROP DT_PROPNODENAME ';'
|
||||
{
|
||||
|
@ -285,7 +311,7 @@ propdata:
|
|||
{
|
||||
$$ = data_merge($1, $3);
|
||||
}
|
||||
| propdataprefix DT_REF
|
||||
| propdataprefix dt_ref
|
||||
{
|
||||
$1 = data_add_marker($1, TYPE_STRING, $2);
|
||||
$$ = data_add_marker($1, REF_PATH, $2);
|
||||
|
@ -383,7 +409,7 @@ arrayprefix:
|
|||
|
||||
$$.data = data_append_integer($1.data, $2, $1.bits);
|
||||
}
|
||||
| arrayprefix DT_REF
|
||||
| arrayprefix dt_ref
|
||||
{
|
||||
uint64_t val = ~0ULL >> (64 - $1.bits);
|
||||
|
||||
|
@ -540,7 +566,7 @@ subnode:
|
|||
}
|
||||
| DT_DEL_NODE DT_PROPNODENAME ';'
|
||||
{
|
||||
$$ = name_node(build_node_delete(), $2);
|
||||
$$ = name_node(build_node_delete(&@$), $2);
|
||||
}
|
||||
| DT_OMIT_NO_REF subnode
|
||||
{
|
||||
|
|
|
@ -35,6 +35,8 @@ int phandle_format = PHANDLE_EPAPR; /* Use linux,phandle or phandle properties *
|
|||
int generate_symbols; /* enable symbols & fixup support */
|
||||
int generate_fixups; /* suppress generation of fixups on symbol support */
|
||||
int auto_label_aliases; /* auto generate labels -> aliases */
|
||||
int annotate; /* Level of annotation: 1 for input source location
|
||||
>1 for full input source location. */
|
||||
|
||||
static int is_power_of_2(int x)
|
||||
{
|
||||
|
@ -60,7 +62,7 @@ static void fill_fullpaths(struct node *tree, const char *prefix)
|
|||
|
||||
/* Usage related data. */
|
||||
static const char usage_synopsis[] = "dtc [options] <input file>";
|
||||
static const char usage_short_opts[] = "qI:O:o:V:d:R:S:p:a:fb:i:H:sW:E:@Ahv";
|
||||
static const char usage_short_opts[] = "qI:O:o:V:d:R:S:p:a:fb:i:H:sW:E:@AThv";
|
||||
static struct option const usage_long_opts[] = {
|
||||
{"quiet", no_argument, NULL, 'q'},
|
||||
{"in-format", a_argument, NULL, 'I'},
|
||||
|
@ -81,6 +83,7 @@ static struct option const usage_long_opts[] = {
|
|||
{"error", a_argument, NULL, 'E'},
|
||||
{"symbols", no_argument, NULL, '@'},
|
||||
{"auto-alias", no_argument, NULL, 'A'},
|
||||
{"annotate", no_argument, NULL, 'T'},
|
||||
{"help", no_argument, NULL, 'h'},
|
||||
{"version", no_argument, NULL, 'v'},
|
||||
{NULL, no_argument, NULL, 0x0},
|
||||
|
@ -117,6 +120,7 @@ static const char * const usage_opts_help[] = {
|
|||
"\n\tEnable/disable errors (prefix with \"no-\")",
|
||||
"\n\tEnable generation of symbols",
|
||||
"\n\tEnable auto-alias of labels",
|
||||
"\n\tAnnotate output .dts with input source file and line (-T -T for more details)",
|
||||
"\n\tPrint this help and exit",
|
||||
"\n\tPrint version and exit",
|
||||
NULL,
|
||||
|
@ -264,6 +268,9 @@ int main(int argc, char *argv[])
|
|||
case 'A':
|
||||
auto_label_aliases = 1;
|
||||
break;
|
||||
case 'T':
|
||||
annotate++;
|
||||
break;
|
||||
|
||||
case 'h':
|
||||
usage(NULL);
|
||||
|
@ -302,6 +309,8 @@ int main(int argc, char *argv[])
|
|||
outform = "dts";
|
||||
}
|
||||
}
|
||||
if (annotate && (!streq(inform, "dts") || !streq(outform, "dts")))
|
||||
die("--annotate requires -I dts -O dts\n");
|
||||
if (streq(inform, "dts"))
|
||||
dti = dt_from_source(arg);
|
||||
else if (streq(inform, "fs"))
|
||||
|
|
|
@ -58,6 +58,7 @@ extern int phandle_format; /* Use linux,phandle or phandle properties */
|
|||
extern int generate_symbols; /* generate symbols for nodes with labels */
|
||||
extern int generate_fixups; /* generate fixups */
|
||||
extern int auto_label_aliases; /* auto generate labels -> aliases */
|
||||
extern int annotate; /* annotate .dts with input source location */
|
||||
|
||||
#define PHANDLE_LEGACY 0x1
|
||||
#define PHANDLE_EPAPR 0x2
|
||||
|
@ -158,6 +159,7 @@ struct property {
|
|||
struct property *next;
|
||||
|
||||
struct label *labels;
|
||||
struct srcpos *srcpos;
|
||||
};
|
||||
|
||||
struct node {
|
||||
|
@ -177,6 +179,7 @@ struct node {
|
|||
|
||||
struct label *labels;
|
||||
const struct bus_type *bus;
|
||||
struct srcpos *srcpos;
|
||||
|
||||
bool omit_if_unused, is_referenced;
|
||||
};
|
||||
|
@ -205,13 +208,15 @@ struct node {
|
|||
void add_label(struct label **labels, char *label);
|
||||
void delete_labels(struct label **labels);
|
||||
|
||||
struct property *build_property(char *name, struct data val);
|
||||
struct property *build_property(char *name, struct data val,
|
||||
struct srcpos *srcpos);
|
||||
struct property *build_property_delete(char *name);
|
||||
struct property *chain_property(struct property *first, struct property *list);
|
||||
struct property *reverse_properties(struct property *first);
|
||||
|
||||
struct node *build_node(struct property *proplist, struct node *children);
|
||||
struct node *build_node_delete(void);
|
||||
struct node *build_node(struct property *proplist, struct node *children,
|
||||
struct srcpos *srcpos);
|
||||
struct node *build_node_delete(struct srcpos *srcpos);
|
||||
struct node *name_node(struct node *node, char *name);
|
||||
struct node *omit_node_if_unused(struct node *node);
|
||||
struct node *reference_node(struct node *node);
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue