/*
 * Copyright (c) 2016 Freescale Semiconductor, Inc.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#define DT_DRV_COMPAT nxp_kinetis_pinmux

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

struct pinmux_mcux_config {
	clock_ip_name_t clock_ip_name;
	PORT_Type *base;
};

static int pinmux_mcux_set(const struct device *dev, uint32_t pin,
			   uint32_t func)
{
	const struct pinmux_mcux_config *config = dev->config;
	PORT_Type *base = config->base;

	base->PCR[pin] = func;

	return 0;
}

static int pinmux_mcux_get(const struct device *dev, uint32_t pin,
			   uint32_t *func)
{
	const struct pinmux_mcux_config *config = dev->config;
	PORT_Type *base = config->base;

	*func = base->PCR[pin];

	return 0;
}

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

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

static int pinmux_mcux_init(const struct device *dev)
{
	const struct pinmux_mcux_config *config = dev->config;

	CLOCK_EnableClock(config->clock_ip_name);

	return 0;
}

static const struct pinmux_driver_api pinmux_mcux_driver_api = {
	.set = pinmux_mcux_set,
	.get = pinmux_mcux_get,
	.pullup = pinmux_mcux_pullup,
	.input = pinmux_mcux_input,
};

#if DT_NODE_HAS_STATUS(DT_INST(0, nxp_kinetis_ke1xf_sim), okay)
#define INST_DT_CLOCK_IP_NAME(n) \
	DT_REG_ADDR(DT_INST_PHANDLE(n, clocks)) + DT_INST_CLOCKS_CELL(n, name)
#else
#define INST_DT_CLOCK_IP_NAME(n) \
	CLK_GATE_DEFINE(DT_INST_CLOCKS_CELL(n, offset), \
			DT_INST_CLOCKS_CELL(n, bits))
#endif

#define PINMUX_MCUX_INIT(n)						\
	static const struct pinmux_mcux_config pinmux_mcux_##n##_config = {\
		.base = (PORT_Type *)DT_INST_REG_ADDR(n),		\
		.clock_ip_name = INST_DT_CLOCK_IP_NAME(n),		\
	};								\
									\
	DEVICE_DT_INST_DEFINE(n,					\
			    &pinmux_mcux_init,				\
			    NULL,					\
			    NULL, &pinmux_mcux_##n##_config,		\
			    PRE_KERNEL_1,				\
			    CONFIG_KERNEL_INIT_PRIORITY_DEFAULT,	\
			    &pinmux_mcux_driver_api);

DT_INST_FOREACH_STATUS_OKAY(PINMUX_MCUX_INIT)
