# 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 if ZEPHYR_SEGGER_MODULE
	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_SERIES2
	bool
	help
	  Set if we're building for Gecko Series 2 SoC.
	  This is equivalent of _SILICON_LABS_32B_SERIES_2 definition in HAL
	  code.

config SOC_GECKO_BURTC
	bool
	help
	  Set if the Back-Up Real Time Counter (BURTC) HAL module is used.

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

config SOC_GECKO_IADC
	bool
	help
	  Set if the Incremental Analog to Digital Converter (IADC) 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.

if PM

config SOC_GECKO_PM_BACKEND_PMGR
	bool
	depends on SOC_GECKO_DEV_INIT
	default y if SOC_GECKO_SERIES2
	help
	  Implement PM using sl_power_manager service from Gecko SDK

config SOC_GECKO_PM_BACKEND_EMU
	bool
	default y if !SOC_GECKO_PM_BACKEND_PMGR
	help
	  Implement PM using direct calls to EMU driver in emlib

endif

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

config CMU_NEED_LFXO
	bool
	help
	  Set if LFXO oscillator should be configured and enabled, potentially
	  in on-demand mode, after SoC is initialized.

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"
	select CMU_NEED_LFXO
	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


choice
	prompt "BURTC Clock Selection"
	depends on SOC_GECKO_BURTC
	default CMU_BURTCCLK_LFRCO

config CMU_BURTCCLK_LFXO
	bool "LFXO - external low frequency crystal oscillator"
	select CMU_NEED_LFXO
	help
	  Set this option to use LFXO - the external low freqency crystal oscillator
	  as BURTC clock.
	  Frequency is set by external crystal, typically 32.768 kHz.

config CMU_BURTCCLK_LFRCO
	bool "LFRCO - internal low frequency RC oscillator"
	help
	  Set this option to use LFRCO - the internal low freqency RC oscillator
	  as BURTC clock.
	  Frequency is approximately 32.768 kHz.

config CMU_BURTCCLK_ULFRCO
	bool "ULFRCO - internal ultra low frequency RC oscillator"
	help
	  Set this option to use ULFRCO - the external low freqency crystal oscillator
	  as BURTC clock.
	  Frequency is approximately 1 kHz.

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
