aboutsummaryrefslogtreecommitdiffstats
path: root/queue-6.12/spi-spi-mem-add-a-new-controller-capability.patch
diff options
Diffstat (limited to 'queue-6.12/spi-spi-mem-add-a-new-controller-capability.patch')
-rw-r--r--queue-6.12/spi-spi-mem-add-a-new-controller-capability.patch71
1 files changed, 71 insertions, 0 deletions
diff --git a/queue-6.12/spi-spi-mem-add-a-new-controller-capability.patch b/queue-6.12/spi-spi-mem-add-a-new-controller-capability.patch
new file mode 100644
index 0000000000..bbbc1c1bdc
--- /dev/null
+++ b/queue-6.12/spi-spi-mem-add-a-new-controller-capability.patch
@@ -0,0 +1,71 @@
+From 16d2efcbbac33cd7d1be2d934b9bfb3f24425544 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 24 Dec 2024 18:05:47 +0100
+Subject: spi: spi-mem: Add a new controller capability
+
+From: Miquel Raynal <miquel.raynal@bootlin.com>
+
+[ Upstream commit 1248c9b8d54120950fda10fbeb98fb8932b4d45c ]
+
+There are spi devices with multiple frequency limitations depending on
+the invoked command. We probably do not want to afford running at the
+lowest supported frequency all the time, so if we want to get the most
+of our hardware, we need to allow per-operation frequency limitations.
+
+Among all the SPI memory controllers, I believe all are capable of
+changing the spi frequency on the fly. Some of the drivers do not make
+any frequency setup though. And some others will derive a per chip
+prescaler value which will be used forever.
+
+Actually changing the frequency on the fly is something new in Linux, so
+we need to carefully flag the drivers which do and do not support it. A
+controller capability is created for that, and the presence for this
+capability will always be checked before accepting such pattern.
+
+Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
+Reviewed-by: Tudor Ambarus <tudor.ambarus@linaro.org>
+Link: https://patch.msgid.link/20241224-winbond-6-11-rc1-quad-support-v2-2-ad218dbc406f@bootlin.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/spi/spi-mem.c | 6 ++++++
+ include/linux/spi/spi-mem.h | 2 ++
+ 2 files changed, 8 insertions(+)
+
+diff --git a/drivers/spi/spi-mem.c b/drivers/spi/spi-mem.c
+index f8b598ba962d9..d0ae20d433d61 100644
+--- a/drivers/spi/spi-mem.c
++++ b/drivers/spi/spi-mem.c
+@@ -188,6 +188,12 @@ bool spi_mem_default_supports_op(struct spi_mem *mem,
+ op->max_freq < mem->spi->controller->min_speed_hz)
+ return false;
+
++ if (op->max_freq &&
++ op->max_freq < mem->spi->max_speed_hz) {
++ if (!spi_mem_controller_is_capable(ctlr, per_op_freq))
++ return false;
++ }
++
+ return spi_mem_check_buswidth(mem, op);
+ }
+ EXPORT_SYMBOL_GPL(spi_mem_default_supports_op);
+diff --git a/include/linux/spi/spi-mem.h b/include/linux/spi/spi-mem.h
+index 44b7ecee0e74c..0f00d74beb24c 100644
+--- a/include/linux/spi/spi-mem.h
++++ b/include/linux/spi/spi-mem.h
+@@ -306,10 +306,12 @@ struct spi_controller_mem_ops {
+ * struct spi_controller_mem_caps - SPI memory controller capabilities
+ * @dtr: Supports DTR operations
+ * @ecc: Supports operations with error correction
++ * @per_op_freq: Supports per operation frequency switching
+ */
+ struct spi_controller_mem_caps {
+ bool dtr;
+ bool ecc;
++ bool per_op_freq;
+ };
+
+ #define spi_mem_controller_is_capable(ctlr, cap) \
+--
+2.39.5
+