Devicetree changes for v4.1

devicetree changes queued up for v4.1. Here are the highlights:
 - Lots of unittest cleanup from Frank Rowand
 - Bugfixes and updates to the of_graph code
 - Tighten up of_get_mac_address() code
 - Documentation updates
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1
 
 iQIcBAABAgAGBQJVMYiQAAoJEMWQL496c2LNyrcP/2acOKeyHk7zBVWxaYe6nO52
 iwpDb+UDEdW+1Cx5e+OpF1gqoY7lJ2Q+Uvm65+z00a46Fnl0cWuSYFIV7e0wjE5/
 3EAB4cQgiCzToDnbtCu4U6XlpNlQz/q85tV9X/EpYApHNb+BKN6RMzyIDm48lzJY
 L6SG4fxFJVpeDxweZFGaWE9/Ildr4vOS+4GZpE0Az3iX2WDrQPioKjuOw8TeUHRO
 xwvfv1TpyQFa2qHZLI4AmZSN8VJBw82OuAyZHAGsE4bekfafeqVFt0ZtYYoiAbIM
 rw+dUCnWARc7gm8z2PaYnZGs8O++Flb03clDeFrdrvfZIewXWEkZ1TxrKIb9bLyP
 A8tlSnbnCdXYSzyaFYH2TgUtc7gQosssfImuJjUq1qQkeEitLP6VzEsekN1h6sx7
 axFiBdiCXPvn8ti+AlK9tYfSM0ZhAzvfpuLM0hpTAk3De3NfbJQiyp6eyXAInLne
 cs9RGPXNPuKX0tISZ29vA8tmOSrDInfeEEW/Lqu4l+HedcLssWjReY0xVsZS3pbi
 xGiD5/Ztdha9keTIQdW+7R0SE1YsZTpwZbQt0HeHcE+pzFPF/3TLIIIYhYRVSPsm
 D+g5W+bVxht8NC380UEC8vpAyP1CYSnq/aVrDfJiXZVOS7b/dyZDk6Y6LSBOm9Em
 9qLaPASncxVinaNcGlyj
 =u6Zy
 -----END PGP SIGNATURE-----

Merge tag 'devicetree-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/glikely/linux

Pull devicetree changes from Grant Likely:
 "Here are the devicetree changes queued up for v4.1.  Nothing really
  exciting here.  Rob has another few commits for big-endian attached
  UARTs, but those will be sent in a separate merge request since they
  haven't been as thoroughly tested as this batch.

  Here are the highlights:

   - lots of unittest cleanup from Frank Rowand

   - bugfixes and updates to the of_graph code

   - tighten up of_get_mac_address() code

   - documentation updates"

* tag 'devicetree-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/glikely/linux:
  of/unittest: Fix of_platform_depopulate test case
  of/unittest: early return from test skips tests
  of/unittest: breadcrumbs to reduce pain of future maintainers
  of/unittest: reduce checkpatch noise - line after declarations
  of/unittest: typo in error string
  of/unittest: add const where needed
  of_net: factor out repetitive code from of_get_mac_address()
  drivers/of: Add empty ranges quirk for PA-Semi
  of: Allow selection of OF_DYNAMIC and OF_OVERLAY if OF_UNITTEST
  of: Empty node & property flag accessors when !OF
  of: Explicitly include linux/types.h in of_graph.h
  dt-bindings: brcm: rationalize Broadcom documentation naming
  of/unittest: replace 'selftest' with 'unittest'
  Documentation: rename of_selftest.txt to of_unittest.txt
  Documentation: update the of_selftest.txt
  dt: OF_UNITTEST make dependency broken
  MAINTAINERS: Pantelis Antoniou device tree overlay maintainer
  of: Add of_graph_get_port_by_id function
  of: Add for_each_endpoint_of_node helper macro
  of: Decrement refcount of previous endpoint in of_graph_get_next_endpoint
This commit is contained in:
Linus Torvalds 2015-04-18 08:30:10 -04:00
commit 7505256626
48 changed files with 612 additions and 518 deletions

View file

