/*
 * Copyright (c) 2017 Piotr Mienkowski
 * SPDX-License-Identifier: Apache-2.0
 */

/** @file
 * @brief I2C bus (TWIHS) driver for Atmel SAM MCU family.
 *
 * Only I2C Master Mode with 7 bit addressing is currently supported.
 */

#include <errno.h>
#include <misc/__assert.h>
#include <kernel.h>
#include <device.h>
#include <init.h>
#include <soc.h>
#include <i2c.h>

#define SYS_LOG_DOMAIN "dev/twihs_sam"
#define SYS_LOG_LEVEL CONFIG_SYS_LOG_I2C_LEVEL
#include <logging/sys_log.h>

/** I2C bus speed [Hz] in Standard Mode */
#define BUS_SPEED_STANDARD_HZ         100000U
/** I2C bus speed [Hz] in Fast Mode */
#define BUS_SPEED_FAST_HZ             400000U
/** I2C bus speed [Hz] in High Speed Mode */
#define BUS_SPEED_HIGH_HZ            3400000U

/* Device constant configuration parameters */
struct twihs_sam_dev_cfg {
	Twihs *regs;
	void (*irq_config)(void);
	u8_t periph_id;
	u8_t irq_id;
	const struct soc_gpio_pin *pin_list;
	u8_t pin_list_size;
};

struct twihs_msg {
	/* Buffer containing data to read or write */
	u8_t *buf;
	/* Length of the buffer */
	u32_t len;
	/* Index of the next byte to be read/written from/to the buffer */
	u32_t idx;
	/* Value of TWIHS_SR at the end of the message */
	u32_t twihs_sr;
	/* Transfer flags as defined in the i2c.h file */
	u8_t flags;
};

/* Device run time data */
struct twihs_sam_dev_data {
	struct k_sem sem;
	u32_t mode_config;
	struct twihs_msg msg;
};

#define DEV_CFG(dev) \
	((const struct twihs_sam_dev_cfg *const)(dev)->config->config_info)
#define DEV_DATA(dev) \
	((struct twihs_sam_dev_data *const)(dev)->driver_data)

static u32_t clk_div_calc(u32_t speed)
{
	u32_t ck_div = 0;
	u32_t cl_div;
	u32_t div_completed = 0;

	while (!div_completed) {
		cl_div =   ((SOC_ATMEL_SAM_MCK_FREQ_HZ / (2 * speed)) - 4)
			 / (1 << ck_div);

		if (cl_div <= 255) {
			div_completed = 1;
		} else {
			ck_div++;
		}
	}

	/* Set TWI clock duty cycle to 50% */
	return (ck_div << 16) | (cl_div << 8) | cl_div;
}

static int twihs_sam_configure(struct device *dev, u32_t config)
{
	const struct twihs_sam_dev_cfg *const dev_cfg = DEV_CFG(dev);
	struct twihs_sam_dev_data *const dev_data = DEV_DATA(dev);
	Twihs *const twihs = dev_cfg->regs;
	u32_t i2c_speed;
	u32_t clk;

	if (!(config & I2C_MODE_MASTER)) {
		SYS_LOG_ERR("Master I2C Mode is enabled");
		return -EIO;
	}

	if (config & I2C_ADDR_10_BITS) {
		SYS_LOG_ERR("I2C 10-bit addressing is currently not supported");
		SYS_LOG_ERR("Please submit a patch");
		return -EIO;
	}

	dev_data->mode_config = config;

	/* Configure clock */
	switch (I2C_SPEED_GET(dev_data->dev_config)) {
	case I2C_SPEED_STANDARD:
		i2c_speed = BUS_SPEED_STANDARD_HZ;
		break;
	case I2C_SPEED_FAST:
		i2c_speed = BUS_SPEED_FAST_HZ;
		break;
	default:
		SYS_LOG_ERR("Unsupported I2C speed value");
		return -EIO;
	}

	clk = clk_div_calc(i2c_speed);
	twihs->TWIHS_CWGR = clk;

	/* Disable Slave Mode */
	twihs->TWIHS_CR = TWIHS_CR_SVDIS;

	/* Enable Master Mode */
	twihs->TWIHS_CR = TWIHS_CR_MSEN;

	return 0;
}

static void write_msg_start(Twihs *const twihs, struct twihs_msg *msg,
			    u8_t daddr)
{
	/* Set slave address and number of internal address bytes. */
	twihs->TWIHS_MMR = TWIHS_MMR_DADR(daddr);
	/* Set internal address bytes */
	twihs->TWIHS_IADR = 0;

	/* Write first data byte on I2C bus */
	twihs->TWIHS_THR = msg->buf[msg->idx++];
	/* Enable Transmit Ready and Transmission Completed interrupts */
	twihs->TWIHS_IER = TWIHS_IER_TXRDY | TWIHS_IER_TXCOMP | TWIHS_IER_NACK;
}

static void read_msg_start(Twihs *const twihs, struct twihs_msg *msg,
			   u8_t daddr)
{
	u32_t twihs_cr_stop;

	/* Set slave address and number of internal address bytes */
	twihs->TWIHS_MMR = TWIHS_MMR_MREAD | TWIHS_MMR_DADR(daddr);
	/* Set internal address bytes */
	twihs->TWIHS_IADR = 0;

	/* Enable Receive Ready and Transmission Completed interrupts */
	twihs->TWIHS_IER = TWIHS_IER_RXRDY | TWIHS_IER_TXCOMP | TWIHS_IER_NACK;

	/* In single data byte read the START and STOP must both be set */
	twihs_cr_stop = (msg->len == 1) ? TWIHS_CR_STOP : 0;
	/* Start the transfer by sending START condition */
	twihs->TWIHS_CR = TWIHS_CR_START | twihs_cr_stop;
}

static int twihs_sam_transfer(struct device *dev, struct i2c_msg *msgs,
			      u8_t num_msgs, u16_t addr)
{
	const struct twihs_sam_dev_cfg *const dev_cfg = DEV_CFG(dev);
	struct twihs_sam_dev_data *const dev_data = DEV_DATA(dev);
	Twihs *const twihs = dev_cfg->regs;

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

	for (int i = 0; i < num_msgs; i++) {
		dev_data->msg.buf = msgs[i].buf;
		dev_data->msg.len = msgs[i].len;
		dev_data->msg.idx = 0;
		dev_data->msg.twihs_sr = 0;
		dev_data->msg.flags = msgs[i].flags;
		if ((msgs[i].flags & I2C_MSG_RW_MASK) == I2C_MSG_READ) {
			read_msg_start(twihs, &dev_data->msg, addr);
		} else {
			write_msg_start(twihs, &dev_data->msg, addr);
		}
		/* Wait for the transfer to complete */
		k_sem_take(&dev_data->sem, K_FOREVER);

		if (dev_data->msg.twihs_sr > 0) {
			/* Something went wrong, send bus CLEAR command */
			twihs->TWIHS_CR = TWIHS_CR_CLEAR;
			return -EIO;
		}
	}

	return 0;
}

static void twihs_sam_isr(void *arg)
{
	struct device *dev = (struct device *)arg;
	const struct twihs_sam_dev_cfg *const dev_cfg = DEV_CFG(dev);
	struct twihs_sam_dev_data *const dev_data = DEV_DATA(dev);
	Twihs *const twihs = dev_cfg->regs;
	struct twihs_msg *msg = &dev_data->msg;
	u32_t isr_status;

	/* Retrieve interrupt status */
	isr_status = twihs->TWIHS_SR & twihs->TWIHS_IMR;

	/* Not Acknowledged */
	if (isr_status & TWIHS_SR_NACK) {
		msg->twihs_sr = isr_status;
	}

	/* Byte received */
	if (isr_status & TWIHS_SR_RXRDY) {

		msg->buf[msg->idx++] = twihs->TWIHS_RHR;

		if (msg->idx == msg->len - 1) {
			/* Send a STOP condition on the TWI */
			twihs->TWIHS_CR = TWIHS_CR_STOP;
		}
	}

	/* Byte sent */
	if (isr_status & TWIHS_SR_TXRDY) {
		if (msg->idx == msg->len) {
			if (msg->flags & I2C_MSG_STOP) {
				/* Send a STOP condition on the TWI */
				twihs->TWIHS_CR = TWIHS_CR_STOP;
				/* Disable Transmit Ready interrupt */
				twihs->TWIHS_IDR = TWIHS_IDR_TXRDY;
			} else {
				/* Transfer completed */
				isr_status |= TWIHS_SR_TXCOMP;
			}
		} else {
			twihs->TWIHS_THR = msg->buf[msg->idx++];
		}
	}

	/* Transfer completed */
	if (isr_status & TWIHS_SR_TXCOMP) {
		/* Disable all enabled interrupts */
		twihs->TWIHS_IDR = twihs->TWIHS_IMR;
		/* All data transferred, nothing else to do */
		k_sem_give(&dev_data->sem);
	}
}

