/* dw_i2c.c - I2C file for Design Ware */

/*
 * Copyright (c) 2015 Intel Corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */
#include <stddef.h>
#include <zephyr/types.h>
#include <stdlib.h>
#include <stdbool.h>

#include <i2c.h>
#include <kernel.h>
#include <init.h>
#include <arch/cpu.h>
#include <string.h>

#include <soc.h>
#include <errno.h>
#include <sys_io.h>

#include <misc/util.h>

#ifdef CONFIG_SHARED_IRQ
#include <shared_irq.h>
#endif

#ifdef CONFIG_IOAPIC
#include <drivers/ioapic.h>
#endif

#include "i2c_dw.h"
#include "i2c_dw_registers.h"
#define LOG_LEVEL CONFIG_I2C_LOG_LEVEL
#include <logging/log.h>
LOG_MODULE_REGISTER(i2c_dw);

#include "i2c-priv.h"

static inline void _i2c_dw_data_ask(struct device *dev)
{
	struct i2c_dw_dev_config * const dw = dev->driver_data;
	u32_t data;
	u8_t tx_empty;
	s8_t rx_empty;
	u8_t cnt;

	volatile struct i2c_dw_registers * const regs =
		(struct i2c_dw_registers *)dw->base_address;

	/* No more bytes to request, so command queue is no longer needed */
	if (dw->request_bytes == 0) {
		regs->ic_intr_mask.bits.tx_empty = 0U;
		return;
	}

	/* How many bytes we can actually ask */
	rx_empty = (I2C_DW_FIFO_DEPTH - regs->ic_rxflr) - dw->rx_pending;

	if (rx_empty < 0) {
		/* RX FIFO expected to be full.
		 * So don't request any bytes, yet.
		 */
		return;
	}

	/* How many empty slots in TX FIFO (as command queue) */
	tx_empty = I2C_DW_FIFO_DEPTH - regs->ic_txflr;

	/* Figure out how many bytes we can request */
	cnt = MIN(I2C_DW_FIFO_DEPTH, dw->request_bytes);
	cnt = MIN(MIN(tx_empty, rx_empty), cnt);

	while (cnt > 0) {
		/* Tell controller to get another byte */
		data = IC_DATA_CMD_CMD;

		/* Send RESTART if needed */
		if (dw->xfr_flags & I2C_MSG_RESTART) {
			data |= IC_DATA_CMD_RESTART;
			dw->xfr_flags &= ~(I2C_MSG_RESTART);
		}

		/* After receiving the last byte, send STOP if needed */
		if ((dw->xfr_flags & I2C_MSG_STOP)
		    && (dw->request_bytes == 1)) {
			data |= IC_DATA_CMD_STOP;
		}

		regs->ic_data_cmd.raw = data;

		dw->rx_pending++;
		dw->request_bytes--;
		cnt--;
	}
}

static void _i2c_dw_data_read(struct device *dev)
{
	struct i2c_dw_dev_config * const dw = dev->driver_data;

	volatile struct i2c_dw_registers * const regs =
		(struct i2c_dw_registers *)dw->base_address;

	while (regs->ic_status.bits.rfne && (dw->xfr_len > 0)) {
		dw->xfr_buf[0] = regs->ic_data_cmd.raw;

		dw->xfr_buf++;
		dw->xfr_len--;
		dw->rx_pending--;

		if (dw->xfr_len == 0) {
			break;
		}
	}

	/* Nothing to receive anymore */
	if (dw->xfr_len == 0) {
		dw->state &= ~I2C_DW_CMD_RECV;
		return;
	}
}


static int _i2c_dw_data_send(struct device *dev)
{
	struct i2c_dw_dev_config * const dw = dev->driver_data;
	u32_t data = 0U;

	volatile struct i2c_dw_registers * const regs =
		(struct i2c_dw_registers *)dw->base_address;

	/* Nothing to send anymore, mask the interrupt */
	if (dw->xfr_len == 0) {
		regs->ic_intr_mask.bits.tx_empty = 0U;

		dw->state &= ~I2C_DW_CMD_SEND;

		return 0;
	}

	while (regs->ic_status.bits.tfnf && (dw->xfr_len > 0)) {
		/* We have something to transmit to a specific host */
		data = dw->xfr_buf[0];

		/* Send RESTART if needed */
		if (dw->xfr_flags & I2C_MSG_RESTART) {
			data |= IC_DATA_CMD_RESTART;
			dw->xfr_flags &= ~(I2C_MSG_RESTART);
		}

		/* Send STOP if needed */
		if ((dw->xfr_len == 1) && (dw->xfr_flags & I2C_MSG_STOP)) {
			data |= IC_DATA_CMD_STOP;
		}

		regs->ic_data_cmd.raw = data;

		dw->xfr_len--;
		dw->xfr_buf++;

		if (regs->ic_intr_stat.bits.tx_abrt) {
			return -EIO;
		}
	}

	return 0;
}

