]> www.infradead.org Git - users/hch/misc.git/commitdiff
ASoC: simple-card: use __free(device_node) for device node
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Mon, 6 Jan 2025 05:49:28 +0000 (05:49 +0000)
committerMark Brown <broonie@kernel.org>
Mon, 13 Jan 2025 14:16:52 +0000 (14:16 +0000)
simple-card handles many type of device_node, thus need to
use of_node_put() in many place. Let's use __free(device_node)
and avoid it.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Tested-by: Stephen Gordon <gordoste@iinet.net.au>
Link: https://patch.msgid.link/87v7uso5js.wl-kuninori.morimoto.gx@renesas.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/generic/simple-card.c

index 76a1d05e2ebece647c57eabb0d22bc36b3eaec95..afe7e79ffdbdb4b12839965314acc0bd5f7bfee5 100644 (file)
@@ -120,14 +120,12 @@ static void simple_parse_convert(struct device *dev,
                                 struct simple_util_data *adata)
 {
        struct device_node *top = dev->of_node;
-       struct device_node *node = of_get_parent(np);
+       struct device_node *node __free(device_node) = of_get_parent(np);
 
        simple_util_parse_convert(top,  PREFIX, adata);
        simple_util_parse_convert(node, PREFIX, adata);
        simple_util_parse_convert(node, NULL,   adata);
        simple_util_parse_convert(np,   NULL,   adata);
-
-       of_node_put(node);
 }
 
 static int simple_parse_node(struct simple_util_priv *priv,
@@ -176,7 +174,7 @@ static int simple_link_init(struct simple_util_priv *priv,
        struct device_node *top = dev->of_node;
        struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link);
        struct simple_dai_props *dai_props = simple_priv_to_props(priv, li->link);
-       struct device_node *node = of_get_parent(cpu);
+       struct device_node *node __free(device_node) = of_get_parent(cpu);
        enum snd_soc_trigger_order trigger_start = SND_SOC_TRIGGER_ORDER_DEFAULT;
        enum snd_soc_trigger_order trigger_stop  = SND_SOC_TRIGGER_ORDER_DEFAULT;
        bool playback_only = 0, capture_only = 0;
@@ -185,7 +183,7 @@ static int simple_link_init(struct simple_util_priv *priv,
        ret = simple_util_parse_daifmt(dev, node, codec,
                                       prefix, &dai_link->dai_fmt);
        if (ret < 0)
-               goto init_end;
+               return ret;
 
        graph_util_parse_link_direction(top,    &playback_only, &capture_only);
        graph_util_parse_link_direction(node,   &playback_only, &capture_only);
@@ -215,11 +213,7 @@ static int simple_link_init(struct simple_util_priv *priv,
        dai_link->init                  = simple_util_dai_init;
        dai_link->ops                   = &simple_ops;
 
-       ret = simple_util_set_dailink_name(dev, dai_link, name);
-init_end:
-       of_node_put(node);
-
-       return ret;
+       return simple_util_set_dailink_name(dev, dai_link, name);
 }
 
 static int simple_dai_link_of_dpcm(struct simple_util_priv *priv,
@@ -232,7 +226,7 @@ static int simple_dai_link_of_dpcm(struct simple_util_priv *priv,
        struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link);
        struct simple_dai_props *dai_props = simple_priv_to_props(priv, li->link);
        struct device_node *top = dev->of_node;
-       struct device_node *node = of_get_parent(np);
+       struct device_node *node __free(device_node) = of_get_parent(np);
        char *prefix = "";
        char dai_name[64];
        int ret;
@@ -296,7 +290,6 @@ static int simple_dai_link_of_dpcm(struct simple_util_priv *priv,
 out_put_node:
        li->link++;
 
-       of_node_put(node);
        return ret;
 }
 
@@ -312,15 +305,13 @@ static int simple_dai_link_of(struct simple_util_priv *priv,
        struct snd_soc_dai_link_component *codecs = snd_soc_link_to_codec(dai_link, 0);
        struct snd_soc_dai_link_component *platforms = snd_soc_link_to_platform(dai_link, 0);
        struct device_node *cpu = NULL;
-       struct device_node *node = NULL;
-       struct device_node *plat = NULL;
        char dai_name[64];
        char prop[128];
        char *prefix = "";
        int ret, single_cpu = 0;
 
        cpu  = np;
-       node = of_get_parent(np);
+       struct device_node *node __free(device_node) = of_get_parent(np);
 
        dev_dbg(dev, "link_of (%pOF)\n", node);
 
@@ -329,7 +320,7 @@ static int simple_dai_link_of(struct simple_util_priv *priv,
                prefix = PREFIX;
 
        snprintf(prop, sizeof(prop), "%splat", prefix);
-       plat = of_get_child_by_name(node, prop);
+       struct device_node *plat __free(device_node)  = of_get_child_by_name(node, prop);
 
        ret = simple_parse_node(priv, cpu, li, prefix, &single_cpu);
        if (ret < 0)
@@ -352,9 +343,6 @@ static int simple_dai_link_of(struct simple_util_priv *priv,
        ret = simple_link_init(priv, cpu, codec, li, prefix, dai_name);
 
 dai_link_of_err:
-       of_node_put(plat);
-       of_node_put(node);
-
        li->link++;
 
        return ret;
@@ -374,7 +362,6 @@ static int __simple_for_each_link(struct simple_util_priv *priv,
        struct device *dev = simple_priv_to_dev(priv);
        struct device_node *top = dev->of_node;
        struct device_node *node;
-       struct device_node *add_devs;
        uintptr_t dpcm_selectable = (uintptr_t)of_device_get_match_data(dev);
        bool is_top = 0;
        int ret = 0;
@@ -386,14 +373,11 @@ static int __simple_for_each_link(struct simple_util_priv *priv,
                is_top = 1;
        }
 
-       add_devs = of_get_child_by_name(top, PREFIX "additional-devs");
+       struct device_node *add_devs __free(device_node) = of_get_child_by_name(top, PREFIX "additional-devs");
 
        /* loop for all dai-link */
        do {
                struct simple_util_data adata;
-               struct device_node *codec;
-               struct device_node *plat;
-               struct device_node *np;
                int num = of_get_child_count(node);
 
                /* Skip additional-devs node */
@@ -403,26 +387,26 @@ static int __simple_for_each_link(struct simple_util_priv *priv,
                }
 
                /* get codec */
-               codec = of_get_child_by_name(node, is_top ?
-                                            PREFIX "codec" : "codec");
+               struct device_node *codec __free(device_node) =
+                       of_get_child_by_name(node, is_top ? PREFIX "codec" : "codec");
                if (!codec) {
                        ret = -ENODEV;
                        goto error;
                }
                /* get platform */
-               plat = of_get_child_by_name(node, is_top ?
-                                           PREFIX "plat" : "plat");
+               struct device_node *plat __free(device_node) =
+                       of_get_child_by_name(node, is_top ? PREFIX "plat" : "plat");
 
                /* get convert-xxx property */
                memset(&adata, 0, sizeof(adata));
-               for_each_child_of_node(node, np) {
+               for_each_child_of_node_scoped(node, np) {
                        if (np == add_devs)
                                continue;
                        simple_parse_convert(dev, np, &adata);
                }
 
                /* loop for all CPU/Codec node */
-               for_each_child_of_node(node, np) {
+               for_each_child_of_node_scoped(node, np) {
                        if (plat == np || add_devs == np)
                                continue;
                        /*
@@ -452,22 +436,16 @@ static int __simple_for_each_link(struct simple_util_priv *priv,
                                        ret = func_noml(priv, np, codec, li, is_top);
                        }
 
-                       if (ret < 0) {
-                               of_node_put(codec);
-                               of_node_put(plat);
-                               of_node_put(np);
+                       if (ret < 0)
                                goto error;
-                       }
                }
 
-               of_node_put(codec);
-               of_node_put(plat);
                node = of_get_next_child(top, node);
        } while (!is_top && node);
 
  error:
-       of_node_put(add_devs);
        of_node_put(node);
+
        return ret;
 }
 
@@ -514,15 +492,13 @@ static void simple_depopulate_aux(void *data)
 static int simple_populate_aux(struct simple_util_priv *priv)
 {
        struct device *dev = simple_priv_to_dev(priv);
-       struct device_node *node;
+       struct device_node *node __free(device_node) = of_get_child_by_name(dev->of_node, PREFIX "additional-devs");
        int ret;
 
-       node = of_get_child_by_name(dev->of_node, PREFIX "additional-devs");
        if (!node)
                return 0;
 
        ret = of_platform_populate(node, NULL, NULL, dev);
-       of_node_put(node);
        if (ret)
                return ret;