Message ID | 20200113103515.20879-16-patrick.delaunay@st.com |
---|---|
State | Accepted |
Commit | 8fd9daf0363e6d0bda8cc9a6330eb08a0c98543f |
Headers | show |
Series | dm: add support of new binding in gpio and pincontrol | expand |
On Mon, 13 Jan 2020 at 03:35, Patrick Delaunay <patrick.delaunay at st.com> wrote: > > Add the ops for GPIO driver set_dir_flags() to set the dir flags. > The user can update the direction and configuration > of each GPIO with a only call to dm_gpio_set_dir_flags() or > dm_gpio_set_dir() and respecting the configuration provided by > device tree (saved in desc->flags). > > When these optional ops are absent, the gpio uclass use the mandatory > ops (direction_output, direction_input, get_value) and desc->flags > to manage only the main dir flags: > - GPIOD_IS_IN > - GPIOD_IS_OUT > - GPIOD_IS_OUT_ACTIVE > - GPIOD_ACTIVE_LOW > > Signed-off-by: Patrick Delaunay <patrick.delaunay at st.com> > --- > > This patch was part of v2 08/14 > = gpio: add ops for configuration with dir flags > > > Changes in v3: > - Split the previous patch [PATCH v2 08/14] to help review > > Changes in v2: > - change the proposed ops for pin config to set_dir_flags/get_dir_flags > - reused the existing API dm_gpio_set_dir_flags/dm_gpio_set_dir > - add a new API dm_gpio_get_dir_flags > > drivers/gpio/gpio-uclass.c | 17 ++++++++++++----- > include/asm-generic/gpio.h | 16 ++++++++++++++++ > 2 files changed, 28 insertions(+), 5 deletions(-) Reviewed-by: Simon Glass <sjg at chromium.org>
diff --git a/drivers/gpio/gpio-uclass.c b/drivers/gpio/gpio-uclass.c index 89af37a4ea..5da28e6ed9 100644 --- a/drivers/gpio/gpio-uclass.c +++ b/drivers/gpio/gpio-uclass.c @@ -571,11 +571,16 @@ static int _dm_gpio_set_dir_flags(struct gpio_desc *desc, ulong flags) return ret; } - if (flags & GPIOD_IS_OUT) { - ret = ops->direction_output(dev, desc->offset, - GPIOD_FLAGS_OUTPUT(flags)); - } else if (flags & GPIOD_IS_IN) { - ret = ops->direction_input(dev, desc->offset); + /* GPIOD_ are directly managed by driver in set_dir_flags*/ + if (ops->set_dir_flags) { + ret = ops->set_dir_flags(dev, desc->offset, flags); + } else { + if (flags & GPIOD_IS_OUT) { + ret = ops->direction_output(dev, desc->offset, + GPIOD_FLAGS_OUTPUT(flags)); + } else if (flags & GPIOD_IS_IN) { + ret = ops->direction_input(dev, desc->offset); + } } return ret; @@ -1145,6 +1150,8 @@ static int gpio_post_bind(struct udevice *dev) ops->get_function += gd->reloc_off; if (ops->xlate) ops->xlate += gd->reloc_off; + if (ops->set_dir_flags) + ops->set_dir_flags += gd->reloc_off; if (ops->get_dir_flags) ops->get_dir_flags += gd->reloc_off; diff --git a/include/asm-generic/gpio.h b/include/asm-generic/gpio.h index ac30c3ee4e..ec4877037a 100644 --- a/include/asm-generic/gpio.h +++ b/include/asm-generic/gpio.h @@ -298,6 +298,22 @@ struct dm_gpio_ops { int (*xlate)(struct udevice *dev, struct gpio_desc *desc, struct ofnode_phandle_args *args); + /** + * set_dir_flags() - Set GPIO dir flags + * + * This function should set up the GPIO configuration according to the + * information provide by the direction flags bitfield. + * + * This method is optional. + * + * @dev: GPIO device + * @offset: GPIO offset within that device + * @flags: GPIO configuration to use + * @return 0 if OK, -ve on error + */ + int (*set_dir_flags)(struct udevice *dev, unsigned int offset, + ulong flags); + /** * get_dir_flags() - Get GPIO dir flags *
Add the ops for GPIO driver set_dir_flags() to set the dir flags. The user can update the direction and configuration of each GPIO with a only call to dm_gpio_set_dir_flags() or dm_gpio_set_dir() and respecting the configuration provided by device tree (saved in desc->flags). When these optional ops are absent, the gpio uclass use the mandatory ops (direction_output, direction_input, get_value) and desc->flags to manage only the main dir flags: - GPIOD_IS_IN - GPIOD_IS_OUT - GPIOD_IS_OUT_ACTIVE - GPIOD_ACTIVE_LOW Signed-off-by: Patrick Delaunay <patrick.delaunay at st.com> --- This patch was part of v2 08/14 = gpio: add ops for configuration with dir flags Changes in v3: - Split the previous patch [PATCH v2 08/14] to help review Changes in v2: - change the proposed ops for pin config to set_dir_flags/get_dir_flags - reused the existing API dm_gpio_set_dir_flags/dm_gpio_set_dir - add a new API dm_gpio_get_dir_flags drivers/gpio/gpio-uclass.c | 17 ++++++++++++----- include/asm-generic/gpio.h | 16 ++++++++++++++++ 2 files changed, 28 insertions(+), 5 deletions(-)