static inline void _i2c_dw_transfer_complete(struct device *dev)
{
	struct i2c_dw_dev_config * const dw = dev->driver_data;
	u32_t value;

	volatile struct i2c_dw_registers * const regs =
		(struct i2c_dw_registers *)dw->base_address;

	regs->ic_intr_mask.raw = DW_DISABLE_ALL_I2C_INT;
	value = regs->ic_clr_intr;

	k_sem_give(&dw->device_sync_sem);
}

static void i2c_dw_isr(void *arg)
{
	struct device *port = (struct device *)arg;
	struct i2c_dw_dev_config * const dw = port->driver_data;
	union ic_interrupt_register intr_stat;
	u32_t value;
	int ret = 0;

	volatile struct i2c_dw_registers * const regs =
		(struct i2c_dw_registers *)dw->base_address;

	/* Cache ic_intr_stat for processing, so there is no need to read
	 * the register multiple times.
	 */
	intr_stat.raw = regs->ic_intr_stat.raw;

#if CONFIG_SHARED_IRQ
	/* If using with shared IRQ, this function will be called
	 * by the shared IRQ driver. So check here if the interrupt
	 * is coming from the I2C controller (or somewhere else).
	 */
	if (!intr_stat.raw) {
		return;
	}
#endif

	/*
	 * Causes of an interrupt:
	 *   - STOP condition is detected
	 *   - Transfer is aborted
	 *   - Transmit FIFO is empty
	 *   - Transmit FIFO has overflowed
	 *   - Receive FIFO is full
	 *   - Receive FIFO has overflowed
	 *   - Received FIFO has underrun
	 *   - Transmit data is required (tx_req)
	 *   - Receive data is available (rx_avail)
	 */

	LOG_DBG("I2C: interrupt received");

	/* Check if we are configured as a master device */
	if (regs->ic_con.bits.master_mode) {
		/* Bail early if there is any error. */
		if ((DW_INTR_STAT_TX_ABRT | DW_INTR_STAT_TX_OVER |
		     DW_INTR_STAT_RX_OVER | DW_INTR_STAT_RX_UNDER) &
		    intr_stat.raw) {
			dw->state = I2C_DW_CMD_ERROR;
			goto done;
		}

		/* Check if the RX FIFO reached threshold */
		if (intr_stat.bits.rx_full) {
			_i2c_dw_data_read(port);
		}

		/* Check if the TX FIFO is ready for commands.
		 * TX FIFO also serves as command queue where read requests
		 * are written to TX FIFO.
		 */
		if (intr_stat.bits.tx_empty) {
			if ((dw->xfr_flags & I2C_MSG_RW_MASK)
			    == I2C_MSG_WRITE) {
				ret = _i2c_dw_data_send(port);
			} else {
				_i2c_dw_data_ask(port);
			}

			/* If STOP is not expected, finish processing this
			 * message if there is nothing left to do anymore.
			 */
			if (((dw->xfr_len == 0)
			     && !(dw->xfr_flags & I2C_MSG_STOP))
			    || (ret != 0)) {
				goto done;
			}
		}
	}

	/* STOP detected: finish processing this message */
	if (intr_stat.bits.stop_det) {
		value = regs->ic_clr_stop_det;
		goto done;
	}

	return;

done:
	_i2c_dw_transfer_complete(port);
}


static int _i2c_dw_setup(struct device *dev, u16_t slave_address)
{
	struct i2c_dw_dev_config * const dw = dev->driver_data;
	u32_t value;
	union ic_con_register ic_con;
	volatile struct i2c_dw_registers * const regs =
		(struct i2c_dw_registers *)dw->base_address;

	ic_con.raw = 0U;

	/* Disable the device controller to be able set TAR */
	regs->ic_enable.bits.enable = 0U;

	/* Disable interrupts */
	regs->ic_intr_mask.raw = 0U;

	/* Clear interrupts */
	value = regs->ic_clr_intr;

	/* Set master or slave mode - (initialization = slave) */
	if (I2C_MODE_MASTER & dw->app_config) {
		/*
		 * Make sure to set both the master_mode and slave_disable_bit
		 * to both 0 or both 1
		 */
		LOG_DBG("I2C: host configured as Master Device");
		ic_con.bits.master_mode = 1U;
		ic_con.bits.slave_disable = 1U;
	} else {
		return -EINVAL;
	}

	ic_con.bits.restart_en = 1U;

	/* Set addressing mode - (initialization = 7 bit) */
	if (I2C_ADDR_10_BITS & dw->app_config) {
		LOG_DBG("I2C: using 10-bit address");
		ic_con.bits.addr_master_10bit = 1U;
		ic_con.bits.addr_slave_10bit = 1U;
	}

	/* Setup the clock frequency and speed mode */
	switch (I2C_SPEED_GET(dw->app_config)) {
	case I2C_SPEED_STANDARD:
		LOG_DBG("I2C: speed set to STANDARD");
		regs->ic_ss_scl_lcnt = dw->lcnt;
		regs->ic_ss_scl_hcnt = dw->hcnt;
		ic_con.bits.speed = I2C_DW_SPEED_STANDARD;

		break;
	case I2C_SPEED_FAST:
		/* fall through */
	case I2C_SPEED_FAST_PLUS:
		LOG_DBG("I2C: speed set to FAST or FAST_PLUS");
		regs->ic_fs_scl_lcnt = dw->lcnt;
		regs->ic_fs_scl_hcnt = dw->hcnt;
		ic_con.bits.speed = I2C_DW_SPEED_FAST;

		break;
	case I2C_SPEED_HIGH:
		if (!dw->support_hs_mode) {
			return -EINVAL;
		}

		LOG_DBG("I2C: speed set to HIGH");
		regs->ic_hs_scl_lcnt = dw->lcnt;
		regs->ic_hs_scl_hcnt = dw->hcnt;
		ic_con.bits.speed = I2C_DW_SPEED_HIGH;

		break;
	default:
		LOG_DBG("I2C: invalid speed requested");
		return -EINVAL;
	}

	LOG_DBG("I2C: lcnt = %d", dw->lcnt);
	LOG_DBG("I2C: hcnt = %d", dw->hcnt);

	/* Set the IC_CON register */
	regs->ic_con = ic_con;

	/* Set RX fifo threshold level.
	 * Setting it to zero automatically triggers interrupt
	 * RX_FULL whenever there is data received.
	 *
	 * TODO: extend the threshold for multi-byte RX.
	 */
	regs->ic_rx_tl = 0U;

	/* Set TX fifo threshold level.
	 * TX_EMPTY interrupt is triggered only when the
	 * TX FIFO is truly empty. So that we can let
	 * the controller do the transfers for longer period
	 * before we need to fill the FIFO again. This may
	 * cause some pauses during transfers, but this keeps
	 * the device from interrupting often.
	 */
	regs->ic_tx_tl = 0U;

	if (regs->ic_con.bits.master_mode) {
		/* Set address of target slave */
		regs->ic_tar.bits.ic_tar = slave_address;
	} else {
		/* Set slave address for device */
		regs->ic_sar.bits.ic_sar = slave_address;
	}

	/* If I2C is being operated in master mode and I2C_DYNAMIC_TAR_UPDATE
	 * configuration parameter is set to Yes (1), the ic_10bitaddr_master
	 * bit in ic_tar register would control whether the DW_apb_i2c starts
	 * its transfers in 7-bit or 10-bit addressing mode.
	 */
	if (I2C_MODE_MASTER & dw->app_config) {
		if (I2C_ADDR_10_BITS & dw->app_config) {
			regs->ic_tar.bits.ic_10bitaddr_master = 1U;
		} else {
			regs->ic_tar.bits.ic_10bitaddr_master = 0U;
		}
	}

	return 0;
}

static int i2c_dw_transfer(struct device *dev,
			   struct i2c_msg *msgs, u8_t num_msgs,
			   u16_t slave_address)
{
	struct i2c_dw_dev_config * const dw = dev->driver_data;
	struct i2c_msg *cur_msg = msgs;
	u8_t msg_left = num_msgs;
	u8_t pflags;
	int ret;

	volatile struct i2c_dw_registers * const regs =
		(struct i2c_dw_registers *)dw->base_address;

	__ASSERT_NO_MSG(msgs);
	if (!num_msgs) {
		return 0;
	}

	/* First step, check if there is current activity */
	if ((regs->ic_status.bits.activity) || (dw->state & I2C_DW_BUSY)) {
		return -EIO;
	}

	dw->state |= I2C_DW_BUSY;

	ret = _i2c_dw_setup(dev, slave_address);
	if (ret) {
		dw->state = I2C_DW_STATE_READY;
		return ret;
	}

	/* Enable controller */
	regs->ic_enable.bits.enable = 1U;

	/*
	 * While waiting at device_sync_sem, kernel can switch to idle
	 * task which in turn can call sys_suspend() hook of Power
	 * Management App (PMA).
	 * device_busy_set() call here, would indicate to PMA that it should not
	 * execute PM policies that would turn off this ip block, causing an
	 * ongoing hw transaction to be left in an inconsistent state.
	 * Note : This is just a sample to show a possible use of the API, it is
	 * upto the driver expert to see, if he actually needs it here, or
	 * somewhere else, or not needed as the driver's suspend()/resume()
	 * can handle everything
	 */
	device_busy_set(dev);

		/* Process all the messages */
	while (msg_left > 0) {
		pflags = dw->xfr_flags;

		dw->xfr_buf = cur_msg->buf;
		dw->xfr_len = cur_msg->len;
		dw->xfr_flags = cur_msg->flags;
		dw->rx_pending = 0U;

		/* Need to RESTART if changing transfer direction */
		if ((pflags & I2C_MSG_RW_MASK)
		    != (dw->xfr_flags & I2C_MSG_RW_MASK)) {
			dw->xfr_flags |= I2C_MSG_RESTART;
		}

		/* Send STOP if this is the last message */
		if (msg_left == 1) {
			dw->xfr_flags |= I2C_MSG_STOP;
		}

		dw->state &= ~(I2C_DW_CMD_SEND | I2C_DW_CMD_RECV);

		if ((dw->xfr_flags & I2C_MSG_RW_MASK) == I2C_MSG_WRITE) {
			dw->state |= I2C_DW_CMD_SEND;
			dw->request_bytes = 0U;
		} else {
			dw->state |= I2C_DW_CMD_RECV;
			dw->request_bytes = dw->xfr_len;
		}

		/* Enable interrupts to trigger ISR */
		if (regs->ic_con.bits.master_mode) {
			/* Enable necessary interrupts */
			regs->ic_intr_mask.raw = (DW_ENABLE_TX_INT_I2C_MASTER |
						  DW_ENABLE_RX_INT_I2C_MASTER);
		} else {
			/* Enable necessary interrupts */
			regs->ic_intr_mask.raw = DW_ENABLE_TX_INT_I2C_SLAVE;
		}

		/* Wait for transfer to be done */
		k_sem_take(&dw->device_sync_sem, K_FOREVER);

		if (dw->state & I2C_DW_CMD_ERROR) {
			ret = -EIO;
			break;
		}

		/* Something wrong if there is something left to do */
		if (dw->xfr_len > 0) {
			ret = -EIO;
			break;
		}

		cur_msg++;
		msg_left--;
	}

	device_busy_clear(dev);

	dw->state = I2C_DW_STATE_READY;

	return ret;
}

