Skip to content
Permalink
Browse files

drivers/uart_ns16550: move UART configuration boilerplate to template

The per-UART configuration is boilerplate that is becoming a maintenance
nightmare as it grows. A template file is created, and instances are
created as needed by cmake at build time.

Signed-off-by: Charles E. Youse <charles.youse@intel.com>
  • Loading branch information...
Charles E. Youse authored and nashif committed May 1, 2019
1 parent f16f7fc commit f2af5fe731b5d9c7cfc8b421ac47f8d01f56f4ad
Showing with 86 additions and 245 deletions.
  1. +13 −1 drivers/serial/CMakeLists.txt
  2. +4 −244 drivers/serial/uart_ns16550.c
  3. +69 −0 drivers/serial/uart_ns16550_port_x.h
@@ -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)
@@ -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);
#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,
#include <uart_ns16550_port_0.h>
#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);
#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,
#include <uart_ns16550_port_1.h>
#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);
#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,
#include <uart_ns16550_port_2.h>
#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);
#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,
#include <uart_ns16550_port_3.h>
#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 */
@@ -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

0 comments on commit f2af5fe

Please sign in to comment.
You can’t perform that action at this time.