From d410231c7ca4ff6e6fe07c5f502c97e90b421a01 Mon Sep 17 00:00:00 2001 From: Ren Chen Date: Mon, 19 Aug 2024 10:21:40 +0800 Subject: [PATCH] usb: it82xx2: enable RESUME interrupt This commit enables RESUME interrupt mask. Signed-off-by: Ren Chen --- drivers/usb/device/usb_dc_it82xx2.c | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/drivers/usb/device/usb_dc_it82xx2.c b/drivers/usb/device/usb_dc_it82xx2.c index 3cf17e7f08a..d0b59f15e75 100644 --- a/drivers/usb/device/usb_dc_it82xx2.c +++ b/drivers/usb/device/usb_dc_it82xx2.c @@ -512,11 +512,11 @@ static int it82xx2_usb_dc_ip_init(void) usb_regs->host_device_control = 0; usb_regs->dc_interrupt_status = - DC_TRANS_DONE | DC_RESET_EVENT | DC_SOF_RECEIVED; + DC_TRANS_DONE | DC_RESET_EVENT | DC_SOF_RECEIVED | DC_RESUME_INT; usb_regs->dc_interrupt_mask = 0x00; usb_regs->dc_interrupt_mask = - DC_TRANS_DONE | DC_RESET_EVENT | DC_SOF_RECEIVED; + DC_TRANS_DONE | DC_RESET_EVENT | DC_SOF_RECEIVED | DC_RESUME_INT; usb_regs->dc_address = DC_ADDR_NULL; @@ -834,6 +834,17 @@ static void it82xx2_usb_dc_trans_done(void) } } +static inline void emit_resume_event(void) +{ + if (udata0.suspended) { + udata0.suspended = false; + k_sem_give(&udata0.suspended_sem); + if (udata0.usb_status_cb) { + (*(udata0.usb_status_cb))(USB_DC_RESUME, NULL); + } + } +} + static void it82xx2_usb_dc_isr(void) { struct usb_it82xx2_regs *const usb_regs = it82xx2_get_usb_regs(); @@ -855,8 +866,14 @@ static void it82xx2_usb_dc_isr(void) /* sof received */ if (status & DC_SOF_RECEIVED) { it82xx2_enable_sof_int(false); + emit_resume_event(); k_work_reschedule(&udata0.check_suspended_work, K_MSEC(5)); } + /* resume received */ + if (status & DC_RESUME_INT) { + usb_regs->dc_interrupt_status = DC_RESUME_INT; + emit_resume_event(); + } /* transaction done */ if (status & DC_TRANS_DONE) { /* clear interrupt before new transaction */ @@ -877,13 +894,6 @@ static void suspended_check_handler(struct k_work *item) if (usb_regs->dc_interrupt_status & DC_SOF_RECEIVED) { usb_regs->dc_interrupt_status = DC_SOF_RECEIVED; - if (udata->suspended) { - if (udata->usb_status_cb) { - (*(udata->usb_status_cb))(USB_DC_RESUME, NULL); - } - udata->suspended = false; - k_sem_give(&udata->suspended_sem); - } k_work_reschedule(&udata->check_suspended_work, K_MSEC(5)); return; }