Linux Audio

Check our new training course

Embedded Linux Audio

Check our new training course
with Creative Commons CC-BY-SA
lecture materials

Bootlin logo

Elixir Cross Referencer

Loading...
/*
 * 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@(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_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@(const 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),
			    (void (*)(const void *))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
}