From abb94b1198ec6ce618f61dff367275f96cad4eca Mon Sep 17 00:00:00 2001 From: Wealian Liao Date: Mon, 19 Apr 2021 15:31:51 +0800 Subject: [PATCH] soc: power: npcx: Clear host access IRQ pending bit before enabling NPCX host access IRQ enables before entering deep sleep. The pending bit lets chip wake up from sleep immediately. Clear host access IRQ pending bit before enabling. Signed-off-by: Wealian Liao --- drivers/espi/host_subs_npcx.c | 2 ++ drivers/interrupt_controller/intc_miwu.c | 12 ++++++++++++ soc/arm/nuvoton_npcx/common/soc_miwu.h | 9 +++++++++ 3 files changed, 23 insertions(+) diff --git a/drivers/espi/host_subs_npcx.c b/drivers/espi/host_subs_npcx.c index b1bea00f7b8..2c6cc4afeb8 100644 --- a/drivers/espi/host_subs_npcx.c +++ b/drivers/espi/host_subs_npcx.c @@ -964,6 +964,8 @@ void npcx_host_init_subs_host_domain(void) void npcx_host_enable_access_interrupt(void) { + npcx_miwu_irq_get_and_clear_pending(&host_sub_cfg.host_acc_wui); + npcx_miwu_irq_enable(&host_sub_cfg.host_acc_wui); } diff --git a/drivers/interrupt_controller/intc_miwu.c b/drivers/interrupt_controller/intc_miwu.c index 29ee1a7d1b8..541a6ecf1ec 100644 --- a/drivers/interrupt_controller/intc_miwu.c +++ b/drivers/interrupt_controller/intc_miwu.c @@ -177,6 +177,18 @@ bool npcx_miwu_irq_get_state(const struct npcx_wui *wui) return IS_BIT_SET(NPCX_WKEN(base, wui->group), wui->bit); } +bool npcx_miwu_irq_get_and_clear_pending(const struct npcx_wui *wui) +{ + const uint32_t base = DRV_CONFIG(miwu_devs[wui->table])->base; + bool pending = IS_BIT_SET(NPCX_WKPND(base, wui->group), wui->bit); + + if (pending) { + NPCX_WKPCL(base, wui->group) = BIT(wui->bit); + } + + return pending; +} + int npcx_miwu_interrupt_configure(const struct npcx_wui *wui, enum miwu_int_mode mode, enum miwu_int_trig trig) { diff --git a/soc/arm/nuvoton_npcx/common/soc_miwu.h b/soc/arm/nuvoton_npcx/common/soc_miwu.h index c044299d6b8..e797e285618 100644 --- a/soc/arm/nuvoton_npcx/common/soc_miwu.h +++ b/soc/arm/nuvoton_npcx/common/soc_miwu.h @@ -139,6 +139,15 @@ void npcx_miwu_irq_disable(const struct npcx_wui *wui); */ 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 *