diff options
-rw-r--r-- | drivers/pinctrl/pinconf-generic.c | 19 | ||||
-rw-r--r-- | drivers/pinctrl/pinctrl-utils.c | 12 | ||||
-rw-r--r-- | include/linux/pinctrl/pinconf-generic.h | 45 |
3 files changed, 60 insertions, 16 deletions
diff --git a/drivers/pinctrl/pinconf-generic.c b/drivers/pinctrl/pinconf-generic.c index d54b877cb704..872e74a23788 100644 --- a/drivers/pinctrl/pinconf-generic.c +++ b/drivers/pinctrl/pinconf-generic.c @@ -242,9 +242,10 @@ out: return ret; } -int pinconf_generic_dt_subnode_to_map(struct pinctrl_dev *pctldev, +int pinconf_generic_dt_subnode_to_map_new(struct pinctrl_dev *pctldev, struct device_node *np, struct pinctrl_map **map, - unsigned *reserved_maps, unsigned *num_maps) + unsigned *reserved_maps, unsigned *num_maps, + enum pinctrl_map_type type) { int ret; const char *function; @@ -298,7 +299,7 @@ int pinconf_generic_dt_subnode_to_map(struct pinctrl_dev *pctldev, if (num_configs) { ret = pinctrl_utils_add_map_configs(pctldev, map, reserved_maps, num_maps, group, configs, - num_configs, PIN_MAP_TYPE_CONFIGS_PIN); + num_configs, type); if (ret < 0) goto exit; } @@ -309,11 +310,11 @@ exit: kfree(configs); return ret; } -EXPORT_SYMBOL_GPL(pinconf_generic_dt_subnode_to_map); +EXPORT_SYMBOL_GPL(pinconf_generic_dt_subnode_to_map_new); -int pinconf_generic_dt_node_to_map(struct pinctrl_dev *pctldev, +int pinconf_generic_dt_node_to_map_new(struct pinctrl_dev *pctldev, struct device_node *np_config, struct pinctrl_map **map, - unsigned *num_maps) + unsigned *num_maps, enum pinctrl_map_type type) { unsigned reserved_maps; struct device_node *np; @@ -324,8 +325,8 @@ int pinconf_generic_dt_node_to_map(struct pinctrl_dev *pctldev, *num_maps = 0; for_each_child_of_node(np_config, np) { - ret = pinconf_generic_dt_subnode_to_map(pctldev, np, map, - &reserved_maps, num_maps); + ret = pinconf_generic_dt_subnode_to_map_new(pctldev, np, map, + &reserved_maps, num_maps, type); if (ret < 0) { pinctrl_utils_dt_free_map(pctldev, *map, *num_maps); return ret; @@ -333,6 +334,6 @@ int pinconf_generic_dt_node_to_map(struct pinctrl_dev *pctldev, } return 0; } -EXPORT_SYMBOL_GPL(pinconf_generic_dt_node_to_map); +EXPORT_SYMBOL_GPL(pinconf_generic_dt_node_to_map_new); #endif diff --git a/drivers/pinctrl/pinctrl-utils.c b/drivers/pinctrl/pinctrl-utils.c index b7ac646c43ba..48277e025f84 100644 --- a/drivers/pinctrl/pinctrl-utils.c +++ b/drivers/pinctrl/pinctrl-utils.c @@ -126,10 +126,16 @@ void pinctrl_utils_dt_free_map(struct pinctrl_dev *pctldev, { int i; - for (i = 0; i < num_maps; i++) - if (map[i].type == PIN_MAP_TYPE_CONFIGS_GROUP) + for (i = 0; i < num_maps; i++) { + switch (map[i].type) { + case PIN_MAP_TYPE_CONFIGS_GROUP: + case PIN_MAP_TYPE_CONFIGS_PIN: kfree(map[i].data.configs.configs); - + break; + default: + break; + } + } kfree(map); } EXPORT_SYMBOL_GPL(pinctrl_utils_dt_free_map); diff --git a/include/linux/pinctrl/pinconf-generic.h b/include/linux/pinctrl/pinconf-generic.h index 447269672e2c..201e68de2d11 100644 --- a/include/linux/pinctrl/pinconf-generic.h +++ b/include/linux/pinctrl/pinconf-generic.h @@ -140,15 +140,52 @@ static inline unsigned long pinconf_to_config_packed(enum pin_config_param param #ifdef CONFIG_OF #include <linux/device.h> +#include <linux/pinctrl/machine.h> struct pinctrl_dev; struct pinctrl_map; -int pinconf_generic_dt_subnode_to_map(struct pinctrl_dev *pctldev, +int pinconf_generic_dt_subnode_to_map_new(struct pinctrl_dev *pctldev, struct device_node *np, struct pinctrl_map **map, - unsigned *reserved_maps, unsigned *num_maps); -int pinconf_generic_dt_node_to_map(struct pinctrl_dev *pctldev, + unsigned *reserved_maps, unsigned *num_maps, + enum pinctrl_map_type type); +int pinconf_generic_dt_node_to_map_new(struct pinctrl_dev *pctldev, struct device_node *np_config, struct pinctrl_map **map, - unsigned *num_maps); + unsigned *num_maps, enum pinctrl_map_type type); + +static inline int pinconf_generic_dt_node_to_map_group( + struct pinctrl_dev *pctldev, struct device_node *np_config, + struct pinctrl_map **map, unsigned *num_maps) +{ + return pinconf_generic_dt_node_to_map_new(pctldev, np_config, map, num_maps, + PIN_MAP_TYPE_CONFIGS_GROUP); +} + +static inline int pinconf_generic_dt_subnode_to_map(struct pinctrl_dev *pctldev, + struct device_node *np, struct pinctrl_map **map, + unsigned *reserved_maps, unsigned *num_maps) +{ + return pinconf_generic_dt_subnode_to_map_new(pctldev, np, map, + reserved_maps, num_maps, + PIN_MAP_TYPE_CONFIGS_PIN); +} + +static inline int pinconf_generic_dt_node_to_map(struct pinctrl_dev *pctldev, + struct device_node *np_config, struct pinctrl_map **map, + unsigned *num_maps) +{ + return pinconf_generic_dt_node_to_map_new(pctldev, np_config, + map, num_maps, + PIN_MAP_TYPE_CONFIGS_PIN); +} + + +static inline int pinconf_generic_dt_node_to_map_pin( + struct pinctrl_dev *pctldev, struct device_node *np_config, + struct pinctrl_map **map, unsigned *num_maps) +{ + return pinconf_generic_dt_node_to_map_new(pctldev, np_config, map, num_maps, + PIN_MAP_TYPE_CONFIGS_PIN); +} #endif |