soc: fsl: cpm1: tsa: switch to for_each_available_child_of_node_scoped()

The non-scoped variant of this macro turns error-prone as soon as error
paths are included, because explicit calls to of_node_put() are required
to avoid leaking memory.

Using its scoped counterpart simplifies the code by removing the need of
explicit calls to of_node_put(), as they are automatically triggered as
soon as the child node goes out of scope. Moreover, it is more robust as
it accounts for new error paths without having to worry about
decrementing the object's refcount.

Note that the device_node is declared within the macro, and its explicit
declaration can be dropped as well if it is not used anywhere else.

Signed-off-by: Javier Carrasco <javier.carrasco.cruz@gmail.com>
Acked-by: Herve Codina <herve.codina@bootlin.com>
Link: https://lore.kernel.org/r/20241002-tsa-scoped-v1-1-ba6a6d657f82@gmail.com
Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
This commit is contained in:
Javier Carrasco 2024-10-02 22:21:51 +02:00 committed by Christophe Leroy
parent 9852d85ec9
commit 844d098b6f

View File

@ -680,7 +680,6 @@ static inline int tsa_of_parse_tdm_tx_route(struct tsa *tsa,
static int tsa_of_parse_tdms(struct tsa *tsa, struct device_node *np) static int tsa_of_parse_tdms(struct tsa *tsa, struct device_node *np)
{ {
struct device_node *tdm_np;
struct tsa_tdm *tdm; struct tsa_tdm *tdm;
struct clk *clk; struct clk *clk;
u32 tdm_id, val; u32 tdm_id, val;
@ -691,11 +690,10 @@ static int tsa_of_parse_tdms(struct tsa *tsa, struct device_node *np)
for (i = 0; i < ARRAY_SIZE(tsa->tdm); i++) for (i = 0; i < ARRAY_SIZE(tsa->tdm); i++)
tsa->tdm[i].is_enable = false; tsa->tdm[i].is_enable = false;
for_each_available_child_of_node(np, tdm_np) { for_each_available_child_of_node_scoped(np, tdm_np) {
ret = of_property_read_u32(tdm_np, "reg", &tdm_id); ret = of_property_read_u32(tdm_np, "reg", &tdm_id);
if (ret) { if (ret) {
dev_err(tsa->dev, "%pOF: failed to read reg\n", tdm_np); dev_err(tsa->dev, "%pOF: failed to read reg\n", tdm_np);
of_node_put(tdm_np);
return ret; return ret;
} }
switch (tdm_id) { switch (tdm_id) {
@ -719,16 +717,14 @@ static int tsa_of_parse_tdms(struct tsa *tsa, struct device_node *np)
invalid_tdm: invalid_tdm:
dev_err(tsa->dev, "%pOF: Invalid tdm_id (%u)\n", tdm_np, dev_err(tsa->dev, "%pOF: Invalid tdm_id (%u)\n", tdm_np,
tdm_id); tdm_id);
of_node_put(tdm_np);
return -EINVAL; return -EINVAL;
} }
} }
for_each_available_child_of_node(np, tdm_np) { for_each_available_child_of_node_scoped(np, tdm_np) {
ret = of_property_read_u32(tdm_np, "reg", &tdm_id); ret = of_property_read_u32(tdm_np, "reg", &tdm_id);
if (ret) { if (ret) {
dev_err(tsa->dev, "%pOF: failed to read reg\n", tdm_np); dev_err(tsa->dev, "%pOF: failed to read reg\n", tdm_np);
of_node_put(tdm_np);
return ret; return ret;
} }
@ -742,14 +738,12 @@ invalid_tdm:
dev_err(tsa->dev, dev_err(tsa->dev,
"%pOF: failed to read fsl,rx-frame-sync-delay-bits\n", "%pOF: failed to read fsl,rx-frame-sync-delay-bits\n",
tdm_np); tdm_np);
of_node_put(tdm_np);
return ret; return ret;
} }
if (val > 3) { if (val > 3) {
dev_err(tsa->dev, dev_err(tsa->dev,
"%pOF: Invalid fsl,rx-frame-sync-delay-bits (%u)\n", "%pOF: Invalid fsl,rx-frame-sync-delay-bits (%u)\n",
tdm_np, val); tdm_np, val);
of_node_put(tdm_np);
return -EINVAL; return -EINVAL;
} }
tdm->simode_tdm |= TSA_SIMODE_TDM_RFSD(val); tdm->simode_tdm |= TSA_SIMODE_TDM_RFSD(val);
@ -761,14 +755,12 @@ invalid_tdm:
dev_err(tsa->dev, dev_err(tsa->dev,
"%pOF: failed to read fsl,tx-frame-sync-delay-bits\n", "%pOF: failed to read fsl,tx-frame-sync-delay-bits\n",
tdm_np); tdm_np);
of_node_put(tdm_np);
return ret; return ret;
} }
if (val > 3) { if (val > 3) {
dev_err(tsa->dev, dev_err(tsa->dev,
"%pOF: Invalid fsl,tx-frame-sync-delay-bits (%u)\n", "%pOF: Invalid fsl,tx-frame-sync-delay-bits (%u)\n",
tdm_np, val); tdm_np, val);
of_node_put(tdm_np);
return -EINVAL; return -EINVAL;
} }
tdm->simode_tdm |= TSA_SIMODE_TDM_TFSD(val); tdm->simode_tdm |= TSA_SIMODE_TDM_TFSD(val);
@ -792,13 +784,11 @@ invalid_tdm:
clk = of_clk_get_by_name(tdm_np, tsa_is_qe(tsa) ? "rsync" : "l1rsync"); clk = of_clk_get_by_name(tdm_np, tsa_is_qe(tsa) ? "rsync" : "l1rsync");
if (IS_ERR(clk)) { if (IS_ERR(clk)) {
ret = PTR_ERR(clk); ret = PTR_ERR(clk);
of_node_put(tdm_np);
goto err; goto err;
} }
ret = clk_prepare_enable(clk); ret = clk_prepare_enable(clk);
if (ret) { if (ret) {
clk_put(clk); clk_put(clk);
of_node_put(tdm_np);
goto err; goto err;
} }
tdm->l1rsync_clk = clk; tdm->l1rsync_clk = clk;
@ -806,13 +796,11 @@ invalid_tdm:
clk = of_clk_get_by_name(tdm_np, tsa_is_qe(tsa) ? "rclk" : "l1rclk"); clk = of_clk_get_by_name(tdm_np, tsa_is_qe(tsa) ? "rclk" : "l1rclk");
if (IS_ERR(clk)) { if (IS_ERR(clk)) {
ret = PTR_ERR(clk); ret = PTR_ERR(clk);
of_node_put(tdm_np);
goto err; goto err;
} }
ret = clk_prepare_enable(clk); ret = clk_prepare_enable(clk);
if (ret) { if (ret) {
clk_put(clk); clk_put(clk);
of_node_put(tdm_np);
goto err; goto err;
} }
tdm->l1rclk_clk = clk; tdm->l1rclk_clk = clk;
@ -821,13 +809,11 @@ invalid_tdm:
clk = of_clk_get_by_name(tdm_np, tsa_is_qe(tsa) ? "tsync" : "l1tsync"); clk = of_clk_get_by_name(tdm_np, tsa_is_qe(tsa) ? "tsync" : "l1tsync");
if (IS_ERR(clk)) { if (IS_ERR(clk)) {
ret = PTR_ERR(clk); ret = PTR_ERR(clk);
of_node_put(tdm_np);
goto err; goto err;
} }
ret = clk_prepare_enable(clk); ret = clk_prepare_enable(clk);
if (ret) { if (ret) {
clk_put(clk); clk_put(clk);
of_node_put(tdm_np);
goto err; goto err;
} }
tdm->l1tsync_clk = clk; tdm->l1tsync_clk = clk;
@ -835,13 +821,11 @@ invalid_tdm:
clk = of_clk_get_by_name(tdm_np, tsa_is_qe(tsa) ? "tclk" : "l1tclk"); clk = of_clk_get_by_name(tdm_np, tsa_is_qe(tsa) ? "tclk" : "l1tclk");
if (IS_ERR(clk)) { if (IS_ERR(clk)) {
ret = PTR_ERR(clk); ret = PTR_ERR(clk);
of_node_put(tdm_np);
goto err; goto err;
} }
ret = clk_prepare_enable(clk); ret = clk_prepare_enable(clk);
if (ret) { if (ret) {
clk_put(clk); clk_put(clk);
of_node_put(tdm_np);
goto err; goto err;
} }
tdm->l1tclk_clk = clk; tdm->l1tclk_clk = clk;
@ -859,16 +843,12 @@ invalid_tdm:
} }
ret = tsa_of_parse_tdm_rx_route(tsa, tdm_np, tsa->tdms, tdm_id); ret = tsa_of_parse_tdm_rx_route(tsa, tdm_np, tsa->tdms, tdm_id);
if (ret) { if (ret)
of_node_put(tdm_np);
goto err; goto err;
}
ret = tsa_of_parse_tdm_tx_route(tsa, tdm_np, tsa->tdms, tdm_id); ret = tsa_of_parse_tdm_tx_route(tsa, tdm_np, tsa->tdms, tdm_id);
if (ret) { if (ret)
of_node_put(tdm_np);
goto err; goto err;
}
tdm->is_enable = true; tdm->is_enable = true;
} }