blob: cb59ce050730ff61886fe57698a33a2ddd5170e0 [file] [log] [blame]
/*
* Copyright (c) 2021 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/device.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/drivers/pinctrl.h>
/* make sure devices and remap hook are initialized in the correct order */
BUILD_ASSERT((CONFIG_GPIO_INIT_PRIORITY < CONFIG_REMAP_INIT_PRIORITY) &&
(CONFIG_REMAP_INIT_PRIORITY < CONFIG_SERIAL_INIT_PRIORITY),
"Device driver priorities are not set correctly");
PINCTRL_DT_DEV_CONFIG_DECLARE(DT_NODELABEL(uart0));
/* UART0 alternative configurations (default and sleep states) */
PINCTRL_DT_STATE_PINS_DEFINE(DT_PATH(zephyr_user), uart0_alt_default);
#ifdef CONFIG_PM_DEVICE
PINCTRL_DT_STATE_PINS_DEFINE(DT_PATH(zephyr_user), uart0_alt_sleep);
#endif
static const struct pinctrl_state uart0_alt[] = {
PINCTRL_DT_STATE_INIT(uart0_alt_default, PINCTRL_STATE_DEFAULT),
#ifdef CONFIG_PM_DEVICE
PINCTRL_DT_STATE_INIT(uart0_alt_sleep, PINCTRL_STATE_SLEEP),
#endif
};
static int remap_pins(const struct device *dev)
{
int ret;
const struct gpio_dt_spec button = GPIO_DT_SPEC_GET_OR(DT_ALIAS(sw0),
gpios, {0});
ARG_UNUSED(dev);
if (!device_is_ready(button.port)) {
return -ENODEV;
}
ret = gpio_pin_configure_dt(&button, GPIO_INPUT);
if (ret < 0) {
return ret;
}
/* remap UART0 pins if button is pressed */
if (gpio_pin_get_dt(&button)) {
struct pinctrl_dev_config *uart0_config =
PINCTRL_DT_DEV_CONFIG_GET(DT_NODELABEL(uart0));
return pinctrl_update_states(uart0_config, uart0_alt,
ARRAY_SIZE(uart0_alt));
}
return 0;
}
SYS_INIT(remap_pins, PRE_KERNEL_1, CONFIG_REMAP_INIT_PRIORITY);