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(+) 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); + + 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: + 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 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot