/*
 * 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!
 */

#if DT_NODE_HAS_STATUS(DT_DRV_INST(@NUM@), okay)

static void i2c_config_@NUM@(const 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_ON_BUS(@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_DT_INST_DEFINE(@NUM@, &i2c_dw_initialize, device_pm_control_nop,
		    &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@(const struct device *port)
{
	ARG_UNUSED(port);

#if DT_INST_ON_BUS(@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_alloc_irq(DT_INST_REG_ADDR(@NUM@));

	if (irq == PCIE_CONF_INTR_IRQ_NONE) {
		return;
	}

	irq_connect_dynamic(irq,
			    DT_INST_IRQ(@NUM@, priority),
			    (void (*)(const void *))i2c_dw_isr,
			    DEVICE_DT_INST_GET(@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_DT_INST_GET(@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_DT_INST_GET(@NUM@),
		    INST_@NUM@_IRQ_FLAGS);
	irq_enable(DT_INST_IRQN(@NUM@));

#endif
}

#endif /* DT_NODE_HAS_STATUS(DT_DRV_INST(@NUM@), okay) */

/* Include subsequent instances */
#if @NEXT_NUM@ < CONFIG_I2C_DW_MAX_INSTANCES
#include <i2c_dw_port_@NEXT_NUM@.h>
#endif