static int i2c_dw_runtime_configure(struct device *dev, u32_t config)
{
	struct i2c_dw_dev_config * const dw = dev->driver_data;
	u32_t	value = 0U;
	u32_t	rc = 0U;

	volatile struct i2c_dw_registers * const regs =
		(struct i2c_dw_registers *)dw->base_address;

	dw->app_config = config;

	/* Make sure we have a supported speed for the DesignWare model */
	/* and have setup the clock frequency and speed mode */
	switch (I2C_SPEED_GET(dw->app_config)) {
	case I2C_SPEED_STANDARD:
		/* Following the directions on DW spec page 59, IC_SS_SCL_LCNT
		 * must have register values larger than IC_FS_SPKLEN + 7
		 */
		if (I2C_STD_LCNT <= (regs->ic_fs_spklen + 7)) {
			value = regs->ic_fs_spklen + 8;
		} else {
			value = I2C_STD_LCNT;
		}

		dw->lcnt = value;

		/* Following the directions on DW spec page 59, IC_SS_SCL_HCNT
		 * must have register values larger than IC_FS_SPKLEN + 5
		 */
		if (I2C_STD_HCNT <= (regs->ic_fs_spklen + 5)) {
			value = regs->ic_fs_spklen + 6;
		} else {
			value = I2C_STD_HCNT;
		}

		dw->hcnt = value;
		break;
	case I2C_SPEED_FAST:
		/* fall through */
	case I2C_SPEED_FAST_PLUS:
		/*
		 * Following the directions on DW spec page 59, IC_FS_SCL_LCNT
		 * must have register values larger than IC_FS_SPKLEN + 7
		 */
		if (I2C_FS_LCNT <= (regs->ic_fs_spklen + 7)) {
			value = regs->ic_fs_spklen + 8;
		} else {
			value = I2C_FS_LCNT;
		}

		dw->lcnt = value;

		/*
		 * Following the directions on DW spec page 59, IC_FS_SCL_HCNT
		 * must have register values larger than IC_FS_SPKLEN + 5
		 */
		if (I2C_FS_HCNT <= (regs->ic_fs_spklen + 5)) {
			value = regs->ic_fs_spklen + 6;
		} else {
			value = I2C_FS_HCNT;
		}

		dw->hcnt = value;
		break;
	case I2C_SPEED_HIGH:
		if (dw->support_hs_mode) {
			if (I2C_HS_LCNT <= (regs->ic_hs_spklen + 7)) {
				value = regs->ic_hs_spklen + 8;
			} else {
				value = I2C_HS_LCNT;
			}

			dw->lcnt = value;

			if (I2C_HS_HCNT <= (regs->ic_hs_spklen + 5)) {
				value = regs->ic_hs_spklen + 6;
			} else {
				value = I2C_HS_HCNT;
			}

			dw->hcnt = value;
		} else {
			rc = -EINVAL;
		}
		break;
	default:
		/* TODO change */
		rc = -EINVAL;
	}

	/*
	 * Clear any interrupts currently waiting in the controller
	 */
	value = regs->ic_clr_intr;

	/*
	 * TEMPORARY HACK - The I2C does not work in any mode other than Master
	 * currently.  This "hack" forces us to always be configured for master
	 * mode, until we can verify that Slave mode works correctly.
	 */
	dw->app_config |= I2C_MODE_MASTER;

	return rc;
}

static const struct i2c_driver_api funcs = {
	.configure = i2c_dw_runtime_configure,
	.transfer = i2c_dw_transfer,
};


