You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ac...@apache.org on 2020/01/08 10:27:26 UTC

[incubator-nuttx] 01/08: arch: cxd56xx: Enable DMA settings dynamically

This is an automated email from the ASF dual-hosted git repository.

acassis pushed a commit to branch pr54
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git

commit 00a6f1d8353f54b666119e67340677c2a471b4d8
Author: Alin Jerpelea <al...@sony.com>
AuthorDate: Sat Dec 28 09:07:21 2019 +0900

    arch: cxd56xx: Enable DMA settings dynamically
---
 arch/arm/src/cxd56xx/cxd56_spi.c                  | 198 ++++++++++++++--------
 arch/arm/src/cxd56xx/cxd56_spi.h                  |  28 +++
 boards/arm/cxd56xx/common/src/cxd56_altmdm_spi.c  | 129 ++++++++------
 boards/arm/cxd56xx/common/src/cxd56_ili9340.c     |  27 +++
 boards/arm/cxd56xx/common/src/cxd56_lpm013m091a.c |  27 +++
 boards/arm/cxd56xx/spresense/Kconfig              |   4 +
 boards/arm/cxd56xx/spresense/include/board.h      |  14 ++
 boards/arm/cxd56xx/spresense/src/cxd56_spi.c      |   6 -
 8 files changed, 302 insertions(+), 131 deletions(-)

diff --git a/arch/arm/src/cxd56xx/cxd56_spi.c b/arch/arm/src/cxd56xx/cxd56_spi.c
index 98a85c8..fb9724a 100644
--- a/arch/arm/src/cxd56xx/cxd56_spi.c
+++ b/arch/arm/src/cxd56xx/cxd56_spi.c
@@ -46,6 +46,7 @@
 #include <semaphore.h>
 #include <errno.h>
 #include <debug.h>
+#include <string.h>
 
 #include <arch/board/board.h>
 #include <nuttx/irq.h>
@@ -58,7 +59,7 @@
 #include "chip.h"
 
 #include "cxd56_spi.h"
-#include "chip/cxd56_spi.h"
+#include "hardware/cxd56_spi.h"
 #include "cxd56_clock.h"
 #include "cxd56_pinconfig.h"
 #include "cxd56_powermgr.h"
@@ -99,6 +100,7 @@ struct cxd56_spidev_s
   uint8_t          port;       /* Port number */
   int              initialized; /* Initialized flag */
 #ifdef CONFIG_CXD56_DMAC
+  bool             dmaenable;  /* Use DMA or not */
   DMA_HANDLE       rxdmach;    /* RX DMA channel handle */
   DMA_HANDLE       txdmach;    /* TX DMA channel handle */
   sem_t            dmasem;     /* Wait for DMA to complete */
@@ -187,19 +189,10 @@ static const struct spi_ops_s g_spi4ops =
 #endif
   .send              = spi_send,
 #ifdef CONFIG_SPI_EXCHANGE
-#  if defined(CONFIG_CXD56_DMAC_SPI4_TX) || defined(CONFIG_CXD56_DMAC_SPI4_RX)
-  .exchange          = spi_dmaexchange,
-#  else
   .exchange          = spi_exchange,
-#  endif
 #else
-#  if defined(CONFIG_CXD56_DMAC_SPI4_TX) || defined(CONFIG_CXD56_DMAC_SPI4_RX)
-  .sndblock          = spi_dmasndblock,
-  .recvblock         = spi_dmarecvblock,
-#  else
   .sndblock          = spi_sndblock,
   .recvblock         = spi_recvblock,
-#  endif
 #endif
 #ifdef CONFIG_SPI_CALLBACK
   .registercallback  = cxd56_spi4register, /* Provided externally */
@@ -236,19 +229,10 @@ static const struct spi_ops_s g_spi5ops =
 #endif
   .send              = spi_send,
 #ifdef CONFIG_SPI_EXCHANGE
-#  if defined(CONFIG_CXD56_DMAC_SPI5_TX) || defined(CONFIG_CXD56_DMAC_SPI5_RX)
-  .exchange          = spi_dmaexchange,
-#  else
   .exchange          = spi_exchange,
-#  endif
 #else
-#  if defined(CONFIG_CXD56_DMAC_SPI5_TX) || defined(CONFIG_CXD56_DMAC_SPI5_RX)
-  .sndblock          = spi_dmasndblock,
-  .recvblock         = spi_dmarecvblock,
-#  else
   .sndblock          = spi_sndblock,
   .recvblock         = spi_recvblock,
-#  endif
 #endif
 #ifdef CONFIG_SPI_CALLBACK
   .registercallback  = cxd56_spi5register, /* Provided externally */
@@ -623,6 +607,7 @@ static void spi_setbits(FAR struct spi_dev_s *dev, int nbits)
        */
 
       priv->nbits = nbits;
+#ifdef CONFIG_CXD56_DMAC
       if (priv->nbits > 8)
         {
           priv->txconfig.dest_width = CXD56_DMAC_WIDTH16;
@@ -637,6 +622,7 @@ static void spi_setbits(FAR struct spi_dev_s *dev, int nbits)
           priv->rxconfig.dest_width = CXD56_DMAC_WIDTH8;
           priv->rxconfig.src_width = CXD56_DMAC_WIDTH8;
         }
+#endif
     }
 }
 
@@ -706,10 +692,10 @@ static uint16_t spi_send(FAR struct spi_dev_s *dev, uint16_t wd)
 }
 
 /****************************************************************************
- * Name: spi_exchange
+ * Name: spi_do_exchange
  *
  * Description:
- *   Exahange a block of data from SPI. Required.
+ *   Exchange a block of data from SPI. Required.
  *
  * Input Parameters:
  *   dev      - Device-specific state data
@@ -726,8 +712,8 @@ static uint16_t spi_send(FAR struct spi_dev_s *dev, uint16_t wd)
  *
  ****************************************************************************/
 
