]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
pinctrl: sunxi: add of_xlate function
authorMaxime Ripard <maxime.ripard@free-electrons.com>
Sun, 3 Feb 2013 11:10:11 +0000 (12:10 +0100)
committerLinus Walleij <linus.walleij@linaro.org>
Tue, 5 Feb 2013 16:32:29 +0000 (17:32 +0100)
Since the pin controller of sunxi chips is represented as a
single bank in the driver.

Since this is neither convenient nor represented that way in the
datasheets, define a custom of_xlate function with the layout
<bank pin flag>

Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/pinctrl-sunxi.c

index e4d32c67dcbba9b3220167fb11acbff2609399ac..80b11e3415bca3c3eb24e06f0ca96ef199561093 100644 (file)
@@ -1261,6 +1261,24 @@ static void sunxi_pinctrl_gpio_set(struct gpio_chip *chip,
        writel((value & DATA_PINS_MASK) << index, pctl->membase + reg);
 }
 
+static int sunxi_pinctrl_gpio_of_xlate(struct gpio_chip *gc,
+                               const struct of_phandle_args *gpiospec,
+                               u32 *flags)
+{
+       int pin, base;
+
+       base = PINS_PER_BANK * gpiospec->args[0];
+       pin = base + gpiospec->args[1];
+
+       if (pin > (gc->base + gc->ngpio))
+               return -EINVAL;
+
+       if (flags)
+               *flags = gpiospec->args[2];
+
+       return pin;
+}
+
 static struct gpio_chip sunxi_pinctrl_gpio_chip = {
        .owner                  = THIS_MODULE,
        .request                = sunxi_pinctrl_gpio_request,
@@ -1269,6 +1287,8 @@ static struct gpio_chip sunxi_pinctrl_gpio_chip = {
        .direction_output       = sunxi_pinctrl_gpio_direction_output,
        .get                    = sunxi_pinctrl_gpio_get,
        .set                    = sunxi_pinctrl_gpio_set,
+       .of_xlate               = sunxi_pinctrl_gpio_of_xlate,
+       .of_gpio_n_cells        = 3,
        .can_sleep              = 0,
 };