Using devm_pinctrl_register_mappings(), the core can automatically unregister pinctrl mappings.
Reviewed-by: Linus Walleij <[email protected]> Signed-off-by: Thomas Richard <[email protected]> --- 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
