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

menuconfig SPI_NRFX
	bool "nRF SPI nrfx drivers"
	default y
	depends on SOC_FAMILY_NRF
	help
	  Enable support for nrfx SPI drivers for nRF MCU series.

if SPI_NRFX

config SOC_NRF52832_ALLOW_SPIM_DESPITE_PAN_58
	depends on SOC_NRF52832
	bool "Allow enabling the SPIM driver despite PAN 58"
	help
	  Allow enabling the nRF SPI Master with EasyDMA, despite
	  Product Anomaly Notice 58 (SPIM: An additional byte is
	  clocked out when RXD.MAXCNT == 1 and TXD.MAXCNT <= 1).
	  Without this override, the SPI Master is only available
	  without EasyDMA. Note that the 'SPIM' and 'SPIS' drivers
	  use EasyDMA, while the 'SPI' driver does not.
	  When used in conjunction with nRF SPIM Devicetree property
	  'anomaly-58-workaround' a workaround can be enabled per SPIM
	  instance.  If you are certain that transactions with
	  RXD.MAXCNT == 1 and TXD.MAXCNT <= 1 will NOT be executed
	  then nRF52832 PPI and GPIOTE resources can be saved by not
	  enabling 'anomaly-58-workaround' via the Devicetree.

# Workaround for not being able to have commas in macro arguments
DT_COMPAT_NORDIC_NRF_SPI  := nordic,nrf-spi
DT_COMPAT_NORDIC_NRF_SPIM := nordic,nrf-spim
DT_COMPAT_NORDIC_NRF_SPIS := nordic,nrf-spis

config SPI_0_NRF_SPI
	def_bool $(dt_nodelabel_has_compat,spi0,$(DT_COMPAT_NORDIC_NRF_SPI))
	select NRFX_SPI0
	help
	  Enable nRF SPI Master without EasyDMA on port 0.

config SPI_0_NRF_SPIM
	def_bool $(dt_nodelabel_has_compat,spi0,$(DT_COMPAT_NORDIC_NRF_SPIM))
	# This driver is not available for nRF52832 because of Product Anomaly 58
	# (SPIM: An additional byte is clocked out when RXD.MAXCNT == 1 and TXD.MAXCNT <= 1)
	# Allow the 'EasyDMA' driver only if this automatic safety-disable is overridden
	depends on (!SOC_NRF52832 || SOC_NRF52832_ALLOW_SPIM_DESPITE_PAN_58)
	select NRFX_SPIM0
	help
	  Enable nRF SPI Master with EasyDMA on port 0.

config SPI_0_NRF_SPIS
	def_bool $(dt_nodelabel_has_compat,spi0,$(DT_COMPAT_NORDIC_NRF_SPIS))
	depends on SPI_SLAVE
	select NRFX_SPIS0
	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.

config SPI_0_NRF_ORC
	hex "SPI Port 0 over-read character"
	depends on SPI_0_NRF_SPI || SPI_0_NRF_SPIM || SPI_0_NRF_SPIS
	range 0x00 0xff
	default 0xff
	help
	  Over-read character. Character clocked out after an over-read
	  of the transmit buffer.

config SPI_1_NRF_SPI
	def_bool $(dt_nodelabel_has_compat,spi1,$(DT_COMPAT_NORDIC_NRF_SPI))
	select NRFX_SPI1
	help
	  Enable nRF SPI Master without EasyDMA on port 1.

config SPI_1_NRF_SPIM
	def_bool $(dt_nodelabel_has_compat,spi1,$(DT_COMPAT_NORDIC_NRF_SPIM))
	# This driver is not available for nRF52832 because of Product Anomaly 58
	# (SPIM: An additional byte is clocked out when RXD.MAXCNT == 1 and TXD.MAXCNT <= 1)
	# Allow the 'EasyDMA' driver only if this automatic safety-disable is overridden
	depends on (!SOC_NRF52832 || SOC_NRF52832_ALLOW_SPIM_DESPITE_PAN_58)
	select NRFX_SPIM1
	help
	  Enable nRF SPI Master with EasyDMA on port 1.

