/* * 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 #include #include #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_ */