Skip to content

Commit

Permalink
Merge tag 'devicetree-fixes-for-4.0' of git://git.kernel.org/pub/scm/…
Browse files Browse the repository at this point in the history
…linux/kernel/git/robh/linux

Pull DeviceTree fixes from Rob Herring:

 - fix for stdout-path option parsing with added unittest

 - fix for stdout-path interaction with earlycon

 - several DT unittest fixes

 - fix Sparc allmodconfig build error on of_platform_register_reconfig_notifier

 - several DT overlay kconfig and build warning fixes

 - several DT binding documentation updates

* tag 'devicetree-fixes-for-4.0' of git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux:
  of/platform: Fix sparc:allmodconfig build
  of: unittest: Add options string testcase variants
  of: fix handling of '/' in options for of_find_node_by_path()
  of/unittest: Fix the wrong expected value in of_selftest_property_string
  of/unittest: remove the duplicate of_changeset_init
  dt: submitting-patches: clarify that DT maintainers are to be cced on bindings
  of: unittest: fix I2C dependency
  of/overlay: Remove unused variable
  Documentation: DT: Renamed of-serial.txt to 8250.txt
  of: Fix premature bootconsole disable with 'stdout-path'
  serial: add device tree binding documentation for ETRAX FS UART
  of/overlay: Directly include idr.h
  of: Drop superfluous dependance for OF_OVERLAY
  of: Add vendor prefix for Arasan
  of: Add prompt for OF_OVERLAY config
  • Loading branch information
torvalds committed Mar 13, 2015
2 parents f788baa + a697c2e commit 3d52c5b
Show file tree
Hide file tree
Showing 9 changed files with 65 additions and 22 deletions.
19 changes: 19 additions & 0 deletions Documentation/devicetree/bindings/serial/axis,etraxfs-uart.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
ETRAX FS UART

Required properties:
- compatible : "axis,etraxfs-uart"
- reg: offset and length of the register set for the device.
- interrupts: device interrupt

Optional properties:
- {dtr,dsr,ri,cd}-gpios: specify a GPIO for DTR/DSR/RI/CD
line respectively.

Example:

serial@b00260000 {
compatible = "axis,etraxfs-uart";
reg = <0xb0026000 0x1000>;
interrupts = <68>;
status = "disabled";
};
3 changes: 3 additions & 0 deletions Documentation/devicetree/bindings/submitting-patches.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ I. For patch submitters

[email protected]

and Cc: the DT maintainers. Use scripts/get_maintainer.pl to identify
all of the DT maintainers.

3) The Documentation/ portion of the patch should come in the series before
the code implementing the binding.

Expand Down
2 changes: 2 additions & 0 deletions Documentation/devicetree/bindings/vendor-prefixes.txt
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,15 @@ amlogic Amlogic, Inc.
ams AMS AG
amstaos AMS-Taos Inc.
apm Applied Micro Circuits Corporation (APM)
arasan Arasan Chip Systems
arm ARM Ltd.
armadeus ARMadeus Systems SARL
asahi-kasei Asahi Kasei Corp.
atmel Atmel Corporation
auo AU Optronics Corporation
avago Avago Technologies
avic Shanghai AVIC Optoelectronics Co., Ltd.
axis Axis Communications AB
bosch Bosch Sensortec GmbH
brcm Broadcom Corporation
buffalo Buffalo, Inc.
Expand Down
3 changes: 1 addition & 2 deletions drivers/of/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -84,8 +84,7 @@ config OF_RESOLVE
bool

config OF_OVERLAY
bool
depends on OF
bool "Device Tree overlays"
select OF_DYNAMIC
select OF_RESOLVE

