/*
 * Copyright (c) 2018, NXP
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <errno.h>
#include <device.h>
#include <gpio.h>
#include <soc.h>
#include <gpio_imx.h>

#include "gpio_utils.h"

struct imx_gpio_config {
	GPIO_Type *base;
};

struct imx_gpio_data {
	/* port ISR callback routine address */
	sys_slist_t callbacks;
	/* pin callback routine enable flags, by pin number */
	u32_t pin_callback_enables;
};

static int imx_gpio_configure(struct device *dev,
			       int access_op, u32_t pin, int flags)
{
	const struct imx_gpio_config *config = dev->config->config_info;
	gpio_init_config_t pin_config;
	bool double_edge = false;
	u32_t i;

	/* Check for an invalid pin configuration */
	if ((flags & GPIO_INT) && (flags & GPIO_DIR_OUT)) {
		return -EINVAL;
	}

	pin_config.direction = ((flags & GPIO_DIR_MASK) == GPIO_DIR_IN)
		? gpioDigitalInput : gpioDigitalOutput;

	if (flags & GPIO_INT) {
		if (flags & GPIO_INT_EDGE) {
			if (flags & GPIO_INT_ACTIVE_HIGH) {
				pin_config.interruptMode = gpioIntRisingEdge;
			} else if (flags & GPIO_INT_DOUBLE_EDGE) {
				pin_config.interruptMode = gpioNoIntmode;
				double_edge = true;
			} else {
				pin_config.interruptMode = gpioIntFallingEdge;
			}
		} else { /* GPIO_INT_LEVEL */
			if (flags & GPIO_INT_ACTIVE_HIGH) {
				pin_config.interruptMode = gpioIntHighLevel;
			} else {
				pin_config.interruptMode = gpioIntLowLevel;
			}
		}
	} else {
		pin_config.interruptMode = gpioNoIntmode;
	}

	if (access_op == GPIO_ACCESS_BY_PIN) {
		pin_config.pin = pin;
		GPIO_Init(config->base, &pin_config);
		GPIO_SetIntEdgeSelect(config->base, pin, double_edge);
	} else {	/* GPIO_ACCESS_BY_PORT */
		for (i = 0; i < 32; i++) {
			pin_config.pin = i;
			GPIO_Init(config->base, &pin_config);
			GPIO_SetIntEdgeSelect(config->base, pin, double_edge);
		}
	}

	return 0;
}

static int imx_gpio_write(struct device *dev,
			   int access_op, u32_t pin, u32_t value)
{
	const struct imx_gpio_config *config = dev->config->config_info;

	if (access_op == GPIO_ACCESS_BY_PIN) {
		GPIO_WritePinOutput(config->base, pin,
					(gpio_pin_action_t)value);
	} else { /* GPIO_ACCESS_BY_PORT */
		GPIO_WritePortOutput(config->base, value);
	}

	return 0;
}

static int imx_gpio_read(struct device *dev,
			  int access_op, u32_t pin, u32_t *value)
{
	const struct imx_gpio_config *config = dev->config->config_info;

	if (access_op == GPIO_ACCESS_BY_PIN) {
		*value = GPIO_ReadPinInput(config->base, pin);
	} else { /* GPIO_ACCESS_BY_PORT */
		*value = GPIO_ReadPortInput(config->base);
	}

	return 0;
}

static int imx_gpio_manage_callback(struct device *dev,
				     struct gpio_callback *callback, bool set)
{
	struct imx_gpio_data *data = dev->driver_data;

	_gpio_manage_callback(&data->callbacks, callback, set);

	return 0;
}

static int imx_gpio_enable_callback(struct device *dev,
				     int access_op, u32_t pin)
{
	const struct imx_gpio_config *config = dev->config->config_info;
	struct imx_gpio_data *data = dev->driver_data;
	u32_t i;

	if (access_op == GPIO_ACCESS_BY_PIN) {
		data->pin_callback_enables |= BIT(pin);
		GPIO_SetPinIntMode(config->base, pin, true);
	} else {
		data->pin_callback_enables = 0xFFFFFFFF;
		for (i = 0; i < 32; i++) {
			GPIO_SetPinIntMode(config->base, i, true);
		}
	}

	return 0;
}

