/*
 * Copyright (c) 2019 Manivannan Sadhasivam
 * Copyright (c) 2020 Andreas Sandberg
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <drivers/gpio.h>
#include <zephyr.h>

#include "sx126x_common.h"

#include <logging/log.h>
LOG_MODULE_DECLARE(sx126x, CONFIG_LORA_LOG_LEVEL);

static const struct gpio_dt_spec sx126x_gpio_reset = GPIO_DT_SPEC_INST_GET(
		0, reset_gpios);
static const struct gpio_dt_spec sx126x_gpio_busy = GPIO_DT_SPEC_INST_GET(
		0, busy_gpios);
static const struct gpio_dt_spec sx126x_gpio_dio1 = GPIO_DT_SPEC_INST_GET(
		0, dio1_gpios);

void sx126x_reset(struct sx126x_data *dev_data)
{
	gpio_pin_set_dt(&sx126x_gpio_reset, 1);
	k_sleep(K_MSEC(20));
	gpio_pin_set_dt(&sx126x_gpio_reset, 0);
	k_sleep(K_MSEC(10));
}

bool sx126x_is_busy(struct sx126x_data *dev_data)
{
	return gpio_pin_get_dt(&sx126x_gpio_busy);
}

uint32_t sx126x_get_dio1_pin_state(struct sx126x_data *dev_data)
{
	return gpio_pin_get_dt(&sx126x_gpio_dio1) > 0 ? 1U : 0U;
}

void sx126x_dio1_irq_enable(struct sx126x_data *dev_data)
{
	gpio_pin_interrupt_configure_dt(&sx126x_gpio_dio1,
				     GPIO_INT_EDGE_TO_ACTIVE);
}

void sx126x_dio1_irq_disable(struct sx126x_data *dev_data)
{
	gpio_pin_interrupt_configure_dt(&sx126x_gpio_dio1,
				     GPIO_INT_DISABLE);
}

static void sx126x_dio1_irq_callback(const struct device *dev,
				     struct gpio_callback *cb, uint32_t pins)
{
	struct sx126x_data *dev_data = CONTAINER_OF(cb, struct sx126x_data,
						    dio1_irq_callback);

	if (pins & BIT(sx126x_gpio_dio1.pin)) {
		k_work_submit(&dev_data->dio1_irq_work);
	}
}

int sx126x_variant_init(const struct device *dev)
{
	struct sx126x_data *dev_data = dev->data;

	if (gpio_pin_configure_dt(&sx126x_gpio_reset, GPIO_OUTPUT_ACTIVE) ||
	    gpio_pin_configure_dt(&sx126x_gpio_busy, GPIO_INPUT) ||
	    gpio_pin_configure_dt(&sx126x_gpio_dio1,
				  GPIO_INPUT | GPIO_INT_DEBOUNCE)) {
		LOG_ERR("GPIO configuration failed.");
		return -EIO;
	}

	gpio_init_callback(&dev_data->dio1_irq_callback,
			   sx126x_dio1_irq_callback, BIT(sx126x_gpio_dio1.pin));
	if (gpio_add_callback(sx126x_gpio_dio1.port,
			      &dev_data->dio1_irq_callback) < 0) {
		LOG_ERR("Could not set GPIO callback for DIO1 interrupt.");
		return -EIO;
	}

	return 0;
}
