From 173f636426391e393aa0ada340f879d1f59628e3 Mon Sep 17 00:00:00 2001 From: Pooja Karanjekar Date: Wed, 5 Feb 2020 10:43:43 +0100 Subject: [PATCH] soc: silabs_exx32: Make HFRCO frequency configurable This commit adds an option to configure the frequency in Hz for the HFRCO clock source. The default value for this option is 0 which skips the configuration of the HFRCO. This feature is supported for efm32gg, efm32jg, efm32pg, efm32fg and efm32mg SOCs currently. Signed-off-by: Pooja Karanjekar --- soc/arm/silabs_exx32/Kconfig | 19 +++++++++++++++++++ soc/arm/silabs_exx32/common/soc.c | 13 +++++++++++-- .../silabs_exx32/efm32gg11b/Kconfig.series | 1 + .../silabs_exx32/efm32jg12b/Kconfig.series | 1 + .../silabs_exx32/efm32pg12b/Kconfig.series | 1 + soc/arm/silabs_exx32/efr32fg1p/Kconfig.series | 1 + .../silabs_exx32/efr32mg12p/Kconfig.series | 1 + 7 files changed, 35 insertions(+), 2 deletions(-) diff --git a/soc/arm/silabs_exx32/Kconfig b/soc/arm/silabs_exx32/Kconfig index 3fb5bf5b103..abeea71b39b 100644 --- a/soc/arm/silabs_exx32/Kconfig +++ b/soc/arm/silabs_exx32/Kconfig @@ -164,6 +164,17 @@ config CMU_LFXO_FREQ Set the external low frequency oscillator frequency in Hz. This should be set by the board's defconfig. +config CMU_HFRCO_FREQ + int "Internal high frequency RC oscillator frequency" + default 0 + depends on SOC_GECKO_HAS_HFRCO_FREQRANGE + help + Set the internal high frequency RC oscillator frequency in Hz. This should be set by the + board's defconfig. Only supported values may be used here. Setting this to 0, skips the + configuration of the high frequency RC oscillator completely. This may be desired, if + the bootloader already configured it properly or the device's default clock source should + be used with it's default configuration. + endif # SOC_GECKO_CMU config SOC_GECKO_HAS_INDIVIDUAL_PIN_LOCATION @@ -182,4 +193,12 @@ config SOC_GECKO_HAS_ERRATA_RTCC_E201 feature enabled by setting CCV1TOP in RTCC_CTRL fails to wrap the counter when RTCC_CNT is equal to RTCC_CC1_CCV, as intended." +config SOC_GECKO_HAS_HFRCO_FREQRANGE + bool + help + If enabled, indicates that configuration of HFRCO frequency for this SOC is supported + via FREQRANGE field. This is supported for e.g. efr32fg1p, efr32mg12p series. + If disabled, indicates that configuration of HFRCO frequency for corresponding SOC + is not supported via this field. This is the case for e.g. efm32hg, efm32wg series. + endif # SOC_FAMILY_EXX32 diff --git a/soc/arm/silabs_exx32/common/soc.c b/soc/arm/silabs_exx32/common/soc.c index f165ccce00f..5c1115007a5 100644 --- a/soc/arm/silabs_exx32/common/soc.c +++ b/soc/arm/silabs_exx32/common/soc.c @@ -60,9 +60,18 @@ static ALWAYS_INLINE void clock_init(void) CMU_OscillatorEnable(cmuOsc_HFRCO, false, false); #elif (defined CONFIG_CMU_HFCLK_HFRCO) /* - * This is the default clock, the controller starts with, so nothing to - * do here. + * This is the default clock, the controller starts with */ + +#ifdef CONFIG_SOC_GECKO_HAS_HFRCO_FREQRANGE + if (CONFIG_CMU_HFRCO_FREQ) { + /* Setting system HFRCO frequency */ + CMU_HFRCOBandSet(CONFIG_CMU_HFRCO_FREQ); + + /* Using HFRCO as high frequency clock, HFCLK */ + CMU_ClockSelectSet(cmuClock_HF, cmuSelect_HFRCO); + } +#endif #else #error "Unsupported clock source for HFCLK selected" #endif diff --git a/soc/arm/silabs_exx32/efm32gg11b/Kconfig.series b/soc/arm/silabs_exx32/efm32gg11b/Kconfig.series index ca39fab0bad..c951bc40cb2 100644 --- a/soc/arm/silabs_exx32/efm32gg11b/Kconfig.series +++ b/soc/arm/silabs_exx32/efm32gg11b/Kconfig.series @@ -15,6 +15,7 @@ config SOC_SERIES_EFM32GG11B select HAS_SYS_POWER_STATE_SLEEP_2 select HAS_SYS_POWER_STATE_SLEEP_3 select SOC_GECKO_HAS_INDIVIDUAL_PIN_LOCATION + select SOC_GECKO_HAS_HFRCO_FREQRANGE select SOC_GECKO_CMU select SOC_GECKO_EMU select SOC_GECKO_GPIO diff --git a/soc/arm/silabs_exx32/efm32jg12b/Kconfig.series b/soc/arm/silabs_exx32/efm32jg12b/Kconfig.series index dfa51530f04..b4f052ecf52 100644 --- a/soc/arm/silabs_exx32/efm32jg12b/Kconfig.series +++ b/soc/arm/silabs_exx32/efm32jg12b/Kconfig.series @@ -14,6 +14,7 @@ config SOC_SERIES_EFM32JG12B select HAS_SYS_POWER_STATE_SLEEP_2 select HAS_SYS_POWER_STATE_SLEEP_3 select SOC_GECKO_HAS_INDIVIDUAL_PIN_LOCATION + select SOC_GECKO_HAS_HFRCO_FREQRANGE select SOC_GECKO_CMU select SOC_GECKO_EMU select SOC_GECKO_GPIO diff --git a/soc/arm/silabs_exx32/efm32pg12b/Kconfig.series b/soc/arm/silabs_exx32/efm32pg12b/Kconfig.series index 5da444ac4d4..286ea4c8c86 100644 --- a/soc/arm/silabs_exx32/efm32pg12b/Kconfig.series +++ b/soc/arm/silabs_exx32/efm32pg12b/Kconfig.series @@ -16,6 +16,7 @@ config SOC_SERIES_EFM32PG12B select HAS_SYS_POWER_STATE_SLEEP_2 select HAS_SYS_POWER_STATE_SLEEP_3 select SOC_GECKO_HAS_INDIVIDUAL_PIN_LOCATION + select SOC_GECKO_HAS_HFRCO_FREQRANGE select SOC_GECKO_CMU select SOC_GECKO_EMU select SOC_GECKO_GPIO diff --git a/soc/arm/silabs_exx32/efr32fg1p/Kconfig.series b/soc/arm/silabs_exx32/efr32fg1p/Kconfig.series index 13cc835e28f..6fac80dce07 100644 --- a/soc/arm/silabs_exx32/efr32fg1p/Kconfig.series +++ b/soc/arm/silabs_exx32/efr32fg1p/Kconfig.series @@ -16,6 +16,7 @@ config SOC_SERIES_EFR32FG1P select HAS_SYS_POWER_STATE_SLEEP_2 select HAS_SYS_POWER_STATE_SLEEP_3 select SOC_GECKO_HAS_INDIVIDUAL_PIN_LOCATION + select SOC_GECKO_HAS_HFRCO_FREQRANGE select SOC_GECKO_CMU select SOC_GECKO_GPIO select SOC_GECKO_HAS_ERRATA_RTCC_E201 diff --git a/soc/arm/silabs_exx32/efr32mg12p/Kconfig.series b/soc/arm/silabs_exx32/efr32mg12p/Kconfig.series index 0dd6c174616..29162f27dac 100644 --- a/soc/arm/silabs_exx32/efr32mg12p/Kconfig.series +++ b/soc/arm/silabs_exx32/efr32mg12p/Kconfig.series @@ -17,6 +17,7 @@ config SOC_SERIES_EFR32MG12P select HAS_SYS_POWER_STATE_SLEEP_2 select HAS_SYS_POWER_STATE_SLEEP_3 select SOC_GECKO_HAS_INDIVIDUAL_PIN_LOCATION + select SOC_GECKO_HAS_HFRCO_FREQRANGE select SOC_GECKO_CMU select SOC_GECKO_EMU select SOC_GECKO_GPIO