blob: 2284e9d6190d303c233c225ab659e1382c24a8e1 [file] [log] [blame]
/*
* Copyright (c) 2020 Nuvoton Technology Corporation.
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef _NUVOTON_NPCX_SOC_MIWU_H_
#define _NUVOTON_NPCX_SOC_MIWU_H_
#include <stdint.h>
#include <zephyr/device.h>
#include <zephyr/drivers/gpio.h>
#ifdef __cplusplus
extern "C" {
#endif
enum miwu_table {
NPCX_MIWU_TABLE_0,
NPCX_MIWU_TABLE_1,
NPCX_MIWU_TABLE_2,
NPCX_MIWU_TABLE_COUNT
};
enum miwu_group {
NPCX_MIWU_GROUP_1,
NPCX_MIWU_GROUP_2,
NPCX_MIWU_GROUP_3,
NPCX_MIWU_GROUP_4,
NPCX_MIWU_GROUP_5,
NPCX_MIWU_GROUP_6,
NPCX_MIWU_GROUP_7,
NPCX_MIWU_GROUP_8,
NPCX_MIWU_GROUP_COUNT
};
#define NPCX_MIWU_TABLE_NONE NPCX_MIWU_TABLE_COUNT
/* Interrupt modes supported by npcx miwu modules */
enum miwu_int_mode {
NPCX_MIWU_MODE_LEVEL,
NPCX_MIWU_MODE_EDGE,
};
/* Interrupt trigger modes supported by npcx miwu modules */
enum miwu_int_trig {
NPCX_MIWU_TRIG_LOW, /** Edge failing or active low detection */
NPCX_MIWU_TRIG_HIGH, /** Edge rising or active high detection */
NPCX_MIWU_TRIG_BOTH, /** Both edge rising and failing detection */
};
/* NPCX miwu driver callback type */
enum {
NPCX_MIWU_CALLBACK_GPIO,
NPCX_MIWU_CALLBACK_DEV,
};
/**
* @brief NPCX wake-up input source structure
*
* Used to indicate a Wake-Up Input source (WUI) belongs to which group and bit
* of Multi-Input Wake-Up Unit (MIWU) modules.
*/
struct npcx_wui {
uint8_t table:2; /** A source belongs to which MIWU table. */
uint8_t group:3; /** A source belongs to which group of MIWU table. */
uint8_t bit:3; /** A source belongs to which bit of MIWU group. */
};
/**
* Define npcx miwu driver callback handler signature for wake-up input source
* of generic hardware. Its parameters contain the device issued interrupt
* and corresponding WUI source.
*/
typedef void (*miwu_dev_callback_handler_t)(const struct device *source,
struct npcx_wui *wui);
/**
* @brief MIWU/GPIO information structure
*
* It contains both GPIO and MIWU information which is stored in unused field
* of struct gpio_port_pins_t since a interested mask of pins is only 8 bits.
* Beware the size of such structure must equal struct gpio_port_pins_t.
*/
struct miwu_io_params {
uint8_t pin_mask; /** A mask of pins the callback is interested in. */
uint8_t gpio_port; /** GPIO device index */
uint8_t cb_type; /** Callback type */
struct npcx_wui wui; /** Wake-up input source of GPIO */
};
/**
* @brief MIWU/generic device information structure
*
* It contains the information used for MIWU generic device event. Please notice
* the offset of cb_type must be the same as cb_type in struct miwu_io_params.
*/
struct miwu_dev_params {
uint8_t reserve1;
uint8_t reserve2;
uint8_t cb_type; /** Callback type */
struct npcx_wui wui; /** Device instance register callback function */
const struct device *source; /** Wake-up input source */
};
/**
* @brief MIWU callback structure for a gpio or device input
*
* Used to register a generic gpio/device callback in the driver instance
* callback list. Beware such structure should not be allocated on stack.
*
* Note: To help setting it, see npcx_miwu_init_dev_callback() and
* npcx_miwu_manage_callback() below
*/
struct miwu_callback {
/** Node of single-linked list */
sys_snode_t node;
union {
struct {
/** Callback function being called when GPIO event occurred */
gpio_callback_handler_t handler;
struct miwu_io_params params;
} io_cb;
struct {
/** Callback function being called when device event occurred */
miwu_dev_callback_handler_t handler;
struct miwu_dev_params params;
} dev_cb;
};
};
/**
* @brief Enable interrupt of the wake-up input source
*
* @param A pointer on wake-up input source
*/
void npcx_miwu_irq_enable(const struct npcx_wui *wui);
/**
* @brief Disable interrupt of the wake-up input source
*
* @param wui A pointer on wake-up input source
*/
void npcx_miwu_irq_disable(const struct npcx_wui *wui);
/**
* @brief Connect io to the wake-up input source
*
* @param wui A pointer on wake-up input source
*/
void npcx_miwu_io_enable(const struct npcx_wui *wui);
/**
* @brief Disconnect io to the wake-up input source
*
* @param wui A pointer on wake-up input source
*/
void npcx_miwu_io_disable(const struct npcx_wui *wui);
/**
* @brief Get interrupt state of the wake-up input source
*
* @param wui A pointer on wake-up input source
*
* @retval 0 if interrupt is disabled, otherwise interrupt is enabled
*/
bool npcx_miwu_irq_get_state(const struct npcx_wui *wui);
/**
* @brief Get & clear interrupt pending bit of the wake-up input source
*
* @param wui A pointer on wake-up input source
*
* @retval 1 if interrupt is pending
*/
bool npcx_miwu_irq_get_and_clear_pending(const struct npcx_wui *wui);
/**
* @brief Configure interrupt type of the wake-up input source
*
* @param wui Pointer to wake-up input source for configuring
* @param mode Interrupt mode supported by NPCX MIWU
* @param trig Interrupt trigger mode supported by NPCX MIWU
*
* @retval 0 If successful
* @retval -EINVAL Invalid parameters
*/
int npcx_miwu_interrupt_configure(const struct npcx_wui *wui,
enum miwu_int_mode mode, enum miwu_int_trig trig);
/**
* @brief Function to initialize a struct miwu_callback with gpio properly
*
* @param callback Pointer to io callback structure for initialization
* @param io_wui Pointer to wake-up input IO source
* @param port GPIO port issued a callback function
*/
void npcx_miwu_init_gpio_callback(struct miwu_callback *callback,
const struct npcx_wui *io_wui, int port);
/**
* @brief Function to initialize a struct miwu_callback with device properly
*
* @param callback Pointer to device callback structure for initialization
* @param dev_wui Pointer to wake-up input device source
* @param handler A function called when its device input event issued
* @param source Pointer to device instance issued a callback function
*/
void npcx_miwu_init_dev_callback(struct miwu_callback *callback,
const struct npcx_wui *dev_wui,
miwu_dev_callback_handler_t handler,
const struct device *source);
/**
* @brief Function to insert or remove a miwu callback from a callback list
*
* @param callback Pointer to miwu callback structure
* @param set A boolean indicating insertion or removal of the callback
*
* @retval 0 If successful.
* @retval -EINVAL Invalid parameters
*/
int npcx_miwu_manage_callback(struct miwu_callback *cb, bool set);
#ifdef __cplusplus
}
#endif
#endif /* _NUVOTON_NPCX_SOC_MIWU_H_ */