config SPI_1_NRF_SPIS
	def_bool $(dt_nodelabel_has_compat,spi1,$(DT_COMPAT_NORDIC_NRF_SPIS))
	depends on SPI_SLAVE
	select NRFX_SPIS1
	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.

config SPI_1_NRF_ORC
	hex "SPI Port 1 over-read character"
	depends on SPI_1_NRF_SPI || SPI_1_NRF_SPIM || SPI_1_NRF_SPIS
	range 0x00 0xff
	default 0xff
	help
	  Over-read character. Character clocked out after an over-read
	  of the transmit buffer.

config SPI_2_NRF_SPI
	def_bool $(dt_nodelabel_has_compat,spi2,$(DT_COMPAT_NORDIC_NRF_SPI))
	select NRFX_SPI2
	help
	  Enable nRF SPI Master without EasyDMA on port 2.

config SPI_2_NRF_SPIM
	def_bool $(dt_nodelabel_has_compat,spi2,$(DT_COMPAT_NORDIC_NRF_SPIM))
	# This driver is not available for nRF52832 because of Product Anomaly 58
	# (SPIM: An additional byte is clocked out when RXD.MAXCNT == 1 and TXD.MAXCNT <= 1)
	# Allow the 'EasyDMA' driver only if this automatic safety-disable is overridden
	depends on (!SOC_NRF52832 || SOC_NRF52832_ALLOW_SPIM_DESPITE_PAN_58)
	select NRFX_SPIM2
	help
	  Enable nRF SPI Master with EasyDMA on port 2.

config SPI_2_NRF_SPIS
	def_bool $(dt_nodelabel_has_compat,spi2,$(DT_COMPAT_NORDIC_NRF_SPIS))
	depends on SPI_SLAVE
	select NRFX_SPIS2
	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.

config SPI_2_NRF_ORC
	hex "SPI Port 2 over-read character"
	depends on SPI_2_NRF_SPI || SPI_2_NRF_SPIM || SPI_2_NRF_SPIS
	range 0x00 0xff
	default 0xff
	help
	  Over-read character. Character clocked out after an over-read
	  of the transmit buffer.

config SPI_3_NRF_SPIM
	def_bool $(dt_nodelabel_has_compat,spi3,$(DT_COMPAT_NORDIC_NRF_SPIM))
	select NRFX_SPIM3
	help
	  Enable nRF SPI Master with EasyDMA on port 3.

config SPI_3_NRF_SPIS
	def_bool $(dt_nodelabel_has_compat,spi3,$(DT_COMPAT_NORDIC_NRF_SPIS))
	depends on SPI_SLAVE
	select NRFX_SPIS3
	help
	  Enable nRF SPI Slave with EasyDMA on port 3.
	  Due to hardware limitations the implementation supports only simple
	  buffers (consisting of one part) located in RAM.

config SPI_3_NRF_ORC
	hex "SPI Port 3 over-read character"
	depends on SPI_3_NRF_SPIM || SPI_3_NRF_SPIS
	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 "SPIM3 MISO sampling delay"
	depends on SPI_3_NRF_SPIM && (SOC_NRF52833 || SOC_NRF52840)
	range 0 7
	default 2
	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.

config SPI_4_NRF_SPIM
	def_bool $(dt_nodelabel_has_compat,spi4,$(DT_COMPAT_NORDIC_NRF_SPIM))
	select NRFX_SPIM4
	help
	  Enable nRF SPI Master with EasyDMA on port 4.

config SPI_4_NRF_ORC
	hex "SPI Port 4 over-read character"
	depends on SPI_4_NRF_SPIM
	range 0x00 0xff
	default 0xff
	help
	  Over-read character. Character clocked out after an over-read
	  of the transmit buffer.

config SPI_4_NRF_RX_DELAY
	int "SPIM4 MISO sampling delay"
	depends on SPI_4_NRF_SPIM && SOC_NRF5340_CPUAPP
	range 0 7
	default 2
	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.

config SPI_NRFX_RAM_BUFFER_SIZE
	int "Size of RAM buffers for SPIM peripherals"
	default 8
	depends on NRFX_SPIM
	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 # SPI_NRFX
