# 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
	depends on MULTITHREADING
	select PINCTRL
	help
	  Enable support for nrfx SPI drivers for nRF MCU series.

if SPI_NRFX

config SPI_NRFX_SPI
	def_bool y
	depends on DT_HAS_NORDIC_NRF_SPI_ENABLED
	select NRFX_SPI0 if HAS_HW_NRF_SPI0
	select NRFX_SPI1 if HAS_HW_NRF_SPI1
	select NRFX_SPI2 if HAS_HW_NRF_SPI2

config SPI_NRFX_SPIM
	def_bool y
	depends on DT_HAS_NORDIC_NRF_SPIM_ENABLED
	select NRFX_SPIM0 if HAS_HW_NRF_SPIM0
	select NRFX_SPIM1 if HAS_HW_NRF_SPIM1
	select NRFX_SPIM2 if HAS_HW_NRF_SPIM2
	select NRFX_SPIM3 if HAS_HW_NRF_SPIM3
	select NRFX_SPIM4 if HAS_HW_NRF_SPIM4
	select NRFX_SPIM00 if HAS_HW_NRF_SPIM00
	select NRFX_SPIM20 if HAS_HW_NRF_SPIM20
	select NRFX_SPIM21 if HAS_HW_NRF_SPIM21
	select NRFX_SPIM22 if HAS_HW_NRF_SPIM22
	select NRFX_SPIM30 if HAS_HW_NRF_SPIM30
	select NRFX_SPIM120 if HAS_HW_NRF_SPIM120
	select NRFX_SPIM121 if HAS_HW_NRF_SPIM121
	select NRFX_SPIM130 if HAS_HW_NRF_SPIM130
	select NRFX_SPIM131 if HAS_HW_NRF_SPIM131
	select NRFX_SPIM132 if HAS_HW_NRF_SPIM132
	select NRFX_SPIM133 if HAS_HW_NRF_SPIM133
	select NRFX_SPIM134 if HAS_HW_NRF_SPIM134
	select NRFX_SPIM135 if HAS_HW_NRF_SPIM135
	select NRFX_SPIM136 if HAS_HW_NRF_SPIM136
	select NRFX_SPIM137 if HAS_HW_NRF_SPIM137

config SPI_NRFX_SPIS
	def_bool y
	depends on DT_HAS_NORDIC_NRF_SPIS_ENABLED
	select SPI_SLAVE
	select NRFX_SPIS0 if HAS_HW_NRF_SPIS0
	select NRFX_SPIS1 if HAS_HW_NRF_SPIS1
	select NRFX_SPIS2 if HAS_HW_NRF_SPIS2
	select NRFX_SPIS3 if HAS_HW_NRF_SPIS3

config SOC_NRF52832_ALLOW_SPIM_DESPITE_PAN_58
	depends on SOC_NRF52832
	select NRFX_PPI
	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.

config SPI_NRFX_RAM_BUFFER_SIZE
	int "Size of RAM buffers for SPIM peripherals"
	default 8
	depends on SPI_NRFX_SPIM
	help
	  Because of using EasyDMA, SPIM peripherals cannot use transmit and
	  receive buffers from all memory locations. They are restricted to
	  buffers located in certain RAM memories only. Therefore, each SPIM
	  driver instance needs to use an intermediate local RAM buffer,
	  to transfer data in chunks not exceeding the size of that buffer,
	  and to copy those chunks between the local buffer and the one
	  specified in the transfer request if the latter is not accessible
	  by EasyDMA.

	  This option specifies the size in bytes of such local RAM buffers
	  for both TX and RX paths. A size of 0 means that this feature should
	  be disabled and the driver user must take care of not making transfer
	  requests with buffers not accessible by EasyDMA since such transfers
	  will fail.

config SPI_NRFX_WAKE_TIMEOUT_US
	int "Maximum time to wait for SPI slave to wake up"
	default 200
	help
	  Maximum amount of time (in microseconds) that SPI master should wait
	  for SPI slave to wake up after the WAKE line is asserted. Used only
	  by instances that have the WAKE line configured (see the wake-gpios
	  devicetree property).

endif # SPI_NRFX
