# Kconfig - nrfx I2C support
#
# Copyright (c) 2018, Nordic Semiconductor ASA
#
# SPDX-License-Identifier: Apache-2.0
#

menuconfig I2C_NRFX
	bool "nRF TWI nrfx drivers"
	default y
	depends on SOC_FAMILY_NRF
	select HAS_DTS_I2C
	help
	  Enable support for nrfx TWI drivers for nRF MCU series.
	  Peripherals with the same instance ID cannot be used together,
	  e.g. I2C_0 and SPI_0. You may need to disable SPI_0 or SPI_1.

if I2C_NRFX

# In most Nordic SoCs the SPI and TWI peripherals with the same instance
# number share certain resources and cannot be used at the same time.
# In nRF52810 there are only single instances of these peripherals and
# they are arranged in a different way so this limitation does not apply.
if I2C_0 && (!SPI_0 || SOC_NRF52810)

choice I2C_0_NRF_TYPE
	prompt "I2C Port 0 Driver type"

config I2C_0_NRF_TWI
	bool "nRF TWI 0"
	depends on HAS_HW_NRF_TWI0
	select NRFX_TWI
	help
	  Enable nRF TWI Master without EasyDMA on port 0.

config I2C_0_NRF_TWIM
	bool "nRF TWIM 0"
	depends on HAS_HW_NRF_TWIM0
	select NRFX_TWIM
	help
	  Enable nRF TWI Master with EasyDMA on port 0.
	  This peripheral accepts transfers from RAM only,
	  if provided buffer is placed in flash, transfer will fail.

endchoice

endif # I2C_0 && (!SPI_0 || SOC_NRF52810)

# Nordic TWIx1 and SPIx1 instances can not be used at the same time.
if I2C_1 && !SPI_1

choice I2C_1_NRF_TYPE
	prompt "I2C Port 1 Driver type"

config I2C_1_NRF_TWI
	bool "nRF TWI 1"
	depends on HAS_HW_NRF_TWI1
	select NRFX_TWI
	help
	  Enable nRF TWI Master without EasyDMA on port 1.

config I2C_1_NRF_TWIM
	bool "nRF TWIM 1"
	depends on HAS_HW_NRF_TWIM1
	select NRFX_TWIM
	help
	  Enable nRF TWI Master with EasyDMA on port 1.
	  This peripheral accepts transfers from RAM only,
	  if provided buffer is placed in flash, transfer will fail.

endchoice

endif # I2C_1 && !SPI_1

# Nordic TWIx2 and SPIx2 instances can not be used at the same time.
if I2C_2 && !SPI_2

choice I2C_2_NRF_TYPE
	prompt "I2C Port 2 Driver type"

config I2C_2_NRF_TWIM
	bool "nRF TWIM 2"
	depends on HAS_HW_NRF_TWIM2
	select NRFX_TWIM
	help
	  Enable nRF TWI Master with EasyDMA on port 2.
	  This peripheral accepts transfers from RAM only,
	  if provided buffer is placed in flash, transfer will fail.

endchoice

endif # I2C_2 && !SPI_2

# Nordic TWIx3 and SPIx3 instances can not be used at the same time.
if I2C_3 && !SPI_3

choice I2C_3_NRF_TYPE
	prompt "I2C Port 3 Driver type"

config I2C_3_NRF_TWIM
	bool "nRF TWIM 3"
	depends on HAS_HW_NRF_TWIM3
	select NRFX_TWIM
	help
	  Enable nRF TWI Master with EasyDMA on port 3.
	  This peripheral accepts transfers from RAM only,
	  if provided buffer is placed in flash, transfer will fail.

endchoice

endif # I2C_3 && !SPI_3

endif #I2C_NRFX