-static void spi_exchange(FAR struct spi_dev_s *dev, FAR const void *txbuffer,
-                         FAR void *rxbuffer, size_t nwords)
+static void spi_do_exchange(FAR struct spi_dev_s *dev, FAR const void *txbuffer,
+                            FAR void *rxbuffer, size_t nwords)
 {
   FAR struct cxd56_spidev_s *priv = (FAR struct cxd56_spidev_s *)dev;
   uint32_t regval                 = 0;
@@ -829,6 +815,44 @@ static void spi_exchange(FAR struct spi_dev_s *dev, FAR const void *txbuffer,
 }
 
 /****************************************************************************
+ * Name: spi_exchange
+ *
+ * Description:
+ *   Wrapper function of exchange a block of data from SPI.
+ *
+ * Input Parameters:
+ *   dev      - Device-specific state data
+ *   txbuffer - A pointer to the buffer of data to be sent
+ *   rxbuffer - A pointer to the buffer in which to receive data
+ *   nwords   - the length of data that to be exchanged in units of words.
+ *              The wordsize is determined by the number of bits-per-word
+ *              selected for the SPI interface.  If nbits <= 8, the data is
+ *              packed into uint8_t's; if nbits >8, the data is packed into
+ *              uint16_t's
+ *
+ * Returned Value:
+ *   None
+ *
+ ****************************************************************************/
+
+static void spi_exchange(FAR struct spi_dev_s *dev, FAR const void *txbuffer,
+                         FAR void *rxbuffer, size_t nwords)
+{
+#ifdef CONFIG_CXD56_DMAC
+  FAR struct cxd56_spidev_s *priv = (FAR struct cxd56_spidev_s *)dev;
+
+  if (priv->dmaenable)
+    {
+      spi_dmaexchange(dev, txbuffer, rxbuffer, nwords);
+    }
+  else
+#endif
+    {
+      spi_do_exchange(dev, txbuffer, rxbuffer, nwords);
+    }
+}
+
+/****************************************************************************
  * Name: spi_sndblock
  *
  * Description:
@@ -1143,55 +1167,10 @@ FAR struct spi_dev_s *cxd56_spibus_initialize(int port)
   priv->spibasefreq = cxd56_get_spi_baseclock(port);
 
   /* DMA settings */
-
-#if defined(CONFIG_CXD56_DMAC_SPI4_TX) || defined(CONFIG_CXD56_DMAC_SPI4_RX)
-  if (port == 4)
-    {
-#if defined(CONFIG_CXD56_DMAC_SPI4_TX)
-      priv->txconfig.channel_cfg = CXD56_DMA_PERIPHERAL_SPI4_TX;
-      priv->txdmach  = cxd56_dmachannel(CONFIG_CXD56_DMAC_SPI4_TX_CH,
-                                        CONFIG_CXD56_DMAC_SPI4_TX_MAXSIZE);
-      if (priv->txdmach == NULL)
-        {
-          return NULL;
-        }
-#endif
-#if defined(CONFIG_CXD56_DMAC_SPI4_RX)
-      priv->rxconfig.channel_cfg = CXD56_DMA_PERIPHERAL_SPI4_RX;
-      priv->rxdmach  = cxd56_dmachannel(CONFIG_CXD56_DMAC_SPI4_RX_CH,
-                                        CONFIG_CXD56_DMAC_SPI4_RX_MAXSIZE);
-      if (priv->rxdmach == NULL)
-        {
-          return NULL;
-        }
-#endif
-      nxsem_init(&priv->dmasem, 0, 0);
-    }
-#endif
-
-#if defined(CONFIG_CXD56_DMAC_SPI5_TX) || defined(CONFIG_CXD56_DMAC_SPI5_RX)
-  if (port == 5)
-    {
-#if defined(CONFIG_CXD56_DMAC_SPI5_TX)
-      priv->txconfig.channel_cfg = CXD56_DMA_PERIPHERAL_SPI5_TX;
-      priv->txdmach  = cxd56_dmachannel(CONFIG_CXD56_DMAC_SPI5_TX_CH,
-                                        CONFIG_CXD56_DMAC_SPI5_TX_MAXSIZE);
-      if (priv->txdmach == NULL)
-        {
-          return NULL;
-        }
-#endif
-#if defined(CONFIG_CXD56_DMAC_SPI5_RX)
-      priv->rxconfig.channel_cfg = CXD56_DMA_PERIPHERAL_SPI5_RX;
-      priv->rxdmach  = cxd56_dmachannel(CONFIG_CXD56_DMAC_SPI5_RX_CH,
-                                        CONFIG_CXD56_DMAC_SPI5_RX_MAXSIZE);
-      if (priv->rxdmach == NULL)
-        {
-          return NULL;
-        }
-#endif
-      nxsem_init(&priv->dmasem, 0, 0);
-    }
+#ifdef CONFIG_CXD56_DMAC
+  priv->dmaenable = false;
+  priv->txdmach   = NULL;
+  priv->rxdmach   = NULL;
 #endif
 
   /* CS control */
@@ -1263,6 +1242,81 @@ FAR struct spi_dev_s *cxd56_spibus_initialize(int port)
   return &priv->spidev;
 }
 