#ifdef CONFIG_PCI
static inline int i2c_dw_pci_setup(struct device *dev)
{
	struct i2c_dw_dev_config * const dw = dev->driver_data;

	pci_bus_scan_init();

	if (!pci_bus_scan(&dw->pci_dev)) {
		LOG_DBG("Could not find device");
		return 0;
	}

#ifdef CONFIG_PCI_ENUMERATION
	dw->base_address = dw->pci_dev.addr;
#endif
	pci_enable_regs(&dw->pci_dev);

	pci_show(&dw->pci_dev);

	return 1;
}
#else
#define i2c_dw_pci_setup(_unused_) (1)
#endif /* CONFIG_PCI */

static int i2c_dw_initialize(struct device *dev)
{
	const struct i2c_dw_rom_config * const rom = dev->config->config_info;
	struct i2c_dw_dev_config * const dw = dev->driver_data;
	volatile struct i2c_dw_registers *regs;

	if (!i2c_dw_pci_setup(dev)) {
		dev->driver_api = NULL;
		return -EIO;
	}

	k_sem_init(&dw->device_sync_sem, 0, UINT_MAX);

	regs = (struct i2c_dw_registers *) dw->base_address;

	/* verify that we have a valid DesignWare register first */
	if (regs->ic_comp_type != I2C_DW_MAGIC_KEY) {
		dev->driver_api = NULL;
		LOG_DBG("I2C: DesignWare magic key not found, check base "
			    "address. Stopping initialization");
		return -EIO;
	}

	/*
	 * grab the default value on initialization.  This should be set to the
	 * IC_MAX_SPEED_MODE in the hardware.  If it does support high speed we
	 * can move provide support for it
	 */
	if (regs->ic_con.bits.speed == I2C_DW_SPEED_HIGH) {
		LOG_DBG("I2C: high speed supported");
		dw->support_hs_mode = true;
	} else {
		LOG_DBG("I2C: high speed NOT supported");
		dw->support_hs_mode = false;
	}

	rom->config_func(dev);

	dw->app_config = I2C_MODE_MASTER | _i2c_map_dt_bitrate(rom->bitrate);

	if (i2c_dw_runtime_configure(dev, dw->app_config) != 0) {
		LOG_DBG("I2C: Cannot set default configuration");
		return -EIO;
	}

	dw->state = I2C_DW_STATE_READY;

	return 0;
}

/* system bindings */
#if CONFIG_I2C_0
static void i2c_config_0(struct device *port);

static const struct i2c_dw_rom_config i2c_config_dw_0 = {
	.config_func = i2c_config_0,

#ifdef CONFIG_GPIO_DW_0_IRQ_SHARED
	.shared_irq_dev_name = DT_I2C_DW_0_IRQ_SHARED_NAME,
#endif
	.bitrate = DT_SNPS_DESIGNWARE_I2C_0_CLOCK_FREQUENCY,
};

static struct i2c_dw_dev_config i2c_0_runtime = {
	.base_address = DT_SNPS_DESIGNWARE_I2C_0_BASE_ADDRESS,
#if CONFIG_PCI
	.pci_dev.class_type = I2C_DW_0_PCI_CLASS,
	.pci_dev.bus = I2C_DW_0_PCI_BUS,
	.pci_dev.dev = I2C_DW_0_PCI_DEV,
	.pci_dev.vendor_id = I2C_DW_0_PCI_VENDOR_ID,
	.pci_dev.device_id = I2C_DW_0_PCI_DEVICE_ID,
	.pci_dev.function = I2C_DW_0_PCI_FUNCTION,
	.pci_dev.bar = I2C_DW_0_PCI_BAR,
#endif
};

DEVICE_AND_API_INIT(i2c_0, DT_SNPS_DESIGNWARE_I2C_0_LABEL, &i2c_dw_initialize,
		    &i2c_0_runtime, &i2c_config_dw_0,
		    POST_KERNEL, CONFIG_I2C_INIT_PRIORITY,
		    &funcs);

#ifndef DT_SNPS_DESIGNWARE_I2C_0_IRQ_0_SENSE
#define DT_SNPS_DESIGNWARE_I2C_0_IRQ_0_SENSE 0
#endif
static void i2c_config_0(struct device *port)
{
#if defined(CONFIG_I2C_DW_0_IRQ_DIRECT)
	IRQ_CONNECT(DT_SNPS_DESIGNWARE_I2C_0_IRQ_0, DT_SNPS_DESIGNWARE_I2C_0_IRQ_0_PRIORITY,
		    i2c_dw_isr, DEVICE_GET(i2c_0), DT_SNPS_DESIGNWARE_I2C_0_IRQ_0_SENSE);
	irq_enable(DT_SNPS_DESIGNWARE_I2C_0_IRQ_0);
#elif defined(CONFIG_I2C_DW_0_IRQ_SHARED)
	const struct i2c_dw_rom_config * const config =
		port->config->config_info;
	struct device *shared_irq_dev;

	shared_irq_dev = device_get_binding(config->shared_irq_dev_name);
	shared_irq_isr_register(shared_irq_dev, (isr_t)i2c_dw_isr, port);
	shared_irq_enable(shared_irq_dev, port);
#endif
}
#endif /* CONFIG_I2C_0 */


