* [PATCH v2 0/6] spi: cadence-xspi: Fixes and ACPI changes
@ 2026-11-11 10:35 Paul Cercueil
2026-11-11 10:35 ` [PATCH v2 1/6] spi: cadence-xspi: Properly handle errors in .transfer_one_message Paul Cercueil
` (5 more replies)
0 siblings, 6 replies; 7+ messages in thread
From: Paul Cercueil @ 2026-11-11 10:35 UTC (permalink / raw)
To: Mark Brown
Cc: linux-spi, linux-kernel, Thomas Petazzoni, Bharat Bhushan,
Sunil Kovvuri Goutham, Tanmay Jagdale, Jisheng Zhang,
Paul Cercueil
Hi Mark,
This is the v2 of my patchset that adds a few fixes to the cadence-xspi
driver, some cleanups, as well as a workaround for probing the Marvell
IP on firmwares that use the base string.
The workaround has been reworked to check the board's compatible string
on DTB and the DSDT table on ACPI.
I am not dismissing Jisheng Zhang's feedback, I had the new workaround
patch ready and thought I'd send it along - with the understanding that
if it's really a deal breaker then you'd skip this one and merge the
rest.
Changes:
- [1/6] is a new patch to fix the error reporting in
.transfer_one_message that you reported on the v1.
- [2/6] was adapted slightly to work on top of [1/6].
- [5/6] drops the error messages as devm_ioremap_resource() already
prints errors.
- [6/6] Replace the workaround based on the presence of the "xfer"
resource with one that identifies a Marvell SoC based on the
board's compatible string on DTB, and the DSDT table on ACPI.
Cheers,
-Paul
Tanmay Jagdale (6):
spi: cadence-xspi: Properly handle errors in .transfer_one_message
spi: cadence-xspi: Reconfigure to STIG mode before SPI message
spi: cadence-xspi: Inform SPI core about size transferred
spi: cadence-xspi: Drop useless cdns_xspi->cur_cs
spi: cadence-xspi: Rework resource discovery
spi: cadence-xspi: Add workaround for old Marvell firmwares
drivers/spi/spi-cadence-xspi.c | 157 ++++++++++++++++++++++-----------
1 file changed, 104 insertions(+), 53 deletions(-)
--
2.47.3
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2 1/6] spi: cadence-xspi: Properly handle errors in .transfer_one_message
2026-11-11 10:35 [PATCH v2 0/6] spi: cadence-xspi: Fixes and ACPI changes Paul Cercueil
@ 2026-11-11 10:35 ` Paul Cercueil
2026-11-11 10:35 ` [PATCH v2 2/6] spi: cadence-xspi: Reconfigure to STIG mode before SPI message Paul Cercueil
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Paul Cercueil @ 2026-11-11 10:35 UTC (permalink / raw)
To: Mark Brown
Cc: linux-spi, linux-kernel, Thomas Petazzoni, Bharat Bhushan,
Sunil Kovvuri Goutham, Tanmay Jagdale, Jisheng Zhang,
Paul Cercueil
From: Tanmay Jagdale <tanmay@marvell.com>
The cdns_xspi_transfer_one_message_b0() function was not setting
m->status on error, causing it to be stuck at -EINPROGRESS, confusing
the SPI core.
Fixes: 931e389ded0f ("spi: cadence: Add Marvell xfer operation support")
Signed-off-by: Tanmay Jagdale <tanmay@marvell.com>
Co-developed-by: Paul Cercueil <paul.cercueil@bootlin.com>
Signed-off-by: Paul Cercueil <paul.cercueil@bootlin.com>
---
v2: New patch
---
drivers/spi/spi-cadence-xspi.c | 18 ++++++++++++------
1 file changed, 12 insertions(+), 6 deletions(-)
diff --git a/drivers/spi/spi-cadence-xspi.c b/drivers/spi/spi-cadence-xspi.c
index 3687853e4ce4..a584a3c395d0 100644
--- a/drivers/spi/spi-cadence-xspi.c
+++ b/drivers/spi/spi-cadence-xspi.c
@@ -1112,6 +1112,7 @@ static int cdns_xspi_transfer_one_message_b0(struct spi_controller *controller,
int current_transfer_len;
int cs = spi_get_chipselect(spi, 0);
int cs_change = 0;
+ int ret = -EIO;
/* Enable xfer state machine */
if (!cdns_xspi->xfer_in_progress) {
@@ -1152,7 +1153,7 @@ static int cdns_xspi_transfer_one_message_b0(struct spi_controller *controller,
false, cmd_regs);
cdns_xspi_trigger_command(cdns_xspi, cmd_regs);
if (!cdns_xspi_is_stig_ready(cdns_xspi, true))
- return -EIO;
+ goto out;
} else {
cdns_xspi_prepare_generic(cs, txd, 1, true, cmd_regs);
cdns_xspi_trigger_command(cdns_xspi, cmd_regs);
@@ -1161,11 +1162,11 @@ static int cdns_xspi_transfer_one_message_b0(struct spi_controller *controller,
cdns_xspi_trigger_command(cdns_xspi, cmd_regs);
cdns_xspi->sdma_xfer_len = current_transfer_len - 1;
if (!cdns_xspi_is_sdma_ready(cdns_xspi, true))
- return -EIO;
+ goto out;
if (cdns_xspi->sdma_handler(cdns_xspi))
- return -EIO;
+ goto out;
if (!cdns_xspi_is_stig_ready(cdns_xspi, true))
- return -EIO;
+ goto out;
if (rxd)
cdns_xspi->in_buffer += current_transfer_len;
@@ -1202,10 +1203,15 @@ static int cdns_xspi_transfer_one_message_b0(struct spi_controller *controller,
cdns_xspi->xfer_in_progress = false;
}
- m->status = 0;
+ ret = 0;
+
+out:
+ if (m->status == -EINPROGRESS)
+ m->status = ret;
+
spi_finalize_current_message(controller);
- return 0;
+ return ret;
}
#endif
--
2.47.3
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2 2/6] spi: cadence-xspi: Reconfigure to STIG mode before SPI message
2026-11-11 10:35 [PATCH v2 0/6] spi: cadence-xspi: Fixes and ACPI changes Paul Cercueil
2026-11-11 10:35 ` [PATCH v2 1/6] spi: cadence-xspi: Properly handle errors in .transfer_one_message Paul Cercueil
@ 2026-11-11 10:35 ` Paul Cercueil
2026-11-11 10:35 ` [PATCH v2 3/6] spi: cadence-xspi: Inform SPI core about size transferred Paul Cercueil
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Paul Cercueil @ 2026-11-11 10:35 UTC (permalink / raw)
To: Mark Brown
Cc: linux-spi, linux-kernel, Thomas Petazzoni, Bharat Bhushan,
Sunil Kovvuri Goutham, Tanmay Jagdale, Jisheng Zhang,
Paul Cercueil
From: Tanmay Jagdale <tanmay@marvell.com>
The .transfer_one_message() function uses the STIG mode, therefore the
xSPI needs to be configured to STIG mode before starting any transfer.
Without this, .transfer_one_message() simply won't work, at least on the
CN10K SoC.
Fixes: 931e389ded0f ("spi: cadence: Add Marvell xfer operation support")
Signed-off-by: Tanmay Jagdale <tanmay@marvell.com>
Co-developed-by: Paul Cercueil <paul.cercueil@bootlin.com>
Signed-off-by: Paul Cercueil <paul.cercueil@bootlin.com>
---
v2: Adapt the code slightly to work on top of [1/6]
---
drivers/spi/spi-cadence-xspi.c | 31 ++++++++++++++++++++++++-------
1 file changed, 24 insertions(+), 7 deletions(-)
diff --git a/drivers/spi/spi-cadence-xspi.c b/drivers/spi/spi-cadence-xspi.c
index a584a3c395d0..87b986a318f3 100644
--- a/drivers/spi/spi-cadence-xspi.c
+++ b/drivers/spi/spi-cadence-xspi.c
@@ -367,6 +367,20 @@ static int cdns_xspi_wait_for_controller_idle(struct cdns_xspi_dev *cdns_xspi)
100, 1000);
}
+static int cdns_xspi_set_stig_mode(struct cdns_xspi_dev *cdns_xspi)
+{
+ int ret;
+
+ ret = cdns_xspi_wait_for_controller_idle(cdns_xspi);
+ if (ret < 0)
+ return -EIO;
+
+ writel(FIELD_PREP(CDNS_XSPI_CTRL_WORK_MODE, CDNS_XSPI_WORK_MODE_STIG),
+ cdns_xspi->iobase + CDNS_XSPI_CTRL_CONFIG_REG);
+
+ return 0;
+}
+
static void cdns_xspi_trigger_command(struct cdns_xspi_dev *cdns_xspi,
u32 cmd_regs[6])
{
@@ -536,12 +550,9 @@ static int cdns_xspi_send_stig_command(struct cdns_xspi_dev *cdns_xspi,
int ret;
int dummybytes = op->dummy.nbytes;
- ret = cdns_xspi_wait_for_controller_idle(cdns_xspi);
- if (ret < 0)
- return -EIO;
-
- writel(FIELD_PREP(CDNS_XSPI_CTRL_WORK_MODE, CDNS_XSPI_WORK_MODE_STIG),
- cdns_xspi->iobase + CDNS_XSPI_CTRL_CONFIG_REG);
+ ret = cdns_xspi_set_stig_mode(cdns_xspi);
+ if (ret)
+ return ret;
cdns_xspi->set_interrupts_handler(cdns_xspi, true);
cdns_xspi->sdma_error = false;
@@ -1112,7 +1123,13 @@ static int cdns_xspi_transfer_one_message_b0(struct spi_controller *controller,
int current_transfer_len;
int cs = spi_get_chipselect(spi, 0);
int cs_change = 0;
- int ret = -EIO;
+ int ret;
+
+ ret = cdns_xspi_set_stig_mode(cdns_xspi);
+ if (ret)
+ goto out;
+
+ ret = -EIO;
/* Enable xfer state machine */
if (!cdns_xspi->xfer_in_progress) {
--
2.47.3
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2 3/6] spi: cadence-xspi: Inform SPI core about size transferred
2026-11-11 10:35 [PATCH v2 0/6] spi: cadence-xspi: Fixes and ACPI changes Paul Cercueil
2026-11-11 10:35 ` [PATCH v2 1/6] spi: cadence-xspi: Properly handle errors in .transfer_one_message Paul Cercueil
2026-11-11 10:35 ` [PATCH v2 2/6] spi: cadence-xspi: Reconfigure to STIG mode before SPI message Paul Cercueil
@ 2026-11-11 10:35 ` Paul Cercueil
2026-11-11 10:35 ` [PATCH v2 4/6] spi: cadence-xspi: Drop useless cdns_xspi->cur_cs Paul Cercueil
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Paul Cercueil @ 2026-11-11 10:35 UTC (permalink / raw)
To: Mark Brown
Cc: linux-spi, linux-kernel, Thomas Petazzoni, Bharat Bhushan,
Sunil Kovvuri Goutham, Tanmay Jagdale, Jisheng Zhang,
Paul Cercueil
From: Tanmay Jagdale <tanmay@marvell.com>
The SPI core expects the 'actual_length' field of the spi_message to be
updated with the number of bytes transferred.
Fixes: 931e389ded0f ("spi: cadence: Add Marvell xfer operation support")
Signed-off-by: Tanmay Jagdale <tanmay@marvell.com>
Co-developed-by: Paul Cercueil <paul.cercueil@bootlin.com>
Signed-off-by: Paul Cercueil <paul.cercueil@bootlin.com>
---
v2: No change
---
drivers/spi/spi-cadence-xspi.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/spi/spi-cadence-xspi.c b/drivers/spi/spi-cadence-xspi.c
index 87b986a318f3..189f87321777 100644
--- a/drivers/spi/spi-cadence-xspi.c
+++ b/drivers/spi/spi-cadence-xspi.c
@@ -1207,6 +1207,7 @@ static int cdns_xspi_transfer_one_message_b0(struct spi_controller *controller,
}
cs_change = t->cs_change;
t->len -= current_transfer_len;
+ m->actual_length += current_transfer_len;
}
spi_transfer_delay_exec(t);
}
--
2.47.3
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2 4/6] spi: cadence-xspi: Drop useless cdns_xspi->cur_cs
2026-11-11 10:35 [PATCH v2 0/6] spi: cadence-xspi: Fixes and ACPI changes Paul Cercueil
` (2 preceding siblings ...)
2026-11-11 10:35 ` [PATCH v2 3/6] spi: cadence-xspi: Inform SPI core about size transferred Paul Cercueil
@ 2026-11-11 10:35 ` Paul Cercueil
2026-11-11 10:35 ` [PATCH v2 5/6] spi: cadence-xspi: Rework resource discovery Paul Cercueil
2026-11-11 10:35 ` [PATCH v2 6/6] spi: cadence-xspi: Add workaround for old Marvell firmwares Paul Cercueil
5 siblings, 0 replies; 7+ messages in thread
From: Paul Cercueil @ 2026-11-11 10:35 UTC (permalink / raw)
To: Mark Brown
Cc: linux-spi, linux-kernel, Thomas Petazzoni, Bharat Bhushan,
Sunil Kovvuri Goutham, Tanmay Jagdale, Jisheng Zhang,
Paul Cercueil
From: Tanmay Jagdale <tanmay@marvell.com>
Make the code simpler by just passing down a 'cs' variable as argument
to the cdns_xspi_send_stig_command() function.
Signed-off-by: Tanmay Jagdale <tanmay@marvell.com>
Co-developed-by: Paul Cercueil <paul.cercueil@bootlin.com>
Signed-off-by: Paul Cercueil <paul.cercueil@bootlin.com>
---
v2: No change
---
drivers/spi/spi-cadence-xspi.c | 16 +++++-----------
1 file changed, 5 insertions(+), 11 deletions(-)
diff --git a/drivers/spi/spi-cadence-xspi.c b/drivers/spi/spi-cadence-xspi.c
index 189f87321777..f4ce4820b08f 100644
--- a/drivers/spi/spi-cadence-xspi.c
+++ b/drivers/spi/spi-cadence-xspi.c
@@ -331,7 +331,6 @@ struct cdns_xspi_dev {
void __iomem *xferbase;
int irq;
- int cur_cs;
unsigned int sdmasize;
unsigned int sdma_xfer_len;
@@ -543,7 +542,7 @@ static int cdns_xspi_sdma_handle(struct cdns_xspi_dev *cdns_xspi)
static int cdns_xspi_send_stig_command(struct cdns_xspi_dev *cdns_xspi,
const struct spi_mem_op *op,
- bool data_phase)
+ int cs, bool data_phase)
{
u32 cmd_regs[6];
u32 cmd_status;
@@ -566,8 +565,7 @@ static int cdns_xspi_send_stig_command(struct cdns_xspi_dev *cdns_xspi,
} else {
cmd_regs[3] = CDNS_XSPI_CMD_FLD_P1_INSTR_CMD_3(op, 0);
}
- cmd_regs[4] = CDNS_XSPI_CMD_FLD_P1_INSTR_CMD_4(op,
- cdns_xspi->cur_cs);
+ cmd_regs[4] = CDNS_XSPI_CMD_FLD_P1_INSTR_CMD_4(op, cs);
cdns_xspi_trigger_command(cdns_xspi, cmd_regs);
@@ -576,8 +574,7 @@ static int cdns_xspi_send_stig_command(struct cdns_xspi_dev *cdns_xspi,
cmd_regs[1] = CDNS_XSPI_CMD_FLD_DSEQ_CMD_1(op);
cmd_regs[2] = CDNS_XSPI_CMD_FLD_DSEQ_CMD_2(op);
cmd_regs[3] = CDNS_XSPI_CMD_FLD_DSEQ_CMD_3(op, dummybytes);
- cmd_regs[4] = CDNS_XSPI_CMD_FLD_DSEQ_CMD_4(op,
- cdns_xspi->cur_cs);
+ cmd_regs[4] = CDNS_XSPI_CMD_FLD_DSEQ_CMD_4(op, cs);
cdns_xspi->in_buffer = op->data.buf.in;
cdns_xspi->out_buffer = op->data.buf.out;
@@ -612,11 +609,9 @@ static int cdns_xspi_mem_op(struct cdns_xspi_dev *cdns_xspi,
const struct spi_mem_op *op)
{
enum spi_mem_data_dir dir = op->data.dir;
+ int cs = spi_get_chipselect(mem->spi, 0);
- if (cdns_xspi->cur_cs != spi_get_chipselect(mem->spi, 0))
- cdns_xspi->cur_cs = spi_get_chipselect(mem->spi, 0);
-
- return cdns_xspi_send_stig_command(cdns_xspi, op,
+ return cdns_xspi_send_stig_command(cdns_xspi, op, cs,
(dir != SPI_MEM_NO_DATA));
}
@@ -1272,7 +1267,6 @@ static int cdns_xspi_probe(struct platform_device *pdev)
cdns_xspi->pdev = pdev;
cdns_xspi->host = host;
cdns_xspi->dev = &pdev->dev;
- cdns_xspi->cur_cs = 0;
init_completion(&cdns_xspi->cmd_complete);
init_completion(&cdns_xspi->auto_cmd_complete);
--
2.47.3
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2 5/6] spi: cadence-xspi: Rework resource discovery
2026-11-11 10:35 [PATCH v2 0/6] spi: cadence-xspi: Fixes and ACPI changes Paul Cercueil
` (3 preceding siblings ...)
2026-11-11 10:35 ` [PATCH v2 4/6] spi: cadence-xspi: Drop useless cdns_xspi->cur_cs Paul Cercueil
@ 2026-11-11 10:35 ` Paul Cercueil
2026-11-11 10:35 ` [PATCH v2 6/6] spi: cadence-xspi: Add workaround for old Marvell firmwares Paul Cercueil
5 siblings, 0 replies; 7+ messages in thread
From: Paul Cercueil @ 2026-11-11 10:35 UTC (permalink / raw)
To: Mark Brown
Cc: linux-spi, linux-kernel, Thomas Petazzoni, Bharat Bhushan,
Sunil Kovvuri Goutham, Tanmay Jagdale, Jisheng Zhang,
Paul Cercueil
From: Tanmay Jagdale <tanmay@marvell.com>
The previous code worked, but calling
devm_platform_ioremap_resource_byname() on ACPI where resources aren't
named causes warnings to be printed, one per call:
cadence-xspi PRP0001:02: error -EINVAL: invalid resource (null)
cadence-xspi PRP0001:02: error -EINVAL: invalid resource (null)
cadence-xspi PRP0001:02: error -EINVAL: invalid resource (null)
cadence-xspi PRP0001:02: error -EINVAL: invalid resource (null)
We can avoid these warnings by first obtaining a pointer to the resource
with platform_get_resource_byname() and fallback to
platform_get_resource() if it fails, and then ioremap the resource using
devm_ioremap_resource().
Signed-off-by: Tanmay Jagdale <tanmay@marvell.com>
Co-developed-by: Paul Cercueil <paul.cercueil@bootlin.com>
Signed-off-by: Paul Cercueil <paul.cercueil@bootlin.com>
---
v2: - Drop error messages as devm_ioremap_resource() already prints
errors.
---
drivers/spi/spi-cadence-xspi.c | 56 ++++++++++++++++------------------
1 file changed, 27 insertions(+), 29 deletions(-)
diff --git a/drivers/spi/spi-cadence-xspi.c b/drivers/spi/spi-cadence-xspi.c
index f4ce4820b08f..8fa58a0412e3 100644
--- a/drivers/spi/spi-cadence-xspi.c
+++ b/drivers/spi/spi-cadence-xspi.c
@@ -1276,44 +1276,42 @@ static int cdns_xspi_probe(struct platform_device *pdev)
if (ret)
return -ENODEV;
- cdns_xspi->iobase = devm_platform_ioremap_resource_byname(pdev, "io");
- if (IS_ERR(cdns_xspi->iobase)) {
- cdns_xspi->iobase = devm_platform_ioremap_resource(pdev, 0);
- if (IS_ERR(cdns_xspi->iobase)) {
- dev_err(dev, "Failed to remap controller base address\n");
- return PTR_ERR(cdns_xspi->iobase);
- }
- }
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "io");
+ if (!res)
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+
+ cdns_xspi->iobase = devm_ioremap_resource(dev, res);
+ if (IS_ERR(cdns_xspi->iobase))
+ return PTR_ERR(cdns_xspi->iobase);
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "sdma");
- cdns_xspi->sdmabase = devm_ioremap_resource(dev, res);
- if (IS_ERR(cdns_xspi->sdmabase)) {
+ if (!res)
res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
- cdns_xspi->sdmabase = devm_ioremap_resource(dev, res);
- if (IS_ERR(cdns_xspi->sdmabase))
- return PTR_ERR(cdns_xspi->sdmabase);
- }
+
+ cdns_xspi->sdmabase = devm_ioremap_resource(dev, res);
+ if (IS_ERR(cdns_xspi->sdmabase))
+ return PTR_ERR(cdns_xspi->sdmabase);
cdns_xspi->sdmasize = resource_size(res);
- cdns_xspi->auxbase = devm_platform_ioremap_resource_byname(pdev, "aux");
- if (IS_ERR(cdns_xspi->auxbase)) {
- cdns_xspi->auxbase = devm_platform_ioremap_resource(pdev, 2);
- if (IS_ERR(cdns_xspi->auxbase)) {
- dev_err(dev, "Failed to remap AUX address\n");
- return PTR_ERR(cdns_xspi->auxbase);
- }
- }
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "aux");
+ if (!res)
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 2);
+
+ cdns_xspi->auxbase = devm_ioremap_resource(dev, res);
+ if (IS_ERR(cdns_xspi->auxbase))
+ return PTR_ERR(cdns_xspi->auxbase);
#ifdef CONFIG_64BIT
if (cdns_xspi->driver_data->mrvl_hw_overlay) {
- cdns_xspi->xferbase = devm_platform_ioremap_resource_byname(pdev, "xfer");
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "xfer");
+ if (!res)
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 3);
+
+ cdns_xspi->xferbase = devm_ioremap_resource(dev, res);
if (IS_ERR(cdns_xspi->xferbase)) {
- cdns_xspi->xferbase = devm_platform_ioremap_resource(pdev, 3);
- if (IS_ERR(cdns_xspi->xferbase)) {
- dev_info(dev, "XFER register base not found, set it\n");
- // For compatibility with older firmware
- cdns_xspi->xferbase = cdns_xspi->iobase + 0x8000;
- }
+ dev_info(dev, "XFER register base not found, set it\n");
+ // For compatibility with older firmware
+ cdns_xspi->xferbase = cdns_xspi->iobase + 0x8000;
}
}
#endif
--
2.47.3
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2 6/6] spi: cadence-xspi: Add workaround for old Marvell firmwares
2026-11-11 10:35 [PATCH v2 0/6] spi: cadence-xspi: Fixes and ACPI changes Paul Cercueil
` (4 preceding siblings ...)
2026-11-11 10:35 ` [PATCH v2 5/6] spi: cadence-xspi: Rework resource discovery Paul Cercueil
@ 2026-11-11 10:35 ` Paul Cercueil
5 siblings, 0 replies; 7+ messages in thread
From: Paul Cercueil @ 2026-11-11 10:35 UTC (permalink / raw)
To: Mark Brown
Cc: linux-spi, linux-kernel, Thomas Petazzoni, Bharat Bhushan,
Sunil Kovvuri Goutham, Tanmay Jagdale, Jisheng Zhang,
Paul Cercueil
From: Tanmay Jagdale <tanmay@marvell.com>
Older firmwares from Marvell used the cdns,xspi-nor compatible string
for the Marvell-specific xSPI IP, which is incompatible.
Add a workaround to support this case, checking for a Marvell board in
the DTB or the ACPI tables.
Signed-off-by: Tanmay Jagdale <tanmay@marvell.com>
Co-developed-by: Paul Cercueil <paul.cercueil@bootlin.com>
Signed-off-by: Paul Cercueil <paul.cercueil@bootlin.com>
---
v2: Replace the workaround based on the presence of the "xfer" resource
with a mechanism that identifies a Marvell SoC based on the board's
compatible string on DTB, and the DSDT table on ACPI.
---
drivers/spi/spi-cadence-xspi.c | 37 +++++++++++++++++++++++++++++++++-
1 file changed, 36 insertions(+), 1 deletion(-)
diff --git a/drivers/spi/spi-cadence-xspi.c b/drivers/spi/spi-cadence-xspi.c
index 8fa58a0412e3..ecb78fcc6228 100644
--- a/drivers/spi/spi-cadence-xspi.c
+++ b/drivers/spi/spi-cadence-xspi.c
@@ -2,6 +2,7 @@
// Cadence XSPI flash controller driver
// Copyright (C) 2020-21 Cadence
+#include <linux/acpi.h>
#include <linux/completion.h>
#include <linux/delay.h>
#include <linux/err.h>
@@ -11,11 +12,13 @@
#include <linux/iopoll.h>
#include <linux/kernel.h>
#include <linux/module.h>
+#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/pm_runtime.h>
#include <linux/property.h>
#include <linux/spi/spi.h>
#include <linux/spi/spi-mem.h>
+#include <linux/string.h>
#include <linux/bitfield.h>
#include <linux/limits.h>
#include <linux/log2.h>
@@ -775,7 +778,6 @@ static void cdns_xspi_print_phy_config(struct cdns_xspi_dev *cdns_xspi)
readl(cdns_xspi->auxbase + CDNS_XSPI_CCP_PHY_DLL_SLAVE_CTRL));
}
-#ifdef CONFIG_64BIT
static struct cdns_xspi_driver_data marvell_driver_data = {
.mrvl_hw_overlay = true,
.dll_phy_ctrl = MARVELL_REGS_DLL_PHY_CTRL,
@@ -788,6 +790,7 @@ static struct cdns_xspi_driver_data marvell_driver_data = {
.rfile_phy_dll_slave_ctrl = MARVELL_RFILE_PHY_DLL_SLAVE_CTRL,
};
+#ifdef CONFIG_64BIT
static const int cdns_mrvl_xspi_clk_div_list[] = {
4, //0x0 = Divide by 4. SPI clock is 200 MHz.
6, //0x1 = Divide by 6. SPI clock is 133.33 MHz.
@@ -1228,6 +1231,29 @@ static int cdns_xspi_transfer_one_message_b0(struct spi_controller *controller,
}
#endif
+static const struct acpi_platform_list mrvl_platform_list[] = {
+ {
+ .oem_id = "MRVL ",
+ .oem_table_id = "CN10K",
+ .table = ACPI_SIG_DSDT,
+ .pred = all_versions,
+ },
+ { }
+};
+
+static inline bool cdns_is_marvell(struct device *dev)
+{
+ const char *compatible;
+
+ if (has_acpi_companion(dev))
+ return acpi_match_platform_list(mrvl_platform_list) >= 0;
+
+ if (of_machine_read_compatible(&compatible, 0) < 0)
+ return false; /* shouldn't actually happen */
+
+ return strstarts(compatible, "marvell,");
+}
+
static int cdns_xspi_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
@@ -1249,6 +1275,15 @@ static int cdns_xspi_probe(struct platform_device *pdev)
if (!cdns_xspi->driver_data)
return -ENODEV;
+ if (IS_ENABLED(CONFIG_64BIT) &&
+ !cdns_xspi->driver_data->mrvl_hw_overlay &&
+ cdns_is_marvell(dev)) {
+ /* Some old firmwares use the base compatible string... */
+
+ dev_warn(dev, "Using the cdns,xspi-nor compatible string on a Marvell SoC. Please fix firmware!\n");
+ cdns_xspi->driver_data = &marvell_driver_data;
+ }
+
host->mem_ops = &cadence_xspi_mem_ops;
cdns_xspi->sdma_handler = &cdns_xspi_sdma_handle;
cdns_xspi->set_interrupts_handler = &cdns_xspi_set_interrupts;
--
2.47.3
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-11-11 10:36 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-11-11 10:35 [PATCH v2 0/6] spi: cadence-xspi: Fixes and ACPI changes Paul Cercueil
2026-11-11 10:35 ` [PATCH v2 1/6] spi: cadence-xspi: Properly handle errors in .transfer_one_message Paul Cercueil
2026-11-11 10:35 ` [PATCH v2 2/6] spi: cadence-xspi: Reconfigure to STIG mode before SPI message Paul Cercueil
2026-11-11 10:35 ` [PATCH v2 3/6] spi: cadence-xspi: Inform SPI core about size transferred Paul Cercueil
2026-11-11 10:35 ` [PATCH v2 4/6] spi: cadence-xspi: Drop useless cdns_xspi->cur_cs Paul Cercueil
2026-11-11 10:35 ` [PATCH v2 5/6] spi: cadence-xspi: Rework resource discovery Paul Cercueil
2026-11-11 10:35 ` [PATCH v2 6/6] spi: cadence-xspi: Add workaround for old Marvell firmwares Paul Cercueil
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®