+#ifdef CONFIG_CXD56_DMAC
+
+/****************************************************************************
+ * Name: cxd56_spi_dmaconfig
+ *
+ * Description:
+ *   Enable DMA configuration.
+ *
+ * Input Parameter:
+ *   port   - Port number
+ *   chtype - Channel type(TX or RX)
+ *   handle - DMA channel handle
+ *   conf   - DMA configuration
+ *
+ * Returned Value:
+ *   None
+ *
+ ****************************************************************************/
+
+void cxd56_spi_dmaconfig(int port, int chtype, DMA_HANDLE handle,
+                         FAR dma_config_t *conf)
+{
+  FAR struct cxd56_spidev_s *priv = NULL;
+
+  switch (port)
+    {
+#if defined(CONFIG_CXD56_SPI4) && defined(CONFIG_CXD56_DMAC_SPI4_TX)
+      case 4:
+        priv = &g_spi4dev;
+        break;
+#endif
+
+#if defined(CONFIG_CXD56_SPI5) && defined(CONFIG_CXD56_DMAC_SPI5_TX)
+      case 5:
+        priv = &g_spi5dev;
+        break;
+#endif
+
+      default:
+        break;
+    }
+
+  if (priv && priv->initialized)
+    {
+      if ((chtype == CXD56_SPI_DMAC_CHTYPE_TX) && (!priv->txdmach))
+        {
+          /* TX DMA setting */
+
+          priv->txdmach = handle;
+          memcpy(&priv->txconfig, conf, sizeof(dma_config_t));
+
+          if (!priv->dmaenable)
+            {
+              sem_init(&priv->dmasem, 0, 0);
+              priv->dmaenable = true;
+            }
+        }
+      else if ((chtype == CXD56_SPI_DMAC_CHTYPE_RX) && (!priv->rxdmach))
+        {
+          /* RX DMA setting */
+
+          priv->rxdmach = handle;
+          memcpy(&priv->rxconfig, conf, sizeof(dma_config_t));
+
+          if (!priv->dmaenable)
+            {
+              sem_init(&priv->dmasem, 0, 0);
+              priv->dmaenable = true;
+            }
+        }
+    }
+}
+
+#endif
+
 /****************************************************************************
  * Name: spi_flush
  *
diff --git a/arch/arm/src/cxd56xx/cxd56_spi.h b/arch/arm/src/cxd56xx/cxd56_spi.h
index c33ba9f..656efff 100644
--- a/arch/arm/src/cxd56xx/cxd56_spi.h
+++ b/arch/arm/src/cxd56xx/cxd56_spi.h
@@ -44,6 +44,9 @@
 #include <nuttx/config.h>
 #include <nuttx/spi/spi.h>
 #include "hardware/cxd56_spi.h"
+#ifdef CONFIG_CXD56_DMAC
+#include "cxd56_dmac.h"
+#endif
 
 #if defined(CONFIG_CXD56_SPI0) || defined(CONFIG_CXD56_SPI3) || \
     defined(CONFIG_CXD56_SPI4) || defined(CONFIG_CXD56_SPI5)
@@ -68,6 +71,9 @@
  *    for example, will bind the SPI driver to the SPI MMC/SD driver).
  */
 
+#define CXD56_SPI_DMAC_CHTYPE_TX (0)
+#define CXD56_SPI_DMAC_CHTYPE_RX (1)
+
 /****************************************************************************
  * Public Types
  ****************************************************************************/
@@ -108,6 +114,28 @@ extern "C"
 FAR struct spi_dev_s *cxd56_spibus_initialize(int port);
 
 /****************************************************************************
+ * Name: cxd56_spi_dmaconfig
+ *
+ * Description:
+ *   Enable DMA configuration.
+ *
+ * Input Parameter:
+ *   port   - Port number
+ *   chtype - Channel type(TX or RX)
+ *   handle - DMA channel handle
+ *   conf   - DMA configuration
+ *
+ * Returned Value:
+ *   None
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_CXD56_DMAC
+void cxd56_spi_dmaconfig(int port, int chtype, DMA_HANDLE handle,
+                         FAR dma_config_t *conf);
+#endif
+
+/****************************************************************************
  * Name:  cxd56_spiXselect, cxd56_spiXstatus, and cxd56_spiXcmddata
  *
  * Description:
diff --git a/boards/arm/cxd56xx/common/src/cxd56_altmdm_spi.c b/boards/arm/cxd56xx/common/src/cxd56_altmdm_spi.c
index 41bcace..e8d7ccd 100644
--- a/boards/arm/cxd56xx/common/src/cxd56_altmdm_spi.c
+++ b/boards/arm/cxd56xx/common/src/cxd56_altmdm_spi.c
@@ -50,6 +50,7 @@
 #include <nuttx/modem/altmdm.h>
 #include <arch/board/cxd56_altmdm.h>
 #include "cxd56_spi.h"
+#include "cxd56_dmac.h"
 #include "cxd56_pinconfig.h"
 
 /****************************************************************************
@@ -57,29 +58,27 @@
  ****************************************************************************/
 
 #if defined(CONFIG_CXD56_LTE_SPI4)
-#define SPI_CH (4)
-#if  defined(CONFIG_CXD56_LTE_SPI4_DMAC)
-#  if defined(CONFIG_MODEM_ALTMDM_MAX_PACKET_SIZE)
-#    if (CONFIG_MODEM_ALTMDM_MAX_PACKET_SIZE > CONFIG_CXD56_DMAC_SPI4_TX_MAXSIZE)
-#      error CONFIG_CXD56_DMAC_SPI4_TX_MAXSIZE too small
-#    endif
-#    if (CONFIG_MODEM_ALTMDM_MAX_PACKET_SIZE > CONFIG_CXD56_DMAC_SPI4_RX_MAXSIZE)
-#      error CONFIG_CXD56_DMAC_SPI4_RX_MAXSIZE too small
+#  define SPI_CH (4)
+#  if  defined(CONFIG_CXD56_LTE_SPI4_DMAC)
+#    define DMA_TXCH    (2)
+#    define DMA_RXCH    (3)
+#    define DMA_TXCHCHG (CXD56_DMA_PERIPHERAL_SPI4_TX)
+#    define DMA_RXCHCFG (CXD56_DMA_PERIPHERAL_SPI4_RX)
+#    if !defined(CONFIG_MODEM_ALTMDM_MAX_PACKET_SIZE)
+#        error CONFIG_MODEM_ALTMDM_MAX_PACKET_SIZE is not set
 #    endif
 #  endif
-#endif
 #elif defined(CONFIG_CXD56_LTE_SPI5)
-#define SPI_CH (5)
-#if  defined(CONFIG_CXD56_LTE_SPI5_DMAC)
-#  if defined(CONFIG_MODEM_ALTMDM_MAX_PACKET_SIZE)
-#    if (CONFIG_MODEM_ALTMDM_MAX_PACKET_SIZE > CONFIG_CXD56_DMAC_SPI5_TX_MAXSIZE)
-#      error CONFIG_CXD56_DMAC_SPI5_TX_MAXSIZE too small
-#    endif
-#    if (CONFIG_MODEM_ALTMDM_MAX_PACKET_SIZE > CONFIG_CXD56_DMAC_SPI5_RX_MAXSIZE)
-#      error CONFIG_CXD56_DMAC_SPI5_RX_MAXSIZE too small
+#  define SPI_CH (5)
+#  if  defined(CONFIG_CXD56_LTE_SPI5_DMAC)
+#    define DMA_TXCH    (4)
+#    define DMA_RXCH    (5)
+#    define DMA_TXCHCHG (CXD56_DMA_PERIPHERAL_SPI5_TX)
+#    define DMA_RXCHCFG (CXD56_DMA_PERIPHERAL_SPI5_RX)
+#    if !defined(CONFIG_MODEM_ALTMDM_MAX_PACKET_SIZE)
+#        error CONFIG_MODEM_ALTMDM_MAX_PACKET_SIZE is not set
 #    endif
 #  endif
-#endif
 #else
 #  error "Select LTE SPI 4 or 5"
 #endif
