Hi!
This small series improves DRM bridges code by silencing a noisy error coming from of-graph code for the device-trees that are missing a display bridge graph.
graph: no port node found in ...
One example where this error happens is an older bridge-less DTB used in conjunction with a newer kernel which has a display controller driver that supports DRM bridges.
Changelog:
v10:- Corrected doc-comment, unbroke the of_graph_get_next_endpoint() and improved commit's message in the "add of_graph_is_present()" patch. Thanks to Laurent Pinchart for spotting the problems!
v9: - These two patches are factored out from [1] in order to ease applying of the patches.
- The of_graph_presents() is renamed to of_graph_is_present() like it was requested by Rob Herring in the review comment to [1].
- Added Rob's r-b.
[1] https://patchwork.ozlabs.org/project/linux-tegra/list/?series=184102
Dmitry Osipenko (2): of_graph: add of_graph_is_present() drm/of: Make drm_of_find_panel_or_bridge() to check graph's presence
drivers/gpu/drm/drm_of.c | 9 +++++++++ drivers/of/property.c | 23 +++++++++++++++++++++++ include/linux/of_graph.h | 6 ++++++ 3 files changed, 38 insertions(+)
In some cases it's very useful to silently check whether port node exists at all in a device-tree before proceeding with parsing the graph. The DRM bridges code is one example of such case where absence of a graph in a device-tree is a legit condition.
This patch adds of_graph_is_present() which returns true if given device-tree node contains OF graph port.
Reviewed-by: Rob Herring robh@kernel.org Signed-off-by: Dmitry Osipenko digetx@gmail.com --- drivers/of/property.c | 23 +++++++++++++++++++++++ include/linux/of_graph.h | 6 ++++++ 2 files changed, 29 insertions(+)
diff --git a/drivers/of/property.c b/drivers/of/property.c index 6a5760f0d6cd..fed7229d9d9f 100644 --- a/drivers/of/property.c +++ b/drivers/of/property.c @@ -29,6 +29,29 @@
#include "of_private.h"
+/** + * of_graph_is_present() - check graph's presence + * @node: pointer to device_node containing graph port + * + * Return: True if @node has a port or ports (with a port) sub-node, + * false otherwise. + */ +bool of_graph_is_present(const struct device_node *node) +{ + struct device_node *ports, *port; + + ports = of_get_child_by_name(node, "ports"); + if (ports) + node = ports; + + port = of_get_child_by_name(node, "port"); + of_node_put(ports); + of_node_put(port); + + return !!port; +} +EXPORT_SYMBOL(of_graph_is_present); + /** * of_property_count_elems_of_size - Count the number of elements in a property * diff --git a/include/linux/of_graph.h b/include/linux/of_graph.h index 01038a6aade0..4d7756087b6b 100644 --- a/include/linux/of_graph.h +++ b/include/linux/of_graph.h @@ -38,6 +38,7 @@ struct of_endpoint { child = of_graph_get_next_endpoint(parent, child))
#ifdef CONFIG_OF +bool of_graph_is_present(const struct device_node *node); int of_graph_parse_endpoint(const struct device_node *node, struct of_endpoint *endpoint); int of_graph_get_endpoint_count(const struct device_node *np); @@ -56,6 +57,11 @@ struct device_node *of_graph_get_remote_node(const struct device_node *node, u32 port, u32 endpoint); #else
+static inline bool of_graph_is_present(const struct device_node *node) +{ + return false; +} + static inline int of_graph_parse_endpoint(const struct device_node *node, struct of_endpoint *endpoint) {
Hi Dmitry,
Thank you for the patch.
On Wed, Jul 01, 2020 at 10:42:31AM +0300, Dmitry Osipenko wrote:
In some cases it's very useful to silently check whether port node exists at all in a device-tree before proceeding with parsing the graph. The DRM bridges code is one example of such case where absence of a graph in a device-tree is a legit condition.
This patch adds of_graph_is_present() which returns true if given device-tree node contains OF graph port.
Reviewed-by: Rob Herring robh@kernel.org Signed-off-by: Dmitry Osipenko digetx@gmail.com
Reviewed-by: Laurent Pinchart laurent.pinchart@ideasonboard.com
drivers/of/property.c | 23 +++++++++++++++++++++++ include/linux/of_graph.h | 6 ++++++ 2 files changed, 29 insertions(+)
diff --git a/drivers/of/property.c b/drivers/of/property.c index 6a5760f0d6cd..fed7229d9d9f 100644 --- a/drivers/of/property.c +++ b/drivers/of/property.c @@ -29,6 +29,29 @@
#include "of_private.h"
+/**
- of_graph_is_present() - check graph's presence
- @node: pointer to device_node containing graph port
- Return: True if @node has a port or ports (with a port) sub-node,
- false otherwise.
- */
+bool of_graph_is_present(const struct device_node *node) +{
- struct device_node *ports, *port;
- ports = of_get_child_by_name(node, "ports");
- if (ports)
node = ports;
- port = of_get_child_by_name(node, "port");
- of_node_put(ports);
- of_node_put(port);
- return !!port;
+} +EXPORT_SYMBOL(of_graph_is_present);
/**
- of_property_count_elems_of_size - Count the number of elements in a property
diff --git a/include/linux/of_graph.h b/include/linux/of_graph.h index 01038a6aade0..4d7756087b6b 100644 --- a/include/linux/of_graph.h +++ b/include/linux/of_graph.h @@ -38,6 +38,7 @@ struct of_endpoint { child = of_graph_get_next_endpoint(parent, child))
#ifdef CONFIG_OF +bool of_graph_is_present(const struct device_node *node); int of_graph_parse_endpoint(const struct device_node *node, struct of_endpoint *endpoint); int of_graph_get_endpoint_count(const struct device_node *np); @@ -56,6 +57,11 @@ struct device_node *of_graph_get_remote_node(const struct device_node *node, u32 port, u32 endpoint); #else
+static inline bool of_graph_is_present(const struct device_node *node) +{
- return false;
+}
static inline int of_graph_parse_endpoint(const struct device_node *node, struct of_endpoint *endpoint) {
When graph isn't defined in a device-tree, the of_graph_get_remote_node() prints a noisy error message, telling that port node is not found. This is undesirable behaviour in our case because absence of a panel/bridge graph is a valid case. Let's check the graph's presence in a device-tree before proceeding with parsing of the graph.
Reviewed-by: Sam Ravnborg sam@ravnborg.org Signed-off-by: Dmitry Osipenko digetx@gmail.com --- drivers/gpu/drm/drm_of.c | 9 +++++++++ 1 file changed, 9 insertions(+)
diff --git a/drivers/gpu/drm/drm_of.c b/drivers/gpu/drm/drm_of.c index b50b44e76279..fdb05fbf72a0 100644 --- a/drivers/gpu/drm/drm_of.c +++ b/drivers/gpu/drm/drm_of.c @@ -246,6 +246,15 @@ int drm_of_find_panel_or_bridge(const struct device_node *np, if (panel) *panel = NULL;
+ /* + * of_graph_get_remote_node() produces a noisy error message if port + * node isn't found and the absence of the port is a legit case here, + * so at first we silently check whether graph presents in the + * device-tree node. + */ + if (!of_graph_is_present(np)) + return -ENODEV; + remote = of_graph_get_remote_node(np, port, endpoint); if (!remote) return -ENODEV;
Hi Dmitry On Wed, Jul 01, 2020 at 10:42:30AM +0300, Dmitry Osipenko wrote:
Hi!
This small series improves DRM bridges code by silencing a noisy error coming from of-graph code for the device-trees that are missing a display bridge graph.
graph: no port node found in ...
One example where this error happens is an older bridge-less DTB used in conjunction with a newer kernel which has a display controller driver that supports DRM bridges.
Changelog:
v10:- Corrected doc-comment, unbroke the of_graph_get_next_endpoint() and improved commit's message in the "add of_graph_is_present()" patch. Thanks to Laurent Pinchart for spotting the problems!
v9: - These two patches are factored out from [1] in order to ease applying of the patches.
- The of_graph_presents() is renamed to of_graph_is_present() like it was requested by Rob Herring in the review comment to [1]. - Added Rob's r-b. [1] https://patchwork.ozlabs.org/project/linux-tegra/list/?series=184102
Dmitry Osipenko (2): of_graph: add of_graph_is_present() drm/of: Make drm_of_find_panel_or_bridge() to check graph's presence
Thanks for your patience with these - applied to drm-misc-next now.
Sam
drivers/gpu/drm/drm_of.c | 9 +++++++++ drivers/of/property.c | 23 +++++++++++++++++++++++ include/linux/of_graph.h | 6 ++++++ 3 files changed, 38 insertions(+)
-- 2.26.0
01.07.2020 12:02, Sam Ravnborg пишет:
Hi Dmitry On Wed, Jul 01, 2020 at 10:42:30AM +0300, Dmitry Osipenko wrote:
Hi!
This small series improves DRM bridges code by silencing a noisy error coming from of-graph code for the device-trees that are missing a display bridge graph.
graph: no port node found in ...
One example where this error happens is an older bridge-less DTB used in conjunction with a newer kernel which has a display controller driver that supports DRM bridges.
Changelog:
v10:- Corrected doc-comment, unbroke the of_graph_get_next_endpoint() and improved commit's message in the "add of_graph_is_present()" patch. Thanks to Laurent Pinchart for spotting the problems!
v9: - These two patches are factored out from [1] in order to ease applying of the patches.
- The of_graph_presents() is renamed to of_graph_is_present() like it was requested by Rob Herring in the review comment to [1]. - Added Rob's r-b. [1] https://patchwork.ozlabs.org/project/linux-tegra/list/?series=184102
Dmitry Osipenko (2): of_graph: add of_graph_is_present() drm/of: Make drm_of_find_panel_or_bridge() to check graph's presence
Thanks for your patience with these - applied to drm-misc-next now.
Thanks to you and Laurent!
dri-devel@lists.freedesktop.org