mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 23:24:38 +00:00
gpio: Factor out DT flag translation
The generic GPIO flags binding is shared across many drivers, some of which need their own xlate function. Factor out the flag translation code from gpio_xlate_offs_flags so it does not need to be duplicated. Signed-off-by: Samuel Holland <samuel@sholland.org> Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
37c10bf7ef
commit
8a47982ed8
2 changed files with 37 additions and 21 deletions
|
@ -186,6 +186,34 @@ int gpio_lookup_name(const char *name, struct udevice **devp,
|
|||
return 0;
|
||||
}
|
||||
|
||||
unsigned long gpio_flags_xlate(uint32_t arg)
|
||||
{
|
||||
unsigned long flags = 0;
|
||||
|
||||
if (arg & GPIO_ACTIVE_LOW)
|
||||
flags |= GPIOD_ACTIVE_LOW;
|
||||
|
||||
/*
|
||||
* need to test 2 bits for gpio output binding:
|
||||
* OPEN_DRAIN (0x6) = SINGLE_ENDED (0x2) | LINE_OPEN_DRAIN (0x4)
|
||||
* OPEN_SOURCE (0x2) = SINGLE_ENDED (0x2) | LINE_OPEN_SOURCE (0x0)
|
||||
*/
|
||||
if (arg & GPIO_SINGLE_ENDED) {
|
||||
if (arg & GPIO_LINE_OPEN_DRAIN)
|
||||
flags |= GPIOD_OPEN_DRAIN;
|
||||
else
|
||||
flags |= GPIOD_OPEN_SOURCE;
|
||||
}
|
||||
|
||||
if (arg & GPIO_PULL_UP)
|
||||
flags |= GPIOD_PULL_UP;
|
||||
|
||||
if (arg & GPIO_PULL_DOWN)
|
||||
flags |= GPIOD_PULL_DOWN;
|
||||
|
||||
return flags;
|
||||
}
|
||||
|
||||
int gpio_xlate_offs_flags(struct udevice *dev, struct gpio_desc *desc,
|
||||
struct ofnode_phandle_args *args)
|
||||
{
|
||||
|
@ -201,27 +229,7 @@ int gpio_xlate_offs_flags(struct udevice *dev, struct gpio_desc *desc,
|
|||
if (args->args_count < 2)
|
||||
return 0;
|
||||
|
||||
desc->flags = 0;
|
||||
if (args->args[1] & GPIO_ACTIVE_LOW)
|
||||
desc->flags |= GPIOD_ACTIVE_LOW;
|
||||
|
||||
/*
|
||||
* need to test 2 bits for gpio output binding:
|
||||
* OPEN_DRAIN (0x6) = SINGLE_ENDED (0x2) | LINE_OPEN_DRAIN (0x4)
|
||||
* OPEN_SOURCE (0x2) = SINGLE_ENDED (0x2) | LINE_OPEN_SOURCE (0x0)
|
||||
*/
|
||||
if (args->args[1] & GPIO_SINGLE_ENDED) {
|
||||
if (args->args[1] & GPIO_LINE_OPEN_DRAIN)
|
||||
desc->flags |= GPIOD_OPEN_DRAIN;
|
||||
else
|
||||
desc->flags |= GPIOD_OPEN_SOURCE;
|
||||
}
|
||||
|
||||
if (args->args[1] & GPIO_PULL_UP)
|
||||
desc->flags |= GPIOD_PULL_UP;
|
||||
|
||||
if (args->args[1] & GPIO_PULL_DOWN)
|
||||
desc->flags |= GPIOD_PULL_DOWN;
|
||||
desc->flags = gpio_flags_xlate(args->args[1]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -221,6 +221,14 @@ int gpio_requestf(unsigned gpio, const char *fmt, ...)
|
|||
|
||||
struct fdtdec_phandle_args;
|
||||
|
||||
/**
|
||||
* gpio_flags_xlate() - convert DT flags to internal flags
|
||||
*
|
||||
* This routine converts the GPIO_* flags from the generic DT binding to the
|
||||
* GPIOD_* flags used internally. It can be called from driver xlate functions.
|
||||
*/
|
||||
unsigned long gpio_flags_xlate(uint32_t arg);
|
||||
|
||||
/**
|
||||
* gpio_xlate_offs_flags() - implementation for common use of dm_gpio_ops.xlate
|
||||
*
|
||||
|
|
Loading…
Reference in a new issue