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

menuconfig CLOCK_CONTROL_NRF
	bool "NRF Clock controller support"
	depends on SOC_COMPATIBLE_NRF
	depends on !CLOCK_CONTROL_NRF_FORCE_ALT
	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 milliseconds"
	default 4000
	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
	depends on HAS_HW_NRF_TEMP
	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
