]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
ASoC: simple-card-utils: fixup dlc->xxx handling for error case
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Mon, 14 Apr 2025 00:45:59 +0000 (00:45 +0000)
committerMark Brown <broonie@kernel.org>
Mon, 14 Apr 2025 10:48:36 +0000 (11:48 +0100)
Current graph_util_parse_dai() has 2 issue for dlc->xxx handling.

1) dlc->xxx might be filled if snd_soc_get_dai_via_args() (A) works.
   In such case it will fill dlc->xxx first (B), and detect error
   after that (C). We need to fill dlc->xxx in success case only.

(A) dai = snd_soc_get_dai_via_args(&args);
if (dai) {
ret = -ENOMEM;
 ^ dlc->of_node  = ...
(B) dlc->dai_name = ...
 v dlc->dai_args = ...
(C) if (!dlc->dai_args)
goto end;
...
}

2) graph_util_parse_dai() itself has 2 patterns (X)(Y) to fill dlc->xxx.
   Both case, we need to call of_node_put(node) (Z) in error case, but we
   are calling it only in (Y) case.

int graph_util_parse_dai(...)
{
...
dai = snd_soc_get_dai_via_args(&args);
if (dai) {
...
 ^ dlc->of_node  = ...
(X) dlc->dai_name = ...
 v dlc->dai_args = ...
...
}
...
(Y) ret = snd_soc_get_dlc(&args, dlc);
if (ret < 0) {
(Z) of_node_put(node);
...
}
...
}

This patch fixup both case. Make it easy to understand, update
lavel "end" to "err", too.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Link: https://patch.msgid.link/87fribr2ns.wl-kuninori.morimoto.gx@renesas.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/generic/simple-card-utils.c

index a1ccc300e68ca81fde0a190bba59082882699fc8..a26487dca764033a2708c8210f5261ee22f342de 100644 (file)
@@ -1119,12 +1119,16 @@ int graph_util_parse_dai(struct simple_util_priv *priv, struct device_node *ep,
        args.np = ep;
        dai = snd_soc_get_dai_via_args(&args);
        if (dai) {
+               const char *dai_name = snd_soc_dai_name_get(dai);
+               const struct of_phandle_args *dai_args = snd_soc_copy_dai_args(dev, &args);
+
                ret = -ENOMEM;
+               if (!dai_args)
+                       goto err;
+
                dlc->of_node  = node;
-               dlc->dai_name = snd_soc_dai_name_get(dai);
-               dlc->dai_args = snd_soc_copy_dai_args(dev, &args);
-               if (!dlc->dai_args)
-                       goto end;
+               dlc->dai_name = dai_name;
+               dlc->dai_args = dai_args;
 
                goto parse_dai_end;
        }
@@ -1154,16 +1158,17 @@ int graph_util_parse_dai(struct simple_util_priv *priv, struct device_node *ep,
         *    if he unbinded CPU or Codec.
         */
        ret = snd_soc_get_dlc(&args, dlc);
-       if (ret < 0) {
-               of_node_put(node);
-               goto end;
-       }
+       if (ret < 0)
+               goto err;
 
 parse_dai_end:
        if (is_single_link)
                *is_single_link = of_graph_get_endpoint_count(node) == 1;
        ret = 0;
-end:
+err:
+       if (ret < 0)
+               of_node_put(node);
+
        return simple_ret(priv, ret);
 }
 EXPORT_SYMBOL_GPL(graph_util_parse_dai);