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

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_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

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

if ADC_QMSI

config ADC_QMSI_NAME
	string "Select a name to lookup the device"
	default "ADC"
	depends on ADC_QMSI

config ADC_IRQ
	int
	prompt "ADC interrupt request"
	depends on ADC_QMSI
	default 9

config ADC_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
