diff --git a/drivers/clock_control/nrf_power_clock.c b/drivers/clock_control/nrf_power_clock.c index 67f92123e77..2ac3d1439bb 100644 --- a/drivers/clock_control/nrf_power_clock.c +++ b/drivers/clock_control/nrf_power_clock.c @@ -11,7 +11,6 @@ #include #include "nrf_clock_calibration.h" #include -#include #include #include @@ -504,29 +503,6 @@ static void clock_event_handler(nrfx_clock_evt_type_t event) } } -#if defined(CONFIG_USB_NRFX) - -static void usb_event_handler(nrfx_power_usb_evt_t event) -{ - extern void usb_dc_nrfx_power_event_callback(nrf_power_event_t evt); - - switch (event) { - case NRFX_POWER_USB_EVT_DETECTED: - usb_dc_nrfx_power_event_callback(NRF_POWER_EVENT_USBDETECTED); - break; - case NRFX_POWER_USB_EVT_REMOVED: - usb_dc_nrfx_power_event_callback(NRF_POWER_EVENT_USBREMOVED); - break; - case NRFX_POWER_USB_EVT_READY: - usb_dc_nrfx_power_event_callback(NRF_POWER_EVENT_USBPWRRDY); - break; - default: - __ASSERT_NO_MSG(0); - break; - } -} -#endif - static int clk_init(struct device *dev) { nrfx_err_t nrfx_err; @@ -540,15 +516,6 @@ static int clk_init(struct device *dev) nrfx_isr, nrfx_power_clock_irq_handler, 0); irq_enable(DT_INST_IRQN(0)); -#if defined(CONFIG_USB_NRFX) && defined(CONFIG_SOC_SERIES_NRF53X) - /* Use CLOCK/POWER priority for compatibility with other series where - * USB events are handled by CLOCK interrupt handler. - */ - IRQ_CONNECT(USBREGULATOR_IRQn, DT_INST_IRQ(0, priority), - nrfx_usbreg_irq_handler, 0, 0); - irq_enable(USBREGULATOR_IRQn); -#endif - nrfx_err = nrfx_clock_init(clock_event_handler); if (nrfx_err != NRFX_SUCCESS) { return -EIO; @@ -562,12 +529,6 @@ static int clk_init(struct device *dev) nrfx_clock_enable(); - static const nrfx_power_usbevt_config_t config = { - .handler = usb_event_handler - }; - - nrfx_power_usbevt_init(&config); - for (enum clock_control_nrf_type i = 0; i < CLOCK_CONTROL_NRF_TYPE_COUNT; i++) { struct nrf_clock_control_sub_data *subdata = @@ -614,17 +575,6 @@ DEVICE_AND_API_INIT(clock_nrf, DT_INST_LABEL(0), CONFIG_KERNEL_INIT_PRIORITY_DEVICE, &clock_control_api); -#ifdef CONFIG_USB_NRFX -void nrf5_power_usb_power_int_enable(bool enable) -{ - if (enable) { - nrfx_power_usbevt_enable(); - } else { - nrfx_power_usbevt_disable(); - } -} -#endif - static int cmd_status(const struct shell *shell, size_t argc, char **argv) { nrf_clock_hfclk_t hfclk_src; diff --git a/drivers/usb/device/Kconfig b/drivers/usb/device/Kconfig index 7db1c49ad31..ac96409892c 100644 --- a/drivers/usb/device/Kconfig +++ b/drivers/usb/device/Kconfig @@ -54,6 +54,7 @@ menuconfig USB_NRFX select USB_DEVICE_DRIVER select NRFX_USBD select USB_DEVICE_DISABLE_ZLP_EPIN_HANDLING + select NRFX_USBREG if SOC_SERIES_NRF53X help nRF USB Device Controller Driver diff --git a/drivers/usb/device/usb_dc_nrfx.c b/drivers/usb/device/usb_dc_nrfx.c index 681ff040e6d..25a9cb70beb 100644 --- a/drivers/usb/device/usb_dc_nrfx.c +++ b/drivers/usb/device/usb_dc_nrfx.c @@ -20,9 +20,9 @@ #include #include #include -#include #include #include +#include #define LOG_LEVEL CONFIG_USB_DRIVER_LOG_LEVEL @@ -493,22 +493,22 @@ static inline struct usbd_event *usbd_evt_alloc(void) return ev; } -void usb_dc_nrfx_power_event_callback(nrf_power_event_t event) +static void usb_dc_power_event_handler(nrfx_power_usb_evt_t event) { enum usbd_periph_state new_state; switch (event) { - case NRF_POWER_EVENT_USBDETECTED: + case NRFX_POWER_USB_EVT_DETECTED: new_state = USBD_ATTACHED; break; - case NRF_POWER_EVENT_USBPWRRDY: + case NRFX_POWER_USB_EVT_READY: new_state = USBD_POWERED; break; - case NRF_POWER_EVENT_USBREMOVED: + case NRFX_POWER_USB_EVT_REMOVED: new_state = USBD_DETACHED; break; default: - LOG_ERR("Unknown USB power event"); + LOG_ERR("Unknown USB power event %d", event); return; } @@ -1205,19 +1205,20 @@ static inline void usbd_reinit(void) int ret; nrfx_err_t err; - nrf5_power_usb_power_int_enable(false); + nrfx_power_usbevt_disable(); nrfx_usbd_disable(); nrfx_usbd_uninit(); usbd_evt_flush(); + ret = eps_ctx_init(); __ASSERT_NO_MSG(ret == 0); - nrf5_power_usb_power_int_enable(true); + nrfx_power_usbevt_enable(); err = nrfx_usbd_init(usbd_event_handler); if (err != NRFX_SUCCESS) { - LOG_DBG("nRF USBD driver reinit failed. Code: %d", (uint32_t)err); + LOG_DBG("nRF USBD driver reinit failed. Code: %d", err); __ASSERT_NO_MSG(0); } } @@ -1351,7 +1352,7 @@ int usb_dc_attach(void) LOG_DBG("nRF USBD driver init failed. Code: %d", (uint32_t)err); return -EIO; } - nrf5_power_usb_power_int_enable(true); + nrfx_power_usbevt_enable(); ret = eps_ctx_init(); if (ret == 0) { @@ -1362,7 +1363,7 @@ int usb_dc_attach(void) usbd_work_schedule(); } - if (nrf_power_usbregstatus_vbusdet_get(NRF_POWER)) { + if (nrfx_power_usbstatus_get() != NRFX_POWER_USB_STATE_DISCONNECTED) { /* USBDETECTED event is be generated on cable attachment and * when cable is already attached during reset, but not when * the peripheral is re-enabled. @@ -1370,7 +1371,7 @@ int usb_dc_attach(void) * will not receive this event and it needs to be generated * again here. */ - usb_dc_nrfx_power_event_callback(NRF_POWER_EVENT_USBDETECTED); + usb_dc_power_event_handler(NRFX_POWER_USB_EVT_DETECTED); } return ret; @@ -1394,7 +1395,7 @@ int usb_dc_detach(void) } (void)hfxo_stop(ctx); - nrf5_power_usb_power_int_enable(false); + nrfx_power_usbevt_disable(); ctx->attached = false; k_mutex_unlock(&ctx->drv_lock); @@ -1923,3 +1924,29 @@ int usb_dc_wakeup_request(void) } return 0; } + +static int usb_init(struct device *arg) +{ + +#ifdef CONFIG_SOC_SERIES_NRF53X + #undef DT_DRV_COMPAT + #define DT_DRV_COMPAT nordic_nrf_clock + + /* Use CLOCK/POWER priority for compatibility with other series where + * USB events are handled by CLOCK interrupt handler. + */ + IRQ_CONNECT(USBREGULATOR_IRQn, DT_INST_IRQ(0, priority), + nrfx_usbreg_irq_handler, 0, 0); + irq_enable(USBREGULATOR_IRQn); +#endif + + static const nrfx_power_usbevt_config_t config = { + .handler = usb_dc_power_event_handler + }; + + nrfx_power_usbevt_init(&config); + + return 0; +} + +SYS_INIT(usb_init, PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_DEVICE); diff --git a/include/drivers/clock_control/nrf_clock_control.h b/include/drivers/clock_control/nrf_clock_control.h index af055fa1151..0b837594002 100644 --- a/include/drivers/clock_control/nrf_clock_control.h +++ b/include/drivers/clock_control/nrf_clock_control.h @@ -80,10 +80,6 @@ enum nrf_lfclk_start_mode { #define CLOCK_CONTROL_NRF_K32SRC_ACCURACY 7 #endif -#if defined(CONFIG_USB_NRFX) -void nrf5_power_usb_power_int_enable(bool enable); -#endif - /** @brief Force LF clock calibration. */ void z_nrf_clock_calibration_force_start(void);