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