|  | /* | 
|  | * Copyright (c) 2023 Antmicro | 
|  | * Copyright (c) 2024 Silicon Laboratories Inc. | 
|  | * SPDX-License-Identifier: Apache-2.0 | 
|  | */ | 
|  |  | 
|  | #define DT_DRV_COMPAT silabs_siwx91x_pinctrl | 
|  |  | 
|  | #include <zephyr/drivers/pinctrl.h> | 
|  | #include "sl_si91x_peripheral_gpio.h" | 
|  |  | 
|  | #define MODE_COUNT               16 | 
|  | #define HP_PERIPHERAL_ON_ULP_PIN 6 | 
|  |  | 
|  | static bool pinctrl_siwx91x_valid_mode(uint8_t mode) | 
|  | { | 
|  | return mode < MODE_COUNT; | 
|  | } | 
|  |  | 
|  | static void pinctrl_siwx91x_set(uint8_t port, uint8_t pin, uint8_t ulppin, uint8_t mode, | 
|  | uint8_t ulpmode, uint8_t pad) | 
|  | { | 
|  | if (pad == 0) { | 
|  | sl_si91x_gpio_enable_host_pad_selection((port << 4) | pin); | 
|  | } else if (pad != 0xFF && pad != 9) { | 
|  | sl_si91x_gpio_enable_pad_selection(pad); | 
|  | } | 
|  |  | 
|  | if (port == SL_GPIO_ULP_PORT) { | 
|  | sl_si91x_gpio_enable_ulp_pad_receiver(ulppin); | 
|  | } else { | 
|  | sl_si91x_gpio_enable_pad_receiver((port << 4) | pin); | 
|  | } | 
|  |  | 
|  | if (pinctrl_siwx91x_valid_mode(mode)) { | 
|  | GPIO->PIN_CONFIG[(port << 4) | pin].GPIO_CONFIG_REG_b.MODE = mode; | 
|  | } | 
|  |  | 
|  | if (pinctrl_siwx91x_valid_mode(ulpmode)) { | 
|  | if (pinctrl_siwx91x_valid_mode(mode) && ulpmode != HP_PERIPHERAL_ON_ULP_PIN) { | 
|  | sl_si91x_gpio_ulp_soc_mode(ulppin, ulpmode); | 
|  | ulpmode = 0; | 
|  | } | 
|  | ULP_GPIO->PIN_CONFIG[ulppin].GPIO_CONFIG_REG_b.MODE = ulpmode; | 
|  | } | 
|  | } | 
|  |  | 
|  | int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt, uintptr_t reg) | 
|  | { | 
|  | ARG_UNUSED(reg); | 
|  | int i; | 
|  |  | 
|  | for (i = 0; i < pin_cnt; i++) { | 
|  | pinctrl_siwx91x_set(pins[i].port, pins[i].pin, pins[i].ulppin, pins[i].mode, | 
|  | pins[i].ulpmode, pins[i].pad); | 
|  | } | 
|  |  | 
|  | return 0; | 
|  | } |