@@ -110,44 +109,44 @@ static void spi_pincontrol(int bus, bool on)
   switch (bus)
     {
 #ifdef CONFIG_CXD56_SPI4
-    case 4:
-      if (on)
-        {
-          CXD56_PIN_CONFIGS(PINCONFS_SPI4);
-        }
-      else
-        {
-          CXD56_PIN_CONFIGS(PINCONFS_SPI4_GPIO);
-        }
-      break;
-#endif  /* CONFIG_CXD56_SPI4 */
+      case 4:
+        if (on)
+          {
+            CXD56_PIN_CONFIGS(PINCONFS_SPI4);
+          }
+        else
+          {
+            CXD56_PIN_CONFIGS(PINCONFS_SPI4_GPIO);
+          }
+        break;
+#endif /* CONFIG_CXD56_SPI4 */
 
 #ifdef CONFIG_CXD56_SPI5
-    case 5:
+      case 5:
 #ifdef CONFIG_CXD56_SPI5_PINMAP_EMMC
-      if (on)
-        {
-          CXD56_PIN_CONFIGS(PINCONFS_EMMCA_SPI5);
-        }
-      else
-        {
-          CXD56_PIN_CONFIGS(PINCONFS_EMMCA_GPIO);
-        }
-#endif  /* CONFIG_CXD56_SPI5_PINMAP_EMMC */
+        if (on)
+          {
+            CXD56_PIN_CONFIGS(PINCONFS_EMMCA_SPI5);
+          }
+        else
+          {
+            CXD56_PIN_CONFIGS(PINCONFS_EMMCA_GPIO);
+          }
+#endif /* CONFIG_CXD56_SPI5_PINMAP_EMMC */
 #ifdef CONFIG_CXD56_SPI5_PINMAP_SDIO
-      if (on)
-        {
-          CXD56_PIN_CONFIGS(PINCONFS_SDIOA_SPI5);
-        }
-      else
-        {
-          CXD56_PIN_CONFIGS(PINCONFS_SDIOA_GPIO);
-        }
-#endif  /* CONFIG_CXD56_SPI5_PINMAP_SDIO */
-      break;
-#endif  /* CONFIG_CXD56_SPI5 */
-    default:
-      break;
+        if (on)
+          {
+            CXD56_PIN_CONFIGS(PINCONFS_SDIOA_SPI5);
+          }
+        else
+          {
+            CXD56_PIN_CONFIGS(PINCONFS_SDIOA_GPIO);
+          }
+#endif /* CONFIG_CXD56_SPI5_PINMAP_SDIO */
+        break;
+#endif /* CONFIG_CXD56_SPI5 */
+      default:
+        break;
     }
 }
 
@@ -166,7 +165,11 @@ static void spi_pincontrol(int bus, bool on)
 int board_altmdm_initialize(FAR const char *devpath)
 {
   FAR struct spi_dev_s *spi;
-  int spi_ch = SPI_CH;
+  int                   spi_ch = SPI_CH;
+#if defined(CONFIG_CXD56_LTE_SPI4_DMAC) || defined(CONFIG_CXD56_LTE_SPI5_DMAC)
+  DMA_HANDLE            hdl;
+  dma_config_t          conf;
+#endif
 
   m_info("Initializing ALTMDM..\n");
 
@@ -181,6 +184,26 @@ int board_altmdm_initialize(FAR const char *devpath)
           return -ENODEV;
         }
 
+#if defined(CONFIG_CXD56_LTE_SPI4_DMAC) || defined(CONFIG_CXD56_LTE_SPI5_DMAC)
+      hdl = cxd56_dmachannel(DMA_TXCH, CONFIG_MODEM_ALTMDM_MAX_PACKET_SIZE);
+      if (hdl)
+        {
+          conf.channel_cfg = DMA_TXCHCHG;
+          conf.dest_width  = CXD56_DMAC_WIDTH8;
+          conf.src_width   = CXD56_DMAC_WIDTH8;
+          cxd56_spi_dmaconfig(spi_ch, CXD56_SPI_DMAC_CHTYPE_TX, hdl, &conf);
+        }
+
+      hdl = cxd56_dmachannel(DMA_RXCH, CONFIG_MODEM_ALTMDM_MAX_PACKET_SIZE);
+      if (hdl)
+        {
+          conf.channel_cfg = DMA_RXCHCFG;
+          conf.dest_width  = CXD56_DMAC_WIDTH8;
+          conf.src_width   = CXD56_DMAC_WIDTH8;
+          cxd56_spi_dmaconfig(spi_ch, CXD56_SPI_DMAC_CHTYPE_RX, hdl, &conf);
+        }
+#endif
+
       spi_pincontrol(spi_ch, false);
 
       g_devhandle = altmdm_register(devpath, spi);
