From d64dc771f314937ba522e2ab8fe28d19b9d074a4 Mon Sep 17 00:00:00 2001 From: Adam Wojasinski Date: Mon, 25 Apr 2022 15:11:45 +0200 Subject: [PATCH] drivers: spi: spi_nrfx_spim: utilize EasyDMA property from devicetree This commit aligns SPIM shim to utilize memory-region property from nordic,nrf-uarte compatible. The memory-region is not required property that enables user to specify placement of dma buffers in memory region. It is done by assigning to memory-region property, phandle to node with zephyr,memory-region and mimo-sram compatible. When memory-region property is not specified for given instance, buffer is placed in default RAM region with other data. Signed-off-by: Adam Wojasinski --- drivers/spi/spi_nrfx_spim.c | 34 ++++++++++++++++++++------- dts/bindings/spi/nordic,nrf-spim.yaml | 2 +- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/drivers/spi/spi_nrfx_spim.c b/drivers/spi/spi_nrfx_spim.c index 933c93cd340..61b8487c5da 100644 --- a/drivers/spi/spi_nrfx_spim.c +++ b/drivers/spi/spi_nrfx_spim.c @@ -15,20 +15,25 @@ #include #include #include +#include #include LOG_MODULE_REGISTER(spi_nrfx_spim, CONFIG_SPI_LOG_LEVEL); #include "spi_context.h" +#if (CONFIG_SPI_NRFX_RAM_BUFFER_SIZE > 0) +#define SPI_BUFFER_IN_RAM 1 +#endif + struct spi_nrfx_data { struct spi_context ctx; const struct device *dev; size_t chunk_len; bool busy; bool initialized; -#if (CONFIG_SPI_NRFX_RAM_BUFFER_SIZE > 0) - uint8_t buffer[CONFIG_SPI_NRFX_RAM_BUFFER_SIZE]; +#if SPI_BUFFER_IN_RAM + uint8_t *buffer; #endif #ifdef CONFIG_SOC_NRF52832_ALLOW_SPIM_DESPITE_PAN_58 bool anomaly_58_workaround_active; @@ -291,8 +296,8 @@ static void transfer_next_chunk(const struct device *dev) const uint8_t *tx_buf = ctx->tx_buf; #if (CONFIG_SPI_NRFX_RAM_BUFFER_SIZE > 0) if (spi_context_tx_buf_on(ctx) && !nrfx_is_in_ram(tx_buf)) { - if (chunk_len > sizeof(dev_data->buffer)) { - chunk_len = sizeof(dev_data->buffer); + if (chunk_len > CONFIG_SPI_NRFX_RAM_BUFFER_SIZE) { + chunk_len = CONFIG_SPI_NRFX_RAM_BUFFER_SIZE; } memcpy(dev_data->buffer, tx_buf, chunk_len); @@ -481,11 +486,12 @@ static int spim_nrfx_pm_action(const struct device *dev, * being operated on. Since DT_INST() makes no guarantees about that, * it won't work. */ -#define SPIM(idx) DT_NODELABEL(spi##idx) -#define SPIM_PROP(idx, prop) DT_PROP(SPIM(idx), prop) +#define SPIM(idx) DT_NODELABEL(spi##idx) +#define SPIM_PROP(idx, prop) DT_PROP(SPIM(idx), prop) +#define SPIM_HAS_PROP(idx, prop) DT_NODE_HAS_PROP(SPIM(idx), prop) -#define SPIM_NRFX_MISO_PULL_DOWN(idx) DT_PROP(SPIM(idx), miso_pull_down) -#define SPIM_NRFX_MISO_PULL_UP(idx) DT_PROP(SPIM(idx), miso_pull_up) +#define SPIM_NRFX_MISO_PULL_DOWN(idx) DT_PROP(SPIM(idx), miso_pull_down) +#define SPIM_NRFX_MISO_PULL_UP(idx) DT_PROP(SPIM(idx), miso_pull_up) #define SPIM_NRFX_MISO_PULL(idx) \ (SPIM_PROP(idx, miso_pull_up) \ @@ -546,10 +552,16 @@ static int spim_nrfx_pm_action(const struct device *dev, (return anomaly_58_workaround_init(dev);), \ (return 0;)) \ } \ + IF_ENABLED(SPI_BUFFER_IN_RAM, \ + (static uint8_t spim_##idx##_buffer \ + [CONFIG_SPI_NRFX_RAM_BUFFER_SIZE] \ + SPIM_MEMORY_SECTION(idx);)) \ static struct spi_nrfx_data spi_##idx##_data = { \ SPI_CONTEXT_INIT_LOCK(spi_##idx##_data, ctx), \ SPI_CONTEXT_INIT_SYNC(spi_##idx##_data, ctx), \ SPI_CONTEXT_CS_GPIOS_INITIALIZE(SPIM(idx), ctx) \ + IF_ENABLED(SPI_BUFFER_IN_RAM, \ + (.buffer = spim_##idx##_buffer,)) \ .dev = DEVICE_DT_GET(SPIM(idx)), \ .busy = false, \ }; \ @@ -580,6 +592,12 @@ static int spim_nrfx_pm_action(const struct device *dev, POST_KERNEL, CONFIG_SPI_INIT_PRIORITY, \ &spi_nrfx_driver_api) +#define SPIM_MEMORY_SECTION(idx) \ + COND_CODE_1(SPIM_HAS_PROP(idx, memory_regions), \ + (__attribute__((__section__(LINKER_DT_NODE_REGION_NAME( \ + DT_PHANDLE(SPIM(idx), memory_regions)))))), \ + ()) + #ifdef CONFIG_SPI_0_NRF_SPIM SPI_NRFX_SPIM_DEVICE(0); #endif diff --git a/dts/bindings/spi/nordic,nrf-spim.yaml b/dts/bindings/spi/nordic,nrf-spim.yaml index a22e7b66d29..809a4ff16d3 100644 --- a/dts/bindings/spi/nordic,nrf-spim.yaml +++ b/dts/bindings/spi/nordic,nrf-spim.yaml @@ -5,7 +5,7 @@ description: Nordic nRF family SPIM (SPI master with EasyDMA) compatible: "nordic,nrf-spim" -include: nordic,nrf-spi-common.yaml +include: ["nordic,nrf-spi-common.yaml", "memory-region.yaml"] properties: miso-pull-up: