# 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 "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 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
