Hi Patrice, On 20 September 2018 at 07:37, Patrice Chotard <patrice.chot...@st.com> wrote: > pinmux_show allows to display the muxing of all pins > belonging to pin-controller. > > Signed-off-by: Patrice Chotard <patrice.chot...@st.com> > --- > > drivers/pinctrl/pinctrl_stm32.c | 79 > +++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 79 insertions(+) >
The only thing I don't like about this is that it is quite SoC-specific. I am hoping we can make it more generic. > diff --git a/drivers/pinctrl/pinctrl_stm32.c b/drivers/pinctrl/pinctrl_stm32.c > index 31285cdd5784..a477035bf420 100644 > --- a/drivers/pinctrl/pinctrl_stm32.c > +++ b/drivers/pinctrl/pinctrl_stm32.c > @@ -14,6 +14,16 @@ DECLARE_GLOBAL_DATA_PTR; > #define OTYPE_MSK 1 > #define AFR_MASK 0xF > > +#define PINMUX_MODE_COUNT 5 > + > +static const char * const pinmux_mode[PINMUX_MODE_COUNT] = { > + "gpio input", > + "gpio output", > + "analog", > + "unknown", > + "alt function", > +}; > + > static int stm32_gpio_config(struct gpio_desc *desc, > const struct stm32_gpio_ctl *ctl) > { > @@ -176,12 +186,81 @@ static int stm32_pinctrl_set_state_simple(struct > udevice *dev, > } > #endif /* PINCTRL_FULL */ > > +static int stm32_pinctrl_get_af(struct udevice *dev, unsigned int offset) > +{ > + struct stm32_gpio_priv *priv = dev_get_priv(dev); > + struct stm32_gpio_regs *regs = priv->regs; > + u32 af; > + u32 alt_shift = (offset % 8) * 4; > + u32 alt_index = offset / 8; > + > + af = (readl(®s->afr[alt_index]) & > + GENMASK(alt_shift + 3, alt_shift)) >> alt_shift; > + > + return af; > +} > + > +static int stm32_pinmux_show(struct udevice *dev) > +{ > + struct udevice *child; > + struct udevice *dev_gpio; > + const char *bank_name; > + const char *label; > + int offset; > + int ret; > + int num_bits; > + int mode; > + int af_num; > + > + /* parse pin-controller sub-nodes, ie gpio bank nodes */ > + list_for_each_entry(child, &dev->child_head, sibling_node) { > + ret = uclass_get_device_by_name(UCLASS_GPIO, child->name, > + &dev_gpio); I wonder to what extend this is actually different from 'gpio status'? > + > + if (ret < 0 && ret != -ENODEV) { > + dev_err(dev, "Failed to find %s device ret = %d\n", > + child->name, ret); > + return ret; > + } > + > + if (!ret) { > + bank_name = gpio_get_bank_info(dev_gpio, &num_bits); > + > + printf("\nBank %s:\n", bank_name); > + for (offset = 0; offset < num_bits; offset++) { > + mode = gpio_get_raw_function(dev_gpio, > + offset, &label); > + printf("%s%d: %s", bank_name, offset, > + pinmux_mode[mode]); > + switch (mode) { > + case GPIOF_FUNC: > + af_num = > stm32_pinctrl_get_af(dev_gpio, > + offset); > + printf(" %d", af_num); > + break; > + case STM32_GPIO_MODE_OUT: How come you cannot use GPIOF_OUTPUT here? > + case STM32_GPIO_MODE_IN: > + printf(" %s", label ? label : ""); > + break; > + } > + printf("\n"); > + } > + } > + > + if (!child) > + break; > + } > + > + return 0; > +} > + > static struct pinctrl_ops stm32_pinctrl_ops = { > #if CONFIG_IS_ENABLED(PINCTRL_FULL) > .set_state = stm32_pinctrl_set_state, > #else /* PINCTRL_FULL */ > .set_state_simple = stm32_pinctrl_set_state_simple, > #endif /* PINCTRL_FULL */ > + .pinmux_show = stm32_pinmux_show, > }; > > static const struct udevice_id stm32_pinctrl_ids[] = { > -- > 1.9.1 > Regards, Simon _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot