Commit b1a05ba9 authored by Alexandre Torgue's avatar Alexandre Torgue Committed by Linus Walleij

pinctrl: stm32: add possibility to configure pins individually

Adds the possibility to configure a single pin through the gpiolib (i.e:
to set PULL_UP/PULL_DOWN config).
Mutex behavior is slightly changed to avoid a deadlock when pin_config_set
is called (in this case pctldev->mutex is already taken).
Signed-off-by: default avatarAlexandre Torgue <alexandre.torgue@st.com>
Link: https://lore.kernel.org/r/20200615125951.28008-3-alexandre.torgue@st.comSigned-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent d9665bb8
...@@ -303,6 +303,7 @@ static const struct gpio_chip stm32_gpio_template = { ...@@ -303,6 +303,7 @@ static const struct gpio_chip stm32_gpio_template = {
.direction_output = stm32_gpio_direction_output, .direction_output = stm32_gpio_direction_output,
.to_irq = stm32_gpio_to_irq, .to_irq = stm32_gpio_to_irq,
.get_direction = stm32_gpio_get_direction, .get_direction = stm32_gpio_get_direction,
.set_config = gpiochip_generic_config,
}; };
static void stm32_gpio_irq_trigger(struct irq_data *d) static void stm32_gpio_irq_trigger(struct irq_data *d)
...@@ -1052,7 +1053,7 @@ static int stm32_pconf_parse_conf(struct pinctrl_dev *pctldev, ...@@ -1052,7 +1053,7 @@ static int stm32_pconf_parse_conf(struct pinctrl_dev *pctldev,
struct stm32_gpio_bank *bank; struct stm32_gpio_bank *bank;
int offset, ret = 0; int offset, ret = 0;
range = pinctrl_find_gpio_range_from_pin(pctldev, pin); range = pinctrl_find_gpio_range_from_pin_nolock(pctldev, pin);
if (!range) { if (!range) {
dev_err(pctl->dev, "No gpio range defined.\n"); dev_err(pctl->dev, "No gpio range defined.\n");
return -EINVAL; return -EINVAL;
...@@ -1110,9 +1111,11 @@ static int stm32_pconf_group_set(struct pinctrl_dev *pctldev, unsigned group, ...@@ -1110,9 +1111,11 @@ static int stm32_pconf_group_set(struct pinctrl_dev *pctldev, unsigned group,
int i, ret; int i, ret;
for (i = 0; i < num_configs; i++) { for (i = 0; i < num_configs; i++) {
mutex_lock(&pctldev->mutex);
ret = stm32_pconf_parse_conf(pctldev, g->pin, ret = stm32_pconf_parse_conf(pctldev, g->pin,
pinconf_to_config_param(configs[i]), pinconf_to_config_param(configs[i]),
pinconf_to_config_argument(configs[i])); pinconf_to_config_argument(configs[i]));
mutex_unlock(&pctldev->mutex);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -1122,6 +1125,22 @@ static int stm32_pconf_group_set(struct pinctrl_dev *pctldev, unsigned group, ...@@ -1122,6 +1125,22 @@ static int stm32_pconf_group_set(struct pinctrl_dev *pctldev, unsigned group,
return 0; return 0;
} }
static int stm32_pconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
unsigned long *configs, unsigned int num_configs)
{
int i, ret;
for (i = 0; i < num_configs; i++) {
ret = stm32_pconf_parse_conf(pctldev, pin,
pinconf_to_config_param(configs[i]),
pinconf_to_config_argument(configs[i]));
if (ret < 0)
return ret;
}
return 0;
}
static void stm32_pconf_dbg_show(struct pinctrl_dev *pctldev, static void stm32_pconf_dbg_show(struct pinctrl_dev *pctldev,
struct seq_file *s, struct seq_file *s,
unsigned int pin) unsigned int pin)
...@@ -1187,10 +1206,10 @@ static void stm32_pconf_dbg_show(struct pinctrl_dev *pctldev, ...@@ -1187,10 +1206,10 @@ static void stm32_pconf_dbg_show(struct pinctrl_dev *pctldev,
} }
} }
static const struct pinconf_ops stm32_pconf_ops = { static const struct pinconf_ops stm32_pconf_ops = {
.pin_config_group_get = stm32_pconf_group_get, .pin_config_group_get = stm32_pconf_group_get,
.pin_config_group_set = stm32_pconf_group_set, .pin_config_group_set = stm32_pconf_group_set,
.pin_config_set = stm32_pconf_set,
.pin_config_dbg_show = stm32_pconf_dbg_show, .pin_config_dbg_show = stm32_pconf_dbg_show,
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment