* [PATCH v2 1/4] pinctrl: sprd: free maps on DT map failure
2026-10-03 8:31 [PATCH v2 0/4] pinctrl: free maps on DT mapping failures Jiale Yao
@ 2026-10-03 8:31 ` Jiale Yao
2026-10-03 8:31 ` [PATCH v2 2/4] pinctrl: renesas: rzn1: " Jiale Yao
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Jiale Yao @ 2026-10-03 8:31 UTC (permalink / raw)
To: Linus Walleij, Orson Zhai, Baolin Wang, Chunyan Zhang,
linux-gpio, linux-kernel
Cc: Jiale Yao
sprd_dt_node_to_map() reserves map storage before adding mux and
configuration entries. If a later operation fails, the error path only
frees the temporary configurations and leaves the map allocation reachable
through the output pointer.
Free the partially built map on failure. The caller ignores the output
parameters when the mapping callback returns an error, so they do not need
to be reset after freeing the map.
Fixes: 41d32cfce1ae ("pinctrl: sprd: Add Spreadtrum pin control driver")
Signed-off-by: Jiale Yao <yaojiale02@163.com>
Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com>
---
drivers/pinctrl/sprd/pinctrl-sprd.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/pinctrl/sprd/pinctrl-sprd.c b/drivers/pinctrl/sprd/pinctrl-sprd.c
index 16cf9d15f247..a565d4fd4233 100644
--- a/drivers/pinctrl/sprd/pinctrl-sprd.c
+++ b/drivers/pinctrl/sprd/pinctrl-sprd.c
@@ -326,6 +326,9 @@ static int sprd_dt_node_to_map(struct pinctrl_dev *pctldev,
out:
kfree(configs);
+ if (ret < 0)
+ pinctrl_utils_free_map(pctldev, *map, *num_maps);
+
return ret;
}
--
2.34.1
^ permalink raw reply [flat|nested] 5+ messages in thread* [PATCH v2 2/4] pinctrl: renesas: rzn1: free maps on DT map failure
2026-10-03 8:31 [PATCH v2 0/4] pinctrl: free maps on DT mapping failures Jiale Yao
2026-10-03 8:31 ` [PATCH v2 1/4] pinctrl: sprd: free maps on DT map failure Jiale Yao
@ 2026-10-03 8:31 ` Jiale Yao
2026-10-03 8:31 ` [PATCH v2 3/4] pinctrl: tegra: xusb: " Jiale Yao
2026-10-03 8:31 ` [PATCH v2 4/4] pinctrl: samsung: " Jiale Yao
3 siblings, 0 replies; 5+ messages in thread
From: Jiale Yao @ 2026-10-03 8:31 UTC (permalink / raw)
To: Geert Uytterhoeven, Linus Walleij, linux-renesas-soc, linux-gpio,
linux-kernel
Cc: Jiale Yao
rzn1_dt_node_to_map_one() appends mappings for each DT node. If a
node fails after map storage has been reserved, the top-level callback
returns without releasing mappings built for the current and previous
nodes.
Free the accumulated map on every error path. The caller ignores the
output parameters when the mapping callback returns an error, so they do
not need to be reset after freeing the map.
Signed-off-by: Jiale Yao <yaojiale02@163.com>
---
drivers/pinctrl/renesas/pinctrl-rzn1.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/drivers/pinctrl/renesas/pinctrl-rzn1.c b/drivers/pinctrl/renesas/pinctrl-rzn1.c
index fb874867dbfb..64a89e307191 100644
--- a/drivers/pinctrl/renesas/pinctrl-rzn1.c
+++ b/drivers/pinctrl/renesas/pinctrl-rzn1.c
@@ -411,15 +411,19 @@ static int rzn1_dt_node_to_map(struct pinctrl_dev *pctldev,
ret = rzn1_dt_node_to_map_one(pctldev, np, map, num_maps);
if (ret < 0)
- return ret;
+ goto err_free_map;
for_each_child_of_node_scoped(np, child) {
ret = rzn1_dt_node_to_map_one(pctldev, child, map, num_maps);
if (ret < 0)
- return ret;
+ goto err_free_map;
}
return 0;
+
+err_free_map:
+ pinctrl_utils_free_map(pctldev, *map, *num_maps);
+ return ret;
}
static const struct pinctrl_ops rzn1_pctrl_ops = {
--
2.34.1
^ permalink raw reply [flat|nested] 5+ messages in thread* [PATCH v2 3/4] pinctrl: tegra: xusb: free maps on DT map failure
2026-10-03 8:31 [PATCH v2 0/4] pinctrl: free maps on DT mapping failures Jiale Yao
2026-10-03 8:31 ` [PATCH v2 1/4] pinctrl: sprd: free maps on DT map failure Jiale Yao
2026-10-03 8:31 ` [PATCH v2 2/4] pinctrl: renesas: rzn1: " Jiale Yao
@ 2026-10-03 8:31 ` Jiale Yao
2026-10-03 8:31 ` [PATCH v2 4/4] pinctrl: samsung: " Jiale Yao
3 siblings, 0 replies; 5+ messages in thread
From: Jiale Yao @ 2026-10-03 8:31 UTC (permalink / raw)
To: Linus Walleij, Thierry Reding, Jonathan Hunter,
Krzysztof Kozlowski, linux-gpio, linux-tegra, linux-kernel
Cc: Jiale Yao
tegra_xusb_padctl_parse_subnode() can append mappings before a later
child or configuration operation fails. The top-level callback currently
returns the error while retaining all mappings allocated for earlier
children.
Free the accumulated map on failure. The caller ignores the output
parameters when the mapping callback returns an error, so they do not need
to be reset after freeing the map.
Signed-off-by: Jiale Yao <yaojiale02@163.com>
---
drivers/pinctrl/tegra/pinctrl-tegra-xusb.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/drivers/pinctrl/tegra/pinctrl-tegra-xusb.c b/drivers/pinctrl/tegra/pinctrl-tegra-xusb.c
index c6a51bb21215..fb70f8aee56b 100644
--- a/drivers/pinctrl/tegra/pinctrl-tegra-xusb.c
+++ b/drivers/pinctrl/tegra/pinctrl-tegra-xusb.c
@@ -248,10 +248,14 @@ static int tegra_xusb_padctl_dt_node_to_map(struct pinctrl_dev *pinctrl,
&reserved_maps,
num_maps);
if (err < 0)
- return err;
+ goto err_free_map;
}
return 0;
+
+err_free_map:
+ pinctrl_utils_free_map(pinctrl, *maps, *num_maps);
+ return err;
}
static const struct pinctrl_ops tegra_xusb_padctl_pinctrl_ops = {
--
2.34.1
^ permalink raw reply [flat|nested] 5+ messages in thread* [PATCH v2 4/4] pinctrl: samsung: free maps on DT map failure
2026-10-03 8:31 [PATCH v2 0/4] pinctrl: free maps on DT mapping failures Jiale Yao
` (2 preceding siblings ...)
2026-10-03 8:31 ` [PATCH v2 3/4] pinctrl: tegra: xusb: " Jiale Yao
@ 2026-10-03 8:31 ` Jiale Yao
3 siblings, 0 replies; 5+ messages in thread
From: Jiale Yao @ 2026-10-03 8:31 UTC (permalink / raw)
To: Krzysztof Kozlowski, Sylwester Nawrocki, Peter Griffin,
Alim Akhtar, Linus Walleij, linux-arm-kernel, linux-samsung-soc,
linux-gpio, linux-kernel
Cc: Jiale Yao
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 on failure.
Use one error path that frees the accumulated map in both cases. The
caller ignores the output parameters when the mapping callback returns an
error, so they do not need to be reset after freeing the map.
Signed-off-by: Jiale Yao <yaojiale02@163.com>
---
drivers/pinctrl/samsung/pinctrl-samsung.c | 24 ++++++++++++++---------
1 file changed, 15 insertions(+), 9 deletions(-)
diff --git a/drivers/pinctrl/samsung/pinctrl-samsung.c b/drivers/pinctrl/samsung/pinctrl-samsung.c
index 5ecc9ed4c44d..0a1e6063fb5f 100644
--- a/drivers/pinctrl/samsung/pinctrl-samsung.c
+++ b/drivers/pinctrl/samsung/pinctrl-samsung.c
@@ -259,22 +259,28 @@ 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);
+ return ret;
}
#ifdef CONFIG_DEBUG_FS
--
2.34.1
^ permalink raw reply [flat|nested] 5+ messages in thread