diff --git a/boards/arm/cxd56xx/common/src/cxd56_ili9340.c b/boards/arm/cxd56xx/common/src/cxd56_ili9340.c
index 9a0e4e9..1202887 100644
--- a/boards/arm/cxd56xx/common/src/cxd56_ili9340.c
+++ b/boards/arm/cxd56xx/common/src/cxd56_ili9340.c
@@ -334,6 +334,10 @@ int board_lcd_initialize(void)
 {
   FAR struct ili93404ws_lcd_s *priv = &g_lcddev;
   FAR struct spi_dev_s *spi;
+#if defined(CONFIG_CXD56_DMAC)
+  DMA_HANDLE            hdl;
+  dma_config_t          conf;
+#endif
 
   lcdinfo("Initializing lcd\n");
 
@@ -347,6 +351,29 @@ int board_lcd_initialize(void)
         }
       priv->spi = spi;
 
+#if defined(CONFIG_CXD56_DMAC)
+      /* DMA settings */
+
+      hdl = cxd56_dmachannel(DISPLAY_DMA_TXCH, DISPLAY_DMA_TX_MAXSIZE);
+      if (hdl)
+        {
+          conf.channel_cfg = DISPLAY_DMA_TXCH_CFG;
+          conf.dest_width  = CXD56_DMAC_WIDTH8;
+          conf.src_width   = CXD56_DMAC_WIDTH8;
+          cxd56_spi_dmaconfig(DISPLAY_SPI, CXD56_SPI_DMAC_CHTYPE_TX,
+                              hdl, &conf);
+        }
+      hdl = cxd56_dmachannel(DISPLAY_DMA_RXCH, DISPLAY_DMA_RX_MAXSIZE);
+      if (hdl)
+        {
+          conf.channel_cfg = DISPLAY_DMA_RXCH_CFG;
+          conf.dest_width  = CXD56_DMAC_WIDTH8;
+          conf.src_width   = CXD56_DMAC_WIDTH8;
+          cxd56_spi_dmaconfig(DISPLAY_SPI, CXD56_SPI_DMAC_CHTYPE_RX,
+                              hdl, &conf);
+        }
+#endif
+
       /* Reset ILI9340 */
 
       up_mdelay(10);
diff --git a/boards/arm/cxd56xx/common/src/cxd56_lpm013m091a.c b/boards/arm/cxd56xx/common/src/cxd56_lpm013m091a.c
index 9a6baa8..5052423 100644
--- a/boards/arm/cxd56xx/common/src/cxd56_lpm013m091a.c
+++ b/boards/arm/cxd56xx/common/src/cxd56_lpm013m091a.c
@@ -334,6 +334,10 @@ int board_lcd_initialize(void)
 {
   FAR struct lpm013m091a_lcd_s *priv = &g_lcddev;
   FAR struct spi_dev_s *spi;
+#if defined(CONFIG_CXD56_DMAC)
+  DMA_HANDLE            hdl;
+  dma_config_t          conf;
+#endif
 
   lcdinfo("Initializing lcd\n");
 
@@ -347,6 +351,29 @@ int board_lcd_initialize(void)
         }
       priv->spi = spi;
 
