diff options
author | Alexandre TORGUE <alexandre.torgue@st.com> | 2017-04-07 08:42:58 -0400 |
---|---|---|
committer | Linus Walleij <linus.walleij@linaro.org> | 2017-04-24 08:20:05 -0400 |
commit | 1dc9d289154bd8751b5a2b69698a819742026ce4 (patch) | |
tree | cadf5eda66bab4a388ab9c0d1d19d2908d262757 /drivers/pinctrl/stm32 | |
parent | 5715092a458c1ac5f7befc1a3dd7660ccfcebcf1 (diff) |
pinctrl: stm32: add possibility to use gpio-ranges to declare bank range
Use device tree entries to declare gpio range. It will allow to use
no contiguous gpio bank and holes inside a bank.
Signed-off-by: Alexandre TORGUE <alexandre.torgue@st.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/pinctrl/stm32')
-rw-r--r-- | drivers/pinctrl/stm32/pinctrl-stm32.c | 115 |
1 files changed, 65 insertions, 50 deletions
diff --git a/drivers/pinctrl/stm32/pinctrl-stm32.c b/drivers/pinctrl/stm32/pinctrl-stm32.c index abc405be0212..d3c5f5dfbbd7 100644 --- a/drivers/pinctrl/stm32/pinctrl-stm32.c +++ b/drivers/pinctrl/stm32/pinctrl-stm32.c | |||
@@ -71,6 +71,7 @@ struct stm32_gpio_bank { | |||
71 | struct pinctrl_gpio_range range; | 71 | struct pinctrl_gpio_range range; |
72 | struct fwnode_handle *fwnode; | 72 | struct fwnode_handle *fwnode; |
73 | struct irq_domain *domain; | 73 | struct irq_domain *domain; |
74 | u32 bank_nr; | ||
74 | }; | 75 | }; |
75 | 76 | ||
76 | struct stm32_pinctrl { | 77 | struct stm32_pinctrl { |
@@ -138,6 +139,17 @@ static inline void __stm32_gpio_set(struct stm32_gpio_bank *bank, | |||
138 | 139 | ||
139 | static int stm32_gpio_request(struct gpio_chip *chip, unsigned offset) | 140 | static int stm32_gpio_request(struct gpio_chip *chip, unsigned offset) |
140 | { | 141 | { |
142 | struct stm32_gpio_bank *bank = gpiochip_get_data(chip); | ||
143 | struct stm32_pinctrl *pctl = dev_get_drvdata(bank->gpio_chip.parent); | ||
144 | struct pinctrl_gpio_range *range; | ||
145 | int pin = offset + (bank->bank_nr * STM32_GPIO_PINS_PER_BANK); | ||
146 | |||
147 | range = pinctrl_find_gpio_range_from_pin_nolock(pctl->pctl_dev, pin); | ||
148 | if (!range) { | ||
149 | dev_err(pctl->dev, "pin %d not in range.\n", pin); | ||
150 | return -EINVAL; | ||
151 | } | ||
152 | |||
141 | return pinctrl_request_gpio(chip->base + offset); | 153 | return pinctrl_request_gpio(chip->base + offset); |
142 | } | 154 | } |
143 | 155 | ||
@@ -235,7 +247,7 @@ static void stm32_gpio_domain_activate(struct irq_domain *d, | |||
235 | struct stm32_gpio_bank *bank = d->host_data; | 247 | struct stm32_gpio_bank *bank = d->host_data; |
236 | struct stm32_pinctrl *pctl = dev_get_drvdata(bank->gpio_chip.parent); | 248 | struct stm32_pinctrl *pctl = dev_get_drvdata(bank->gpio_chip.parent); |
237 | 249 | ||
238 | regmap_field_write(pctl->irqmux[irq_data->hwirq], bank->range.id); | 250 | regmap_field_write(pctl->irqmux[irq_data->hwirq], bank->bank_nr); |
239 | gpiochip_lock_as_irq(&bank->gpio_chip, irq_data->hwirq); | 251 | gpiochip_lock_as_irq(&bank->gpio_chip, irq_data->hwirq); |
240 | } | 252 | } |
241 | 253 | ||
@@ -589,7 +601,7 @@ static int stm32_pmx_set_mux(struct pinctrl_dev *pctldev, | |||
589 | } | 601 | } |
590 | 602 | ||
591 | range = pinctrl_find_gpio_range_from_pin(pctldev, g->pin); | 603 | range = pinctrl_find_gpio_range_from_pin(pctldev, g->pin); |
592 | bank = gpio_range_to_bank(range); | 604 | bank = gpiochip_get_data(range->gc); |
593 | pin = stm32_gpio_pin(g->pin); | 605 | pin = stm32_gpio_pin(g->pin); |
594 | 606 | ||
595 | mode = stm32_gpio_get_mode(function); | 607 | mode = stm32_gpio_get_mode(function); |
@@ -604,7 +616,7 @@ static int stm32_pmx_gpio_set_direction(struct pinctrl_dev *pctldev, | |||
604 | struct pinctrl_gpio_range *range, unsigned gpio, | 616 | struct pinctrl_gpio_range *range, unsigned gpio, |
605 | bool input) | 617 | bool input) |
606 | { | 618 | { |
607 | struct stm32_gpio_bank *bank = gpio_range_to_bank(range); | 619 | struct stm32_gpio_bank *bank = gpiochip_get_data(range->gc); |
608 | int pin = stm32_gpio_pin(gpio); | 620 | int pin = stm32_gpio_pin(gpio); |
609 | 621 | ||
610 | stm32_pmx_set_mode(bank, pin, !input, 0); | 622 | stm32_pmx_set_mode(bank, pin, !input, 0); |
@@ -762,7 +774,7 @@ static int stm32_pconf_parse_conf(struct pinctrl_dev *pctldev, | |||
762 | int offset, ret = 0; | 774 | int offset, ret = 0; |
763 | 775 | ||
764 | range = pinctrl_find_gpio_range_from_pin(pctldev, pin); | 776 | range = pinctrl_find_gpio_range_from_pin(pctldev, pin); |
765 | bank = gpio_range_to_bank(range); | 777 | bank = gpiochip_get_data(range->gc); |
766 | offset = stm32_gpio_pin(pin); | 778 | offset = stm32_gpio_pin(pin); |
767 | 779 | ||
768 | switch (param) { | 780 | switch (param) { |
@@ -843,7 +855,7 @@ static void stm32_pconf_dbg_show(struct pinctrl_dev *pctldev, | |||
843 | bool val; | 855 | bool val; |
844 | 856 | ||
845 | range = pinctrl_find_gpio_range_from_pin_nolock(pctldev, pin); | 857 | range = pinctrl_find_gpio_range_from_pin_nolock(pctldev, pin); |
846 | bank = gpio_range_to_bank(range); | 858 | bank = gpiochip_get_data(range->gc); |
847 | offset = stm32_gpio_pin(pin); | 859 | offset = stm32_gpio_pin(pin); |
848 | 860 | ||
849 | stm32_pmx_get_mode(bank, offset, &mode, &alt); | 861 | stm32_pmx_get_mode(bank, offset, &mode, &alt); |
@@ -898,13 +910,14 @@ static const struct pinconf_ops stm32_pconf_ops = { | |||
898 | static int stm32_gpiolib_register_bank(struct stm32_pinctrl *pctl, | 910 | static int stm32_gpiolib_register_bank(struct stm32_pinctrl *pctl, |
899 | struct device_node *np) | 911 | struct device_node *np) |
900 | { | 912 | { |
901 | int bank_nr = pctl->nbanks; | 913 | struct stm32_gpio_bank *bank = &pctl->banks[pctl->nbanks]; |
902 | struct stm32_gpio_bank *bank = &pctl->banks[bank_nr]; | ||
903 | struct pinctrl_gpio_range *range = &bank->range; | 914 | struct pinctrl_gpio_range *range = &bank->range; |
915 | struct of_phandle_args args; | ||
904 | struct device *dev = pctl->dev; | 916 | struct device *dev = pctl->dev; |
905 | struct resource res; | 917 | struct resource res; |
906 | struct reset_control *rstc; | 918 | struct reset_control *rstc; |
907 | int err, npins; | 919 | int npins = STM32_GPIO_PINS_PER_BANK; |
920 | int bank_nr, err; | ||
908 | 921 | ||
909 | rstc = of_reset_control_get(np, NULL); | 922 | rstc = of_reset_control_get(np, NULL); |
910 | if (!IS_ERR(rstc)) | 923 | if (!IS_ERR(rstc)) |
@@ -929,28 +942,33 @@ static int stm32_gpiolib_register_bank(struct stm32_pinctrl *pctl, | |||
929 | return err; | 942 | return err; |
930 | } | 943 | } |
931 | 944 | ||
932 | npins = pctl->match_data->npins; | ||
933 | npins -= bank_nr * STM32_GPIO_PINS_PER_BANK; | ||
934 | if (npins < 0) | ||
935 | return -EINVAL; | ||
936 | else if (npins > STM32_GPIO_PINS_PER_BANK) | ||
937 | npins = STM32_GPIO_PINS_PER_BANK; | ||
938 | |||
939 | bank->gpio_chip = stm32_gpio_template; | 945 | bank->gpio_chip = stm32_gpio_template; |
946 | |||
947 | of_property_read_string(np, "st,bank-name", &bank->gpio_chip.label); | ||
948 | |||
949 | if (!of_parse_phandle_with_fixed_args(np, "gpio-ranges", 3, 0, &args)) { | ||
950 | bank_nr = args.args[1] / STM32_GPIO_PINS_PER_BANK; | ||
951 | bank->gpio_chip.base = args.args[1]; | ||
952 | } else { | ||
953 | bank_nr = pctl->nbanks; | ||
954 | bank->gpio_chip.base = bank_nr * STM32_GPIO_PINS_PER_BANK; | ||
955 | range->name = bank->gpio_chip.label; | ||
956 | range->id = bank_nr; | ||
957 | range->pin_base = range->id * STM32_GPIO_PINS_PER_BANK; | ||
958 | range->base = range->id * STM32_GPIO_PINS_PER_BANK; | ||
959 | range->npins = npins; | ||
960 | range->gc = &bank->gpio_chip; | ||
961 | pinctrl_add_gpio_range(pctl->pctl_dev, | ||
962 | &pctl->banks[bank_nr].range); | ||
963 | } | ||
940 | bank->gpio_chip.base = bank_nr * STM32_GPIO_PINS_PER_BANK; | 964 | bank->gpio_chip.base = bank_nr * STM32_GPIO_PINS_PER_BANK; |
965 | |||
941 | bank->gpio_chip.ngpio = npins; | 966 | bank->gpio_chip.ngpio = npins; |
942 | bank->gpio_chip.of_node = np; | 967 | bank->gpio_chip.of_node = np; |
943 | bank->gpio_chip.parent = dev; | 968 | bank->gpio_chip.parent = dev; |
969 | bank->bank_nr = bank_nr; | ||
944 | spin_lock_init(&bank->lock); | 970 | spin_lock_init(&bank->lock); |
945 | 971 | ||
946 | of_property_read_string(np, "st,bank-name", &range->name); | ||
947 | bank->gpio_chip.label = range->name; | ||
948 | |||
949 | range->id = bank_nr; | ||
950 | range->pin_base = range->base = range->id * STM32_GPIO_PINS_PER_BANK; | ||
951 | range->npins = bank->gpio_chip.ngpio; | ||
952 | range->gc = &bank->gpio_chip; | ||
953 | |||
954 | /* create irq hierarchical domain */ | 972 | /* create irq hierarchical domain */ |
955 | bank->fwnode = of_node_to_fwnode(np); | 973 | bank->fwnode = of_node_to_fwnode(np); |
956 | 974 | ||
@@ -967,7 +985,7 @@ static int stm32_gpiolib_register_bank(struct stm32_pinctrl *pctl, | |||
967 | return err; | 985 | return err; |
968 | } | 986 | } |
969 | 987 | ||
970 | dev_info(dev, "%s bank added\n", range->name); | 988 | dev_info(dev, "%s bank added\n", bank->gpio_chip.label); |
971 | return 0; | 989 | return 0; |
972 | } | 990 | } |
973 | 991 | ||
@@ -1086,30 +1104,6 @@ int stm32_pctl_probe(struct platform_device *pdev) | |||
1086 | return ret; | 1104 | return ret; |
1087 | } | 1105 | } |
1088 | 1106 | ||
1089 | for_each_child_of_node(np, child) | ||
1090 | if (of_property_read_bool(child, "gpio-controller")) | ||
1091 | banks++; | ||
1092 | |||
1093 | if (!banks) { | ||
1094 | dev_err(dev, "at least one GPIO bank is required\n"); | ||
1095 | return -EINVAL; | ||
1096 | } | ||
1097 | |||
1098 | pctl->banks = devm_kcalloc(dev, banks, sizeof(*pctl->banks), | ||
1099 | GFP_KERNEL); | ||
1100 | if (!pctl->banks) | ||
1101 | return -ENOMEM; | ||
1102 | |||
1103 | for_each_child_of_node(np, child) { | ||
1104 | if (of_property_read_bool(child, "gpio-controller")) { | ||
1105 | ret = stm32_gpiolib_register_bank(pctl, child); | ||
1106 | if (ret) | ||
1107 | return ret; | ||
1108 | |||
1109 | pctl->nbanks++; | ||
1110 | } | ||
1111 | } | ||
1112 | |||
1113 | pins = devm_kcalloc(&pdev->dev, pctl->match_data->npins, sizeof(*pins), | 1107 | pins = devm_kcalloc(&pdev->dev, pctl->match_data->npins, sizeof(*pins), |
1114 | GFP_KERNEL); | 1108 | GFP_KERNEL); |
1115 | if (!pins) | 1109 | if (!pins) |
@@ -1129,13 +1123,34 @@ int stm32_pctl_probe(struct platform_device *pdev) | |||
1129 | 1123 | ||
1130 | pctl->pctl_dev = devm_pinctrl_register(&pdev->dev, &pctl->pctl_desc, | 1124 | pctl->pctl_dev = devm_pinctrl_register(&pdev->dev, &pctl->pctl_desc, |
1131 | pctl); | 1125 | pctl); |
1126 | |||
1132 | if (IS_ERR(pctl->pctl_dev)) { | 1127 | if (IS_ERR(pctl->pctl_dev)) { |
1133 | dev_err(&pdev->dev, "Failed pinctrl registration\n"); | 1128 | dev_err(&pdev->dev, "Failed pinctrl registration\n"); |
1134 | return PTR_ERR(pctl->pctl_dev); | 1129 | return PTR_ERR(pctl->pctl_dev); |
1135 | } | 1130 | } |
1136 | 1131 | ||
1137 | for (i = 0; i < pctl->nbanks; i++) | 1132 | for_each_child_of_node(np, child) |
1138 | pinctrl_add_gpio_range(pctl->pctl_dev, &pctl->banks[i].range); | 1133 | if (of_property_read_bool(child, "gpio-controller")) |
1134 | banks++; | ||
1135 | |||
1136 | if (!banks) { | ||
1137 | dev_err(dev, "at least one GPIO bank is required\n"); | ||
1138 | return -EINVAL; | ||
1139 | } | ||
1140 | pctl->banks = devm_kcalloc(dev, banks, sizeof(*pctl->banks), | ||
1141 | GFP_KERNEL); | ||
1142 | if (!pctl->banks) | ||
1143 | return -ENOMEM; | ||
1144 | |||
1145 | for_each_child_of_node(np, child) { | ||
1146 | if (of_property_read_bool(child, "gpio-controller")) { | ||
1147 | ret = stm32_gpiolib_register_bank(pctl, child); | ||
1148 | if (ret) | ||
1149 | return ret; | ||
1150 | |||
1151 | pctl->nbanks++; | ||
1152 | } | ||
1153 | } | ||
1139 | 1154 | ||
1140 | dev_info(dev, "Pinctrl STM32 initialized\n"); | 1155 | dev_info(dev, "Pinctrl STM32 initialized\n"); |
1141 | 1156 | ||