static int imx_gpio_disable_callback(struct device *dev,
				      int access_op, u32_t pin)
{
	const struct imx_gpio_config *config = dev->config->config_info;
	struct imx_gpio_data *data = dev->driver_data;
	u32_t i;

	if (access_op == GPIO_ACCESS_BY_PIN) {
		GPIO_SetPinIntMode(config->base, pin, false);
		data->pin_callback_enables &= ~BIT(pin);
	} else {
		for (i = 0; i < 32; i++) {
			GPIO_SetPinIntMode(config->base, i, false);
		}
		data->pin_callback_enables = 0;
	}

	return 0;
}

static void imx_gpio_port_isr(void *arg)
{
	struct device *dev = (struct device *)arg;
	const struct imx_gpio_config *config = dev->config->config_info;
	struct imx_gpio_data *data = dev->driver_data;
	u32_t enabled_int;
	u32_t int_flags;

	int_flags = GPIO_ISR_REG(config->base);
	enabled_int = int_flags & data->pin_callback_enables;

	_gpio_fire_callbacks(&data->callbacks, dev, enabled_int);

	GPIO_ISR_REG(config->base) = enabled_int;
}

static const struct gpio_driver_api imx_gpio_driver_api = {
	.config = imx_gpio_configure,
	.write = imx_gpio_write,
	.read = imx_gpio_read,
	.manage_callback = imx_gpio_manage_callback,
	.enable_callback = imx_gpio_enable_callback,
	.disable_callback = imx_gpio_disable_callback,
};

#ifdef CONFIG_GPIO_IMX_PORT_1
static int imx_gpio_1_init(struct device *dev);

static const struct imx_gpio_config imx_gpio_1_config = {
	.base = (GPIO_Type *)CONFIG_GPIO_IMX_PORT_1_BASE_ADDRESS,
};

static struct imx_gpio_data imx_gpio_1_data;

DEVICE_AND_API_INIT(imx_gpio_1, CONFIG_GPIO_IMX_PORT_1_NAME,
		    imx_gpio_1_init,
		    &imx_gpio_1_data, &imx_gpio_1_config,
		    POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT,
		    &imx_gpio_driver_api);

static int imx_gpio_1_init(struct device *dev)
{
	IRQ_CONNECT(CONFIG_GPIO_IMX_PORT_1_IRQ_0,
		    CONFIG_GPIO_IMX_PORT_1_IRQ_0_PRI,
		    imx_gpio_port_isr, DEVICE_GET(imx_gpio_1), 0);

	irq_enable(CONFIG_GPIO_IMX_PORT_1_IRQ_0);

	IRQ_CONNECT(CONFIG_GPIO_IMX_PORT_1_IRQ_1,
		    CONFIG_GPIO_IMX_PORT_1_IRQ_1_PRI,
		    imx_gpio_port_isr, DEVICE_GET(imx_gpio_1), 0);

	irq_enable(CONFIG_GPIO_IMX_PORT_1_IRQ_1);

	return 0;
}
#endif /* CONFIG_GPIO_IMX_PORT_1 */

#ifdef CONFIG_GPIO_IMX_PORT_2
static int imx_gpio_2_init(struct device *dev);

static const struct imx_gpio_config imx_gpio_2_config = {
	.base = (GPIO_Type *)CONFIG_GPIO_IMX_PORT_2_BASE_ADDRESS,
};

static struct imx_gpio_data imx_gpio_2_data;

DEVICE_AND_API_INIT(imx_gpio_2, CONFIG_GPIO_IMX_PORT_2_NAME,
		    imx_gpio_2_init,
		    &imx_gpio_2_data, &imx_gpio_2_config,
		    POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT,
		    &imx_gpio_driver_api);

