gpio: stm32f7: Add ops get_function
authorPatrice Chotard <patrice.chotard@st.com>
Wed, 24 Oct 2018 12:10:21 +0000 (14:10 +0200)
committerTom Rini <trini@konsulko.com>
Fri, 16 Nov 2018 21:51:56 +0000 (16:51 -0500)
This patch adds gpio get_function ops support.
This function reports the state of a gpio.

Signed-off-by: Christophe Kerello <christophe.kerello@st.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Patrice Chotard <patrice.chotard@st.com>
drivers/gpio/stm32f7_gpio.c

index b903dc46b33e967e88d44d25d878e5df9d260ea8..a690c437ebc67bf63a6f9b1044c420e16ae5c2c2 100644 (file)
@@ -65,11 +65,31 @@ static int stm32_gpio_set_value(struct udevice *dev, unsigned offset, int value)
        return 0;
 }
 
+static int stm32_gpio_get_function(struct udevice *dev, unsigned int offset)
+{
+       struct stm32_gpio_priv *priv = dev_get_priv(dev);
+       struct stm32_gpio_regs *regs = priv->regs;
+       int bits_index = MODE_BITS(offset);
+       int mask = MODE_BITS_MASK << bits_index;
+       u32 mode;
+
+       mode = (readl(&regs->moder) & mask) >> bits_index;
+       if (mode == STM32_GPIO_MODE_OUT)
+               return GPIOF_OUTPUT;
+       if (mode == STM32_GPIO_MODE_IN)
+               return GPIOF_INPUT;
+       if (mode == STM32_GPIO_MODE_AN)
+               return GPIOF_UNUSED;
+
+       return GPIOF_FUNC;
+}
+
 static const struct dm_gpio_ops gpio_stm32_ops = {
        .direction_input        = stm32_gpio_direction_input,
        .direction_output       = stm32_gpio_direction_output,
        .get_value              = stm32_gpio_get_value,
        .set_value              = stm32_gpio_set_value,
+       .get_function           = stm32_gpio_get_function,
 };
 
 static int gpio_stm32_probe(struct udevice *dev)