/* 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 == 0U) {
		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 == 1U)) {
			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 == 0U) {
			break;
		}
	}

	/* Nothing to receive anymore */
	if (dw->xfr_len == 0U) {
		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 == 0U) {
		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 == 1U) && (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 == 0U)
			     && !(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 == 1U) {
			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 */