static int imx_gpio_2_init(struct device *dev)
{
	IRQ_CONNECT(CONFIG_GPIO_IMX_PORT_2_IRQ_0,
		    CONFIG_GPIO_IMX_PORT_2_IRQ_0_PRI,
		    imx_gpio_port_isr, DEVICE_GET(imx_gpio_2), 0);

	irq_enable(CONFIG_GPIO_IMX_PORT_2_IRQ_0);

	IRQ_CONNECT(CONFIG_GPIO_IMX_PORT_2_IRQ_1,
		    CONFIG_GPIO_IMX_PORT_2_IRQ_1_PRI,
		    imx_gpio_port_isr, DEVICE_GET(imx_gpio_2), 0);

	irq_enable(CONFIG_GPIO_IMX_PORT_2_IRQ_1);

	return 0;
}
#endif /* CONFIG_GPIO_IMX_PORT_2 */

#ifdef CONFIG_GPIO_IMX_PORT_3
static int imx_gpio_3_init(struct device *dev);

static const struct imx_gpio_config imx_gpio_3_config = {
	.base = (GPIO_Type *)CONFIG_GPIO_IMX_PORT_3_BASE_ADDRESS,
};

static struct imx_gpio_data imx_gpio_3_data;

DEVICE_AND_API_INIT(imx_gpio_3, CONFIG_GPIO_IMX_PORT_3_NAME,
		    imx_gpio_3_init,
		    &imx_gpio_3_data, &imx_gpio_3_config,
		    POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT,
		    &imx_gpio_driver_api);

static int imx_gpio_3_init(struct device *dev)
{
	IRQ_CONNECT(CONFIG_GPIO_IMX_PORT_3_IRQ_0,
		    CONFIG_GPIO_IMX_PORT_3_IRQ_0_PRI,
		    imx_gpio_port_isr, DEVICE_GET(imx_gpio_3), 0);

	irq_enable(CONFIG_GPIO_IMX_PORT_3_IRQ_0);

	IRQ_CONNECT(CONFIG_GPIO_IMX_PORT_3_IRQ_1,
		    CONFIG_GPIO_IMX_PORT_3_IRQ_1_PRI,
		    imx_gpio_port_isr, DEVICE_GET(imx_gpio_3), 0);

	irq_enable(CONFIG_GPIO_IMX_PORT_3_IRQ_1);

	return 0;
}
#endif /* CONFIG_GPIO_IMX_PORT_3 */

#ifdef CONFIG_GPIO_IMX_PORT_4
static int imx_gpio_4_init(struct device *dev);

static const struct imx_gpio_config imx_gpio_4_config = {
	.base = (GPIO_Type *)CONFIG_GPIO_IMX_PORT_4_BASE_ADDRESS,
};

static struct imx_gpio_data imx_gpio_4_data;

DEVICE_AND_API_INIT(imx_gpio_4, CONFIG_GPIO_IMX_PORT_4_NAME,
		    imx_gpio_4_init,
		    &imx_gpio_4_data, &imx_gpio_4_config,
		    POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT,
		    &imx_gpio_driver_api);

static int imx_gpio_4_init(struct device *dev)
{
	IRQ_CONNECT(CONFIG_GPIO_IMX_PORT_4_IRQ_0,
		    CONFIG_GPIO_IMX_PORT_4_IRQ_0_PRI,
		    imx_gpio_port_isr, DEVICE_GET(imx_gpio_4), 0);

	irq_enable(CONFIG_GPIO_IMX_PORT_4_IRQ_0);

	IRQ_CONNECT(CONFIG_GPIO_IMX_PORT_4_IRQ_1,
		    CONFIG_GPIO_IMX_PORT_4_IRQ_1_PRI,
		    imx_gpio_port_isr, DEVICE_GET(imx_gpio_4), 0);

	irq_enable(CONFIG_GPIO_IMX_PORT_4_IRQ_1);

	return 0;
}
#endif /* CONFIG_GPIO_IMX_PORT_4 */

#ifdef CONFIG_GPIO_IMX_PORT_5
static int imx_gpio_5_init(struct device *dev);

static const struct imx_gpio_config imx_gpio_5_config = {
	.base = (GPIO_Type *)CONFIG_GPIO_IMX_PORT_5_BASE_ADDRESS,
};

static struct imx_gpio_data imx_gpio_5_data;

