Skip to content

Commit

Permalink
pinctrl: stm32: set default gpio line names using pin names
Browse files Browse the repository at this point in the history
Add stm32_pctrl_get_desc_pin_from_gpio function to find a stm32 pin
descriptor which is matching with a gpio.
Most of the time pin number is equal to pin index in array. So the first
part of the function is useful to speed up.

And during gpio bank register, we set default gpio names with pin names.

Signed-off-by: Valentin Caron <[email protected]>
Change-Id: I4bf65ae77cc3f01d2e81c3944d3be69f00f70aff
Reviewed-on: https://gerrit.st.com/c/mpu/oe/st/linux-stm32/+/271696
Reviewed-by: CITOOLS <[email protected]>
Reviewed-by: CIBUILD <[email protected]>
Reviewed-by: Antonio Maria BORNEO <[email protected]>
Reviewed-by: Amelie DELAUNAY <[email protected]>
Reviewed-by: Eric FOURMONT <[email protected]>
Domain-Review: Amelie DELAUNAY <[email protected]>
  • Loading branch information
VCASTM authored and fourmone committed Oct 26, 2022
1 parent 7f29f81 commit 8a71c8c
Showing 1 changed file with 35 additions and 0 deletions.
35 changes: 35 additions & 0 deletions drivers/pinctrl/stm32/pinctrl-stm32.c
Original file line number Diff line number Diff line change
Expand Up @@ -1281,6 +1281,28 @@ static const struct pinconf_ops stm32_pconf_ops = {
.pin_config_dbg_show = stm32_pconf_dbg_show,
};

static struct stm32_desc_pin *stm32_pctrl_get_desc_pin_from_gpio(struct stm32_pinctrl *pctl,
struct stm32_gpio_bank *bank,
unsigned int offset)
{
unsigned int stm32_pin_nb = bank->bank_nr * STM32_GPIO_PINS_PER_BANK + offset;
struct stm32_desc_pin *pin_desc;
int i;

/* With few exceptions (e.g. bank 'Z'), pin number matches with pin index in array */
pin_desc = pctl->pins + stm32_pin_nb;
if (pin_desc->pin.number == stm32_pin_nb)
return pin_desc;

/* Otherwise, loop all array to find the pin with the right number */
for (i = 0; i < pctl->npins; i++) {
pin_desc = pctl->pins + i;
if (pin_desc->pin.number == stm32_pin_nb)
return pin_desc;
}
return NULL;
}

static int stm32_gpiolib_register_bank(struct stm32_pinctrl *pctl,
struct device_node *np)
{
Expand All @@ -1292,6 +1314,8 @@ static int stm32_gpiolib_register_bank(struct stm32_pinctrl *pctl,
struct resource res;
int npins = STM32_GPIO_PINS_PER_BANK;
int bank_nr, err, i = 0;
struct stm32_desc_pin *stm32_pin;
char **names;

if (!IS_ERR(bank->rstc))
reset_control_deassert(bank->rstc);
Expand Down Expand Up @@ -1361,6 +1385,17 @@ static int stm32_gpiolib_register_bank(struct stm32_pinctrl *pctl,
}
}

names = devm_kcalloc(dev, npins, sizeof(char *), GFP_KERNEL);
for (i = 0; i < npins; i++) {
stm32_pin = stm32_pctrl_get_desc_pin_from_gpio(pctl, bank, i);
if (stm32_pin && stm32_pin->pin.name)
names[i] = devm_kasprintf(dev, GFP_KERNEL, "%s", stm32_pin->pin.name);
else
names[i] = NULL;
}

bank->gpio_chip.names = (const char * const *)names;

err = gpiochip_add_data(&bank->gpio_chip, bank);
if (err) {
dev_err(dev, "Failed to add gpiochip(%d)!\n", bank_nr);
Expand Down

0 comments on commit 8a71c8c

Please sign in to comment.