drivers: ns16550: use DEVICE_MMIO where needed
This gets a little complicated as the driver could be using PCI-E MMIO, MMIO specified by DTS, or I/O ports. This driver doesn't use struct uart_device_config any more. Signed-off-by: Andrew Boie <andrew.p.boie@intel.com>
This commit is contained in:
parent
c802cc8920
commit
d728bece0a
2 changed files with 39 additions and 20 deletions
|
@ -256,12 +256,18 @@ BUILD_ASSERT(IS_ENABLED(CONFIG_PCIE), "NS16550(s) in DT need CONFIG_PCIE");
|
||||||
|
|
||||||
/* device config */
|
/* device config */
|
||||||
struct uart_ns16550_device_config {
|
struct uart_ns16550_device_config {
|
||||||
struct uart_device_config devconf;
|
#ifndef UART_NS16550_ACCESS_IOPORT
|
||||||
|
DEVICE_MMIO_ROM;
|
||||||
|
#else
|
||||||
|
uint32_t port;
|
||||||
|
#endif
|
||||||
|
uint32_t sys_clk_freq;
|
||||||
|
#if defined(CONFIG_UART_INTERRUPT_DRIVEN) || defined(CONFIG_UART_ASYNC_API)
|
||||||
|
uart_irq_config_func_t irq_config_func;
|
||||||
|
#endif
|
||||||
#ifdef UART_NS16550_PCP_ENABLED
|
#ifdef UART_NS16550_PCP_ENABLED
|
||||||
uint32_t pcp;
|
uint32_t pcp;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef UART_NS16550_PCIE_ENABLED
|
#ifdef UART_NS16550_PCIE_ENABLED
|
||||||
bool pcie;
|
bool pcie;
|
||||||
pcie_bdf_t pcie_bdf;
|
pcie_bdf_t pcie_bdf;
|
||||||
|
@ -271,8 +277,8 @@ struct uart_ns16550_device_config {
|
||||||
|
|
||||||
/** Device data structure */
|
/** Device data structure */
|
||||||
struct uart_ns16550_dev_data_t {
|
struct uart_ns16550_dev_data_t {
|
||||||
#ifdef UART_NS16550_PCIE_ENABLED
|
#ifndef UART_NS16550_ACCESS_IOPORT
|
||||||
uint64_t pcimem;
|
DEVICE_MMIO_RAM;
|
||||||
#endif
|
#endif
|
||||||
struct uart_config uart_config;
|
struct uart_config uart_config;
|
||||||
struct k_spinlock lock;
|
struct k_spinlock lock;
|
||||||
|
@ -292,13 +298,11 @@ static const struct uart_driver_api uart_ns16550_driver_api;
|
||||||
|
|
||||||
static inline uintptr_t get_port(struct device *dev)
|
static inline uintptr_t get_port(struct device *dev)
|
||||||
{
|
{
|
||||||
#ifdef UART_NS16550_PCIE_ENABLED
|
#ifndef UART_NS16550_ACCESS_IOPORT
|
||||||
if (DEV_CFG(dev)->pcie) {
|
return DEVICE_MMIO_GET(dev);
|
||||||
return (uintptr_t) DEV_DATA(dev)->pcimem;
|
#else
|
||||||
}
|
return DEV_CFG(dev)->port;
|
||||||
#endif /* UART_NS16550_PCIE_ENABLED */
|
#endif
|
||||||
|
|
||||||
return DEV_CFG(dev)->devconf.port;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_baud_rate(struct device *dev, uint32_t baud_rate)
|
static void set_baud_rate(struct device *dev, uint32_t baud_rate)
|
||||||
|
@ -308,12 +312,12 @@ static void set_baud_rate(struct device *dev, uint32_t baud_rate)
|
||||||
uint32_t divisor; /* baud rate divisor */
|
uint32_t divisor; /* baud rate divisor */
|
||||||
uint8_t lcr_cache;
|
uint8_t lcr_cache;
|
||||||
|
|
||||||
if ((baud_rate != 0U) && (dev_cfg->devconf.sys_clk_freq != 0U)) {
|
if ((baud_rate != 0U) && (dev_cfg->sys_clk_freq != 0U)) {
|
||||||
/*
|
/*
|
||||||
* calculate baud rate divisor. a variant of
|
* calculate baud rate divisor. a variant of
|
||||||
* (uint32_t)(dev_cfg->sys_clk_freq / (16.0 * baud_rate) + 0.5)
|
* (uint32_t)(dev_cfg->sys_clk_freq / (16.0 * baud_rate) + 0.5)
|
||||||
*/
|
*/
|
||||||
divisor = ((dev_cfg->devconf.sys_clk_freq + (baud_rate << 3))
|
divisor = ((dev_cfg->sys_clk_freq + (baud_rate << 3))
|
||||||
/ baud_rate) >> 4;
|
/ baud_rate) >> 4;
|
||||||
|
|
||||||
/* set the DLAB to access the baud rate divisor registers */
|
/* set the DLAB to access the baud rate divisor registers */
|
||||||
|
@ -345,17 +349,28 @@ static int uart_ns16550_configure(struct device *dev,
|
||||||
ARG_UNUSED(dev_data);
|
ARG_UNUSED(dev_data);
|
||||||
ARG_UNUSED(dev_cfg);
|
ARG_UNUSED(dev_cfg);
|
||||||
|
|
||||||
|
#ifndef UART_NS16550_ACCESS_IOPORT
|
||||||
#ifdef UART_NS16550_PCIE_ENABLED
|
#ifdef UART_NS16550_PCIE_ENABLED
|
||||||
if (dev_cfg->pcie) {
|
if (dev_cfg->pcie) {
|
||||||
|
uintptr_t phys;
|
||||||
|
|
||||||
if (!pcie_probe(dev_cfg->pcie_bdf, dev_cfg->pcie_id)) {
|
if (!pcie_probe(dev_cfg->pcie_bdf, dev_cfg->pcie_id)) {
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
dev_data->pcimem = pcie_get_mbar(dev_cfg->pcie_bdf, 0);
|
phys = pcie_get_mbar(dev_cfg->pcie_bdf, 0);
|
||||||
pcie_set_cmd(dev_cfg->pcie_bdf, PCIE_CONF_CMDSTAT_MEM, true);
|
pcie_set_cmd(dev_cfg->pcie_bdf, PCIE_CONF_CMDSTAT_MEM, true);
|
||||||
|
|
||||||
|
device_map(DEVICE_MMIO_RAM_PTR(dev), phys, 0x1000,
|
||||||
|
K_MEM_CACHE_NONE);
|
||||||
|
} else
|
||||||
|
#endif /* UART_NS16550_PCIE_ENABLED */
|
||||||
|
{
|
||||||
|
/* Map directly from DTS */
|
||||||
|
DEVICE_MMIO_MAP(dev, K_MEM_CACHE_NONE);
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* UART_NS15660_ACCESS_IOPORT */
|
||||||
|
|
||||||
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
|
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
|
||||||
dev_data->iir_cache = 0U;
|
dev_data->iir_cache = 0U;
|
||||||
|
@ -492,7 +507,7 @@ static int uart_ns16550_init(struct device *dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
|
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
|
||||||
DEV_CFG(dev)->devconf.irq_config_func(dev);
|
DEV_CFG(dev)->irq_config_func(dev);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -14,11 +14,15 @@ static void irq_config_func_@NUM@(struct device *port);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static const struct uart_ns16550_device_config uart_ns16550_dev_cfg_@NUM@ = {
|
static const struct uart_ns16550_device_config uart_ns16550_dev_cfg_@NUM@ = {
|
||||||
.devconf.port = DT_INST_REG_ADDR(@NUM@),
|
#ifdef UART_NS16550_ACCESS_IOPORT
|
||||||
.devconf.sys_clk_freq = DT_INST_PROP(@NUM@, clock_frequency),
|
.port = DT_INST_REG_ADDR(@NUM@),
|
||||||
|
#elif !DT_INST_PROP(@NUM@, pcie)
|
||||||
|
DEVICE_MMIO_ROM_INIT(@NUM@),
|
||||||
|
#endif
|
||||||
|
.sys_clk_freq = DT_INST_PROP(@NUM@, clock_frequency),
|
||||||
|
|
||||||
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
|
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
|
||||||
.devconf.irq_config_func = irq_config_func_@NUM@,
|
.irq_config_func = irq_config_func_@NUM@,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if DT_INST_NODE_HAS_PROP(@NUM@, pcp)
|
#if DT_INST_NODE_HAS_PROP(@NUM@, pcp)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue