summaryrefslogtreecommitdiffstats
path: root/drivers/pinctrl/stm32
diff options
context:
space:
mode:
authorAlexandre Torgue <alexandre.torgue@st.com>2018-07-16 08:57:36 -0400
committerLinus Walleij <linus.walleij@linaro.org>2018-07-29 16:01:34 -0400
commit3b8283f007cbf09eee64804606af23af5f734d54 (patch)
tree58a46627790da82fc2c1056375e4dc08d5c6133d /drivers/pinctrl/stm32
parent423ddc580b13633429ed17c1c3a3059f402a3660 (diff)
pinctrl: stm32: fix bank io port number
In case the exti line is not in line with the bank number (that is the case when there is an hole between two banks, for example GPIOK and then GPIOZ), use "st,bank-ioport" DT property to get the right exti line. Signed-off-by: Amelie Delaunay <amelie.delaunay@st.com> Signed-off-by: Alexandre Torgue <alexandre.torgue@st.com> Reviewed-by: Rob Herring <robh@kernel.org> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/pinctrl/stm32')
-rw-r--r--drivers/pinctrl/stm32/pinctrl-stm32.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/pinctrl/stm32/pinctrl-stm32.c b/drivers/pinctrl/stm32/pinctrl-stm32.c
index dfed60982a8a..eb6ae1462f4e 100644
--- a/drivers/pinctrl/stm32/pinctrl-stm32.c
+++ b/drivers/pinctrl/stm32/pinctrl-stm32.c
@@ -73,6 +73,7 @@ struct stm32_gpio_bank {
73 struct fwnode_handle *fwnode; 73 struct fwnode_handle *fwnode;
74 struct irq_domain *domain; 74 struct irq_domain *domain;
75 u32 bank_nr; 75 u32 bank_nr;
76 u32 bank_ioport_nr;
76}; 77};
77 78
78struct stm32_pinctrl { 79struct stm32_pinctrl {
@@ -298,7 +299,7 @@ static int stm32_gpio_domain_activate(struct irq_domain *d,
298 struct stm32_gpio_bank *bank = d->host_data; 299 struct stm32_gpio_bank *bank = d->host_data;
299 struct stm32_pinctrl *pctl = dev_get_drvdata(bank->gpio_chip.parent); 300 struct stm32_pinctrl *pctl = dev_get_drvdata(bank->gpio_chip.parent);
300 301
301 regmap_field_write(pctl->irqmux[irq_data->hwirq], bank->bank_nr); 302 regmap_field_write(pctl->irqmux[irq_data->hwirq], bank->bank_ioport_nr);
302 return 0; 303 return 0;
303} 304}
304 305
@@ -948,6 +949,7 @@ static int stm32_gpiolib_register_bank(struct stm32_pinctrl *pctl,
948 struct device_node *np) 949 struct device_node *np)
949{ 950{
950 struct stm32_gpio_bank *bank = &pctl->banks[pctl->nbanks]; 951 struct stm32_gpio_bank *bank = &pctl->banks[pctl->nbanks];
952 int bank_ioport_nr;
951 struct pinctrl_gpio_range *range = &bank->range; 953 struct pinctrl_gpio_range *range = &bank->range;
952 struct of_phandle_args args; 954 struct of_phandle_args args;
953 struct device *dev = pctl->dev; 955 struct device *dev = pctl->dev;
@@ -998,12 +1000,17 @@ static int stm32_gpiolib_register_bank(struct stm32_pinctrl *pctl,
998 pinctrl_add_gpio_range(pctl->pctl_dev, 1000 pinctrl_add_gpio_range(pctl->pctl_dev,
999 &pctl->banks[bank_nr].range); 1001 &pctl->banks[bank_nr].range);
1000 } 1002 }
1003
1004 if (of_property_read_u32(np, "st,bank-ioport", &bank_ioport_nr))
1005 bank_ioport_nr = bank_nr;
1006
1001 bank->gpio_chip.base = bank_nr * STM32_GPIO_PINS_PER_BANK; 1007 bank->gpio_chip.base = bank_nr * STM32_GPIO_PINS_PER_BANK;
1002 1008
1003 bank->gpio_chip.ngpio = npins; 1009 bank->gpio_chip.ngpio = npins;
1004 bank->gpio_chip.of_node = np; 1010 bank->gpio_chip.of_node = np;
1005 bank->gpio_chip.parent = dev; 1011 bank->gpio_chip.parent = dev;
1006 bank->bank_nr = bank_nr; 1012 bank->bank_nr = bank_nr;
1013 bank->bank_ioport_nr = bank_ioport_nr;
1007 spin_lock_init(&bank->lock); 1014 spin_lock_init(&bank->lock);
1008 1015
1009 /* create irq hierarchical domain */ 1016 /* create irq hierarchical domain */