DEVICE_AND_API_INIT(imx_gpio_5, CONFIG_GPIO_IMX_PORT_5_NAME,
		    imx_gpio_5_init,
		    &imx_gpio_5_data, &imx_gpio_5_config,
		    POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT,
		    &imx_gpio_driver_api);

static int imx_gpio_5_init(struct device *dev)
{
	IRQ_CONNECT(CONFIG_GPIO_IMX_PORT_5_IRQ_0,
		    CONFIG_GPIO_IMX_PORT_5_IRQ_0_PRI,
		    imx_gpio_port_isr, DEVICE_GET(imx_gpio_5), 0);

	irq_enable(CONFIG_GPIO_IMX_PORT_5_IRQ_0);

	IRQ_CONNECT(CONFIG_GPIO_IMX_PORT_5_IRQ_1,
		    CONFIG_GPIO_IMX_PORT_5_IRQ_1_PRI,
		    imx_gpio_port_isr, DEVICE_GET(imx_gpio_5), 0);

	irq_enable(CONFIG_GPIO_IMX_PORT_5_IRQ_1);

	return 0;
}
#endif /* CONFIG_GPIO_IMX_PORT_5 */

#ifdef CONFIG_GPIO_IMX_PORT_6
static int imx_gpio_6_init(struct device *dev);

static const struct imx_gpio_config imx_gpio_6_config = {
	.base = (GPIO_Type *)CONFIG_GPIO_IMX_PORT_6_BASE_ADDRESS,
};

static struct imx_gpio_data imx_gpio_6_data;

DEVICE_AND_API_INIT(imx_gpio_6, CONFIG_GPIO_IMX_PORT_6_NAME,
		    imx_gpio_6_init,
		    &imx_gpio_6_data, &imx_gpio_6_config,
		    POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT,
		    &imx_gpio_driver_api);

static int imx_gpio_6_init(struct device *dev)
{
	IRQ_CONNECT(CONFIG_GPIO_IMX_PORT_6_IRQ_0,
		    CONFIG_GPIO_IMX_PORT_6_IRQ_0_PRI,
		    imx_gpio_port_isr, DEVICE_GET(imx_gpio_6), 0);

	irq_enable(CONFIG_GPIO_IMX_PORT_6_IRQ_0);

	IRQ_CONNECT(CONFIG_GPIO_IMX_PORT_6_IRQ_1,
		    CONFIG_GPIO_IMX_PORT_6_IRQ_1_PRI,
		    imx_gpio_port_isr, DEVICE_GET(imx_gpio_6), 0);

	irq_enable(CONFIG_GPIO_IMX_PORT_6_IRQ_1);

	return 0;
}
#endif /* CONFIG_GPIO_IMX_PORT_6 */

#ifdef CONFIG_GPIO_IMX_PORT_7
static int imx_gpio_7_init(struct device *dev);

static const struct imx_gpio_config imx_gpio_7_config = {
	.base = (GPIO_Type *)CONFIG_GPIO_IMX_PORT_7_BASE_ADDRESS,
};

static struct imx_gpio_data imx_gpio_7_data;

DEVICE_AND_API_INIT(imx_gpio_7, CONFIG_GPIO_IMX_PORT_7_NAME,
		    imx_gpio_7_init,
		    &imx_gpio_7_data, &imx_gpio_7_config,
		    POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT,
		    &imx_gpio_driver_api);

static int imx_gpio_7_init(struct device *dev)
{
	IRQ_CONNECT(CONFIG_GPIO_IMX_PORT_7_IRQ_0,
		    CONFIG_GPIO_IMX_PORT_7_IRQ_0_PRI,
		    imx_gpio_port_isr, DEVICE_GET(imx_gpio_7), 0);

	irq_enable(CONFIG_GPIO_IMX_PORT_7_IRQ_0);

	IRQ_CONNECT(CONFIG_GPIO_IMX_PORT_7_IRQ_1,
		    CONFIG_GPIO_IMX_PORT_7_IRQ_1_PRI,
		    imx_gpio_port_isr, DEVICE_GET(imx_gpio_7), 0);

	irq_enable(CONFIG_GPIO_IMX_PORT_7_IRQ_1);

	return 0;
}
#endif /* CONFIG_GPIO_IMX_PORT_7 */
