[U-Boot] [PATCH v1 4/5] pinctrl: stm32: Add pinmux_show() ops

Patrice Chotard patrice.chotard at st.com
Thu Sep 20 13:37:05 UTC 2018


pinmux_show allows to display the muxing of all pins
belonging to pin-controller.

Signed-off-by: Patrice Chotard <patrice.chotard at 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(&regs->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



More information about the U-Boot mailing list