lpc43/lpc54 SDMDC: Don't enable internal DMA in the control register if not doing internal DMA. Clear pending DMA-related interrupts before enabling them.

This commit is contained in:
Gregory Nutt 2017-12-22 15:16:14 -06:00
parent 1117a6e8ce
commit 6fa734457d
4 changed files with 122 additions and 74 deletions

View File

@ -196,6 +196,7 @@
/* Card type register CTYPE */
#define SDMMC_CTYPE_WIDTH1 (0) /* 1-bit mode */
#define SDMMC_CTYPE_WIDTH4 (1 << 0) /* Bit 0: 4-bit mode */
/* Bits 1-15: Reserved */
#define SDMMC_CTYPE_WIDTH8 (1 << 16) /* Bit 16: 8-bit mode */
@ -391,6 +392,7 @@
#define SDMMC_IDINTEN_NIS (1 << 8) /* Bit 8: Normal Interrupt Summary */
#define SDMMC_IDINTEN_AIS (1 << 9) /* Bit 9: Abnormal Interrupt Summary */
/* Bits 10-31: Reserved */
#define SDMMC_IDINTEN_ALL 0x00000333
/************************************************************************************************
* Public Types

View File

@ -268,7 +268,6 @@ static void lpc43_checksetup(void);
static void lpc43_takesem(struct lpc43_dev_s *priv);
#define lpc43_givesem(priv) (sem_post(&priv->waitsem))
static inline void lpc43_setclock(uint32_t clkdiv);
static inline void lpc43_settype(uint32_t ctype);
static inline void lpc43_sdcard_clock(bool enable);
static int lpc43_ciu_sendcmd(uint32_t cmd, uint32_t arg);
static void lpc43_configwaitints(struct lpc43_dev_s *priv, uint32_t waitmask,
@ -572,25 +571,6 @@ static inline void lpc43_setclock(uint32_t clkdiv)
lpc43_ciu_sendcmd(SDMMC_CMD_UPDCLOCK | SDMMC_CMD_WAITPREV, 0);
}
/****************************************************************************
* Name: lpc43_settype
*
* Description: Define the Bus Size of SDCard (1, 4 or 8-bit)
*
* Input Parameters:
* ctype - A new CTYPE (Card Type Register) value
*
* Returned Value:
* None
*
****************************************************************************/
static inline void lpc43_settype(uint32_t ctype)
{
mcinfo("cteype=%08lx\n", (unsigned long)ctype);
lpc43_putreg(ctype, LPC43_SDMMC_CTYPE);
}
/****************************************************************************
* Name: lpc43_sdcard_clock
*
@ -1252,8 +1232,10 @@ static void lpc43_reset(FAR struct sdio_dev_s *dev)
lpc43_putreg(SDMMC_CTRL_CNTLRRESET | SDMMC_CTRL_FIFORESET |
SDMMC_CTRL_DMARESET, LPC43_SDMMC_CTRL);
while ((regval = lpc43_getreg(LPC43_SDMMC_CTRL)) &
(SDMMC_CTRL_CNTLRRESET | SDMMC_CTRL_FIFORESET | SDMMC_CTRL_DMARESET));
while ((lpc43_getreg(LPC43_SDMMC_CTRL) &
(SDMMC_CTRL_CNTLRRESET | SDMMC_CTRL_FIFORESET | SDMMC_CTRL_DMARESET)) != 0)
{
}
/* Reset data */
@ -1277,18 +1259,17 @@ static void lpc43_reset(FAR struct sdio_dev_s *dev)
priv->widebus = true; /* Required for DMA support */
priv->cdstatus = 0; /* Card status is unknown */
regval = 0;
#ifdef CONFIG_LPC43_SDMMC_DMA
priv->dmamode = false; /* true: DMA mode transfer */
/* Use the Internal DMA */
regval = SDMMC_CTRL_INTDMA;
#endif
/* Select 1-bit wide bus */
lpc43_putreg(SDMMC_CTYPE_WIDTH1, LPC43_SDMMC_CTYPE);
/* Enable interrupts */
regval = lpc43_getreg(LPC43_SDMMC_CTRL);
regval |= SDMMC_CTRL_INTENABLE;
lpc43_putreg(regval, LPC43_SDMMC_CTRL);
@ -1400,8 +1381,6 @@ static void lpc43_widebus(FAR struct sdio_dev_s *dev, bool wide)
struct lpc43_dev_s *priv = (struct lpc43_dev_s *)dev;
mcinfo("wide=%d\n", wide);
priv->widebus = wide;
}
/****************************************************************************
@ -1421,9 +1400,11 @@ static void lpc43_widebus(FAR struct sdio_dev_s *dev, bool wide)
static void lpc43_clock(FAR struct sdio_dev_s *dev, enum sdio_clock_e rate)
{
struct lpc43_dev_s *priv = (struct lpc43_dev_s *)dev;
uint8_t clkdiv;
uint8_t ctype;
bool enabled = false;
bool widebus = false;
switch (rate)
{
@ -1434,6 +1415,7 @@ static void lpc43_clock(FAR struct sdio_dev_s *dev, enum sdio_clock_e rate)
clkdiv = SDMMC_CLKDIV0(BOARD_CLKDIV_INIT);
ctype = SDCARD_BUS_D1;
enabled = false;
widebus = false;
return;
break;
@ -1443,6 +1425,7 @@ static void lpc43_clock(FAR struct sdio_dev_s *dev, enum sdio_clock_e rate)
clkdiv = SDMMC_CLKDIV0(BOARD_CLKDIV_INIT);
ctype = SDCARD_BUS_D1;
enabled = true;
widebus = false;
break;
/* Enable in MMC normal operation clocking */
@ -1451,6 +1434,7 @@ static void lpc43_clock(FAR struct sdio_dev_s *dev, enum sdio_clock_e rate)
clkdiv = SDMMC_CLKDIV0(BOARD_CLKDIV_MMCXFR);
ctype = SDCARD_BUS_D1;
enabled = true;
widebus = false;
break;
/* SD normal operation clocking (wide 4-bit mode) */
@ -1460,6 +1444,7 @@ static void lpc43_clock(FAR struct sdio_dev_s *dev, enum sdio_clock_e rate)
clkdiv = SDMMC_CLKDIV0(BOARD_CLKDIV_SDWIDEXFR);
ctype = SDCARD_BUS_D4;
enabled = true;
widebus = true;
break;
#endif
@ -1469,12 +1454,16 @@ static void lpc43_clock(FAR struct sdio_dev_s *dev, enum sdio_clock_e rate)
clkdiv = SDMMC_CLKDIV0(BOARD_CLKDIV_SDXFR);
ctype = SDCARD_BUS_D1;
enabled = true;
widebus = false;
break;
}
/* Setup the type of card bus wide */
/* Setup the card bus width */
lpc43_settype(ctype);
mcinfo("widebus=%d\n", widebus);
priv->widebus = widebus;
lpc43_putreg(ctype, LPC43_SDMMC_CTYPE);
/* Set the new clock frequency division */
@ -1516,7 +1505,7 @@ static int lpc43_attach(FAR struct sdio_dev_s *dev)
*/
lpc43_putreg(0, LPC43_SDMMC_INTMASK);
lpc43_putreg(SDMMC_INT_ALL , LPC43_SDMMC_RINTSTS);
lpc43_putreg(SDMMC_INT_ALL, LPC43_SDMMC_RINTSTS);
/* Enable Interrupts to happen when the INTMASK is activated */
@ -1647,6 +1636,9 @@ static int lpc43_recvsetup(FAR struct sdio_dev_s *dev, FAR uint8_t *buffer,
struct lpc43_dev_s *priv = (struct lpc43_dev_s *)dev;
uint32_t blocksize;
uint32_t bytecnt;
#ifdef CONFIG_LPC43_SDMMC_DMA
uint32_t regval;
#endif
mcinfo("nbytes=%ld\n", (long) nbytes);
@ -1685,10 +1677,16 @@ static int lpc43_recvsetup(FAR struct sdio_dev_s *dev, FAR uint8_t *buffer,
lpc43_putreg(SDMMC_FIFOTH_RXWMARK(1), LPC43_SDMMC_FIFOTH);
#ifdef CONFIG_LPC43_SDMMC_DMA
/* Make sure that internal DMA is disabled */
lpc43_putreg(0, LPC43_SDMMC_BMOD);
regval = lpc43_getreg(LPC43_SDMMC_CTRL);
regval &= ~SDMMC_CTRL_INTDMA;
lpc43_putreg(regval, LPC43_SDMMC_CTRL);
#endif
/* Configure the transfer interrupts */
lpc43_configxfrints(priv, SDCARD_RECV_MASK);
@ -1718,6 +1716,9 @@ static int lpc43_sendsetup(FAR struct sdio_dev_s *dev, FAR const uint8_t *buffer
size_t nbytes)
{
struct lpc43_dev_s *priv = (struct lpc43_dev_s *)dev;
#ifdef CONFIG_LPC43_SDMMC_DMA
uint32_t regval;
#endif
mcinfo("nbytes=%ld\n", (long)nbytes);
@ -1740,10 +1741,16 @@ static int lpc43_sendsetup(FAR struct sdio_dev_s *dev, FAR const uint8_t *buffer
lpc43_putreg(SDMMC_FIFOTH_TXWMARK(LPC43_TXFIFO_DEPTH / 2),
LPC43_SDMMC_FIFOTH);
#ifdef CONFIG_LPC43_SDMMC_DMA
/* Make sure that internal DMA is disabled */
lpc43_putreg(0, LPC43_SDMMC_BMOD);
regval = lpc43_getreg(LPC43_SDMMC_CTRL);
regval &= ~SDMMC_CTRL_INTDMA;
lpc43_putreg(regval, LPC43_SDMMC_CTRL);
#endif
/* Configure the transfer interrupts */
lpc43_configxfrints(priv, SDCARD_SEND_MASK);
@ -2388,13 +2395,13 @@ static int lpc43_dmarecvsetup(FAR struct sdio_dev_s *dev, FAR uint8_t *buffer,
priv->wrdir = false;
priv->dmamode = true;
/* Reset DMA */
/* Reset the FIFO and DMA */
regval = lpc43_getreg(LPC43_SDMMC_CTRL);
regval |= SDMMC_CTRL_FIFORESET | SDMMC_CTRL_DMARESET;
lpc43_putreg(regval, LPC43_SDMMC_CTRL);
while (lpc43_getreg(LPC43_SDMMC_CTRL) & SDMMC_CTRL_DMARESET)
while ((lpc43_getreg(LPC43_SDMMC_CTRL) & SDMMC_CTRL_DMARESET) != 0)
{
}
@ -2461,11 +2468,18 @@ static int lpc43_dmarecvsetup(FAR struct sdio_dev_s *dev, FAR uint8_t *buffer,
/* Enable internal DMA, burst size of 4, fixed burst */
regval = lpc43_getreg(LPC43_SDMMC_CTRL);
regval |= SDMMC_CTRL_INTDMA;
lpc43_putreg(regval, LPC43_SDMMC_CTRL);
regval = SDMMC_BMOD_DE | SDMMC_BMOD_PBL_4XFRS | SDMMC_BMOD_DSL(4);
lpc43_putreg(regval, LPC43_SDMMC_BMOD);
/* Setup DMA error interrupts */
lpc43_putreg(SDMMC_INT_ALL, LPC43_SDMMC_RINTSTS);
lpc43_putreg(SDMMC_IDINTEN_ALL, LPC43_SDMMC_IDSTS);
lpc43_configxfrints(priv, SDCARD_DMARECV_MASK);
lpc43_configdmaints(priv, SDCARD_DMAERROR_MASK);
return OK;
@ -2527,12 +2541,13 @@ static int lpc43_dmasendsetup(FAR struct sdio_dev_s *dev,
priv->wrdir = true;
priv->dmamode = true;
/* Reset DMA */
/* Reset the FIFO and DMA */
regval = lpc43_getreg(LPC43_SDMMC_CTRL);
regval |= SDMMC_CTRL_FIFORESET | SDMMC_CTRL_DMARESET;
lpc43_putreg(regval, LPC43_SDMMC_CTRL);
while (lpc43_getreg(LPC43_SDMMC_CTRL) & SDMMC_CTRL_DMARESET)
while ((lpc43_getreg(LPC43_SDMMC_CTRL) & SDMMC_CTRL_DMARESET) != 0)
{
}
@ -2555,11 +2570,18 @@ static int lpc43_dmasendsetup(FAR struct sdio_dev_s *dev,
/* Enable internal DMA, burst size of 4, fixed burst */
regval = lpc43_getreg(LPC43_SDMMC_CTRL);
regval |= SDMMC_CTRL_INTDMA;
lpc43_putreg(regval, LPC43_SDMMC_CTRL);
regval = SDMMC_BMOD_DE | SDMMC_BMOD_PBL_4XFRS | SDMMC_BMOD_DSL(4);
lpc43_putreg(regval, LPC43_SDMMC_BMOD);
/* Setup DMA error interrupts */
lpc43_putreg(SDMMC_INT_ALL, LPC43_SDMMC_RINTSTS);
lpc43_putreg(SDMMC_IDINTEN_ALL, LPC43_SDMMC_IDSTS);
lpc43_configxfrints(priv, SDCARD_DMASEND_MASK);
lpc43_configdmaints(priv, SDCARD_DMAERROR_MASK);
return OK;

View File

@ -186,6 +186,7 @@
/* Card type register CTYPE */
#define SDMMC_CTYPE_WIDTH1 (0) /* 1-bit mode */
#define SDMMC_CTYPE_WIDTH4 (1 << 0) /* Bit 0: 4-bit mode */
/* Bits 1-15: Reserved */
#define SDMMC_CTYPE_WIDTH8 (1 << 16) /* Bit 16: 8-bit mode */
@ -383,6 +384,7 @@
#define SDMMC_IDINTEN_NIS (1 << 8) /* Bit 8: Normal Interrupt Summary */
#define SDMMC_IDINTEN_AIS (1 << 9) /* Bit 9: Abnormal Interrupt Summary */
/* Bits 10-31: Reserved */
#define SDMMC_IDINTEN_ALL 0x00000333
/* Card threshold control */

View File

@ -272,7 +272,6 @@ static void lpc54_checksetup(void);
static void lpc54_takesem(struct lpc54_dev_s *priv);
#define lpc54_givesem(priv) (sem_post(&priv->waitsem))
static inline void lpc54_setclock(uint32_t clkdiv);
static inline void lpc54_settype(uint32_t ctype);
static inline void lpc54_sdcard_clock(bool enable);
static int lpc54_ciu_sendcmd(uint32_t cmd, uint32_t arg);
static void lpc54_configwaitints(struct lpc54_dev_s *priv, uint32_t waitmask,
@ -572,25 +571,6 @@ static inline void lpc54_setclock(uint32_t clkdiv)
lpc54_ciu_sendcmd(SDMMC_CMD_UPDCLOCK | SDMMC_CMD_WAITPREV, 0);
}
/****************************************************************************
* Name: lpc54_settype
*
* Description: Define the Bus Size of SDCard (1, 4 or 8-bit)
*
* Input Parameters:
* ctype - A new CTYPE (Card Type Register) value
*
* Returned Value:
* None
*
****************************************************************************/
static inline void lpc54_settype(uint32_t ctype)
{
mcinfo("cteype=%08lx\n", (unsigned long)ctype);
lpc54_putreg(ctype, LPC54_SDMMC_CTYPE);
}
/****************************************************************************
* Name: lpc54_sdcard_clock
*
@ -1252,8 +1232,10 @@ static void lpc54_reset(FAR struct sdio_dev_s *dev)
lpc54_putreg(SDMMC_CTRL_CNTLRRESET | SDMMC_CTRL_FIFORESET |
SDMMC_CTRL_DMARESET, LPC54_SDMMC_CTRL);
while ((regval = lpc54_getreg(LPC54_SDMMC_CTRL)) &
(SDMMC_CTRL_CNTLRRESET | SDMMC_CTRL_FIFORESET | SDMMC_CTRL_DMARESET));
while ((lpc54_getreg(LPC54_SDMMC_CTRL) &
(SDMMC_CTRL_CNTLRRESET | SDMMC_CTRL_FIFORESET | SDMMC_CTRL_DMARESET)) != 0)
{
}
/* Reset data */
@ -1277,18 +1259,17 @@ static void lpc54_reset(FAR struct sdio_dev_s *dev)
priv->widebus = true; /* Required for DMA support */
priv->cdstatus = 0; /* Card status is unknown */
regval = 0;
#ifdef CONFIG_LPC54_SDMMC_DMA
priv->dmamode = false; /* true: DMA mode transfer */
/* Use the Internal DMA */
regval = SDMMC_CTRL_INTDMA;
#endif
/* Select 1-bit wide bus */
lpc54_putreg(SDMMC_CTYPE_WIDTH1, LPC54_SDMMC_CTYPE);
/* Enable interrupts */
regval = lpc54_getreg(LPC54_SDMMC_CTRL);
regval |= SDMMC_CTRL_INTENABLE;
lpc54_putreg(regval, LPC54_SDMMC_CTRL);
@ -1400,8 +1381,6 @@ static void lpc54_widebus(FAR struct sdio_dev_s *dev, bool wide)
struct lpc54_dev_s *priv = (struct lpc54_dev_s *)dev;
mcinfo("wide=%d\n", wide);
priv->widebus = wide;
}
/****************************************************************************
@ -1421,9 +1400,11 @@ static void lpc54_widebus(FAR struct sdio_dev_s *dev, bool wide)
static void lpc54_clock(FAR struct sdio_dev_s *dev, enum sdio_clock_e rate)
{
struct lpc54_dev_s *priv = (struct lpc54_dev_s *)dev;
uint8_t clkdiv;
uint8_t ctype;
bool enabled = false;
bool widebus = false;
switch (rate)
{
@ -1434,6 +1415,7 @@ static void lpc54_clock(FAR struct sdio_dev_s *dev, enum sdio_clock_e rate)
clkdiv = SDMMC_CLKDIV0(BOARD_CLKDIV_INIT);
ctype = SDCARD_BUS_D1;
enabled = false;
widebus = false;
return;
break;
@ -1443,6 +1425,7 @@ static void lpc54_clock(FAR struct sdio_dev_s *dev, enum sdio_clock_e rate)
clkdiv = SDMMC_CLKDIV0(BOARD_CLKDIV_INIT);
ctype = SDCARD_BUS_D1;
enabled = true;
widebus = false;
break;
/* Enable in MMC normal operation clocking */
@ -1451,6 +1434,7 @@ static void lpc54_clock(FAR struct sdio_dev_s *dev, enum sdio_clock_e rate)
clkdiv = SDMMC_CLKDIV0(BOARD_CLKDIV_MMCXFR);
ctype = SDCARD_BUS_D1;
enabled = true;
widebus = false;
break;
/* SD normal operation clocking (wide 4-bit mode) */
@ -1460,6 +1444,7 @@ static void lpc54_clock(FAR struct sdio_dev_s *dev, enum sdio_clock_e rate)
clkdiv = SDMMC_CLKDIV0(BOARD_CLKDIV_SDWIDEXFR);
ctype = SDCARD_BUS_D4;
enabled = true;
widebus = true;
break;
#endif
@ -1469,12 +1454,16 @@ static void lpc54_clock(FAR struct sdio_dev_s *dev, enum sdio_clock_e rate)
clkdiv = SDMMC_CLKDIV0(BOARD_CLKDIV_SDXFR);
ctype = SDCARD_BUS_D1;
enabled = true;
widebus = false;
break;
}
/* Setup the type of card bus wide */
/* Setup the card bus width */
lpc54_settype(ctype);
mcinfo("widebus=%d\n", widebus);
priv->widebus = widebus;
lpc54_putreg(ctype, LPC54_SDMMC_CTYPE);
/* Set the new clock frequency division */
@ -1516,7 +1505,7 @@ static int lpc54_attach(FAR struct sdio_dev_s *dev)
*/
lpc54_putreg(0, LPC54_SDMMC_INTMASK);
lpc54_putreg(SDMMC_INT_ALL , LPC54_SDMMC_RINTSTS);
lpc54_putreg(SDMMC_INT_ALL, LPC54_SDMMC_RINTSTS);
/* Enable Interrupts to happen when the INTMASK is activated */
@ -1647,6 +1636,9 @@ static int lpc54_recvsetup(FAR struct sdio_dev_s *dev, FAR uint8_t *buffer,
struct lpc54_dev_s *priv = (struct lpc54_dev_s *)dev;
uint32_t blocksize;
uint32_t bytecnt;
#ifdef CONFIG_LPC54_SDMMC_DMA
uint32_t regval;
#endif
mcinfo("nbytes=%ld\n", (long) nbytes);
@ -1685,10 +1677,16 @@ static int lpc54_recvsetup(FAR struct sdio_dev_s *dev, FAR uint8_t *buffer,
lpc54_putreg(SDMMC_FIFOTH_RXWMARK(1), LPC54_SDMMC_FIFOTH);
#ifdef CONFIG_LPC54_SDMMC_DMA
/* Make sure that internal DMA is disabled */
lpc54_putreg(0, LPC54_SDMMC_BMOD);
regval = lpc54_getreg(LPC54_SDMMC_CTRL);
regval &= ~SDMMC_CTRL_INTDMA;
lpc54_putreg(regval, LPC54_SDMMC_CTRL);
#endif
/* Configure the transfer interrupts */
lpc54_configxfrints(priv, SDCARD_RECV_MASK);
@ -1718,6 +1716,9 @@ static int lpc54_sendsetup(FAR struct sdio_dev_s *dev, FAR const uint8_t *buffer
size_t nbytes)
{
struct lpc54_dev_s *priv = (struct lpc54_dev_s *)dev;
#ifdef CONFIG_LPC54_SDMMC_DMA
uint32_t regval;
#endif
mcinfo("nbytes=%ld\n", (long)nbytes);
@ -1740,10 +1741,16 @@ static int lpc54_sendsetup(FAR struct sdio_dev_s *dev, FAR const uint8_t *buffer
lpc54_putreg(SDMMC_FIFOTH_TXWMARK(LPC54_TXFIFO_DEPTH / 2),
LPC54_SDMMC_FIFOTH);
#ifdef CONFIG_LPC54_SDMMC_DMA
/* Make sure that internal DMA is disabled */
lpc54_putreg(0, LPC54_SDMMC_BMOD);
regval = lpc54_getreg(LPC54_SDMMC_CTRL);
regval &= ~SDMMC_CTRL_INTDMA;
lpc54_putreg(regval, LPC54_SDMMC_CTRL);
#endif
/* Configure the transfer interrupts */
lpc54_configxfrints(priv, SDCARD_SEND_MASK);
@ -2388,13 +2395,13 @@ static int lpc54_dmarecvsetup(FAR struct sdio_dev_s *dev, FAR uint8_t *buffer,
priv->wrdir = false;
priv->dmamode = true;
/* Reset DMA */
/* Reset the FIFO and DMA */
regval = lpc54_getreg(LPC54_SDMMC_CTRL);
regval |= SDMMC_CTRL_FIFORESET | SDMMC_CTRL_DMARESET;
lpc54_putreg(regval, LPC54_SDMMC_CTRL);
while (lpc54_getreg(LPC54_SDMMC_CTRL) & SDMMC_CTRL_DMARESET)
while ((lpc54_getreg(LPC54_SDMMC_CTRL) & SDMMC_CTRL_DMARESET) != 0)
{
}
@ -2461,11 +2468,18 @@ static int lpc54_dmarecvsetup(FAR struct sdio_dev_s *dev, FAR uint8_t *buffer,
/* Enable internal DMA, burst size of 4, fixed burst */
regval = lpc54_getreg(LPC54_SDMMC_CTRL);
regval |= SDMMC_CTRL_INTDMA;
lpc54_putreg(regval, LPC54_SDMMC_CTRL);
regval = SDMMC_BMOD_DE | SDMMC_BMOD_PBL_4XFRS | SDMMC_BMOD_DSL(4);
lpc54_putreg(regval, LPC54_SDMMC_BMOD);
/* Setup DMA error interrupts */
lpc54_putreg(SDMMC_INT_ALL, LPC54_SDMMC_RINTSTS);
lpc54_putreg(SDMMC_IDINTEN_ALL, LPC54_SDMMC_IDSTS);
lpc54_configxfrints(priv, SDCARD_DMARECV_MASK);
lpc54_configdmaints(priv, SDCARD_DMAERROR_MASK);
return OK;
@ -2527,12 +2541,13 @@ static int lpc54_dmasendsetup(FAR struct sdio_dev_s *dev,
priv->wrdir = true;
priv->dmamode = true;
/* Reset DMA */
/* Reset the FIFO and DMA */
regval = lpc54_getreg(LPC54_SDMMC_CTRL);
regval |= SDMMC_CTRL_FIFORESET | SDMMC_CTRL_DMARESET;
lpc54_putreg(regval, LPC54_SDMMC_CTRL);
while (lpc54_getreg(LPC54_SDMMC_CTRL) & SDMMC_CTRL_DMARESET)
while ((lpc54_getreg(LPC54_SDMMC_CTRL) & SDMMC_CTRL_DMARESET) != 0)
{
}
@ -2555,11 +2570,18 @@ static int lpc54_dmasendsetup(FAR struct sdio_dev_s *dev,
/* Enable internal DMA, burst size of 4, fixed burst */
regval = lpc54_getreg(LPC54_SDMMC_CTRL);
regval |= SDMMC_CTRL_INTDMA;
lpc54_putreg(regval, LPC54_SDMMC_CTRL);
regval = SDMMC_BMOD_DE | SDMMC_BMOD_PBL_4XFRS | SDMMC_BMOD_DSL(4);
lpc54_putreg(regval, LPC54_SDMMC_BMOD);
/* Setup DMA error interrupts */
lpc54_putreg(SDMMC_INT_ALL, LPC54_SDMMC_RINTSTS);
lpc54_putreg(SDMMC_IDINTEN_ALL, LPC54_SDMMC_IDSTS);
lpc54_configxfrints(priv, SDCARD_DMASEND_MASK);
lpc54_configdmaints(priv, SDCARD_DMAERROR_MASK);
return OK;