aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpio/gpiolib.c
diff options
context:
space:
mode:
authorLinus Walleij <linus.walleij@linaro.org>2012-11-06 10:03:35 -0500
committerLinus Walleij <linus.walleij@linaro.org>2012-11-11 13:06:07 -0500
commit1e63d7b9363f0c57d00991f9f2e0af374dfc591a (patch)
tree6bea7bfdd9dbfbe21433629b3f2a9758c92447be /drivers/gpio/gpiolib.c
parent9ef0d6f7628bdcb5cc3c11623930f2527a3881a0 (diff)
gpiolib: separation of pin concerns
The fact that of_gpiochip_add_pin_range() and gpiochip_add_pin_range() share too much code is fragile and will invariably mean that bugs need to be fixed in two places instead of one. So separate the concerns of gpiolib.c and gpiolib-of.c and have the latter call the former as back-end. This is necessary also when going forward with other device descriptions such as ACPI. This is done by: - Adding a return code to gpiochip_add_pin_range() so we can reliably check whether this succeeds. - Get rid of the custom of_pinctrl_add_gpio_range() from pinctrl. Instead create of_pinctrl_get() to just retrive the pin controller per se from an OF node. This composite function was just begging to be deleted, it was way to purpose-specific. - Use pinctrl_dev_get_name() to get the name of the retrieved pin controller and use that to call back into the generic gpiochip_add_pin_range(). Now the pin range is only allocated and tied to a pin controller from the core implementation in gpiolib.c. Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/gpio/gpiolib.c')
-rw-r--r--drivers/gpio/gpiolib.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index bcf9b9914fb7..c5f650095faa 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -1187,8 +1187,8 @@ EXPORT_SYMBOL_GPL(gpiochip_find);
1187 1187
1188#ifdef CONFIG_PINCTRL 1188#ifdef CONFIG_PINCTRL
1189 1189
1190void gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name, 1190int gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name,
1191 unsigned int pin_base, unsigned int npins) 1191 unsigned int pin_base, unsigned int npins)
1192{ 1192{
1193 struct gpio_pin_range *pin_range; 1193 struct gpio_pin_range *pin_range;
1194 1194
@@ -1196,7 +1196,7 @@ void gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name,
1196 if (!pin_range) { 1196 if (!pin_range) {
1197 pr_err("%s: GPIO chip: failed to allocate pin ranges\n", 1197 pr_err("%s: GPIO chip: failed to allocate pin ranges\n",
1198 chip->label); 1198 chip->label);
1199 return; 1199 return -ENOMEM;
1200 } 1200 }
1201 1201
1202 pin_range->range.name = chip->label; 1202 pin_range->range.name = chip->label;
@@ -1207,6 +1207,8 @@ void gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name,
1207 &pin_range->range); 1207 &pin_range->range);
1208 1208
1209 list_add_tail(&pin_range->node, &chip->pin_ranges); 1209 list_add_tail(&pin_range->node, &chip->pin_ranges);
1210
1211 return 0;
1210} 1212}
1211EXPORT_SYMBOL_GPL(gpiochip_add_pin_range); 1213EXPORT_SYMBOL_GPL(gpiochip_add_pin_range);
1212 1214