+#if defined(CONFIG_CXD56_DMAC)
+      /* DMA settings */
+
+      hdl = cxd56_dmachannel(DISPLAY_DMA_TXCH, DISPLAY_DMA_TX_MAXSIZE);
+      if (hdl)
+        {
+          conf.channel_cfg = DISPLAY_DMA_TXCH_CFG;
+          conf.dest_width  = CXD56_DMAC_WIDTH8;
+          conf.src_width   = CXD56_DMAC_WIDTH8;
+          cxd56_spi_dmaconfig(DISPLAY_SPI, CXD56_SPI_DMAC_CHTYPE_TX,
+                              hdl, &conf);
+        }
+      hdl = cxd56_dmachannel(DISPLAY_DMA_RXCH, DISPLAY_DMA_RX_MAXSIZE);
+      if (hdl)
+        {
+          conf.channel_cfg = DISPLAY_DMA_RXCH_CFG;
+          conf.dest_width  = CXD56_DMAC_WIDTH8;
+          conf.src_width   = CXD56_DMAC_WIDTH8;
+          cxd56_spi_dmaconfig(DISPLAY_SPI, CXD56_SPI_DMAC_CHTYPE_RX,
+                              hdl, &conf);
+        }
+#endif
+
       /* Reset LPM013M091A */
 
       up_mdelay(10);
diff --git a/boards/arm/cxd56xx/spresense/Kconfig b/boards/arm/cxd56xx/spresense/Kconfig
index 30a1001..d43655f 100644
--- a/boards/arm/cxd56xx/spresense/Kconfig
+++ b/boards/arm/cxd56xx/spresense/Kconfig
@@ -59,12 +59,16 @@ choice
 config LCD_ON_EXTENSION_BOARD
 	bool "Extension board: SPI4"
 	select CXD56_SPI4
+	select CXD56_DMAC_SPI4_TX
+	select CXD56_DMAC_SPI4_RX
 	---help---
 		Display connected to extension board.
 
 config LCD_ON_MAIN_BOARD
 	bool "Main board: SPI5"
 	select CXD56_SPI5
+	select CXD56_DMAC_SPI5_TX
+	select CXD56_DMAC_SPI5_RX
 	---help---
 		Display connected to main board.
 
diff --git a/boards/arm/cxd56xx/spresense/include/board.h b/boards/arm/cxd56xx/spresense/include/board.h
index a1df198..3343fea 100644
--- a/boards/arm/cxd56xx/spresense/include/board.h
+++ b/boards/arm/cxd56xx/spresense/include/board.h
@@ -254,6 +254,13 @@ enum board_power_device
 
 #define DISPLAY_SPI     5
 
+#define DISPLAY_DMA_TXCH       (4)
+#define DISPLAY_DMA_RXCH       (5)
+#define DISPLAY_DMA_TXCH_CFG   CXD56_DMA_PERIPHERAL_SPI5_TX
+#define DISPLAY_DMA_RXCH_CFG   CXD56_DMA_PERIPHERAL_SPI5_RX
+#define DISPLAY_DMA_TX_MAXSIZE (192000)
+#define DISPLAY_DMA_RX_MAXSIZE (192000)
+
 #else /* Display is connected through extension board. */
 
 #define DISPLAY_RST     PIN_SPI2_MISO
@@ -261,6 +268,13 @@ enum board_power_device
 
 #define DISPLAY_SPI     4
 
+#define DISPLAY_DMA_TXCH       (2)
+#define DISPLAY_DMA_RXCH       (3)
+#define DISPLAY_DMA_TXCH_CFG   CXD56_DMA_PERIPHERAL_SPI4_TX
+#define DISPLAY_DMA_RXCH_CFG   CXD56_DMA_PERIPHERAL_SPI4_RX
+#define DISPLAY_DMA_TX_MAXSIZE (192000)
+#define DISPLAY_DMA_RX_MAXSIZE (192000)
+
 #endif
 
 /* Sensor device bus definitions *******************************************/
diff --git a/boards/arm/cxd56xx/spresense/src/cxd56_spi.c b/boards/arm/cxd56xx/spresense/src/cxd56_spi.c
index 7435aa3..54ffba5 100644
--- a/boards/arm/cxd56xx/spresense/src/cxd56_spi.c
+++ b/boards/arm/cxd56xx/spresense/src/cxd56_spi.c
@@ -54,12 +54,6 @@
 #include "cxd56_gpio.h"
 
 /****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-#define MMCSD_DETECT    PIN_AP_CLK
-
-/****************************************************************************
  * Public Functions
  ****************************************************************************/