diff options
| author | Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> | 2013-03-09 21:27:00 -0500 |
|---|---|---|
| committer | Simon Horman <horms+renesas@verge.net.au> | 2013-04-02 21:30:34 -0400 |
| commit | dc3465a943ed2dd5de37d3d60df5c4e11c49efcb (patch) | |
| tree | 0bf7fb5de9925ae8b69905c77418f991046f71a8 | |
| parent | 119f5e448d32c11faf22fe81f6f2d78467a47149 (diff) | |
gpio-rcar: Add pinctrl support
Register the GPIO pin range, and request and free GPIO pins using the
pinctrl API.
Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
| -rw-r--r-- | drivers/gpio/gpio-rcar.c | 23 | ||||
| -rw-r--r-- | include/linux/platform_data/gpio-rcar.h | 1 |
2 files changed, 24 insertions, 0 deletions
diff --git a/drivers/gpio/gpio-rcar.c b/drivers/gpio/gpio-rcar.c index 581ba56131a7..b4ca450947b8 100644 --- a/drivers/gpio/gpio-rcar.c +++ b/drivers/gpio/gpio-rcar.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/irq.h> | 22 | #include <linux/irq.h> |
| 23 | #include <linux/irqdomain.h> | 23 | #include <linux/irqdomain.h> |
| 24 | #include <linux/module.h> | 24 | #include <linux/module.h> |
| 25 | #include <linux/pinctrl/consumer.h> | ||
| 25 | #include <linux/platform_data/gpio-rcar.h> | 26 | #include <linux/platform_data/gpio-rcar.h> |
| 26 | #include <linux/platform_device.h> | 27 | #include <linux/platform_device.h> |
| 27 | #include <linux/spinlock.h> | 28 | #include <linux/spinlock.h> |
| @@ -190,6 +191,21 @@ static void gpio_rcar_config_general_input_output_mode(struct gpio_chip *chip, | |||
| 190 | spin_unlock_irqrestore(&p->lock, flags); | 191 | spin_unlock_irqrestore(&p->lock, flags); |
| 191 | } | 192 | } |
| 192 | 193 | ||
| 194 | static int gpio_rcar_request(struct gpio_chip *chip, unsigned offset) | ||
| 195 | { | ||
| 196 | return pinctrl_request_gpio(chip->base + offset); | ||
| 197 | } | ||
| 198 | |||
| 199 | static void gpio_rcar_free(struct gpio_chip *chip, unsigned offset) | ||
| 200 | { | ||
| 201 | pinctrl_free_gpio(chip->base + offset); | ||
| 202 | |||
| 203 | /* Set the GPIO as an input to ensure that the next GPIO request won't | ||
| 204 | * drive the GPIO pin as an output. | ||
| 205 | */ | ||
| 206 | gpio_rcar_config_general_input_output_mode(chip, offset, false); | ||
| 207 | } | ||
| 208 | |||
| 193 | static int gpio_rcar_direction_input(struct gpio_chip *chip, unsigned offset) | 209 | static int gpio_rcar_direction_input(struct gpio_chip *chip, unsigned offset) |
| 194 | { | 210 | { |
| 195 | gpio_rcar_config_general_input_output_mode(chip, offset, false); | 211 | gpio_rcar_config_general_input_output_mode(chip, offset, false); |
| @@ -285,6 +301,8 @@ static int gpio_rcar_probe(struct platform_device *pdev) | |||
| 285 | } | 301 | } |
| 286 | 302 | ||
| 287 | gpio_chip = &p->gpio_chip; | 303 | gpio_chip = &p->gpio_chip; |
| 304 | gpio_chip->request = gpio_rcar_request; | ||
| 305 | gpio_chip->free = gpio_rcar_free; | ||
| 288 | gpio_chip->direction_input = gpio_rcar_direction_input; | 306 | gpio_chip->direction_input = gpio_rcar_direction_input; |
| 289 | gpio_chip->get = gpio_rcar_get; | 307 | gpio_chip->get = gpio_rcar_get; |
| 290 | gpio_chip->direction_output = gpio_rcar_direction_output; | 308 | gpio_chip->direction_output = gpio_rcar_direction_output; |
| @@ -337,6 +355,11 @@ static int gpio_rcar_probe(struct platform_device *pdev) | |||
| 337 | p->config.irq_base, ret); | 355 | p->config.irq_base, ret); |
| 338 | } | 356 | } |
| 339 | 357 | ||
| 358 | ret = gpiochip_add_pin_range(gpio_chip, p->config.pctl_name, 0, | ||
| 359 | gpio_chip->base, gpio_chip->ngpio); | ||
| 360 | if (ret < 0) | ||
| 361 | dev_warn(&pdev->dev, "failed to add pin range\n"); | ||
| 362 | |||
| 340 | return 0; | 363 | return 0; |
| 341 | 364 | ||
| 342 | err1: | 365 | err1: |
diff --git a/include/linux/platform_data/gpio-rcar.h b/include/linux/platform_data/gpio-rcar.h index bebfcd86fb80..b253f77a7ddf 100644 --- a/include/linux/platform_data/gpio-rcar.h +++ b/include/linux/platform_data/gpio-rcar.h | |||
| @@ -20,6 +20,7 @@ struct gpio_rcar_config { | |||
| 20 | unsigned int gpio_base; | 20 | unsigned int gpio_base; |
| 21 | unsigned int irq_base; | 21 | unsigned int irq_base; |
| 22 | unsigned int number_of_pins; | 22 | unsigned int number_of_pins; |
| 23 | const char *pctl_name; | ||
| 23 | }; | 24 | }; |
| 24 | 25 | ||
| 25 | #endif /* __GPIO_RCAR_H__ */ | 26 | #endif /* __GPIO_RCAR_H__ */ |
