# Kconfig - ADC configuration options

#
# Copyright (c) 2015 Intel Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

#
# ADC options
#
menuconfig ADC
	bool
	prompt "ADC drivers"
	default n
	help
	Enable ADC (Analog to Digital Converter) driver configuration

config  ADC_DEBUG
	bool "ADC drivers debug output"
	depends on ADC
	default n
	help
	Enable debug output for ADC drivers

config  ADC_TI_ADC108S102
	bool "TI adc108s102 chip driver"
	depends on ADC
	select SPI
	select NANO_TIMEOUTS
	default n
	help
	Enable support for TI's ADC chip adc108s102 driver.

config ADC_TI_ADC108S102_INIT_PRIORITY
	int
	depends on ADC_TI_ADC108S102
	default 80
	prompt "Init priority"
	help
	  Device driver initialization priority.
	  Device is connected to SPI bus, it has to
	  be initialized after SPI driver.

config  ADC_TI_ADC108S102_DRV_NAME
	string "Driver's name"
	depends on ADC_TI_ADC108S102
	default "ADC"

config  ADC_TI_ADC108S102_SPI_PORT_NAME
	string "Master SPI port name"
	depends on ADC_TI_ADC108S102
	default ""
	help
	Master SPI port name through which adc108s102 chip is accessed.

config  ADC_TI_ADC108S102_SPI_CONFIGURATION
	hex "Master SPI port configuration"
	depends on ADC_TI_ADC108S102
	default 0x0
	help
	Master SPI port configuration flags used to access adc108s102 chip.

config  ADC_TI_ADC108S102_SPI_MAX_FREQ
	hex "Master SPI port max frequency"
	depends on ADC_TI_ADC108S102
	default 0x0
	help
	Master SPI port maximum frequency used to access adc108s102 chip.

config  ADC_TI_ADC108S102_SPI_SLAVE
	int "SPI slave slot"
	depends on ADC_TI_ADC108S102
	default 0
	help
	adc108s102 chip's SPI slave number on master SPI port.

config ADC_DW
	bool "ARC Designware Driver"
	depends on ADC && ARC
	default n
	help
	Enable the driver implementation of the Designware ADC IP.

if ADC_DW

config ADC_DW_NAME
	string "Select a name to lookup the device"
	default "ADC"
	depends on ADC_DW

config ADC_DW_RX_IRQ
        int
        prompt "ADC reception interrupt"
        depends on ADC_DW
        default 19

config ADC_DW_ERR_IRQ
        int
        prompt "ADC error interrupt"
        depends on ADC_DW
        default 18

config ADC_DW_PRI
        int
        prompt "ADC interrupt priority"
        depends on ADC_DW
        default 2

config ADC_DW_CALIBRATION
	bool "Enable Calibration"
	default y
	depends on ADC_DW
	help
	Enables ADC to run with a calibrated output at the
	expense of execution speed when exiting low power states.
	If disabled, the ADC will require the application/system-integrator
	to provide a calibration method.

config ADC_DW_DUMMY_CONVERSION
	bool "Enable dummy conversion"
	default y
	depends on ADC_DW
	help
	After awaking from low power state a dummy
	conversion must be performed and discarded.
	If disabled the user will have to discard the first
	sample after a resume from a low power state.

choice
	prompt "Output Mode"
	default ADC_DW_SERIAL
	depends on ADC_DW
	help
	ADC output mode: parallel or serial.

config ADC_DW_SERIAL
	bool "Serial"

config ADC_DW_PARALLEL
	bool "Parallel"

endchoice

choice
	prompt "Sequence Mode"
	default ADC_DW_SINGLESHOT
	depends on ADC_DW
	help
	ADC sequence mode - single run/repetitive

config ADC_DW_SINGLESHOT
	bool "Single Ended"

config ADC_DW_REPETITIVE
	bool "Differential"

endchoice

choice
	prompt "Capture Mode"
	default ADC_DW_RISING_EDGE
	depends on ADC_DW
	help
	ADC controller capture mode:
	by rising or falling edge of adc_clk

config ADC_DW_RISING_EDGE
	bool "Rising Edge"

config ADC_DW_FALLING_EDGE
	bool "Falling Edge"

endchoice

config ADC_DW_SAMPLE_WIDTH
	int "Sample Width"
	depends on ADC_DW
	default 31
	help
	Defines ADC device data sample width (resolution):
	0 = 6 bits resolution
	1 = 8 bits resolution
	2 = 10 bits resolution
	3 = 12 bits resolution

config ADC_DW_SERIAL_DELAY
	int "Serial Delay"
	default 1
	help
	Number of ADC clock ticks that the first bit of
	the serial output is delayed after the conversion
	has started.

config ADC_DW_CLOCK_RATIO
	int "Clock Ratio"
	default 1024
	help
	ADC Clock Ratio

endif
