[PATCH v4 03/12] pinctrl: core: add devm_pinctrl_register_mappings()

Thomas Richard posted 12 patches 9 months, 2 weeks ago
There is a newer version of this series
[PATCH v4 03/12] pinctrl: core: add devm_pinctrl_register_mappings()
Posted by Thomas Richard 9 months, 2 weeks ago
Using devm_pinctrl_register_mappings(), the core can automatically
unregister pinctrl mappings.

Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Thomas Richard <thomas.richard@bootlin.com>
---
 drivers/pinctrl/core.c          | 27 +++++++++++++++++++++++++++
 include/linux/pinctrl/machine.h | 12 ++++++++++++
 2 files changed, 39 insertions(+)

diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c
index 6dd48dd2c035..970da6d88589 100644
--- a/drivers/pinctrl/core.c
+++ b/drivers/pinctrl/core.c
@@ -1543,6 +1543,33 @@ void pinctrl_unregister_mappings(const struct pinctrl_map *map)
 }
 EXPORT_SYMBOL_GPL(pinctrl_unregister_mappings);
 
+static void devm_pinctrl_unregister_mappings(void *data)
+{
+	pinctrl_unregister_mappings(*(const struct pinctrl_map **)data);
+}
+
+/**
+ * devm_pinctrl_register_mappings() - Resource managed pinctrl_register_mappings()
+ * @dev: device for which mappings are registered
+ * @maps: the pincontrol mappings table to register. Note the pinctrl-core
+ *	keeps a reference to the passed in maps, so they should _not_ be
+ *	marked with __initdata.
+ * @num_maps: the number of maps in the mapping table
+ */
+int devm_pinctrl_register_mappings(struct device *dev,
+				   const struct pinctrl_map *maps,
+				   unsigned int num_maps)
+{
+	int ret;
+
+	ret = pinctrl_register_mappings(maps, num_maps);
+	if (ret)
+		return ret;
+
+	return devm_add_action_or_reset(dev, devm_pinctrl_unregister_mappings, (void *)maps);
+}
+EXPORT_SYMBOL_GPL(devm_pinctrl_register_mappings);
+
 /**
  * pinctrl_force_sleep() - turn a given controller device into sleep state
  * @pctldev: pin controller device
diff --git a/include/linux/pinctrl/machine.h b/include/linux/pinctrl/machine.h
index 0940fabb154d..8bf433dd4ef2 100644
--- a/include/linux/pinctrl/machine.h
+++ b/include/linux/pinctrl/machine.h
@@ -149,14 +149,19 @@ struct pinctrl_map {
 #define PIN_MAP_CONFIGS_GROUP_HOG_DEFAULT(dev, grp, cfgs)		\
 	PIN_MAP_CONFIGS_GROUP(dev, PINCTRL_STATE_DEFAULT, dev, grp, cfgs)
 
+struct device;
 struct pinctrl_map;
 
 #ifdef CONFIG_PINCTRL
 
 int pinctrl_register_mappings(const struct pinctrl_map *map,
 			      unsigned int num_maps);
+int devm_pinctrl_register_mappings(struct device *dev,
+				   const struct pinctrl_map *map,
+				   unsigned int num_maps);
 void pinctrl_unregister_mappings(const struct pinctrl_map *map);
 void pinctrl_provide_dummies(void);
+
 #else
 
 static inline int pinctrl_register_mappings(const struct pinctrl_map *map,
@@ -165,6 +170,13 @@ static inline int pinctrl_register_mappings(const struct pinctrl_map *map,
 	return 0;
 }
 
+static inline int devm_pinctrl_register_mappings(struct device *dev,
+						 const struct pinctrl_map *map,
+						 unsigned int num_maps)
+{
+	return 0;
+}
+
 static inline void pinctrl_unregister_mappings(const struct pinctrl_map *map)
 {
 }

-- 
2.39.5
Re: [PATCH v4 03/12] pinctrl: core: add devm_pinctrl_register_mappings()
Posted by Andy Shevchenko 9 months, 2 weeks ago
On Tue, Apr 29, 2025 at 5:08 PM Thomas Richard
<thomas.richard@bootlin.com> wrote:
>
> Using devm_pinctrl_register_mappings(), the core can automatically
> unregister pinctrl mappings.

...

> +static void devm_pinctrl_unregister_mappings(void *data)

data --> maps

> +{
> +       pinctrl_unregister_mappings(*(const struct pinctrl_map **)data);

Why can't you use the 'maps' pointer directly here?

> +}
> +
> +/**
> + * devm_pinctrl_register_mappings() - Resource managed pinctrl_register_mappings()
> + * @dev: device for which mappings are registered
> + * @maps: the pincontrol mappings table to register. Note the pinctrl-core
> + *     keeps a reference to the passed in maps, so they should _not_ be
> + *     marked with __initdata.
> + * @num_maps: the number of maps in the mapping table

Missing Return: section. Please, validate the kernel doc.

> + */

...

>  void pinctrl_provide_dummies(void);
> +
>  #else

Stray change.


-- 
With Best Regards,
Andy Shevchenko