blob: 55a9dcec343000d84ecb95cfa6bc8c99fa2b33c9 [file] [log] [blame]
/*
* 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_EXISTS(DT_NODELABEL(gpio1))
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);
}
}