# Kconfig - Clock controller driver configuration options
#
# Copyright (c) 2016 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: Apache-2.0

config CLOCK_CONTROL_NRF_FORCE_ALT
	bool
	depends on SOC_COMPATIBLE_NRF
	help
	  This option can be enabled to force an alternative implementation
	  of the clock control driver.

if !CLOCK_CONTROL_NRF_FORCE_ALT

menuconfig CLOCK_CONTROL_NRF
	bool "NRF Clock controller support"
	depends on SOC_COMPATIBLE_NRF
	default y
	help
	  Enable support for the Nordic Semiconductor nRFxx series SoC clock
	  driver.

if CLOCK_CONTROL_NRF

choice CLOCK_CONTROL_NRF_SOURCE
	prompt "32KHz clock source"
	default CLOCK_CONTROL_NRF_K32SRC_XTAL

config CLOCK_CONTROL_NRF_K32SRC_RC
	bool "RC Oscillator"

config CLOCK_CONTROL_NRF_K32SRC_XTAL
	bool "Crystal Oscillator"

config CLOCK_CONTROL_NRF_K32SRC_SYNTH
	depends on !SOC_SERIES_NRF91X
	bool "Synthesized from HFCLK"

config CLOCK_CONTROL_NRF_K32SRC_EXT_LOW_SWING
	depends on SOC_SERIES_NRF52X
	bool "External low swing"

config CLOCK_CONTROL_NRF_K32SRC_EXT_FULL_SWING
	depends on SOC_SERIES_NRF52X
	bool "External full swing"

endchoice

config CLOCK_CONTROL_NRF_K32SRC_RC_CALIBRATION
	bool
	depends on !SOC_SERIES_NRF91X
	default y if CLOCK_CONTROL_NRF_K32SRC_RC

if CLOCK_CONTROL_NRF_K32SRC_RC_CALIBRATION

config CLOCK_CONTROL_NRF_CALIBRATION_PERIOD
	int "Calibration opportunity period (in 250ms units)"
	default 16
	range 1 127
	help
	  Periodically, calibration action is performed. Action includes
	  temperature measurement followed by clock calibration. Calibration may
	  be skipped if temperature change (compared to measurement of previous
	  calibration) did not exceeded CLOCK_CONTROL_NRF_CALIBRATION_TEMP_DIFF
	  and number of consecutive skips did not exceeded
	  CLOCK_CONTROL_NRF_CALIBRATION_MAX_SKIP.

config CLOCK_CONTROL_NRF_CALIBRATION_MAX_SKIP
	int "Maximum number of calibration skips"
	default 1
	range 0 255
	help
	  Calibration is skipped when temperature change since last calibration
	  was less than configured threshold. If number of consecutive skips
	  reaches configured value then calibration is performed
	  unconditionally. Set to 0 to perform calibration periodically
	  regardless of temperature change.

config CLOCK_CONTROL_NRF_CALIBRATION_TEMP_DIFF
	int "Temperature change triggering calibration (in 0.25 degree units)"
	default 2
	help
	  Calibration is triggered if the temperature has changed by at least
	  this amount since the last calibration.

config CLOCK_CONTROL_NRF_CALIBRATION_DEBUG
	bool "Calibration instrumentation"
	help
	  Enables retrieving debug information like number of performed or
	  skipped calibrations.

config CLOCK_CONTROL_NRF_USES_TEMP_SENSOR
	bool
	default y if CLOCK_CONTROL_NRF_CALIBRATION_MAX_SKIP > 0 && \
		CLOCK_CONTROL_NRF_CALIBRATION_TEMP_DIFF > 0
	select TEMP_NRF5
	select SENSOR

endif # CLOCK_CONTROL_NRF_K32SRC_RC_CALIBRATION

choice CLOCK_CONTROL_NRF_ACCURACY
	prompt "32KHz clock accuracy"
	default CLOCK_CONTROL_NRF_K32SRC_500PPM if CLOCK_CONTROL_NRF_K32SRC_RC
	default CLOCK_CONTROL_NRF_K32SRC_20PPM

config CLOCK_CONTROL_NRF_K32SRC_500PPM
	bool "251 ppm to 500 ppm"

config CLOCK_CONTROL_NRF_K32SRC_250PPM
	bool "151 ppm to 250 ppm"

config CLOCK_CONTROL_NRF_K32SRC_150PPM
	bool "101 ppm to 150 ppm"

config CLOCK_CONTROL_NRF_K32SRC_100PPM
	bool "76 ppm to 100 ppm"

config CLOCK_CONTROL_NRF_K32SRC_75PPM
	bool "51 ppm to 75 ppm"

config CLOCK_CONTROL_NRF_K32SRC_50PPM
	bool "31 ppm to 50 ppm"

config CLOCK_CONTROL_NRF_K32SRC_30PPM
	bool "21 ppm to 30 ppm"

config CLOCK_CONTROL_NRF_K32SRC_20PPM
	bool "0 ppm to 20 ppm"

endchoice

endif # CLOCK_CONTROL_NRF

endif #!CLOCK_CONTROL_NRF_FORCE_ALT
