Message ID | 20200604143022.v2.9.I375f10587b02d30722492fc1101aaf214c8a873b@changeid |
---|---|
State | Accepted |
Commit | 8d895efffe2313acc419caee53414f2903b8a39c |
Delegated to: | Patrick Delaunay |
Headers | show |
Series | stm32mp1: activate gpio hog support and add new pinctrl ops | expand |
Hi Patrick On 6/4/20 2:30 PM, Patrick Delaunay wrote: > Add support of ops get_dir_flags() to read dir flags from > STMFX registers. > > Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com> > --- > > Changes in v2: None > > drivers/pinctrl/pinctrl-stmfx.c | 50 +++++++++++++++++++++++++++++++++ > 1 file changed, 50 insertions(+) > > diff --git a/drivers/pinctrl/pinctrl-stmfx.c b/drivers/pinctrl/pinctrl-stmfx.c > index 88df9e61a7..1d326ecf17 100644 > --- a/drivers/pinctrl/pinctrl-stmfx.c > +++ b/drivers/pinctrl/pinctrl-stmfx.c > @@ -108,12 +108,22 @@ static int stmfx_conf_set_pupd(struct udevice *dev, unsigned int offset, > return stmfx_write_reg(dev, STMFX_REG_GPIO_PUPD, offset, pupd); > } > > +static int stmfx_conf_get_pupd(struct udevice *dev, unsigned int offset) > +{ > + return stmfx_read_reg(dev, STMFX_REG_GPIO_PUPD, offset); > +} > + > static int stmfx_conf_set_type(struct udevice *dev, unsigned int offset, > uint type) > { > return stmfx_write_reg(dev, STMFX_REG_GPIO_TYPE, offset, type); > } > > +static int stmfx_conf_get_type(struct udevice *dev, unsigned int offset) > +{ > + return stmfx_read_reg(dev, STMFX_REG_GPIO_TYPE, offset); > +} > + > static int stmfx_gpio_get(struct udevice *dev, unsigned int offset) > { > return stmfx_read_reg(dev, STMFX_REG_GPIO_STATE, offset); > @@ -189,6 +199,45 @@ static int stmfx_gpio_set_dir_flags(struct udevice *dev, unsigned int offset, > return ret; > } > > +static int stmfx_gpio_get_dir_flags(struct udevice *dev, unsigned int offset, > + ulong *flags) > +{ > + ulong dir_flags = 0; > + int ret; > + > + if (stmfx_gpio_get_function(dev, offset) == GPIOF_OUTPUT) { > + dir_flags |= GPIOD_IS_OUT; > + ret = stmfx_conf_get_type(dev, offset); > + if (ret < 0) > + return ret; > + if (ret == 0) > + dir_flags |= GPIOD_OPEN_DRAIN; > + /* 1 = push-pull (default), open source not supported */ > + ret = stmfx_gpio_get(dev, offset); > + if (ret < 0) > + return ret; > + if (ret) > + dir_flags |= GPIOD_IS_OUT_ACTIVE; > + } else { > + dir_flags |= GPIOD_IS_IN; > + ret = stmfx_conf_get_type(dev, offset); > + if (ret < 0) > + return ret; > + if (ret == 1) { > + ret = stmfx_conf_get_pupd(dev, offset); > + if (ret < 0) > + return ret; > + if (ret == 1) > + dir_flags |= GPIOD_PULL_UP; > + else > + dir_flags |= GPIOD_PULL_DOWN; > + } > + } > + *flags = dir_flags; > + > + return 0; > +} > + > static int stmfx_gpio_probe(struct udevice *dev) > { > struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev); > @@ -218,6 +267,7 @@ static const struct dm_gpio_ops stmfx_gpio_ops = { > .direction_input = stmfx_gpio_direction_input, > .direction_output = stmfx_gpio_direction_output, > .set_dir_flags = stmfx_gpio_set_dir_flags, > + .get_dir_flags = stmfx_gpio_get_dir_flags, > }; > > U_BOOT_DRIVER(stmfx_gpio) = { Reviewed-by: Patrice Chotard <patrice.chotard@st.com> Thanks
diff --git a/drivers/pinctrl/pinctrl-stmfx.c b/drivers/pinctrl/pinctrl-stmfx.c index 88df9e61a7..1d326ecf17 100644 --- a/drivers/pinctrl/pinctrl-stmfx.c +++ b/drivers/pinctrl/pinctrl-stmfx.c @@ -108,12 +108,22 @@ static int stmfx_conf_set_pupd(struct udevice *dev, unsigned int offset, return stmfx_write_reg(dev, STMFX_REG_GPIO_PUPD, offset, pupd); } +static int stmfx_conf_get_pupd(struct udevice *dev, unsigned int offset) +{ + return stmfx_read_reg(dev, STMFX_REG_GPIO_PUPD, offset); +} + static int stmfx_conf_set_type(struct udevice *dev, unsigned int offset, uint type) { return stmfx_write_reg(dev, STMFX_REG_GPIO_TYPE, offset, type); } +static int stmfx_conf_get_type(struct udevice *dev, unsigned int offset) +{ + return stmfx_read_reg(dev, STMFX_REG_GPIO_TYPE, offset); +} + static int stmfx_gpio_get(struct udevice *dev, unsigned int offset) { return stmfx_read_reg(dev, STMFX_REG_GPIO_STATE, offset); @@ -189,6 +199,45 @@ static int stmfx_gpio_set_dir_flags(struct udevice *dev, unsigned int offset, return ret; } +static int stmfx_gpio_get_dir_flags(struct udevice *dev, unsigned int offset, + ulong *flags) +{ + ulong dir_flags = 0; + int ret; + + if (stmfx_gpio_get_function(dev, offset) == GPIOF_OUTPUT) { + dir_flags |= GPIOD_IS_OUT; + ret = stmfx_conf_get_type(dev, offset); + if (ret < 0) + return ret; + if (ret == 0) + dir_flags |= GPIOD_OPEN_DRAIN; + /* 1 = push-pull (default), open source not supported */ + ret = stmfx_gpio_get(dev, offset); + if (ret < 0) + return ret; + if (ret) + dir_flags |= GPIOD_IS_OUT_ACTIVE; + } else { + dir_flags |= GPIOD_IS_IN; + ret = stmfx_conf_get_type(dev, offset); + if (ret < 0) + return ret; + if (ret == 1) { + ret = stmfx_conf_get_pupd(dev, offset); + if (ret < 0) + return ret; + if (ret == 1) + dir_flags |= GPIOD_PULL_UP; + else + dir_flags |= GPIOD_PULL_DOWN; + } + } + *flags = dir_flags; + + return 0; +} + static int stmfx_gpio_probe(struct udevice *dev) { struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev); @@ -218,6 +267,7 @@ static const struct dm_gpio_ops stmfx_gpio_ops = { .direction_input = stmfx_gpio_direction_input, .direction_output = stmfx_gpio_direction_output, .set_dir_flags = stmfx_gpio_set_dir_flags, + .get_dir_flags = stmfx_gpio_get_dir_flags, }; U_BOOT_DRIVER(stmfx_gpio) = {
Add support of ops get_dir_flags() to read dir flags from STMFX registers. Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com> --- Changes in v2: None drivers/pinctrl/pinctrl-stmfx.c | 50 +++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+)