/*
 * Copyright (c) 2020 - 2021 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <platform/nrf_802154_gpiote.h>

#include <stdbool.h>
#include <stdint.h>

#include <zephyr/sys/__assert.h>
#include <zephyr/device.h>
#include <zephyr/toolchain.h>
#include <zephyr/drivers/gpio.h>

#include <hal/nrf_gpio.h>
#include <nrf_802154_sl_coex.h>
#include <nrf_802154_sl_utils.h>

static const struct device *dev;
static struct gpio_callback grant_cb;
static uint32_t pin_number = COEX_GPIO_PIN_INVALID;

static void gpiote_irq_handler(const struct device *gpiob, struct gpio_callback *cb,
			       uint32_t pins)
{
	ARG_UNUSED(gpiob);
	ARG_UNUSED(cb);
	ARG_UNUSED(pins);

	nrf_802154_wifi_coex_gpiote_irqhandler();
}

void nrf_802154_gpiote_init(void)
{
	switch (nrf_802154_wifi_coex_interface_type_id_get()) {
	case NRF_802154_WIFI_COEX_IF_NONE:
		return;

	case NRF_802154_WIFI_COEX_IF_3WIRE: {
		nrf_802154_wifi_coex_3wire_if_config_t cfg;

		nrf_802154_wifi_coex_cfg_3wire_get(&cfg);

		pin_number = cfg.grant_cfg.gpio_pin;
		__ASSERT_NO_MSG(pin_number != COEX_GPIO_PIN_INVALID);

		bool use_port_1 = (pin_number > P0_PIN_NUM);

		/* Convert to the Zephyr primitive */
		pin_number = use_port_1 ? pin_number - P0_PIN_NUM : pin_number;

		uint32_t pull_up_down = cfg.grant_cfg.active_high ?
					GPIO_PULL_UP :
					GPIO_PULL_DOWN;

#if DT_NODE_HAS_STATUS(DT_NODELABEL(gpio1), okay)
		if (use_port_1) {
			dev = DEVICE_DT_GET(DT_NODELABEL(gpio1));
		} else {
			dev = DEVICE_DT_GET(DT_NODELABEL(gpio0));
		}
#else
		dev = DEVICE_DT_GET(DT_NODELABEL(gpio0));
#endif
		__ASSERT_NO_MSG(device_is_ready(dev));

		gpio_pin_configure(dev, pin_number, GPIO_INPUT | pull_up_down);

		gpio_init_callback(&grant_cb, gpiote_irq_handler,
				   BIT(pin_number));
		gpio_add_callback(dev, &grant_cb);

		gpio_pin_interrupt_configure(dev, pin_number,
					     GPIO_INT_EDGE_BOTH);
		break;
	}

	default:
		__ASSERT_NO_MSG(false);
	}
}

void nrf_802154_gpiote_deinit(void)
{
	switch (nrf_802154_wifi_coex_interface_type_id_get()) {
	case NRF_802154_WIFI_COEX_IF_NONE:
		break;

	case NRF_802154_WIFI_COEX_IF_3WIRE:
		gpio_pin_interrupt_configure(dev, pin_number, GPIO_INT_DISABLE);
		gpio_remove_callback(dev, &grant_cb);
		pin_number = COEX_GPIO_PIN_INVALID;
		break;

	default:
		__ASSERT_NO_MSG(false);
	}
}
