S32K3XX QSPI No need to check TX FIFO buffer when MPU is correctly configured

This commit is contained in:
Peter van der Perk 2022-12-01 10:29:05 +01:00 committed by David Sidrane
parent ec5030ebe6
commit 90472785d3
2 changed files with 23 additions and 19 deletions

View File

@ -374,6 +374,7 @@ config S32K3XX_ENET
config S32K3XX_QSPI config S32K3XX_QSPI
bool "QSPI Flash" bool "QSPI Flash"
default n default n
select ARCH_USE_MPU
depends on S32K3XX_HAVE_QSPI depends on S32K3XX_HAVE_QSPI
menu "FlexCAN" menu "FlexCAN"

View File

@ -888,6 +888,7 @@ static int qspi_transmit_blocking(struct s32k3xx_qspidev_s *priv,
uint32_t count = UINT32_MAX; uint32_t count = UINT32_MAX;
uint32_t *data = (uint32_t *)meminfo->buffer; uint32_t *data = (uint32_t *)meminfo->buffer;
uint32_t write_cycle = min(32, ((uint32_t)remaining) >> 2U); uint32_t write_cycle = min(32, ((uint32_t)remaining) >> 2U);
uint32_t timeout = 1000;
int ret = 0; int ret = 0;
/* Copy sequence in LUT registers */ /* Copy sequence in LUT registers */
@ -916,31 +917,33 @@ static int qspi_transmit_blocking(struct s32k3xx_qspidev_s *priv,
putreg32(QSPI_AMBA_BASE + meminfo->addr, S32K3XX_QSPI_SFAR); putreg32(QSPI_AMBA_BASE + meminfo->addr, S32K3XX_QSPI_SFAR);
/* Re-attempt filling TX fifo if size doesn't match */
while ((getreg32(S32K3XX_QSPI_TBSR) & QSPI_TBSR_TRBLF_MASK) != count)
{
/* Clear TX fifo */ /* Clear TX fifo */
regval = getreg32(S32K3XX_QSPI_MCR); regval = getreg32(S32K3XX_QSPI_MCR);
regval |= QSPI_MCR_CLR_TXF; regval |= QSPI_MCR_CLR_TXF;
putreg32(regval, S32K3XX_QSPI_MCR); putreg32(regval, S32K3XX_QSPI_MCR);
do /* Wait for fifo clear otherwise timeout */
{
timeout--;
}
while ((getreg32(S32K3XX_QSPI_TBSR) & QSPI_TBSR_TRBLF_MASK) != 0
&& timeout > 0);
if (timeout == 0)
{
return -ETIMEDOUT;
}
spiinfo("Transmit: %" PRIu32 " size: %" PRIu32 "\n", spiinfo("Transmit: %" PRIu32 " size: %" PRIu32 "\n",
meminfo->addr, meminfo->buflen); meminfo->addr, meminfo->buflen);
for (count = 0U; count < write_cycle; count++) for (count = 0U; count < write_cycle; count++)
{ {
while ((getreg32(S32K3XX_QSPI_TBSR)
& QSPI_TBSR_TRBLF_MASK) != count)
{
}
putreg32(*data, S32K3XX_QSPI_TBDR); putreg32(*data, S32K3XX_QSPI_TBDR);
data++; data++;
remaining -= 4U; remaining -= 4U;
} }
}
/* Trigger IP command with specified sequence and size */ /* Trigger IP command with specified sequence and size */