ASoC: simple-card-utils: tidyup for Multi connection

Merge series from Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>:

These patches tidyup simple-card-utils for Multi connection of
Audio Graph Card, Because of DT node parsing, it should check port
1st instead of endpoint. Otherwise, it can't handle DAI correctly.
This commit is contained in:
Mark Brown 2024-12-10 13:46:41 +00:00
commit c56078128c
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0

View File

@ -1005,36 +1005,27 @@ EXPORT_SYMBOL_GPL(graph_util_card_probe);
int graph_util_is_ports0(struct device_node *np)
{
struct device_node *port, *ports, *ports0, *top;
int ret;
struct device_node *parent __free(device_node) = of_get_parent(np);
struct device_node *port;
/* np is "endpoint" or "port" */
if (of_node_name_eq(np, "endpoint")) {
port = of_get_parent(np);
} else {
if (of_node_name_eq(np, "endpoint"))
port = parent;
else
port = np;
of_node_get(port);
}
ports = of_get_parent(port);
top = of_get_parent(ports);
ports0 = of_get_child_by_name(top, "ports");
struct device_node *ports __free(device_node) = of_get_parent(port);
struct device_node *top __free(device_node) = of_get_parent(ports);
struct device_node *ports0 __free(device_node) = of_get_child_by_name(top, "ports");
ret = ports0 == ports;
of_node_put(port);
of_node_put(ports);
of_node_put(ports0);
of_node_put(top);
return ret;
return ports0 == ports;
}
EXPORT_SYMBOL_GPL(graph_util_is_ports0);
static int graph_get_dai_id(struct device_node *ep)
{
struct device_node *node;
struct device_node *endpoint;
struct device_node *node __free(device_node) = of_graph_get_port_parent(ep);
struct device_node *port __free(device_node) = of_get_parent(ep);
struct of_endpoint info;
int i, id;
int ret;
@ -1053,16 +1044,16 @@ static int graph_get_dai_id(struct device_node *ep)
* only of_graph_parse_endpoint().
* We need to check "reg" property
*/
if (of_property_present(ep, "reg"))
return info.id;
node = of_get_parent(ep);
ret = of_property_present(node, "reg");
of_node_put(node);
/* check port first */
ret = of_property_present(port, "reg");
if (ret)
return info.port;
/* check endpoint 2nd as backup */
if (of_property_present(ep, "reg"))
return info.id;
}
node = of_graph_get_port_parent(ep);
/*
* Non HDMI sound case, counting port/endpoint on its DT
@ -1070,14 +1061,14 @@ static int graph_get_dai_id(struct device_node *ep)
*/
i = 0;
id = -1;
for_each_endpoint_of_node(node, endpoint) {
if (endpoint == ep)
for_each_of_graph_port(node, p) {
if (port == p) {
id = i;
break;
}
i++;
}
of_node_put(node);
if (id < 0)
return -ENODEV;
@ -1087,7 +1078,6 @@ static int graph_get_dai_id(struct device_node *ep)
int graph_util_parse_dai(struct device *dev, struct device_node *ep,
struct snd_soc_dai_link_component *dlc, int *is_single_link)
{
struct device_node *node;
struct of_phandle_args args = {};
struct snd_soc_dai *dai;
int ret;
@ -1095,7 +1085,7 @@ int graph_util_parse_dai(struct device *dev, struct device_node *ep,
if (!ep)
return 0;
node = of_graph_get_port_parent(ep);
struct device_node *node __free(device_node) = of_graph_get_port_parent(ep);
/*
* Try to find from DAI node
@ -1136,10 +1126,8 @@ int graph_util_parse_dai(struct device *dev, struct device_node *ep,
* if he unbinded CPU or Codec.
*/
ret = snd_soc_get_dlc(&args, dlc);
if (ret < 0) {
of_node_put(node);
if (ret < 0)
return ret;
}
parse_dai_end:
if (is_single_link)