blob: 1343ba2c98739116b35ac26f22136370944106a3 [file] [log] [blame]
/*
* SPDX-License-Identifier: Apache-2.0
* Copyright (c) 2024 sensry.io
*/
#define DT_DRV_COMPAT sensry_sy1xx_pinctrl
#include <zephyr/drivers/pinctrl.h>
#include <zephyr/device.h>
#include <zephyr/devicetree.h>
#include <zephyr/arch/common/sys_io.h>
static uint32_t pinctrl0_base_addr = DT_REG_ADDR(DT_NODELABEL(pinctrl));
static uint32_t pinctrl0_base_mask = DT_REG_SIZE(DT_NODELABEL(pinctrl)) - 1;
/**
* @brief Configure a pin.
*
* @param pin The pin to configure.
*/
static int pinctrl_configure_pin(const pinctrl_soc_pin_t *pin)
{
uint32_t addr = (pin->addr & pinctrl0_base_mask) | pinctrl0_base_addr;
switch (pin->iro) {
case 0:
case 8:
case 16:
case 24:
/* fall through */
break;
default:
/* invalid inter address offset */
return -EINVAL;
}
uint32_t reg = ~(0xFFUL << pin->iro) & sys_read32(addr);
reg |= FIELD_PREP((0xFFUL << pin->iro), pin->cfg);
sys_write32(reg, addr);
return 0;
}
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++) {
int ret = pinctrl_configure_pin(pins++);
if (ret < 0) {
return ret;
}
}
return 0;
}