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 /drivers/gpio | |
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>
Diffstat (limited to 'drivers/gpio')
-rw-r--r-- | drivers/gpio/gpio-rcar.c | 23 |
1 files changed, 23 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: |