summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/sun4i
diff options
context:
space:
mode:
authorChen-Yu Tsai <wens@csie.org>2017-09-08 15:50:13 +0800
committerMaxime Ripard <maxime.ripard@free-electrons.com>2017-09-09 17:24:40 +0200
commitbe3fe0f9ed1ca8e4b2cf3419dfb34be716296487 (patch)
tree48c8c8bfec3b49e977ece71ef722451bbc9cda5c /drivers/gpu/drm/sun4i
parente8d5bbf7f4c408f0d73c90e573c78cca745a389f (diff)
downloadlinux-be3fe0f9ed1ca8e4b2cf3419dfb34be716296487.tar.bz2
drm/sun4i: tcon: Simplify sun4i_tcon_find_engine_traverse for one input
Now that sun4i_tcon_find_engine_traverse() usage is restricted to the single input case, we can remove the for_each_available_child_of_node loop. While at it, consolidate all the of_node_put calls into a common exit path. Signed-off-by: Chen-Yu Tsai <wens@csie.org> Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com> Link: https://patchwork.freedesktop.org/patch/msgid/20170908075016.18657-6-wens@csie.org
Diffstat (limited to 'drivers/gpu/drm/sun4i')
-rw-r--r--drivers/gpu/drm/sun4i/sun4i_tcon.c51
1 files changed, 25 insertions, 26 deletions
diff --git a/drivers/gpu/drm/sun4i/sun4i_tcon.c b/drivers/gpu/drm/sun4i/sun4i_tcon.c
index d4e80d720361..fb42e572f7db 100644
--- a/drivers/gpu/drm/sun4i/sun4i_tcon.c
+++ b/drivers/gpu/drm/sun4i/sun4i_tcon.c
@@ -468,7 +468,7 @@ sun4i_tcon_find_engine_traverse(struct sun4i_drv *drv,
struct device_node *node)
{
struct device_node *port, *ep, *remote;
- struct sunxi_engine *engine;
+ struct sunxi_engine *engine = ERR_PTR(-EINVAL);
port = of_graph_get_port_by_id(node, 0);
if (!port)
@@ -483,35 +483,34 @@ sun4i_tcon_find_engine_traverse(struct sun4i_drv *drv,
*
* Bail out if there are multiple input connections.
*/
- if (of_get_available_child_count(port) != 1) {
- of_node_put(port);
- return ERR_PTR(-EINVAL);
- }
+ if (of_get_available_child_count(port) != 1)
+ goto out_put_port;
- for_each_available_child_of_node(port, ep) {
- remote = of_graph_get_remote_port_parent(ep);
- if (!remote)
- continue;
+ /* Get the first connection without specifying an ID */
+ ep = of_get_next_available_child(port, NULL);
+ if (!ep)
+ goto out_put_port;
- /* does this node match any registered engines? */
- list_for_each_entry(engine, &drv->engine_list, list) {
- if (remote == engine->node) {
- of_node_put(remote);
- of_node_put(port);
- return engine;
- }
- }
+ remote = of_graph_get_remote_port_parent(ep);
+ if (!remote)
+ goto out_put_ep;
- /* keep looking through upstream ports */
- engine = sun4i_tcon_find_engine_traverse(drv, remote);
- if (!IS_ERR(engine)) {
- of_node_put(remote);
- of_node_put(port);
- return engine;
- }
- }
+ /* does this node match any registered engines? */
+ list_for_each_entry(engine, &drv->engine_list, list)
+ if (remote == engine->node)
+ goto out_put_remote;
- return ERR_PTR(-EINVAL);
+ /* keep looking through upstream ports */
+ engine = sun4i_tcon_find_engine_traverse(drv, remote);
+
+out_put_remote:
+ of_node_put(remote);
+out_put_ep:
+ of_node_put(ep);
+out_put_port:
+ of_node_put(port);
+
+ return engine;
}
/*