aboutsummaryrefslogtreecommitdiff
path: root/core/drivers
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/drivers
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/drivers')
-rw-r--r--core/drivers/stm32_uart.c27
1 files changed, 27 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