提交 3d52c5bd 编写于 作者: L Linus Torvalds

Merge tag 'devicetree-fixes-for-4.0' of git://git.kernel.org/pub/scm/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
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";
};
...@@ -12,6 +12,9 @@ I. For patch submitters ...@@ -12,6 +12,9 @@ I. For patch submitters
devicetree@vger.kernel.org devicetree@vger.kernel.org
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 3) The Documentation/ portion of the patch should come in the series before
the code implementing the binding. the code implementing the binding.
......
...@@ -20,6 +20,7 @@ amlogic Amlogic, Inc. ...@@ -20,6 +20,7 @@ amlogic Amlogic, Inc.
ams AMS AG ams AMS AG
amstaos AMS-Taos Inc. amstaos AMS-Taos Inc.
apm Applied Micro Circuits Corporation (APM) apm Applied Micro Circuits Corporation (APM)
arasan Arasan Chip Systems
arm ARM Ltd. arm ARM Ltd.
armadeus ARMadeus Systems SARL armadeus ARMadeus Systems SARL
asahi-kasei Asahi Kasei Corp. asahi-kasei Asahi Kasei Corp.
...@@ -27,6 +28,7 @@ atmel Atmel Corporation ...@@ -27,6 +28,7 @@ atmel Atmel Corporation
auo AU Optronics Corporation auo AU Optronics Corporation
avago Avago Technologies avago Avago Technologies
avic Shanghai AVIC Optoelectronics Co., Ltd. avic Shanghai AVIC Optoelectronics Co., Ltd.
axis Axis Communications AB
bosch Bosch Sensortec GmbH bosch Bosch Sensortec GmbH
brcm Broadcom Corporation brcm Broadcom Corporation
buffalo Buffalo, Inc. buffalo Buffalo, Inc.
......
...@@ -84,8 +84,7 @@ config OF_RESOLVE ...@@ -84,8 +84,7 @@ config OF_RESOLVE
bool bool
config OF_OVERLAY config OF_OVERLAY
bool bool "Device Tree overlays"
depends on OF
select OF_DYNAMIC select OF_DYNAMIC
select OF_RESOLVE select OF_RESOLVE
......
...@@ -714,16 +714,17 @@ static struct device_node *__of_find_node_by_path(struct device_node *parent, ...@@ -714,16 +714,17 @@ static struct device_node *__of_find_node_by_path(struct device_node *parent,
const char *path) const char *path)
{ {
struct device_node *child; struct device_node *child;
int len = strchrnul(path, '/') - path; int len;
int term; const char *end;
end = strchr(path, ':');
if (!end)
end = strchrnul(path, '/');
len = end - path;
if (!len) if (!len)
return NULL; return NULL;
term = strchrnul(path, ':') - path;
if (term < len)
len = term;
__for_each_child_of_node(parent, child) { __for_each_child_of_node(parent, child) {
const char *name = strrchr(child->full_name, '/'); const char *name = strrchr(child->full_name, '/');
if (WARN(!name, "malformed device_node %s\n", child->full_name)) if (WARN(!name, "malformed device_node %s\n", child->full_name))
...@@ -768,8 +769,12 @@ struct device_node *of_find_node_opts_by_path(const char *path, const char **opt ...@@ -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 */ /* The path could begin with an alias */
if (*path != '/') { if (*path != '/') {
char *p = strchrnul(path, '/'); int len;
int len = separator ? separator - path : p - path; const char *p = separator;
if (!p)
p = strchrnul(path, '/');
len = p - path;
/* of_aliases must not be NULL */ /* of_aliases must not be NULL */
if (!of_aliases) if (!of_aliases)
...@@ -794,6 +799,8 @@ struct device_node *of_find_node_opts_by_path(const char *path, const char **opt ...@@ -794,6 +799,8 @@ struct device_node *of_find_node_opts_by_path(const char *path, const char **opt
path++; /* Increment past '/' delimiter */ path++; /* Increment past '/' delimiter */
np = __of_find_node_by_path(np, path); np = __of_find_node_by_path(np, path);
path = strchrnul(path, '/'); path = strchrnul(path, '/');
if (separator && separator < path)
break;
} }
raw_spin_unlock_irqrestore(&devtree_lock, flags); raw_spin_unlock_irqrestore(&devtree_lock, flags);
return np; return np;
...@@ -1886,8 +1893,10 @@ void of_alias_scan(void * (*dt_alloc)(u64 size, u64 align)) ...@@ -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); name = of_get_property(of_chosen, "linux,stdout-path", NULL);
if (IS_ENABLED(CONFIG_PPC) && !name) if (IS_ENABLED(CONFIG_PPC) && !name)
name = of_get_property(of_aliases, "stdout", NULL); name = of_get_property(of_aliases, "stdout", NULL);
if (name) if (name) {
of_stdout = of_find_node_opts_by_path(name, &of_stdout_options); of_stdout = of_find_node_opts_by_path(name, &of_stdout_options);
add_preferred_console("stdout-path", 0, NULL);
}
} }
if (!of_aliases) if (!of_aliases)
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <linux/string.h> #include <linux/string.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/err.h> #include <linux/err.h>
#include <linux/idr.h>
#include "of_private.h" #include "of_private.h"
...@@ -85,7 +86,7 @@ static int of_overlay_apply_single_device_node(struct of_overlay *ov, ...@@ -85,7 +86,7 @@ static int of_overlay_apply_single_device_node(struct of_overlay *ov,
struct device_node *target, struct device_node *child) struct device_node *target, struct device_node *child)
{ {
const char *cname; const char *cname;
struct device_node *tchild, *grandchild; struct device_node *tchild;
int ret = 0; int ret = 0;
cname = kbasename(child->full_name); cname = kbasename(child->full_name);
......
...@@ -92,6 +92,11 @@ static void __init of_selftest_find_node_by_name(void) ...@@ -92,6 +92,11 @@ static void __init of_selftest_find_node_by_name(void)
"option path test failed\n"); "option path test failed\n");
of_node_put(np); 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); np = of_find_node_opts_by_path("/testcase-data:testoption", NULL);
selftest(np, "NULL option path test failed\n"); selftest(np, "NULL option path test failed\n");
of_node_put(np); of_node_put(np);
...@@ -102,6 +107,12 @@ static void __init of_selftest_find_node_by_name(void) ...@@ -102,6 +107,12 @@ static void __init of_selftest_find_node_by_name(void)
"option alias path test failed\n"); "option alias path test failed\n");
of_node_put(np); 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); np = of_find_node_opts_by_path("testcase-alias:testaliasoption", NULL);
selftest(np, "NULL option alias path test failed\n"); selftest(np, "NULL option alias path test failed\n");
of_node_put(np); of_node_put(np);
...@@ -378,9 +389,9 @@ static void __init of_selftest_property_string(void) ...@@ -378,9 +389,9 @@ static void __init of_selftest_property_string(void)
rc = of_property_match_string(np, "phandle-list-names", "first"); rc = of_property_match_string(np, "phandle-list-names", "first");
selftest(rc == 0, "first expected:0 got:%i\n", rc); selftest(rc == 0, "first expected:0 got:%i\n", rc);
rc = of_property_match_string(np, "phandle-list-names", "second"); 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"); 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"); rc = of_property_match_string(np, "phandle-list-names", "fourth");
selftest(rc == -ENODATA, "unmatched string; rc=%i\n", rc); selftest(rc == -ENODATA, "unmatched string; rc=%i\n", rc);
rc = of_property_match_string(np, "missing-property", "blah"); rc = of_property_match_string(np, "missing-property", "blah");
...@@ -478,7 +489,6 @@ static void __init of_selftest_changeset(void) ...@@ -478,7 +489,6 @@ static void __init of_selftest_changeset(void)
struct device_node *n1, *n2, *n21, *nremove, *parent, *np; struct device_node *n1, *n2, *n21, *nremove, *parent, *np;
struct of_changeset chgset; struct of_changeset chgset;
of_changeset_init(&chgset);
n1 = __of_node_dup(NULL, "/testcase-data/changeset/n1"); n1 = __of_node_dup(NULL, "/testcase-data/changeset/n1");
selftest(n1, "testcase setup failure\n"); selftest(n1, "testcase setup failure\n");
n2 = __of_node_dup(NULL, "/testcase-data/changeset/n2"); n2 = __of_node_dup(NULL, "/testcase-data/changeset/n2");
...@@ -979,7 +989,7 @@ static int of_path_platform_device_exists(const char *path) ...@@ -979,7 +989,7 @@ static int of_path_platform_device_exists(const char *path)
return pdev != NULL; return pdev != NULL;
} }
#if IS_ENABLED(CONFIG_I2C) #if IS_BUILTIN(CONFIG_I2C)
/* get the i2c client device instantiated at the path */ /* get the i2c client device instantiated at the path */
static struct i2c_client *of_path_to_i2c_client(const char *path) static struct i2c_client *of_path_to_i2c_client(const char *path)
...@@ -1445,7 +1455,7 @@ static void of_selftest_overlay_11(void) ...@@ -1445,7 +1455,7 @@ static void of_selftest_overlay_11(void)
return; 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 selftest_i2c_bus_data {
struct platform_device *pdev; struct platform_device *pdev;
...@@ -1584,7 +1594,7 @@ static struct i2c_driver selftest_i2c_dev_driver = { ...@@ -1584,7 +1594,7 @@ static struct i2c_driver selftest_i2c_dev_driver = {
.id_table = selftest_i2c_dev_id, .id_table = selftest_i2c_dev_id,
}; };
#if IS_ENABLED(CONFIG_I2C_MUX) #if IS_BUILTIN(CONFIG_I2C_MUX)
struct selftest_i2c_mux_data { struct selftest_i2c_mux_data {
int nchans; int nchans;
...@@ -1695,7 +1705,7 @@ static int of_selftest_overlay_i2c_init(void) ...@@ -1695,7 +1705,7 @@ static int of_selftest_overlay_i2c_init(void)
"could not register selftest i2c bus driver\n")) "could not register selftest i2c bus driver\n"))
return ret; return ret;
#if IS_ENABLED(CONFIG_I2C_MUX) #if IS_BUILTIN(CONFIG_I2C_MUX)
ret = i2c_add_driver(&selftest_i2c_mux_driver); ret = i2c_add_driver(&selftest_i2c_mux_driver);
if (selftest(ret == 0, if (selftest(ret == 0,
"could not register selftest i2c mux driver\n")) "could not register selftest i2c mux driver\n"))
...@@ -1707,7 +1717,7 @@ static int of_selftest_overlay_i2c_init(void) ...@@ -1707,7 +1717,7 @@ static int of_selftest_overlay_i2c_init(void)
static void of_selftest_overlay_i2c_cleanup(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); i2c_del_driver(&selftest_i2c_mux_driver);
#endif #endif
platform_driver_unregister(&selftest_i2c_bus_driver); platform_driver_unregister(&selftest_i2c_bus_driver);
...@@ -1814,7 +1824,7 @@ static void __init of_selftest_overlay(void) ...@@ -1814,7 +1824,7 @@ static void __init of_selftest_overlay(void)
of_selftest_overlay_10(); of_selftest_overlay_10();
of_selftest_overlay_11(); 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")) if (selftest(of_selftest_overlay_i2c_init() == 0, "i2c init failed\n"))
goto out; goto out;
......
...@@ -84,7 +84,7 @@ static inline int of_platform_populate(struct device_node *root, ...@@ -84,7 +84,7 @@ static inline int of_platform_populate(struct device_node *root,
static inline void of_platform_depopulate(struct device *parent) { } static inline void of_platform_depopulate(struct device *parent) { }
#endif #endif
#ifdef CONFIG_OF_DYNAMIC #if defined(CONFIG_OF_DYNAMIC) && defined(CONFIG_OF_ADDRESS)
extern void of_platform_register_reconfig_notifier(void); extern void of_platform_register_reconfig_notifier(void);
#else #else
static inline void of_platform_register_reconfig_notifier(void) { } static inline void of_platform_register_reconfig_notifier(void) { }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册