From 0e2af43fc6d7677979e19bf1a42bfcd167a21b9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrzej=20G=C5=82=C4=85bek?= Date: Tue, 1 Mar 2022 17:01:44 +0100 Subject: [PATCH] drivers: pinctrl: nrf: Add support for I2S and PDM peripherals MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add support for configuring pins of the nRF I2S and PDM peripherals. Signed-off-by: Andrzej Głąbek --- drivers/pinctrl/pinctrl_nrf.c | 62 +++++++++++++++++++++++ include/dt-bindings/pinctrl/nrf-pinctrl.h | 18 +++++++ 2 files changed, 80 insertions(+) diff --git a/drivers/pinctrl/pinctrl_nrf.c b/drivers/pinctrl/pinctrl_nrf.c index a8427954eef..4af8019c88f 100644 --- a/drivers/pinctrl/pinctrl_nrf.c +++ b/drivers/pinctrl/pinctrl_nrf.c @@ -53,6 +53,14 @@ BUILD_ASSERT(((NRF_DRIVE_S0S1 == NRF_GPIO_PIN_S0S1) && #define NRF_PSEL_TWIM(reg, line) ((NRF_TWIM_Type *)reg)->PSEL.line #endif +#if DT_HAS_COMPAT_STATUS_OKAY(nordic_nrf_i2s) +#define NRF_PSEL_I2S(reg, line) ((NRF_I2S_Type *)reg)->PSEL.line +#endif + +#if DT_HAS_COMPAT_STATUS_OKAY(nordic_nrf_pdm) +#define NRF_PSEL_PDM(reg, line) ((NRF_PDM_Type *)reg)->PSEL.line +#endif + /** * @brief Configure pin settings. * @@ -156,6 +164,60 @@ int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt, NRF_GPIO_PIN_INPUT_CONNECT); break; #endif /* defined(NRF_PSEL_TWIM) */ +#if defined(NRF_PSEL_I2S) + case NRF_FUN_I2S_SCK_M: + NRF_PSEL_I2S(reg, SCK) = NRF_GET_PIN(pins[i]); + nrf_gpio_pin_write(NRF_GET_PIN(pins[i]), 0); + nrf_pin_configure(pins[i], NRF_GPIO_PIN_DIR_OUTPUT, + NRF_GPIO_PIN_INPUT_DISCONNECT); + break; + case NRF_FUN_I2S_SCK_S: + NRF_PSEL_I2S(reg, SCK) = NRF_GET_PIN(pins[i]); + nrf_pin_configure(pins[i], NRF_GPIO_PIN_DIR_INPUT, + NRF_GPIO_PIN_INPUT_CONNECT); + break; + case NRF_FUN_I2S_LRCK_M: + NRF_PSEL_I2S(reg, LRCK) = NRF_GET_PIN(pins[i]); + nrf_gpio_pin_write(NRF_GET_PIN(pins[i]), 0); + nrf_pin_configure(pins[i], NRF_GPIO_PIN_DIR_OUTPUT, + NRF_GPIO_PIN_INPUT_DISCONNECT); + break; + case NRF_FUN_I2S_LRCK_S: + NRF_PSEL_I2S(reg, LRCK) = NRF_GET_PIN(pins[i]); + nrf_pin_configure(pins[i], NRF_GPIO_PIN_DIR_INPUT, + NRF_GPIO_PIN_INPUT_CONNECT); + break; + case NRF_FUN_I2S_SDIN: + NRF_PSEL_I2S(reg, SDIN) = NRF_GET_PIN(pins[i]); + nrf_pin_configure(pins[i], NRF_GPIO_PIN_DIR_INPUT, + NRF_GPIO_PIN_INPUT_CONNECT); + break; + case NRF_FUN_I2S_SDOUT: + NRF_PSEL_I2S(reg, SDOUT) = NRF_GET_PIN(pins[i]); + nrf_gpio_pin_write(NRF_GET_PIN(pins[i]), 0); + nrf_pin_configure(pins[i], NRF_GPIO_PIN_DIR_OUTPUT, + NRF_GPIO_PIN_INPUT_DISCONNECT); + break; + case NRF_FUN_I2S_MCK: + NRF_PSEL_I2S(reg, MCK) = NRF_GET_PIN(pins[i]); + nrf_gpio_pin_write(NRF_GET_PIN(pins[i]), 0); + nrf_pin_configure(pins[i], NRF_GPIO_PIN_DIR_OUTPUT, + NRF_GPIO_PIN_INPUT_DISCONNECT); + break; +#endif /* defined(NRF_PSEL_I2S) */ +#if defined(NRF_PSEL_PDM) + case NRF_FUN_PDM_CLK: + NRF_PSEL_PDM(reg, CLK) = NRF_GET_PIN(pins[i]); + nrf_gpio_pin_write(NRF_GET_PIN(pins[i]), 0); + nrf_pin_configure(pins[i], NRF_GPIO_PIN_DIR_OUTPUT, + NRF_GPIO_PIN_INPUT_DISCONNECT); + break; + case NRF_FUN_PDM_DIN: + NRF_PSEL_PDM(reg, DIN) = 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_PDM) */ default: return -ENOTSUP; } diff --git a/include/dt-bindings/pinctrl/nrf-pinctrl.h b/include/dt-bindings/pinctrl/nrf-pinctrl.h index b24e97a7358..55f76a63ec8 100644 --- a/include/dt-bindings/pinctrl/nrf-pinctrl.h +++ b/include/dt-bindings/pinctrl/nrf-pinctrl.h @@ -77,6 +77,24 @@ #define NRF_FUN_TWIM_SCL 11U /** TWI master SDA */ #define NRF_FUN_TWIM_SDA 12U +/** I2S SCK in master mode */ +#define NRF_FUN_I2S_SCK_M 13U +/** I2S SCK in slave mode */ +#define NRF_FUN_I2S_SCK_S 14U +/** I2S LRCK in master mode */ +#define NRF_FUN_I2S_LRCK_M 15U +/** I2S LRCK in slave mode */ +#define NRF_FUN_I2S_LRCK_S 16U +/** I2S SDIN */ +#define NRF_FUN_I2S_SDIN 17U +/** I2S SDOUT */ +#define NRF_FUN_I2S_SDOUT 18U +/** I2S MCK */ +#define NRF_FUN_I2S_MCK 19U +/** PDM CLK */ +#define NRF_FUN_PDM_CLK 20U +/** PDM DIN */ +#define NRF_FUN_PDM_DIN 21U /** @} */