static int twihs_sam_initialize(struct device *dev)
{
	const struct twihs_sam_dev_cfg *const dev_cfg = DEV_CFG(dev);
	struct twihs_sam_dev_data *const dev_data = DEV_DATA(dev);
	Twihs *const twihs = dev_cfg->regs;
	int result;

	/* Configure interrupts */
	dev_cfg->irq_config();

	/* Initialize semaphore */
	k_sem_init(&dev_data->sem, 0, 1);

	/* Connect pins to the peripheral */
	soc_gpio_list_configure(dev_cfg->pin_list, dev_cfg->pin_list_size);

	/* Enable module's clock */
	soc_pmc_peripheral_enable(dev_cfg->periph_id);

	/* Reset TWI module */
	twihs->TWIHS_CR = TWIHS_CR_SWRST;

	result = twihs_sam_configure(dev, dev_data->mode_config);
	if (result < 0) {
		return result;
	}

	/* Enable module's IRQ */
	irq_enable(dev_cfg->irq_id);

	return 0;
}

static const struct i2c_driver_api twihs_sam_driver_api = {
	.configure = twihs_sam_configure,
	.transfer = twihs_sam_transfer,
};

/* I2C0 */

#ifdef CONFIG_I2C_0
static struct device DEVICE_NAME_GET(i2c0_sam);

static void i2c0_sam_irq_config(void)
{
	IRQ_CONNECT(TWIHS0_IRQn, CONFIG_I2C_0_IRQ_PRI, twihs_sam_isr,
		    DEVICE_GET(i2c0_sam), 0);
}

static const struct soc_gpio_pin pins_twihs0[] = PINS_TWIHS0;

static const struct twihs_sam_dev_cfg i2c0_sam_config = {
	.regs = TWIHS0,
	.irq_config = i2c0_sam_irq_config,
	.periph_id = ID_TWIHS0,
	.irq_id = TWIHS0_IRQn,
	.pin_list = pins_twihs0,
	.pin_list_size = ARRAY_SIZE(pins_twihs0),
};

static struct twihs_sam_dev_data i2c0_sam_data = {
	.mode_config = CONFIG_I2C_0_DEFAULT_CFG,
};

DEVICE_AND_API_INIT(i2c0_sam, CONFIG_I2C_0_NAME, &twihs_sam_initialize,
		    &i2c0_sam_data, &i2c0_sam_config, POST_KERNEL,
		    CONFIG_I2C_INIT_PRIORITY, &twihs_sam_driver_api);
#endif

/* I2C1 */

#ifdef CONFIG_I2C_1
static struct device DEVICE_NAME_GET(i2c1_sam);

static void i2c1_sam_irq_config(void)
{
	IRQ_CONNECT(TWIHS0_IRQn, CONFIG_I2C_1_IRQ_PRI, twihs_sam_isr,
		    DEVICE_GET(i2c1_sam), 0);
}

static const struct soc_gpio_pin pins_twihs1[] = PINS_TWIHS1;

static const struct twihs_sam_dev_cfg i2c1_sam_config = {
	.regs = TWIHS1,
	.irq_config = i2c1_sam_irq_config,
	.periph_id = ID_TWIHS1,
	.irq_id = TWIHS1_IRQn,
	.pin_list = pins_twihs1,
	.pin_list_size = ARRAY_SIZE(pins_twihs1),
};

static struct twihs_sam_dev_data i2c1_sam_data = {
	.mode_config = CONFIG_I2C_1_DEFAULT_CFG,
};

DEVICE_AND_API_INIT(i2c1_sam, CONFIG_I2C_1_NAME, &twihs_sam_initialize,
		    &i2c1_sam_data, &i2c1_sam_config, POST_KERNEL,
		    CONFIG_I2C_INIT_PRIORITY, &twihs_sam_driver_api);
#endif

/* I2C2 */

#ifdef CONFIG_I2C_2
static struct device DEVICE_NAME_GET(i2c2_sam);

static void i2c2_sam_irq_config(void)
{
	IRQ_CONNECT(TWIHS2_IRQn, CONFIG_I2C_2_IRQ_PRI, twihs_sam_isr,
		    DEVICE_GET(i2c2_sam), 0);
}

static const struct soc_gpio_pin pins_twihs2[] = PINS_TWIHS2;

static const struct twihs_sam_dev_cfg i2c2_sam_config = {
	.regs = TWIHS2,
	.irq_config = i2c2_sam_irq_config,
	.periph_id = ID_TWIHS2,
	.irq_id = TWIHS2_IRQn,
	.pin_list = pins_twihs2,
	.pin_list_size = ARRAY_SIZE(pins_twihs2),
};

static struct twihs_sam_dev_data i2c2_sam_data = {
	.mode_config = CONFIG_I2C_2_DEFAULT_CFG,
};

DEVICE_AND_API_INIT(i2c2_sam, CONFIG_I2C_2_NAME, &twihs_sam_initialize,
		    &i2c2_sam_data, &i2c2_sam_config, POST_KERNEL,
		    CONFIG_I2C_INIT_PRIORITY, &twihs_sam_driver_api);
#endif
