69 lines
1.7 KiB
C
69 lines
1.7 KiB
C
|
/*
|
||
|
* Copyright 2024 NXP
|
||
|
*
|
||
|
* SPDX-License-Identifier: Apache-2.0
|
||
|
*/
|
||
|
|
||
|
#include <zephyr/drivers/pinctrl.h>
|
||
|
#include <zephyr/drivers/firmware/scmi/pinctrl.h>
|
||
|
|
||
|
static int scmi_pinctrl_configure_pin(const pinctrl_soc_pin_t *pin)
|
||
|
{
|
||
|
struct scmi_pinctrl_settings settings;
|
||
|
int ret, config_num;
|
||
|
|
||
|
config_num = 0;
|
||
|
|
||
|
/* set mux value, and daisy */
|
||
|
settings.id = (pin->pinmux.mux_register - IOMUXC_MUXREG) / 4;
|
||
|
settings.config[0] = PIN_CONFIG_TYPE_MUX;
|
||
|
settings.config[1] = IOMUXC_INPUT_ENABLE(pin->pin_ctrl_flags)
|
||
|
? (pin->pinmux.mux_mode | IOMUXC_SION(1))
|
||
|
: pin->pinmux.mux_mode;
|
||
|
config_num++;
|
||
|
|
||
|
if (pin->pinmux.input_register) {
|
||
|
settings.config[2] = PIN_CONFIG_TYPE_DAISY_ID;
|
||
|
settings.config[3] = (pin->pinmux.input_register - IOMUXC_DAISYREG) / 4;
|
||
|
config_num++;
|
||
|
|
||
|
settings.config[4] = PIN_CONFIG_TYPE_DAISY_CFG;
|
||
|
settings.config[5] = pin->pinmux.input_daisy;
|
||
|
config_num++;
|
||
|
}
|
||
|
|
||
|
settings.attributes =
|
||
|
SCMI_PINCTRL_CONFIG_ATTRIBUTES(0x0, config_num, SCMI_PINCTRL_SELECTOR_PIN);
|
||
|
|
||
|
ret = scmi_pinctrl_settings_configure(&settings);
|
||
|
if (ret < 0) {
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
/* set config value */
|
||
|
settings.attributes = SCMI_PINCTRL_CONFIG_ATTRIBUTES(0x0, 0x1, SCMI_PINCTRL_SELECTOR_PIN);
|
||
|
settings.id = (pin->pinmux.config_register - IOMUXC_CFGREG) / 4;
|
||
|
settings.config[0] = PIN_CONFIG_TYPE_CONFIG;
|
||
|
settings.config[1] = pin->pin_ctrl_flags & (~(1 << IOMUXC_INPUT_ENABLE_SHIFT));
|
||
|
|
||
|
ret = scmi_pinctrl_settings_configure(&settings);
|
||
|
if (ret < 0) {
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt, uintptr_t reg)
|
||
|
{
|
||
|
int ret;
|
||
|
/* configure all pins */
|
||
|
for (uint8_t i = 0U; i < pin_cnt; i++) {
|
||
|
ret = scmi_pinctrl_configure_pin(&pins[i]);
|
||
|
if (ret < 0) {
|
||
|
return ret;
|
||
|
}
|
||
|
}
|
||
|
return 0;
|
||
|
}
|