# 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

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

if ADC_TI_ADC108S102

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_0"

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.

endif # ADC_TI_ADC108S102

menuconfig 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_DRV_NAME
	string "Select a name to lookup the device"
	default "ADC_0"
	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_IRQ_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

menuconfig ADC_QMSI
	bool "QMSI ADC Driver"
	depends on QMSI && ADC
	default n
	help
	Enable the driver implementation of the QMSI ADC IP.

if ADC_QMSI

config ADC_QMSI_0_DRV_NAME
	string "Select a name to lookup the device"
	default "ADC_0"
	depends on ADC_QMSI

config ADC_QMSI_0_IRQ_PRI
	int
	prompt "ADC interrupt priority"
	depends on ADC_QMSI
	default 2

choice
	prompt "Capturing Mode"
	default ADC_QMSI_INTERRUPT
	depends on ADC_QMSI
	help
	ADC sample capture mode - interrupt mode/polling mode

config ADC_QMSI_POLL
	bool "Polling samples"

config ADC_QMSI_INTERRUPT
	bool "Interrupt notification"

endchoice

config ADC_QMSI_CALIBRATION
	bool "Enable Calibration"
	default y
	depends on ADC_QMSI
	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_QMSI_CLOCK_RATIO
	int "Clock Ratio"
	default 100
	depends on ADC_QMSI
	help
	ADC Clock Ratio

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

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

endif # ADC_QMSI
