DeviceTree fixes for 4.0-rc:
- 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 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJVAvyzAAoJEMhvYp4jgsXiKSAIALRxbtnjPu13+1vD6C8xcTsN TsD/GoIOtBjVlEPDFrKXOhRXkxXbgONDSveQYhm0iWr30ECloVoikIxF2NPty2nR B3xN7WbbmeEBl1ubGVw60xs/M1cF7d11UpjRabjlVqFpMll5LufX0+ZAbLQ+Brsl 5zSGxIonG8pRxFy0yi6++76cyywn3XVYoUTMb+nKaiSzXvOBhGnm5MXruiynVH9m enVKop8rhizfUdvSHFfxxipFK9L3+EYx0yxaZWW9tvYh6yHhb/GZxQcuz1Rn5KUJ wY0Y4PJdusLOO0FNprZmLsi3GxEXOIBS0bcPCXQAqD/Kr46waVOETajyIItMYnY= =nyIQ -----END PGP SIGNATURE----- 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:
Коммит
3d52c5bdbe
|
@ -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
|
||||
|
||||
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.
|
||||
|
||||
|
|
|
@ -20,6 +20,7 @@ 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.
|
||||
|
@ -27,6 +28,7 @@ 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.
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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))
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include <linux/string.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/idr.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)
|
||||
{
|
||||
const char *cname;
|
||||
struct device_node *tchild, *grandchild;
|
||||
struct device_node *tchild;
|
||||
int ret = 0;
|
||||
|
||||
cname = kbasename(child->full_name);
|
||||
|
|
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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");
|
||||
|
@ -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");
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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"))
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
|
|
|
@ -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) { }
|
||||
|
|
Загрузка…
Ссылка в новой задаче