mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-25 08:31:33 +00:00
dm: gpio: Support numbered GPIOs
At present banks must be named and it is not possible to refer to GPIOs by number in driver model. Some boards use numbering - e.g. OMAP. It is fairly easy to support by detecting the absense of a bank name (which starts with a letter). Add support for numbered GPIOs in addition to the existing bank support. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Tom Rini <trini@ti.com>
This commit is contained in:
parent
5b3ee386fd
commit
fe1ef50338
1 changed files with 25 additions and 12 deletions
|
@ -8,6 +8,7 @@
|
||||||
#include <dm.h>
|
#include <dm.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <asm/gpio.h>
|
#include <asm/gpio.h>
|
||||||
|
#include <linux/ctype.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gpio_to_device() - Convert global GPIO number to device, number
|
* gpio_to_device() - Convert global GPIO number to device, number
|
||||||
|
@ -43,35 +44,47 @@ static int gpio_to_device(unsigned int gpio, struct udevice **devp,
|
||||||
int gpio_lookup_name(const char *name, struct udevice **devp,
|
int gpio_lookup_name(const char *name, struct udevice **devp,
|
||||||
unsigned int *offsetp, unsigned int *gpiop)
|
unsigned int *offsetp, unsigned int *gpiop)
|
||||||
{
|
{
|
||||||
struct gpio_dev_priv *uc_priv;
|
struct gpio_dev_priv *uc_priv = NULL;
|
||||||
struct udevice *dev;
|
struct udevice *dev;
|
||||||
|
ulong offset;
|
||||||
|
int numeric;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (devp)
|
if (devp)
|
||||||
*devp = NULL;
|
*devp = NULL;
|
||||||
|
numeric = isdigit(*name) ? simple_strtoul(name, NULL, 10) : -1;
|
||||||
for (ret = uclass_first_device(UCLASS_GPIO, &dev);
|
for (ret = uclass_first_device(UCLASS_GPIO, &dev);
|
||||||
dev;
|
dev;
|
||||||
ret = uclass_next_device(&dev)) {
|
ret = uclass_next_device(&dev)) {
|
||||||
ulong offset;
|
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
uc_priv = dev->uclass_priv;
|
uc_priv = dev->uclass_priv;
|
||||||
|
if (numeric != -1) {
|
||||||
|
offset = numeric - uc_priv->gpio_base;
|
||||||
|
/* Allow GPIOs to be numbered from 0 */
|
||||||
|
if (offset >= 0 && offset < uc_priv->gpio_count)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
len = uc_priv->bank_name ? strlen(uc_priv->bank_name) : 0;
|
len = uc_priv->bank_name ? strlen(uc_priv->bank_name) : 0;
|
||||||
|
|
||||||
if (!strncasecmp(name, uc_priv->bank_name, len)) {
|
if (!strncasecmp(name, uc_priv->bank_name, len)) {
|
||||||
if (strict_strtoul(name + len, 10, &offset))
|
if (!strict_strtoul(name + len, 10, &offset))
|
||||||
continue;
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!dev)
|
||||||
|
return ret ? ret : -EINVAL;
|
||||||
|
|
||||||
if (devp)
|
if (devp)
|
||||||
*devp = dev;
|
*devp = dev;
|
||||||
if (offsetp)
|
if (offsetp)
|
||||||
*offsetp = offset;
|
*offsetp = offset;
|
||||||
if (gpiop)
|
if (gpiop)
|
||||||
*gpiop = uc_priv->gpio_base + offset;
|
*gpiop = uc_priv->gpio_base + offset;
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret ? ret : -EINVAL;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Add table
Reference in a new issue