FAILED: patch "[PATCH] spi: cadence-qspi: defer runtime support on socfpga if reset" failed to apply to 6.12-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 6.12-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.12.y
git checkout FETCH_HEAD
git cherry-pick -x 30dbc1c8d50f13c1581b49abe46fe89f393eacbf
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2025092913-unissued-panoramic-e22c@gregkh' --subject-prefix 'PATCH 6.12.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 30dbc1c8d50f13c1581b49abe46fe89f393eacbf Mon Sep 17 00:00:00 2001
From: Khairul Anuar Romli <[email protected]>
Date: Wed, 10 Sep 2025 16:06:32 +0800
Subject: [PATCH] spi: cadence-qspi: defer runtime support on socfpga if reset
bit is enabled
Enabling runtime PM allows the kernel to gate clocks and power to idle devices. On SoCFPGA, a warm reset does not fully reinitialize these domains.This leaves devices suspended and powered down, preventing U-Boot or the kernel from reusing them after a warm reset, which breaks the boot process.
drivers/spi/spi-cadence-quadspi.c +36 -17
@@ -46,6 +46,7 @@ static_assert(CQSPI_MAX_CHIPSELECT <= SPI_CS_CNT_MAX);#define CQSPI_DMA_SET_MASK BIT(7)#define CQSPI_SUPPORT_DEVICE_RESET BIT(8)#define CQSPI_DISABLE_STIG_MODE BIT(9) +#define CQSPI_DISABLE_RUNTIME_PM BIT(10)/* Capabilities */ #define CQSPI_SUPPORTS_OCTAL BIT(0)
@@ -1468,14 +1469,17 @@ static int cqspi_exec_mem_op(struct spi_mem *mem, const struct spi_mem_op *op)int ret;struct cqspi_st *cqspi =spi_controller_get_devdata (mem->spi->controller);struct device *dev = &cqspi->pdev->dev; +const struct cqspi_driver_platdata *ddata =of_device_get_match_data (dev);if (refcount_read (&cqspi->inflight_ops) ==0 )return -ENODEV ; - ret =pm_runtime_resume_and_get (dev); -if (ret) { -dev_err (&mem->spi->dev,"resume failed with %d\n" , ret); -return ret; +if (!(ddata && (ddata->quirks &CQSPI_DISABLE_RUNTIME_PM ))) { + ret =pm_runtime_resume_and_get (dev); +if (ret) { +dev_err (&mem->spi->dev,"resume failed with %d\n" , ret); +return ret; + } }if (!refcount_read (&cqspi->refcount))
@@ -1491,7 +1495,8 @@ static int cqspi_exec_mem_op(struct spi_mem *mem, const struct spi_mem_op *op) ret =cqspi_mem_process (mem, op); -pm_runtime_put_autosuspend (dev); +if (!(ddata && (ddata->quirks &CQSPI_DISABLE_RUNTIME_PM ))) +pm_runtime_put_autosuspend (dev);if (ret)dev_err (&mem->spi->dev,"operation failed with %d\n" , ret);
@@ -1985,11 +1990,12 @@ static int cqspi_probe(struct platform_device *pdev) goto probe_setup_failed; } -pm_runtime_enable (dev); - -pm_runtime_set_autosuspend_delay (dev,CQSPI_AUTOSUSPEND_TIMEOUT ); -pm_runtime_use_autosuspend (dev); -pm_runtime_get_noresume (dev); +if (!(ddata && (ddata->quirks &CQSPI_DISABLE_RUNTIME_PM ))) { +pm_runtime_enable (dev); +pm_runtime_set_autosuspend_delay (dev,CQSPI_AUTOSUSPEND_TIMEOUT ); +pm_runtime_use_autosuspend (dev); +pm_runtime_get_noresume (dev); + } ret =spi_register_controller (host);if (ret) {
@@ -1997,12 +2003,17 @@ static int cqspi_probe(struct platform_device *pdev) goto probe_setup_failed; } -pm_runtime_put_autosuspend (dev); +if (!(ddata && (ddata->quirks &CQSPI_DISABLE_RUNTIME_PM ))) { +pm_runtime_put_autosuspend (dev); +pm_runtime_mark_last_busy (dev); +pm_runtime_put_autosuspend (dev); + }return 0 ; probe_setup_failed:cqspi_controller_enable (cqspi,0 ); -pm_runtime_disable (dev); +if (!(ddata && (ddata->quirks &CQSPI_DISABLE_RUNTIME_PM ))) +pm_runtime_disable (dev); probe_reset_failed:if (cqspi->is_jh7110)cqspi_jh7110_disable_clk (pdev, cqspi);
@@ -2013,7 +2024,11 @@ static int cqspi_probe(struct platform_device *pdev)static void cqspi_remove (struct platform_device *pdev) { +const struct cqspi_driver_platdata *ddata;struct cqspi_st *cqspi =platform_get_drvdata (pdev); +struct device *dev = &pdev->dev; + + ddata =of_device_get_match_data (dev);refcount_set (&cqspi->refcount,0 );
@@ -2026,14 +2041,17 @@ static void cqspi_remove(struct platform_device *pdev)if (cqspi->rx_chan)dma_release_channel (cqspi->rx_chan); -if (pm_runtime_get_sync (&pdev->dev) >=0 ) -clk_disable (cqspi->clk); +if (!(ddata && (ddata->quirks &CQSPI_DISABLE_RUNTIME_PM ))) +if (pm_runtime_get_sync (&pdev->dev) >=0 ) +clk_disable (cqspi->clk);if (cqspi->is_jh7110)cqspi_jh7110_disable_clk (pdev, cqspi); -pm_runtime_put_sync (&pdev->dev); -pm_runtime_disable (&pdev->dev); +if (!(ddata && (ddata->quirks &CQSPI_DISABLE_RUNTIME_PM ))) { +pm_runtime_put_sync (&pdev->dev); +pm_runtime_disable (&pdev->dev); + } }static int cqspi_runtime_suspend (struct device *dev)
@@ -2112,7 +2130,8 @@ static const struct cqspi_driver_platdata socfpga_qspi = { .quirks = CQSPI_DISABLE_DAC_MODE |CQSPI_NO_SUPPORT_WR_COMPLETION |CQSPI_SLOW_SRAM - | CQSPI_DISABLE_STIG_MODE, + |CQSPI_DISABLE_STIG_MODE + | CQSPI_DISABLE_RUNTIME_PM, };static const struct cqspi_driver_platdata versal_ospi = {
PATCH 1/1 spi: cadence-qspi: defer runtime support on socfpga if reset bit is enabled
Enabling runtime PM allows the kernel to gate clocks and power to idle devices. On SoCFPGA, a warm reset does not fully reinitialize these domains.This leaves devices suspended and powered down, preventing U-Boot or the kernel from reusing them after a warm reset, which breaks the boot process.
--- drivers/spi/spi-cadence-quadspi.c | 56 ++++++++++++++++++++----------- 1 file changed, 37 insertions(+), 19 deletions(-)
drivers/spi/spi-cadence-quadspi.c +37 -19
@@ -44,6 +44,7 @@ static_assert(CQSPI_MAX_CHIPSELECT <= SPI_CS_CNT_MAX);#define CQSPI_NEEDS_APB_AHB_HAZARD_WAR BIT(5)#define CQSPI_RD_NO_IRQ BIT(6)#define CQSPI_DISABLE_STIG_MODE BIT(7) +#define CQSPI_DISABLE_RUNTIME_PM BIT(8)/* Capabilities */ #define CQSPI_SUPPORTS_OCTAL BIT(0)
@@ -1436,17 +1437,22 @@ static int cqspi_exec_mem_op(struct spi_mem *mem, const struct spi_mem_op *op)int ret;struct cqspi_st *cqspi =spi_controller_get_devdata (mem->spi->controller);struct device *dev = &cqspi->pdev->dev; +const struct cqspi_driver_platdata *ddata =of_device_get_match_data (dev); - ret =pm_runtime_resume_and_get (dev); -if (ret) { -dev_err (&mem->spi->dev,"resume failed with %d\n" , ret); -return ret; +if (!(ddata && (ddata->quirks &CQSPI_DISABLE_RUNTIME_PM ))) { + ret =pm_runtime_resume_and_get (dev); +if (ret) { +dev_err (&mem->spi->dev,"resume failed with %d\n" , ret); +return ret; + } } ret =cqspi_mem_process (mem, op); -pm_runtime_mark_last_busy (dev); -pm_runtime_put_autosuspend (dev); +if (!(ddata && (ddata->quirks &CQSPI_DISABLE_RUNTIME_PM ))) { +pm_runtime_mark_last_busy (dev); +pm_runtime_put_autosuspend (dev); + }if (ret)dev_err (&mem->spi->dev,"operation failed with %d\n" , ret);
@@ -1929,11 +1935,12 @@ static int cqspi_probe(struct platform_device *pdev) goto probe_setup_failed; } -pm_runtime_enable (dev); - -pm_runtime_set_autosuspend_delay (dev,CQSPI_AUTOSUSPEND_TIMEOUT ); -pm_runtime_use_autosuspend (dev); -pm_runtime_get_noresume (dev); +if (!(ddata && (ddata->quirks &CQSPI_DISABLE_RUNTIME_PM ))) { +pm_runtime_enable (dev); +pm_runtime_set_autosuspend_delay (dev,CQSPI_AUTOSUSPEND_TIMEOUT ); +pm_runtime_use_autosuspend (dev); +pm_runtime_get_noresume (dev); + } ret =spi_register_controller (host);if (ret) {
@@ -1941,13 +1948,16 @@ static int cqspi_probe(struct platform_device *pdev) goto probe_setup_failed; } -pm_runtime_mark_last_busy (dev); -pm_runtime_put_autosuspend (dev); +if (!(ddata && (ddata->quirks &CQSPI_DISABLE_RUNTIME_PM ))) { +pm_runtime_mark_last_busy (dev); +pm_runtime_put_autosuspend (dev); + }return 0 ; probe_setup_failed:cqspi_controller_enable (cqspi,0 ); -pm_runtime_disable (dev); +if (!(ddata && (ddata->quirks &CQSPI_DISABLE_RUNTIME_PM ))) +pm_runtime_disable (dev); probe_reset_failed:if (cqspi->is_jh7110)cqspi_jh7110_disable_clk (pdev, cqspi);
@@ -1958,7 +1968,11 @@ static int cqspi_probe(struct platform_device *pdev)static void cqspi_remove (struct platform_device *pdev) { +const struct cqspi_driver_platdata *ddata;struct cqspi_st *cqspi =platform_get_drvdata (pdev); +struct device *dev = &pdev->dev; + + ddata =of_device_get_match_data (dev);spi_unregister_controller (cqspi->host);cqspi_controller_enable (cqspi,0 );
@@ -1966,14 +1980,17 @@ static void cqspi_remove(struct platform_device *pdev)if (cqspi->rx_chan)dma_release_channel (cqspi->rx_chan); -if (pm_runtime_get_sync (&pdev->dev) >=0 ) -clk_disable (cqspi->clk); +if (!(ddata && (ddata->quirks &CQSPI_DISABLE_RUNTIME_PM ))) +if (pm_runtime_get_sync (&pdev->dev) >=0 ) +clk_disable (cqspi->clk);if (cqspi->is_jh7110)cqspi_jh7110_disable_clk (pdev, cqspi); -pm_runtime_put_sync (&pdev->dev); -pm_runtime_disable (&pdev->dev); +if (!(ddata && (ddata->quirks &CQSPI_DISABLE_RUNTIME_PM ))) { +pm_runtime_put_sync (&pdev->dev); +pm_runtime_disable (&pdev->dev); + } }static int cqspi_runtime_suspend (struct device *dev)
@@ -2052,7 +2069,8 @@ static const struct cqspi_driver_platdata socfpga_qspi = { .quirks = CQSPI_DISABLE_DAC_MODE |CQSPI_NO_SUPPORT_WR_COMPLETION |CQSPI_SLOW_SRAM - | CQSPI_DISABLE_STIG_MODE, + |CQSPI_DISABLE_STIG_MODE + | CQSPI_DISABLE_RUNTIME_PM, };static const struct cqspi_driver_platdata versal_ospi = {
Signature · 1 line
2.35.3