mirror of
https://github.com/zephyrproject-rtos/zephyr
synced 2025-08-09 10:05:21 +00:00
There is nothing wrong with instance numbers and they are recommended for use whenever possible, but this is an API design problem because it's not always possible to get nodes by instance number; in some cases, drivers need to get node identifiers from node labels, for example. Change these APIs (which are not yet in any Zephyr release) to take node IDs instead of instance IDs. Fixes: #26984 Signed-off-by: Andrew Boie <andrew.p.boie@intel.com>
86 lines
2.0 KiB
C
86 lines
2.0 KiB
C
/*
|
|
* Copyright (c) 2019 Intel Corporation
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*
|
|
* This file is a template for cmake and is not meant to be used directly!
|
|
*/
|
|
|
|
static void i2c_config_@NUM@(struct device *port);
|
|
|
|
static const struct i2c_dw_rom_config i2c_config_dw_@NUM@ = {
|
|
DEVICE_MMIO_ROM_INIT(DT_DRV_INST(@NUM@)),
|
|
.config_func = i2c_config_@NUM@,
|
|
.bitrate = DT_INST_PROP(@NUM@, clock_frequency),
|
|
|
|
#if DT_INST_PROP(@NUM@, pcie)
|
|
.pcie = true,
|
|
.pcie_bdf = DT_INST_REG_ADDR(@NUM@),
|
|
.pcie_id = DT_INST_REG_SIZE(@NUM@),
|
|
#endif
|
|
};
|
|
|
|
static struct i2c_dw_dev_config i2c_@NUM@_runtime;
|
|
|
|
DEVICE_AND_API_INIT(i2c_@NUM@, DT_INST_LABEL(@NUM@),
|
|
&i2c_dw_initialize,
|
|
&i2c_@NUM@_runtime, &i2c_config_dw_@NUM@,
|
|
POST_KERNEL, CONFIG_I2C_INIT_PRIORITY,
|
|
&funcs);
|
|
|
|
#if DT_INST_IRQ_HAS_CELL(@NUM@, sense)
|
|
#define INST_@NUM@_IRQ_FLAGS DT_INST_IRQ(@NUM@, sense)
|
|
#else
|
|
#define INST_@NUM@_IRQ_FLAGS 0
|
|
#endif
|
|
static void i2c_config_@NUM@(struct device *port)
|
|
{
|
|
ARG_UNUSED(port);
|
|
|
|
#if DT_INST_PROP(@NUM@, pcie)
|
|
#if DT_INST_IRQN(@NUM@) == PCIE_IRQ_DETECT
|
|
|
|
/* PCI(e) with auto IRQ detection */
|
|
|
|
BUILD_ASSERT(IS_ENABLED(CONFIG_DYNAMIC_INTERRUPTS),
|
|
"DW I2C PCI auto-IRQ needs CONFIG_DYNAMIC_INTERRUPTS");
|
|
|
|
unsigned int irq;
|
|
|
|
irq = pcie_wired_irq(DT_INST_REG_ADDR(@NUM@));
|
|
|
|
if (irq == PCIE_CONF_INTR_IRQ_NONE) {
|
|
return;
|
|
}
|
|
|
|
irq_connect_dynamic(irq,
|
|
DT_INST_IRQ(@NUM@, priority),
|
|
i2c_dw_isr, DEVICE_GET(i2c_@NUM@),
|
|
INST_@NUM@_IRQ_FLAGS);
|
|
pcie_irq_enable(DT_INST_REG_ADDR(@NUM@), irq);
|
|
|
|
#else
|
|
|
|
/* PCI(e) with fixed or MSI IRQ */
|
|
|
|
IRQ_CONNECT(DT_INST_IRQN(@NUM@),
|
|
DT_INST_IRQ(@NUM@, priority),
|
|
i2c_dw_isr, DEVICE_GET(i2c_@NUM@),
|
|
INST_@NUM@_IRQ_FLAGS);
|
|
pcie_irq_enable(DT_INST_REG_ADDR(@NUM@),
|
|
DT_INST_IRQN(@NUM@));
|
|
|
|
#endif
|
|
#else
|
|
|
|
/* not PCI(e) */
|
|
|
|
IRQ_CONNECT(DT_INST_IRQN(@NUM@),
|
|
DT_INST_IRQ(@NUM@, priority),
|
|
i2c_dw_isr, DEVICE_GET(i2c_@NUM@),
|
|
INST_@NUM@_IRQ_FLAGS);
|
|
irq_enable(DT_INST_IRQN(@NUM@));
|
|
|
|
#endif
|
|
}
|