pinctrl: stm32: Implement .get_direction gpio_chip callback
authorAlexandre TORGUE <alexandre.torgue@st.com>
Mon, 29 May 2017 16:17:32 +0000 (18:17 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Wed, 31 May 2017 00:05:49 +0000 (02:05 +0200)
Add .get_direction() gpiochip callback in STM32 pinctrl driver.

Signed-off-by: Alexandre TORGUE <alexandre.torgue@st.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/stm32/pinctrl-stm32.c
drivers/pinctrl/stm32/pinctrl-stm32.h

index 5a15c7deea78bdcb2e692116f62184caeef150f7..814f76c371c86a87bdb61e50cd1d173530934965 100644 (file)
@@ -209,6 +209,24 @@ static int stm32_gpio_to_irq(struct gpio_chip *chip, unsigned int offset)
        return irq_create_fwspec_mapping(&fwspec);
 }
 
+static int stm32_gpio_get_direction(struct gpio_chip *chip, unsigned int offset)
+{
+       struct stm32_gpio_bank *bank = gpiochip_get_data(chip);
+       int pin = stm32_gpio_pin(offset);
+       int ret;
+       u32 mode, alt;
+
+       stm32_pmx_get_mode(bank, pin, &mode, &alt);
+       if ((alt == 0) && (mode == 0))
+               ret = 1;
+       else if ((alt == 0) && (mode == 1))
+               ret = 0;
+       else
+               ret = -EINVAL;
+
+       return ret;
+}
+
 static const struct gpio_chip stm32_gpio_template = {
        .request                = stm32_gpio_request,
        .free                   = stm32_gpio_free,
@@ -217,6 +235,7 @@ static const struct gpio_chip stm32_gpio_template = {
        .direction_input        = stm32_gpio_direction_input,
        .direction_output       = stm32_gpio_direction_output,
        .to_irq                 = stm32_gpio_to_irq,
+       .get_direction          = stm32_gpio_get_direction,
 };
 
 static int stm32_gpio_irq_request_resources(struct irq_data *irq_data)
@@ -577,8 +596,8 @@ static void stm32_pmx_set_mode(struct stm32_gpio_bank *bank,
        clk_disable(bank->clk);
 }
 
-static void stm32_pmx_get_mode(struct stm32_gpio_bank *bank,
-               int pin, u32 *mode, u32 *alt)
+void stm32_pmx_get_mode(struct stm32_gpio_bank *bank, int pin, u32 *mode,
+                       u32 *alt)
 {
        u32 val;
        int alt_shift = (pin % 8) * 4;
index 35ebc94c01e4e7e9bd4fd463ed3c168979acbafc..8702a9992ce59ec3b616c694be5139c202e267e2 100644 (file)
@@ -45,7 +45,10 @@ struct stm32_pinctrl_match_data {
        const unsigned int npins;
 };
 
-int stm32_pctl_probe(struct platform_device *pdev);
+struct stm32_gpio_bank;
 
+int stm32_pctl_probe(struct platform_device *pdev);
+void stm32_pmx_get_mode(struct stm32_gpio_bank *bank,
+                       int pin, u32 *mode, u32 *alt);
 #endif /* __PINCTRL_STM32_H */