]> git.sur5r.net Git - u-boot/blobdiff - drivers/gpio/bcm2835_gpio.c
bcm283x: Add pinctrl driver
[u-boot] / drivers / gpio / bcm2835_gpio.c
index beaa21853a473dfaa4e59a58f995cce871afc045..d68f8df32d55fdff1b44f28eebb62b9cd1026dbe 100644 (file)
@@ -7,6 +7,7 @@
 
 #include <common.h>
 #include <dm.h>
+#include <dm/pinctrl.h>
 #include <errno.h>
 #include <asm/gpio.h>
 #include <asm/io.h>
@@ -14,6 +15,7 @@
 
 struct bcm2835_gpios {
        struct bcm2835_gpio_regs *reg;
+       struct udevice *pinctrl;
 };
 
 static int bcm2835_gpio_direction_input(struct udevice *dev, unsigned gpio)
@@ -29,7 +31,7 @@ static int bcm2835_gpio_direction_input(struct udevice *dev, unsigned gpio)
        return 0;
 }
 
-static int bcm2835_gpio_direction_output(struct udevice *dev, unsigned gpio,
+static int bcm2835_gpio_direction_output(struct udevice *dev, unsigned int gpio,
                                         int value)
 {
        struct bcm2835_gpios *gpios = dev_get_priv(dev);
@@ -73,19 +75,12 @@ static int bcm2835_gpio_set_value(struct udevice *dev, unsigned gpio,
        return 0;
 }
 
-int bcm2835_gpio_get_func_id(struct udevice *dev, unsigned gpio)
-{
-       struct bcm2835_gpios *gpios = dev_get_priv(dev);
-       u32 val;
-
-       val = readl(&gpios->reg->gpfsel[BCM2835_GPIO_FSEL_BANK(gpio)]);
-
-       return (val >> BCM2835_GPIO_FSEL_SHIFT(gpio) & BCM2835_GPIO_FSEL_MASK);
-}
-
 static int bcm2835_gpio_get_function(struct udevice *dev, unsigned offset)
 {
-       int funcid = bcm2835_gpio_get_func_id(dev, offset);
+       struct bcm2835_gpios *priv = dev_get_priv(dev);
+       int funcid;
+
+       funcid = pinctrl_get_gpio_mux(priv->pinctrl, 0, offset);
 
        switch (funcid) {
        case BCM2835_GPIO_OUTPUT:
@@ -97,7 +92,6 @@ static int bcm2835_gpio_get_function(struct udevice *dev, unsigned offset)
        }
 }
 
-
 static const struct dm_gpio_ops gpio_bcm2835_ops = {
        .direction_input        = bcm2835_gpio_direction_input,
        .direction_output       = bcm2835_gpio_direction_output,
@@ -116,15 +110,13 @@ static int bcm2835_gpio_probe(struct udevice *dev)
        uc_priv->gpio_count = BCM2835_GPIO_COUNT;
        gpios->reg = (struct bcm2835_gpio_regs *)plat->base;
 
+       /* We know we're spawned by the pinctrl driver */
+       gpios->pinctrl = dev->parent;
+
        return 0;
 }
 
 #if CONFIG_IS_ENABLED(OF_CONTROL)
-static const struct udevice_id bcm2835_gpio_id[] = {
-       {.compatible = "brcm,bcm2835-gpio"},
-       {}
-};
-
 static int bcm2835_gpio_ofdata_to_platdata(struct udevice *dev)
 {
        struct bcm2835_gpio_platdata *plat = dev_get_platdata(dev);
@@ -142,7 +134,6 @@ static int bcm2835_gpio_ofdata_to_platdata(struct udevice *dev)
 U_BOOT_DRIVER(gpio_bcm2835) = {
        .name   = "gpio_bcm2835",
        .id     = UCLASS_GPIO,
-       .of_match = of_match_ptr(bcm2835_gpio_id),
        .ofdata_to_platdata = of_match_ptr(bcm2835_gpio_ofdata_to_platdata),
        .platdata_auto_alloc_size = sizeof(struct bcm2835_gpio_platdata),
        .ops    = &gpio_bcm2835_ops,