From a9ae7006957069462f8110c17e37cbb079efde71 Mon Sep 17 00:00:00 2001 From: Gerard Marull-Paretas Date: Thu, 25 Nov 2021 12:04:17 +0100 Subject: [PATCH] drivers: gpio: stm32: introduce gpio_stm32_configure_raw Make gpio32_stm32_configure use runtime PM API (so that it can be used externally without further effort). The raw version of the function (no PM put/get) has been introduced for internal use. Signed-off-by: Gerard Marull-Paretas --- drivers/gpio/gpio_stm32.c | 19 +++++++++++++++++-- drivers/gpio/gpio_stm32.h | 4 +++- drivers/pinctrl/pinctrl_stm32.c | 11 +---------- drivers/pinmux/pinmux_stm32.c | 11 +---------- 4 files changed, 22 insertions(+), 23 deletions(-) diff --git a/drivers/gpio/gpio_stm32.c b/drivers/gpio/gpio_stm32.c index 6051f676e70..736540bc258 100644 --- a/drivers/gpio/gpio_stm32.c +++ b/drivers/gpio/gpio_stm32.c @@ -114,7 +114,8 @@ static inline uint32_t stm32_pinval_get(int pin) /** * @brief Configure the hardware. */ -void gpio_stm32_configure(const struct device *dev, int pin, int conf, int altf) +static void gpio_stm32_configure_raw(const struct device *dev, int pin, + int conf, int altf) { const struct gpio_stm32_config *cfg = dev->config; GPIO_TypeDef *gpio = (GPIO_TypeDef *)cfg->base; @@ -223,6 +224,20 @@ void gpio_stm32_configure(const struct device *dev, int pin, int conf, int altf) } +int gpio_stm32_configure(const struct device *dev, int pin, int conf, int altf) +{ + int ret; + + ret = pm_device_runtime_get(dev); + if (ret < 0) { + return ret; + } + + gpio_stm32_configure_raw(dev, pin, conf, altf); + + return pm_device_runtime_put(dev); +} + /** * @brief GPIO port clock handling */ @@ -477,7 +492,7 @@ static int gpio_stm32_config(const struct device *dev, } } - gpio_stm32_configure(dev, pin, pincfg, 0); + gpio_stm32_configure_raw(dev, pin, pincfg, 0); /* Release clock only if configuration doesn't require bank writes */ if ((flags & GPIO_OUTPUT) == 0) { diff --git a/drivers/gpio/gpio_stm32.h b/drivers/gpio/gpio_stm32.h index 324b1708a9b..7e98d15784a 100644 --- a/drivers/gpio/gpio_stm32.h +++ b/drivers/gpio/gpio_stm32.h @@ -238,8 +238,10 @@ struct gpio_stm32_data { * @param pin IO pin * @param conf GPIO mode * @param altf Alternate function + * + * @return 0 on success, negative errno code on failure */ -void gpio_stm32_configure(const struct device *dev, int pin, int conf, int altf); +int gpio_stm32_configure(const struct device *dev, int pin, int conf, int altf); /** * @brief Enable / disable GPIO port clock. diff --git a/drivers/pinctrl/pinctrl_stm32.c b/drivers/pinctrl/pinctrl_stm32.c index 4aaeec17901..e919adaa77f 100644 --- a/drivers/pinctrl/pinctrl_stm32.c +++ b/drivers/pinctrl/pinctrl_stm32.c @@ -9,7 +9,6 @@ #include #include #include -#include #include #include @@ -146,7 +145,6 @@ static int stm32_pins_remap(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt) static int stm32_pin_configure(uint32_t pin, uint32_t func, uint32_t altf) { const struct device *port_device; - int ret; if (STM32_PORT(pin) >= gpio_ports_cnt) { return -EINVAL; @@ -158,14 +156,7 @@ static int stm32_pin_configure(uint32_t pin, uint32_t func, uint32_t altf) return -ENODEV; } - ret = pm_device_runtime_get(port_device); - if (ret < 0) { - return ret; - } - - gpio_stm32_configure(port_device, STM32_PIN(pin), func, altf); - - return pm_device_runtime_put(port_device); + return gpio_stm32_configure(port_device, STM32_PIN(pin), func, altf); } int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt, diff --git a/drivers/pinmux/pinmux_stm32.c b/drivers/pinmux/pinmux_stm32.c index 6a1c572623f..8214b1db320 100644 --- a/drivers/pinmux/pinmux_stm32.c +++ b/drivers/pinmux/pinmux_stm32.c @@ -23,7 +23,6 @@ #include #include #include -#include const struct device * const gpio_ports[STM32_PORTS_MAX] = { DEVICE_DT_GET_OR_NULL(DT_NODELABEL(gpioa)), @@ -92,7 +91,6 @@ SYS_INIT(stm32_pinmux_init_remap, PRE_KERNEL_1, static int stm32_pin_configure(uint32_t pin, uint32_t func, uint32_t altf) { const struct device *port_device; - int ret; if (STM32_PORT(pin) >= STM32_PORTS_MAX) { return -EINVAL; @@ -104,14 +102,7 @@ static int stm32_pin_configure(uint32_t pin, uint32_t func, uint32_t altf) return -ENODEV; } - ret = pm_device_runtime_get(port_device); - if (ret < 0) { - return ret; - } - - gpio_stm32_configure(port_device, STM32_PIN(pin), func, altf); - - return pm_device_runtime_put(port_device); + return gpio_stm32_configure(port_device, STM32_PIN(pin), func, altf); } /**