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

#
# I2C options
#
menuconfig I2C
	bool
	prompt "I2C Drivers"
	default n
	help
	Enable I2C Driver Configuration

if I2C

config I2C_DW
	bool "Design Ware I2C support"
	depends on I2C
	default n
	help
	Enable Design Ware I2C support on the selected platform

config I2C_QUARK_SE_SS
	bool "I2C Driver for Quark SE Sensor Subsystem (SS)"
	default n
	depends on I2C
	help
	This option enables the driver to support the I2C on Quark SE Sensor
	Subsystem.

config I2C_QMSI_SS
	bool "QMSI I2C driver for the Sensor Subsystem"
	depends on I2C && QMSI
	default n
	help
	This option enable the Sensor QMSI I2C driver.

	This driver is simply a shim driver based on the I2C driver
	provided by the QMSI BSP.

config I2C_QMSI_SS
	bool "QMSI I2C driver for the Sensor Subsystem"
	depends on QMSI && I2C
	default n
	help
	This option enable the Sensor QMSI I2C driver.

	This driver is simply a shim driver based on the I2C driver
	provided by the QMSI BSP.

config I2C_QMSI
	bool "QMSI I2C driver"
	depends on I2C && QMSI
	default n
	help
	This option enable the QMSI I2C driver.

	This driver is simply a shim driver based on the I2C driver
	provided by the QMSI BSP.

config I2C_ATMEL_SAM3
	bool "Atmel SAM3 I2C Driver"
	depends on I2C && SOC_ATMEL_SAM3
	default n
	help
	Enable I2C support on the Atmel SAM3 family processor.

	Says y to enable additional options to enable support
	for individual controllers.

config I2C_INIT_PRIORITY
	int
	depends on I2C
	default 60
	prompt "Init priority"
	help
	  I2C device driver initialization priority.

config I2C_CLOCK_SPEED
	int "Set the clock speed for I2C"
	default 32
	depends on I2C

config I2C_DEBUG
	bool "Enable I2C debug options"
	default n
	depends on I2C
	help
	This option enables the debug features for I2C connections


config I2C_SHARED_IRQ
	bool
	default n
	depends on I2C

choice
	prompt "I2C_0 Interrupts via"
	default I2C_0_IRQ_DIRECT
	depends on I2C_0

config I2C_0_IRQ_DIRECT
	bool "Direct Hardware Interrupt"
	help
	  When interrupts fire, the driver's ISR function is being called directly.

config I2C_0_IRQ_SHARED
	bool "Shared IRQ"
	depends on SHARED_IRQ
	select I2C_SHARED_IRQ
	help
	  When interrupts fire, the shared IRQ driver is notified. Then the shared IRQ
	  driver dispatches the interrupt to other drivers.

endchoice

config I2C_0_IRQ_SHARED_NAME
	string "Device name for Shared IRQ"
	depends on I2C_0 && I2C_0_IRQ_SHARED
	help
	  Specify the device name for the shared IRQ driver. It is used to register
	  this driver with the shared IRQ driver, so interrupts can be dispatched
	  correctly.

config I2C_0
	bool "Enable I2C_0"
	depends on I2C
	default n

config I2C_0_NAME
	string "Select a name for finding the device"
	depends on I2C_0
	default "I2C_0"

config I2C_0_DEFAULT_CFG
	hex "I2C default configuration"
	depends on I2C_0
	default 0x0
	help
	Allows the I2C port to be brought up with a default configuration.
	This is useful to set if other drivers depend upon using the I2C bus
	before the application has a chance to custom configure the port.
	Setting this value does not prohibit the application from customizing
	the values later.  Refer to the I2C datasheet for proper values.

config I2C_0_IRQ_PRI
	int "Controller interrupt priority"
	depends on I2C_0 && I2C_0_IRQ_DIRECT
	help
	IRQ priority.

config I2C_1
	bool "Enable I2C Port 1"
	depends on I2C
	default n

config I2C_1_NAME
	string "Select a name for finding the device"
	default "I2C_1"
	depends on I2C_1

config I2C_1_DEFAULT_CFG
	hex "I2C default configuration"
	depends on I2C_1
	default 0x0
	help
	Allows the I2C port to be brought up with a default configuration.
	This is useful to set if other drivers depend upon using the I2C bus
	before the application has a chance to custom configure the port.
	Setting this value does not prohibit the application from customizing
	the values later.  Refer to the I2C datasheet for proper values.

config I2C_1_IRQ_PRI
	int "Controller interrupt priority"
	depends on I2C_1 && I2C_0_IRQ_DIRECT
	help
	IRQ priority.

endif
