# Copyright (c) 2017 - 2018, Nordic Semiconductor ASA
#
# SPDX-License-Identifier: Apache-2.0
#

menuconfig SPI_NRFX
	bool "nRF SPI nrfx drivers"
	depends on SOC_FAMILY_NRF
	help
	  Enable support for nrfx SPI drivers for nRF MCU series.
	  Peripherals with the same instance ID cannot be used together,
	  e.g. SPI_0 and I2C_0. You may need to disable I2C_0 or I2C_1.

if SPI_NRFX

# Nordic TWIx0 and SPIx0 instances can not be used at the same time.
if SPI_0 && !I2C_0

choice
	prompt "SPI Port 0 Driver type"
	optional

config SPI_0_NRF_SPI
	bool "nRF SPI 0"
	depends on SOC_SERIES_NRF52X || SOC_SERIES_NRF51X
	select NRFX_SPI
	help
	  Enable nRF SPI Master without EasyDMA on port 0.

config SPI_0_NRF_SPIM
	bool "nRF SPIM 0"
	depends on SOC_NRF52840
	select NRFX_SPIM
	help
	  Enable nRF SPI Master with EasyDMA on port 0.

config SPI_0_NRF_SPIS
	bool "nRF SPIS 0"
	depends on SOC_SERIES_NRF52X
	select SPI_SLAVE
	select NRFX_SPIS
	help
	  Enable nRF SPI Slave with EasyDMA on port 0.
	  Due to hardware limitations the implementation supports only simple
	  buffers (consisting of one part) located in RAM.

endchoice

if SPI_0_NRF_SPI || SPI_0_NRF_SPIM || SPI_0_NRF_SPIS

config SPI_0_NRF_SCK_PIN
	int "SCK pin number"
	range 0 47 if SOC_NRF52840_QIAA
	range 0 31
	help
	  GPIO pin number to use for SCK.

config SPI_0_NRF_MOSI_PIN
	int "MOSI pin number"
	range 0 47 if SOC_NRF52840_QIAA
	range 0 31
	help
	  GPIO pin number to use for MOSI.

config SPI_0_NRF_MISO_PIN
	int "MISO pin number"
	range 0 47 if SOC_NRF52840_QIAA
	range 0 31
	help
	  GPIO pin number to use for MISO.

config SPI_0_NRF_ORC
	hex "Over-read Character"
	range 0x00 0xff
	default 0xff
	help
	  Over-read character. Character clocked out after an over-read
	  of the transmit buffer.

endif # SPI_0_NRF_SPI || SPI_0_NRF_SPIM || SPI_0_NRF_SPIS

if SPI_0_NRF_SPIS

config SPI_0_NRF_CSN_PIN
	int "CSN pin number"
	range 0 47 if SOC_NRF52840_QIAA
	range 0 31
	help
	  GPIO pin number to use for Chip Select.

config SPI_0_NRF_DEF
	hex "Default Character"
	range 0x00 0xff
	default 0xff
	help
	  Default character. Character clocked out when the slave was not
	  provided with buffers and is ignoring the transaction.

endif # SPI_0_NRF_SPIS

endif # SPI_0 && !I2C_0

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

choice
	prompt "SPI Port 1 Driver type"
	optional

config SPI_1_NRF_SPI
	bool "nRF SPI 1"
	depends on SOC_SERIES_NRF52X || SOC_SERIES_NRF51X
	select NRFX_SPI
	help
	  Enable nRF SPI Master without EasyDMA on port 1.

config SPI_1_NRF_SPIM
	bool "nRF SPIM 1"
	depends on SOC_NRF52840
	select NRFX_SPIM
	help
	  Enable nRF SPI Master with EasyDMA on port 1.

config SPI_1_NRF_SPIS
	bool "nRF SPIS 1"
	depends on SOC_SERIES_NRF52X || SOC_SERIES_NRF51X
	select SPI_SLAVE
	select NRFX_SPIS
	help
	  Enable nRF SPI Slave with EasyDMA on port 1.
	  Due to hardware limitations the implementation supports only simple
	  buffers (consisting of one part) located in RAM.

endchoice

if SPI_1_NRF_SPI || SPI_1_NRF_SPIM || SPI_1_NRF_SPIS

config SPI_1_NRF_SCK_PIN
	int "SCK pin number"
	range 0 47 if SOC_NRF52840_QIAA
	range 0 31
	help
	  GPIO pin number to use for SCK.

config SPI_1_NRF_MOSI_PIN
	int "MOSI pin number"
	range 0 47 if SOC_NRF52840_QIAA
	range 0 31
	help
	  GPIO pin number to use for MOSI.

config SPI_1_NRF_MISO_PIN
	int "MISO pin number"
	range 0 47 if SOC_NRF52840_QIAA
	range 0 31
	help
	  GPIO pin number to use for MISO.

config SPI_1_NRF_ORC
	hex "Over-read Character"
	range 0x00 0xff
	default 0xff
	help
	  Over-read character. Character clocked out after an over-read
	  of the transmit buffer.

endif # SPI_1_NRF_SPI || SPI_1_NRF_SPIM || SPI_1_NRF_SPIS

if SPI_1_NRF_SPIS

config SPI_1_NRF_CSN_PIN
	int "CSN pin number"
	range 0 47 if SOC_NRF52840_QIAA
	range 0 31
	help
	  GPIO pin number to use for Chip Select.

config SPI_1_NRF_DEF
	hex "Default Character"
	range 0x00 0xff
	default 0xff
	help
	  Default character. Character clocked out when the slave was not
	  provided with buffers and is ignoring the transaction.

endif # SPI_1_NRF_SPIS

endif # SPI_1 && !I2C_1

if SPI_2

choice
	prompt "SPI Port 2 Driver type"
	optional

config SPI_2_NRF_SPI
	bool "nRF SPI 2"
	depends on SOC_SERIES_NRF52X
	select NRFX_SPI
	help
	  Enable nRF SPI Master without EasyDMA on port 2.

config SPI_2_NRF_SPIM
	bool "nRF SPIM 2"
	depends on SOC_NRF52840
	select NRFX_SPIM
	help
	  Enable nRF SPI Master with EasyDMA on port 2.

config SPI_2_NRF_SPIS
	bool "nRF SPIS 2"
	depends on SOC_SERIES_NRF52X
	select SPI_SLAVE
	select NRFX_SPIS
	help
	  Enable nRF SPI Slave with EasyDMA on port 2.
	  Due to hardware limitations the implementation supports only simple
	  buffers (consisting of one part) located in RAM.

endchoice

if SPI_2_NRF_SPI || SPI_2_NRF_SPIM || SPI_2_NRF_SPIS

config SPI_2_NRF_SCK_PIN
	int "SCK pin number"
	range 0 47 if SOC_NRF52840_QIAA
	range 0 31
	help
	  GPIO pin number to use for SCK.

config SPI_2_NRF_MOSI_PIN
	int "MOSI pin number"
	range 0 47 if SOC_NRF52840_QIAA
	range 0 31
	help
	  GPIO pin number to use for MOSI.

config SPI_2_NRF_MISO_PIN
	int "MISO pin number"
	range 0 47 if SOC_NRF52840_QIAA
	range 0 31
	help
	  GPIO pin number to use for MISO.

config SPI_2_NRF_ORC
	hex "Over-read Character"
	range 0x00 0xff
	default 0xff
	help
	  Over-read character. Character clocked out after an over-read
	  of the transmit buffer.

endif # SPI_2_NRF_SPI || SPI_2_NRF_SPIM || SPI_2_NRF_SPIS

if SPI_2_NRF_SPIS

config SPI_2_NRF_CSN_PIN
	int "CSN pin number"
	range 0 47 if SOC_NRF52840_QIAA
	range 0 31
	help
	  GPIO pin number to use for Chip Select.

config SPI_2_NRF_DEF
	hex "Default Character"
	range 0x00 0xff
	default 0xff
	help
	  Default character. Character clocked out when the slave was not
	  provided with buffers and is ignoring the transaction.

endif # SPI_2_NRF_SPIS

endif # SPI_2

if SPI_3

config SPI_3_NRF_SPIM
	bool
	depends on SOC_NRF52840
	select NRFX_SPIM
	default y

if SPI_3_NRF_SPIM

config SPI_3_NRF_SCK_PIN
	int "SCK pin number"
	range 0 47 if SOC_NRF52840_QIAA
	range 0 31
	help
	  GPIO pin number to use for SCK

config SPI_3_NRF_MOSI_PIN
	int "MOSI pin number"
	range 0 47 if SOC_NRF52840_QIAA
	range 0 31
	help
	  GPIO pin number to use for MOSI

config SPI_3_NRF_MISO_PIN
	int "MISO pin number"
	range 0 47 if SOC_NRF52840_QIAA
	range 0 31
	help
	  GPIO pin number to use for MISO

config SPI_3_NRF_ORC
	hex "Over-read Character"
	range 0x00 0xff
	default 0xff
	help
	  Over-read character. Character clocked out after an over-read
	  of the transmit buffer.

config SPI_3_NRF_RX_DELAY
	int "MISO sampling delay"
	range 0 7
	default 0
	help
	  Number of 64 MHz clock cycles (15.625 ns) delay from the sampling
	  edge of SCK (leading or trailing, depending on the CPHA setting used)
	  until the input serial data on MISO is actually sampled.

endif # SPI_3_NRF_SPIM

endif # SPI_3

if NRFX_SPIM

config SPI_NRFX_RAM_BUFFER_SIZE
	int "Size of RAM buffer"
	default 0
	help
	  SPIM peripherals cannot transmit data directly from flash. Therefore,
	  a buffer in RAM needs to be provided for each instance of SPI driver
	  using SPIM peripheral, so that the driver can copy there a chunk of
	  data from flash and transmit it.
	  The size is specified in bytes. A size of 0 means that this feature
	  should be disabled, and the application must then take care of not
	  supplying buffers located in flash to the driver, otherwise such
	  transfers will fail.

endif # NRFX_SPIM

endif # SPI_NRFX
