zephyr/drivers/pinctrl/pinctrl_sam0.c
Gerson Fernando Budke 10aa57857d drivers: pinctrl: Update Atmel sam0 driver to new API
This update current Atmel sam0 pinctrl initiative to current Zephyr
pinctrl API. It update current devicetree bindings and add the sam0
pinctrl driver.

Signed-off-by: Gerson Fernando Budke <nandojve@gmail.com>
2022-03-24 15:45:37 -07:00

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;
}