From 6399ad50f443415a02827629280beafa5900f221 Mon Sep 17 00:00:00 2001 From: Gerard Marull-Paretas Date: Tue, 10 Aug 2021 11:24:54 +0200 Subject: [PATCH] drivers: pinctrl: nrf: add support for uart/uarte peripheral MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add support for configuring UART/UARTE peripheral pins. Co-authored-by: Andrzej Głąbek Signed-off-by: Gerard Marull-Paretas --- drivers/pinctrl/pinctrl_nrf.c | 32 +++++++++++++++++++++-- include/dt-bindings/pinctrl/nrf-pinctrl.h | 9 +++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/drivers/pinctrl/pinctrl_nrf.c b/drivers/pinctrl/pinctrl_nrf.c index 66197032769..274221eb40b 100644 --- a/drivers/pinctrl/pinctrl_nrf.c +++ b/drivers/pinctrl/pinctrl_nrf.c @@ -27,6 +27,12 @@ BUILD_ASSERT(((NRF_DRIVE_S0S1 == NRF_GPIO_PIN_S0S1) && (1U)), "nRF pinctrl drive settings do not match HAL values"); +#if DT_HAS_COMPAT_STATUS_OKAY(nordic_nrf_uart) +#define NRF_PSEL_UART(reg, line) ((NRF_UART_Type *)reg)->PSEL##line +#elif DT_HAS_COMPAT_STATUS_OKAY(nordic_nrf_uarte) +#define NRF_PSEL_UART(reg, line) ((NRF_UARTE_Type *)reg)->PSEL.line +#endif + /** * @brief Configure pin settings. * @@ -51,10 +57,32 @@ __unused static void nrf_pin_configure(pinctrl_soc_pin_t pin, int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt, uintptr_t reg) { - ARG_UNUSED(reg); - for (uint8_t i = 0U; i < pin_cnt; i++) { switch (NRF_GET_FUN(pins[i])) { +#if defined(NRF_PSEL_UART) + case NRF_FUN_UART_TX: + NRF_PSEL_UART(reg, TXD) = NRF_GET_PIN(pins[i]); + nrf_gpio_pin_write(NRF_GET_PIN(pins[i]), 1); + nrf_pin_configure(pins[i], NRF_GPIO_PIN_DIR_OUTPUT, + NRF_GPIO_PIN_INPUT_DISCONNECT); + break; + case NRF_FUN_UART_RX: + NRF_PSEL_UART(reg, RXD) = NRF_GET_PIN(pins[i]); + nrf_pin_configure(pins[i], NRF_GPIO_PIN_DIR_INPUT, + NRF_GPIO_PIN_INPUT_CONNECT); + break; + case NRF_FUN_UART_RTS: + NRF_PSEL_UART(reg, RTS) = NRF_GET_PIN(pins[i]); + nrf_gpio_pin_write(NRF_GET_PIN(pins[i]), 1); + nrf_pin_configure(pins[i], NRF_GPIO_PIN_DIR_OUTPUT, + NRF_GPIO_PIN_INPUT_DISCONNECT); + break; + case NRF_FUN_UART_CTS: + NRF_PSEL_UART(reg, CTS) = NRF_GET_PIN(pins[i]); + nrf_pin_configure(pins[i], NRF_GPIO_PIN_DIR_INPUT, + NRF_GPIO_PIN_INPUT_CONNECT); + break; +#endif /* defined(NRF_PSEL_UART) */ default: return -ENOTSUP; } diff --git a/include/dt-bindings/pinctrl/nrf-pinctrl.h b/include/dt-bindings/pinctrl/nrf-pinctrl.h index d477a8509c3..ebda2c5a025 100644 --- a/include/dt-bindings/pinctrl/nrf-pinctrl.h +++ b/include/dt-bindings/pinctrl/nrf-pinctrl.h @@ -51,6 +51,15 @@ * @{ */ +/** UART TX */ +#define NRF_FUN_UART_TX 0U +/** UART RX */ +#define NRF_FUN_UART_RX 1U +/** UART RTS */ +#define NRF_FUN_UART_RTS 2U +/** UART CTS */ +#define NRF_FUN_UART_CTS 3U + /** @} */ /**