/*
 * Adding in I2C1
 */
#if CONFIG_I2C_1
static void i2c_config_1(struct device *port);

static const struct i2c_dw_rom_config i2c_config_dw_1 = {
	.config_func = i2c_config_1,
	.bitrate = DT_SNPS_DESIGNWARE_I2C_1_CLOCK_FREQUENCY,
};

static struct i2c_dw_dev_config i2c_1_runtime = {
	.base_address = DT_SNPS_DESIGNWARE_I2C_1_BASE_ADDRESS,
#if CONFIG_PCI
	.pci_dev.class_type = I2C_DW_1_PCI_CLASS,
	.pci_dev.bus = I2C_DW_1_PCI_BUS,
	.pci_dev.dev = I2C_DW_1_PCI_DEV,
	.pci_dev.vendor_id = I2C_DW_1_PCI_VENDOR_ID,
	.pci_dev.device_id = I2C_DW_1_PCI_DEVICE_ID,
	.pci_dev.function = I2C_DW_1_PCI_FUNCTION,
	.pci_dev.bar = I2C_DW_1_PCI_BAR,
#endif
};

DEVICE_AND_API_INIT(i2c_1, DT_SNPS_DESIGNWARE_I2C_1_LABEL, &i2c_dw_initialize,
		    &i2c_1_runtime, &i2c_config_dw_1,
		    POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT,
		    &funcs);

#ifndef DT_SNPS_DESIGNWARE_I2C_1_IRQ_0_SENSE
#define DT_SNPS_DESIGNWARE_I2C_1_IRQ_0_SENSE 0
#endif
static void i2c_config_1(struct device *port)
{
	IRQ_CONNECT(DT_SNPS_DESIGNWARE_I2C_1_IRQ_0, DT_SNPS_DESIGNWARE_I2C_1_IRQ_0_PRIORITY,
		    i2c_dw_isr, DEVICE_GET(i2c_1), DT_SNPS_DESIGNWARE_I2C_1_IRQ_0_SENSE);
	irq_enable(DT_SNPS_DESIGNWARE_I2C_1_IRQ_0);
}

#endif /* CONFIG_I2C_1 */

/*
 * Adding in I2C_2
 */
#if CONFIG_I2C_2
static void i2c_config_2(struct device *port);

static const struct i2c_dw_rom_config i2c_config_dw_2 = {
	.config_func = i2c_config_2,
	.bitrate = DT_SNPS_DESIGNWARE_I2C_2_CLOCK_FREQUENCY,
};

static struct i2c_dw_dev_config I2C_2_runtime = {
	.base_address = DT_SNPS_DESIGNWARE_I2C_2_BASE_ADDRESS,
#if CONFIG_PCI
	.pci_dev.class_type = I2C_DW_2_PCI_CLASS,
	.pci_dev.bus = I2C_DW_2_PCI_BUS,
	.pci_dev.dev = I2C_DW_2_PCI_DEV,
	.pci_dev.vendor_id = I2C_DW_2_PCI_VENDOR_ID,
	.pci_dev.device_id = I2C_DW_2_PCI_DEVICE_ID,
	.pci_dev.function = I2C_DW_2_PCI_FUNCTION,
	.pci_dev.bar = I2C_DW_2_PCI_BAR,
#endif
};

DEVICE_AND_API_INIT(I2C_2, DT_SNPS_DESIGNWARE_I2C_2_LABEL, &i2c_dw_initialize,
		    &I2C_2_runtime, &i2c_config_dw_2,
		    POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT,
		    &funcs);

#ifndef DT_SNPS_DESIGNWARE_I2C_2_IRQ_0_SENSE
#define DT_SNPS_DESIGNWARE_I2C_2_IRQ_0_SENSE 0
#endif
static void i2c_config_2(struct device *port)
{
	IRQ_CONNECT(DT_SNPS_DESIGNWARE_I2C_2_IRQ_0, DT_SNPS_DESIGNWARE_I2C_2_IRQ_0_PRIORITY,
		    i2c_dw_isr, DEVICE_GET(I2C_2), DT_SNPS_DESIGNWARE_I2C_2_IRQ_0_SENSE);
	irq_enable(DT_SNPS_DESIGNWARE_I2C_2_IRQ_0);
}

#endif /* CONFIG_I2C_2 */

/*
 * Adding in I2C_3
 */
#if CONFIG_I2C_3
static void i2c_config_3(struct device *port);

static const struct i2c_dw_rom_config i2c_config_dw_3 = {
	.config_func = i2c_config_3,
	.bitrate = DT_SNPS_DESIGNWARE_I2C_3_CLOCK_FREQUENCY,
};

