mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-22 23:21:31 +00:00
dm: gpio: Add gpio_get_function() and friends
Add helpers to the uclass to allow finding out the pin function. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
b892d127ff
commit
6449a506d6
2 changed files with 80 additions and 1 deletions
|
@ -283,6 +283,53 @@ const char *gpio_get_bank_info(struct udevice *dev, int *bit_count)
|
||||||
return priv->bank_name;
|
return priv->bank_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char * const gpio_function[GPIOF_COUNT] = {
|
||||||
|
"input",
|
||||||
|
"output",
|
||||||
|
"unused",
|
||||||
|
"unknown",
|
||||||
|
"func",
|
||||||
|
};
|
||||||
|
|
||||||
|
int get_function(struct udevice *dev, int offset, bool skip_unused,
|
||||||
|
const char **namep)
|
||||||
|
{
|
||||||
|
struct gpio_dev_priv *uc_priv = dev->uclass_priv;
|
||||||
|
struct dm_gpio_ops *ops = gpio_get_ops(dev);
|
||||||
|
|
||||||
|
BUILD_BUG_ON(GPIOF_COUNT != ARRAY_SIZE(gpio_function));
|
||||||
|
if (!device_active(dev))
|
||||||
|
return -ENODEV;
|
||||||
|
if (offset < 0 || offset >= uc_priv->gpio_count)
|
||||||
|
return -EINVAL;
|
||||||
|
if (namep)
|
||||||
|
*namep = uc_priv->name[offset];
|
||||||
|
if (skip_unused && !uc_priv->name[offset])
|
||||||
|
return GPIOF_UNUSED;
|
||||||
|
if (ops->get_function) {
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = ops->get_function(dev, offset);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
if (ret >= ARRAY_SIZE(gpio_function))
|
||||||
|
return -ENODATA;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
return GPIOF_UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
int gpio_get_function(struct udevice *dev, int offset, const char **namep)
|
||||||
|
{
|
||||||
|
return get_function(dev, offset, true, namep);
|
||||||
|
}
|
||||||
|
|
||||||
|
int gpio_get_raw_function(struct udevice *dev, int offset, const char **namep)
|
||||||
|
{
|
||||||
|
return get_function(dev, offset, false, namep);
|
||||||
|
}
|
||||||
|
|
||||||
/* We need to renumber the GPIOs when any driver is probed/removed */
|
/* We need to renumber the GPIOs when any driver is probed/removed */
|
||||||
static int gpio_renumber(struct udevice *removed_dev)
|
static int gpio_renumber(struct udevice *removed_dev)
|
||||||
{
|
{
|
||||||
|
|
|
@ -83,7 +83,7 @@ int gpio_get_value(unsigned gpio);
|
||||||
int gpio_set_value(unsigned gpio, int value);
|
int gpio_set_value(unsigned gpio, int value);
|
||||||
|
|
||||||
/* State of a GPIO, as reported by get_function() */
|
/* State of a GPIO, as reported by get_function() */
|
||||||
enum {
|
enum gpio_func_t {
|
||||||
GPIOF_INPUT = 0,
|
GPIOF_INPUT = 0,
|
||||||
GPIOF_OUTPUT,
|
GPIOF_OUTPUT,
|
||||||
GPIOF_UNUSED, /* Not claimed */
|
GPIOF_UNUSED, /* Not claimed */
|
||||||
|
@ -95,6 +95,38 @@ enum {
|
||||||
|
|
||||||
struct udevice;
|
struct udevice;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gpio_get_function() - get the current function for a GPIO pin
|
||||||
|
*
|
||||||
|
* Note this returns GPIOF_UNUSED if the GPIO is not requested.
|
||||||
|
*
|
||||||
|
* @dev: Device to check
|
||||||
|
* @offset: Offset of device GPIO to check
|
||||||
|
* @namep: If non-NULL, this is set to the nane given when the GPIO
|
||||||
|
* was requested, or -1 if it has not been requested
|
||||||
|
* @return -ENODATA if the driver returned an unknown function,
|
||||||
|
* -ENODEV if the device is not active, -EINVAL if the offset is invalid.
|
||||||
|
* GPIOF_UNUSED if the GPIO has not been requested. Otherwise returns the
|
||||||
|
* function from enum gpio_func_t.
|
||||||
|
*/
|
||||||
|
int gpio_get_function(struct udevice *dev, int offset, const char **namep);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gpio_get_raw_function() - get the current raw function for a GPIO pin
|
||||||
|
*
|
||||||
|
* Note this does not return GPIOF_UNUSED - it will always return the GPIO
|
||||||
|
* driver's view of a pin function, even if it is not correctly set up.
|
||||||
|
*
|
||||||
|
* @dev: Device to check
|
||||||
|
* @offset: Offset of device GPIO to check
|
||||||
|
* @namep: If non-NULL, this is set to the nane given when the GPIO
|
||||||
|
* was requested, or -1 if it has not been requested
|
||||||
|
* @return -ENODATA if the driver returned an unknown function,
|
||||||
|
* -ENODEV if the device is not active, -EINVAL if the offset is invalid.
|
||||||
|
* Otherwise returns the function from enum gpio_func_t.
|
||||||
|
*/
|
||||||
|
int gpio_get_raw_function(struct udevice *dev, int offset, const char **namep);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct struct dm_gpio_ops - Driver model GPIO operations
|
* struct struct dm_gpio_ops - Driver model GPIO operations
|
||||||
*
|
*
|
||||||
|
|
Loading…
Add table
Reference in a new issue