mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-21 06:31:31 +00:00
dm: gpio: Add methods for open drain setting
Certain GPIO devices have the capability to switch their GPIOs into open-drain mode, that is, instead of actively driving the output (Push-pull output), the pin is connected to the collector (for a NPN transistor) or the drain (for a MOSFET) of a transistor, respectively. The pin then either forms an open circuit or a connection to ground, depending on the state of the transistor. This patch adds functions to the GPIO uclass to switch GPIOs to open-drain mode on devices that support it. Signed-off-by: Mario Six <mario.six@gdsys.cc> Reviewed-by: Simon Glass <sjg@chromium.org> Reviewed-by: York Sun <york.sun@nxp.com>
This commit is contained in:
parent
07d31f8f98
commit
53ecdfb920
2 changed files with 66 additions and 0 deletions
|
@ -367,6 +367,38 @@ int dm_gpio_set_value(const struct gpio_desc *desc, int value)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int dm_gpio_get_open_drain(struct gpio_desc *desc)
|
||||
{
|
||||
struct dm_gpio_ops *ops = gpio_get_ops(desc->dev);
|
||||
int ret;
|
||||
|
||||
ret = check_reserved(desc, "get_open_drain");
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (ops->set_open_drain)
|
||||
return ops->get_open_drain(desc->dev, desc->offset);
|
||||
else
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
int dm_gpio_set_open_drain(struct gpio_desc *desc, int value)
|
||||
{
|
||||
struct dm_gpio_ops *ops = gpio_get_ops(desc->dev);
|
||||
int ret;
|
||||
|
||||
ret = check_reserved(desc, "set_open_drain");
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (ops->set_open_drain)
|
||||
ret = ops->set_open_drain(desc->dev, desc->offset, value);
|
||||
else
|
||||
return 0; /* feature not supported -> ignore setting */
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int dm_gpio_set_dir_flags(struct gpio_desc *desc, ulong flags)
|
||||
{
|
||||
struct udevice *dev = desc->dev;
|
||||
|
|
|
@ -251,6 +251,8 @@ struct dm_gpio_ops {
|
|||
int value);
|
||||
int (*get_value)(struct udevice *dev, unsigned offset);
|
||||
int (*set_value)(struct udevice *dev, unsigned offset, int value);
|
||||
int (*get_open_drain)(struct udevice *dev, unsigned offset);
|
||||
int (*set_open_drain)(struct udevice *dev, unsigned offset, int value);
|
||||
/**
|
||||
* get_function() Get the GPIO function
|
||||
*
|
||||
|
@ -549,6 +551,38 @@ int dm_gpio_get_value(const struct gpio_desc *desc);
|
|||
|
||||
int dm_gpio_set_value(const struct gpio_desc *desc, int value);
|
||||
|
||||
/**
|
||||
* dm_gpio_get_open_drain() - Check if open-drain-mode of a GPIO is active
|
||||
*
|
||||
* This checks if open-drain-mode for a GPIO is enabled or not. This method is
|
||||
* optional.
|
||||
*
|
||||
* @desc: GPIO description containing device, offset and flags,
|
||||
* previously returned by gpio_request_by_name()
|
||||
* @return Value of open drain mode for GPIO (0 for inactive, 1 for active) or
|
||||
* -ve on error
|
||||
*/
|
||||
int dm_gpio_get_open_drain(struct gpio_desc *desc);
|
||||
|
||||
/**
|
||||
* dm_gpio_set_open_drain() - Switch open-drain-mode of a GPIO on or off
|
||||
*
|
||||
* This enables or disables open-drain mode for a GPIO. This method is
|
||||
* optional; if the driver does not support it, nothing happens when the method
|
||||
* is called.
|
||||
*
|
||||
* In open-drain mode, instead of actively driving the output (Push-pull
|
||||
* output), the GPIO's pin is connected to the collector (for a NPN transistor)
|
||||
* or the drain (for a MOSFET) of a transistor, respectively. The pin then
|
||||
* either forms an open circuit or a connection to ground, depending on the
|
||||
* state of the transistor.
|
||||
*
|
||||
* @desc: GPIO description containing device, offset and flags,
|
||||
* previously returned by gpio_request_by_name()
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int dm_gpio_set_open_drain(struct gpio_desc *desc, int value);
|
||||
|
||||
/**
|
||||
* dm_gpio_set_dir() - Set the direction for a GPIO
|
||||
*
|
||||
|
|
Loading…
Add table
Reference in a new issue