Skip to content

Commit dc2aeea

Browse files
tmon-nordicjukkar
authored andcommitted
[nrf fromtree] drivers: udc_nrf: Handle Suspend and Resume in thread
Low Power mode can only be entered when there are no active DMA transfers. Move the Suspend and Resume processing to thread to allow waiting for the DMA available semaphore in USB Suspend handler. Signed-off-by: Tomasz Moń <[email protected]> (cherry picked from commit 4dfae0b) (cherry picked from commit 52c6c7d)
1 parent 1eed7bf commit dc2aeea

File tree

1 file changed

+19
-16
lines changed

1 file changed

+19
-16
lines changed

drivers/usb/udc/udc_nrf.c

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,22 @@ static void udc_nrf_thread(void *p1, void *p2, void *p3)
443443
case UDC_NRF_EVT_HAL:
444444
ep = evt.hal_evt.data.eptransfer.ep;
445445
switch (evt.hal_evt.type) {
446+
case NRF_USBD_COMMON_EVT_SUSPEND:
447+
LOG_INF("SUSPEND state detected");
448+
nrf_usbd_common_suspend();
449+
udc_set_suspended(udc_nrf_dev, true);
450+
udc_submit_event(udc_nrf_dev, UDC_EVT_SUSPEND, 0);
451+
break;
452+
case NRF_USBD_COMMON_EVT_RESUME:
453+
LOG_INF("RESUMING from suspend");
454+
udc_set_suspended(udc_nrf_dev, false);
455+
udc_submit_event(udc_nrf_dev, UDC_EVT_RESUME, 0);
456+
break;
457+
case NRF_USBD_COMMON_EVT_WUREQ:
458+
LOG_INF("Remote wakeup initiated");
459+
udc_set_suspended(udc_nrf_dev, false);
460+
udc_submit_event(udc_nrf_dev, UDC_EVT_RESUME, 0);
461+
break;
446462
case NRF_USBD_COMMON_EVT_EPTRANSFER:
447463
start_xfer = true;
448464
if (USB_EP_DIR_IS_IN(ep)) {
@@ -499,22 +515,6 @@ static void udc_sof_check_iso_out(const struct device *dev)
499515
static void usbd_event_handler(nrf_usbd_common_evt_t const *const hal_evt)
500516
{
501517
switch (hal_evt->type) {
502-
case NRF_USBD_COMMON_EVT_SUSPEND:
503-
LOG_INF("SUSPEND state detected");
504-
nrf_usbd_common_suspend();
505-
udc_set_suspended(udc_nrf_dev, true);
506-
udc_submit_event(udc_nrf_dev, UDC_EVT_SUSPEND, 0);
507-
break;
508-
case NRF_USBD_COMMON_EVT_RESUME:
509-
LOG_INF("RESUMING from suspend");
510-
udc_set_suspended(udc_nrf_dev, false);
511-
udc_submit_event(udc_nrf_dev, UDC_EVT_RESUME, 0);
512-
break;
513-
case NRF_USBD_COMMON_EVT_WUREQ:
514-
LOG_INF("Remote wakeup initiated");
515-
udc_set_suspended(udc_nrf_dev, false);
516-
udc_submit_event(udc_nrf_dev, UDC_EVT_RESUME, 0);
517-
break;
518518
case NRF_USBD_COMMON_EVT_RESET:
519519
LOG_INF("Reset");
520520
udc_submit_event(udc_nrf_dev, UDC_EVT_RESET, 0);
@@ -523,6 +523,9 @@ static void usbd_event_handler(nrf_usbd_common_evt_t const *const hal_evt)
523523
udc_submit_event(udc_nrf_dev, UDC_EVT_SOF, 0);
524524
udc_sof_check_iso_out(udc_nrf_dev);
525525
break;
526+
case NRF_USBD_COMMON_EVT_SUSPEND:
527+
case NRF_USBD_COMMON_EVT_RESUME:
528+
case NRF_USBD_COMMON_EVT_WUREQ:
526529
case NRF_USBD_COMMON_EVT_EPTRANSFER:
527530
case NRF_USBD_COMMON_EVT_SETUP: {
528531
struct udc_nrf_evt evt = {

0 commit comments

Comments
 (0)