Skip to content

Commit 85dc053

Browse files
morimotobroonie
authored andcommitted
ASoC: audio-graph-card2: use of_graph_get_port_by_id() at graph_get_next_multi_ep()
Audio Graph Card2 is assuming "port" are necessarily in order, but there is no guarantee in case of overlay. Use of_graph_get_port_by_id() instead to handle it correctly. Signed-off-by: Kuninori Morimoto <[email protected]> Tested-by: Stephen Gordon <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Mark Brown <[email protected]>
1 parent c890324 commit 85dc053

File tree

1 file changed

+14
-5
lines changed

1 file changed

+14
-5
lines changed

sound/soc/generic/audio-graph-card2.c

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ static int graph_lnk_is_multi(struct device_node *lnk)
331331
return __graph_get_type(lnk) == GRAPH_MULTI;
332332
}
333333

334-
static struct device_node *graph_get_next_multi_ep(struct device_node **port)
334+
static struct device_node *graph_get_next_multi_ep(struct device_node **port, int idx)
335335
{
336336
struct device_node *ports __free(device_node) = port_to_ports(*port);
337337
struct device_node *rep = NULL;
@@ -351,7 +351,16 @@ static struct device_node *graph_get_next_multi_ep(struct device_node **port)
351351
* port@1 { rep1 };
352352
* };
353353
*/
354-
*port = of_graph_get_next_port(ports, *port);
354+
355+
/*
356+
* Don't use of_graph_get_next_port() here
357+
*
358+
* In overlay case, "port" are not necessarily in order. So we need to use
359+
* of_graph_get_port_by_id() instead
360+
*/
361+
of_node_put(*port);
362+
363+
*port = of_graph_get_port_by_id(ports, idx);
355364
if (*port) {
356365
struct device_node *ep __free(device_node) = of_graph_get_next_port_endpoint(*port, NULL);
357366

@@ -614,7 +623,7 @@ static int graph_parse_node_multi(struct simple_util_priv *priv,
614623
* };
615624
* };
616625
*/
617-
struct device_node *ep __free(device_node) = graph_get_next_multi_ep(&port);
626+
struct device_node *ep __free(device_node) = graph_get_next_multi_ep(&port, idx + 1);
618627
if (!ep)
619628
break;
620629

@@ -729,7 +738,7 @@ static void graph_link_init(struct simple_util_priv *priv,
729738

730739
of_node_get(port_cpu);
731740
if (graph_lnk_is_multi(port_cpu)) {
732-
ep_cpu = graph_get_next_multi_ep(&port_cpu);
741+
ep_cpu = graph_get_next_multi_ep(&port_cpu, 1);
733742
of_node_put(port_cpu);
734743
port_cpu = ep_to_port(ep_cpu);
735744
} else {
@@ -739,7 +748,7 @@ static void graph_link_init(struct simple_util_priv *priv,
739748

740749
of_node_get(port_codec);
741750
if (graph_lnk_is_multi(port_codec)) {
742-
ep_codec = graph_get_next_multi_ep(&port_codec);
751+
ep_codec = graph_get_next_multi_ep(&port_codec, 1);
743752
of_node_put(port_codec);
744753
port_codec = ep_to_port(ep_codec);
745754
} else {

0 commit comments

Comments
 (0)