* [PATCH v3 0/9] spi: enable the SpacemiT K1 SoC QSPI
@ 2025-10-24 19:15 Alex Elder
2025-10-24 19:15 ` [PATCH v3 1/9] dt-bindings: spi: fsl-qspi: support SpacemiT K1 Alex Elder
` (6 more replies)
0 siblings, 7 replies; 11+ messages in thread
From: Alex Elder @ 2025-10-24 19:15 UTC (permalink / raw)
To: robh, krzk+dt, conor+dt, han.xu, broonie, dlan, pjw
Cc: Frank.li, p.zabel, guodong, palmer, aou, alex, apatel, joel,
geert+renesas, cyy, heylenay, conor.dooley, fustini, linux-spi,
devicetree, imx, spacemit, linux-riscv, linux-kernel
This series adds support for the SpacemiT K1 SoC QSPI. This IP is
generally compatible with the Freescale QSPI driver, requiring three
minor changes to enable it to be supported. The changes are:
- Adding support for optional resets
- Having the clock *not* be disabled when changing its rate
- Allowing the size of storage blocks written to flash chips
to be set to something different from the AHB buffer size
This version of the series addresses comments received in review of
version 2.
-Alex
This series is available here:
https://github.com/riscstar/linux/tree/outgoing/qspi-v3
Version 3 addresses comments recieved during review of v2:
- This version fully tested and confirmed to work on BPI-F3
- Added Acked-by from Conor on patches 1 and 2
- Added Reviewed-by from Frank on patches 1 and 6
- Moved the reset property conditional under allOf in the binding
- In patch 5, needs_clk_disable() is no longer inline
- Tweaked the description in patch 5
- Renamed a local variable to be "sfa_size" in patch 6
- Changed the subject line in patch 6
- The sfa_size field was not being assigned in spacemit_k1_data;
now it is set to SZ_1K
Here is version 2:
https://lore.kernel.org/lkml/20251023175922.528868-1-elder@riscstar.com/
Version 2 addresses comments recieved during review of v1:
- The "reset" property now only applies to spacemit,k1-qspi compatible.
- Patch 1 (previously patch 2) now points out that this is the first
non-Freescale device using the binding.
- Added Frank Li's Reviewed-by on patch 3.
- A quirk flag has been renamed to be QUADSPI_QUIRK_SKIP_CLK_DISABLE.
- The predicate for that quirk now returns bool type.
- All other similar predicates now return bool type; this is done in a
new patch (patch 4).
- If non-zero, new field fsl_qspi_devtype_data->sfa_size defines the
size of the serial flash regions, rather than ahb_buf_size.
- A continued line in the Kconfig is now aligned.
- Patch descriptions are wrapped at 75 columns.
Here is version 1:
https://lore.kernel.org/lkml/20251020165152.666221-1-elder@riscstar.com/
Alex Elder (9):
dt-bindings: spi: fsl-qspi: support SpacemiT K1
dt-bindings: spi: fsl-qspi: add optional resets
spi: fsl-qspi: add optional reset support
spi: fsl-qspi: switch predicates to bool
spi: fsl-qspi: add a clock disable quirk
spi: fsl-qspi: introduce sfa_size devtype data
spi: fsl-qspi: support the SpacemiT K1 SoC
riscv: dts: spacemit: enable K1 SoC QSPI on BPI-F3
riscv: defconfig: enable SPI_FSL_QUADSPI as a module
.../bindings/spi/fsl,spi-fsl-qspi.yaml | 15 ++++
.../boot/dts/spacemit/k1-bananapi-f3.dts | 6 ++
arch/riscv/boot/dts/spacemit/k1-pinctrl.dtsi | 21 +++++
arch/riscv/boot/dts/spacemit/k1.dtsi | 16 ++++
arch/riscv/configs/defconfig | 1 +
drivers/spi/Kconfig | 3 +-
drivers/spi/spi-fsl-qspi.c | 88 +++++++++++++------
7 files changed, 124 insertions(+), 26 deletions(-)
base-commit: 72fb0170ef1f45addf726319c52a0562b6913707
--
2.48.1
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v3 1/9] dt-bindings: spi: fsl-qspi: support SpacemiT K1
2025-10-24 19:15 [PATCH v3 0/9] spi: enable the SpacemiT K1 SoC QSPI Alex Elder
@ 2025-10-24 19:15 ` Alex Elder
2025-10-24 19:15 ` [PATCH v3 2/9] dt-bindings: spi: fsl-qspi: add optional resets Alex Elder
` (5 subsequent siblings)
6 siblings, 0 replies; 11+ messages in thread
From: Alex Elder @ 2025-10-24 19:15 UTC (permalink / raw)
To: robh, krzk+dt, conor+dt, han.xu, broonie
Cc: dlan, Frank.li, guodong, devicetree, linux-spi, imx, spacemit,
linux-riscv, linux-kernel, Conor Dooley, Frank Li
Add the SpacemiT K1 SoC QSPI IP to the list of supported hardware. This
is the first non-Freescale device represented here. It has a nearly
identidal register set, and this binding correctly describes the hardware.
Acked-by: Conor Dooley <conor.dooley@microchip.com>
Reviewed-by: Frank Li <Frank.Li@nxp.com>
Signed-off-by: Alex Elder <elder@riscstar.com>
---
v3: - Added Acked-by from Conor Dooley
- Added Reviewed-by from Frank Li
Documentation/devicetree/bindings/spi/fsl,spi-fsl-qspi.yaml | 1 +
1 file changed, 1 insertion(+)
diff --git a/Documentation/devicetree/bindings/spi/fsl,spi-fsl-qspi.yaml b/Documentation/devicetree/bindings/spi/fsl,spi-fsl-qspi.yaml
index f2dd20370dbb3..5e6aff1bc2ed3 100644
--- a/Documentation/devicetree/bindings/spi/fsl,spi-fsl-qspi.yaml
+++ b/Documentation/devicetree/bindings/spi/fsl,spi-fsl-qspi.yaml
@@ -22,6 +22,7 @@ properties:
- fsl,imx6ul-qspi
- fsl,ls1021a-qspi
- fsl,ls2080a-qspi
+ - spacemit,k1-qspi
- items:
- enum:
- fsl,ls1043a-qspi
--
2.48.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 2/9] dt-bindings: spi: fsl-qspi: add optional resets
2025-10-24 19:15 [PATCH v3 0/9] spi: enable the SpacemiT K1 SoC QSPI Alex Elder
2025-10-24 19:15 ` [PATCH v3 1/9] dt-bindings: spi: fsl-qspi: support SpacemiT K1 Alex Elder
@ 2025-10-24 19:15 ` Alex Elder
2025-10-24 21:23 ` Frank Li
2025-10-24 19:15 ` [PATCH v3 3/9] spi: fsl-qspi: add optional reset support Alex Elder
` (4 subsequent siblings)
6 siblings, 1 reply; 11+ messages in thread
From: Alex Elder @ 2025-10-24 19:15 UTC (permalink / raw)
To: robh, krzk+dt, conor+dt, han.xu, broonie
Cc: dlan, Frank.li, guodong, linux-spi, imx, devicetree, spacemit,
linux-riscv, linux-kernel, Conor Dooley
Allow two resets to be defined to support the SpacemiT K1 SoC QSPI IP.
Acked-by: Conor Dooley <conor.dooley@microchip.com>
Signed-off-by: Alex Elder <elder@riscstar.com>
---
v3: - The reset property conditional is now under allOf
.../devicetree/bindings/spi/fsl,spi-fsl-qspi.yaml | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/Documentation/devicetree/bindings/spi/fsl,spi-fsl-qspi.yaml b/Documentation/devicetree/bindings/spi/fsl,spi-fsl-qspi.yaml
index 5e6aff1bc2ed3..46e5db25fb107 100644
--- a/Documentation/devicetree/bindings/spi/fsl,spi-fsl-qspi.yaml
+++ b/Documentation/devicetree/bindings/spi/fsl,spi-fsl-qspi.yaml
@@ -11,6 +11,15 @@ maintainers:
allOf:
- $ref: spi-controller.yaml#
+ - if:
+ properties:
+ compatible:
+ not:
+ contains:
+ const: spacemit,k1-qspi
+ then:
+ properties:
+ resets: false
properties:
compatible:
@@ -55,6 +64,11 @@ properties:
- const: qspi_en
- const: qspi
+ resets:
+ items:
+ - description: SoC QSPI reset
+ - description: SoC QSPI bus reset
+
required:
- compatible
- reg
--
2.48.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 3/9] spi: fsl-qspi: add optional reset support
2025-10-24 19:15 [PATCH v3 0/9] spi: enable the SpacemiT K1 SoC QSPI Alex Elder
2025-10-24 19:15 ` [PATCH v3 1/9] dt-bindings: spi: fsl-qspi: support SpacemiT K1 Alex Elder
2025-10-24 19:15 ` [PATCH v3 2/9] dt-bindings: spi: fsl-qspi: add optional resets Alex Elder
@ 2025-10-24 19:15 ` Alex Elder
2025-10-24 19:15 ` [PATCH v3 4/9] spi: fsl-qspi: switch predicates to bool Alex Elder
` (3 subsequent siblings)
6 siblings, 0 replies; 11+ messages in thread
From: Alex Elder @ 2025-10-24 19:15 UTC (permalink / raw)
To: han.xu, broonie, p.zabel
Cc: dlan, Frank.li, guodong, linux-spi, imx, spacemit, linux-riscv,
linux-kernel, Frank.Li
Add support for one or more optional exclusive resets. These simply need
to be deasserted at probe time, and can remain that way for the life of the
device.
Reviewed-by: Frank Li <Frank.Li@nxp.com>
Signed-off-by: Alex Elder <elder@riscstar.com>
---
drivers/spi/spi-fsl-qspi.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/drivers/spi/spi-fsl-qspi.c b/drivers/spi/spi-fsl-qspi.c
index c887abb028d77..1e27647dd2a09 100644
--- a/drivers/spi/spi-fsl-qspi.c
+++ b/drivers/spi/spi-fsl-qspi.c
@@ -36,6 +36,7 @@
#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/pm_qos.h>
+#include <linux/reset.h>
#include <linux/sizes.h>
#include <linux/spi/spi.h>
@@ -267,6 +268,7 @@ struct fsl_qspi {
const struct fsl_qspi_devtype_data *devtype_data;
struct mutex lock;
struct completion c;
+ struct reset_control *resets;
struct clk *clk, *clk_en;
struct pm_qos_request pm_qos_req;
struct device *dev;
@@ -857,6 +859,8 @@ static void fsl_qspi_cleanup(void *data)
{
struct fsl_qspi *q = data;
+ reset_control_assert(q->resets);
+
fsl_qspi_clk_disable_unprep(q);
mutex_destroy(&q->lock);
@@ -902,6 +906,10 @@ static int fsl_qspi_probe(struct platform_device *pdev)
if (!q->ahb_addr)
return -ENOMEM;
+ q->resets = devm_reset_control_array_get_optional_exclusive(dev);
+ if (IS_ERR(q->resets))
+ return PTR_ERR(q->resets);
+
/* find the clocks */
q->clk_en = devm_clk_get(dev, "qspi_en");
if (IS_ERR(q->clk_en))
@@ -923,6 +931,10 @@ static int fsl_qspi_probe(struct platform_device *pdev)
if (ret)
return ret;
+ ret = reset_control_deassert(q->resets);
+ if (ret)
+ return ret;
+
/* find the irq */
ret = platform_get_irq(pdev, 0);
if (ret < 0)
--
2.48.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 4/9] spi: fsl-qspi: switch predicates to bool
2025-10-24 19:15 [PATCH v3 0/9] spi: enable the SpacemiT K1 SoC QSPI Alex Elder
` (2 preceding siblings ...)
2025-10-24 19:15 ` [PATCH v3 3/9] spi: fsl-qspi: add optional reset support Alex Elder
@ 2025-10-24 19:15 ` Alex Elder
2025-10-24 21:24 ` Frank Li
2025-10-24 19:15 ` [PATCH v3 5/9] spi: fsl-qspi: add a clock disable quirk Alex Elder
` (2 subsequent siblings)
6 siblings, 1 reply; 11+ messages in thread
From: Alex Elder @ 2025-10-24 19:15 UTC (permalink / raw)
To: han.xu, broonie
Cc: dlan, Frank.li, guodong, linux-spi, imx, spacemit, linux-riscv,
linux-kernel
Change all the needs_*() functions so they are no longer inline, and return
bool rather than int.
Signed-off-by: Alex Elder <elder@riscstar.com>
---
drivers/spi/spi-fsl-qspi.c | 22 +++++++++++-----------
1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/drivers/spi/spi-fsl-qspi.c b/drivers/spi/spi-fsl-qspi.c
index 1e27647dd2a09..1944e63169d36 100644
--- a/drivers/spi/spi-fsl-qspi.c
+++ b/drivers/spi/spi-fsl-qspi.c
@@ -276,34 +276,34 @@ struct fsl_qspi {
u32 memmap_phy;
};
-static inline int needs_swap_endian(struct fsl_qspi *q)
+static bool needs_swap_endian(struct fsl_qspi *q)
{
- return q->devtype_data->quirks & QUADSPI_QUIRK_SWAP_ENDIAN;
+ return !!(q->devtype_data->quirks & QUADSPI_QUIRK_SWAP_ENDIAN);
}
-static inline int needs_4x_clock(struct fsl_qspi *q)
+static bool needs_4x_clock(struct fsl_qspi *q)
{
- return q->devtype_data->quirks & QUADSPI_QUIRK_4X_INT_CLK;
+ return !!(q->devtype_data->quirks & QUADSPI_QUIRK_4X_INT_CLK);
}
-static inline int needs_fill_txfifo(struct fsl_qspi *q)
+static bool needs_fill_txfifo(struct fsl_qspi *q)
{
- return q->devtype_data->quirks & QUADSPI_QUIRK_TKT253890;
+ return !!(q->devtype_data->quirks & QUADSPI_QUIRK_TKT253890);
}
-static inline int needs_wakeup_wait_mode(struct fsl_qspi *q)
+static bool needs_wakeup_wait_mode(struct fsl_qspi *q)
{
- return q->devtype_data->quirks & QUADSPI_QUIRK_TKT245618;
+ return !!(q->devtype_data->quirks & QUADSPI_QUIRK_TKT245618);
}
-static inline int needs_amba_base_offset(struct fsl_qspi *q)
+static bool needs_amba_base_offset(struct fsl_qspi *q)
{
return !(q->devtype_data->quirks & QUADSPI_QUIRK_BASE_INTERNAL);
}
-static inline int needs_tdh_setting(struct fsl_qspi *q)
+static bool needs_tdh_setting(struct fsl_qspi *q)
{
- return q->devtype_data->quirks & QUADSPI_QUIRK_USE_TDH_SETTING;
+ return !!(q->devtype_data->quirks & QUADSPI_QUIRK_USE_TDH_SETTING);
}
/*
--
2.48.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 5/9] spi: fsl-qspi: add a clock disable quirk
2025-10-24 19:15 [PATCH v3 0/9] spi: enable the SpacemiT K1 SoC QSPI Alex Elder
` (3 preceding siblings ...)
2025-10-24 19:15 ` [PATCH v3 4/9] spi: fsl-qspi: switch predicates to bool Alex Elder
@ 2025-10-24 19:15 ` Alex Elder
2025-10-24 21:25 ` Frank Li
2025-10-24 19:15 ` [PATCH v3 6/9] spi: fsl-qspi: introduce sfa_size devtype data Alex Elder
2025-10-24 19:15 ` [PATCH v3 7/9] spi: fsl-qspi: support the SpacemiT K1 SoC Alex Elder
6 siblings, 1 reply; 11+ messages in thread
From: Alex Elder @ 2025-10-24 19:15 UTC (permalink / raw)
To: han.xu, broonie
Cc: dlan, Frank.li, guodong, linux-spi, imx, spacemit, linux-riscv,
linux-kernel
The SpacemiT K1 SoC QSPI implementation needs to avoid shutting off the
clock when changing its rate. Add a new quirk to indicate that disabling
and enabling the clock should be skipped when changing its rate.
Signed-off-by: Alex Elder <elder@riscstar.com>
---
v3: - needs_clk_disable() is no longer inline
drivers/spi/spi-fsl-qspi.c | 21 +++++++++++++++++----
1 file changed, 17 insertions(+), 4 deletions(-)
diff --git a/drivers/spi/spi-fsl-qspi.c b/drivers/spi/spi-fsl-qspi.c
index 1944e63169d36..2c030dd6facc7 100644
--- a/drivers/spi/spi-fsl-qspi.c
+++ b/drivers/spi/spi-fsl-qspi.c
@@ -197,6 +197,11 @@
*/
#define QUADSPI_QUIRK_USE_TDH_SETTING BIT(5)
+/*
+ * Do not disable the "qspi" clock when changing its rate.
+ */
+#define QUADSPI_QUIRK_SKIP_CLK_DISABLE BIT(6)
+
struct fsl_qspi_devtype_data {
unsigned int rxfifo;
unsigned int txfifo;
@@ -306,6 +311,11 @@ static bool needs_tdh_setting(struct fsl_qspi *q)
return !!(q->devtype_data->quirks & QUADSPI_QUIRK_USE_TDH_SETTING);
}
+static bool needs_clk_disable(struct fsl_qspi *q)
+{
+ return !(q->devtype_data->quirks & QUADSPI_QUIRK_SKIP_CLK_DISABLE);
+}
+
/*
* An IC bug makes it necessary to rearrange the 32-bit data.
* Later chips, such as IMX6SLX, have fixed this bug.
@@ -536,15 +546,18 @@ static void fsl_qspi_select_mem(struct fsl_qspi *q, struct spi_device *spi,
if (needs_4x_clock(q))
rate *= 4;
- fsl_qspi_clk_disable_unprep(q);
+ if (needs_clk_disable(q))
+ fsl_qspi_clk_disable_unprep(q);
ret = clk_set_rate(q->clk, rate);
if (ret)
return;
- ret = fsl_qspi_clk_prep_enable(q);
- if (ret)
- return;
+ if (needs_clk_disable(q)) {
+ ret = fsl_qspi_clk_prep_enable(q);
+ if (ret)
+ return;
+ }
q->selected = spi_get_chipselect(spi, 0);
--
2.48.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 6/9] spi: fsl-qspi: introduce sfa_size devtype data
2025-10-24 19:15 [PATCH v3 0/9] spi: enable the SpacemiT K1 SoC QSPI Alex Elder
` (4 preceding siblings ...)
2025-10-24 19:15 ` [PATCH v3 5/9] spi: fsl-qspi: add a clock disable quirk Alex Elder
@ 2025-10-24 19:15 ` Alex Elder
2025-10-24 19:15 ` [PATCH v3 7/9] spi: fsl-qspi: support the SpacemiT K1 SoC Alex Elder
6 siblings, 0 replies; 11+ messages in thread
From: Alex Elder @ 2025-10-24 19:15 UTC (permalink / raw)
To: han.xu, broonie
Cc: dlan, Frank.li, guodong, linux-spi, imx, spacemit, linux-riscv,
linux-kernel, Frank Li
In fsl_qspi_default_setup(), four registers define the size of blocks of
data to written to each of four chips that comprise SPI NOR flash storage.
They are currently defined to be the same as the AHB buffer size.
The SpacemiT QSPI has an AHB buffer size of 512 bytes, but requires these
four sizes to be multiples of 1024 bytes.
Define a new field sfa_size in the fsl_qspi_devtype_data structure that, if
non-zero, will be used instead of the AHB buffer size to define the size of
these chip regions.
Reviewed-by: Frank Li <Frank.Li@nxp.com>
Signed-off-by: Alex Elder <elder@riscstar.com>
---
v3: - The variable used in fsl_qspi_default_setup() is now "sfa_size"
- Changed the subject line
drivers/spi/spi-fsl-qspi.c | 22 ++++++++++++----------
1 file changed, 12 insertions(+), 10 deletions(-)
diff --git a/drivers/spi/spi-fsl-qspi.c b/drivers/spi/spi-fsl-qspi.c
index 2c030dd6facc7..46a3187b33548 100644
--- a/drivers/spi/spi-fsl-qspi.c
+++ b/drivers/spi/spi-fsl-qspi.c
@@ -207,6 +207,7 @@ struct fsl_qspi_devtype_data {
unsigned int txfifo;
int invalid_mstrid;
unsigned int ahb_buf_size;
+ unsigned int sfa_size;
unsigned int quirks;
bool little_endian;
};
@@ -737,6 +738,7 @@ static int fsl_qspi_default_setup(struct fsl_qspi *q)
{
void __iomem *base = q->iobase;
u32 reg, addr_offset = 0;
+ u32 sfa_size;
int ret;
/* disable and unprepare clock to avoid glitch pass to controller */
@@ -795,17 +797,17 @@ static int fsl_qspi_default_setup(struct fsl_qspi *q)
* In HW there can be a maximum of four chips on two buses with
* two chip selects on each bus. We use four chip selects in SW
* to differentiate between the four chips.
- * We use ahb_buf_size for each chip and set SFA1AD, SFA2AD, SFB1AD,
- * SFB2AD accordingly.
+ *
+ * By default we write the AHB buffer size to each chip, but
+ * a different size can be specified with devtype_data->sfa_size.
+ * The SFA1AD, SFA2AD, SFB1AD, and SFB2AD registers define the
+ * top (end) of these four regions.
*/
- qspi_writel(q, q->devtype_data->ahb_buf_size + addr_offset,
- base + QUADSPI_SFA1AD);
- qspi_writel(q, q->devtype_data->ahb_buf_size * 2 + addr_offset,
- base + QUADSPI_SFA2AD);
- qspi_writel(q, q->devtype_data->ahb_buf_size * 3 + addr_offset,
- base + QUADSPI_SFB1AD);
- qspi_writel(q, q->devtype_data->ahb_buf_size * 4 + addr_offset,
- base + QUADSPI_SFB2AD);
+ sfa_size = q->devtype_data->sfa_size ? : q->devtype_data->ahb_buf_size;
+ qspi_writel(q, addr_offset + 1 * sfa_size, base + QUADSPI_SFA1AD);
+ qspi_writel(q, addr_offset + 2 * sfa_size, base + QUADSPI_SFA2AD);
+ qspi_writel(q, addr_offset + 3 * sfa_size, base + QUADSPI_SFB1AD);
+ qspi_writel(q, addr_offset + 4 * sfa_size, base + QUADSPI_SFB2AD);
q->selected = -1;
--
2.48.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 7/9] spi: fsl-qspi: support the SpacemiT K1 SoC
2025-10-24 19:15 [PATCH v3 0/9] spi: enable the SpacemiT K1 SoC QSPI Alex Elder
` (5 preceding siblings ...)
2025-10-24 19:15 ` [PATCH v3 6/9] spi: fsl-qspi: introduce sfa_size devtype data Alex Elder
@ 2025-10-24 19:15 ` Alex Elder
6 siblings, 0 replies; 11+ messages in thread
From: Alex Elder @ 2025-10-24 19:15 UTC (permalink / raw)
To: broonie, han.xu
Cc: dlan, Frank.li, guodong, linux-spi, imx, spacemit, linux-riscv,
linux-kernel
Allow the SPI_FSL_QUADSPI Kconfig option to be selected if ARCH_SPACEMIT
enabled.
Add support for the SpacemiT K1 SoC in the Freescale QSPI driver by
defining the device type data for its QSPI implementation.
Signed-off-by: Alex Elder <elder@riscstar.com>
---
v3: The sfa_size field in spacemit_k1_data is now assigned to be SZ_1K
drivers/spi/Kconfig | 3 ++-
drivers/spi/spi-fsl-qspi.c | 11 +++++++++++
2 files changed, 13 insertions(+), 1 deletion(-)
diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig
index 4d8f00c850c14..592d46c9998bb 100644
--- a/drivers/spi/Kconfig
+++ b/drivers/spi/Kconfig
@@ -435,7 +435,8 @@ config SPI_FSL_LPSPI
config SPI_FSL_QUADSPI
tristate "Freescale QSPI controller"
- depends on ARCH_MXC || SOC_LS1021A || ARCH_LAYERSCAPE || COMPILE_TEST
+ depends on ARCH_MXC || SOC_LS1021A || ARCH_LAYERSCAPE || \
+ ARCH_SPACEMIT || COMPILE_TEST
depends on HAS_IOMEM
help
This enables support for the Quad SPI controller in master mode.
diff --git a/drivers/spi/spi-fsl-qspi.c b/drivers/spi/spi-fsl-qspi.c
index 46a3187b33548..a223b4bc6e637 100644
--- a/drivers/spi/spi-fsl-qspi.c
+++ b/drivers/spi/spi-fsl-qspi.c
@@ -268,6 +268,16 @@ static const struct fsl_qspi_devtype_data ls2080a_data = {
.little_endian = true,
};
+static const struct fsl_qspi_devtype_data spacemit_k1_data = {
+ .rxfifo = SZ_128,
+ .txfifo = SZ_256,
+ .ahb_buf_size = SZ_512,
+ .sfa_size = SZ_1K,
+ .invalid_mstrid = QUADSPI_BUFXCR_INVALID_MSTRID,
+ .quirks = QUADSPI_QUIRK_TKT253890 | QUADSPI_QUIRK_SKIP_CLK_DISABLE,
+ .little_endian = true,
+};
+
struct fsl_qspi {
void __iomem *iobase;
void __iomem *ahb_addr;
@@ -1003,6 +1013,7 @@ static const struct of_device_id fsl_qspi_dt_ids[] = {
{ .compatible = "fsl,imx6ul-qspi", .data = &imx6ul_data, },
{ .compatible = "fsl,ls1021a-qspi", .data = &ls1021a_data, },
{ .compatible = "fsl,ls2080a-qspi", .data = &ls2080a_data, },
+ { .compatible = "spacemit,k1-qspi", .data = &spacemit_k1_data, },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, fsl_qspi_dt_ids);
--
2.48.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH v3 2/9] dt-bindings: spi: fsl-qspi: add optional resets
2025-10-24 19:15 ` [PATCH v3 2/9] dt-bindings: spi: fsl-qspi: add optional resets Alex Elder
@ 2025-10-24 21:23 ` Frank Li
0 siblings, 0 replies; 11+ messages in thread
From: Frank Li @ 2025-10-24 21:23 UTC (permalink / raw)
To: Alex Elder
Cc: robh, krzk+dt, conor+dt, han.xu, broonie, dlan, guodong,
linux-spi, imx, devicetree, spacemit, linux-riscv, linux-kernel,
Conor Dooley
On Fri, Oct 24, 2025 at 02:15:42PM -0500, Alex Elder wrote:
> Allow two resets to be defined to support the SpacemiT K1 SoC QSPI IP.
>
> Acked-by: Conor Dooley <conor.dooley@microchip.com>
> Signed-off-by: Alex Elder <elder@riscstar.com>
> ---
> v3: - The reset property conditional is now under allOf
>
> .../devicetree/bindings/spi/fsl,spi-fsl-qspi.yaml | 14 ++++++++++++++
> 1 file changed, 14 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/spi/fsl,spi-fsl-qspi.yaml b/Documentation/devicetree/bindings/spi/fsl,spi-fsl-qspi.yaml
> index 5e6aff1bc2ed3..46e5db25fb107 100644
> --- a/Documentation/devicetree/bindings/spi/fsl,spi-fsl-qspi.yaml
> +++ b/Documentation/devicetree/bindings/spi/fsl,spi-fsl-qspi.yaml
> @@ -11,6 +11,15 @@ maintainers:
>
> allOf:
> - $ref: spi-controller.yaml#
> + - if:
> + properties:
> + compatible:
> + not:
> + contains:
> + const: spacemit,k1-qspi
> + then:
> + properties:
> + resets: false
I am fine here now. If have next version, move it after required. More
if-else may be added in future.
Reviewed-by: Frank Li <Frank.Li@nxp.com>
>
> properties:
> compatible:
> @@ -55,6 +64,11 @@ properties:
> - const: qspi_en
> - const: qspi
>
> + resets:
> + items:
> + - description: SoC QSPI reset
> + - description: SoC QSPI bus reset
> +
> required:
> - compatible
> - reg
> --
> 2.48.1
>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v3 4/9] spi: fsl-qspi: switch predicates to bool
2025-10-24 19:15 ` [PATCH v3 4/9] spi: fsl-qspi: switch predicates to bool Alex Elder
@ 2025-10-24 21:24 ` Frank Li
0 siblings, 0 replies; 11+ messages in thread
From: Frank Li @ 2025-10-24 21:24 UTC (permalink / raw)
To: Alex Elder
Cc: han.xu, broonie, dlan, guodong, linux-spi, imx, spacemit,
linux-riscv, linux-kernel
On Fri, Oct 24, 2025 at 02:15:44PM -0500, Alex Elder wrote:
> Change all the needs_*() functions so they are no longer inline, and return
> bool rather than int.
>
> Signed-off-by: Alex Elder <elder@riscstar.com>
> ---
Reviewed-by: Frank Li <Frank.Li@nxp.com>
> drivers/spi/spi-fsl-qspi.c | 22 +++++++++++-----------
> 1 file changed, 11 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/spi/spi-fsl-qspi.c b/drivers/spi/spi-fsl-qspi.c
> index 1e27647dd2a09..1944e63169d36 100644
> --- a/drivers/spi/spi-fsl-qspi.c
> +++ b/drivers/spi/spi-fsl-qspi.c
> @@ -276,34 +276,34 @@ struct fsl_qspi {
> u32 memmap_phy;
> };
>
> -static inline int needs_swap_endian(struct fsl_qspi *q)
> +static bool needs_swap_endian(struct fsl_qspi *q)
> {
> - return q->devtype_data->quirks & QUADSPI_QUIRK_SWAP_ENDIAN;
> + return !!(q->devtype_data->quirks & QUADSPI_QUIRK_SWAP_ENDIAN);
> }
>
> -static inline int needs_4x_clock(struct fsl_qspi *q)
> +static bool needs_4x_clock(struct fsl_qspi *q)
> {
> - return q->devtype_data->quirks & QUADSPI_QUIRK_4X_INT_CLK;
> + return !!(q->devtype_data->quirks & QUADSPI_QUIRK_4X_INT_CLK);
> }
>
> -static inline int needs_fill_txfifo(struct fsl_qspi *q)
> +static bool needs_fill_txfifo(struct fsl_qspi *q)
> {
> - return q->devtype_data->quirks & QUADSPI_QUIRK_TKT253890;
> + return !!(q->devtype_data->quirks & QUADSPI_QUIRK_TKT253890);
> }
>
> -static inline int needs_wakeup_wait_mode(struct fsl_qspi *q)
> +static bool needs_wakeup_wait_mode(struct fsl_qspi *q)
> {
> - return q->devtype_data->quirks & QUADSPI_QUIRK_TKT245618;
> + return !!(q->devtype_data->quirks & QUADSPI_QUIRK_TKT245618);
> }
>
> -static inline int needs_amba_base_offset(struct fsl_qspi *q)
> +static bool needs_amba_base_offset(struct fsl_qspi *q)
> {
> return !(q->devtype_data->quirks & QUADSPI_QUIRK_BASE_INTERNAL);
> }
>
> -static inline int needs_tdh_setting(struct fsl_qspi *q)
> +static bool needs_tdh_setting(struct fsl_qspi *q)
> {
> - return q->devtype_data->quirks & QUADSPI_QUIRK_USE_TDH_SETTING;
> + return !!(q->devtype_data->quirks & QUADSPI_QUIRK_USE_TDH_SETTING);
> }
>
> /*
> --
> 2.48.1
>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v3 5/9] spi: fsl-qspi: add a clock disable quirk
2025-10-24 19:15 ` [PATCH v3 5/9] spi: fsl-qspi: add a clock disable quirk Alex Elder
@ 2025-10-24 21:25 ` Frank Li
0 siblings, 0 replies; 11+ messages in thread
From: Frank Li @ 2025-10-24 21:25 UTC (permalink / raw)
To: Alex Elder
Cc: han.xu, broonie, dlan, guodong, linux-spi, imx, spacemit,
linux-riscv, linux-kernel
On Fri, Oct 24, 2025 at 02:15:45PM -0500, Alex Elder wrote:
> The SpacemiT K1 SoC QSPI implementation needs to avoid shutting off the
> clock when changing its rate. Add a new quirk to indicate that disabling
> and enabling the clock should be skipped when changing its rate.
>
> Signed-off-by: Alex Elder <elder@riscstar.com>
> ---
Reviewed-by: Frank Li <Frank.Li@nxp.com>
> v3: - needs_clk_disable() is no longer inline
>
> drivers/spi/spi-fsl-qspi.c | 21 +++++++++++++++++----
> 1 file changed, 17 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/spi/spi-fsl-qspi.c b/drivers/spi/spi-fsl-qspi.c
> index 1944e63169d36..2c030dd6facc7 100644
> --- a/drivers/spi/spi-fsl-qspi.c
> +++ b/drivers/spi/spi-fsl-qspi.c
> @@ -197,6 +197,11 @@
> */
> #define QUADSPI_QUIRK_USE_TDH_SETTING BIT(5)
>
> +/*
> + * Do not disable the "qspi" clock when changing its rate.
> + */
> +#define QUADSPI_QUIRK_SKIP_CLK_DISABLE BIT(6)
> +
> struct fsl_qspi_devtype_data {
> unsigned int rxfifo;
> unsigned int txfifo;
> @@ -306,6 +311,11 @@ static bool needs_tdh_setting(struct fsl_qspi *q)
> return !!(q->devtype_data->quirks & QUADSPI_QUIRK_USE_TDH_SETTING);
> }
>
> +static bool needs_clk_disable(struct fsl_qspi *q)
> +{
> + return !(q->devtype_data->quirks & QUADSPI_QUIRK_SKIP_CLK_DISABLE);
> +}
> +
> /*
> * An IC bug makes it necessary to rearrange the 32-bit data.
> * Later chips, such as IMX6SLX, have fixed this bug.
> @@ -536,15 +546,18 @@ static void fsl_qspi_select_mem(struct fsl_qspi *q, struct spi_device *spi,
> if (needs_4x_clock(q))
> rate *= 4;
>
> - fsl_qspi_clk_disable_unprep(q);
> + if (needs_clk_disable(q))
> + fsl_qspi_clk_disable_unprep(q);
>
> ret = clk_set_rate(q->clk, rate);
> if (ret)
> return;
>
> - ret = fsl_qspi_clk_prep_enable(q);
> - if (ret)
> - return;
> + if (needs_clk_disable(q)) {
> + ret = fsl_qspi_clk_prep_enable(q);
> + if (ret)
> + return;
> + }
>
> q->selected = spi_get_chipselect(spi, 0);
>
> --
> 2.48.1
>
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2025-10-24 21:25 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-10-24 19:15 [PATCH v3 0/9] spi: enable the SpacemiT K1 SoC QSPI Alex Elder
2025-10-24 19:15 ` [PATCH v3 1/9] dt-bindings: spi: fsl-qspi: support SpacemiT K1 Alex Elder
2025-10-24 19:15 ` [PATCH v3 2/9] dt-bindings: spi: fsl-qspi: add optional resets Alex Elder
2025-10-24 21:23 ` Frank Li
2025-10-24 19:15 ` [PATCH v3 3/9] spi: fsl-qspi: add optional reset support Alex Elder
2025-10-24 19:15 ` [PATCH v3 4/9] spi: fsl-qspi: switch predicates to bool Alex Elder
2025-10-24 21:24 ` Frank Li
2025-10-24 19:15 ` [PATCH v3 5/9] spi: fsl-qspi: add a clock disable quirk Alex Elder
2025-10-24 21:25 ` Frank Li
2025-10-24 19:15 ` [PATCH v3 6/9] spi: fsl-qspi: introduce sfa_size devtype data Alex Elder
2025-10-24 19:15 ` [PATCH v3 7/9] spi: fsl-qspi: support the SpacemiT K1 SoC Alex Elder
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).