aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>2013-03-09 21:27:00 -0500
committerSimon Horman <horms+renesas@verge.net.au>2013-04-02 21:30:34 -0400
commitdc3465a943ed2dd5de37d3d60df5c4e11c49efcb (patch)
tree0bf7fb5de9925ae8b69905c77418f991046f71a8
parent119f5e448d32c11faf22fe81f6f2d78467a47149 (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.c23
-rw-r--r--include/linux/platform_data/gpio-rcar.h1
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
194static int gpio_rcar_request(struct gpio_chip *chip, unsigned offset)
195{
196 return pinctrl_request_gpio(chip->base + offset);
197}
198
199static 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
193static int gpio_rcar_direction_input(struct gpio_chip *chip, unsigned offset) 209static 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
342err1: 365err1:
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__ */