diff options
author | Linus Walleij <linus.walleij@linaro.org> | 2012-11-06 10:03:35 -0500 |
---|---|---|
committer | Linus Walleij <linus.walleij@linaro.org> | 2012-11-11 13:06:07 -0500 |
commit | 1e63d7b9363f0c57d00991f9f2e0af374dfc591a (patch) | |
tree | 6bea7bfdd9dbfbe21433629b3f2a9758c92447be /drivers/gpio/gpiolib.c | |
parent | 9ef0d6f7628bdcb5cc3c11623930f2527a3881a0 (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.c | 8 |
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 | ||
1190 | void gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name, | 1190 | int 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 | } |
1211 | EXPORT_SYMBOL_GPL(gpiochip_add_pin_range); | 1213 | EXPORT_SYMBOL_GPL(gpiochip_add_pin_range); |
1212 | 1214 | ||