Expand Down
27 changes: 18 additions & 9 deletions drivers/of/base.c
Original file line number Diff line number Diff line change
Expand Up @@ -714,16 +714,17 @@ static struct device_node *__of_find_node_by_path(struct device_node *parent,
const char *path)
{
struct device_node *child;
int len = strchrnul(path, '/') - path;
int term;
int len;
const char *end;

end = strchr(path, ':');
if (!end)
end = strchrnul(path, '/');

len = end - path;
if (!len)
return NULL;

term = strchrnul(path, ':') - path;
if (term < len)
len = term;

__for_each_child_of_node(parent, child) {
const char *name = strrchr(child->full_name, '/');
if (WARN(!name, "malformed device_node %s\n", child->full_name))
Expand Down Expand Up @@ -768,8 +769,12 @@ struct device_node *of_find_node_opts_by_path(const char *path, const char **opt

/* The path could begin with an alias */
if (*path != '/') {
char *p = strchrnul(path, '/');
int len = separator ? separator - path : p - path;
int len;
const char *p = separator;

if (!p)
p = strchrnul(path, '/');
len = p - path;

/* of_aliases must not be NULL */
if (!of_aliases)
Expand All @@ -794,6 +799,8 @@ struct device_node *of_find_node_opts_by_path(const char *path, const char **opt
path++; /* Increment past '/' delimiter */
np = __of_find_node_by_path(np, path);
path = strchrnul(path, '/');
if (separator && separator < path)
break;
}
raw_spin_unlock_irqrestore(&devtree_lock, flags);
return np;
Expand Down Expand Up @@ -1886,8 +1893,10 @@ void of_alias_scan(void * (*dt_alloc)(u64 size, u64 align))
name = of_get_property(of_chosen, "linux,stdout-path", NULL);
if (IS_ENABLED(CONFIG_PPC) && !name)
name = of_get_property(of_aliases, "stdout", NULL);
if (name)
if (name) {
of_stdout = of_find_node_opts_by_path(name, &of_stdout_options);
add_preferred_console("stdout-path", 0, NULL);
}
}

if (!of_aliases)
Expand Down
3 changes: 2 additions & 1 deletion drivers/of/overlay.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include <linux/string.h>
#include <linux/slab.h>
#include <linux/err.h>
#include <linux/idr.h>

#include "of_private.h"

Expand Down Expand Up @@ -85,7 +86,7 @@ static int of_overlay_apply_single_device_node(struct of_overlay *ov,
struct device_node *target, struct device_node *child)
{
const char *cname;
struct device_node *tchild, *grandchild;
struct device_node *tchild;
int ret = 0;

cname = kbasename(child->full_name);
Expand Down
28 changes: 19 additions & 9 deletions drivers/of/unittest.c
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,11 @@ static void __init of_selftest_find_node_by_name(void)
"option path test failed\n");
of_node_put(np);

np = of_find_node_opts_by_path("/testcase-data:test/option", &options);
selftest(np && !strcmp("test/option", options),
"option path test, subcase #1 failed\n");
of_node_put(np);

np = of_find_node_opts_by_path("/testcase-data:testoption", NULL);
selftest(np, "NULL option path test failed\n");
of_node_put(np);
Expand All @@ -102,6 +107,12 @@ static void __init of_selftest_find_node_by_name(void)
"option alias path test failed\n");
of_node_put(np);

np = of_find_node_opts_by_path("testcase-alias:test/alias/option",
&options);
selftest(np && !strcmp("test/alias/option", options),
"option alias path test, subcase #1 failed\n");
of_node_put(np);

np = of_find_node_opts_by_path("testcase-alias:testaliasoption", NULL);
selftest(np, "NULL option alias path test failed\n");
of_node_put(np);
Expand Down Expand Up @@ -378,9 +389,9 @@ static void __init of_selftest_property_string(void)
rc = of_property_match_string(np, "phandle-list-names", "first");
selftest(rc == 0, "first expected:0 got:%i\n", rc);
rc = of_property_match_string(np, "phandle-list-names", "second");
selftest(rc == 1, "second expected:0 got:%i\n", rc);
selftest(rc == 1, "second expected:1 got:%i\n", rc);
rc = of_property_match_string(np, "phandle-list-names", "third");
selftest(rc == 2, "third expected:0 got:%i\n", rc);
selftest(rc == 2, "third expected:2 got:%i\n", rc);
rc = of_property_match_string(np, "phandle-list-names", "fourth");
selftest(rc == -ENODATA, "unmatched string; rc=%i\n", rc);
rc = of_property_match_string(np, "missing-property", "blah");
Expand Down Expand Up @@ -478,7 +489,6 @@ static void __init of_selftest_changeset(void)
struct device_node *n1, *n2, *n21, *nremove, *parent, *np;
struct of_changeset chgset;

of_changeset_init(&chgset);
n1 = __of_node_dup(NULL, "/testcase-data/changeset/n1");
selftest(n1, "testcase setup failure\n");
n2 = __of_node_dup(NULL, "/testcase-data/changeset/n2");
Expand Down Expand Up @@ -979,7 +989,7 @@ static int of_path_platform_device_exists(const char *path)
return pdev != NULL;
}

#if IS_ENABLED(CONFIG_I2C)
#if IS_BUILTIN(CONFIG_I2C)

/* get the i2c client device instantiated at the path */
static struct i2c_client *of_path_to_i2c_client(const char *path)
Expand Down Expand Up @@ -1445,7 +1455,7 @@ static void of_selftest_overlay_11(void)
return;
}

