mirror of https://gitee.com/openkylin/linux.git
DeviceTree updates for 4.5:
- Rework and export the changeset API to make it available to users other than DT overlays - ARM secure devices binding - OCTEON USB binding - Clean-up of various SRAM binding docs - Various other binding doc updates -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJWltcqAAoJEPr7XbWNvGHDDYQP/RbA05cU+CsDpknLS8LgJvpP BfIT78AeBX38V4vWzl7lGU7cZAEhZG2oljNgPflKZ60g1XCFg6jDjHvt1oU9H+ri I2I6p5r0k4dXc37X7xYtg02RpGsIpFzyRbM5gRtkwe+TZhFIjsZQazLNIrL6oU8y 0ZNDCheEUMq5oDadYraEWctfp3vNgSAzXlJ4I0IrXwb5hYBtBdAXKw5S3OPYl/m9 lcvoMjw8i8KY97frElZ3DTjjOd11ZTA3L6kwmTdlgmRqUZAMTXVZJiwk787YLGpd 6qjfOURa5/aefltXSS+SG3N6v9AeBgssRYtXy6s09/adqqv6ygSqgGPmxwxSgZOT gVqZ/ARhlvDlYIqPr6IfLhRLPZQ36GbPZOksMpZH0emQicu5+Uht+bYFFugDgs9f Zmwa59fmRIBvg10H6+SvaCSXKk3gRtovAdLOLO9HInarmCL7G1VfU1d8O/2fkPQY drHh/yS7fP91/DvxhN8Z2AKAURqv+BVZhmwGe36+Zucaph3yI8EAQSiypuGvxdHo e7U08hm1G1kmII38y+RyjqqXQFiXCLZ19QEcTTb1sPIwNfkuCc1rft0bGypqfIjw KK98TyG7eBAuf53zW8xRojGeYyku/w2GRsrGWdJrgVqghsy4INbBXkzLXDj14i7O BiPisfrIyAqViqWGI6eJ =LW4w -----END PGP SIGNATURE----- Merge tag 'devicetree-for-4.5' of git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux Pull DeviceTree updates from Rob Herring: - Rework and export the changeset API to make it available to users other than DT overlays - ARM secure devices binding - OCTEON USB binding - Clean-up of various SRAM binding docs - Various other binding doc updates * tag 'devicetree-for-4.5' of git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux: (21 commits) drivers/of: Export OF changeset functions Fix documentation for adp1653 DT ARM: psci: Fix indentation in DT bindings of/platform: export of_default_bus_match_table of/unittest: Show broken behaviour in the platform bus of: fix declaration of of_io_request_and_map of/address: replace printk(KERN_ERR ...) with pr_err(...) of/irq: optimize device node matching loop in of_irq_init() dt-bindings: tda998x: Document the required 'port' node. net/macb: bindings doc: Merge cdns-emac to macb dt-bindings: Misc fix for the ATH79 DDR controllers dt-bindings: Misc fix for the ATH79 MISC interrupt controllers Documentation: dt: Add bindings for Secure-only devices dt-bindings: ARM: add arm,cortex-a72 compatible string ASoC: Atmel: ClassD: add GCK's parent clock in DT binding DT: add Olimex to vendor prefixes Documentation: fsl-quadspi: Add fsl,ls1021-qspi compatible string Documentation/devicetree: document OCTEON USB bindings usb: misc: usb3503: Describe better how to bind clock to the hub dt-bindings: Consolidate SRAM bindings from all vendors ...
This commit is contained in:
commit
5339f9d4c2
|
@ -63,7 +63,7 @@ Required properties:
|
|||
- compatible : should be "arm,juno-sram-ns" for Non-secure SRAM on Juno
|
||||
|
||||
The rest of the properties should follow the generic mmio-sram description
|
||||
found in ../../misc/sysram.txt
|
||||
found in ../../sram/sram.txt
|
||||
|
||||
Each sub-node represents the reserved area for SCPI.
|
||||
|
||||
|
|
|
@ -157,6 +157,7 @@ nodes to be present and contain the properties described below.
|
|||
"arm,cortex-a17"
|
||||
"arm,cortex-a53"
|
||||
"arm,cortex-a57"
|
||||
"arm,cortex-a72"
|
||||
"arm,cortex-m0"
|
||||
"arm,cortex-m0+"
|
||||
"arm,cortex-m1"
|
||||
|
|
|
@ -23,17 +23,20 @@ Main node required properties:
|
|||
|
||||
- compatible : should contain at least one of:
|
||||
|
||||
* "arm,psci" : for implementations complying to PSCI versions prior to
|
||||
0.2. For these cases function IDs must be provided.
|
||||
* "arm,psci" : For implementations complying to PSCI versions prior
|
||||
to 0.2.
|
||||
For these cases function IDs must be provided.
|
||||
|
||||
* "arm,psci-0.2" : for implementations complying to PSCI 0.2. Function
|
||||
IDs are not required and should be ignored by an OS with PSCI 0.2
|
||||
support, but are permitted to be present for compatibility with
|
||||
existing software when "arm,psci" is later in the compatible list.
|
||||
* "arm,psci-0.2" : For implementations complying to PSCI 0.2.
|
||||
Function IDs are not required and should be ignored by
|
||||
an OS with PSCI 0.2 support, but are permitted to be
|
||||
present for compatibility with existing software when
|
||||
"arm,psci" is later in the compatible list.
|
||||
|
||||
* "arm,psci-1.0" : for implementations complying to PSCI 1.0. PSCI 1.0 is
|
||||
backward compatible with PSCI 0.2 with minor specification updates,
|
||||
as defined in the PSCI specification[2].
|
||||
* "arm,psci-1.0" : For implementations complying to PSCI 1.0.
|
||||
PSCI 1.0 is backward compatible with PSCI 0.2 with
|
||||
minor specification updates, as defined in the PSCI
|
||||
specification[2].
|
||||
|
||||
- method : The method of calling the PSCI firmware. Permitted
|
||||
values are:
|
||||
|
|
|
@ -0,0 +1,53 @@
|
|||
* ARM Secure world bindings
|
||||
|
||||
ARM CPUs with TrustZone support have two distinct address spaces,
|
||||
"Normal" and "Secure". Most devicetree consumers (including the Linux
|
||||
kernel) are not TrustZone aware and run entirely in either the Normal
|
||||
world or the Secure world. However some devicetree consumers are
|
||||
TrustZone aware and need to be able to determine whether devices are
|
||||
visible only in the Secure address space, only in the Normal address
|
||||
space, or visible in both. (One example of that situation would be a
|
||||
virtual machine which boots Secure firmware and wants to tell the
|
||||
firmware about the layout of the machine via devicetree.)
|
||||
|
||||
The general principle of the naming scheme for Secure world bindings
|
||||
is that any property that needs a different value in the Secure world
|
||||
can be supported by prefixing the property name with "secure-". So for
|
||||
instance "secure-foo" would override "foo". For property names with
|
||||
a vendor prefix, the Secure variant of "vendor,foo" would be
|
||||
"vendor,secure-foo". If there is no "secure-" property then the Secure
|
||||
world value is the same as specified for the Normal world by the
|
||||
non-prefixed property. However, only the properties listed below may
|
||||
validly have "secure-" versions; this list will be enlarged on a
|
||||
case-by-case basis.
|
||||
|
||||
Defining the bindings in this way means that a device tree which has
|
||||
been annotated to indicate the presence of Secure-only devices can
|
||||
still be processed unmodified by existing Non-secure software (and in
|
||||
particular by the kernel).
|
||||
|
||||
Note that it is still valid for bindings intended for purely Secure
|
||||
world consumers (like kernels that run entirely in Secure) to simply
|
||||
describe the view of Secure world using the standard bindings. These
|
||||
secure- bindings only need to be used where both the Secure and Normal
|
||||
world views need to be described in a single device tree.
|
||||
|
||||
Valid Secure world properties:
|
||||
|
||||
- secure-status : specifies whether the device is present and usable
|
||||
in the secure world. The combination of this with "status" allows
|
||||
the various possible combinations of device visibility to be
|
||||
specified. If "secure-status" is not specified it defaults to the
|
||||
same value as "status"; if "status" is not specified either then
|
||||
both default to "okay". This means the following combinations are
|
||||
possible:
|
||||
|
||||
/* Neither specified: default to visible in both S and NS */
|
||||
secure-status = "okay"; /* visible in both */
|
||||
status = "okay"; /* visible in both */
|
||||
status = "okay"; secure-status = "okay"; /* visible in both */
|
||||
secure-status = "disabled"; /* NS-only */
|
||||
status = "okay"; secure-status = "disabled"; /* NS-only */
|
||||
status = "disabled"; secure-status = "okay"; /* S-only */
|
||||
status = "disabled"; /* disabled in both */
|
||||
status = "disabled"; secure-status = "disabled"; /* disabled in both */
|
|
@ -5,6 +5,10 @@ Required properties;
|
|||
|
||||
- reg: I2C address
|
||||
|
||||
Required node:
|
||||
- port: Input port node with endpoint definition, as described
|
||||
in Documentation/devicetree/bindings/graph.txt
|
||||
|
||||
Optional properties:
|
||||
- interrupts: interrupt number and trigger type
|
||||
default: polling
|
||||
|
|
|
@ -22,7 +22,7 @@ Interrupt Controllers bindings used by client devices.
|
|||
Example:
|
||||
|
||||
interrupt-controller@18060010 {
|
||||
compatible = "qca,ar9132-misc-intc", qca,ar7100-misc-intc";
|
||||
compatible = "qca,ar9132-misc-intc", "qca,ar7100-misc-intc";
|
||||
reg = <0x18060010 0x4>;
|
||||
|
||||
interrupt-parent = <&cpuintc>;
|
||||
|
|
|
@ -12,12 +12,13 @@ There are two LED outputs available - flash and indicator. One LED is
|
|||
represented by one child node, nodes need to be named "flash" and "indicator".
|
||||
|
||||
Required properties of the LED child node:
|
||||
- max-microamp : see Documentation/devicetree/bindings/leds/common.txt
|
||||
- led-max-microamp : see Documentation/devicetree/bindings/leds/common.txt
|
||||
|
||||
Required properties of the flash LED child node:
|
||||
|
||||
- flash-max-microamp : see Documentation/devicetree/bindings/leds/common.txt
|
||||
- flash-timeout-us : see Documentation/devicetree/bindings/leds/common.txt
|
||||
- led-max-microamp : see Documentation/devicetree/bindings/leds/common.txt
|
||||
|
||||
Example:
|
||||
|
||||
|
@ -29,9 +30,9 @@ Example:
|
|||
flash {
|
||||
flash-timeout-us = <500000>;
|
||||
flash-max-microamp = <320000>;
|
||||
max-microamp = <50000>;
|
||||
led-max-microamp = <50000>;
|
||||
};
|
||||
indicator {
|
||||
max-microamp = <17500>;
|
||||
led-max-microamp = <17500>;
|
||||
};
|
||||
};
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
Binding for Qualcomm Atheros AR7xxx/AR9xxx DDR controller
|
||||
|
||||
The DDR controller of the ARxxx and AR9xxx families provides an interface
|
||||
The DDR controller of the AR7xxx and AR9xxx families provides an interface
|
||||
to flush the FIFO between various devices and the DDR. This is mainly used
|
||||
by the IRQ controller to flush the FIFO before running the interrupt handler
|
||||
of such devices.
|
||||
|
@ -11,9 +11,9 @@ Required properties:
|
|||
"qca,[ar7100|ar7240]-ddr-controller" as fallback.
|
||||
On SoC with PCI support "qca,ar7100-ddr-controller" should be used as
|
||||
fallback, otherwise "qca,ar7240-ddr-controller" should be used.
|
||||
- reg: Base address and size of the controllers memory area
|
||||
- #qca,ddr-wb-channel-cells: has to be 1, the index of the write buffer
|
||||
channel
|
||||
- reg: Base address and size of the controller's memory area
|
||||
- #qca,ddr-wb-channel-cells: Specifies the number of cells needed to encode
|
||||
the write buffer channel index, should be 1.
|
||||
|
||||
Example:
|
||||
|
||||
|
|
|
@ -2,7 +2,8 @@
|
|||
|
||||
Required properties:
|
||||
- compatible : Should be "fsl,vf610-qspi", "fsl,imx6sx-qspi",
|
||||
"fsl,imx7d-qspi", "fsl,imx6ul-qspi"
|
||||
"fsl,imx7d-qspi", "fsl,imx6ul-qspi",
|
||||
"fsl,ls1021-qspi"
|
||||
- reg : the first contains the register location and length,
|
||||
the second contains the memory mapping address and length
|
||||
- reg-names: Should contain the reg names "QuadSPI" and "QuadSPI-memory"
|
||||
|
|
|
@ -1,20 +0,0 @@
|
|||
* Cadence EMAC Ethernet controller
|
||||
|
||||
Required properties:
|
||||
- compatible: Should be "cdns,[<chip>-]{emac}"
|
||||
Use "cdns,at91rm9200-emac" Atmel at91rm9200 SoC.
|
||||
Use "cdns,zynq-gem" Xilinx Zynq-7xxx SoC.
|
||||
Or the generic form: "cdns,emac".
|
||||
- reg: Address and length of the register set for the device
|
||||
- interrupts: Should contain macb interrupt
|
||||
- phy-mode: see ethernet.txt file in the same directory.
|
||||
|
||||
Examples:
|
||||
|
||||
macb0: ethernet@fffc4000 {
|
||||
compatible = "cdns,at91rm9200-emac";
|
||||
reg = <0xfffc4000 0x4000>;
|
||||
interrupts = <21>;
|
||||
phy-mode = "rmii";
|
||||
local-mac-address = [3a 0e 03 04 05 06];
|
||||
};
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
Required properties:
|
||||
- compatible: Should be "cdns,[<chip>-]{macb|gem}"
|
||||
Use "cdns,at91rm9200-emac" Atmel at91rm9200 SoC.
|
||||
Use "cdns,at91sam9260-macb" for Atmel at91sam9 SoCs or the 10/100Mbit IP
|
||||
available on sama5d3 SoCs.
|
||||
Use "cdns,np4-macb" for NP4 SoC devices.
|
||||
|
@ -11,7 +12,9 @@ Required properties:
|
|||
Use "atmel,sama5d2-gem" for the GEM IP (10/100) available on Atmel sama5d2 SoCs.
|
||||
Use "atmel,sama5d3-gem" for the Gigabit IP available on Atmel sama5d3 SoCs.
|
||||
Use "atmel,sama5d4-gem" for the GEM IP (10/100) available on Atmel sama5d4 SoCs.
|
||||
Use "cdns,zynq-gem" Xilinx Zynq-7xxx SoC.
|
||||
Use "cdns,zynqmp-gem" for Zynq Ultrascale+ MPSoC.
|
||||
Or the generic form: "cdns,emac".
|
||||
- reg: Address and length of the register set for the device
|
||||
- interrupts: Should contain macb interrupt
|
||||
- phy-mode: See ethernet.txt file in the same directory.
|
||||
|
|
|
@ -16,6 +16,10 @@ Required properties:
|
|||
Required elements: "pclk", "gclk" and "aclk".
|
||||
- clocks
|
||||
Please refer to clock-bindings.txt.
|
||||
- assigned-clocks
|
||||
Should be <&classd_gclk>.
|
||||
- assigned-clock-parents
|
||||
Should be <&audio_pll_pmc>.
|
||||
|
||||
Optional properties:
|
||||
- pinctrl-names, pinctrl-0
|
||||
|
@ -43,6 +47,8 @@ classd: classd@fc048000 {
|
|||
dma-names = "tx";
|
||||
clocks = <&classd_clk>, <&classd_gclk>, <&audio_pll_pmc>;
|
||||
clock-names = "pclk", "gclk", "aclk";
|
||||
assigned-clocks = <&classd_gclk>;
|
||||
assigned-clock-parents = <&audio_pll_pmc>;
|
||||
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_classd_default>;
|
||||
|
|
|
@ -12,7 +12,7 @@ Required sub-node properties:
|
|||
- compatible : should be "rockchip,rk3066-smp-sram"
|
||||
|
||||
The rest of the properties should follow the generic mmio-sram discription
|
||||
found in ../../misc/sram.txt
|
||||
found in Documentation/devicetree/bindings/sram/sram.txt
|
||||
|
||||
Example:
|
||||
|
|
@ -15,7 +15,7 @@ Required sub-node properties:
|
|||
"samsung,exynos4210-sysram-ns" : for Non-secure SYSRAM
|
||||
|
||||
The rest of the properties should follow the generic mmio-sram discription
|
||||
found in ../../misc/sysram.txt
|
||||
found in Documentation/devicetree/bindings/sram/sram.txt
|
||||
|
||||
Example:
|
||||
|
|
@ -16,7 +16,7 @@ SRAM nodes
|
|||
----------
|
||||
|
||||
Each SRAM is described using the mmio-sram bindings documented in
|
||||
Documentation/devicetree/bindings/misc/sram.txt
|
||||
Documentation/devicetree/bindings/sram/sram.txt
|
||||
|
||||
Each SRAM will have SRAM sections that are going to be handled by the
|
||||
SRAM controller as subnodes. These sections are represented following
|
|
@ -0,0 +1,62 @@
|
|||
OCTEON/OCTEON+ USB BLOCK
|
||||
|
||||
1) Main node
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible: must be "cavium,octeon-5750-usbn"
|
||||
|
||||
- reg: specifies the physical base address of the USBN block and
|
||||
the length of the memory mapped region.
|
||||
|
||||
- #address-cells: specifies the number of cells needed to encode an
|
||||
address. The value must be 2.
|
||||
|
||||
- #size-cells: specifies the number of cells used to represent the size
|
||||
of an address. The value must be 2.
|
||||
|
||||
- ranges: specifies the translation between child address space and parent
|
||||
address space.
|
||||
|
||||
- clock-frequency: speed of the USB reference clock. Allowed values are
|
||||
12000000, 24000000 or 48000000.
|
||||
|
||||
- cavium,refclk-type: type of the USB reference clock. Allowed values are
|
||||
"crystal" or "external".
|
||||
|
||||
- refclk-frequency: deprecated, use "clock-frequency".
|
||||
|
||||
- refclk-type: deprecated, use "cavium,refclk-type".
|
||||
|
||||
2) Child node
|
||||
|
||||
The main node must have one child node which describes the built-in
|
||||
USB controller.
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible: must be "cavium,octeon-5750-usbc"
|
||||
|
||||
- reg: specifies the physical base address of the USBC block and
|
||||
the length of the memory mapped region.
|
||||
|
||||
- interrupts: specifies the interrupt number for the USB controller.
|
||||
|
||||
3) Example:
|
||||
|
||||
usbn: usbn@1180068000000 {
|
||||
compatible = "cavium,octeon-5750-usbn";
|
||||
reg = <0x11800 0x68000000 0x0 0x1000>;
|
||||
ranges; /* Direct mapping */
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
clock-frequency = <12000000>;
|
||||
cavium,refclk-type = "crystal";
|
||||
|
||||
usbc@16f0010000000 {
|
||||
compatible = "cavium,octeon-5750-usbc";
|
||||
reg = <0x16f00 0x10000000 0x0 0x80000>;
|
||||
interrupts = <0 56>;
|
||||
};
|
||||
};
|
||||
|
|
@ -18,7 +18,8 @@ Optional properties:
|
|||
- refclk: Clock used for driving REFCLK signal (optional, if not provided
|
||||
the driver assumes that clock signal is always available, its
|
||||
rate is specified by REF_SEL pins and a value from the primary
|
||||
reference clock frequencies table is used)
|
||||
reference clock frequencies table is used). Use clocks and
|
||||
clock-names in order to assign it
|
||||
- refclk-frequency: Frequency of the REFCLK signal as defined by REF_SEL
|
||||
pins (optional, if not provided, driver will not set rate of the
|
||||
REFCLK signal and assume that a value from the primary reference
|
||||
|
@ -33,4 +34,6 @@ Examples:
|
|||
intn-gpios = <&gpx3 4 1>;
|
||||
reset-gpios = <&gpx3 5 1>;
|
||||
initial-mode = <1>;
|
||||
clocks = <&clks 80>;
|
||||
clock-names = "refclk";
|
||||
};
|
||||
|
|
|
@ -161,6 +161,7 @@ nuvoton Nuvoton Technology Corporation
|
|||
nvidia NVIDIA
|
||||
nxp NXP Semiconductors
|
||||
okaya Okaya Electric America, Inc.
|
||||
olimex OLIMEX Ltd.
|
||||
onnn ON Semiconductor Corp.
|
||||
opencores OpenCores.org
|
||||
option Option NV
|
||||
|
|
|
@ -597,7 +597,7 @@ static u64 __of_translate_address(struct device_node *dev,
|
|||
pbus = of_match_bus(parent);
|
||||
pbus->count_cells(dev, &pna, &pns);
|
||||
if (!OF_CHECK_COUNTS(pna, pns)) {
|
||||
printk(KERN_ERR "prom_parse: Bad cell count for %s\n",
|
||||
pr_err("prom_parse: Bad cell count for %s\n",
|
||||
of_node_full_name(dev));
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -646,6 +646,7 @@ void of_changeset_init(struct of_changeset *ocs)
|
|||
memset(ocs, 0, sizeof(*ocs));
|
||||
INIT_LIST_HEAD(&ocs->entries);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(of_changeset_init);
|
||||
|
||||
/**
|
||||
* of_changeset_destroy - Destroy a changeset
|
||||
|
@ -662,20 +663,9 @@ void of_changeset_destroy(struct of_changeset *ocs)
|
|||
list_for_each_entry_safe_reverse(ce, cen, &ocs->entries, node)
|
||||
__of_changeset_entry_destroy(ce);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(of_changeset_destroy);
|
||||
|
||||
/**
|
||||
* of_changeset_apply - Applies a changeset
|
||||
*
|
||||
* @ocs: changeset pointer
|
||||
*
|
||||
* Applies a changeset to the live tree.
|
||||
* Any side-effects of live tree state changes are applied here on
|
||||
* sucess, like creation/destruction of devices and side-effects
|
||||
* like creation of sysfs properties and directories.
|
||||
* Returns 0 on success, a negative error value in case of an error.
|
||||
* On error the partially applied effects are reverted.
|
||||
*/
|
||||
int of_changeset_apply(struct of_changeset *ocs)
|
||||
int __of_changeset_apply(struct of_changeset *ocs)
|
||||
{
|
||||
struct of_changeset_entry *ce;
|
||||
int ret;
|
||||
|
@ -704,17 +694,30 @@ int of_changeset_apply(struct of_changeset *ocs)
|
|||
}
|
||||
|
||||
/**
|
||||
* of_changeset_revert - Reverts an applied changeset
|
||||
* of_changeset_apply - Applies a changeset
|
||||
*
|
||||
* @ocs: changeset pointer
|
||||
*
|
||||
* Reverts a changeset returning the state of the tree to what it
|
||||
* was before the application.
|
||||
* Any side-effects like creation/destruction of devices and
|
||||
* removal of sysfs properties and directories are applied.
|
||||
* Applies a changeset to the live tree.
|
||||
* Any side-effects of live tree state changes are applied here on
|
||||
* success, like creation/destruction of devices and side-effects
|
||||
* like creation of sysfs properties and directories.
|
||||
* Returns 0 on success, a negative error value in case of an error.
|
||||
* On error the partially applied effects are reverted.
|
||||
*/
|
||||
int of_changeset_revert(struct of_changeset *ocs)
|
||||
int of_changeset_apply(struct of_changeset *ocs)
|
||||
{
|
||||
int ret;
|
||||
|
||||
mutex_lock(&of_mutex);
|
||||
ret = __of_changeset_apply(ocs);
|
||||
mutex_unlock(&of_mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(of_changeset_apply);
|
||||
|
||||
int __of_changeset_revert(struct of_changeset *ocs)
|
||||
{
|
||||
struct of_changeset_entry *ce;
|
||||
int ret;
|
||||
|
@ -741,6 +744,29 @@ int of_changeset_revert(struct of_changeset *ocs)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* of_changeset_revert - Reverts an applied changeset
|
||||
*
|
||||
* @ocs: changeset pointer
|
||||
*
|
||||
* Reverts a changeset returning the state of the tree to what it
|
||||
* was before the application.
|
||||
* Any side-effects like creation/destruction of devices and
|
||||
* removal of sysfs properties and directories are applied.
|
||||
* Returns 0 on success, a negative error value in case of an error.
|
||||
*/
|
||||
int of_changeset_revert(struct of_changeset *ocs)
|
||||
{
|
||||
int ret;
|
||||
|
||||
mutex_lock(&of_mutex);
|
||||
ret = __of_changeset_revert(ocs);
|
||||
mutex_unlock(&of_mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(of_changeset_revert);
|
||||
|
||||
/**
|
||||
* of_changeset_action - Perform a changeset action
|
||||
*
|
||||
|
@ -779,3 +805,4 @@ int of_changeset_action(struct of_changeset *ocs, unsigned long action,
|
|||
list_add_tail(&ce->node, &ocs->entries);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(of_changeset_action);
|
||||
|
|
|
@ -473,6 +473,7 @@ EXPORT_SYMBOL_GPL(of_irq_to_resource_table);
|
|||
|
||||
struct of_intc_desc {
|
||||
struct list_head list;
|
||||
of_irq_init_cb_t irq_init_cb;
|
||||
struct device_node *dev;
|
||||
struct device_node *interrupt_parent;
|
||||
};
|
||||
|
@ -486,6 +487,7 @@ struct of_intc_desc {
|
|||
*/
|
||||
void __init of_irq_init(const struct of_device_id *matches)
|
||||
{
|
||||
const struct of_device_id *match;
|
||||
struct device_node *np, *parent = NULL;
|
||||
struct of_intc_desc *desc, *temp_desc;
|
||||
struct list_head intc_desc_list, intc_parent_list;
|
||||
|
@ -493,10 +495,15 @@ void __init of_irq_init(const struct of_device_id *matches)
|
|||
INIT_LIST_HEAD(&intc_desc_list);
|
||||
INIT_LIST_HEAD(&intc_parent_list);
|
||||
|
||||
for_each_matching_node(np, matches) {
|
||||
for_each_matching_node_and_match(np, matches, &match) {
|
||||
if (!of_find_property(np, "interrupt-controller", NULL) ||
|
||||
!of_device_is_available(np))
|
||||
continue;
|
||||
|
||||
if (WARN(!match->data, "of_irq_init: no init function for %s\n",
|
||||
match->compatible))
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Here, we allocate and populate an of_intc_desc with the node
|
||||
* pointer, interrupt-parent device_node etc.
|
||||
|
@ -507,6 +514,7 @@ void __init of_irq_init(const struct of_device_id *matches)
|
|||
goto err;
|
||||
}
|
||||
|
||||
desc->irq_init_cb = match->data;
|
||||
desc->dev = of_node_get(np);
|
||||
desc->interrupt_parent = of_irq_find_parent(np);
|
||||
if (desc->interrupt_parent == np)
|
||||
|
@ -526,27 +534,18 @@ void __init of_irq_init(const struct of_device_id *matches)
|
|||
* The assumption is that NULL parent means a root controller.
|
||||
*/
|
||||
list_for_each_entry_safe(desc, temp_desc, &intc_desc_list, list) {
|
||||
const struct of_device_id *match;
|
||||
int ret;
|
||||
of_irq_init_cb_t irq_init_cb;
|
||||
|
||||
if (desc->interrupt_parent != parent)
|
||||
continue;
|
||||
|
||||
list_del(&desc->list);
|
||||
match = of_match_node(matches, desc->dev);
|
||||
if (WARN(!match->data,
|
||||
"of_irq_init: no init function for %s\n",
|
||||
match->compatible)) {
|
||||
kfree(desc);
|
||||
continue;
|
||||
}
|
||||
|
||||
pr_debug("of_irq_init: init %s @ %p, parent %p\n",
|
||||
match->compatible,
|
||||
pr_debug("of_irq_init: init %s (%p), parent %p\n",
|
||||
desc->dev->full_name,
|
||||
desc->dev, desc->interrupt_parent);
|
||||
irq_init_cb = (of_irq_init_cb_t)match->data;
|
||||
ret = irq_init_cb(desc->dev, desc->interrupt_parent);
|
||||
ret = desc->irq_init_cb(desc->dev,
|
||||
desc->interrupt_parent);
|
||||
if (ret) {
|
||||
kfree(desc);
|
||||
continue;
|
||||
|
|
|
@ -45,6 +45,8 @@ static inline struct device_node *kobj_to_device_node(struct kobject *kobj)
|
|||
extern int of_property_notify(int action, struct device_node *np,
|
||||
struct property *prop, struct property *old_prop);
|
||||
extern void of_node_release(struct kobject *kobj);
|
||||
extern int __of_changeset_apply(struct of_changeset *ocs);
|
||||
extern int __of_changeset_revert(struct of_changeset *ocs);
|
||||
#else /* CONFIG_OF_DYNAMIC */
|
||||
static inline int of_property_notify(int action, struct device_node *np,
|
||||
struct property *prop, struct property *old_prop)
|
||||
|
|
|
@ -379,9 +379,9 @@ int of_overlay_create(struct device_node *tree)
|
|||
}
|
||||
|
||||
/* apply the changeset */
|
||||
err = of_changeset_apply(&ov->cset);
|
||||
err = __of_changeset_apply(&ov->cset);
|
||||
if (err) {
|
||||
pr_err("%s: of_changeset_apply() failed for tree@%s\n",
|
||||
pr_err("%s: __of_changeset_apply() failed for tree@%s\n",
|
||||
__func__, tree->full_name);
|
||||
goto err_revert_overlay;
|
||||
}
|
||||
|
@ -511,7 +511,7 @@ int of_overlay_destroy(int id)
|
|||
|
||||
|
||||
list_del(&ov->node);
|
||||
of_changeset_revert(&ov->cset);
|
||||
__of_changeset_revert(&ov->cset);
|
||||
of_free_overlay_info(ov);
|
||||
idr_remove(&ov_idr, id);
|
||||
of_changeset_destroy(&ov->cset);
|
||||
|
@ -542,7 +542,7 @@ int of_overlay_destroy_all(void)
|
|||
/* the tail of list is guaranteed to be safe to remove */
|
||||
list_for_each_entry_safe_reverse(ov, ovn, &ov_list, node) {
|
||||
list_del(&ov->node);
|
||||
of_changeset_revert(&ov->cset);
|
||||
__of_changeset_revert(&ov->cset);
|
||||
of_free_overlay_info(ov);
|
||||
idr_remove(&ov_idr, ov->id);
|
||||
kfree(ov);
|
||||
|
|
|
@ -31,6 +31,7 @@ const struct of_device_id of_default_bus_match_table[] = {
|
|||
#endif /* CONFIG_ARM_AMBA */
|
||||
{} /* Empty terminated list */
|
||||
};
|
||||
EXPORT_SYMBOL(of_default_bus_match_table);
|
||||
|
||||
static int of_dev_node_match(struct device *dev, void *data)
|
||||
{
|
||||
|
|
|
@ -530,18 +530,14 @@ static void __init of_unittest_changeset(void)
|
|||
unittest(!of_changeset_add_property(&chgset, parent, ppadd), "fail add prop\n");
|
||||
unittest(!of_changeset_update_property(&chgset, parent, ppupdate), "fail update prop\n");
|
||||
unittest(!of_changeset_remove_property(&chgset, parent, ppremove), "fail remove prop\n");
|
||||
mutex_lock(&of_mutex);
|
||||
unittest(!of_changeset_apply(&chgset), "apply failed\n");
|
||||
mutex_unlock(&of_mutex);
|
||||
|
||||
/* Make sure node names are constructed correctly */
|
||||
unittest((np = of_find_node_by_path("/testcase-data/changeset/n2/n21")),
|
||||
"'%s' not added\n", n21->full_name);
|
||||
of_node_put(np);
|
||||
|
||||
mutex_lock(&of_mutex);
|
||||
unittest(!of_changeset_revert(&chgset), "revert failed\n");
|
||||
mutex_unlock(&of_mutex);
|
||||
|
||||
of_changeset_destroy(&chgset);
|
||||
#endif
|
||||
|
@ -757,6 +753,11 @@ static void __init of_unittest_match_node(void)
|
|||
}
|
||||
}
|
||||
|
||||
static struct resource test_bus_res = {
|
||||
.start = 0xfffffff8,
|
||||
.end = 0xfffffff9,
|
||||
.flags = IORESOURCE_MEM,
|
||||
};
|
||||
static const struct platform_device_info test_bus_info = {
|
||||
.name = "unittest-bus",
|
||||
};
|
||||
|
@ -800,6 +801,15 @@ static void __init of_unittest_platform_populate(void)
|
|||
return;
|
||||
test_bus->dev.of_node = np;
|
||||
|
||||
/*
|
||||
* Add a dummy resource to the test bus node after it is
|
||||
* registered to catch problems with un-inserted resources. The
|
||||
* DT code doesn't insert the resources, and it has caused the
|
||||
* kernel to oops in the past. This makes sure the same bug
|
||||
* doesn't crop up again.
|
||||
*/
|
||||
platform_device_add_resources(test_bus, &test_bus_res, 1);
|
||||
|
||||
of_platform_populate(np, match, NULL, &test_bus->dev);
|
||||
for_each_child_of_node(np, child) {
|
||||
for_each_child_of_node(child, grandchild)
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
#include <linux/ioport.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
struct of_pci_range_parser {
|
||||
struct device_node *node;
|
||||
|
@ -36,6 +37,8 @@ extern struct device_node *of_find_matching_node_by_address(
|
|||
const struct of_device_id *matches,
|
||||
u64 base_address);
|
||||
extern void __iomem *of_iomap(struct device_node *device, int index);
|
||||
void __iomem *of_io_request_and_map(struct device_node *device,
|
||||
int index, const char *name);
|
||||
|
||||
/* Extract an address from a device, returns the region size and
|
||||
* the address space flags too. The PCI version uses a BAR number
|
||||
|
@ -57,6 +60,11 @@ extern int of_dma_get_range(struct device_node *np, u64 *dma_addr,
|
|||
u64 *paddr, u64 *size);
|
||||
extern bool of_dma_is_coherent(struct device_node *np);
|
||||
#else /* CONFIG_OF_ADDRESS */
|
||||
static inline void __iomem *of_io_request_and_map(struct device_node *device,
|
||||
int index, const char *name)
|
||||
{
|
||||
return IOMEM_ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
static inline u64 of_translate_address(struct device_node *np,
|
||||
const __be32 *addr)
|
||||
|
@ -112,12 +120,7 @@ static inline bool of_dma_is_coherent(struct device_node *np)
|
|||
extern int of_address_to_resource(struct device_node *dev, int index,
|
||||
struct resource *r);
|
||||
void __iomem *of_iomap(struct device_node *node, int index);
|
||||
void __iomem *of_io_request_and_map(struct device_node *device,
|
||||
int index, const char *name);
|
||||
#else
|
||||
|
||||
#include <linux/io.h>
|
||||
|
||||
static inline int of_address_to_resource(struct device_node *dev, int index,
|
||||
struct resource *r)
|
||||
{
|
||||
|
@ -128,12 +131,6 @@ static inline void __iomem *of_iomap(struct device_node *device, int index)
|
|||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline void __iomem *of_io_request_and_map(struct device_node *device,
|
||||
int index, const char *name)
|
||||
{
|
||||
return IOMEM_ERR_PTR(-EINVAL);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_OF_ADDRESS) && defined(CONFIG_PCI)
|
||||
|
|
Loading…
Reference in New Issue