From 082f27aed3757fbd41fb81cf1e11179fc2453cfd Mon Sep 17 00:00:00 2001 From: Etienne Carriere Date: Fri, 3 May 2019 10:07:20 +0200 Subject: stm32_uart: pin control with stm32_gpio stm32_uart instance get related pins configuration from device tree content. Signed-off-by: Etienne Carriere Acked-by: Jerome Forissier --- core/drivers/stm32_uart.c | 27 +++++++++++++++++++++++++++ core/include/drivers/stm32_uart.h | 3 +++ 2 files changed, 30 insertions(+) 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 +#include 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; }; /* -- cgit v1.2.3