diff options
author | Etienne Carriere <etienne.carriere@st.com> | 2019-05-03 10:07:20 +0200 |
---|---|---|
committer | Jérôme Forissier <jerome.forissier@linaro.org> | 2019-05-06 11:43:51 +0200 |
commit | 082f27aed3757fbd41fb81cf1e11179fc2453cfd (patch) | |
tree | 2cf8403eb974df5a7189a46e2fe5533f7e5749e0 /core | |
parent | 9d8a03dff9932de5a6956b8f2e18daffd371eb93 (diff) |
stm32_uart: pin control with stm32_gpio
stm32_uart instance get related pins configuration
from device tree content.
Signed-off-by: Etienne Carriere <etienne.carriere@st.com>
Acked-by: Jerome Forissier <jerome.forissier@linaro.org>
Diffstat (limited to 'core')
-rw-r--r-- | core/drivers/stm32_uart.c | 27 | ||||
-rw-r--r-- | core/include/drivers/stm32_uart.h | 3 |
2 files changed, 30 insertions, 0 deletions
diff --git a/core/drivers/stm32_uart.c b/core/drivers/stm32_uart.c index daff9b6d..b7901f36 100644 --- a/core/drivers/stm32_uart.c +++ b/core/drivers/stm32_uart.c @@ -108,18 +108,30 @@ void stm32_uart_init(struct stm32_uart_pdata *pd, vaddr_t base) #ifdef CFG_DT static void register_secure_uart(struct stm32_uart_pdata *pd) { + size_t n = 0; + stm32mp_register_secure_periph_iomem(pd->base.pa); + for (n = 0; n < pd->pinctrl_count; n++) + stm32mp_register_secure_gpio(pd->pinctrl[n].bank, + pd->pinctrl[n].pin); } static void register_non_secure_uart(struct stm32_uart_pdata *pd) { + size_t n = 0; + stm32mp_register_non_secure_periph_iomem(pd->base.pa); + for (n = 0; n < pd->pinctrl_count; n++) + stm32mp_register_non_secure_gpio(pd->pinctrl[n].bank, + pd->pinctrl[n].pin); } struct stm32_uart_pdata *stm32_uart_init_from_dt_node(void *fdt, int node) { struct stm32_uart_pdata *pd = NULL; struct dt_node_info info = { }; + struct stm32_pinctrl *pinctrl_cfg = NULL; + int count = 0; _fdt_fill_device_info(fdt, &info, node); @@ -143,6 +155,21 @@ struct stm32_uart_pdata *stm32_uart_init_from_dt_node(void *fdt, int node) pd->secure ? MEM_AREA_IO_SEC : MEM_AREA_IO_NSEC); + count = stm32_pinctrl_fdt_get_pinctrl(fdt, node, NULL, 0); + if (count < 0) + panic(); + + if (count) { + pinctrl_cfg = calloc(count, sizeof(*pinctrl_cfg)); + if (!pinctrl_cfg) + panic(); + + stm32_pinctrl_fdt_get_pinctrl(fdt, node, pinctrl_cfg, count); + stm32_pinctrl_load_active_cfg(pinctrl_cfg, count); + } + pd->pinctrl = pinctrl_cfg; + pd->pinctrl_count = count; + if (pd->secure) register_secure_uart(pd); else diff --git a/core/include/drivers/stm32_uart.h b/core/include/drivers/stm32_uart.h index 895256a9..6c134d86 100644 --- a/core/include/drivers/stm32_uart.h +++ b/core/include/drivers/stm32_uart.h @@ -7,12 +7,15 @@ #define __STM32_UART_H__ #include <drivers/serial.h> +#include <drivers/stm32_gpio.h> struct stm32_uart_pdata { struct io_pa_va base; struct serial_chip chip; bool secure; unsigned int clock; + struct stm32_pinctrl *pinctrl; + size_t pinctrl_count; }; /* |