/*
 * Copyright (c) 2019 Brett Witherspoon
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#define DT_DRV_COMPAT ti_cc13xx_cc26xx_pinmux

#include <device.h>
#include <errno.h>
#include <sys/__assert.h>
#include <drivers/pinmux.h>

#include <driverlib/ioc.h>

static int pinmux_cc13xx_cc26xx_set(const struct device *dev, uint32_t pin,
				    uint32_t func)
{
	ARG_UNUSED(dev);

	__ASSERT_NO_MSG(pin < NUM_IO_MAX);
	__ASSERT_NO_MSG(func < NUM_IO_PORTS);

	IOCIOPortIdSet(pin, func);

	return 0;
}

static int pinmux_cc13xx_cc26xx_get(const struct device *dev, uint32_t pin,
				    uint32_t *func)
{
	ARG_UNUSED(dev);

	__ASSERT_NO_MSG(pin < NUM_IO_MAX);

	*func = IOCPortConfigureGet(pin) & IOC_IOCFG0_PORT_ID_M;

	return 0;
}

static int pinmux_cc13xx_cc26xx_pullup(const struct device *dev, uint32_t pin,
				       uint8_t func)
{
	ARG_UNUSED(dev);

	__ASSERT_NO_MSG(pin < NUM_IO_MAX);

	switch (func) {
	case PINMUX_PULLUP_ENABLE:
		IOCIOPortPullSet(pin, IOC_IOPULL_UP);
		return 0;
	case PINMUX_PULLUP_DISABLE:
		IOCIOPortPullSet(pin, IOC_NO_IOPULL);
		return 0;
	};

	return -EINVAL;
}

static int pinmux_cc13xx_cc26xx_input(const struct device *dev, uint32_t pin,
				      uint8_t func)
{
	ARG_UNUSED(dev);

	__ASSERT_NO_MSG(pin < NUM_IO_MAX);

	switch (func) {
	case PINMUX_INPUT_ENABLED:
		IOCIOInputSet(pin, IOC_INPUT_ENABLE);
		return 0;
	case PINMUX_OUTPUT_ENABLED:
		IOCIOInputSet(pin, IOC_INPUT_DISABLE);
		return 0;
	};

	return -EINVAL;
}

static int pinmux_cc13xx_cc26xx_init(const struct device *dev)
{
	ARG_UNUSED(dev);
	return 0;
}

static const struct pinmux_driver_api pinmux_cc13xx_cc26xx_driver_api = {
	.set = pinmux_cc13xx_cc26xx_set,
	.get = pinmux_cc13xx_cc26xx_get,
	.pullup = pinmux_cc13xx_cc26xx_pullup,
	.input = pinmux_cc13xx_cc26xx_input,
};

DEVICE_DT_INST_DEFINE(0, &pinmux_cc13xx_cc26xx_init, device_pm_control_nop,
		    NULL, NULL, PRE_KERNEL_1,
		    CONFIG_KERNEL_INIT_PRIORITY_DEFAULT,
		    &pinmux_cc13xx_cc26xx_driver_api);
