diff --git a/boards/arm/efr32_radio/efr32_radio_brd4187c.dts b/boards/arm/efr32_radio/efr32_radio_brd4187c.dts index 57d30776189..1f065fb15b1 100644 --- a/boards/arm/efr32_radio/efr32_radio_brd4187c.dts +++ b/boards/arm/efr32_radio/efr32_radio_brd4187c.dts @@ -61,6 +61,10 @@ clock-frequency = <39000000>; }; +&pstate_em3 { + status = "disabled"; +}; + &usart0 { current-speed = <115200>; location-rx = ; diff --git a/dts/arm/silabs/efr32mg24.dtsi b/dts/arm/silabs/efr32mg24.dtsi index aec5fbd26c6..1ee015b7334 100644 --- a/dts/arm/silabs/efr32mg24.dtsi +++ b/dts/arm/silabs/efr32mg24.dtsi @@ -25,15 +25,44 @@ device_type = "cpu"; compatible = "arm,cortex-m33"; reg = <0>; - cpu-power-states = <&state0>; + cpu-power-states = <&pstate_em1 &pstate_em2 &pstate_em3>; }; power-states { - state0: state0 { + /* + * EM1 is a basic "CPU WFI idle", all high-freq clocks remain + * enabled. + */ + pstate_em1: em1 { + compatible = "zephyr,power-state"; + power-state-name = "runtime-idle"; + min-residency-us = <4>; + /* HFXO remains active */ + exit-latency-us = <2>; + }; + + /* + * EM2 is a deepsleep with HF clocks disabled by HW, voltages + * scaled down, etc. + */ + pstate_em2: em2 { + compatible = "zephyr,power-state"; + power-state-name = "suspend-to-idle"; + min-residency-us = <260>; + exit-latency-us = <250>; + }; + + /* + * EM3 seems to be exactly the same as EM2 except that + * LFXO & LFRCO should be disabled, so you must use ULFRCO + * as BURTC clock for the system to not lose track of time and + * wake up. + */ + pstate_em3: em3 { compatible = "zephyr,power-state"; power-state-name = "standby"; - min-residency-us = <50000>; - exit-latency-us = <0>; + min-residency-us = <20000>; + exit-latency-us = <2000>; }; }; }; diff --git a/soc/arm/silabs_exx32/efr32mg24/Kconfig.defconfig.series b/soc/arm/silabs_exx32/efr32mg24/Kconfig.defconfig.series index b8ac2ad4bc3..ec3e460c355 100644 --- a/soc/arm/silabs_exx32/efr32mg24/Kconfig.defconfig.series +++ b/soc/arm/silabs_exx32/efr32mg24/Kconfig.defconfig.series @@ -19,6 +19,7 @@ config NUM_IRQS config PM default n select COUNTER + select UART_INTERRUPT_DRIVEN if SERIAL_SUPPORT_INTERRUPT choice PM_POLICY default PM_POLICY_DEFAULT