* [PATCH v3 0/6] Use helper function for_each_child_of_node_scoped()
@ 2025-05-27 8:24 Ai Chao
2025-05-27 8:24 ` [PATCH v3 1/6] ALSA: ppc: " Ai Chao
` (5 more replies)
0 siblings, 6 replies; 10+ messages in thread
From: Ai Chao @ 2025-05-27 8:24 UTC (permalink / raw)
To: perex, tiwai, johannes, kuninori.morimoto.gx, lgirdwood, broonie,
jbrunet, neil.armstrong, khilman, martin.blumenstingl,
shengjiu.wang, Xiubo.Lee, festevam, nicoleotsuka, shawnguo,
s.hauer, srinivas.kandagatla
Cc: linux-sound, linux-kernel, linuxppc-dev, linux-renesas-soc,
linux-arm-kernel, linux-amlogic, imx, kernel, linux-arm-msm,
Ai Chao
This patch series introduces wrapper functions for_each_child_of_node_scoped().
The for_each_child_of_node_scoped() helper provides a scope-based clean-up
functionality to put the device_node automatically, and as such, there is
no need to call of_node_put() directly.
Summary:
- Patch 1 ALSA: ppc: Use helper function for_each_child_of_node_scoped()
- Patch 2 ALSA: aoa: Use helper function for_each_child_of_node_scoped()
- Patch 3 ASoC: renesas: Use helper function for_each_child_of_node_scoped()
- Patch 4 ASoC: meson: Use helper function for_each_child_of_node_scoped()
- Patch 5 ASoC: imx-card: Use helper function for_each_child_of_node_scoped()
- Patch 6 ASoC: qcom: Use helper function for_each_child_of_node_scoped()
---
Changes in v3:
- Change Patch name ASoC to ALSA for patch 1,2.
- Change commit message information.
- for_each_child_of_node_scoped() instead of
for_each_child_of_node() in i2cbus_add_dev().
Changes in v2:
- Fix error reported by kernel test rebot
- Keep "node"
---
sound/aoa/soundbus/i2sbus/core.c | 7 +++---
sound/ppc/tumbler.c | 5 ++---
sound/soc/fsl/imx-card.c | 13 +++++------
sound/soc/meson/axg-card.c | 3 +--
sound/soc/meson/meson-card-utils.c | 16 +++++---------
sound/soc/qcom/lpass-cpu.c | 3 +--
sound/soc/qcom/qdsp6/q6afe-dai.c | 3 +--
sound/soc/qcom/qdsp6/q6asm-dai.c | 4 +---
sound/soc/renesas/rcar/core.c | 35 ++++++++++--------------------
sound/soc/renesas/rcar/ctu.c | 8 ++-----
sound/soc/renesas/rcar/dma.c | 4 +---
sound/soc/renesas/rcar/dvc.c | 8 ++-----
sound/soc/renesas/rcar/mix.c | 8 ++-----
sound/soc/renesas/rcar/src.c | 10 ++-------
sound/soc/renesas/rcar/ssi.c | 18 +++++----------
sound/soc/renesas/rcar/ssiu.c | 7 ++----
16 files changed, 46 insertions(+), 106 deletions(-)
--
2.47.1
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v3 1/6] ALSA: ppc: Use helper function for_each_child_of_node_scoped()
2025-05-27 8:24 [PATCH v3 0/6] Use helper function for_each_child_of_node_scoped() Ai Chao
@ 2025-05-27 8:24 ` Ai Chao
2025-05-27 8:24 ` [PATCH v3 2/6] ALSA: aoa: " Ai Chao
` (4 subsequent siblings)
5 siblings, 0 replies; 10+ messages in thread
From: Ai Chao @ 2025-05-27 8:24 UTC (permalink / raw)
To: perex, tiwai, johannes, kuninori.morimoto.gx, lgirdwood, broonie,
jbrunet, neil.armstrong, khilman, martin.blumenstingl,
shengjiu.wang, Xiubo.Lee, festevam, nicoleotsuka, shawnguo,
s.hauer, srinivas.kandagatla
Cc: linux-sound, linux-kernel, linuxppc-dev, linux-renesas-soc,
linux-arm-kernel, linux-amlogic, imx, kernel, linux-arm-msm,
Ai Chao
The for_each_child_of_node_scoped() helper provides a scope-based
clean-up functionality to put the device_node automatically, and
as such, there is no need to call of_node_put() directly.
Signed-off-by: Ai Chao <aichao@kylinos.cn>
---
sound/ppc/tumbler.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/sound/ppc/tumbler.c b/sound/ppc/tumbler.c
index 3c09660e1522..b81d0789b9fb 100644
--- a/sound/ppc/tumbler.c
+++ b/sound/ppc/tumbler.c
@@ -1343,7 +1343,7 @@ int snd_pmac_tumbler_init(struct snd_pmac *chip)
int i, err;
struct pmac_tumbler *mix;
const u32 *paddr;
- struct device_node *tas_node, *np;
+ struct device_node *tas_node;
char *chipname;
request_module("i2c-powermac");
@@ -1358,13 +1358,12 @@ int snd_pmac_tumbler_init(struct snd_pmac *chip)
mix->anded_reset = 0;
mix->reset_on_sleep = 1;
- for_each_child_of_node(chip->node, np) {
+ for_each_child_of_node_scoped(chip->node, np) {
if (of_node_name_eq(np, "sound")) {
if (of_property_read_bool(np, "has-anded-reset"))
mix->anded_reset = 1;
if (of_property_present(np, "layout-id"))
mix->reset_on_sleep = 0;
- of_node_put(np);
break;
}
}
--
2.47.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v3 2/6] ALSA: aoa: Use helper function for_each_child_of_node_scoped()
2025-05-27 8:24 [PATCH v3 0/6] Use helper function for_each_child_of_node_scoped() Ai Chao
2025-05-27 8:24 ` [PATCH v3 1/6] ALSA: ppc: " Ai Chao
@ 2025-05-27 8:24 ` Ai Chao
2025-05-27 8:29 ` Johannes Berg
2025-05-28 7:37 ` Geert Uytterhoeven
2025-05-27 8:24 ` [PATCH v3 3/6] ASoC: renesas: " Ai Chao
` (3 subsequent siblings)
5 siblings, 2 replies; 10+ messages in thread
From: Ai Chao @ 2025-05-27 8:24 UTC (permalink / raw)
To: perex, tiwai, johannes, kuninori.morimoto.gx, lgirdwood, broonie,
jbrunet, neil.armstrong, khilman, martin.blumenstingl,
shengjiu.wang, Xiubo.Lee, festevam, nicoleotsuka, shawnguo,
s.hauer, srinivas.kandagatla
Cc: linux-sound, linux-kernel, linuxppc-dev, linux-renesas-soc,
linux-arm-kernel, linux-amlogic, imx, kernel, linux-arm-msm,
Ai Chao
The for_each_child_of_node_scoped() helper provides a scope-based
clean-up functionality to put the device_node automatically.
Signed-off-by: Ai Chao <aichao@kylinos.cn>
---
sound/aoa/soundbus/i2sbus/core.c | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/sound/aoa/soundbus/i2sbus/core.c b/sound/aoa/soundbus/i2sbus/core.c
index ce84288168e4..c1bd0565fc51 100644
--- a/sound/aoa/soundbus/i2sbus/core.c
+++ b/sound/aoa/soundbus/i2sbus/core.c
@@ -155,7 +155,7 @@ static int i2sbus_add_dev(struct macio_dev *macio,
struct device_node *np)
{
struct i2sbus_dev *dev;
- struct device_node *child, *sound = NULL;
+ struct device_node *sound = NULL;
struct resource *r;
int i, layout = 0, rlen, ok = force;
char node_name[8];
@@ -178,7 +178,7 @@ static int i2sbus_add_dev(struct macio_dev *macio,
return 0;
i = 0;
- for_each_child_of_node(np, child) {
+ for_each_child_of_node_scoped(np, child) {
if (of_node_name_eq(child, "sound")) {
i++;
sound = child;
@@ -335,7 +335,6 @@ static int i2sbus_add_dev(struct macio_dev *macio,
static int i2sbus_probe(struct macio_dev* dev, const struct of_device_id *match)
{
- struct device_node *np;
int got = 0, err;
struct i2sbus_control *control = NULL;
@@ -347,7 +346,7 @@ static int i2sbus_probe(struct macio_dev* dev, const struct of_device_id *match)
return -ENODEV;
}
- for_each_child_of_node(dev->ofdev.dev.of_node, np) {
+ for_each_child_of_node_scoped(dev->ofdev.dev.of_node, np) {
if (of_device_is_compatible(np, "i2sbus") ||
of_device_is_compatible(np, "i2s-modem")) {
got += i2sbus_add_dev(dev, control, np);
--
2.47.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v3 3/6] ASoC: renesas: Use helper function for_each_child_of_node_scoped()
2025-05-27 8:24 [PATCH v3 0/6] Use helper function for_each_child_of_node_scoped() Ai Chao
2025-05-27 8:24 ` [PATCH v3 1/6] ALSA: ppc: " Ai Chao
2025-05-27 8:24 ` [PATCH v3 2/6] ALSA: aoa: " Ai Chao
@ 2025-05-27 8:24 ` Ai Chao
2025-05-27 8:24 ` [PATCH v3 4/6] ASoC: meson: " Ai Chao
` (2 subsequent siblings)
5 siblings, 0 replies; 10+ messages in thread
From: Ai Chao @ 2025-05-27 8:24 UTC (permalink / raw)
To: perex, tiwai, johannes, kuninori.morimoto.gx, lgirdwood, broonie,
jbrunet, neil.armstrong, khilman, martin.blumenstingl,
shengjiu.wang, Xiubo.Lee, festevam, nicoleotsuka, shawnguo,
s.hauer, srinivas.kandagatla
Cc: linux-sound, linux-kernel, linuxppc-dev, linux-renesas-soc,
linux-arm-kernel, linux-amlogic, imx, kernel, linux-arm-msm,
Ai Chao
The for_each_child_of_node_scoped() helper provides a scope-based
clean-up functionality to put the device_node automatically, and
as such, there is no need to call of_node_put() directly.
Acked-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Ai Chao <aichao@kylinos.cn>
---
sound/soc/renesas/rcar/core.c | 35 +++++++++++------------------------
sound/soc/renesas/rcar/ctu.c | 8 ++------
sound/soc/renesas/rcar/dma.c | 4 +---
sound/soc/renesas/rcar/dvc.c | 8 ++------
sound/soc/renesas/rcar/mix.c | 8 ++------
sound/soc/renesas/rcar/src.c | 10 ++--------
sound/soc/renesas/rcar/ssi.c | 18 +++++-------------
sound/soc/renesas/rcar/ssiu.c | 7 ++-----
8 files changed, 27 insertions(+), 71 deletions(-)
diff --git a/sound/soc/renesas/rcar/core.c b/sound/soc/renesas/rcar/core.c
index 30afc942d381..260c71888061 100644
--- a/sound/soc/renesas/rcar/core.c
+++ b/sound/soc/renesas/rcar/core.c
@@ -1075,7 +1075,6 @@ static void rsnd_parse_tdm_split_mode(struct rsnd_priv *priv,
{
struct device *dev = rsnd_priv_to_dev(priv);
struct device_node *ssiu_np = rsnd_ssiu_of_node(priv);
- struct device_node *np;
int is_play = rsnd_io_is_play(io);
int i;
@@ -1094,7 +1093,7 @@ static void rsnd_parse_tdm_split_mode(struct rsnd_priv *priv,
if (!node)
break;
- for_each_child_of_node(ssiu_np, np) {
+ for_each_child_of_node_scoped(ssiu_np, np) {
if (np == node) {
rsnd_flags_set(io, RSND_STREAM_TDM_SPLIT);
dev_dbg(dev, "%s is part of TDM Split\n", io->name);
@@ -1154,21 +1153,18 @@ void rsnd_parse_connect_common(struct rsnd_dai *rdai, char *name,
{
struct rsnd_priv *priv = rsnd_rdai_to_priv(rdai);
struct device *dev = rsnd_priv_to_dev(priv);
- struct device_node *np;
int i;
if (!node)
return;
i = 0;
- for_each_child_of_node(node, np) {
+ for_each_child_of_node_scoped(node, np) {
struct rsnd_mod *mod;
i = rsnd_node_fixed_index(dev, np, name, i);
- if (i < 0) {
- of_node_put(np);
+ if (i < 0)
break;
- }
mod = mod_get(priv, i);
@@ -1217,16 +1213,13 @@ int rsnd_node_fixed_index(struct device *dev, struct device_node *node, char *na
int rsnd_node_count(struct rsnd_priv *priv, struct device_node *node, char *name)
{
struct device *dev = rsnd_priv_to_dev(priv);
- struct device_node *np;
int i;
i = 0;
- for_each_child_of_node(node, np) {
+ for_each_child_of_node_scoped(node, np) {
i = rsnd_node_fixed_index(dev, np, name, i);
- if (i < 0) {
- of_node_put(np);
+ if (i < 0)
return 0;
- }
i++;
}
@@ -1250,7 +1243,7 @@ static int rsnd_dai_of_node(struct rsnd_priv *priv, int *is_graph)
{
struct device *dev = rsnd_priv_to_dev(priv);
struct device_node *np = dev->of_node;
- struct device_node *ports, *node;
+ struct device_node *node;
int nr = 0;
int i = 0;
@@ -1270,7 +1263,7 @@ static int rsnd_dai_of_node(struct rsnd_priv *priv, int *is_graph)
of_node_put(node);
- for_each_child_of_node(np, node) {
+ for_each_child_of_node_scoped(np, node) {
if (!of_node_name_eq(node, RSND_NODE_DAI))
continue;
@@ -1279,7 +1272,6 @@ static int rsnd_dai_of_node(struct rsnd_priv *priv, int *is_graph)
i++;
if (i >= RSND_MAX_COMPONENT) {
dev_info(dev, "reach to max component\n");
- of_node_put(node);
break;
}
}
@@ -1290,7 +1282,7 @@ static int rsnd_dai_of_node(struct rsnd_priv *priv, int *is_graph)
/*
* Audio-Graph-Card
*/
- for_each_child_of_node(np, ports) {
+ for_each_child_of_node_scoped(np, ports) {
node = rsnd_pick_endpoint_node_for_ports(ports, np);
if (!node)
continue;
@@ -1299,7 +1291,6 @@ static int rsnd_dai_of_node(struct rsnd_priv *priv, int *is_graph)
i++;
if (i >= RSND_MAX_COMPONENT) {
dev_info(dev, "reach to max component\n");
- of_node_put(ports);
break;
}
}
@@ -1500,10 +1491,9 @@ static int rsnd_dai_probe(struct rsnd_priv *priv)
dai_i = 0;
if (is_graph) {
struct device_node *dai_np_port;
- struct device_node *ports;
struct device_node *dai_np;
- for_each_child_of_node(np, ports) {
+ for_each_child_of_node_scoped(np, ports) {
dai_np_port = rsnd_pick_endpoint_node_for_ports(ports, np);
if (!dai_np_port)
continue;
@@ -1520,14 +1510,11 @@ static int rsnd_dai_probe(struct rsnd_priv *priv)
}
}
} else {
- struct device_node *node;
- struct device_node *dai_np;
-
- for_each_child_of_node(np, node) {
+ for_each_child_of_node_scoped(np, node) {
if (!of_node_name_eq(node, RSND_NODE_DAI))
continue;
- for_each_child_of_node(node, dai_np) {
+ for_each_child_of_node_scoped(node, dai_np) {
__rsnd_dai_probe(priv, dai_np, np, dai_i, dai_i);
if (!rsnd_is_gen1(priv) && !rsnd_is_gen2(priv)) {
rdai = rsnd_rdai_get(priv, dai_i);
diff --git a/sound/soc/renesas/rcar/ctu.c b/sound/soc/renesas/rcar/ctu.c
index a26ec7b780cd..bd4c61f9fb3c 100644
--- a/sound/soc/renesas/rcar/ctu.c
+++ b/sound/soc/renesas/rcar/ctu.c
@@ -316,7 +316,6 @@ struct rsnd_mod *rsnd_ctu_mod_get(struct rsnd_priv *priv, int id)
int rsnd_ctu_probe(struct rsnd_priv *priv)
{
struct device_node *node;
- struct device_node *np;
struct device *dev = rsnd_priv_to_dev(priv);
struct rsnd_ctu *ctu;
struct clk *clk;
@@ -344,7 +343,7 @@ int rsnd_ctu_probe(struct rsnd_priv *priv)
i = 0;
ret = 0;
- for_each_child_of_node(node, np) {
+ for_each_child_of_node_scoped(node, np) {
ctu = rsnd_ctu_get(priv, i);
/*
@@ -357,16 +356,13 @@ int rsnd_ctu_probe(struct rsnd_priv *priv)
clk = devm_clk_get(dev, name);
if (IS_ERR(clk)) {
ret = PTR_ERR(clk);
- of_node_put(np);
goto rsnd_ctu_probe_done;
}
ret = rsnd_mod_init(priv, rsnd_mod_get(ctu), &rsnd_ctu_ops,
clk, RSND_MOD_CTU, i);
- if (ret) {
- of_node_put(np);
+ if (ret)
goto rsnd_ctu_probe_done;
- }
i++;
}
diff --git a/sound/soc/renesas/rcar/dma.c b/sound/soc/renesas/rcar/dma.c
index 2342bbb6fe92..2035ce06fe4c 100644
--- a/sound/soc/renesas/rcar/dma.c
+++ b/sound/soc/renesas/rcar/dma.c
@@ -194,14 +194,12 @@ struct dma_chan *rsnd_dma_request_channel(struct device_node *of_node, char *nam
struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
struct device *dev = rsnd_priv_to_dev(priv);
struct dma_chan *chan = NULL;
- struct device_node *np;
int i = 0;
- for_each_child_of_node(of_node, np) {
+ for_each_child_of_node_scoped(of_node, np) {
i = rsnd_node_fixed_index(dev, np, name, i);
if (i < 0) {
chan = NULL;
- of_node_put(np);
break;
}
diff --git a/sound/soc/renesas/rcar/dvc.c b/sound/soc/renesas/rcar/dvc.c
index da91dd301aab..988cbddbc611 100644
--- a/sound/soc/renesas/rcar/dvc.c
+++ b/sound/soc/renesas/rcar/dvc.c
@@ -324,7 +324,6 @@ struct rsnd_mod *rsnd_dvc_mod_get(struct rsnd_priv *priv, int id)
int rsnd_dvc_probe(struct rsnd_priv *priv)
{
struct device_node *node;
- struct device_node *np;
struct device *dev = rsnd_priv_to_dev(priv);
struct rsnd_dvc *dvc;
struct clk *clk;
@@ -352,7 +351,7 @@ int rsnd_dvc_probe(struct rsnd_priv *priv)
i = 0;
ret = 0;
- for_each_child_of_node(node, np) {
+ for_each_child_of_node_scoped(node, np) {
dvc = rsnd_dvc_get(priv, i);
snprintf(name, RSND_DVC_NAME_SIZE, "%s.%d",
@@ -361,16 +360,13 @@ int rsnd_dvc_probe(struct rsnd_priv *priv)
clk = devm_clk_get(dev, name);
if (IS_ERR(clk)) {
ret = PTR_ERR(clk);
- of_node_put(np);
goto rsnd_dvc_probe_done;
}
ret = rsnd_mod_init(priv, rsnd_mod_get(dvc), &rsnd_dvc_ops,
clk, RSND_MOD_DVC, i);
- if (ret) {
- of_node_put(np);
+ if (ret)
goto rsnd_dvc_probe_done;
- }
i++;
}
diff --git a/sound/soc/renesas/rcar/mix.c b/sound/soc/renesas/rcar/mix.c
index 024d91cc8748..aea74e703305 100644
--- a/sound/soc/renesas/rcar/mix.c
+++ b/sound/soc/renesas/rcar/mix.c
@@ -288,7 +288,6 @@ struct rsnd_mod *rsnd_mix_mod_get(struct rsnd_priv *priv, int id)
int rsnd_mix_probe(struct rsnd_priv *priv)
{
struct device_node *node;
- struct device_node *np;
struct device *dev = rsnd_priv_to_dev(priv);
struct rsnd_mix *mix;
struct clk *clk;
@@ -316,7 +315,7 @@ int rsnd_mix_probe(struct rsnd_priv *priv)
i = 0;
ret = 0;
- for_each_child_of_node(node, np) {
+ for_each_child_of_node_scoped(node, np) {
mix = rsnd_mix_get(priv, i);
snprintf(name, MIX_NAME_SIZE, "%s.%d",
@@ -325,16 +324,13 @@ int rsnd_mix_probe(struct rsnd_priv *priv)
clk = devm_clk_get(dev, name);
if (IS_ERR(clk)) {
ret = PTR_ERR(clk);
- of_node_put(np);
goto rsnd_mix_probe_done;
}
ret = rsnd_mod_init(priv, rsnd_mod_get(mix), &rsnd_mix_ops,
clk, RSND_MOD_MIX, i);
- if (ret) {
- of_node_put(np);
+ if (ret)
goto rsnd_mix_probe_done;
- }
i++;
}
diff --git a/sound/soc/renesas/rcar/src.c b/sound/soc/renesas/rcar/src.c
index 7d73b183bda6..f47bf38c2f94 100644
--- a/sound/soc/renesas/rcar/src.c
+++ b/sound/soc/renesas/rcar/src.c
@@ -715,7 +715,6 @@ struct rsnd_mod *rsnd_src_mod_get(struct rsnd_priv *priv, int id)
int rsnd_src_probe(struct rsnd_priv *priv)
{
struct device_node *node;
- struct device_node *np;
struct device *dev = rsnd_priv_to_dev(priv);
struct rsnd_src *src;
struct clk *clk;
@@ -742,14 +741,13 @@ int rsnd_src_probe(struct rsnd_priv *priv)
priv->src = src;
i = 0;
- for_each_child_of_node(node, np) {
+ for_each_child_of_node_scoped(node, np) {
if (!of_device_is_available(np))
goto skip;
i = rsnd_node_fixed_index(dev, np, SRC_NAME, i);
if (i < 0) {
ret = -EINVAL;
- of_node_put(np);
goto rsnd_src_probe_done;
}
@@ -761,23 +759,19 @@ int rsnd_src_probe(struct rsnd_priv *priv)
src->irq = irq_of_parse_and_map(np, 0);
if (!src->irq) {
ret = -EINVAL;
- of_node_put(np);
goto rsnd_src_probe_done;
}
clk = devm_clk_get(dev, name);
if (IS_ERR(clk)) {
ret = PTR_ERR(clk);
- of_node_put(np);
goto rsnd_src_probe_done;
}
ret = rsnd_mod_init(priv, rsnd_mod_get(src),
&rsnd_src_ops, clk, RSND_MOD_SRC, i);
- if (ret) {
- of_node_put(np);
+ if (ret)
goto rsnd_src_probe_done;
- }
skip:
i++;
diff --git a/sound/soc/renesas/rcar/ssi.c b/sound/soc/renesas/rcar/ssi.c
index 0c6424a1fcac..d52056caa3ec 100644
--- a/sound/soc/renesas/rcar/ssi.c
+++ b/sound/soc/renesas/rcar/ssi.c
@@ -1115,7 +1115,6 @@ void rsnd_parse_connect_ssi(struct rsnd_dai *rdai,
struct rsnd_priv *priv = rsnd_rdai_to_priv(rdai);
struct device *dev = rsnd_priv_to_dev(priv);
struct device_node *node;
- struct device_node *np;
int i;
node = rsnd_ssi_of_node(priv);
@@ -1123,14 +1122,12 @@ void rsnd_parse_connect_ssi(struct rsnd_dai *rdai,
return;
i = 0;
- for_each_child_of_node(node, np) {
+ for_each_child_of_node_scoped(node, np) {
struct rsnd_mod *mod;
i = rsnd_node_fixed_index(dev, np, SSI_NAME, i);
- if (i < 0) {
- of_node_put(np);
+ if (i < 0)
break;
- }
mod = rsnd_ssi_mod_get(priv, i);
@@ -1163,7 +1160,6 @@ int __rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod)
int rsnd_ssi_probe(struct rsnd_priv *priv)
{
struct device_node *node;
- struct device_node *np;
struct device *dev = rsnd_priv_to_dev(priv);
struct rsnd_mod_ops *ops;
struct clk *clk;
@@ -1191,14 +1187,13 @@ int rsnd_ssi_probe(struct rsnd_priv *priv)
priv->ssi_nr = nr;
i = 0;
- for_each_child_of_node(node, np) {
+ for_each_child_of_node_scoped(node, np) {
if (!of_device_is_available(np))
goto skip;
i = rsnd_node_fixed_index(dev, np, SSI_NAME, i);
if (i < 0) {
ret = -EINVAL;
- of_node_put(np);
goto rsnd_ssi_probe_done;
}
@@ -1210,7 +1205,6 @@ int rsnd_ssi_probe(struct rsnd_priv *priv)
clk = devm_clk_get(dev, name);
if (IS_ERR(clk)) {
ret = PTR_ERR(clk);
- of_node_put(np);
goto rsnd_ssi_probe_done;
}
@@ -1223,7 +1217,6 @@ int rsnd_ssi_probe(struct rsnd_priv *priv)
ssi->irq = irq_of_parse_and_map(np, 0);
if (!ssi->irq) {
ret = -EINVAL;
- of_node_put(np);
goto rsnd_ssi_probe_done;
}
@@ -1234,10 +1227,9 @@ int rsnd_ssi_probe(struct rsnd_priv *priv)
ret = rsnd_mod_init(priv, rsnd_mod_get(ssi), ops, clk,
RSND_MOD_SSI, i);
- if (ret) {
- of_node_put(np);
+ if (ret)
goto rsnd_ssi_probe_done;
- }
+
skip:
i++;
}
diff --git a/sound/soc/renesas/rcar/ssiu.c b/sound/soc/renesas/rcar/ssiu.c
index 665e8b2db579..faf351126d57 100644
--- a/sound/soc/renesas/rcar/ssiu.c
+++ b/sound/soc/renesas/rcar/ssiu.c
@@ -478,17 +478,14 @@ void rsnd_parse_connect_ssiu(struct rsnd_dai *rdai,
/* use rcar_sound,ssiu if exist */
if (node) {
- struct device_node *np;
int i = 0;
- for_each_child_of_node(node, np) {
+ for_each_child_of_node_scoped(node, np) {
struct rsnd_mod *mod;
i = rsnd_node_fixed_index(dev, np, SSIU_NAME, i);
- if (i < 0) {
- of_node_put(np);
+ if (i < 0)
break;
- }
mod = rsnd_ssiu_mod_get(priv, i);
--
2.47.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v3 4/6] ASoC: meson: Use helper function for_each_child_of_node_scoped()
2025-05-27 8:24 [PATCH v3 0/6] Use helper function for_each_child_of_node_scoped() Ai Chao
` (2 preceding siblings ...)
2025-05-27 8:24 ` [PATCH v3 3/6] ASoC: renesas: " Ai Chao
@ 2025-05-27 8:24 ` Ai Chao
2025-05-27 8:24 ` [PATCH v3 5/6] ASoC: imx-card: " Ai Chao
2025-05-27 8:24 ` [PATCH v3 6/6] ASoC: qcom: " Ai Chao
5 siblings, 0 replies; 10+ messages in thread
From: Ai Chao @ 2025-05-27 8:24 UTC (permalink / raw)
To: perex, tiwai, johannes, kuninori.morimoto.gx, lgirdwood, broonie,
jbrunet, neil.armstrong, khilman, martin.blumenstingl,
shengjiu.wang, Xiubo.Lee, festevam, nicoleotsuka, shawnguo,
s.hauer, srinivas.kandagatla
Cc: linux-sound, linux-kernel, linuxppc-dev, linux-renesas-soc,
linux-arm-kernel, linux-amlogic, imx, kernel, linux-arm-msm,
Ai Chao, kernel test robot
The for_each_child_of_node_scoped() helper provides a scope-based
clean-up functionality to put the device_node automatically, and
as such, there is no need to call of_node_put() directly.
Reported-by: kernel test robot <lkp@intel.com>
Closes: https://lore.kernel.org/oe-kbuild-all/202505210557.EpJig9BQ-lkp@intel.com/
Signed-off-by: Ai Chao <aichao@kylinos.cn>
---
sound/soc/meson/axg-card.c | 3 +--
sound/soc/meson/meson-card-utils.c | 16 +++++-----------
2 files changed, 6 insertions(+), 13 deletions(-)
diff --git a/sound/soc/meson/axg-card.c b/sound/soc/meson/axg-card.c
index a2dfccb7990f..b4dca80e15e4 100644
--- a/sound/soc/meson/axg-card.c
+++ b/sound/soc/meson/axg-card.c
@@ -222,7 +222,6 @@ static int axg_card_parse_codecs_masks(struct snd_soc_card *card,
struct axg_dai_link_tdm_data *be)
{
struct axg_dai_link_tdm_mask *codec_mask;
- struct device_node *np;
codec_mask = devm_kcalloc(card->dev, link->num_codecs,
sizeof(*codec_mask), GFP_KERNEL);
@@ -231,7 +230,7 @@ static int axg_card_parse_codecs_masks(struct snd_soc_card *card,
be->codec_masks = codec_mask;
- for_each_child_of_node(node, np) {
+ for_each_child_of_node_scoped(node, np) {
snd_soc_of_get_slot_mask(np, "dai-tdm-slot-rx-mask",
&codec_mask->rx);
snd_soc_of_get_slot_mask(np, "dai-tdm-slot-tx-mask",
diff --git a/sound/soc/meson/meson-card-utils.c b/sound/soc/meson/meson-card-utils.c
index cfc7f6e41ab5..0750dece9e69 100644
--- a/sound/soc/meson/meson-card-utils.c
+++ b/sound/soc/meson/meson-card-utils.c
@@ -137,7 +137,6 @@ int meson_card_set_be_link(struct snd_soc_card *card,
struct device_node *node)
{
struct snd_soc_dai_link_component *codec;
- struct device_node *np;
int ret, num_codecs;
num_codecs = of_get_child_count(node);
@@ -154,19 +153,17 @@ int meson_card_set_be_link(struct snd_soc_card *card,
link->codecs = codec;
link->num_codecs = num_codecs;
- for_each_child_of_node(node, np) {
+ for_each_child_of_node_scoped(node, np) {
ret = meson_card_parse_dai(card, np, codec);
- if (ret) {
- of_node_put(np);
+ if (ret)
return ret;
- }
codec++;
}
ret = meson_card_set_link_name(card, link, node, "be");
if (ret)
- dev_err(card->dev, "error setting %pOFn link name\n", np);
+ dev_err(card->dev, "error setting %pOFn link name\n", node);
return ret;
}
@@ -198,7 +195,6 @@ static int meson_card_add_links(struct snd_soc_card *card)
{
struct meson_card *priv = snd_soc_card_get_drvdata(card);
struct device_node *node = card->dev->of_node;
- struct device_node *np;
int num, i, ret;
num = of_get_child_count(node);
@@ -212,12 +208,10 @@ static int meson_card_add_links(struct snd_soc_card *card)
return ret;
i = 0;
- for_each_child_of_node(node, np) {
+ for_each_child_of_node_scoped(node, np) {
ret = priv->match_data->add_link(card, np, &i);
- if (ret) {
- of_node_put(np);
+ if (ret)
return ret;
- }
i++;
}
--
2.47.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v3 5/6] ASoC: imx-card: Use helper function for_each_child_of_node_scoped()
2025-05-27 8:24 [PATCH v3 0/6] Use helper function for_each_child_of_node_scoped() Ai Chao
` (3 preceding siblings ...)
2025-05-27 8:24 ` [PATCH v3 4/6] ASoC: meson: " Ai Chao
@ 2025-05-27 8:24 ` Ai Chao
2025-05-27 8:24 ` [PATCH v3 6/6] ASoC: qcom: " Ai Chao
5 siblings, 0 replies; 10+ messages in thread
From: Ai Chao @ 2025-05-27 8:24 UTC (permalink / raw)
To: perex, tiwai, johannes, kuninori.morimoto.gx, lgirdwood, broonie,
jbrunet, neil.armstrong, khilman, martin.blumenstingl,
shengjiu.wang, Xiubo.Lee, festevam, nicoleotsuka, shawnguo,
s.hauer, srinivas.kandagatla
Cc: linux-sound, linux-kernel, linuxppc-dev, linux-renesas-soc,
linux-arm-kernel, linux-amlogic, imx, kernel, linux-arm-msm,
Ai Chao
The for_each_child_of_node_scoped() helper provides a scope-based
clean-up functionality to put the device_node automatically, and
as such, there is no need to call of_node_put() directly.
Signed-off-by: Ai Chao <aichao@kylinos.cn>
---
sound/soc/fsl/imx-card.c | 13 +++++--------
1 file changed, 5 insertions(+), 8 deletions(-)
diff --git a/sound/soc/fsl/imx-card.c b/sound/soc/fsl/imx-card.c
index 45e000f61ecc..f0bf4eb05329 100644
--- a/sound/soc/fsl/imx-card.c
+++ b/sound/soc/fsl/imx-card.c
@@ -513,7 +513,6 @@ static int imx_card_parse_of(struct imx_card_data *data)
struct device_node *platform = NULL;
struct device_node *codec = NULL;
struct device_node *cpu = NULL;
- struct device_node *np;
struct device *dev = card->dev;
struct snd_soc_dai_link *link;
struct dai_link_data *link_data;
@@ -552,11 +551,10 @@ static int imx_card_parse_of(struct imx_card_data *data)
link = card->dai_link;
link_data = data->link_data;
- for_each_child_of_node(dev->of_node, np) {
+ for_each_child_of_node_scoped(dev->of_node, np) {
dlc = devm_kzalloc(dev, 2 * sizeof(*dlc), GFP_KERNEL);
if (!dlc) {
- ret = -ENOMEM;
- goto err_put_np;
+ return -ENOMEM;
}
link->cpus = &dlc[0];
@@ -567,8 +565,8 @@ static int imx_card_parse_of(struct imx_card_data *data)
ret = of_property_read_string(np, "link-name", &link->name);
if (ret) {
- dev_err(card->dev, "error getting codec dai_link name\n");
- goto err_put_np;
+ return dev_err_probe(card->dev, ret,
+ "error getting codec dai_link name\n");
}
cpu = of_get_child_by_name(np, "cpu");
@@ -722,8 +720,7 @@ static int imx_card_parse_of(struct imx_card_data *data)
of_node_put(cpu);
of_node_put(codec);
of_node_put(platform);
-err_put_np:
- of_node_put(np);
+
return ret;
}
--
2.47.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v3 6/6] ASoC: qcom: Use helper function for_each_child_of_node_scoped()
2025-05-27 8:24 [PATCH v3 0/6] Use helper function for_each_child_of_node_scoped() Ai Chao
` (4 preceding siblings ...)
2025-05-27 8:24 ` [PATCH v3 5/6] ASoC: imx-card: " Ai Chao
@ 2025-05-27 8:24 ` Ai Chao
2025-05-28 8:46 ` Dmitry Baryshkov
5 siblings, 1 reply; 10+ messages in thread
From: Ai Chao @ 2025-05-27 8:24 UTC (permalink / raw)
To: perex, tiwai, johannes, kuninori.morimoto.gx, lgirdwood, broonie,
jbrunet, neil.armstrong, khilman, martin.blumenstingl,
shengjiu.wang, Xiubo.Lee, festevam, nicoleotsuka, shawnguo,
s.hauer, srinivas.kandagatla
Cc: linux-sound, linux-kernel, linuxppc-dev, linux-renesas-soc,
linux-arm-kernel, linux-amlogic, imx, kernel, linux-arm-msm,
Ai Chao
The for_each_child_of_node_scoped() helper provides a scope-based
clean-up functionality to put the device_node automatically.
Signed-off-by: Ai Chao <aichao@kylinos.cn>
---
sound/soc/qcom/lpass-cpu.c | 3 +--
sound/soc/qcom/qdsp6/q6afe-dai.c | 3 +--
sound/soc/qcom/qdsp6/q6asm-dai.c | 4 +---
3 files changed, 3 insertions(+), 7 deletions(-)
diff --git a/sound/soc/qcom/lpass-cpu.c b/sound/soc/qcom/lpass-cpu.c
index 242bc16da36d..62f49fe46273 100644
--- a/sound/soc/qcom/lpass-cpu.c
+++ b/sound/soc/qcom/lpass-cpu.c
@@ -1046,7 +1046,6 @@ static unsigned int of_lpass_cpu_parse_sd_lines(struct device *dev,
static void of_lpass_cpu_parse_dai_data(struct device *dev,
struct lpass_data *data)
{
- struct device_node *node;
int ret, i, id;
/* Allow all channels by default for backwards compatibility */
@@ -1056,7 +1055,7 @@ static void of_lpass_cpu_parse_dai_data(struct device *dev,
data->mi2s_capture_sd_mode[id] = LPAIF_I2SCTL_MODE_8CH;
}
- for_each_child_of_node(dev->of_node, node) {
+ for_each_child_of_node_scoped(dev->of_node, node) {
ret = of_property_read_u32(node, "reg", &id);
if (ret || id < 0) {
dev_err(dev, "valid dai id not found: %d\n", ret);
diff --git a/sound/soc/qcom/qdsp6/q6afe-dai.c b/sound/soc/qcom/qdsp6/q6afe-dai.c
index 7d9628cda875..64735f2adf8f 100644
--- a/sound/soc/qcom/qdsp6/q6afe-dai.c
+++ b/sound/soc/qcom/qdsp6/q6afe-dai.c
@@ -962,10 +962,9 @@ static const struct snd_soc_component_driver q6afe_dai_component = {
static void of_q6afe_parse_dai_data(struct device *dev,
struct q6afe_dai_data *data)
{
- struct device_node *node;
int ret;
- for_each_child_of_node(dev->of_node, node) {
+ for_each_child_of_node_scoped(dev->of_node, node) {
unsigned int lines[Q6AFE_MAX_MI2S_LINES];
struct q6afe_dai_priv_data *priv;
int id, i, num_lines;
diff --git a/sound/soc/qcom/qdsp6/q6asm-dai.c b/sound/soc/qcom/qdsp6/q6asm-dai.c
index a400c9a31fea..d7680dd3a3bb 100644
--- a/sound/soc/qcom/qdsp6/q6asm-dai.c
+++ b/sound/soc/qcom/qdsp6/q6asm-dai.c
@@ -1236,10 +1236,8 @@ static int of_q6asm_parse_dai_data(struct device *dev,
{
struct snd_soc_dai_driver *dai_drv;
struct snd_soc_pcm_stream empty_stream;
- struct device_node *node;
int ret, id, dir, idx = 0;
-
pdata->num_dais = of_get_child_count(dev->of_node);
if (!pdata->num_dais) {
dev_err(dev, "No dais found in DT\n");
@@ -1253,7 +1251,7 @@ static int of_q6asm_parse_dai_data(struct device *dev,
memset(&empty_stream, 0, sizeof(empty_stream));
- for_each_child_of_node(dev->of_node, node) {
+ for_each_child_of_node_scoped(dev->of_node, node) {
ret = of_property_read_u32(node, "reg", &id);
if (ret || id >= MAX_SESSIONS || id < 0) {
dev_err(dev, "valid dai id not found:%d\n", ret);
--
2.47.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH v3 2/6] ALSA: aoa: Use helper function for_each_child_of_node_scoped()
2025-05-27 8:24 ` [PATCH v3 2/6] ALSA: aoa: " Ai Chao
@ 2025-05-27 8:29 ` Johannes Berg
2025-05-28 7:37 ` Geert Uytterhoeven
1 sibling, 0 replies; 10+ messages in thread
From: Johannes Berg @ 2025-05-27 8:29 UTC (permalink / raw)
To: Ai Chao, perex, tiwai, kuninori.morimoto.gx, lgirdwood, broonie,
jbrunet, neil.armstrong, khilman, martin.blumenstingl,
shengjiu.wang, Xiubo.Lee, festevam, nicoleotsuka, shawnguo,
s.hauer, srinivas.kandagatla
Cc: linux-sound, linux-kernel, linuxppc-dev, linux-renesas-soc,
linux-arm-kernel, linux-amlogic, imx, kernel, linux-arm-msm
On Tue, 2025-05-27 at 16:24 +0800, Ai Chao wrote:
> The for_each_child_of_node_scoped() helper provides a scope-based
> clean-up functionality to put the device_node automatically.
Why are you resending this? You haven't convinced anyone of its
correctness. You haven't even convinced anyone that you even understand
what you're changing ... so I think there's not much point any more.
johannes
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 2/6] ALSA: aoa: Use helper function for_each_child_of_node_scoped()
2025-05-27 8:24 ` [PATCH v3 2/6] ALSA: aoa: " Ai Chao
2025-05-27 8:29 ` Johannes Berg
@ 2025-05-28 7:37 ` Geert Uytterhoeven
1 sibling, 0 replies; 10+ messages in thread
From: Geert Uytterhoeven @ 2025-05-28 7:37 UTC (permalink / raw)
To: Ai Chao
Cc: perex, tiwai, johannes, kuninori.morimoto.gx, lgirdwood, broonie,
jbrunet, neil.armstrong, khilman, martin.blumenstingl,
shengjiu.wang, Xiubo.Lee, festevam, nicoleotsuka, shawnguo,
s.hauer, srinivas.kandagatla, linux-sound, linux-kernel,
linuxppc-dev, linux-renesas-soc, linux-arm-kernel, linux-amlogic,
imx, kernel, linux-arm-msm
Hi Ai,
On Tue, 27 May 2025 at 12:52, Ai Chao <aichao@kylinos.cn> wrote:
> The for_each_child_of_node_scoped() helper provides a scope-based
> clean-up functionality to put the device_node automatically.
>
> Signed-off-by: Ai Chao <aichao@kylinos.cn>
Thanks for your patch!
> --- a/sound/aoa/soundbus/i2sbus/core.c
> +++ b/sound/aoa/soundbus/i2sbus/core.c
> @@ -155,7 +155,7 @@ static int i2sbus_add_dev(struct macio_dev *macio,
> struct device_node *np)
> {
> struct i2sbus_dev *dev;
> - struct device_node *child, *sound = NULL;
> + struct device_node *sound = NULL;
> struct resource *r;
> int i, layout = 0, rlen, ok = force;
> char node_name[8];
> @@ -178,7 +178,7 @@ static int i2sbus_add_dev(struct macio_dev *macio,
> return 0;
>
> i = 0;
> - for_each_child_of_node(np, child) {
> + for_each_child_of_node_scoped(np, child) {
> if (of_node_name_eq(child, "sound")) {
> i++;
> sound = child;
As people pointed out before, the original (and new) code is buggy,
as child is saved to sound, and the latter is used after this loop.
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 6/6] ASoC: qcom: Use helper function for_each_child_of_node_scoped()
2025-05-27 8:24 ` [PATCH v3 6/6] ASoC: qcom: " Ai Chao
@ 2025-05-28 8:46 ` Dmitry Baryshkov
0 siblings, 0 replies; 10+ messages in thread
From: Dmitry Baryshkov @ 2025-05-28 8:46 UTC (permalink / raw)
To: Ai Chao
Cc: perex, tiwai, johannes, kuninori.morimoto.gx, lgirdwood, broonie,
jbrunet, neil.armstrong, khilman, martin.blumenstingl,
shengjiu.wang, Xiubo.Lee, festevam, nicoleotsuka, shawnguo,
s.hauer, srinivas.kandagatla, linux-sound, linux-kernel,
linuxppc-dev, linux-renesas-soc, linux-arm-kernel, linux-amlogic,
imx, kernel, linux-arm-msm
On Tue, May 27, 2025 at 04:24:46PM +0800, Ai Chao wrote:
> The for_each_child_of_node_scoped() helper provides a scope-based
> clean-up functionality to put the device_node automatically.
There are no calls to put the node. In the patched files the nodes are
already automatically put by the looping macro, there is nothing to
cleanup. Please stop sending this patch.
>
> Signed-off-by: Ai Chao <aichao@kylinos.cn>
> ---
> sound/soc/qcom/lpass-cpu.c | 3 +--
> sound/soc/qcom/qdsp6/q6afe-dai.c | 3 +--
> sound/soc/qcom/qdsp6/q6asm-dai.c | 4 +---
> 3 files changed, 3 insertions(+), 7 deletions(-)
>
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2025-05-28 8:46 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-05-27 8:24 [PATCH v3 0/6] Use helper function for_each_child_of_node_scoped() Ai Chao
2025-05-27 8:24 ` [PATCH v3 1/6] ALSA: ppc: " Ai Chao
2025-05-27 8:24 ` [PATCH v3 2/6] ALSA: aoa: " Ai Chao
2025-05-27 8:29 ` Johannes Berg
2025-05-28 7:37 ` Geert Uytterhoeven
2025-05-27 8:24 ` [PATCH v3 3/6] ASoC: renesas: " Ai Chao
2025-05-27 8:24 ` [PATCH v3 4/6] ASoC: meson: " Ai Chao
2025-05-27 8:24 ` [PATCH v3 5/6] ASoC: imx-card: " Ai Chao
2025-05-27 8:24 ` [PATCH v3 6/6] ASoC: qcom: " Ai Chao
2025-05-28 8:46 ` Dmitry Baryshkov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).