mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH v2 0/4] pinctrl: free maps on DT mapping failures
@ 2026-10-03  8:31 Jiale Yao
  2026-10-03  8:31 ` [PATCH v2 1/4] pinctrl: sprd: free maps on DT map failure Jiale Yao
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Jiale Yao @ 2026-10-03  8:31 UTC (permalink / raw)
  To: Geert Uytterhoeven, Linus Walleij, Krzysztof Kozlowski,
	Sylwester Nawrocki, Peter Griffin, Alim Akhtar, Orson Zhai,
	Baolin Wang, Chunyan Zhang, Thierry Reding, Jonathan Hunter,
	linux-renesas-soc, linux-gpio, linux-kernel, linux-arm-kernel,
	linux-samsung-soc, linux-tegra
  Cc: Jiale Yao

Several pinctrl drivers reserve map storage before appending mux and
configuration entries while translating device tree nodes.  If a later
operation fails, their error paths free only temporary configuration data
and leave the partially built map allocated.

Commit 17007cd70060 ("pinctrl: generic: free maps on
pinctrl_generic_to_map() failure") fixed the same cleanup problem in the
generic mapping helper.  These drivers use their own mapping callbacks and
need equivalent error handling.

Free the accumulated map on every failure path in the Spreadtrum, Renesas
RZ/N1, Tegra XUSB, and Samsung drivers.  Each patch changes one driver and
remains independently buildable.

Changes in v2:
- Add the Fixes tag and Baolin's Reviewed-by tag to patch 1.
- Drop the unnecessary output parameter resets from all four patches and
  update their commit messages accordingly.

Jiale Yao (4):
  pinctrl: sprd: free maps on DT map failure
  pinctrl: renesas: rzn1: free maps on DT map failure
  pinctrl: tegra: xusb: free maps on DT map failure
  pinctrl: samsung: free maps on DT map failure

 drivers/pinctrl/renesas/pinctrl-rzn1.c     |  8 ++++++--
 drivers/pinctrl/samsung/pinctrl-samsung.c  | 24 ++++++++++++++--------
 drivers/pinctrl/sprd/pinctrl-sprd.c        |  3 +++
 drivers/pinctrl/tegra/pinctrl-tegra-xusb.c |  6 +++++-
 4 files changed, 29 insertions(+), 12 deletions(-)

-- 
2.34.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [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

end of thread, other threads:[~2026-10-03  8:32 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
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 ` [PATCH v2 3/4] pinctrl: tegra: xusb: " Jiale Yao
2026-10-03  8:31 ` [PATCH v2 4/4] pinctrl: samsung: " Jiale Yao

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®