static struct i2c_dw_dev_config I2C_3_runtime = {
	.base_address = DT_SNPS_DESIGNWARE_I2C_3_BASE_ADDRESS,
#if CONFIG_PCI
	.pci_dev.class_type = I2C_DW_3_PCI_CLASS,
	.pci_dev.bus = I2C_DW_3_PCI_BUS,
	.pci_dev.dev = I2C_DW_3_PCI_DEV,
	.pci_dev.vendor_id = I2C_DW_3_PCI_VENDOR_ID,
	.pci_dev.device_id = I2C_DW_3_PCI_DEVICE_ID,
	.pci_dev.function = I2C_DW_3_PCI_FUNCTION,
	.pci_dev.bar = I2C_DW_3_PCI_BAR,
#endif
};

DEVICE_AND_API_INIT(I2C_3, DT_SNPS_DESIGNWARE_I2C_3_LABEL, &i2c_dw_initialize,
		    &I2C_3_runtime, &i2c_config_dw_3,
		    POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT,
		    &funcs);

#ifndef DT_SNPS_DESIGNWARE_I2C_3_IRQ_0_SENSE
#define DT_SNPS_DESIGNWARE_I2C_3_IRQ_0_SENSE 0
#endif
static void i2c_config_3(struct device *port)
{
	IRQ_CONNECT(DT_SNPS_DESIGNWARE_I2C_3_IRQ_0, DT_SNPS_DESIGNWARE_I2C_3_IRQ_0_PRIORITY,
		    i2c_dw_isr, DEVICE_GET(I2C_3), DT_SNPS_DESIGNWARE_I2C_3_IRQ_0_SENSE);
	irq_enable(DT_SNPS_DESIGNWARE_I2C_3_IRQ_0);
}

#endif /* CONFIG_I2C_3 */

/*
 * Adding in I2C_4
 */
#if CONFIG_I2C_4
static void i2c_config_4(struct device *port);

static const struct i2c_dw_rom_config i2c_config_dw_4 = {
	.config_func = i2c_config_4,
	.bitrate = DT_SNPS_DESIGNWARE_I2C_4_CLOCK_FREQUENCY,
};

static struct i2c_dw_dev_config I2C_4_runtime = {
	.base_address = DT_SNPS_DESIGNWARE_I2C_4_BASE_ADDRESS,
#if CONFIG_PCI
	.pci_dev.class_type = I2C_DW_4_PCI_CLASS,
	.pci_dev.bus = I2C_DW_4_PCI_BUS,
	.pci_dev.dev = I2C_DW_4_PCI_DEV,
	.pci_dev.vendor_id = I2C_DW_4_PCI_VENDOR_ID,
	.pci_dev.device_id = I2C_DW_4_PCI_DEVICE_ID,
	.pci_dev.function = I2C_DW_4_PCI_FUNCTION,
	.pci_dev.bar = I2C_DW_4_PCI_BAR,
#endif
};

DEVICE_AND_API_INIT(I2C_4, DT_SNPS_DESIGNWARE_I2C_4_LABEL, &i2c_dw_initialize,
		    &I2C_4_runtime, &i2c_config_dw_4,
		    POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT,
		    &funcs);

#ifndef DT_SNPS_DESIGNWARE_I2C_4_IRQ_0_SENSE
#define DT_SNPS_DESIGNWARE_I2C_4_IRQ_0_SENSE 0
#endif
static void i2c_config_4(struct device *port)
{
	IRQ_CONNECT(DT_SNPS_DESIGNWARE_I2C_4_IRQ_0, DT_SNPS_DESIGNWARE_I2C_4_IRQ_0_PRIORITY,
		    i2c_dw_isr, DEVICE_GET(I2C_4), DT_SNPS_DESIGNWARE_I2C_4_IRQ_0_SENSE);
	irq_enable(DT_SNPS_DESIGNWARE_I2C_4_IRQ_0);
}

#endif /* CONFIG_I2C_4 */

/*
 * Adding in I2C_5
 */
#if CONFIG_I2C_5
static void i2c_config_5(struct device *port);

static const struct i2c_dw_rom_config i2c_config_dw_5 = {
	.config_func = i2c_config_5,
	.bitrate = DT_SNPS_DESIGNWARE_I2C_5_CLOCK_FREQUENCY,
};

static struct i2c_dw_dev_config I2C_5_runtime = {
	.base_address = DT_SNPS_DESIGNWARE_I2C_5_BASE_ADDRESS,
#if CONFIG_PCI
	.pci_dev.class_type = I2C_DW_5_PCI_CLASS,
	.pci_dev.bus = I2C_DW_5_PCI_BUS,
	.pci_dev.dev = I2C_DW_5_PCI_DEV,
	.pci_dev.vendor_id = I2C_DW_5_PCI_VENDOR_ID,
	.pci_dev.device_id = I2C_DW_5_PCI_DEVICE_ID,
	.pci_dev.function = I2C_DW_5_PCI_FUNCTION,
	.pci_dev.bar = I2C_DW_5_PCI_BAR,
#endif
};

DEVICE_AND_API_INIT(I2C_5, DT_SNPS_DESIGNWARE_I2C_5_LABEL, &i2c_dw_initialize,
		    &I2C_5_runtime, &i2c_config_dw_5,
		    POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT,
		    &funcs);

