Skip to content

Commit d5efbfc

Browse files
committed
spi: stm32-qspi: flags management fixes
Merge series from patrice.chotard@foss.st.com <patrice.chotard@foss.st.com> Patrice Chotard <patrice.chotard@foss.st.com>: From: Patrice Chotard <patrice.chotard@foss.st.com> This series update flags management in the following cases: - In APM mode, don't take care of TCF and TEF flags - Always check TCF flag in stm32_qspi_wait_cmd() - Don't check BUSY flag when sending new command
2 parents 0d86882 + ae16cc1 commit d5efbfc

3 files changed

Lines changed: 13 additions & 10 deletions

File tree

drivers/spi/spi-cadence-quadspi.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1782,7 +1782,7 @@ static const struct cqspi_driver_platdata intel_lgm_qspi = {
17821782
};
17831783

17841784
static const struct cqspi_driver_platdata socfpga_qspi = {
1785-
.quirks = CQSPI_NO_SUPPORT_WR_COMPLETION,
1785+
.quirks = CQSPI_DISABLE_DAC_MODE | CQSPI_NO_SUPPORT_WR_COMPLETION,
17861786
};
17871787

17881788
static const struct cqspi_driver_platdata versal_ospi = {

drivers/spi/spi-mem.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <linux/pm_runtime.h>
1111
#include <linux/spi/spi.h>
1212
#include <linux/spi/spi-mem.h>
13+
#include <linux/sched/task_stack.h>
1314

1415
#include "internals.h"
1516

@@ -211,6 +212,15 @@ static int spi_mem_check_op(const struct spi_mem_op *op)
211212
!spi_mem_buswidth_is_valid(op->data.buswidth))
212213
return -EINVAL;
213214

215+
/* Buffers must be DMA-able. */
216+
if (WARN_ON_ONCE(op->data.dir == SPI_MEM_DATA_IN &&
217+
object_is_on_stack(op->data.buf.in)))
218+
return -EINVAL;
219+
220+
if (WARN_ON_ONCE(op->data.dir == SPI_MEM_DATA_OUT &&
221+
object_is_on_stack(op->data.buf.out)))
222+
return -EINVAL;
223+
214224
return 0;
215225
}
216226

drivers/spi/spi-stm32-qspi.c

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -305,10 +305,8 @@ static int stm32_qspi_wait_cmd(struct stm32_qspi *qspi,
305305
u32 cr, sr;
306306
int err = 0;
307307

308-
if (!op->data.nbytes)
309-
goto wait_nobusy;
310-
311-
if (readl_relaxed(qspi->io_base + QSPI_SR) & SR_TCF)
308+
if ((readl_relaxed(qspi->io_base + QSPI_SR) & SR_TCF) ||
309+
qspi->fmode == CCR_FMODE_APM)
312310
goto out;
313311

314312
reinit_completion(&qspi->data_completion);
@@ -327,7 +325,6 @@ static int stm32_qspi_wait_cmd(struct stm32_qspi *qspi,
327325
out:
328326
/* clear flags */
329327
writel_relaxed(FCR_CTCF | FCR_CTEF, qspi->io_base + QSPI_FCR);
330-
wait_nobusy:
331328
if (!err)
332329
err = stm32_qspi_wait_nobusy(qspi);
333330

@@ -372,10 +369,6 @@ static int stm32_qspi_send(struct spi_mem *mem, const struct spi_mem_op *op)
372369
op->dummy.buswidth, op->data.buswidth,
373370
op->addr.val, op->data.nbytes);
374371

375-
err = stm32_qspi_wait_nobusy(qspi);
376-
if (err)
377-
goto abort;
378-
379372
cr = readl_relaxed(qspi->io_base + QSPI_CR);
380373
cr &= ~CR_PRESC_MASK & ~CR_FSEL;
381374
cr |= FIELD_PREP(CR_PRESC_MASK, flash->presc);

0 commit comments

Comments
 (0)