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

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
	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_KSDK
	bool "KSDK I2C driver"
	depends on I2C && HAS_KSDK
	default n
	help
	Enable the ksdk I2C driver.

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 SYS_LOG_I2C_LEVEL
	int
	prompt "I2C log level"
	depends on I2C && SYS_LOG
	default 0
	help
	Sets log level for I2C connections

	Levels are:

	- 0 OFF, do not write

	- 1 ERROR, only write SYS_LOG_ERR

	- 2 WARNING, write SYS_LOG_WRN in adition to previous level

	- 3 INFO, write SYS_LOG_INF in adition to previous levels

	- 4 DEBUG, write SYS_LOG_DBG in adition to previous levels

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.

config I2C_SS_SDA_HOLD
	int
	depends on I2C_QMSI_SS
	help
	The hold time on the data signal after a negative edge of i2c clock.
	The unit is i2c module base clock.

config I2C_SDA_SETUP
	int
	depends on I2C_QMSI || I2C_QMSI_SS
	help
	The delay time of clock rising edge relative to i2c data signal change.
	The unit is i2c module base clock.

config I2C_SDA_TX_HOLD
	int
	depends on I2C_QMSI
	help
	The hold time on the data signal after a negative edge of i2c clock
	while i2c acts as transmitter.
	The unit is i2c module base clock.

config I2C_SDA_RX_HOLD
	int
	depends on I2C_QMSI
	help
	The hold time on the data signal after a negative edge of i2c clock
	while i2c acts as receiver.
	The unit is i2c module base clock.

endif
