# Copyright (c) 2017 Christian Taedcke
# Copyright (c) 2018 Gil Benkoe
# SPDX-License-Identifier: Apache-2.0

config SOC_FAMILY_EXX32
	bool
	select HAS_SEGGER_RTT
	select BUILD_OUTPUT_HEX

if SOC_FAMILY_EXX32
config SOC_FAMILY
	string
	default "silabs_exx32"

source "soc/arm/silabs_exx32/*/Kconfig.soc"

config SOC_PART_NUMBER
	string
	help
	  This string holds the full part number of the SoC. It is a hidden option
	  that you should not set directly. The part number selection choice defines
	  the default value for this string.

config SOC_GECKO_CORE
	bool
	default y
	help
	  Set if the Core interrupt handling (CORE) HAL module is used.

config SOC_GECKO_CRYOTIMER
	bool
	help
	  Set if the Ultra Low Energy Timer/Counter (CRYOTIMER) HAL module is used.

config SOC_GECKO_EMU
	bool
	help
	  Set if the Energy Management Unit (EMU) HAL module is used.

config SOC_GECKO_GPIO
	bool
	help
	  Set if the General Purpose Input/Output (GPIO) HAL module is used.

config SOC_GECKO_I2C
	bool
	help
	  Set if the Inter-Integrated Circuit Interface (I2C) HAL module is used.

config SOC_GECKO_LETIMER
	bool
	help
	  Set if the Low Energy Timer (LETIMER) HAL module is used.

config SOC_GECKO_LEUART
	bool
	help
	  Set if the Low Energy Universal Asynchronous Receiver/Transmitter (LEUART)
	  HAL module is used.

config SOC_GECKO_MSC
	bool
	help
	  Set if the Memory System Controller (MSC) HAL module is used.

config SOC_GECKO_PRS
	bool
	help
	  Set if the Peripheral Reflex System (PRS) HAL module is used.

config SOC_GECKO_RMU
	bool
	help
	  Set if the Reset Management Unit (RMU) HAL module is used.

config SOC_GECKO_RTC
	bool
	help
	  Set if the Real Time Counter (RTC) HAL module is used.

config SOC_GECKO_RTCC
	bool
	help
	  Set if the Real Time Counter and Calendar (RTCC) HAL module is used.

config SOC_GECKO_SE
	bool
	help
	  Set if the Secure Element (SE) HAL module is used.

config SOC_GECKO_TIMER
	bool
	help
	  Set if the Timer/Counter (TIMER) HAL module is used.

config SOC_GECKO_USART
	bool
	help
	  Set if the Universal Synchronous Asynchronous Receiver/Transmitter (USART)
	  HAL module is used.

config SOC_GECKO_WDOG
	bool
	help
	  Set if the Watchdog Timer (WDOG) HAL module is used.

config SOC_GECKO_TRNG
	bool
	help
	  Set if the SoC has a True Random Number Generator (TRNG) module.

config SOC_GECKO_EMU_DCDC
	bool "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 CRYPTO_ACC_GECKO_TRNG
	bool
	help
	  Enable Entropy driver based on the CRYPTO_ACC module for Silicon Labs
	  Gecko chips.

config SOC_GECKO_DEV_INIT
	bool
	help
	  Use the device initialization routines from the device_init service
	  in Silicon Labs HAL. These routines initialize and tune HFXOs,
	  configures DPLLs and manages the Energy Management Unit.

	  Disabling these services may negatively impact counter and timer
	  routines in EXX32 series SoCs.

config COUNTER_GECKO_STIMER
	bool
	help
	  Enable counter driver based on RTCC module for Silicon Labs Gecko
	  chips.

config SOC_GECKO_CMU
	bool
	help
	  Set if the clock management unit (CMU) is present in the SoC.

if SOC_GECKO_CMU

choice
	prompt "High Frequency Clock Selection"
	default CMU_HFCLK_HFXO

config CMU_HFCLK_HFXO
	bool "External high frequency crystal oscillator"
	help
	  Set this option to use the external high frequency crystal oscillator
	  as high frequency clock.

config CMU_HFCLK_LFXO
	bool "External low frequency crystal oscillator"
	help
	  Set this option to use the external low frequency crystal oscillator
	  as high frequency clock.

config CMU_HFCLK_HFRCO
	bool "Internal high frequency RC oscillator"
	help
	  Set this option to use the internal high frequency RC oscillator as high frequency clock.

endchoice

config CMU_HFXO_FREQ
	int "External high frequency oscillator frequency"
	help
	  Set the external high frequency oscillator frequency in Hz. This should be set by the
	  board's defconfig.

config CMU_LFXO_FREQ
	int "External low frequency oscillator frequency"
	help
	  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
	bool
	help
	  If enabled, indicates that SoC allows to configure individual pin
	  locations. This is supported by e.g. efr32fg1p, efr32mg12p series.
	  If disabled, indicates that pin locations are configured in groups.
	  This is supported by e.g. efm32hg, efm32wg series.

config SOC_GECKO_HAS_ERRATA_RTCC_E201
	bool
	help
	  Set if the SoC is affected by errata RTCC_E201:
	  "When the RTCC is configured with a prescaler, the CCV1 top value enable
	  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
