diff --git a/boards/arm/efr32mg_sltb004a/efr32mg_sltb004a_defconfig b/boards/arm/efr32mg_sltb004a/efr32mg_sltb004a_defconfig index 8829b67a917..70d2564427c 100644 --- a/boards/arm/efr32mg_sltb004a/efr32mg_sltb004a_defconfig +++ b/boards/arm/efr32mg_sltb004a/efr32mg_sltb004a_defconfig @@ -11,3 +11,5 @@ CONFIG_CORTEX_M_SYSTICK=y CONFIG_GPIO=y CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=38400000 CONFIG_CMU_HFCLK_HFRCO=y +CONFIG_SOC_GECKO_EMU_DCDC=y +CONFIG_SOC_GECKO_EMU_DCDC_MODE_ON=y diff --git a/ext/hal/silabs/gecko/CMakeLists.txt b/ext/hal/silabs/gecko/CMakeLists.txt index a95085d1457..e494d35ee25 100644 --- a/ext/hal/silabs/gecko/CMakeLists.txt +++ b/ext/hal/silabs/gecko/CMakeLists.txt @@ -24,7 +24,7 @@ zephyr_compile_definitions( zephyr_sources( emlib/src/em_system.c) zephyr_sources_ifdef(CONFIG_HAS_CMU emlib/src/em_cmu.c) -zephyr_sources_ifdef(CONFIG_HAS_EMU emlib/src/em_emu.c) +zephyr_sources_ifdef(CONFIG_SOC_GECKO_EMU emlib/src/em_emu.c) zephyr_sources_ifdef(CONFIG_GPIO_GECKO emlib/src/em_gpio.c) zephyr_sources_ifdef(CONFIG_UART_GECKO emlib/src/em_usart.c) zephyr_sources_ifdef(CONFIG_LEUART_GECKO emlib/src/em_leuart.c) diff --git a/soc/arm/silabs_exx32/Kconfig b/soc/arm/silabs_exx32/Kconfig index 74645868740..6ba3d8b9e29 100644 --- a/soc/arm/silabs_exx32/Kconfig +++ b/soc/arm/silabs_exx32/Kconfig @@ -29,10 +29,35 @@ config SOC_PART_NUMBER that you should not set directly. The part number selection choice defines the default value for this string. -config HAS_EMU +config SOC_GECKO_EMU bool help - Set if the energy management unit (EMU) is present in the SoC. + Set if the energy management unit (EMU) is used. + +config SOC_GECKO_EMU_DCDC + bool "Enable SoC DC/DC regulator" + select SOC_GECKO_EMU + help + Enable the on chip DC/DC regulator + +choice SOC_GECKO_EMU_DCDC_MODE + prompt "DC/DC mode" + depends on SOC_GECKO_EMU_DCDC + help + Select power configuration mode of the on chip DC/DC converter. + + config SOC_GECKO_EMU_DCDC_MODE_UNCONFIGURED + bool "Initial / Unconfigured" + + config SOC_GECKO_EMU_DCDC_MODE_ON + bool "DC/DC On" + + config SOC_GECKO_EMU_DCDC_MODE_OFF + bool "DC/DC Off" + + config SOC_GECKO_EMU_DCDC_MODE_BYPASS + bool "Bypass" +endchoice config HAS_CMU bool diff --git a/soc/arm/silabs_exx32/common/soc.c b/soc/arm/silabs_exx32/common/soc.c index f74caa5a40b..0ac6165c9dd 100644 --- a/soc/arm/silabs_exx32/common/soc.c +++ b/soc/arm/silabs_exx32/common/soc.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -70,6 +71,25 @@ static ALWAYS_INLINE void clkInit(void) #endif } +#ifdef CONFIG_SOC_GECKO_EMU_DCDC +static ALWAYS_INLINE void dcdc_init(void) +{ +#if defined(CONFIG_SOC_GECKO_EMU_DCDC_MODE_UNCONFIGURED) + /* Nothing to do, leave DC/DC converter in unconfigured, safe state. */ +#elif defined(CONFIG_SOC_GECKO_EMU_DCDC_MODE_ON) || defined(CONFIG_SOC_GECKO_EMU_DCDC_MODE_BYPASS) + EMU_DCDCInit_TypeDef init_cfg = EMU_DCDCINIT_DEFAULT; +#if defined(CONFIG_SOC_GECKO_EMU_DCDC_MODE_BYPASS) + init_cfg.dcdcMode = emuDcdcMode_Bypass; +#endif + EMU_DCDCInit(&init_cfg); +#elif defined(CONFIG_SOC_GECKO_EMU_DCDC_MODE_OFF) + EMU_DCDCPowerOff(); +#else +#error "Unsupported power configuration mode of the on chip DC/DC converter." +#endif +} +#endif + /** * @brief Perform basic hardware initialization * @@ -92,6 +112,10 @@ static int silabs_exx32_init(struct device *arg) _ClearFaults(); +#ifdef CONFIG_SOC_GECKO_EMU_DCDC + dcdc_init(); +#endif + /* Initialize system clock according to CONFIG_CMU settings */ clkInit(); diff --git a/soc/arm/silabs_exx32/efm32pg12b/Kconfig.soc b/soc/arm/silabs_exx32/efm32pg12b/Kconfig.soc index 9e6b0eccd24..25bc96ad1aa 100644 --- a/soc/arm/silabs_exx32/efm32pg12b/Kconfig.soc +++ b/soc/arm/silabs_exx32/efm32pg12b/Kconfig.soc @@ -12,7 +12,7 @@ depends on SOC_SERIES_EFM32PG12B config SOC_EFM32PG12B bool "SOC_EFM32PG12B" select HAS_CMU - select HAS_EMU + select SOC_GECKO_EMU endchoice diff --git a/soc/arm/silabs_exx32/efr32mg12p/Kconfig.soc b/soc/arm/silabs_exx32/efr32mg12p/Kconfig.soc index 731092b163b..24cea0b1878 100644 --- a/soc/arm/silabs_exx32/efr32mg12p/Kconfig.soc +++ b/soc/arm/silabs_exx32/efr32mg12p/Kconfig.soc @@ -13,7 +13,7 @@ config SOC_EFR32MG12P bool "SOC_EFR32MG12P" select HAS_SILABS_GECKO select HAS_CMU - select HAS_EMU + select SOC_GECKO_EMU endchoice