@ -34,7 +34,11 @@ config OF_PROMTREE
# Hardly any platforms need this. It is safe to select, but only do so if you
# need it.
config OF_DYNAMIC
bool
bool "Support for dynamic device trees" if OF_UNITTEST
help
On some platforms, the device tree can be manipulated at runtime.
While this option is selected automatically on such platforms, you
can enable it manually to improve device tree unit test coverage.
config OF_ADDRESS
def_bool y
@ -87,5 +91,10 @@ config OF_OVERLAY
bool "Device Tree overlays"
select OF_DYNAMIC
select OF_RESOLVE
help
Overlays are a method to dynamically modify part of the kernel's
device tree with dynamically loaded data.
While this option is selected automatically when needed, you can
enable it manually to improve device tree unit test coverage.
endmenu # OF

View file

@ -6,8 +6,7 @@ obj-$(CONFIG_OF_PROMTREE) += pdt.o
obj-$(CONFIG_OF_ADDRESS) += address.o
obj-$(CONFIG_OF_IRQ) += irq.o
obj-$(CONFIG_OF_NET) += of_net.o
obj-$(CONFIG_OF_UNITTEST) += of_unittest.o
of_unittest-objs := unittest.o unittest-data/testcases.dtb.o
obj-$(CONFIG_OF_UNITTEST) += unittest.o
obj-$(CONFIG_OF_MDIO) += of_mdio.o
obj-$(CONFIG_OF_PCI) += of_pci.o
obj-$(CONFIG_OF_PCI_IRQ) += of_pci_irq.o
@ -16,5 +15,7 @@ obj-$(CONFIG_OF_RESERVED_MEM) += of_reserved_mem.o
obj-$(CONFIG_OF_RESOLVE) += resolver.o
obj-$(CONFIG_OF_OVERLAY) += overlay.o
obj-$(CONFIG_OF_UNITTEST) += unittest-data/
CFLAGS_fdt.o = -I$(src)/../../scripts/dtc/libfdt
CFLAGS_fdt_address.o = -I$(src)/../../scripts/dtc/libfdt

View file

@ -2108,14 +2108,45 @@ int of_graph_parse_endpoint(const struct device_node *node,
}
EXPORT_SYMBOL(of_graph_parse_endpoint);
/**
* of_graph_get_port_by_id() - get the port matching a given id
* @parent: pointer to the parent device node
* @id: id of the port
*
* Return: A 'port' node pointer with refcount incremented. The caller
* has to use of_node_put() on it when done.
*/
struct device_node *of_graph_get_port_by_id(struct device_node *parent, u32 id)
{
struct device_node *node, *port;
node = of_get_child_by_name(parent, "ports");
if (node)
parent = node;
for_each_child_of_node(parent, port) {
u32 port_id = 0;
if (of_node_cmp(port->name, "port") != 0)
continue;
of_property_read_u32(port, "reg", &port_id);
if (id == port_id)
break;
}
of_node_put(node);
return port;
}
EXPORT_SYMBOL(of_graph_get_port_by_id);
/**
* of_graph_get_next_endpoint() - get next endpoint node
* @parent: pointer to the parent device node
* @prev: previous endpoint node, or NULL to get first
*
* Return: An 'endpoint' node pointer with refcount incremented. Refcount
* of the passed @prev node is not decremented, the caller have to use
* of_node_put() on it when done.
* of the passed @prev node is decremented.
*/
struct device_node *of_graph_get_next_endpoint(const struct device_node *parent,
struct device_node *prev)
@ -2151,12 +2182,6 @@ struct device_node *of_graph_get_next_endpoint(const struct device_node *parent,
if (WARN_ONCE(!port, "%s(): endpoint %s has no parent node\n",
__func__, prev->full_name))
return NULL;
/*
* Avoid dropping prev node refcount to 0 when getting the next
* child below.
*/
of_node_get(prev);
}
while (1) {

View file

@ -38,6 +38,15 @@ int of_get_phy_mode(struct device_node *np)
}
EXPORT_SYMBOL_GPL(of_get_phy_mode);
static const void *of_get_mac_addr(struct device_node *np, const char *name)
{
struct property *pp = of_find_property(np, name, NULL);
if (pp && pp->length == ETH_ALEN && is_valid_ether_addr(pp->value))
return pp->value;
return NULL;
}
/**
* Search the device tree for the best MAC address to use. 'mac-address' is
* checked first, because that is supposed to contain to "most recent" MAC
@ -58,20 +67,16 @@ EXPORT_SYMBOL_GPL(of_get_phy_mode);
*/
const void *of_get_mac_address(struct device_node *np)
{
struct property *pp;
const void *addr;
pp = of_find_property(np, "mac-address", NULL);
if (pp && (pp->length == 6) && is_valid_ether_addr(pp->value))
return pp->value;
addr = of_get_mac_addr(np, "mac-address");
if (addr)
return addr;
pp = of_find_property(np, "local-mac-address", NULL);
if (pp && (pp->length == 6) && is_valid_ether_addr(pp->value))
return pp->value;
addr = of_get_mac_addr(np, "local-mac-address");
if (addr)
return addr;
pp = of_find_property(np, "address", NULL);
if (pp && (pp->length == 6) && is_valid_ether_addr(pp->value))
return pp->value;
return NULL;
return of_get_mac_addr(np, "address");
}
EXPORT_SYMBOL(of_get_mac_address);

