aboutsummaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authorEtienne Carriere <etienne.carriere@st.com>2019-05-03 10:07:20 +0200
committerJérôme Forissier <jerome.forissier@linaro.org>2019-05-06 11:43:51 +0200
commit082f27aed3757fbd41fb81cf1e11179fc2453cfd (patch)
tree2cf8403eb974df5a7189a46e2fe5533f7e5749e0 /core
parent9d8a03dff9932de5a6956b8f2e18daffd371eb93 (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.c27
-rw-r--r--core/include/drivers/stm32_uart.h3
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;
};
/*