Commit 2e9ba1d9 authored by Thomas Richard's avatar Thomas Richard Committed by Linus Walleij
Browse files

pinctrl: core: add devm_pinctrl_register_mappings()



Using devm_pinctrl_register_mappings(), the core can automatically
unregister pinctrl mappings.

Reviewed-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarThomas Richard <thomas.richard@bootlin.com>
Link: https://lore.kernel.org/20250520-aaeon-up-board-pinctrl-support-v6-3-dcb3756be3c6@bootlin.com


Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent 223657cf
Loading
Loading
Loading
Loading
+29 −0
Original line number Diff line number Diff line
@@ -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
+11 −0
Original line number Diff line number Diff line
@@ -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)
{
}