[PATCH 4/4] pinctrl: samsung: free maps on DT map failure

From: Jiale Yao

Date: Thu Sep 24 2026 - 07:56:37 EST


samsung_dt_subnode_to_map() can reserve map storage before adding
configuration entries. The no-child path returns its error directly, and
the child path frees mappings without clearing the output parameters.

Use one error path that frees the accumulated map and clears the output
parameters for both cases.

Signed-off-by: Jiale Yao <yaojiale02@xxxxxxx>
---
drivers/pinctrl/samsung/pinctrl-samsung.c | 26 +++++++++++++++--------
1 file changed, 17 insertions(+), 9 deletions(-)

diff --git a/drivers/pinctrl/samsung/pinctrl-samsung.c b/drivers/pinctrl/samsung/pinctrl-samsung.c
index 5ecc9ed4c44d..4b202fbbcb80 100644
--- a/drivers/pinctrl/samsung/pinctrl-samsung.c
+++ b/drivers/pinctrl/samsung/pinctrl-samsung.c
@@ -259,22 +259,30 @@ static int samsung_dt_node_to_map(struct pinctrl_dev *pctldev,
*map = NULL;
*num_maps = 0;

- if (!of_get_child_count(np_config))
- return samsung_dt_subnode_to_map(drvdata, pctldev->dev,
- np_config, map,
- &reserved_maps,
- num_maps);
+ if (!of_get_child_count(np_config)) {
+ ret = samsung_dt_subnode_to_map(drvdata, pctldev->dev,
+ np_config, map, &reserved_maps,
+ num_maps);
+ if (ret < 0)
+ goto err_free_map;
+
+ return 0;
+ }

for_each_child_of_node_scoped(np_config, np) {
ret = samsung_dt_subnode_to_map(drvdata, pctldev->dev, np, map,
&reserved_maps, num_maps);
- if (ret < 0) {
- samsung_dt_free_map(pctldev, *map, *num_maps);
- return ret;
- }
+ if (ret < 0)
+ goto err_free_map;
}

return 0;
+
+err_free_map:
+ samsung_dt_free_map(pctldev, *map, *num_maps);
+ *map = NULL;
+ *num_maps = 0;
+ return ret;
}

#ifdef CONFIG_DEBUG_FS
--
2.34.1