58 lines
1.4 KiB
C
58 lines
1.4 KiB
C
/*
|
|
* Copyright (c) 2022, Gerson Fernando Budke <nandojve@gmail.com>
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#include <drivers/pinctrl.h>
|
|
#include <soc_port.h>
|
|
|
|
/** Utility macro that expands to the PORT port address if it exists */
|
|
#define SAM_PORT_ADDR_OR_NONE(nodelabel) \
|
|
IF_ENABLED(DT_NODE_EXISTS(DT_NODELABEL(nodelabel)), \
|
|
(DT_REG_ADDR(DT_NODELABEL(nodelabel)),))
|
|
|
|
/** SAM0 port addresses */
|
|
static const uint32_t sam_port_addrs[] = {
|
|
SAM_PORT_ADDR_OR_NONE(porta)
|
|
SAM_PORT_ADDR_OR_NONE(portb)
|
|
SAM_PORT_ADDR_OR_NONE(portc)
|
|
SAM_PORT_ADDR_OR_NONE(portd)
|
|
SAM_PORT_ADDR_OR_NONE(porte)
|
|
SAM_PORT_ADDR_OR_NONE(portf)
|
|
};
|
|
|
|
static void pinctrl_configure_pin(pinctrl_soc_pin_t pin)
|
|
{
|
|
struct soc_port_pin soc_pin;
|
|
uint8_t port_idx, port_func;
|
|
|
|
port_idx = SAM_PINMUX_PORT_GET(pin);
|
|
__ASSERT_NO_MSG(port_idx < ARRAY_SIZE(sam_port_addrs));
|
|
port_func = SAM_PINMUX_FUNC_GET(pin);
|
|
|
|
soc_pin.regs = (PortGroup *) sam_port_addrs[port_idx];
|
|
soc_pin.pinum = SAM_PINMUX_PIN_GET(pin);
|
|
soc_pin.flags = SAM_PINCTRL_FLAGS_GET(pin) << SOC_PORT_FLAGS_POS;
|
|
|
|
if (port_func == SAM_PINMUX_FUNC_periph) {
|
|
soc_pin.flags |= (SAM_PINMUX_PERIPH_GET(pin)
|
|
<< SOC_PORT_FUNC_POS)
|
|
| SOC_PORT_PMUXEN_ENABLE;
|
|
}
|
|
|
|
soc_port_configure(&soc_pin);
|
|
}
|
|
|
|
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++) {
|
|
pinctrl_configure_pin(*pins++);
|
|
}
|
|
|
|
return 0;
|
|
}
|