zephyr/drivers/pinctrl/pinctrl_silabs_dbus.c
Aksel Skauge Mellbye 120691a155 drivers: pinctrl: silabs: Add support for analog bus allocation
The GPIO peripheral on Silabs Series 2 devices is responsible for
allocating analog buses to analog peripherals. Enable support for
this in the pinctrl driver. Since these bus allocations are not
digital pins, introduce a new property silabs,analog-bus for this
purpose.

Signed-off-by: Aksel Skauge Mellbye <aksel.mellbye@silabs.com>
2025-01-30 18:30:01 +01:00

49 lines
1.3 KiB
C

/*
* Copyright (c) 2024 Silicon Laboratories Inc.
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/drivers/pinctrl.h>
#include <zephyr/arch/cpu.h>
#include <em_gpio.h>
#define DT_DRV_COMPAT silabs_dbus_pinctrl
#define PIN_MASK 0xF0000UL
#define ABUS_MASK(i) GENMASK(((i) * 8) + 3, (i) * 8)
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++) {
mem_addr_t enable_reg, route_reg;
/* Configure ABUS */
if (pins[i].en_bit == SILABS_PINCTRL_ANALOG) {
enable_reg = DT_INST_REG_ADDR_BY_NAME(0, abus) +
(pins[i].base_offset * sizeof(mem_addr_t));
sys_write32(FIELD_PREP(ABUS_MASK(pins[i].mode), pins[i].route_offset),
enable_reg);
continue;
}
/* Configure GPIO */
GPIO_PinModeSet(pins[i].port, pins[i].pin, pins[i].mode, pins[i].dout);
/* Configure DBUS */
enable_reg = DT_INST_REG_ADDR_BY_NAME(0, dbus) +
(pins[i].base_offset * sizeof(mem_addr_t));
route_reg = enable_reg + (pins[i].route_offset * sizeof(mem_addr_t));
sys_write32(pins[i].port | FIELD_PREP(PIN_MASK, pins[i].pin), route_reg);
if (pins[i].en_bit != SILABS_PINCTRL_UNUSED) {
sys_set_bit(enable_reg, pins[i].en_bit);
}
}
return 0;
}