# Kconfig - I2C configuration options

#
# Copyright (c) 2015 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0
#

#
# 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"
	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 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 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 SAM3X I2C Driver"
	depends on SOC_SERIES_SAM3X
	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 TWIHS_SAM
	bool "Atmel SAM I2C driver"
	depends on SOC_FAMILY_SAM
	default n
	help
	  Enable Atmel SAM MCU Family I2C bus driver.

config I2C_MCUX
	bool "MCUX I2C driver"
	depends on HAS_MCUX
	default n
	help
	  Enable the mcux I2C driver.

config I2C_NRF5
	bool "NRF5 I2C driver"
	depends on SOC_FAMILY_NRF5
	select GPIO
	default n
	help
	  This option enables the I2C driver for Nordic Semiconductor nRF5
	  family processors.

config I2C_NRF5_GPIO_SCA_PIN
	int "SCA Pin Number"
	range 0 31
	depends on I2C_NRF5
	help
	  The GPIO pin to use for SCA.

config I2C_NRF5_GPIO_SCL_PIN
	int "SCL Pin Number"
	range 0 31
	depends on I2C_NRF5
	help
	  The GPIO pin to use for SCL.

config I2C_STM32LX
	bool "STM32Lx MCU I2C Driver"
	depends on SOC_FAMILY_STM32 && SOC_SERIES_STM32L4X
	default n
	help
	  Enable I2C support on the STM32Lxx family of processors.

config I2C_STM32LX_INTERRUPT
	bool "STM32Lx MCU I2C Interrupt Support"
	depends on I2C_STM32LX
	default n
	help
	  Enable Interrupt support for the I2C Driver of STM32Lxx family.

config I2C_BITBANG
	bool
	default n
	help
	  Enable library used for software driven (bit banging) I2C support

source "drivers/i2c/Kconfig.sbcon"

source "drivers/i2c/Kconfig.gpio"

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

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

config SYS_LOG_I2C_LEVEL
	int
	prompt "I2C log level"
	depends on SYS_LOG
	default 0
	help
	  Sets log level for I2C drivers.
	  Levels are:
	  - 0 OFF, do not write
	  - 1 ERROR, only write SYS_LOG_ERR
	  - 2 WARNING, write SYS_LOG_WRN in addition to previous level
	  - 3 INFO, write SYS_LOG_INF in addition to previous levels
	  - 4 DEBUG, write SYS_LOG_DBG in addition to previous levels

config I2C_DW_SHARED_IRQ
	bool
	default n
	depends on I2C_DW

choice
	prompt "I2C_0 Interrupts via"
	default I2C_DW_0_IRQ_DIRECT
	depends on I2C_0 && I2C_DW

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

config I2C_DW_0_IRQ_SHARED
	bool "Shared IRQ"
	depends on SHARED_IRQ
	select I2C_DW_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_DW_0_IRQ_SHARED_NAME
	string "Device name for Shared IRQ"
	depends on I2C_0 && I2C_DW_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 Port 0"
	default n

config I2C_0_NAME
	string "Port 0 device name"
	depends on I2C_0
	default "I2C_0"

config I2C_0_DEFAULT_CFG
	hex "Port 0 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 include/i2c.h file for proper values.

config I2C_0_IRQ_PRI
	int "Port 0 interrupt priority"
	depends on I2C_0
	help
	  IRQ priority.

config I2C_1
	bool "Enable I2C Port 1"
	default n

config I2C_1_NAME
	string "Port 1 device name"
	default "I2C_1"
	depends on I2C_1

config I2C_1_DEFAULT_CFG
	hex "Port 1 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 include/i2c.h file for proper values.

config I2C_1_IRQ_PRI
	int "Port 1 interrupt priority"
	depends on I2C_1
	help
	  IRQ priority.

config I2C_2
	bool "Enable I2C Port 2"
	default n

config I2C_2_NAME
	string "Port 2 device name"
	default "I2C_2"
	depends on I2C_2

config I2C_2_DEFAULT_CFG
	hex "Port 2 default configuration"
	depends on I2C_2
	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 include/i2c.h file for proper values.

config I2C_2_IRQ_PRI
	int "Port 2 interrupt priority"
	depends on I2C_2
	help
	  IRQ priority.

config I2C_SS_0
	bool "Enable I2C_SS_0"
	depends on I2C_QMSI_SS
	default n

config I2C_SS_0_NAME
	string "Select a name for finding the device"
	depends on I2C_SS_0
	default "I2C_SS_0"

config I2C_SS_0_DEFAULT_CFG
	hex "I2C default configuration"
	depends on I2C_SS_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_SS_1
	bool "Enable I2C SS Port 1"
	depends on I2C_QMSI_SS
	default n

config I2C_SS_1_NAME
	string "Select a name for finding the device"
	default "I2C_SS_1"
	depends on I2C_SS_1

config I2C_SS_1_DEFAULT_CFG
	hex "I2C SS default configuration"
	depends on I2C_SS_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_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_SS_SDA_SETUP
	int
	depends on 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_SETUP
	int
	depends on I2C_QMSI
	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 # I2C
