| /* | 
 |  * Copyright (c) 2022, Gerson Fernando Budke <nandojve@gmail.com> | 
 |  * | 
 |  * SPDX-License-Identifier: Apache-2.0 | 
 |  */ | 
 |  | 
 | #include <zephyr/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; | 
 | } |