drivers: uart_ns16550: Convert to use runtime PCIe BDF lookup
Convert the ns16550 driver to use the new centralized runtime BDF lookup of PCIe devices. Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
This commit is contained in:
parent
0eed096f99
commit
fcfff0633e
4 changed files with 68 additions and 57 deletions
|
@ -237,9 +237,7 @@ struct uart_ns16550_device_config {
|
|||
#endif
|
||||
uint8_t reg_interval;
|
||||
#if DT_ANY_INST_ON_BUS_STATUS_OKAY(pcie)
|
||||
bool pcie;
|
||||
pcie_bdf_t pcie_bdf;
|
||||
pcie_id_t pcie_id;
|
||||
struct pcie_dev *pcie;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
@ -335,13 +333,13 @@ static int uart_ns16550_configure(const struct device *dev,
|
|||
if (dev_cfg->pcie) {
|
||||
struct pcie_bar mbar;
|
||||
|
||||
if (!pcie_probe(dev_cfg->pcie_bdf, dev_cfg->pcie_id)) {
|
||||
if (dev_cfg->pcie->bdf == PCIE_BDF_NONE) {
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
pcie_probe_mbar(dev_cfg->pcie_bdf, 0, &mbar);
|
||||
pcie_set_cmd(dev_cfg->pcie_bdf, PCIE_CONF_CMDSTAT_MEM, true);
|
||||
pcie_probe_mbar(dev_cfg->pcie->bdf, 0, &mbar);
|
||||
pcie_set_cmd(dev_cfg->pcie->bdf, PCIE_CONF_CMDSTAT_MEM, true);
|
||||
|
||||
device_map(DEVICE_MMIO_RAM_PTR(dev), mbar.phys_addr, mbar.size,
|
||||
K_MEM_CACHE_NONE);
|
||||
|
@ -1061,21 +1059,21 @@ static const struct uart_driver_api uart_ns16550_driver_api = {
|
|||
#define UART_NS16550_IRQ_CONFIG_PCIE1(n) \
|
||||
static void irq_config_func##n(const struct device *dev) \
|
||||
{ \
|
||||
ARG_UNUSED(dev); \
|
||||
BUILD_ASSERT(DT_INST_IRQN(n) == PCIE_IRQ_DETECT, \
|
||||
"Only runtime IRQ configuration is supported"); \
|
||||
BUILD_ASSERT(IS_ENABLED(CONFIG_DYNAMIC_INTERRUPTS), \
|
||||
"NS16550 PCIe requires dynamic interrupts"); \
|
||||
unsigned int irq = pcie_alloc_irq(DT_INST_REG_ADDR(n)); \
|
||||
const struct uart_ns16550_device_config *dev_cfg = dev->config;\
|
||||
unsigned int irq = pcie_alloc_irq(dev_cfg->pcie->bdf); \
|
||||
if (irq == PCIE_CONF_INTR_IRQ_NONE) { \
|
||||
return; \
|
||||
} \
|
||||
pcie_connect_dynamic_irq(DT_INST_REG_ADDR(n), irq, \
|
||||
pcie_connect_dynamic_irq(dev_cfg->pcie->bdf, irq, \
|
||||
DT_INST_IRQ(n, priority), \
|
||||
(void (*)(const void *))uart_ns16550_isr, \
|
||||
DEVICE_DT_INST_GET(n), \
|
||||
UART_NS16550_IRQ_FLAGS(n)); \
|
||||
pcie_irq_enable(DT_INST_REG_ADDR(n), irq); \
|
||||
pcie_irq_enable(dev_cfg->pcie->bdf, irq); \
|
||||
}
|
||||
|
||||
#ifdef CONFIG_UART_NS16550_ACCESS_IOPORT
|
||||
|
@ -1109,13 +1107,15 @@ static const struct uart_driver_api uart_ns16550_driver_api = {
|
|||
#endif
|
||||
|
||||
#define DEV_CONFIG_PCIE0(n)
|
||||
#define DEV_CONFIG_PCIE1(n) \
|
||||
.pcie = true, \
|
||||
.pcie_bdf = DT_INST_REG_ADDR(n), \
|
||||
.pcie_id = DT_INST_REG_SIZE(n),
|
||||
#define DEV_CONFIG_PCIE1(n) DEVICE_PCIE_INST_INIT(n, pcie)
|
||||
#define DEV_CONFIG_PCIE_INIT(n) \
|
||||
_CONCAT(DEV_CONFIG_PCIE, DT_INST_ON_BUS(n, pcie))(n)
|
||||
|
||||
#define DEV_DECLARE_PCIE0(n)
|
||||
#define DEV_DECLARE_PCIE1(n) DEVICE_PCIE_INST_DECLARE(n)
|
||||
#define DEV_PCIE_DECLARE(n) \
|
||||
_CONCAT(DEV_DECLARE_PCIE, DT_INST_ON_BUS(n, pcie))(n)
|
||||
|
||||
#define DEV_DATA_FLOW_CTRL0 UART_CFG_FLOW_CTRL_NONE
|
||||
#define DEV_DATA_FLOW_CTRL1 UART_CFG_FLOW_CTRL_RTS_CTS
|
||||
#define DEV_DATA_FLOW_CTRL(n) \
|
||||
|
@ -1129,6 +1129,7 @@ static const struct uart_driver_api uart_ns16550_driver_api = {
|
|||
|
||||
#define UART_NS16550_DEVICE_INIT(n) \
|
||||
UART_NS16550_IRQ_FUNC_DECLARE(n); \
|
||||
DEV_PCIE_DECLARE(n); \
|
||||
static const struct uart_ns16550_device_config uart_ns16550_dev_cfg_##n = { \
|
||||
DEV_CONFIG_REG_INIT(n) \
|
||||
COND_CODE_1(DT_INST_NODE_HAS_PROP(n, clock_frequency), ( \
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue