# Copyright (c) 2021 Argentum Systems Ltd.
# SPDX-License-Identifier: Apache-2.0

if SOC_SERIES_SAML21 || SOC_SERIES_SAMR34 || SOC_SERIES_SAMR35

config SOC_ATMEL_SAML_DEBUG_PAUSE
	bool "Insert a pause at boot, to allow a debugger to attach"
	default y
	help
	  Issues have been observed while attempting to attach a debugger.
	  These can be mitigated by inserting a small delay during the early boot
	  sequence, before the system clock is configured.

	  If you ever intend to attach a debugger, say y.
	  If you are confident that you will never attach a debugger to the
	  resulting binary, or require the best possible boot time, say n.

config SOC_ATMEL_SAML_OSC32K
	bool "Internal 32.768 kHz RC oscillator"
	help
	  Eable the internal 32.768 kHz RC oscillator at startup.
	  This can then be selected as the main clock reference for the SOC.

config SOC_ATMEL_SAML_XOSC32K
	bool "External 32.768 kHz clock source"
	help
	  Enable the external 32.768 kHz cloud source at startup.
	  This can then be selected as the main clock reference for the SOC.

config SOC_ATMEL_SAML_XOSC32K_CRYSTAL
	bool "External 32.768 kHz clock is a crystal oscillator"
	depends on SOC_ATMEL_SAML_XOSC32K
	default y
	help
	  Enable the crystal oscillator (if disabled, expect a clock signal on
	  XIN32).

config SOC_ATMEL_SAML_OSC16M
	bool "Internal 16 MHz RC oscillator"
	help
	  Enable the internal 16 MHz RC oscillator at startup.
	  This can then be selected as the main clock reference for the SOC.

# NOTE: XOSC is not currently supported


choice
	prompt "Main clock reference"
	default SOC_ATMEL_SAML_OPENLOOP_AS_MAIN
	help
	  Selects the clock that will be used for the DFLL48M's reference.
	  Main clocks, such as the CPU and AHB clocks will be derived from
	  DFLL48M configured for 48 MHz.

config SOC_ATMEL_SAML_OPENLOOP_AS_MAIN
	bool "OPENLOOP"
	help
	  Note, this mode can only be used with an LDO regulator.

config SOC_ATMEL_SAML_OSC32K_AS_MAIN
	bool "OSC32K"
	depends on SOC_ATMEL_SAML_OSC32K

config SOC_ATMEL_SAML_XOSC32K_AS_MAIN
	bool "XOSC32K"
	depends on SOC_ATMEL_SAML_XOSC32K

config SOC_ATMEL_SAML_OSC16M_AS_MAIN
	bool "OSC16M"
	depends on SOC_ATMEL_SAML_OSC16M

endchoice

endif # SOC_SERIES_SAML21 || SOC_SERIES_SAMR34 || SOC_SERIES_SAMR35

config SOC_ATMEL_SAMR3X_RADIO_OFF_SETUP
	bool "Configure LoRa radio pins if not in use"
	default y if !LORA
	depends on SOC_SERIES_SAMR34 || SOC_SERIES_SAMR35
	help
	  As detailed in DS70005356C, LoRa radio SPI pins do not have pull-ups,
	  so when the radio is not in use, it's important that CS is kept high,
	  to avoid unexpected behavior and increased current consumption. To
	  further reduce power consumption, radio can be kept in reset state by
	  keeping nRST pin low. When enabling this option, both CS and nRST will
	  be configured high and low, respectively.