2
drivers/of/unittest-data/.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
testcases.dtb
testcases.dtb.S

View file

@ -0,0 +1,7 @@
obj-y += testcases.dtb.o
targets += testcases.dtb testcases.dtb.S
.SECONDARY: \
$(obj)/testcases.dtb.S \
$(obj)/testcases.dtb

View file

@ -4,94 +4,94 @@
overlay-node {
/* test bus */
selftestbus: test-bus {
unittestbus: test-bus {
compatible = "simple-bus";
#address-cells = <1>;
#size-cells = <0>;
selftest100: test-selftest100 {
compatible = "selftest";
unittest100: test-unittest100 {
compatible = "unittest";
status = "okay";
reg = <100>;
};
selftest101: test-selftest101 {
compatible = "selftest";
unittest101: test-unittest101 {
compatible = "unittest";
status = "disabled";
reg = <101>;
};
selftest0: test-selftest0 {
compatible = "selftest";
unittest0: test-unittest0 {
compatible = "unittest";
status = "disabled";
reg = <0>;
};
selftest1: test-selftest1 {
compatible = "selftest";
unittest1: test-unittest1 {
compatible = "unittest";
status = "okay";
reg = <1>;
};
selftest2: test-selftest2 {
compatible = "selftest";
unittest2: test-unittest2 {
compatible = "unittest";
status = "disabled";
reg = <2>;
};
selftest3: test-selftest3 {
compatible = "selftest";
unittest3: test-unittest3 {
compatible = "unittest";
status = "okay";
reg = <3>;
};
selftest5: test-selftest5 {
compatible = "selftest";
unittest5: test-unittest5 {
compatible = "unittest";
status = "disabled";
reg = <5>;
};
selftest6: test-selftest6 {
compatible = "selftest";
unittest6: test-unittest6 {
compatible = "unittest";
status = "disabled";
reg = <6>;
};
selftest7: test-selftest7 {
compatible = "selftest";
unittest7: test-unittest7 {
compatible = "unittest";
status = "disabled";
reg = <7>;
};
selftest8: test-selftest8 {
compatible = "selftest";
unittest8: test-unittest8 {
compatible = "unittest";
status = "disabled";
reg = <8>;
};
i2c-test-bus {
compatible = "selftest-i2c-bus";
compatible = "unittest-i2c-bus";
status = "okay";
reg = <50>;
#address-cells = <1>;
#size-cells = <0>;
test-selftest12 {
test-unittest12 {
reg = <8>;
compatible = "selftest-i2c-dev";
compatible = "unittest-i2c-dev";
status = "disabled";
};
test-selftest13 {
test-unittest13 {
reg = <9>;
compatible = "selftest-i2c-dev";
compatible = "unittest-i2c-dev";
status = "okay";
};
test-selftest14 {
test-unittest14 {
reg = <10>;
compatible = "selftest-i2c-mux";
compatible = "unittest-i2c-mux";
status = "okay";
#address-cells = <1>;
@ -104,7 +104,7 @@
test-mux-dev {
reg = <32>;
compatible = "selftest-i2c-dev";
compatible = "unittest-i2c-dev";
status = "okay";
};
};
@ -116,7 +116,7 @@
/* test enable using absolute target path */
overlay0 {
fragment@0 {
target-path = "/testcase-data/overlay-node/test-bus/test-selftest0";
target-path = "/testcase-data/overlay-node/test-bus/test-unittest0";
__overlay__ {
status = "okay";
};
@ -126,7 +126,7 @@
/* test disable using absolute target path */
overlay1 {
fragment@0 {
target-path = "/testcase-data/overlay-node/test-bus/test-selftest1";
target-path = "/testcase-data/overlay-node/test-bus/test-unittest1";
__overlay__ {
status = "disabled";
};
@ -136,7 +136,7 @@
/* test enable using label */
overlay2 {
fragment@0 {
target = <&selftest2>;
target = <&unittest2>;
__overlay__ {
status = "okay";
};
@ -146,7 +146,7 @@
/* test disable using label */
overlay3 {
fragment@0 {
target = <&selftest3>;
target = <&unittest3>;
__overlay__ {
status = "disabled";
};
@ -156,15 +156,15 @@
/* test insertion of a full node */
overlay4 {
fragment@0 {
target = <&selftestbus>;
target = <&unittestbus>;
__overlay__ {
/* suppress DTC warning */
#address-cells = <1>;
#size-cells = <0>;
test-selftest4 {
compatible = "selftest";
test-unittest4 {
compatible = "unittest";
status = "okay";
reg = <4>;
};
@ -175,7 +175,7 @@
/* test overlay apply revert */
overlay5 {
fragment@0 {
target-path = "/testcase-data/overlay-node/test-bus/test-selftest5";
target-path = "/testcase-data/overlay-node/test-bus/test-unittest5";
__overlay__ {
status = "okay";
};
@ -185,7 +185,7 @@
/* test overlays application and removal in sequence */
overlay6 {
fragment@0 {
target-path = "/testcase-data/overlay-node/test-bus/test-selftest6";
target-path = "/testcase-data/overlay-node/test-bus/test-unittest6";
__overlay__ {
status = "okay";
};
@ -193,7 +193,7 @@
};
overlay7 {
fragment@0 {
target-path = "/testcase-data/overlay-node/test-bus/test-selftest7";
target-path = "/testcase-data/overlay-node/test-bus/test-unittest7";
__overlay__ {
status = "okay";
};
@ -203,7 +203,7 @@
/* test overlays application and removal in bad sequence */
overlay8 {
fragment@0 {
target-path = "/testcase-data/overlay-node/test-bus/test-selftest8";
target-path = "/testcase-data/overlay-node/test-bus/test-unittest8";
__overlay__ {
status = "okay";
};
@ -211,7 +211,7 @@
};
overlay9 {
fragment@0 {
target-path = "/testcase-data/overlay-node/test-bus/test-selftest8";
target-path = "/testcase-data/overlay-node/test-bus/test-unittest8";
__overlay__ {
property-foo = "bar";
};
@ -227,16 +227,16 @@
#address-cells = <1>;
#size-cells = <0>;
test-selftest10 {
compatible = "selftest";
test-unittest10 {
compatible = "unittest";
status = "okay";
reg = <10>;
#address-cells = <1>;
#size-cells = <0>;
test-selftest101 {
compatible = "selftest";
test-unittest101 {
compatible = "unittest";
status = "okay";
reg = <1>;
};
@ -255,16 +255,16 @@
#address-cells = <1>;
#size-cells = <0>;
test-selftest11 {
compatible = "selftest";
test-unittest11 {
compatible = "unittest";
status = "okay";
reg = <11>;
#address-cells = <1>;
#size-cells = <0>;
test-selftest111 {
compatible = "selftest";
test-unittest111 {
compatible = "unittest";
status = "okay";
reg = <1>;
};
@ -277,7 +277,7 @@
/* test enable using absolute target path (i2c) */
overlay12 {
fragment@0 {
target-path = "/testcase-data/overlay-node/test-bus/i2c-test-bus/test-selftest12";
target-path = "/testcase-data/overlay-node/test-bus/i2c-test-bus/test-unittest12";
__overlay__ {
status = "okay";
};
@ -287,7 +287,7 @@
/* test disable using absolute target path (i2c) */
overlay13 {
fragment@0 {
target-path = "/testcase-data/overlay-node/test-bus/i2c-test-bus/test-selftest13";
target-path = "/testcase-data/overlay-node/test-bus/i2c-test-bus/test-unittest13";
__overlay__ {
status = "disabled";
};
@ -301,9 +301,9 @@
__overlay__ {
#address-cells = <1>;
#size-cells = <0>;
test-selftest15 {
test-unittest15 {
reg = <11>;
compatible = "selftest-i2c-mux";
compatible = "unittest-i2c-mux";
status = "okay";
#address-cells = <1>;
@ -316,7 +316,7 @@
test-mux-dev {
reg = <32>;
compatible = "selftest-i2c-dev";
compatible = "unittest-i2c-dev";
status = "okay";
};
};

File diff suppressed because it is too large Load diff