From 9bb99a059e855dd9cebe5cd4a7fdd69abd09c944 Mon Sep 17 00:00:00 2001 From: Bjarki Arge Andreasen Date: Mon, 10 Feb 2025 10:40:55 +0100 Subject: [PATCH 1/2] [nrf fromtree] drivers: adc: nrf_saadc: add pm device support Extend nrf saadc device driver with pm device runtime support. To preserve previous behavior: * if pm device is disabled, saadc is resumed on sampling start and suspended when sampling done. * if pm device is enabled only, saadc does nothing on sampling start/stop. its resumed on init. * if pm device runtime is enabled, saadc is got on sampling start, and put on sampling stop. Signed-off-by: Bjarki Arge Andreasen (cherry picked from commit 96c3cd6cd3302f353e7fe9ace842d66d207a4424) --- drivers/adc/adc_nrfx_saadc.c | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/drivers/adc/adc_nrfx_saadc.c b/drivers/adc/adc_nrfx_saadc.c index a1479ed2fd1b..1418ae286f51 100644 --- a/drivers/adc/adc_nrfx_saadc.c +++ b/drivers/adc/adc_nrfx_saadc.c @@ -10,6 +10,8 @@ #include #include #include +#include +#include #define LOG_LEVEL CONFIG_ADC_LOG_LEVEL #include @@ -168,6 +170,26 @@ static int adc_convert_acq_time(uint16_t acquisition_time, nrf_saadc_acqtime_t * return result; } +static int saadc_pm_hook(const struct device *dev, enum pm_device_action action) +{ + ARG_UNUSED(dev); + + switch (action) { + case PM_DEVICE_ACTION_SUSPEND: + nrf_saadc_disable(NRF_SAADC); + return 0; + + case PM_DEVICE_ACTION_RESUME: + nrf_saadc_enable(NRF_SAADC); + return 0; + + default: + break; + } + + return -ENOTSUP; +} + /* Implementation of the ADC driver API function: adc_channel_setup. */ static int adc_nrfx_channel_setup(const struct device *dev, const struct adc_channel_cfg *channel_cfg) @@ -320,7 +342,11 @@ static int adc_nrfx_channel_setup(const struct device *dev, static void adc_context_start_sampling(struct adc_context *ctx) { +#if defined(CONFIG_PM_DEVICE_RUNTIME) + pm_device_runtime_get(DEVICE_DT_INST_GET(0)); +#else nrf_saadc_enable(NRF_SAADC); +#endif if (ctx->sequence.calibrate) { nrf_saadc_task_trigger(NRF_SAADC, @@ -623,7 +649,12 @@ static void saadc_irq_handler(const struct device *dev) nrf_saadc_event_clear(NRF_SAADC, NRF_SAADC_EVENT_END); nrf_saadc_task_trigger(NRF_SAADC, NRF_SAADC_TASK_STOP); + +#if defined(CONFIG_PM_DEVICE_RUNTIME) + pm_device_runtime_put(DEVICE_DT_INST_GET(0)); +#else nrf_saadc_disable(NRF_SAADC); +#endif if (has_single_ended(&m_data.ctx.sequence)) { correct_single_ended(&m_data.ctx.sequence); @@ -663,7 +694,7 @@ static int init_saadc(const struct device *dev) adc_context_unlock_unconditionally(&m_data.ctx); - return 0; + return pm_device_driver_init(dev, saadc_pm_hook); } static DEVICE_API(adc, adc_nrfx_driver_api) = { @@ -693,9 +724,10 @@ static DEVICE_API(adc, adc_nrfx_driver_api) = { #define SAADC_INIT(inst) \ BUILD_ASSERT((inst) == 0, \ "multiple instances not supported"); \ + PM_DEVICE_DT_INST_DEFINE(0, saadc_pm_hook, 1); \ DEVICE_DT_INST_DEFINE(0, \ init_saadc, \ - NULL, \ + PM_DEVICE_DT_INST_GET(0), \ NULL, \ NULL, \ POST_KERNEL, \ From 5b22b008f9d463f03f3cc99c76e4a534a4dba04e Mon Sep 17 00:00:00 2001 From: Bjarki Arge Andreasen Date: Mon, 10 Feb 2025 10:39:45 +0100 Subject: [PATCH 2/2] [nrf fromtree] dts: nordic,nrf-saadc: set pm device runtime auto Set pm device runtime runtime auto flag to ensure saadc instances are initialized correctly if pm device runtime is used. Signed-off-by: Bjarki Arge Andreasen (cherry picked from commit d01c93c120ff6e2e3428772d7af1936f2153f91f) --- dts/arm/nordic/nrf52805.dtsi | 1 + dts/arm/nordic/nrf52810.dtsi | 1 + dts/arm/nordic/nrf52811.dtsi | 1 + dts/arm/nordic/nrf52832.dtsi | 1 + dts/arm/nordic/nrf52833.dtsi | 1 + dts/arm/nordic/nrf52840.dtsi | 1 + dts/arm/nordic/nrf5340_cpuapp_peripherals.dtsi | 1 + dts/arm/nordic/nrf91_peripherals.dtsi | 1 + dts/common/nordic/nrf54h20.dtsi | 1 + dts/common/nordic/nrf54l09.dtsi | 1 + dts/common/nordic/nrf54l20.dtsi | 1 + dts/common/nordic/nrf54l_05_10_15.dtsi | 1 + dts/common/nordic/nrf9280.dtsi | 1 + 13 files changed, 13 insertions(+) diff --git a/dts/arm/nordic/nrf52805.dtsi b/dts/arm/nordic/nrf52805.dtsi index aa9061d4aabc..238876e42558 100644 --- a/dts/arm/nordic/nrf52805.dtsi +++ b/dts/arm/nordic/nrf52805.dtsi @@ -166,6 +166,7 @@ interrupts = <7 NRF_DEFAULT_IRQ_PRIORITY>; status = "disabled"; #io-channel-cells = <1>; + zephyr,pm-device-runtime-auto; }; timer0: timer@40008000 { diff --git a/dts/arm/nordic/nrf52810.dtsi b/dts/arm/nordic/nrf52810.dtsi index 8ed7a32bfecd..0155485509ee 100644 --- a/dts/arm/nordic/nrf52810.dtsi +++ b/dts/arm/nordic/nrf52810.dtsi @@ -170,6 +170,7 @@ interrupts = <7 NRF_DEFAULT_IRQ_PRIORITY>; status = "disabled"; #io-channel-cells = <1>; + zephyr,pm-device-runtime-auto; }; timer0: timer@40008000 { compatible = "nordic,nrf-timer"; diff --git a/dts/arm/nordic/nrf52811.dtsi b/dts/arm/nordic/nrf52811.dtsi index 4c5f4ca58f73..e22ce7b0742f 100644 --- a/dts/arm/nordic/nrf52811.dtsi +++ b/dts/arm/nordic/nrf52811.dtsi @@ -201,6 +201,7 @@ interrupts = <7 NRF_DEFAULT_IRQ_PRIORITY>; status = "disabled"; #io-channel-cells = <1>; + zephyr,pm-device-runtime-auto; }; timer0: timer@40008000 { diff --git a/dts/arm/nordic/nrf52832.dtsi b/dts/arm/nordic/nrf52832.dtsi index f09793f5020c..693116c2ffd6 100644 --- a/dts/arm/nordic/nrf52832.dtsi +++ b/dts/arm/nordic/nrf52832.dtsi @@ -213,6 +213,7 @@ interrupts = <7 NRF_DEFAULT_IRQ_PRIORITY>; status = "disabled"; #io-channel-cells = <1>; + zephyr,pm-device-runtime-auto; }; timer0: timer@40008000 { diff --git a/dts/arm/nordic/nrf52833.dtsi b/dts/arm/nordic/nrf52833.dtsi index a881898a8f3b..2a240db0a44b 100644 --- a/dts/arm/nordic/nrf52833.dtsi +++ b/dts/arm/nordic/nrf52833.dtsi @@ -227,6 +227,7 @@ interrupts = <7 NRF_DEFAULT_IRQ_PRIORITY>; status = "disabled"; #io-channel-cells = <1>; + zephyr,pm-device-runtime-auto; }; timer0: timer@40008000 { diff --git a/dts/arm/nordic/nrf52840.dtsi b/dts/arm/nordic/nrf52840.dtsi index e331e8b422f9..eab9c8454ee7 100644 --- a/dts/arm/nordic/nrf52840.dtsi +++ b/dts/arm/nordic/nrf52840.dtsi @@ -215,6 +215,7 @@ interrupts = <7 NRF_DEFAULT_IRQ_PRIORITY>; status = "disabled"; #io-channel-cells = <1>; + zephyr,pm-device-runtime-auto; }; timer0: timer@40008000 { diff --git a/dts/arm/nordic/nrf5340_cpuapp_peripherals.dtsi b/dts/arm/nordic/nrf5340_cpuapp_peripherals.dtsi index 75c2eb9f99f2..244459a0f16a 100644 --- a/dts/arm/nordic/nrf5340_cpuapp_peripherals.dtsi +++ b/dts/arm/nordic/nrf5340_cpuapp_peripherals.dtsi @@ -287,6 +287,7 @@ adc: adc@e000 { interrupts = <14 NRF_DEFAULT_IRQ_PRIORITY>; status = "disabled"; #io-channel-cells = <1>; + zephyr,pm-device-runtime-auto; }; timer0: timer@f000 { diff --git a/dts/arm/nordic/nrf91_peripherals.dtsi b/dts/arm/nordic/nrf91_peripherals.dtsi index 58cc3142bcf2..476f8415853a 100644 --- a/dts/arm/nordic/nrf91_peripherals.dtsi +++ b/dts/arm/nordic/nrf91_peripherals.dtsi @@ -26,6 +26,7 @@ adc: adc@e000 { interrupts = <14 NRF_DEFAULT_IRQ_PRIORITY>; status = "disabled"; #io-channel-cells = <1>; + zephyr,pm-device-runtime-auto; }; dppic0: dppic: dppic@17000 { diff --git a/dts/common/nordic/nrf54h20.dtsi b/dts/common/nordic/nrf54h20.dtsi index 77b8dc9fb559..0f972e8863aa 100644 --- a/dts/common/nordic/nrf54h20.dtsi +++ b/dts/common/nordic/nrf54h20.dtsi @@ -888,6 +888,7 @@ status = "disabled"; #io-channel-cells = <1>; power-domains = <&gpd NRF_GPD_SLOW_ACTIVE>; + zephyr,pm-device-runtime-auto; }; comp: comparator@983000 { diff --git a/dts/common/nordic/nrf54l09.dtsi b/dts/common/nordic/nrf54l09.dtsi index e73a609a8139..1aa9d2ec2adb 100644 --- a/dts/common/nordic/nrf54l09.dtsi +++ b/dts/common/nordic/nrf54l09.dtsi @@ -388,6 +388,7 @@ interrupts = <213 NRF_DEFAULT_IRQ_PRIORITY>; status = "disabled"; #io-channel-cells = <1>; + zephyr,pm-device-runtime-auto; }; temp: temp@d7000 { diff --git a/dts/common/nordic/nrf54l20.dtsi b/dts/common/nordic/nrf54l20.dtsi index a7f72bf5a308..e1f149bcd27a 100644 --- a/dts/common/nordic/nrf54l20.dtsi +++ b/dts/common/nordic/nrf54l20.dtsi @@ -459,6 +459,7 @@ interrupts = <213 NRF_DEFAULT_IRQ_PRIORITY>; status = "disabled"; #io-channel-cells = <1>; + zephyr,pm-device-runtime-auto; }; nfct: nfct@d6000 { diff --git a/dts/common/nordic/nrf54l_05_10_15.dtsi b/dts/common/nordic/nrf54l_05_10_15.dtsi index d4e0ee6df009..5bbe9668645a 100644 --- a/dts/common/nordic/nrf54l_05_10_15.dtsi +++ b/dts/common/nordic/nrf54l_05_10_15.dtsi @@ -500,6 +500,7 @@ interrupts = <213 NRF_DEFAULT_IRQ_PRIORITY>; status = "disabled"; #io-channel-cells = <1>; + zephyr,pm-device-runtime-auto; }; nfct: nfct@d6000 { diff --git a/dts/common/nordic/nrf9280.dtsi b/dts/common/nordic/nrf9280.dtsi index 2df403e78f24..0907be9d9a6a 100644 --- a/dts/common/nordic/nrf9280.dtsi +++ b/dts/common/nordic/nrf9280.dtsi @@ -706,6 +706,7 @@ interrupts = <386 NRF_DEFAULT_IRQ_PRIORITY>; status = "disabled"; #io-channel-cells = <1>; + zephyr,pm-device-runtime-auto; }; comp: comparator@983000 {