blob: 2e3a9f62488b4e1331da624376ed501517ecfd1c [file] [log] [blame]
/*
* 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;
}