diff --git a/drivers/serial/CMakeLists.txt b/drivers/serial/CMakeLists.txt index 33a7d56c793..4128acd0b42 100644 --- a/drivers/serial/CMakeLists.txt +++ b/drivers/serial/CMakeLists.txt @@ -17,7 +17,6 @@ zephyr_library_sources_if_kconfig(uart_miv.c) zephyr_library_sources_if_kconfig(uart_msp432p4xx.c) zephyr_library_sources_ifdef(CONFIG_NRF_UART_PERIPHERAL uart_nrfx_uart.c) zephyr_library_sources_ifdef(CONFIG_NRF_UARTE_PERIPHERAL uart_nrfx_uarte.c) -zephyr_library_sources_if_kconfig(uart_ns16550.c) zephyr_library_sources_if_kconfig(uart_nsim.c) zephyr_library_sources_if_kconfig(uart_qmsi.c) zephyr_library_sources_if_kconfig(uart_sam.c) @@ -32,6 +31,19 @@ zephyr_library_sources_if_kconfig(uart_rv32m1_lpuart.c) zephyr_library_sources_ifdef(CONFIG_USERSPACE uart_handlers.c) +if(CONFIG_UART_NS16550) + zephyr_library_sources(uart_ns16550.c) + foreach(NUM RANGE 0 3) + if (CONFIG_UART_NS16550_PORT_${NUM}) + configure_file( + uart_ns16550_port_x.h + ${PROJECT_BINARY_DIR}/include/generated/uart_ns16550_port_${NUM}.h + @ONLY + ) + endif() + endforeach(NUM) +endif() + if(CONFIG_UART_NATIVE_POSIX) zephyr_library_compile_definitions(NO_POSIX_CHEATS) zephyr_library_sources(uart_native_posix.c) diff --git a/drivers/serial/uart_ns16550.c b/drivers/serial/uart_ns16550.c index 42ab33f9935..fd52eaf3aa0 100644 --- a/drivers/serial/uart_ns16550.c +++ b/drivers/serial/uart_ns16550.c @@ -777,257 +777,17 @@ static const struct uart_driver_api uart_ns16550_driver_api = { }; #ifdef CONFIG_UART_NS16550_PORT_0 - -#ifdef CONFIG_UART_INTERRUPT_DRIVEN -static void irq_config_func_0(struct device *port); +#include #endif -static const struct uart_ns16550_device_config uart_ns16550_dev_cfg_0 = { - .sys_clk_freq = DT_UART_NS16550_PORT_0_CLK_FREQ, - -#ifdef CONFIG_UART_INTERRUPT_DRIVEN - .irq_config_func = irq_config_func_0, -#endif - -#ifdef DT_UART_NS16550_PORT_0_PCP - .pcp = DT_UART_NS16550_PORT_0_PCP, -#endif - -#if DT_UART_NS16550_PORT_0_PCIE - .pcie = true, - .pcie_bdf = DT_UART_NS16550_PORT_0_BASE_ADDR, - .pcie_id = DT_UART_NS16550_PORT_0_SIZE, -#endif -}; - -static struct uart_ns16550_dev_data_t uart_ns16550_dev_data_0 = { - .port = DT_UART_NS16550_PORT_0_BASE_ADDR, - .baud_rate = DT_UART_NS16550_PORT_0_BAUD_RATE, - .options = CONFIG_UART_NS16550_PORT_0_OPTIONS, - -#ifdef DT_UART_NS16550_PORT_0_DLF - .dlf = DT_UART_NS16550_PORT_0_DLF, -#endif -}; - -DEVICE_AND_API_INIT(uart_ns16550_0, DT_UART_NS16550_PORT_0_NAME, &uart_ns16550_init, - &uart_ns16550_dev_data_0, &uart_ns16550_dev_cfg_0, - PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_DEVICE, - &uart_ns16550_driver_api); - -#ifdef CONFIG_UART_INTERRUPT_DRIVEN -static void irq_config_func_0(struct device *dev) -{ - ARG_UNUSED(dev); - - IRQ_CONNECT(DT_UART_NS16550_PORT_0_IRQ, - DT_UART_NS16550_PORT_0_IRQ_PRI, - uart_ns16550_isr, DEVICE_GET(uart_ns16550_0), - DT_UART_NS16550_PORT_0_IRQ_FLAGS); - -#ifdef UART_NS16550_PCIE_ENABLED - if (DEV_CFG(dev)->pcie) { - pcie_irq_enable(DT_UART_NS16550_PORT_0_BASE_ADDR, - DT_UART_NS16550_PORT_0_IRQ); - } else { - irq_enable(DT_UART_NS16550_PORT_0_IRQ); - } -#else - irq_enable(DT_UART_NS16550_PORT_0_IRQ); -#endif -} -#endif - -#endif /* CONFIG_UART_NS16550_PORT_0 */ - #ifdef CONFIG_UART_NS16550_PORT_1 - -#ifdef CONFIG_UART_INTERRUPT_DRIVEN -static void irq_config_func_1(struct device *port); +#include #endif -static const struct uart_ns16550_device_config uart_ns16550_dev_cfg_1 = { - .sys_clk_freq = DT_UART_NS16550_PORT_1_CLK_FREQ, - -#ifdef CONFIG_UART_INTERRUPT_DRIVEN - .irq_config_func = irq_config_func_1, -#endif - -#ifdef DT_UART_NS16550_PORT_1_PCP - .pcp = DT_UART_NS16550_PORT_1_PCP, -#endif - -#if DT_UART_NS16550_PORT_1_PCIE - .pcie = true, - .pcie_bdf = DT_UART_NS16550_PORT_1_BASE_ADDR, - .pcie_id = DT_UART_NS16550_PORT_1_SIZE, -#endif -}; - -static struct uart_ns16550_dev_data_t uart_ns16550_dev_data_1 = { - .port = DT_UART_NS16550_PORT_1_BASE_ADDR, - .baud_rate = DT_UART_NS16550_PORT_1_BAUD_RATE, - .options = CONFIG_UART_NS16550_PORT_1_OPTIONS, - -#ifdef DT_UART_NS16550_PORT_1_DLF - .dlf = DT_UART_NS16550_PORT_1_DLF, -#endif -}; - -DEVICE_AND_API_INIT(uart_ns16550_1, DT_UART_NS16550_PORT_1_NAME, &uart_ns16550_init, - &uart_ns16550_dev_data_1, &uart_ns16550_dev_cfg_1, - PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_DEVICE, - &uart_ns16550_driver_api); - -#ifdef CONFIG_UART_INTERRUPT_DRIVEN -static void irq_config_func_1(struct device *dev) -{ - ARG_UNUSED(dev); - - IRQ_CONNECT(DT_UART_NS16550_PORT_1_IRQ, - DT_UART_NS16550_PORT_1_IRQ_PRI, - uart_ns16550_isr, DEVICE_GET(uart_ns16550_1), - DT_UART_NS16550_PORT_1_IRQ_FLAGS); - -#ifdef UART_NS16550_PCIE_ENABLED - if (DEV_CFG(dev)->pcie) { - pcie_irq_enable(DT_UART_NS16550_PORT_1_BASE_ADDR, - DT_UART_NS16550_PORT_1_IRQ); - } else { - irq_enable(DT_UART_NS16550_PORT_1_IRQ); - } -#else - irq_enable(DT_UART_NS16550_PORT_1_IRQ); -#endif -} -#endif - -#endif /* CONFIG_UART_NS16550_PORT_1 */ - #ifdef CONFIG_UART_NS16550_PORT_2 - -#ifdef CONFIG_UART_INTERRUPT_DRIVEN -static void irq_config_func_2(struct device *port); +#include #endif -static const struct uart_ns16550_device_config uart_ns16550_dev_cfg_2 = { - .sys_clk_freq = DT_UART_NS16550_PORT_2_CLK_FREQ, - -#ifdef CONFIG_UART_INTERRUPT_DRIVEN - .irq_config_func = irq_config_func_2, -#endif - -#ifdef DT_UART_NS16550_PORT_2_PCP - .pcp = DT_UART_NS16550_PORT_2_PCP, -#endif - -#if DT_UART_NS16550_PORT_2_PCIE - .pcie = true, - .pcie_bdf = DT_UART_NS16550_PORT_2_BASE_ADDR, - .pcie_id = DT_UART_NS16550_PORT_2_SIZE, -#endif -}; - -static struct uart_ns16550_dev_data_t uart_ns16550_dev_data_2 = { - .port = DT_UART_NS16550_PORT_2_BASE_ADDR, - .baud_rate = DT_UART_NS16550_PORT_2_BAUD_RATE, - .options = CONFIG_UART_NS16550_PORT_2_OPTIONS, - -#ifdef DT_UART_NS16550_PORT_2_DLF - .dlf = DT_UART_NS16550_PORT_2_DLF, -#endif -}; - -DEVICE_AND_API_INIT(uart_ns16550_2, DT_UART_NS16550_PORT_2_NAME, &uart_ns16550_init, - &uart_ns16550_dev_data_2, &uart_ns16550_dev_cfg_2, - PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_DEVICE, - &uart_ns16550_driver_api); - -#ifdef CONFIG_UART_INTERRUPT_DRIVEN -static void irq_config_func_2(struct device *dev) -{ - ARG_UNUSED(dev); - - IRQ_CONNECT(DT_UART_NS16550_PORT_2_IRQ, - DT_UART_NS16550_PORT_2_IRQ_PRI, - uart_ns16550_isr, DEVICE_GET(uart_ns16550_2), - DT_UART_NS16550_PORT_2_IRQ_FLAGS); - -#ifdef UART_NS16550_PCIE_ENABLED - if (DEV_CFG(dev)->pcie) { - pcie_irq_enable(DT_UART_NS16550_PORT_2_BASE_ADDR, - DT_UART_NS16550_PORT_2_IRQ); - } else { - irq_enable(DT_UART_NS16550_PORT_2_IRQ); - } -#else - irq_enable(DT_UART_NS16550_PORT_2_IRQ); -#endif -} -#endif - -#endif /* CONFIG_UART_NS16550_PORT_2 */ - #ifdef CONFIG_UART_NS16550_PORT_3 - -#ifdef CONFIG_UART_INTERRUPT_DRIVEN -static void irq_config_func_3(struct device *port); +#include #endif - -static const struct uart_ns16550_device_config uart_ns16550_dev_cfg_3 = { - .sys_clk_freq = DT_UART_NS16550_PORT_3_CLK_FREQ, - -#ifdef CONFIG_UART_INTERRUPT_DRIVEN - .irq_config_func = irq_config_func_3, -#endif - -#ifdef DT_UART_NS16550_PORT_3_PCP - .pcp = DT_UART_NS16550_PORT_3_PCP, -#endif - -#if DT_UART_NS16550_PORT_3_PCIE - .pcie = true, - .pcie_bdf = DT_UART_NS16550_PORT_3_BASE_ADDR, - .pcie_id = DT_UART_NS16550_PORT_3_SIZE, -#endif -}; - -static struct uart_ns16550_dev_data_t uart_ns16550_dev_data_3 = { - .port = DT_UART_NS16550_PORT_3_BASE_ADDR, - .baud_rate = DT_UART_NS16550_PORT_3_BAUD_RATE, - .options = CONFIG_UART_NS16550_PORT_3_OPTIONS, - -#ifdef DT_UART_NS16550_PORT_3_DLF - .dlf = DT_UART_NS16550_PORT_3_DLF, -#endif -}; - -DEVICE_AND_API_INIT(uart_ns16550_3, DT_UART_NS16550_PORT_3_NAME, &uart_ns16550_init, - &uart_ns16550_dev_data_3, &uart_ns16550_dev_cfg_3, - PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_DEVICE, - &uart_ns16550_driver_api); - -#ifdef CONFIG_UART_INTERRUPT_DRIVEN -static void irq_config_func_3(struct device *dev) -{ - ARG_UNUSED(dev); - - IRQ_CONNECT(DT_UART_NS16550_PORT_3_IRQ, - DT_UART_NS16550_PORT_3_IRQ_PRI, - uart_ns16550_isr, DEVICE_GET(uart_ns16550_3), - DT_UART_NS16550_PORT_3_IRQ_FLAGS); - -#ifdef UART_NS16550_PCIE_ENABLED - if (DEV_CFG(dev)->pcie) { - pcie_irq_enable(DT_UART_NS16550_PORT_3_BASE_ADDR, - DT_UART_NS16550_PORT_3_IRQ); - } else { - irq_enable(DT_UART_NS16550_PORT_3_IRQ); - } -#else - irq_enable(DT_UART_NS16550_PORT_3_IRQ); -#endif -} -#endif - -#endif /* CONFIG_UART_NS16550_PORT_3 */ diff --git a/drivers/serial/uart_ns16550_port_x.h b/drivers/serial/uart_ns16550_port_x.h new file mode 100644 index 00000000000..7a3311feb3d --- /dev/null +++ b/drivers/serial/uart_ns16550_port_x.h @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2010, 2012-2015 Wind River Systems, Inc. + * Copyright (c) 2019 Intel Corp. + * + * SPDX-License-Identifier: Apache-2.0 + * + * This file is a template for cmake and is not meant to be used directly! + */ + +#ifdef CONFIG_UART_INTERRUPT_DRIVEN +static void irq_config_func_@NUM@(struct device *port); +#endif + +static const struct uart_ns16550_device_config uart_ns16550_dev_cfg_@NUM@ = { + .sys_clk_freq = DT_UART_NS16550_PORT_@NUM@_CLK_FREQ, + +#ifdef CONFIG_UART_INTERRUPT_DRIVEN + .irq_config_func = irq_config_func_@NUM@, +#endif + +#ifdef DT_UART_NS16550_PORT_@NUM@_PCP + .pcp = DT_UART_NS16550_PORT_@NUM@_PCP, +#endif + +#if DT_UART_NS16550_PORT_@NUM@_PCIE + .pcie = true, + .pcie_bdf = DT_UART_NS16550_PORT_@NUM@_BASE_ADDR, + .pcie_id = DT_UART_NS16550_PORT_@NUM@_SIZE, +#endif +}; + +static struct uart_ns16550_dev_data_t uart_ns16550_dev_data_@NUM@ = { + .port = DT_UART_NS16550_PORT_@NUM@_BASE_ADDR, + .baud_rate = DT_UART_NS16550_PORT_@NUM@_BAUD_RATE, + .options = CONFIG_UART_NS16550_PORT_@NUM@_OPTIONS, + +#ifdef DT_UART_NS16550_PORT_@NUM@_DLF + .dlf = DT_UART_NS16550_PORT_@NUM@_DLF, +#endif +}; + +DEVICE_AND_API_INIT(uart_ns16550_@NUM@, DT_UART_NS16550_PORT_@NUM@_NAME, + &uart_ns16550_init, + &uart_ns16550_dev_data_@NUM@, &uart_ns16550_dev_cfg_@NUM@, + PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_DEVICE, + &uart_ns16550_driver_api); + +#ifdef CONFIG_UART_INTERRUPT_DRIVEN +static void irq_config_func_@NUM@(struct device *dev) +{ + ARG_UNUSED(dev); + + IRQ_CONNECT(DT_UART_NS16550_PORT_@NUM@_IRQ, + DT_UART_NS16550_PORT_@NUM@_IRQ_PRI, + uart_ns16550_isr, DEVICE_GET(uart_ns16550_@NUM@), + DT_UART_NS16550_PORT_@NUM@_IRQ_FLAGS); + +#ifdef UART_NS16550_PCIE_ENABLED + if (DEV_CFG(dev)->pcie) { + pcie_irq_enable(DT_UART_NS16550_PORT_@NUM@_BASE_ADDR, + DT_UART_NS16550_PORT_@NUM@_IRQ); + } else { + irq_enable(DT_UART_NS16550_PORT_@NUM@_IRQ); + } +#else + irq_enable(DT_UART_NS16550_PORT_@NUM@_IRQ); +#endif +} +#endif