* [PATCH 1/6] ASoC: ppc: Use helper function for_each_child_of_node_scoped()
2025-05-20 9:11 [PATCH 0/6] Use helper function for_each_child_of_node_scoped() Ai Chao
@ 2025-05-20 9:11 ` Ai Chao
2025-05-20 9:11 ` [PATCH 2/6] ASoC: aoa: " Ai Chao
` (4 subsequent siblings)
5 siblings, 0 replies; 12+ messages in thread
From: Ai Chao @ 2025-05-20 9:11 UTC (permalink / raw)
To: johannes, perex, tiwai, shengjiu.wang, Xiubo.Lee, festevam,
nicoleotsuka, lgirdwood, broonie, shawnguo, s.hauer, kernel,
jbrunet, neil.armstrong, khilman, martin.blumenstingl,
srinivas.kandagatla, kuninori.morimoto.gx, zhangzekun11,
krzysztof.kozlowski, ckeepax, drhodes, alexey.klimov
Cc: linuxppc-dev, linux-sound, linux-kernel, imx, linux-arm-kernel,
linux-amlogic, linux-arm-msm, linux-renesas-soc, 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.
Thus, use this helper to simplify the code.
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] 12+ messages in thread* [PATCH 2/6] ASoC: aoa: Use helper function for_each_child_of_node_scoped()
2025-05-20 9:11 [PATCH 0/6] Use helper function for_each_child_of_node_scoped() Ai Chao
2025-05-20 9:11 ` [PATCH 1/6] ASoC: ppc: " Ai Chao
@ 2025-05-20 9:11 ` Ai Chao
2025-05-20 9:11 ` [PATCH 3/6] ASoC: renesas: " Ai Chao
` (3 subsequent siblings)
5 siblings, 0 replies; 12+ messages in thread
From: Ai Chao @ 2025-05-20 9:11 UTC (permalink / raw)
To: johannes, perex, tiwai, shengjiu.wang, Xiubo.Lee, festevam,
nicoleotsuka, lgirdwood, broonie, shawnguo, s.hauer, kernel,
jbrunet, neil.armstrong, khilman, martin.blumenstingl,
srinivas.kandagatla, kuninori.morimoto.gx, zhangzekun11,
krzysztof.kozlowski, ckeepax, drhodes, alexey.klimov
Cc: linuxppc-dev, linux-sound, linux-kernel, imx, linux-arm-kernel,
linux-amlogic, linux-arm-msm, linux-renesas-soc, 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.
Thus, use this helper to simplify the code.
Signed-off-by: Ai Chao <aichao@kylinos.cn>
---
sound/aoa/soundbus/i2sbus/core.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/sound/aoa/soundbus/i2sbus/core.c b/sound/aoa/soundbus/i2sbus/core.c
index ce84288168e4..20a4c5891afc 100644
--- a/sound/aoa/soundbus/i2sbus/core.c
+++ b/sound/aoa/soundbus/i2sbus/core.c
@@ -207,6 +207,8 @@ static int i2sbus_add_dev(struct macio_dev *macio,
}
}
}
+ of_node_put(sound);
+
/* for the time being, until we can handle non-layout-id
* things in some fabric, refuse to attach if there is no
* layout-id property or we haven't been forced to attach.
@@ -335,7 +337,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 +348,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] 12+ messages in thread* [PATCH 3/6] ASoC: renesas: Use helper function for_each_child_of_node_scoped()
2025-05-20 9:11 [PATCH 0/6] Use helper function for_each_child_of_node_scoped() Ai Chao
2025-05-20 9:11 ` [PATCH 1/6] ASoC: ppc: " Ai Chao
2025-05-20 9:11 ` [PATCH 2/6] ASoC: aoa: " Ai Chao
@ 2025-05-20 9:11 ` Ai Chao
2025-05-21 23:43 ` Kuninori Morimoto
2025-05-20 9:11 ` [PATCH 4/6] ASoC: meson: " Ai Chao
` (2 subsequent siblings)
5 siblings, 1 reply; 12+ messages in thread
From: Ai Chao @ 2025-05-20 9:11 UTC (permalink / raw)
To: johannes, perex, tiwai, shengjiu.wang, Xiubo.Lee, festevam,
nicoleotsuka, lgirdwood, broonie, shawnguo, s.hauer, kernel,
jbrunet, neil.armstrong, khilman, martin.blumenstingl,
srinivas.kandagatla, kuninori.morimoto.gx, zhangzekun11,
krzysztof.kozlowski, ckeepax, drhodes, alexey.klimov
Cc: linuxppc-dev, linux-sound, linux-kernel, imx, linux-arm-kernel,
linux-amlogic, linux-arm-msm, linux-renesas-soc, 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.
Thus, use this helper to simplify the code.
Signed-off-by: Ai Chao <aichao@kylinos.cn>
---
sound/soc/renesas/rcar/core.c | 39 ++++++++++++-----------------------
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, 29 insertions(+), 73 deletions(-)
diff --git a/sound/soc/renesas/rcar/core.c b/sound/soc/renesas/rcar/core.c
index 30afc942d381..91f84495e7b2 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,16 +1263,15 @@ static int rsnd_dai_of_node(struct rsnd_priv *priv, int *is_graph)
of_node_put(node);
- for_each_child_of_node(np, node) {
- if (!of_node_name_eq(node, RSND_NODE_DAI))
+ for_each_child_of_node_scoped(np, ports) {
+ if (!of_node_name_eq(ports, RSND_NODE_DAI))
continue;
- priv->component_dais[i] = of_get_child_count(node);
+ priv->component_dais[i] = of_get_child_count(ports);
nr += priv->component_dais[i];
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] 12+ messages in thread* Re: [PATCH 3/6] ASoC: renesas: Use helper function for_each_child_of_node_scoped()
2025-05-20 9:11 ` [PATCH 3/6] ASoC: renesas: " Ai Chao
@ 2025-05-21 23:43 ` Kuninori Morimoto
0 siblings, 0 replies; 12+ messages in thread
From: Kuninori Morimoto @ 2025-05-21 23:43 UTC (permalink / raw)
To: Ai Chao
Cc: johannes, perex, tiwai, shengjiu.wang, Xiubo.Lee, festevam,
nicoleotsuka, lgirdwood, broonie, shawnguo, s.hauer, kernel,
jbrunet, neil.armstrong, khilman, martin.blumenstingl,
srinivas.kandagatla, zhangzekun11, krzysztof.kozlowski, ckeepax,
drhodes, alexey.klimov, linuxppc-dev, linux-sound, linux-kernel,
imx, linux-arm-kernel, linux-amlogic, linux-arm-msm,
linux-renesas-soc
Hi Ai
Thank you for the patch
> 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.
>
> Thus, use this helper to simplify the code.
>
> Signed-off-by: Ai Chao <aichao@kylinos.cn>
> ---
(snip)
> @@ -1270,16 +1263,15 @@ static int rsnd_dai_of_node(struct rsnd_priv *priv, int *is_graph)
>
> of_node_put(node);
>
> - for_each_child_of_node(np, node) {
> - if (!of_node_name_eq(node, RSND_NODE_DAI))
> + for_each_child_of_node_scoped(np, ports) {
> + if (!of_node_name_eq(ports, RSND_NODE_DAI))
> continue;
>
> - priv->component_dais[i] = of_get_child_count(node);
> + priv->component_dais[i] = of_get_child_count(ports);
> nr += priv->component_dais[i];
> i++;
> if (i >= RSND_MAX_COMPONENT) {
> dev_info(dev, "reach to max component\n");
> - of_node_put(node);
> break;
> }
> }
Here changes "node" to "ports", but please keep "node".
Here is checking "node" instead of "ports".
Except this
Acked-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Thank you for your help !!
Best regards
---
Kuninori Morimoto
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 4/6] ASoC: meson: Use helper function for_each_child_of_node_scoped()
2025-05-20 9:11 [PATCH 0/6] Use helper function for_each_child_of_node_scoped() Ai Chao
` (2 preceding siblings ...)
2025-05-20 9:11 ` [PATCH 3/6] ASoC: renesas: " Ai Chao
@ 2025-05-20 9:11 ` Ai Chao
2025-05-20 21:43 ` kernel test robot
2025-05-20 9:11 ` [PATCH 5/6] ASoC: imx-card: " Ai Chao
2025-05-20 9:11 ` [PATCH 6/6] ASoC: qcom: " Ai Chao
5 siblings, 1 reply; 12+ messages in thread
From: Ai Chao @ 2025-05-20 9:11 UTC (permalink / raw)
To: johannes, perex, tiwai, shengjiu.wang, Xiubo.Lee, festevam,
nicoleotsuka, lgirdwood, broonie, shawnguo, s.hauer, kernel,
jbrunet, neil.armstrong, khilman, martin.blumenstingl,
srinivas.kandagatla, kuninori.morimoto.gx, zhangzekun11,
krzysztof.kozlowski, ckeepax, drhodes, alexey.klimov
Cc: linuxppc-dev, linux-sound, linux-kernel, imx, linux-arm-kernel,
linux-amlogic, linux-arm-msm, linux-renesas-soc, 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.
Thus, use this helper to simplify the code.
Signed-off-by: Ai Chao <aichao@kylinos.cn>
---
sound/soc/meson/axg-card.c | 3 +--
sound/soc/meson/meson-card-utils.c | 14 ++++----------
2 files changed, 5 insertions(+), 12 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..cf08c8dedd91 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,12 +153,10 @@ 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++;
}
@@ -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] 12+ messages in thread* Re: [PATCH 4/6] ASoC: meson: Use helper function for_each_child_of_node_scoped()
2025-05-20 9:11 ` [PATCH 4/6] ASoC: meson: " Ai Chao
@ 2025-05-20 21:43 ` kernel test robot
0 siblings, 0 replies; 12+ messages in thread
From: kernel test robot @ 2025-05-20 21:43 UTC (permalink / raw)
To: Ai Chao, johannes, perex, tiwai, shengjiu.wang, Xiubo.Lee,
festevam, nicoleotsuka, lgirdwood, broonie, shawnguo, s.hauer,
kernel, jbrunet, neil.armstrong, khilman, martin.blumenstingl,
srinivas.kandagatla, kuninori.morimoto.gx, zhangzekun11,
krzysztof.kozlowski, ckeepax, drhodes, alexey.klimov
Cc: oe-kbuild-all, linuxppc-dev, linux-sound, linux-kernel, imx,
linux-arm-kernel, linux-amlogic, linux-arm-msm
Hi Ai,
kernel test robot noticed the following build errors:
[auto build test ERROR on broonie-sound/for-next]
[also build test ERROR on tiwai-sound/for-next tiwai-sound/for-linus wireless-next/main wireless/main linus/master v6.15-rc7 next-20250516]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Ai-Chao/ASoC-ppc-Use-helper-function-for_each_child_of_node_scoped/20250520-171556
base: https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next
patch link: https://lore.kernel.org/r/20250520091131.4150248-5-aichao%40kylinos.cn
patch subject: [PATCH 4/6] ASoC: meson: Use helper function for_each_child_of_node_scoped()
config: arc-randconfig-002-20250521 (https://download.01.org/0day-ci/archive/20250521/202505210557.EpJig9BQ-lkp@intel.com/config)
compiler: arc-linux-gcc (GCC) 12.4.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250521/202505210557.EpJig9BQ-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202505210557.EpJig9BQ-lkp@intel.com/
All errors (new ones prefixed by >>):
In file included from include/linux/device.h:15,
from include/sound/soc.h:15,
from sound/soc/meson/meson-card-utils.c:8:
sound/soc/meson/meson-card-utils.c: In function 'meson_card_set_be_link':
>> sound/soc/meson/meson-card-utils.c:166:71: error: 'np' undeclared (first use in this function); did you mean 'up'?
166 | dev_err(card->dev, "error setting %pOFn link name\n", np);
| ^~
include/linux/dev_printk.h:110:37: note: in definition of macro 'dev_printk_index_wrap'
110 | _p_func(dev, fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~~
sound/soc/meson/meson-card-utils.c:166:17: note: in expansion of macro 'dev_err'
166 | dev_err(card->dev, "error setting %pOFn link name\n", np);
| ^~~~~~~
sound/soc/meson/meson-card-utils.c:166:71: note: each undeclared identifier is reported only once for each function it appears in
166 | dev_err(card->dev, "error setting %pOFn link name\n", np);
| ^~
include/linux/dev_printk.h:110:37: note: in definition of macro 'dev_printk_index_wrap'
110 | _p_func(dev, fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~~
sound/soc/meson/meson-card-utils.c:166:17: note: in expansion of macro 'dev_err'
166 | dev_err(card->dev, "error setting %pOFn link name\n", np);
| ^~~~~~~
vim +166 sound/soc/meson/meson-card-utils.c
aa9c3b7273a58b Jerome Brunet 2020-02-13 134
aa9c3b7273a58b Jerome Brunet 2020-02-13 135 int meson_card_set_be_link(struct snd_soc_card *card,
aa9c3b7273a58b Jerome Brunet 2020-02-13 136 struct snd_soc_dai_link *link,
aa9c3b7273a58b Jerome Brunet 2020-02-13 137 struct device_node *node)
aa9c3b7273a58b Jerome Brunet 2020-02-13 138 {
aa9c3b7273a58b Jerome Brunet 2020-02-13 139 struct snd_soc_dai_link_component *codec;
aa9c3b7273a58b Jerome Brunet 2020-02-13 140 int ret, num_codecs;
aa9c3b7273a58b Jerome Brunet 2020-02-13 141
aa9c3b7273a58b Jerome Brunet 2020-02-13 142 num_codecs = of_get_child_count(node);
aa9c3b7273a58b Jerome Brunet 2020-02-13 143 if (!num_codecs) {
aa9c3b7273a58b Jerome Brunet 2020-02-13 144 dev_err(card->dev, "be link %s has no codec\n",
aa9c3b7273a58b Jerome Brunet 2020-02-13 145 node->full_name);
aa9c3b7273a58b Jerome Brunet 2020-02-13 146 return -EINVAL;
aa9c3b7273a58b Jerome Brunet 2020-02-13 147 }
aa9c3b7273a58b Jerome Brunet 2020-02-13 148
aa9c3b7273a58b Jerome Brunet 2020-02-13 149 codec = devm_kcalloc(card->dev, num_codecs, sizeof(*codec), GFP_KERNEL);
aa9c3b7273a58b Jerome Brunet 2020-02-13 150 if (!codec)
aa9c3b7273a58b Jerome Brunet 2020-02-13 151 return -ENOMEM;
aa9c3b7273a58b Jerome Brunet 2020-02-13 152
aa9c3b7273a58b Jerome Brunet 2020-02-13 153 link->codecs = codec;
aa9c3b7273a58b Jerome Brunet 2020-02-13 154 link->num_codecs = num_codecs;
aa9c3b7273a58b Jerome Brunet 2020-02-13 155
6c05494fd8e28e Ai Chao 2025-05-20 156 for_each_child_of_node_scoped(node, np) {
2e1dbea1f8a358 Kuninori Morimoto 2023-06-20 157 ret = meson_card_parse_dai(card, np, codec);
6c05494fd8e28e Ai Chao 2025-05-20 158 if (ret)
aa9c3b7273a58b Jerome Brunet 2020-02-13 159 return ret;
aa9c3b7273a58b Jerome Brunet 2020-02-13 160
aa9c3b7273a58b Jerome Brunet 2020-02-13 161 codec++;
aa9c3b7273a58b Jerome Brunet 2020-02-13 162 }
aa9c3b7273a58b Jerome Brunet 2020-02-13 163
aa9c3b7273a58b Jerome Brunet 2020-02-13 164 ret = meson_card_set_link_name(card, link, node, "be");
aa9c3b7273a58b Jerome Brunet 2020-02-13 165 if (ret)
aa9c3b7273a58b Jerome Brunet 2020-02-13 @166 dev_err(card->dev, "error setting %pOFn link name\n", np);
aa9c3b7273a58b Jerome Brunet 2020-02-13 167
aa9c3b7273a58b Jerome Brunet 2020-02-13 168 return ret;
aa9c3b7273a58b Jerome Brunet 2020-02-13 169 }
aa9c3b7273a58b Jerome Brunet 2020-02-13 170 EXPORT_SYMBOL_GPL(meson_card_set_be_link);
aa9c3b7273a58b Jerome Brunet 2020-02-13 171
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 5/6] ASoC: imx-card: Use helper function for_each_child_of_node_scoped()
2025-05-20 9:11 [PATCH 0/6] Use helper function for_each_child_of_node_scoped() Ai Chao
` (3 preceding siblings ...)
2025-05-20 9:11 ` [PATCH 4/6] ASoC: meson: " Ai Chao
@ 2025-05-20 9:11 ` Ai Chao
2025-05-20 9:11 ` [PATCH 6/6] ASoC: qcom: " Ai Chao
5 siblings, 0 replies; 12+ messages in thread
From: Ai Chao @ 2025-05-20 9:11 UTC (permalink / raw)
To: johannes, perex, tiwai, shengjiu.wang, Xiubo.Lee, festevam,
nicoleotsuka, lgirdwood, broonie, shawnguo, s.hauer, kernel,
jbrunet, neil.armstrong, khilman, martin.blumenstingl,
srinivas.kandagatla, kuninori.morimoto.gx, zhangzekun11,
krzysztof.kozlowski, ckeepax, drhodes, alexey.klimov
Cc: linuxppc-dev, linux-sound, linux-kernel, imx, linux-arm-kernel,
linux-amlogic, linux-arm-msm, linux-renesas-soc, 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.
Thus, use this helper to simplify the code.
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 3686d468506b..bffdba4292b6 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] 12+ messages in thread* [PATCH 6/6] ASoC: qcom: Use helper function for_each_child_of_node_scoped()
2025-05-20 9:11 [PATCH 0/6] Use helper function for_each_child_of_node_scoped() Ai Chao
` (4 preceding siblings ...)
2025-05-20 9:11 ` [PATCH 5/6] ASoC: imx-card: " Ai Chao
@ 2025-05-20 9:11 ` Ai Chao
2025-05-20 9:19 ` Krzysztof Kozlowski
5 siblings, 1 reply; 12+ messages in thread
From: Ai Chao @ 2025-05-20 9:11 UTC (permalink / raw)
To: johannes, perex, tiwai, shengjiu.wang, Xiubo.Lee, festevam,
nicoleotsuka, lgirdwood, broonie, shawnguo, s.hauer, kernel,
jbrunet, neil.armstrong, khilman, martin.blumenstingl,
srinivas.kandagatla, kuninori.morimoto.gx, zhangzekun11,
krzysztof.kozlowski, ckeepax, drhodes, alexey.klimov
Cc: linuxppc-dev, linux-sound, linux-kernel, imx, linux-arm-kernel,
linux-amlogic, linux-arm-msm, linux-renesas-soc, 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.
Thus, use this helper to simplify the code.
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] 12+ messages in thread* Re: [PATCH 6/6] ASoC: qcom: Use helper function for_each_child_of_node_scoped()
2025-05-20 9:11 ` [PATCH 6/6] ASoC: qcom: " Ai Chao
@ 2025-05-20 9:19 ` Krzysztof Kozlowski
2025-05-21 1:58 ` Ai Chao
0 siblings, 1 reply; 12+ messages in thread
From: Krzysztof Kozlowski @ 2025-05-20 9:19 UTC (permalink / raw)
To: Ai Chao, johannes, perex, tiwai, shengjiu.wang, Xiubo.Lee,
festevam, nicoleotsuka, lgirdwood, broonie, shawnguo, s.hauer,
kernel, jbrunet, neil.armstrong, khilman, martin.blumenstingl,
srinivas.kandagatla, kuninori.morimoto.gx, zhangzekun11, ckeepax,
drhodes, alexey.klimov
Cc: linuxppc-dev, linux-sound, linux-kernel, imx, linux-arm-kernel,
linux-amlogic, linux-arm-msm, linux-renesas-soc
On 20/05/2025 11:11, Ai Chao wrote:
> 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.
I do not see any of_node_put() there, so I don't understand what is the
benefit of this and how this commit msg explains reason behind the change.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 6/6] ASoC: qcom: Use helper function for_each_child_of_node_scoped()
2025-05-20 9:19 ` Krzysztof Kozlowski
@ 2025-05-21 1:58 ` Ai Chao
2025-05-21 6:02 ` Krzysztof Kozlowski
0 siblings, 1 reply; 12+ messages in thread
From: Ai Chao @ 2025-05-21 1:58 UTC (permalink / raw)
To: Krzysztof Kozlowski, srinivas.kandagatla, lgirdwood, broonie,
perex, tiwai, aichao
Cc: linux-sound, linux-arm-msm, linux-kernel
Hi Krzysztof :
Thanks for your help.
The for_each_child_of_node() function is used to iterate over all
child nodes of a device tree node. During each iteration, it retrieves a
pointer to the child node via of_get_next_child() and automatically
increments the node's reference count (of_node_get()). Each call to
of_get_next_child() increases the reference count (refcount) of the
returned child node, ensuring that the node is not freed while in use.
The of_node_put() function is used to decrement the node's
reference count. When the reference count drops to zero, the kernel
releases the memory occupied by the node.for_each_child_of_node()
increments the child node's reference count in each iteration but does
not decrement it automatically. If of_node_put() is not called manually,
the reference count will never reach zero, resulting in a memory leak of
the node.
On 2025/5/20 17:19, Krzysztof Kozlowski wrote:
> On 20/05/2025 11:11, Ai Chao wrote:
>> 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.
>
> I do not see any of_node_put() there, so I don't understand what is the
> benefit of this and how this commit msg explains reason behind the change.
>
> Best regards,
> Krzysztof
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 6/6] ASoC: qcom: Use helper function for_each_child_of_node_scoped()
2025-05-21 1:58 ` Ai Chao
@ 2025-05-21 6:02 ` Krzysztof Kozlowski
0 siblings, 0 replies; 12+ messages in thread
From: Krzysztof Kozlowski @ 2025-05-21 6:02 UTC (permalink / raw)
To: Ai Chao, Krzysztof Kozlowski, srinivas.kandagatla, lgirdwood,
broonie, perex, tiwai
Cc: linux-sound, linux-arm-msm, linux-kernel
On 21/05/2025 03:58, Ai Chao wrote:
> Hi Krzysztof :
>
> Thanks for your help.
>
> The for_each_child_of_node() function is used to iterate over all
> child nodes of a device tree node. During each iteration, it retrieves a
> pointer to the child node via of_get_next_child() and automatically
> increments the node's reference count (of_node_get()). Each call to
> of_get_next_child() increases the reference count (refcount) of the
> returned child node, ensuring that the node is not freed while in use.
Don't lecture us on the API, we know it.
>
> The of_node_put() function is used to decrement the node's
> reference count. When the reference count drops to zero, the kernel
> releases the memory occupied by the node.for_each_child_of_node()
> increments the child node's reference count in each iteration but does
> not decrement it automatically. If of_node_put() is not called manually,
> the reference count will never reach zero, resulting in a memory leak of
> the node.
Except top posting, you did not answer the comment at all. Explaining
all this in view of existing code means you do not understand the code.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 12+ messages in thread