#if IS_ENABLED(CONFIG_I2C) && IS_ENABLED(CONFIG_OF_OVERLAY)
#if IS_BUILTIN(CONFIG_I2C) && IS_ENABLED(CONFIG_OF_OVERLAY)

struct selftest_i2c_bus_data {
struct platform_device *pdev;
Expand Down Expand Up @@ -1584,7 +1594,7 @@ static struct i2c_driver selftest_i2c_dev_driver = {
.id_table = selftest_i2c_dev_id,
};

#if IS_ENABLED(CONFIG_I2C_MUX)
#if IS_BUILTIN(CONFIG_I2C_MUX)

struct selftest_i2c_mux_data {
int nchans;
Expand Down Expand Up @@ -1695,7 +1705,7 @@ static int of_selftest_overlay_i2c_init(void)
"could not register selftest i2c bus driver\n"))
return ret;

#if IS_ENABLED(CONFIG_I2C_MUX)
#if IS_BUILTIN(CONFIG_I2C_MUX)
ret = i2c_add_driver(&selftest_i2c_mux_driver);
if (selftest(ret == 0,
"could not register selftest i2c mux driver\n"))
Expand All @@ -1707,7 +1717,7 @@ static int of_selftest_overlay_i2c_init(void)

static void of_selftest_overlay_i2c_cleanup(void)
{
#if IS_ENABLED(CONFIG_I2C_MUX)
#if IS_BUILTIN(CONFIG_I2C_MUX)
i2c_del_driver(&selftest_i2c_mux_driver);
#endif
platform_driver_unregister(&selftest_i2c_bus_driver);
Expand Down Expand Up @@ -1814,7 +1824,7 @@ static void __init of_selftest_overlay(void)
of_selftest_overlay_10();
of_selftest_overlay_11();

#if IS_ENABLED(CONFIG_I2C)
#if IS_BUILTIN(CONFIG_I2C)
if (selftest(of_selftest_overlay_i2c_init() == 0, "i2c init failed\n"))
goto out;

Expand Down
2 changes: 1 addition & 1 deletion include/linux/of_platform.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ static inline int of_platform_populate(struct device_node *root,
static inline void of_platform_depopulate(struct device *parent) { }
#endif

#ifdef CONFIG_OF_DYNAMIC
#if defined(CONFIG_OF_DYNAMIC) && defined(CONFIG_OF_ADDRESS)
extern void of_platform_register_reconfig_notifier(void);
#else
static inline void of_platform_register_reconfig_notifier(void) { }
Expand Down

0 comments on commit 3d52c5b

Please sign in to comment.