]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
pinctrl: core: add devm_pinctrl_register_mappings()
authorThomas Richard <thomas.richard@bootlin.com>
Tue, 20 May 2025 13:28:27 +0000 (15:28 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Wed, 21 May 2025 08:09:47 +0000 (10:09 +0200)
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>
Link: https://lore.kernel.org/20250520-aaeon-up-board-pinctrl-support-v6-3-dcb3756be3c6@bootlin.com
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/core.c
include/linux/pinctrl/machine.h

index 4bdbf6bb26e2c2ada0361aa4d29f9d382d1293d1..9046292d1360218bc70eff418fb8d1028c22b11a 100644 (file)
@@ -1530,6 +1530,35 @@ void pinctrl_unregister_mappings(const struct pinctrl_map *map)
 }
 EXPORT_SYMBOL_GPL(pinctrl_unregister_mappings);
 
+static void devm_pinctrl_unregister_mappings(void *maps)
+{
+       pinctrl_unregister_mappings(maps);
+}
+
+/**
+ * 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
+ *
+ * Returns: 0 on success, or negative errno on failure.
+ */
+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
index 0940fabb154daab0675646de1faae49b5f736383..25620229b1d65bbc474e0f2fa38aeae6472b39df 100644 (file)
@@ -149,12 +149,16 @@ 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
@@ -165,6 +169,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)
 {
 }