#ifndef DT_SNPS_DESIGNWARE_I2C_5_IRQ_0_SENSE
#define DT_SNPS_DESIGNWARE_I2C_5_IRQ_0_SENSE 0
#endif
static void i2c_config_5(struct device *port)
{
	IRQ_CONNECT(DT_SNPS_DESIGNWARE_I2C_5_IRQ_0, DT_SNPS_DESIGNWARE_I2C_5_IRQ_0_PRIORITY,
		    i2c_dw_isr, DEVICE_GET(I2C_5), DT_SNPS_DESIGNWARE_I2C_5_IRQ_0_SENSE);
	irq_enable(DT_SNPS_DESIGNWARE_I2C_5_IRQ_0);
}

#endif /* CONFIG_I2C_5 */

/*
 * Adding in I2C_6
 */
#if CONFIG_I2C_6
static void i2c_config_6(struct device *port);

static const struct i2c_dw_rom_config i2c_config_dw_6 = {
	.config_func = i2c_config_6,
	.bitrate = DT_SNPS_DESIGNWARE_I2C_6_CLOCK_FREQUENCY,
};

static struct i2c_dw_dev_config I2C_6_runtime = {
	.base_address = DT_SNPS_DESIGNWARE_I2C_6_BASE_ADDRESS,
#if CONFIG_PCI
	.pci_dev.class_type = I2C_DW_6_PCI_CLASS,
	.pci_dev.bus = I2C_DW_6_PCI_BUS,
	.pci_dev.dev = I2C_DW_6_PCI_DEV,
	.pci_dev.vendor_id = I2C_DW_6_PCI_VENDOR_ID,
	.pci_dev.device_id = I2C_DW_6_PCI_DEVICE_ID,
	.pci_dev.function = I2C_DW_6_PCI_FUNCTION,
	.pci_dev.bar = I2C_DW_6_PCI_BAR,
#endif
};

DEVICE_AND_API_INIT(I2C_6, DT_SNPS_DESIGNWARE_I2C_6_LABEL, &i2c_dw_initialize,
		    &I2C_6_runtime, &i2c_config_dw_6,
		    POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT,
		    &funcs);

#ifndef DT_SNPS_DESIGNWARE_I2C_6_IRQ_0_SENSE
#define DT_SNPS_DESIGNWARE_I2C_6_IRQ_0_SENSE 0
#endif
static void i2c_config_6(struct device *port)
{
	IRQ_CONNECT(DT_SNPS_DESIGNWARE_I2C_6_IRQ_0, DT_SNPS_DESIGNWARE_I2C_6_IRQ_0_PRIORITY,
		    i2c_dw_isr, DEVICE_GET(I2C_6), DT_SNPS_DESIGNWARE_I2C_6_IRQ_0_SENSE);
	irq_enable(DT_SNPS_DESIGNWARE_I2C_6_IRQ_0);
}

#endif /* CONFIG_I2C_6 */

/*
 * Adding in I2C_7
 */
#if CONFIG_I2C_7
static void i2c_config_7(struct device *port);

static const struct i2c_dw_rom_config i2c_config_dw_7 = {
	.config_func = i2c_config_7,
	.bitrate = DT_SNPS_DESIGNWARE_I2C_7_CLOCK_FREQUENCY,
};

static struct i2c_dw_dev_config I2C_7_runtime = {
	.base_address = DT_SNPS_DESIGNWARE_I2C_7_BASE_ADDRESS,
#if CONFIG_PCI
	.pci_dev.class_type = I2C_DW_7_PCI_CLASS,
	.pci_dev.bus = I2C_DW_7_PCI_BUS,
	.pci_dev.dev = I2C_DW_7_PCI_DEV,
	.pci_dev.vendor_id = I2C_DW_7_PCI_VENDOR_ID,
	.pci_dev.device_id = I2C_DW_7_PCI_DEVICE_ID,
	.pci_dev.function = I2C_DW_7_PCI_FUNCTION,
	.pci_dev.bar = I2C_DW_7_PCI_BAR,
#endif
};

DEVICE_AND_API_INIT(I2C_7, DT_SNPS_DESIGNWARE_I2C_7_LABEL, &i2c_dw_initialize,
		    &I2C_7_runtime, &i2c_config_dw_7,
		    POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT,
		    &funcs);

#ifndef DT_SNPS_DESIGNWARE_I2C_7_IRQ_0_SENSE
#define DT_SNPS_DESIGNWARE_I2C_7_IRQ_0_SENSE 0
#endif
static void i2c_config_7(struct device *port)
{
	IRQ_CONNECT(DT_SNPS_DESIGNWARE_I2C_7_IRQ_0, DT_SNPS_DESIGNWARE_I2C_7_IRQ_0_PRIORITY,
		    i2c_dw_isr, DEVICE_GET(I2C_7), DT_SNPS_DESIGNWARE_I2C_7_IRQ_0_SENSE);
	irq_enable(DT_SNPS_DESIGNWARE_I2C_7_IRQ_0);
}

#endif /* CONFIG_I2C_7 */
