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
This commit is contained in:
@@ -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";
|
||||||
|
};
|
@@ -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.
|
|||||||
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
|
|||||||
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
|
|||||||
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,
|
|||||||
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
|
|||||||
|
|
||||||
/* 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
|
|||||||
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))
|
|||||||
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 @@
|
|||||||
#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,
|
|||||||
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)
|
|||||||
"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)
|
|||||||
"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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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 = {
|
|||||||
.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)
|
|||||||
"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)
|
|||||||
|
|
||||||
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)
|
|||||||
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,
|
|||||||
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) { }
|
||||||
|
Reference in New Issue
Block a user