| /* |
| * Copyright 2022, 2024 NXP |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #include <zephyr/kernel.h> |
| #include <zephyr/drivers/pinctrl.h> |
| |
| /* SIUL2 Multiplexed Signal Configuration Register */ |
| #define SIUL2_MSCR(n) (0x240 + 0x4 * (n)) |
| /* SIUL2 Input Multiplexed Signal Configuration Register */ |
| #define SIUL2_IMCR(n) (0xa40 + 0x4 * (n)) |
| |
| #define SIUL2_MSCR_MAX_IDX 512U |
| #define SIUL2_IMCR_MAX_IDX 512U |
| |
| /* |
| * Utility macro that expands to the SIUL2 base address if it exists or zero. |
| * Note that some devices may have instance gaps, hence the need to keep them in the array. |
| */ |
| #define SIUL2_BASE_OR_ZERO(nodelabel) \ |
| COND_CODE_1(DT_NODE_EXISTS(DT_NODELABEL(nodelabel)), \ |
| (DT_REG_ADDR(DT_NODELABEL(nodelabel))), (0U)) |
| |
| static mem_addr_t siul2_bases[] = { |
| SIUL2_BASE_OR_ZERO(siul2_0), SIUL2_BASE_OR_ZERO(siul2_1), SIUL2_BASE_OR_ZERO(siul2_2), |
| SIUL2_BASE_OR_ZERO(siul2_3), SIUL2_BASE_OR_ZERO(siul2_4), SIUL2_BASE_OR_ZERO(siul2_5), |
| }; |
| |
| static void pinctrl_configure_pin(const pinctrl_soc_pin_t *pin) |
| { |
| mem_addr_t base; |
| |
| /* Multiplexed Signal Configuration */ |
| __ASSERT_NO_MSG(pin->mscr.inst < ARRAY_SIZE(siul2_bases)); |
| base = siul2_bases[pin->mscr.inst]; |
| __ASSERT_NO_MSG(base != 0); |
| |
| __ASSERT_NO_MSG(pin->mscr.idx < SIUL2_MSCR_MAX_IDX); |
| sys_write32(pin->mscr.val, (base + SIUL2_MSCR(pin->mscr.idx))); |
| |
| /* Input Multiplexed Signal Configuration */ |
| if (pin->mscr.val & SIUL2_MSCR_IBE_MASK) { |
| __ASSERT_NO_MSG(pin->imcr.inst < ARRAY_SIZE(siul2_bases)); |
| base = siul2_bases[pin->imcr.inst]; |
| __ASSERT_NO_MSG(base != 0); |
| |
| __ASSERT_NO_MSG(pin->imcr.idx < SIUL2_IMCR_MAX_IDX); |
| sys_write32(pin->imcr.val, (base + SIUL2_IMCR(pin->imcr.idx))); |
| } |
| } |
| |
| int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt, uintptr_t reg) |
| { |
| ARG_UNUSED(reg); |
| |
| for (uint8_t i = 0; i < pin_cnt; i++) { |
| pinctrl_configure_pin(pins++); |
| } |
| |
| return 0; |
| } |