From 928a6623d9f0c3921d7a4ea96c8cb77d79d5ebe1 Mon Sep 17 00:00:00 2001 From: Aleksander Strzebonski Date: Fri, 6 Sep 2024 17:23:04 +0200 Subject: [PATCH 1/2] [nrf fromtree] usb: dwc2: Allow for enabling USB if the cable is disconnected Adds CONFIG_UDC_DWC2_USBHS_VBUS_READY_TIMEOUT_MS that allows for waiting for a USBHS VBUS ready event for a specified amount of time. Earlier it waited forever and because of that, the udc_enable() was blocked forever if the USB cable was disconnected. Now the function returns error on timeout. Signed-off-by: Aleksander Strzebonski (cherry picked from commit 18fb3f9a329ade44495983206a5263f7aa2a84a4) --- drivers/usb/udc/Kconfig.dwc2 | 10 ++++++++++ drivers/usb/udc/udc_dwc2_vendor_quirks.h | 14 ++++++++++++-- include/zephyr/drivers/usb/udc.h | 1 + 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/drivers/usb/udc/Kconfig.dwc2 b/drivers/usb/udc/Kconfig.dwc2 index 4c023cfb04d..2f40c8f71a2 100644 --- a/drivers/usb/udc/Kconfig.dwc2 +++ b/drivers/usb/udc/Kconfig.dwc2 @@ -38,3 +38,13 @@ config UDC_DWC2_THREAD_PRIORITY default 8 help DWC2 driver thread priority. + +config UDC_DWC2_USBHS_VBUS_READY_TIMEOUT + int "UDC DWC2 USBHS VBUS ready event timeout in ms" + depends on UDC_DWC2 + depends on NRFS_HAS_VBUS_DETECTOR_SERVICE + default 0 + help + UDC DWC2 USBHS VBUS ready event timeout. If the VBUS is not ready + and the Nordic USBHS controller is used, the udc_enable() is + blocked for this amount of time. Set it to zero to wait forever. diff --git a/drivers/usb/udc/udc_dwc2_vendor_quirks.h b/drivers/usb/udc/udc_dwc2_vendor_quirks.h index 84d912f9fdb..d12d64ef848 100644 --- a/drivers/usb/udc/udc_dwc2_vendor_quirks.h +++ b/drivers/usb/udc/udc_dwc2_vendor_quirks.h @@ -121,7 +121,8 @@ DT_INST_FOREACH_STATUS_OKAY(QUIRK_STM32F4_FSOTG_DEFINE) * On USBHS, we cannot access the DWC2 register until VBUS is detected and * valid. If the user tries to force usbd_enable() and the corresponding * udc_enable() without a "VBUS ready" notification, the event wait will block - * until a valid VBUS signal is detected. + * until a valid VBUS signal is detected or until the + * CONFIG_UDC_DWC2_USBHS_VBUS_READY_TIMEOUT timeout expires. */ static K_EVENT_DEFINE(usbhs_events); #define USBHS_VBUS_READY BIT(0) @@ -182,10 +183,19 @@ static inline int usbhs_enable_nrfs_service(const struct device *dev) static inline int usbhs_enable_core(const struct device *dev) { NRF_USBHS_Type *wrapper = USBHS_DT_WRAPPER_REG_ADDR(0); + k_timeout_t timeout = K_FOREVER; + + #if CONFIG_NRFS_HAS_VBUS_DETECTOR_SERVICE + if (CONFIG_UDC_DWC2_USBHS_VBUS_READY_TIMEOUT) { + timeout = K_MSEC(CONFIG_UDC_DWC2_USBHS_VBUS_READY_TIMEOUT); + } + #endif if (!k_event_wait(&usbhs_events, USBHS_VBUS_READY, false, K_NO_WAIT)) { LOG_WRN("VBUS is not ready, block udc_enable()"); - k_event_wait(&usbhs_events, USBHS_VBUS_READY, false, K_FOREVER); + if (!k_event_wait(&usbhs_events, USBHS_VBUS_READY, false, timeout)) { + return -ETIMEDOUT; + } } wrapper->ENABLE = USBHS_ENABLE_PHY_Msk | USBHS_ENABLE_CORE_Msk; diff --git a/include/zephyr/drivers/usb/udc.h b/include/zephyr/drivers/usb/udc.h index 7910d8cfd8f..15b99cf5251 100644 --- a/include/zephyr/drivers/usb/udc.h +++ b/include/zephyr/drivers/usb/udc.h @@ -371,6 +371,7 @@ int udc_init(const struct device *dev, * @return 0 on success, all other values should be treated as error. * @retval -EPERM controller is not initialized * @retval -EALREADY already enabled + * @retval -ETIMEDOUT enable operation timed out */ int udc_enable(const struct device *dev); From d1c3d67163dffaa23814067fc8c2f3e7f1fa8d90 Mon Sep 17 00:00:00 2001 From: Rafal Dyla Date: Tue, 1 Oct 2024 09:18:42 +0200 Subject: [PATCH 2/2] [nrf fromtree] modules: hal_nordic: Add GD power request service Service for powering peripherals that use GPIO pins in the global power domains: - Active Fast - Active Slow - Main Slow Upstream PR: https://github.com/zephyrproject-rtos/zephyr/pull/79264 Signed-off-by: Rafal Dyla (cherry picked from commit ec77fc399cb15a7bc2b49c9713ad9e0c1048d697) --- modules/hal_nordic/nrfs/CMakeLists.txt | 1 + modules/hal_nordic/nrfs/Kconfig | 9 +++++++++ modules/hal_nordic/nrfs/nrfs_config.h | 4 ++++ soc/nordic/nrf54h/Kconfig | 2 ++ soc/nordic/nrf92/Kconfig | 2 ++ west.yml | 2 +- 6 files changed, 19 insertions(+), 1 deletion(-) diff --git a/modules/hal_nordic/nrfs/CMakeLists.txt b/modules/hal_nordic/nrfs/CMakeLists.txt index c601b8a4233..f470eea00e9 100644 --- a/modules/hal_nordic/nrfs/CMakeLists.txt +++ b/modules/hal_nordic/nrfs/CMakeLists.txt @@ -25,6 +25,7 @@ if(CONFIG_NRFS) zephyr_library_sources_ifdef(CONFIG_NRFS_CLOCK_SERVICE_ENABLED ${SRC_DIR}/services/nrfs_clock.c) zephyr_library_sources_ifdef(CONFIG_NRFS_DIAG_SERVICE_ENABLED ${SRC_DIR}/services/nrfs_diag.c) zephyr_library_sources_ifdef(CONFIG_NRFS_DVFS_SERVICE_ENABLED ${SRC_DIR}/services/nrfs_dvfs.c) + zephyr_library_sources_ifdef(CONFIG_NRFS_GDPWR_SERVICE_ENABLED ${SRC_DIR}/services/nrfs_gdpwr.c) zephyr_library_sources_ifdef(CONFIG_NRFS_MRAM_SERVICE_ENABLED ${SRC_DIR}/services/nrfs_mram.c) zephyr_library_sources_ifdef(CONFIG_NRFS_PMIC_SERVICE_ENABLED ${SRC_DIR}/services/nrfs_pmic.c) zephyr_library_sources_ifdef(CONFIG_NRFS_RESET_SERVICE_ENABLED ${SRC_DIR}/services/nrfs_reset.c) diff --git a/modules/hal_nordic/nrfs/Kconfig b/modules/hal_nordic/nrfs/Kconfig index cf7c9be939b..3eee664e480 100644 --- a/modules/hal_nordic/nrfs/Kconfig +++ b/modules/hal_nordic/nrfs/Kconfig @@ -19,6 +19,9 @@ config NRFS_HAS_DIAG_SERVICE config NRFS_HAS_DVFS_SERVICE bool +config NRFS_HAS_GDPWR_SERVICE + bool + config NRFS_HAS_MRAM_SERVICE bool @@ -113,6 +116,12 @@ config NRFS_CLOCK_SERVICE_ENABLED bool "Clock service" depends on NRFS_HAS_CLOCK_SERVICE default y + +config NRFS_GDPWR_SERVICE_ENABLED + bool "Global domain power request service" + depends on NRFS_HAS_GDPWR_SERVICE + default y + endmenu rsource "backends/Kconfig" diff --git a/modules/hal_nordic/nrfs/nrfs_config.h b/modules/hal_nordic/nrfs/nrfs_config.h index 20cf6cece0e..a092adb7850 100644 --- a/modules/hal_nordic/nrfs/nrfs_config.h +++ b/modules/hal_nordic/nrfs/nrfs_config.h @@ -40,6 +40,10 @@ #define NRFS_CLOCK_SERVICE_ENABLED #endif +#ifdef CONFIG_NRFS_GDPWR_SERVICE_ENABLED +#define NRFS_GDPWR_SERVICE_ENABLED +#endif + #ifdef CONFIG_SOC_POSIX #define NRFS_UNIT_TESTS_ENABLED #endif diff --git a/soc/nordic/nrf54h/Kconfig b/soc/nordic/nrf54h/Kconfig index 51dc4e07480..9132ca8458b 100644 --- a/soc/nordic/nrf54h/Kconfig +++ b/soc/nordic/nrf54h/Kconfig @@ -24,6 +24,7 @@ config SOC_NRF54H20_CPUAPP_COMMON select HAS_SEGGER_RTT if ZEPHYR_SEGGER_MODULE select NRFS_HAS_CLOCK_SERVICE select NRFS_HAS_DVFS_SERVICE + select NRFS_HAS_GDPWR_SERVICE select NRFS_HAS_MRAM_SERVICE select NRFS_HAS_TEMP_SERVICE select NRFS_HAS_VBUS_DETECTOR_SERVICE @@ -49,6 +50,7 @@ config SOC_NRF54H20_CPURAD_COMMON select CPU_HAS_CUSTOM_FIXED_SOC_MPU_REGIONS select HAS_SEGGER_RTT if ZEPHYR_SEGGER_MODULE select NRFS_HAS_CLOCK_SERVICE + select NRFS_HAS_GDPWR_SERVICE select NRFS_HAS_MRAM_SERVICE select NRFS_HAS_TEMP_SERVICE select NRFS_HAS_VBUS_DETECTOR_SERVICE diff --git a/soc/nordic/nrf92/Kconfig b/soc/nordic/nrf92/Kconfig index f6efecb6ad0..1f60b944b76 100644 --- a/soc/nordic/nrf92/Kconfig +++ b/soc/nordic/nrf92/Kconfig @@ -22,6 +22,7 @@ config SOC_NRF9230_ENGB_CPUAPP select HAS_NORDIC_DMM select HAS_SEGGER_RTT if ZEPHYR_SEGGER_MODULE select NRFS_HAS_CLOCK_SERVICE + select NRFS_HAS_GDPWR_SERVICE select NRFS_HAS_MRAM_SERVICE select NRFS_HAS_PMIC_SERVICE select NRFS_HAS_TEMP_SERVICE @@ -40,6 +41,7 @@ config SOC_NRF9230_ENGB_CPURAD select HAS_NORDIC_DMM select HAS_SEGGER_RTT if ZEPHYR_SEGGER_MODULE select NRFS_HAS_CLOCK_SERVICE + select NRFS_HAS_GDPWR_SERVICE select NRFS_HAS_MRAM_SERVICE select NRFS_HAS_PMIC_SERVICE select NRFS_HAS_TEMP_SERVICE diff --git a/west.yml b/west.yml index 1265f9cca33..d376f53d289 100644 --- a/west.yml +++ b/west.yml @@ -188,7 +188,7 @@ manifest: groups: - hal - name: hal_nordic - revision: bc25c094a8cf3064f4f9c1e8060b46e1989edf95 + revision: 4a3ba8eaca8f5255f550db7bc54dc3e23212da64 path: modules/hal/nordic groups: - hal