* [PATCH 0/8] spi: stm32: Update for OSPI and QSPI drivers
@ 2025-12-05 9:04 Patrice Chotard
2025-12-05 9:04 ` [PATCH 1/8] spi: stm32-ospi: Set DMA maxburst dynamically Patrice Chotard
` (8 more replies)
0 siblings, 9 replies; 13+ messages in thread
From: Patrice Chotard @ 2025-12-05 9:04 UTC (permalink / raw)
To: Mark Brown, Maxime Coquelin, Alexandre Torgue
Cc: linux-spi, linux-stm32, linux-arm-kernel, linux-kernel,
Patrice Chotard
This serie applies the following updates on the spi-stm32-ospi and
spi-stm32-qspi dirvers :
_ Update FIFO accesses using u16 and u32 when possible instead of u8
only to optimize throughput.
_ Replace Transmit Complete and Transmit Error interrupt management by
usage of read_poll_timeout_atomic() to optimize throughtput.
_ Simplify Status Match interrupt check.
_ Set DMA burst configuration dynamically.
Signed-off-by: Patrice Chotard <patrice.chotard@foss.st.com>
---
Patrice Chotard (8):
spi: stm32-ospi: Set DMA maxburst dynamically
spi: stm32-ospi: Optimize FIFO accesses using u16 or u32
spi: stm32-ospi: Remove CR_TCIE and CR_TEIE irq usage
spi: stm32-ospi: Simplify SMIE interrupt test
spi: stm32-qspi: Set DMA maxburst dynamically
spi: stm32-qspi: Optimize FIFO accesses using u16 or u32
spi: stm32-qspi: Remove CR_TCIE and CR_TEIE irq usage
spi: stm32-qspi: Simplify SMIE interrupt test
drivers/spi/spi-stm32-ospi.c | 107 +++++++++++++++++++++++++----------------
drivers/spi/spi-stm32-qspi.c | 111 +++++++++++++++++++++++++------------------
2 files changed, 132 insertions(+), 86 deletions(-)
---
base-commit: 7d0a66e4bb9081d75c82ec4957c50034cb0ea449
change-id: 20251205-upstream_qspi_ospi_updates-4faf7a3b098c
Best regards,
--
Patrice Chotard <patrice.chotard@foss.st.com>
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 1/8] spi: stm32-ospi: Set DMA maxburst dynamically
2025-12-05 9:04 [PATCH 0/8] spi: stm32: Update for OSPI and QSPI drivers Patrice Chotard
@ 2025-12-05 9:04 ` Patrice Chotard
2025-12-05 9:04 ` [PATCH 2/8] spi: stm32-ospi: Optimize FIFO accesses using u16 or u32 Patrice Chotard
` (7 subsequent siblings)
8 siblings, 0 replies; 13+ messages in thread
From: Patrice Chotard @ 2025-12-05 9:04 UTC (permalink / raw)
To: Mark Brown, Maxime Coquelin, Alexandre Torgue
Cc: linux-spi, linux-stm32, linux-arm-kernel, linux-kernel,
Patrice Chotard
Set src_maxburst and dst_maxburst dynamically from DMA
capabilities.
Signed-off-by: Patrice Chotard <patrice.chotard@foss.st.com>
---
drivers/spi/spi-stm32-ospi.c | 27 ++++++++++++++++++++++-----
1 file changed, 22 insertions(+), 5 deletions(-)
diff --git a/drivers/spi/spi-stm32-ospi.c b/drivers/spi/spi-stm32-ospi.c
index f36fd36da269..d733e37f0435 100644
--- a/drivers/spi/spi-stm32-ospi.c
+++ b/drivers/spi/spi-stm32-ospi.c
@@ -278,10 +278,19 @@ static irqreturn_t stm32_ospi_irq(int irq, void *dev_id)
return IRQ_HANDLED;
}
-static void stm32_ospi_dma_setup(struct stm32_ospi *ospi,
- struct dma_slave_config *dma_cfg)
+static int stm32_ospi_dma_setup(struct stm32_ospi *ospi,
+ struct dma_slave_config *dma_cfg)
{
+ struct dma_slave_caps caps;
+ int ret = 0;
+
if (dma_cfg && ospi->dma_chrx) {
+ ret = dma_get_slave_caps(ospi->dma_chrx, &caps);
+ if (ret)
+ return ret;
+
+ dma_cfg->src_maxburst = caps.max_burst / dma_cfg->src_addr_width;
+
if (dmaengine_slave_config(ospi->dma_chrx, dma_cfg)) {
dev_err(ospi->dev, "dma rx config failed\n");
dma_release_channel(ospi->dma_chrx);
@@ -290,6 +299,12 @@ static void stm32_ospi_dma_setup(struct stm32_ospi *ospi,
}
if (dma_cfg && ospi->dma_chtx) {
+ ret = dma_get_slave_caps(ospi->dma_chtx, &caps);
+ if (ret)
+ return ret;
+
+ dma_cfg->dst_maxburst = caps.max_burst / dma_cfg->dst_addr_width;
+
if (dmaengine_slave_config(ospi->dma_chtx, dma_cfg)) {
dev_err(ospi->dev, "dma tx config failed\n");
dma_release_channel(ospi->dma_chtx);
@@ -298,6 +313,8 @@ static void stm32_ospi_dma_setup(struct stm32_ospi *ospi,
}
init_completion(&ospi->dma_completion);
+
+ return ret;
}
static int stm32_ospi_tx_mm(struct stm32_ospi *ospi,
@@ -899,9 +916,9 @@ static int stm32_ospi_probe(struct platform_device *pdev)
dma_cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
dma_cfg.src_addr = ospi->regs_phys_base + OSPI_DR;
dma_cfg.dst_addr = ospi->regs_phys_base + OSPI_DR;
- dma_cfg.src_maxburst = 4;
- dma_cfg.dst_maxburst = 4;
- stm32_ospi_dma_setup(ospi, &dma_cfg);
+ ret = stm32_ospi_dma_setup(ospi, &dma_cfg);
+ if (ret)
+ return ret;
mutex_init(&ospi->lock);
--
2.43.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 2/8] spi: stm32-ospi: Optimize FIFO accesses using u16 or u32
2025-12-05 9:04 [PATCH 0/8] spi: stm32: Update for OSPI and QSPI drivers Patrice Chotard
2025-12-05 9:04 ` [PATCH 1/8] spi: stm32-ospi: Set DMA maxburst dynamically Patrice Chotard
@ 2025-12-05 9:04 ` Patrice Chotard
2025-12-05 15:04 ` Mark Brown
2025-12-05 9:04 ` [PATCH 3/8] spi: stm32-ospi: Remove CR_TCIE and CR_TEIE irq usage Patrice Chotard
` (6 subsequent siblings)
8 siblings, 1 reply; 13+ messages in thread
From: Patrice Chotard @ 2025-12-05 9:04 UTC (permalink / raw)
To: Mark Brown, Maxime Coquelin, Alexandre Torgue
Cc: linux-spi, linux-stm32, linux-arm-kernel, linux-kernel,
Patrice Chotard
FIFO accesses uses u8 only for read/write.
In order to optimize throughput, add u16 or u32 read/write
accesses when possible.
Running mtd_speedtest on a 4MB sNOR partition using a
stm32mp257f-ev1 board gives the following results:
before after gain
Read : 5693 KiB/s 21139 KiB/s 371%
Write: 765 KiB/s 910 KiB/s 19%
Signed-off-by: Patrice Chotard <patrice.chotard@foss.st.com>
---
drivers/spi/spi-stm32-ospi.c | 47 +++++++++++++++++++++++++++++++++++---------
1 file changed, 38 insertions(+), 9 deletions(-)
diff --git a/drivers/spi/spi-stm32-ospi.c b/drivers/spi/spi-stm32-ospi.c
index d733e37f0435..a6f53f06200e 100644
--- a/drivers/spi/spi-stm32-ospi.c
+++ b/drivers/spi/spi-stm32-ospi.c
@@ -142,14 +142,32 @@ struct stm32_ospi {
struct mutex lock;
};
-static void stm32_ospi_read_fifo(u8 *val, void __iomem *addr)
+static void stm32_ospi_read_fifo(void *val, void __iomem *addr, u8 len)
{
- *val = readb_relaxed(addr);
+ switch (len) {
+ case sizeof(u32):
+ *((u32 *)val) = readl_relaxed(addr);
+ break;
+ case sizeof(u16):
+ *((u16 *)val) = readw_relaxed(addr);
+ break;
+ case sizeof(u8):
+ *((u8 *)val) = readb_relaxed(addr);
+ };
}
-static void stm32_ospi_write_fifo(u8 *val, void __iomem *addr)
+static void stm32_ospi_write_fifo(void *val, void __iomem *addr, u8 len)
{
- writeb_relaxed(*val, addr);
+ switch (len) {
+ case sizeof(u32):
+ writel_relaxed(*((u32 *)val), addr);
+ break;
+ case sizeof(u16):
+ writew_relaxed(*((u16 *)val), addr);
+ break;
+ case sizeof(u8):
+ writeb_relaxed(*((u8 *)val), addr);
+ };
}
static int stm32_ospi_abort(struct stm32_ospi *ospi)
@@ -172,19 +190,20 @@ static int stm32_ospi_abort(struct stm32_ospi *ospi)
return timeout;
}
-static int stm32_ospi_poll(struct stm32_ospi *ospi, u8 *buf, u32 len, bool read)
+static int stm32_ospi_poll(struct stm32_ospi *ospi, void *buf, u32 len, bool read)
{
void __iomem *regs_base = ospi->regs_base;
- void (*fifo)(u8 *val, void __iomem *addr);
+ void (*fifo)(void *val, void __iomem *addr, u8 len);
u32 sr;
int ret;
+ u8 step;
if (read)
fifo = stm32_ospi_read_fifo;
else
fifo = stm32_ospi_write_fifo;
- while (len--) {
+ while (len) {
ret = readl_relaxed_poll_timeout_atomic(regs_base + OSPI_SR,
sr, sr & SR_FTF, 1,
STM32_FIFO_TIMEOUT_US);
@@ -193,7 +212,17 @@ static int stm32_ospi_poll(struct stm32_ospi *ospi, u8 *buf, u32 len, bool read)
len, sr);
return ret;
}
- fifo(buf++, regs_base + OSPI_DR);
+
+ if (len >= sizeof(u32))
+ step = sizeof(u32);
+ else if (len >= sizeof(u16))
+ step = sizeof(u16);
+ else
+ step = sizeof(u8);
+
+ fifo(buf, regs_base + OSPI_DR, step);
+ len -= step;
+ buf += step;
}
return 0;
@@ -408,7 +437,7 @@ static int stm32_ospi_xfer(struct stm32_ospi *ospi, const struct spi_mem_op *op)
if (op->data.dir == SPI_MEM_DATA_IN)
buf = op->data.buf.in;
else
- buf = (u8 *)op->data.buf.out;
+ buf = (void *)op->data.buf.out;
return stm32_ospi_poll(ospi, buf, op->data.nbytes,
op->data.dir == SPI_MEM_DATA_IN);
--
2.43.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 3/8] spi: stm32-ospi: Remove CR_TCIE and CR_TEIE irq usage
2025-12-05 9:04 [PATCH 0/8] spi: stm32: Update for OSPI and QSPI drivers Patrice Chotard
2025-12-05 9:04 ` [PATCH 1/8] spi: stm32-ospi: Set DMA maxburst dynamically Patrice Chotard
2025-12-05 9:04 ` [PATCH 2/8] spi: stm32-ospi: Optimize FIFO accesses using u16 or u32 Patrice Chotard
@ 2025-12-05 9:04 ` Patrice Chotard
2025-12-06 5:19 ` kernel test robot
2025-12-06 7:18 ` kernel test robot
2025-12-05 9:04 ` [PATCH 4/8] spi: stm32-ospi: Simplify SMIE interrupt test Patrice Chotard
` (5 subsequent siblings)
8 siblings, 2 replies; 13+ messages in thread
From: Patrice Chotard @ 2025-12-05 9:04 UTC (permalink / raw)
To: Mark Brown, Maxime Coquelin, Alexandre Torgue
Cc: linux-spi, linux-stm32, linux-arm-kernel, linux-kernel,
Patrice Chotard
Replace CR_TCIE and CR_TEIE irq usage by a read_poll_timeout_atomic() in
stm32_ospi_wait_cmd(). It will reduce the time waiting for TCF or TEF flags
to optimize throughput.
before after
average time spent in stm32_omi_wait_cmd: 5685 ns 923 ns
Signed-off-by: Patrice Chotard <patrice.chotard@foss.st.com>
---
drivers/spi/spi-stm32-ospi.c | 31 ++++++-------------------------
1 file changed, 6 insertions(+), 25 deletions(-)
diff --git a/drivers/spi/spi-stm32-ospi.c b/drivers/spi/spi-stm32-ospi.c
index a6f53f06200e..d8d72e2fb4bd 100644
--- a/drivers/spi/spi-stm32-ospi.c
+++ b/drivers/spi/spi-stm32-ospi.c
@@ -34,8 +34,6 @@
#define CR_ABORT BIT(1)
#define CR_DMAEN BIT(2)
#define CR_FTHRES_SHIFT 8
-#define CR_TEIE BIT(16)
-#define CR_TCIE BIT(17)
#define CR_SMIE BIT(19)
#define CR_APMS BIT(22)
#define CR_CSSEL BIT(24)
@@ -106,7 +104,7 @@
#define STM32_ABT_TIMEOUT_US 100000
#define STM32_COMP_TIMEOUT_MS 5000
#define STM32_BUSY_TIMEOUT_US 100000
-
+#define STM32_WAIT_CMD_TIMEOUT_US 5000
#define STM32_AUTOSUSPEND_DELAY -1
@@ -116,7 +114,6 @@ struct stm32_ospi {
struct clk *clk;
struct reset_control *rstc;
- struct completion data_completion;
struct completion match_completion;
struct dma_chan *dma_chtx;
@@ -240,22 +237,16 @@ static int stm32_ospi_wait_nobusy(struct stm32_ospi *ospi)
static int stm32_ospi_wait_cmd(struct stm32_ospi *ospi)
{
void __iomem *regs_base = ospi->regs_base;
- u32 cr, sr;
+ u32 sr;
int err = 0;
- if ((readl_relaxed(regs_base + OSPI_SR) & SR_TCF) ||
- ospi->fmode == CR_FMODE_APM)
+ if (ospi->fmode == CR_FMODE_APM)
goto out;
- reinit_completion(&ospi->data_completion);
- cr = readl_relaxed(regs_base + OSPI_CR);
- writel_relaxed(cr | CR_TCIE | CR_TEIE, regs_base + OSPI_CR);
-
- if (!wait_for_completion_timeout(&ospi->data_completion,
- msecs_to_jiffies(STM32_COMP_TIMEOUT_MS)))
- err = -ETIMEDOUT;
+ err = readl_relaxed_poll_timeout_atomic(ospi->io_base + OSPI_SR, sr,
+ (sr & (SR_TEF | SR_TCF)), 1,
+ STM32_WAIT_CMD_TIMEOUT_US);
- sr = readl_relaxed(regs_base + OSPI_SR);
if (sr & SR_TCF)
/* avoid false timeout */
err = 0;
@@ -293,15 +284,6 @@ static irqreturn_t stm32_ospi_irq(int irq, void *dev_id)
cr &= ~CR_SMIE;
writel_relaxed(cr, regs_base + OSPI_CR);
complete(&ospi->match_completion);
-
- return IRQ_HANDLED;
- }
-
- if (sr & (SR_TEF | SR_TCF)) {
- /* disable irq */
- cr &= ~CR_TCIE & ~CR_TEIE;
- writel_relaxed(cr, regs_base + OSPI_CR);
- complete(&ospi->data_completion);
}
return IRQ_HANDLED;
@@ -884,7 +866,6 @@ static int stm32_ospi_get_resources(struct platform_device *pdev)
dev_info(dev, "No memory-map region found\n");
}
- init_completion(&ospi->data_completion);
init_completion(&ospi->match_completion);
return 0;
--
2.43.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 4/8] spi: stm32-ospi: Simplify SMIE interrupt test
2025-12-05 9:04 [PATCH 0/8] spi: stm32: Update for OSPI and QSPI drivers Patrice Chotard
` (2 preceding siblings ...)
2025-12-05 9:04 ` [PATCH 3/8] spi: stm32-ospi: Remove CR_TCIE and CR_TEIE irq usage Patrice Chotard
@ 2025-12-05 9:04 ` Patrice Chotard
2025-12-05 9:04 ` [PATCH 5/8] spi: stm32-qspi: Set DMA maxburst dynamically Patrice Chotard
` (4 subsequent siblings)
8 siblings, 0 replies; 13+ messages in thread
From: Patrice Chotard @ 2025-12-05 9:04 UTC (permalink / raw)
To: Mark Brown, Maxime Coquelin, Alexandre Torgue
Cc: linux-spi, linux-stm32, linux-arm-kernel, linux-kernel,
Patrice Chotard
SR_SMF status bit can only be set if CR_SMIE was previously set,
keep status bit check only.
Signed-off-by: Patrice Chotard <patrice.chotard@foss.st.com>
---
drivers/spi/spi-stm32-ospi.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/spi/spi-stm32-ospi.c b/drivers/spi/spi-stm32-ospi.c
index d8d72e2fb4bd..8f7bf6c582c9 100644
--- a/drivers/spi/spi-stm32-ospi.c
+++ b/drivers/spi/spi-stm32-ospi.c
@@ -279,7 +279,7 @@ static irqreturn_t stm32_ospi_irq(int irq, void *dev_id)
cr = readl_relaxed(regs_base + OSPI_CR);
sr = readl_relaxed(regs_base + OSPI_SR);
- if (cr & CR_SMIE && sr & SR_SMF) {
+ if (sr & SR_SMF) {
/* disable irq */
cr &= ~CR_SMIE;
writel_relaxed(cr, regs_base + OSPI_CR);
--
2.43.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 5/8] spi: stm32-qspi: Set DMA maxburst dynamically
2025-12-05 9:04 [PATCH 0/8] spi: stm32: Update for OSPI and QSPI drivers Patrice Chotard
` (3 preceding siblings ...)
2025-12-05 9:04 ` [PATCH 4/8] spi: stm32-ospi: Simplify SMIE interrupt test Patrice Chotard
@ 2025-12-05 9:04 ` Patrice Chotard
2025-12-05 9:04 ` [PATCH 6/8] spi: stm32-qspi: Optimize FIFO accesses using u16 or u32 Patrice Chotard
` (3 subsequent siblings)
8 siblings, 0 replies; 13+ messages in thread
From: Patrice Chotard @ 2025-12-05 9:04 UTC (permalink / raw)
To: Mark Brown, Maxime Coquelin, Alexandre Torgue
Cc: linux-spi, linux-stm32, linux-arm-kernel, linux-kernel,
Patrice Chotard
Set src_maxburst and dst_maxburst dynamically from DMA
capabilities.
Signed-off-by: Patrice Chotard <patrice.chotard@foss.st.com>
---
drivers/spi/spi-stm32-qspi.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/drivers/spi/spi-stm32-qspi.c b/drivers/spi/spi-stm32-qspi.c
index f2d19f1c5ab1..c131441e4dd4 100644
--- a/drivers/spi/spi-stm32-qspi.c
+++ b/drivers/spi/spi-stm32-qspi.c
@@ -689,6 +689,7 @@ static int stm32_qspi_dma_setup(struct stm32_qspi *qspi)
{
struct dma_slave_config dma_cfg;
struct device *dev = qspi->dev;
+ struct dma_slave_caps caps;
int ret = 0;
memset(&dma_cfg, 0, sizeof(dma_cfg));
@@ -697,8 +698,6 @@ static int stm32_qspi_dma_setup(struct stm32_qspi *qspi)
dma_cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
dma_cfg.src_addr = qspi->phys_base + QSPI_DR;
dma_cfg.dst_addr = qspi->phys_base + QSPI_DR;
- dma_cfg.src_maxburst = 4;
- dma_cfg.dst_maxburst = 4;
qspi->dma_chrx = dma_request_chan(dev, "rx");
if (IS_ERR(qspi->dma_chrx)) {
@@ -707,6 +706,11 @@ static int stm32_qspi_dma_setup(struct stm32_qspi *qspi)
if (ret == -EPROBE_DEFER)
goto out;
} else {
+ ret = dma_get_slave_caps(qspi->dma_chrx, &caps);
+ if (ret)
+ return ret;
+
+ dma_cfg.src_maxburst = caps.max_burst / dma_cfg.src_addr_width;
if (dmaengine_slave_config(qspi->dma_chrx, &dma_cfg)) {
dev_err(dev, "dma rx config failed\n");
dma_release_channel(qspi->dma_chrx);
@@ -719,6 +723,11 @@ static int stm32_qspi_dma_setup(struct stm32_qspi *qspi)
ret = PTR_ERR(qspi->dma_chtx);
qspi->dma_chtx = NULL;
} else {
+ ret = dma_get_slave_caps(qspi->dma_chtx, &caps);
+ if (ret)
+ return ret;
+
+ dma_cfg.dst_maxburst = caps.max_burst / dma_cfg.dst_addr_width;
if (dmaengine_slave_config(qspi->dma_chtx, &dma_cfg)) {
dev_err(dev, "dma tx config failed\n");
dma_release_channel(qspi->dma_chtx);
--
2.43.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 6/8] spi: stm32-qspi: Optimize FIFO accesses using u16 or u32
2025-12-05 9:04 [PATCH 0/8] spi: stm32: Update for OSPI and QSPI drivers Patrice Chotard
` (4 preceding siblings ...)
2025-12-05 9:04 ` [PATCH 5/8] spi: stm32-qspi: Set DMA maxburst dynamically Patrice Chotard
@ 2025-12-05 9:04 ` Patrice Chotard
2025-12-05 9:04 ` [PATCH 7/8] spi: stm32-qspi: Remove CR_TCIE and CR_TEIE irq usage Patrice Chotard
` (2 subsequent siblings)
8 siblings, 0 replies; 13+ messages in thread
From: Patrice Chotard @ 2025-12-05 9:04 UTC (permalink / raw)
To: Mark Brown, Maxime Coquelin, Alexandre Torgue
Cc: linux-spi, linux-stm32, linux-arm-kernel, linux-kernel,
Patrice Chotard
FIFO accesses uses u8 only for read/write.
In order to optimize throughput, add u16 or u32 read/write
accesses when possible.
Running mtd_speedtest on a 4MB sNOR partition using a
stm32mp257f-ev1 board gives the following results:
before after gain
Read : 5773 KiB/s 22170 KiB/s 384%
Write: 796 KiB/s 890 KiB/s 12%
Signed-off-by: Patrice Chotard <patrice.chotard@foss.st.com>
---
drivers/spi/spi-stm32-qspi.c | 51 ++++++++++++++++++++++++++++++++++----------
1 file changed, 40 insertions(+), 11 deletions(-)
diff --git a/drivers/spi/spi-stm32-qspi.c b/drivers/spi/spi-stm32-qspi.c
index c131441e4dd4..c7f2b435d5ee 100644
--- a/drivers/spi/spi-stm32-qspi.c
+++ b/drivers/spi/spi-stm32-qspi.c
@@ -153,34 +153,53 @@ static irqreturn_t stm32_qspi_irq(int irq, void *dev_id)
return IRQ_HANDLED;
}
-static void stm32_qspi_read_fifo(u8 *val, void __iomem *addr)
+static void stm32_qspi_read_fifo(void *val, void __iomem *addr, u8 len)
{
- *val = readb_relaxed(addr);
+ switch (len) {
+ case sizeof(u32):
+ *((u32 *)val) = readl_relaxed(addr);
+ break;
+ case sizeof(u16):
+ *((u16 *)val) = readw_relaxed(addr);
+ break;
+ case sizeof(u8):
+ *((u8 *)val) = readb_relaxed(addr);
+ };
}
-static void stm32_qspi_write_fifo(u8 *val, void __iomem *addr)
+static void stm32_qspi_write_fifo(void *val, void __iomem *addr, u8 len)
{
- writeb_relaxed(*val, addr);
+ switch (len) {
+ case sizeof(u32):
+ writel_relaxed(*((u32 *)val), addr);
+ break;
+ case sizeof(u16):
+ writew_relaxed(*((u16 *)val), addr);
+ break;
+ case sizeof(u8):
+ writeb_relaxed(*((u8 *)val), addr);
+ };
}
static int stm32_qspi_tx_poll(struct stm32_qspi *qspi,
const struct spi_mem_op *op)
{
- void (*tx_fifo)(u8 *val, void __iomem *addr);
+ void (*fifo)(void *val, void __iomem *addr, u8 len);
u32 len = op->data.nbytes, sr;
- u8 *buf;
+ void *buf;
int ret;
+ u8 step;
if (op->data.dir == SPI_MEM_DATA_IN) {
- tx_fifo = stm32_qspi_read_fifo;
+ fifo = stm32_qspi_read_fifo;
buf = op->data.buf.in;
} else {
- tx_fifo = stm32_qspi_write_fifo;
- buf = (u8 *)op->data.buf.out;
+ fifo = stm32_qspi_write_fifo;
+ buf = (void *)op->data.buf.out;
}
- while (len--) {
+ while (len) {
ret = readl_relaxed_poll_timeout_atomic(qspi->io_base + QSPI_SR,
sr, (sr & SR_FTF), 1,
STM32_FIFO_TIMEOUT_US);
@@ -189,7 +208,17 @@ static int stm32_qspi_tx_poll(struct stm32_qspi *qspi,
len, sr);
return ret;
}
- tx_fifo(buf++, qspi->io_base + QSPI_DR);
+
+ if (len >= sizeof(u32))
+ step = sizeof(u32);
+ else if (len >= sizeof(u16))
+ step = sizeof(u16);
+ else
+ step = sizeof(u8);
+
+ fifo(buf, qspi->io_base + QSPI_DR, step);
+ len -= step;
+ buf += step;
}
return 0;
--
2.43.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 7/8] spi: stm32-qspi: Remove CR_TCIE and CR_TEIE irq usage
2025-12-05 9:04 [PATCH 0/8] spi: stm32: Update for OSPI and QSPI drivers Patrice Chotard
` (5 preceding siblings ...)
2025-12-05 9:04 ` [PATCH 6/8] spi: stm32-qspi: Optimize FIFO accesses using u16 or u32 Patrice Chotard
@ 2025-12-05 9:04 ` Patrice Chotard
2025-12-05 9:04 ` [PATCH 8/8] spi: stm32-qspi: Simplify SMIE interrupt test Patrice Chotard
2025-12-15 13:59 ` [PATCH 0/8] spi: stm32: Update for OSPI and QSPI drivers Mark Brown
8 siblings, 0 replies; 13+ messages in thread
From: Patrice Chotard @ 2025-12-05 9:04 UTC (permalink / raw)
To: Mark Brown, Maxime Coquelin, Alexandre Torgue
Cc: linux-spi, linux-stm32, linux-arm-kernel, linux-kernel,
Patrice Chotard
Replace CR_TCIE and CR_TEIE irq usage by a read_poll_timeout_atomic() in
stm32_qspi_wait_cmd(). It will reduce the time waiting for TCF or TEF flags
to optimize throughput.
before after
average time spent in stm32_qspi_wait_cmd: 2615 ns 712 ns
Signed-off-by: Patrice Chotard <patrice.chotard@foss.st.com>
---
drivers/spi/spi-stm32-qspi.c | 45 +++++++++++++-------------------------------
1 file changed, 13 insertions(+), 32 deletions(-)
diff --git a/drivers/spi/spi-stm32-qspi.c b/drivers/spi/spi-stm32-qspi.c
index c7f2b435d5ee..d6f6f9d4e5be 100644
--- a/drivers/spi/spi-stm32-qspi.c
+++ b/drivers/spi/spi-stm32-qspi.c
@@ -31,8 +31,6 @@
#define CR_DFM BIT(6)
#define CR_FSEL BIT(7)
#define CR_FTHRES_SHIFT 8
-#define CR_TEIE BIT(16)
-#define CR_TCIE BIT(17)
#define CR_FTIE BIT(18)
#define CR_SMIE BIT(19)
#define CR_TOIE BIT(20)
@@ -86,11 +84,12 @@
#define STM32_QSPI_MAX_MMAP_SZ SZ_256M
#define STM32_QSPI_MAX_NORCHIP 2
-#define STM32_FIFO_TIMEOUT_US 30000
-#define STM32_BUSY_TIMEOUT_US 100000
-#define STM32_ABT_TIMEOUT_US 100000
-#define STM32_COMP_TIMEOUT_MS 1000
-#define STM32_AUTOSUSPEND_DELAY -1
+#define STM32_FIFO_TIMEOUT_US 30000
+#define STM32_BUSY_TIMEOUT_US 100000
+#define STM32_ABT_TIMEOUT_US 100000
+#define STM32_WAIT_CMD_TIMEOUT_US 5000
+#define STM32_COMP_TIMEOUT_MS 1000
+#define STM32_AUTOSUSPEND_DELAY -1
struct stm32_qspi_flash {
u32 cs;
@@ -107,7 +106,6 @@ struct stm32_qspi {
struct clk *clk;
u32 clk_rate;
struct stm32_qspi_flash flash[STM32_QSPI_MAX_NORCHIP];
- struct completion data_completion;
struct completion match_completion;
u32 fmode;
@@ -139,15 +137,6 @@ static irqreturn_t stm32_qspi_irq(int irq, void *dev_id)
cr &= ~CR_SMIE;
writel_relaxed(cr, qspi->io_base + QSPI_CR);
complete(&qspi->match_completion);
-
- return IRQ_HANDLED;
- }
-
- if (sr & (SR_TEF | SR_TCF)) {
- /* disable irq */
- cr &= ~CR_TCIE & ~CR_TEIE;
- writel_relaxed(cr, qspi->io_base + QSPI_CR);
- complete(&qspi->data_completion);
}
return IRQ_HANDLED;
@@ -330,25 +319,18 @@ static int stm32_qspi_wait_nobusy(struct stm32_qspi *qspi)
static int stm32_qspi_wait_cmd(struct stm32_qspi *qspi)
{
- u32 cr, sr;
+ u32 sr;
int err = 0;
- if ((readl_relaxed(qspi->io_base + QSPI_SR) & SR_TCF) ||
- qspi->fmode == CCR_FMODE_APM)
+ if (qspi->fmode == CCR_FMODE_APM)
goto out;
- reinit_completion(&qspi->data_completion);
- cr = readl_relaxed(qspi->io_base + QSPI_CR);
- writel_relaxed(cr | CR_TCIE | CR_TEIE, qspi->io_base + QSPI_CR);
+ err = readl_relaxed_poll_timeout_atomic(qspi->io_base + QSPI_SR, sr,
+ (sr & (SR_TEF | SR_TCF)), 1,
+ STM32_WAIT_CMD_TIMEOUT_US);
- if (!wait_for_completion_timeout(&qspi->data_completion,
- msecs_to_jiffies(STM32_COMP_TIMEOUT_MS))) {
- err = -ETIMEDOUT;
- } else {
- sr = readl_relaxed(qspi->io_base + QSPI_SR);
- if (sr & SR_TEF)
- err = -EIO;
- }
+ if (sr & SR_TEF)
+ err = -EIO;
out:
/* clear flags */
@@ -835,7 +817,6 @@ static int stm32_qspi_probe(struct platform_device *pdev)
return ret;
}
- init_completion(&qspi->data_completion);
init_completion(&qspi->match_completion);
qspi->clk = devm_clk_get(dev, NULL);
--
2.43.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 8/8] spi: stm32-qspi: Simplify SMIE interrupt test
2025-12-05 9:04 [PATCH 0/8] spi: stm32: Update for OSPI and QSPI drivers Patrice Chotard
` (6 preceding siblings ...)
2025-12-05 9:04 ` [PATCH 7/8] spi: stm32-qspi: Remove CR_TCIE and CR_TEIE irq usage Patrice Chotard
@ 2025-12-05 9:04 ` Patrice Chotard
2025-12-15 13:59 ` [PATCH 0/8] spi: stm32: Update for OSPI and QSPI drivers Mark Brown
8 siblings, 0 replies; 13+ messages in thread
From: Patrice Chotard @ 2025-12-05 9:04 UTC (permalink / raw)
To: Mark Brown, Maxime Coquelin, Alexandre Torgue
Cc: linux-spi, linux-stm32, linux-arm-kernel, linux-kernel,
Patrice Chotard
SR_SMF status bit can only be set if CR_SMIE was previously set,
keep status bit check only.
Signed-off-by: Patrice Chotard <patrice.chotard@foss.st.com>
---
drivers/spi/spi-stm32-qspi.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/spi/spi-stm32-qspi.c b/drivers/spi/spi-stm32-qspi.c
index d6f6f9d4e5be..2a0ee96786fa 100644
--- a/drivers/spi/spi-stm32-qspi.c
+++ b/drivers/spi/spi-stm32-qspi.c
@@ -132,7 +132,7 @@ static irqreturn_t stm32_qspi_irq(int irq, void *dev_id)
cr = readl_relaxed(qspi->io_base + QSPI_CR);
sr = readl_relaxed(qspi->io_base + QSPI_SR);
- if (cr & CR_SMIE && sr & SR_SMF) {
+ if (sr & SR_SMF) {
/* disable irq */
cr &= ~CR_SMIE;
writel_relaxed(cr, qspi->io_base + QSPI_CR);
--
2.43.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH 2/8] spi: stm32-ospi: Optimize FIFO accesses using u16 or u32
2025-12-05 9:04 ` [PATCH 2/8] spi: stm32-ospi: Optimize FIFO accesses using u16 or u32 Patrice Chotard
@ 2025-12-05 15:04 ` Mark Brown
0 siblings, 0 replies; 13+ messages in thread
From: Mark Brown @ 2025-12-05 15:04 UTC (permalink / raw)
To: Patrice Chotard
Cc: Maxime Coquelin, Alexandre Torgue, linux-spi, linux-stm32,
linux-arm-kernel, linux-kernel
[-- Attachment #1: Type: text/plain, Size: 195 bytes --]
On Fri, Dec 05, 2025 at 10:04:52AM +0100, Patrice Chotard wrote:
> before after gain
> Read : 5693 KiB/s 21139 KiB/s 371%
> Write: 765 KiB/s 910 KiB/s 19%
Nice!
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 3/8] spi: stm32-ospi: Remove CR_TCIE and CR_TEIE irq usage
2025-12-05 9:04 ` [PATCH 3/8] spi: stm32-ospi: Remove CR_TCIE and CR_TEIE irq usage Patrice Chotard
@ 2025-12-06 5:19 ` kernel test robot
2025-12-06 7:18 ` kernel test robot
1 sibling, 0 replies; 13+ messages in thread
From: kernel test robot @ 2025-12-06 5:19 UTC (permalink / raw)
To: Patrice Chotard, Mark Brown, Maxime Coquelin, Alexandre Torgue
Cc: oe-kbuild-all, linux-spi, linux-stm32, linux-arm-kernel,
linux-kernel, Patrice Chotard
Hi Patrice,
kernel test robot noticed the following build errors:
[auto build test ERROR on 7d0a66e4bb9081d75c82ec4957c50034cb0ea449]
url: https://github.com/intel-lab-lkp/linux/commits/Patrice-Chotard/spi-stm32-ospi-Set-DMA-maxburst-dynamically/20251205-174931
base: 7d0a66e4bb9081d75c82ec4957c50034cb0ea449
patch link: https://lore.kernel.org/r/20251205-upstream_qspi_ospi_updates-v1-3-7e6c8b9f5141%40foss.st.com
patch subject: [PATCH 3/8] spi: stm32-ospi: Remove CR_TCIE and CR_TEIE irq usage
config: sparc64-randconfig-002-20251206 (https://download.01.org/0day-ci/archive/20251206/202512061327.9CDC4SNs-lkp@intel.com/config)
compiler: sparc64-linux-gcc (GCC) 8.5.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251206/202512061327.9CDC4SNs-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202512061327.9CDC4SNs-lkp@intel.com/
All errors (new ones prefixed by >>):
In file included from drivers/spi/spi-stm32-ospi.c:16:
drivers/spi/spi-stm32-ospi.c: In function 'stm32_ospi_wait_cmd':
>> drivers/spi/spi-stm32-ospi.c:246:48: error: 'struct stm32_ospi' has no member named 'io_base'; did you mean 'mm_base'?
err = readl_relaxed_poll_timeout_atomic(ospi->io_base + OSPI_SR, sr,
^~~~~~~
include/linux/iopoll.h:102:3: note: in definition of macro 'poll_timeout_us_atomic'
op; \
^~
include/linux/iopoll.h:213:2: note: in expansion of macro 'read_poll_timeout_atomic'
read_poll_timeout_atomic(op, val, cond, delay_us, timeout_us, false, addr)
^~~~~~~~~~~~~~~~~~~~~~~~
include/linux/iopoll.h:255:2: note: in expansion of macro 'readx_poll_timeout_atomic'
readx_poll_timeout_atomic(readl_relaxed, addr, val, cond, delay_us, timeout_us)
^~~~~~~~~~~~~~~~~~~~~~~~~
drivers/spi/spi-stm32-ospi.c:246:8: note: in expansion of macro 'readl_relaxed_poll_timeout_atomic'
err = readl_relaxed_poll_timeout_atomic(ospi->io_base + OSPI_SR, sr,
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
vim +246 drivers/spi/spi-stm32-ospi.c
236
237 static int stm32_ospi_wait_cmd(struct stm32_ospi *ospi)
238 {
239 void __iomem *regs_base = ospi->regs_base;
240 u32 sr;
241 int err = 0;
242
243 if (ospi->fmode == CR_FMODE_APM)
244 goto out;
245
> 246 err = readl_relaxed_poll_timeout_atomic(ospi->io_base + OSPI_SR, sr,
247 (sr & (SR_TEF | SR_TCF)), 1,
248 STM32_WAIT_CMD_TIMEOUT_US);
249
250 if (sr & SR_TCF)
251 /* avoid false timeout */
252 err = 0;
253 if (sr & SR_TEF)
254 err = -EIO;
255
256 out:
257 /* clear flags */
258 writel_relaxed(FCR_CTCF | FCR_CTEF, regs_base + OSPI_FCR);
259
260 if (!err)
261 err = stm32_ospi_wait_nobusy(ospi);
262
263 return err;
264 }
265
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 3/8] spi: stm32-ospi: Remove CR_TCIE and CR_TEIE irq usage
2025-12-05 9:04 ` [PATCH 3/8] spi: stm32-ospi: Remove CR_TCIE and CR_TEIE irq usage Patrice Chotard
2025-12-06 5:19 ` kernel test robot
@ 2025-12-06 7:18 ` kernel test robot
1 sibling, 0 replies; 13+ messages in thread
From: kernel test robot @ 2025-12-06 7:18 UTC (permalink / raw)
To: Patrice Chotard, Mark Brown, Maxime Coquelin, Alexandre Torgue
Cc: llvm, oe-kbuild-all, linux-spi, linux-stm32, linux-arm-kernel,
linux-kernel, Patrice Chotard
Hi Patrice,
kernel test robot noticed the following build errors:
[auto build test ERROR on 7d0a66e4bb9081d75c82ec4957c50034cb0ea449]
url: https://github.com/intel-lab-lkp/linux/commits/Patrice-Chotard/spi-stm32-ospi-Set-DMA-maxburst-dynamically/20251205-174931
base: 7d0a66e4bb9081d75c82ec4957c50034cb0ea449
patch link: https://lore.kernel.org/r/20251205-upstream_qspi_ospi_updates-v1-3-7e6c8b9f5141%40foss.st.com
patch subject: [PATCH 3/8] spi: stm32-ospi: Remove CR_TCIE and CR_TEIE irq usage
config: riscv-randconfig-002-20251206 (https://download.01.org/0day-ci/archive/20251206/202512061458.1wp2IbOG-lkp@intel.com/config)
compiler: clang version 19.1.7 (https://github.com/llvm/llvm-project cd708029e0b2869e80abe31ddb175f7c35361f90)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251206/202512061458.1wp2IbOG-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202512061458.1wp2IbOG-lkp@intel.com/
All errors (new ones prefixed by >>):
>> drivers/spi/spi-stm32-ospi.c:246:48: error: no member named 'io_base' in 'struct stm32_ospi'; did you mean 'mm_base'?
246 | err = readl_relaxed_poll_timeout_atomic(ospi->io_base + OSPI_SR, sr,
| ^~~~~~~
| mm_base
include/linux/iopoll.h:255:43: note: expanded from macro 'readl_relaxed_poll_timeout_atomic'
255 | readx_poll_timeout_atomic(readl_relaxed, addr, val, cond, delay_us, timeout_us)
| ^
include/linux/iopoll.h:213:71: note: expanded from macro 'readx_poll_timeout_atomic'
213 | read_poll_timeout_atomic(op, val, cond, delay_us, timeout_us, false, addr)
| ^
include/linux/iopoll.h:172:36: note: expanded from macro 'read_poll_timeout_atomic'
172 | poll_timeout_us_atomic((val) = op(args), cond, sleep_us, timeout_us, sleep_before_read)
| ^
note: (skipping 1 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
arch/riscv/include/asm/mmio.h:90:76: note: expanded from macro 'readl_cpu'
90 | #define readl_cpu(c) ({ u32 __r = le32_to_cpu((__force __le32)__raw_readl(c)); __r; })
| ^
include/uapi/linux/byteorder/little_endian.h:35:51: note: expanded from macro '__le32_to_cpu'
35 | #define __le32_to_cpu(x) ((__force __u32)(__le32)(x))
| ^
include/linux/iopoll.h:102:3: note: expanded from macro 'poll_timeout_us_atomic'
102 | op; \
| ^
drivers/spi/spi-stm32-ospi.c:124:16: note: 'mm_base' declared here
124 | void __iomem *mm_base;
| ^
1 error generated.
vim +246 drivers/spi/spi-stm32-ospi.c
236
237 static int stm32_ospi_wait_cmd(struct stm32_ospi *ospi)
238 {
239 void __iomem *regs_base = ospi->regs_base;
240 u32 sr;
241 int err = 0;
242
243 if (ospi->fmode == CR_FMODE_APM)
244 goto out;
245
> 246 err = readl_relaxed_poll_timeout_atomic(ospi->io_base + OSPI_SR, sr,
247 (sr & (SR_TEF | SR_TCF)), 1,
248 STM32_WAIT_CMD_TIMEOUT_US);
249
250 if (sr & SR_TCF)
251 /* avoid false timeout */
252 err = 0;
253 if (sr & SR_TEF)
254 err = -EIO;
255
256 out:
257 /* clear flags */
258 writel_relaxed(FCR_CTCF | FCR_CTEF, regs_base + OSPI_FCR);
259
260 if (!err)
261 err = stm32_ospi_wait_nobusy(ospi);
262
263 return err;
264 }
265
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 0/8] spi: stm32: Update for OSPI and QSPI drivers
2025-12-05 9:04 [PATCH 0/8] spi: stm32: Update for OSPI and QSPI drivers Patrice Chotard
` (7 preceding siblings ...)
2025-12-05 9:04 ` [PATCH 8/8] spi: stm32-qspi: Simplify SMIE interrupt test Patrice Chotard
@ 2025-12-15 13:59 ` Mark Brown
8 siblings, 0 replies; 13+ messages in thread
From: Mark Brown @ 2025-12-15 13:59 UTC (permalink / raw)
To: Maxime Coquelin, Alexandre Torgue, Patrice Chotard
Cc: linux-spi, linux-stm32, linux-arm-kernel, linux-kernel
On Fri, 05 Dec 2025 10:04:50 +0100, Patrice Chotard wrote:
> This serie applies the following updates on the spi-stm32-ospi and
> spi-stm32-qspi dirvers :
>
> _ Update FIFO accesses using u16 and u32 when possible instead of u8
> only to optimize throughput.
> _ Replace Transmit Complete and Transmit Error interrupt management by
> usage of read_poll_timeout_atomic() to optimize throughtput.
> _ Simplify Status Match interrupt check.
> _ Set DMA burst configuration dynamically.
>
> [...]
Applied to
https://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi.git for-next
Thanks!
[1/8] spi: stm32-ospi: Set DMA maxburst dynamically
commit: e35a7607e05d59d35e937b80532ae93d1dd2493f
[2/8] spi: stm32-ospi: Optimize FIFO accesses using u16 or u32
commit: cfe58ffc95a601988702df6f3462cb54dde467e9
[3/8] spi: stm32-ospi: Remove CR_TCIE and CR_TEIE irq usage
commit: f6ed06926b510f54a0817567ffd458194ed90bd6
[4/8] spi: stm32-ospi: Simplify SMIE interrupt test
commit: e2f0ea18e560e5fa6180f52dffe434525a0cf86b
[5/8] spi: stm32-qspi: Set DMA maxburst dynamically
commit: 4ef80c71c62ab841db9b1a9d74ffe043c60f6222
[6/8] spi: stm32-qspi: Optimize FIFO accesses using u16 or u32
commit: 1ca91281649547efa4be34584a304974c9601df1
[7/8] spi: stm32-qspi: Remove CR_TCIE and CR_TEIE irq usage
commit: c5f76d888810bca2d46297a7b942e10bc8cc69dd
[8/8] spi: stm32-qspi: Simplify SMIE interrupt test
commit: fee876b2ec75dcc18fdea154eae1f5bf14d82659
All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.
You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.
If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.
Please add any relevant lists and maintainers to the CCs when replying
to this mail.
Thanks,
Mark
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2025-12-15 13:59 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-12-05 9:04 [PATCH 0/8] spi: stm32: Update for OSPI and QSPI drivers Patrice Chotard
2025-12-05 9:04 ` [PATCH 1/8] spi: stm32-ospi: Set DMA maxburst dynamically Patrice Chotard
2025-12-05 9:04 ` [PATCH 2/8] spi: stm32-ospi: Optimize FIFO accesses using u16 or u32 Patrice Chotard
2025-12-05 15:04 ` Mark Brown
2025-12-05 9:04 ` [PATCH 3/8] spi: stm32-ospi: Remove CR_TCIE and CR_TEIE irq usage Patrice Chotard
2025-12-06 5:19 ` kernel test robot
2025-12-06 7:18 ` kernel test robot
2025-12-05 9:04 ` [PATCH 4/8] spi: stm32-ospi: Simplify SMIE interrupt test Patrice Chotard
2025-12-05 9:04 ` [PATCH 5/8] spi: stm32-qspi: Set DMA maxburst dynamically Patrice Chotard
2025-12-05 9:04 ` [PATCH 6/8] spi: stm32-qspi: Optimize FIFO accesses using u16 or u32 Patrice Chotard
2025-12-05 9:04 ` [PATCH 7/8] spi: stm32-qspi: Remove CR_TCIE and CR_TEIE irq usage Patrice Chotard
2025-12-05 9:04 ` [PATCH 8/8] spi: stm32-qspi: Simplify SMIE interrupt test Patrice Chotard
2025-12-15 13:59 ` [PATCH 0/8] spi: stm32: Update for OSPI and QSPI drivers Mark Brown
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).