drm/sun4i: tcon: Simplify sun4i_tcon_find_engine_traverse for one input
authorChen-Yu Tsai <wens@csie.org>
Fri, 8 Sep 2017 07:50:13 +0000 (15:50 +0800)
committerMaxime Ripard <maxime.ripard@free-electrons.com>
Sat, 9 Sep 2017 15:24:40 +0000 (17:24 +0200)
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
drivers/gpu/drm/sun4i/sun4i_tcon.c

index d4e80d7..fb42e57 100644 (file)
@@ -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;
 }
 
 /*