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

#define DT_DRV_COMPAT nxp_lpc_iocon_pio

#include <stdint.h>
#include <errno.h>
#include <device.h>
#include <drivers/pinmux.h>
#include <fsl_common.h>
#include <fsl_clock.h>
#include <fsl_device_registers.h>

struct pinmux_mcux_lpc_config {
	clock_ip_name_t clock_ip_name;
	volatile uint32_t *base;
};

static int pinmux_mcux_lpc_set(const struct device *dev, uint32_t pin,
			       uint32_t func)
{
	const struct pinmux_mcux_lpc_config *config = dev->config;
	volatile uint32_t *base = config->base;

	base[pin] = func;

	return 0;
}

static int pinmux_mcux_lpc_get(const struct device *dev, uint32_t pin,
			       uint32_t *func)
{
	const struct pinmux_mcux_lpc_config *config = dev->config;
	volatile uint32_t *base = config->base;

	*func = base[pin];

	return 0;
}

static int pinmux_mcux_lpc_pullup(const struct device *dev, uint32_t pin,
				  uint8_t func)
{
	return -ENOTSUP;
}

static int pinmux_mcux_lpc_input(const struct device *dev, uint32_t pin,
				 uint8_t func)
{
	return -ENOTSUP;
}

static int pinmux_mcux_lpc_init(const struct device *dev)
{
#ifndef IOPCTL
	const struct pinmux_mcux_lpc_config *config = dev->config;

	CLOCK_EnableClock(config->clock_ip_name);
#endif

	return 0;
}

static const struct pinmux_driver_api pinmux_mcux_driver_api = {
	.set = pinmux_mcux_lpc_set,
	.get = pinmux_mcux_lpc_get,
	.pullup = pinmux_mcux_lpc_pullup,
	.input = pinmux_mcux_lpc_input,
};

#ifdef IOPCTL
#define LPC_CLOCK_IP_NAME kCLOCK_IpInvalid
#else
#define LPC_CLOCK_IP_NAME kCLOCK_Iocon
#endif

#define PINMUX_LPC_INIT(n)						\
	static const struct pinmux_mcux_lpc_config			\
		pinmux_mcux_lpc_port##n##_cfg = {			\
			.base = (uint32_t *)DT_INST_REG_ADDR(n),	\
			.clock_ip_name = LPC_CLOCK_IP_NAME,		\
		};							\
									\
	DEVICE_DT_INST_DEFINE(n,					\
			    &pinmux_mcux_lpc_init,			\
			    NULL,					\
			    NULL, &pinmux_mcux_lpc_port##n##_cfg,	\
			    PRE_KERNEL_1,				\
			    CONFIG_KERNEL_INIT_PRIORITY_DEFAULT,	\
			    &pinmux_mcux_driver_api);

DT_INST_FOREACH_STATUS_OKAY(PINMUX_LPC_INIT)
