]> git.sur5r.net Git - u-boot/commitdiff
dm: gpio: Add dm_gpio_lookup_name() to look up a GPIO name
authorSimon Glass <sjg@chromium.org>
Tue, 23 Jun 2015 21:38:40 +0000 (15:38 -0600)
committerSimon Glass <sjg@chromium.org>
Tue, 21 Jul 2015 23:39:23 +0000 (17:39 -0600)
Provide a driver-model function to look up a GPIO name. Make the standard
function use it.

Signed-off-by: Simon Glass <sjg@chromium.org>
drivers/gpio/gpio-uclass.c
include/asm-generic/gpio.h

index bf982b9d193143a9aed74eaed867f4267771d702..c6fd5802f57891568121b51c11acfb717be6a389 100644 (file)
@@ -48,8 +48,7 @@ static int gpio_to_device(unsigned int gpio, struct gpio_desc *desc)
        return ret ? ret : -ENOENT;
 }
 
-int gpio_lookup_name(const char *name, struct udevice **devp,
-                    unsigned int *offsetp, unsigned int *gpiop)
+int dm_gpio_lookup_name(const char *name, struct gpio_desc *desc)
 {
        struct gpio_dev_priv *uc_priv = NULL;
        struct udevice *dev;
@@ -57,8 +56,6 @@ int gpio_lookup_name(const char *name, struct udevice **devp,
        int numeric;
        int ret;
 
-       if (devp)
-               *devp = NULL;
        numeric = isdigit(*name) ? simple_strtoul(name, NULL, 10) : -1;
        for (ret = uclass_first_device(UCLASS_GPIO, &dev);
             dev;
@@ -84,12 +81,33 @@ int gpio_lookup_name(const char *name, struct udevice **devp,
        if (!dev)
                return ret ? ret : -EINVAL;
 
+       desc->dev = dev;
+       desc->offset = offset;
+
+       return 0;
+}
+
+int gpio_lookup_name(const char *name, struct udevice **devp,
+                    unsigned int *offsetp, unsigned int *gpiop)
+{
+       struct gpio_desc desc;
+       int ret;
+
+       if (devp)
+               *devp = NULL;
+       ret = dm_gpio_lookup_name(name, &desc);
+       if (ret)
+               return ret;
+
        if (devp)
-               *devp = dev;
+               *devp = desc.dev;
        if (offsetp)
-               *offsetp = offset;
-       if (gpiop)
-               *gpiop = uc_priv->gpio_base + offset;
+               *offsetp = desc.offset;
+       if (gpiop) {
+               struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(desc.dev);
+
+               *gpiop = uc_priv->gpio_base + desc.offset;
+       }
 
        return 0;
 }
index de91e57efcd672a4e61e06434a6d0c042a3c0b07..b1cf95c687b082b1526cdb619f9c759ee9366afd 100644 (file)
@@ -321,6 +321,19 @@ struct gpio_dev_priv {
  */
 const char *gpio_get_bank_info(struct udevice *dev, int *offset_count);
 
+/**
+ * dm_gpio_lookup_name() - Look up a named GPIO and return its description
+ *
+ * The name of a GPIO is typically its bank name followed by a number from 0.
+ * For example A0 is the first GPIO in bank A. Each bank is a separate driver
+ * model device.
+ *
+ * @name:      Name to look up
+ * @desc:      Returns description, on success
+ * @return 0 if OK, -ve on error
+ */
+int dm_gpio_lookup_name(const char *name, struct gpio_desc *desc);
+
 /**
  * gpio_lookup_name - Look up a GPIO name and return its details
  *