diff options
| author | Mark Brown <broonie@kernel.org> | 2026-01-06 17:39:06 +0000 |
|---|---|---|
| committer | Mark Brown <broonie@kernel.org> | 2026-01-06 17:39:06 +0000 |
| commit | 36227ab99a781a02b3448b79fb15f2a20dc7f10b (patch) | |
| tree | 8380702521855a595e2e4e92714ae287a76eee17 /drivers/spi | |
| parent | 96d337436fe0921177a6090aeb5bb214753654fc (diff) | |
| parent | 75d208bddcca55ec31481420fbb4d6c9703ba195 (diff) | |
spi: st: use pm_ptr and remove __maybe_unused
Merge series from Alain Volmat <alain.volmat@foss.st.com>:
Update ST related SPI drivers in order to remove the __maybe_unused
statements on pm related functions thanks to the usage of pm_ptr.
Diffstat (limited to 'drivers/spi')
| -rw-r--r-- | drivers/spi/spi-cadence-quadspi.c | 31 | ||||
| -rw-r--r-- | drivers/spi/spi-fsl-spi.c | 2 | ||||
| -rw-r--r-- | drivers/spi/spi-mpfs.c | 1 | ||||
| -rw-r--r-- | drivers/spi/spi-mt65xx.c | 2 | ||||
| -rw-r--r-- | drivers/spi/spi-st-ssc4.c | 4 | ||||
| -rw-r--r-- | drivers/spi/spi-stm32-ospi.c | 15 | ||||
| -rw-r--r-- | drivers/spi/spi-stm32-qspi.c | 15 | ||||
| -rw-r--r-- | drivers/spi/spi-stm32.c | 15 | ||||
| -rw-r--r-- | drivers/spi/spi-sun6i.c | 11 |
9 files changed, 50 insertions, 46 deletions
diff --git a/drivers/spi/spi-cadence-quadspi.c b/drivers/spi/spi-cadence-quadspi.c index a390b1815fde..b1cf182d6566 100644 --- a/drivers/spi/spi-cadence-quadspi.c +++ b/drivers/spi/spi-cadence-quadspi.c @@ -300,6 +300,9 @@ struct cqspi_driver_platdata { CQSPI_REG_IRQ_IND_SRAM_FULL | \ CQSPI_REG_IRQ_IND_COMP) +#define CQSPI_IRQ_MASK_RD_SLOW_SRAM (CQSPI_REG_IRQ_WATERMARK | \ + CQSPI_REG_IRQ_IND_COMP) + #define CQSPI_IRQ_MASK_WR (CQSPI_REG_IRQ_IND_COMP | \ CQSPI_REG_IRQ_WATERMARK | \ CQSPI_REG_IRQ_UNDERFLOW) @@ -381,7 +384,7 @@ static irqreturn_t cqspi_irq_handler(int this_irq, void *dev) else if (!cqspi->slow_sram) irq_status &= CQSPI_IRQ_MASK_RD | CQSPI_IRQ_MASK_WR; else - irq_status &= CQSPI_REG_IRQ_WATERMARK | CQSPI_IRQ_MASK_WR; + irq_status &= CQSPI_IRQ_MASK_RD_SLOW_SRAM | CQSPI_IRQ_MASK_WR; if (irq_status) complete(&cqspi->transfer_complete); @@ -757,7 +760,7 @@ static int cqspi_indirect_read_execute(struct cqspi_flash_pdata *f_pdata, */ if (use_irq && cqspi->slow_sram) - writel(CQSPI_REG_IRQ_WATERMARK, reg_base + CQSPI_REG_IRQMASK); + writel(CQSPI_IRQ_MASK_RD_SLOW_SRAM, reg_base + CQSPI_REG_IRQMASK); else if (use_irq) writel(CQSPI_IRQ_MASK_RD, reg_base + CQSPI_REG_IRQMASK); else @@ -769,17 +772,19 @@ static int cqspi_indirect_read_execute(struct cqspi_flash_pdata *f_pdata, readl(reg_base + CQSPI_REG_INDIRECTRD); /* Flush posted write. */ while (remaining > 0) { + ret = 0; if (use_irq && !wait_for_completion_timeout(&cqspi->transfer_complete, msecs_to_jiffies(CQSPI_READ_TIMEOUT_MS))) ret = -ETIMEDOUT; /* - * Disable all read interrupts until - * we are out of "bytes to read" + * Prevent lost interrupt and race condition by reinitializing early. + * A spurious wakeup and another wait cycle can occur here, + * which is preferable to waiting until timeout if interrupt is lost. */ - if (cqspi->slow_sram) - writel(0x0, reg_base + CQSPI_REG_IRQMASK); + if (use_irq) + reinit_completion(&cqspi->transfer_complete); bytes_to_read = cqspi_get_rd_sram_level(cqspi); @@ -811,12 +816,6 @@ static int cqspi_indirect_read_execute(struct cqspi_flash_pdata *f_pdata, remaining -= bytes_to_read; bytes_to_read = cqspi_get_rd_sram_level(cqspi); } - - if (use_irq && remaining > 0) { - reinit_completion(&cqspi->transfer_complete); - if (cqspi->slow_sram) - writel(CQSPI_REG_IRQ_WATERMARK, reg_base + CQSPI_REG_IRQMASK); - } } /* Check indirect done status */ @@ -2001,8 +2000,10 @@ static int cqspi_probe(struct platform_device *pdev) if (cqspi->use_direct_mode) { ret = cqspi_request_mmap_dma(cqspi); - if (ret == -EPROBE_DEFER) + if (ret == -EPROBE_DEFER) { + dev_err_probe(&pdev->dev, ret, "Failed to request mmap DMA\n"); goto probe_setup_failed; + } } ret = spi_register_controller(host); @@ -2022,7 +2023,9 @@ probe_setup_failed: probe_reset_failed: if (cqspi->is_jh7110) cqspi_jh7110_disable_clk(pdev, cqspi); - clk_disable_unprepare(cqspi->clk); + + if (pm_runtime_get_sync(&pdev->dev) >= 0) + clk_disable_unprepare(cqspi->clk); probe_clk_failed: return ret; } diff --git a/drivers/spi/spi-fsl-spi.c b/drivers/spi/spi-fsl-spi.c index 2f2082652a1a..481a7b28aacd 100644 --- a/drivers/spi/spi-fsl-spi.c +++ b/drivers/spi/spi-fsl-spi.c @@ -335,7 +335,7 @@ static int fsl_spi_prepare_message(struct spi_controller *ctlr, if (t->bits_per_word == 16 || t->bits_per_word == 32) t->bits_per_word = 8; /* pretend its 8 bits */ if (t->bits_per_word == 8 && t->len >= 256 && - (mpc8xxx_spi->flags & SPI_CPM1)) + !(t->len & 1) && (mpc8xxx_spi->flags & SPI_CPM1)) t->bits_per_word = 16; } } diff --git a/drivers/spi/spi-mpfs.c b/drivers/spi/spi-mpfs.c index 9a14d1732a15..7e9e64d8e6c8 100644 --- a/drivers/spi/spi-mpfs.c +++ b/drivers/spi/spi-mpfs.c @@ -577,6 +577,7 @@ static int mpfs_spi_probe(struct platform_device *pdev) ret = devm_spi_register_controller(&pdev->dev, host); if (ret) { + mpfs_spi_disable_ints(spi); mpfs_spi_disable(spi); return dev_err_probe(&pdev->dev, ret, "unable to register host for SPI controller\n"); diff --git a/drivers/spi/spi-mt65xx.c b/drivers/spi/spi-mt65xx.c index 4b40985af1ea..90e5813cfdc3 100644 --- a/drivers/spi/spi-mt65xx.c +++ b/drivers/spi/spi-mt65xx.c @@ -1320,7 +1320,7 @@ static int mtk_spi_probe(struct platform_device *pdev) ret = devm_request_threaded_irq(dev, irq, mtk_spi_interrupt, mtk_spi_interrupt_thread, - IRQF_TRIGGER_NONE, dev_name(dev), host); + IRQF_ONESHOT, dev_name(dev), host); if (ret) return dev_err_probe(dev, ret, "failed to register irq\n"); diff --git a/drivers/spi/spi-st-ssc4.c b/drivers/spi/spi-st-ssc4.c index c07c61dc4938..b173ef70d77e 100644 --- a/drivers/spi/spi-st-ssc4.c +++ b/drivers/spi/spi-st-ssc4.c @@ -403,7 +403,7 @@ static int spi_st_runtime_resume(struct device *dev) return ret; } -static int __maybe_unused spi_st_suspend(struct device *dev) +static int spi_st_suspend(struct device *dev) { struct spi_controller *host = dev_get_drvdata(dev); int ret; @@ -415,7 +415,7 @@ static int __maybe_unused spi_st_suspend(struct device *dev) return pm_runtime_force_suspend(dev); } -static int __maybe_unused spi_st_resume(struct device *dev) +static int spi_st_resume(struct device *dev) { struct spi_controller *host = dev_get_drvdata(dev); int ret; diff --git a/drivers/spi/spi-stm32-ospi.c b/drivers/spi/spi-stm32-ospi.c index f396439e2281..58d8cec74c7b 100644 --- a/drivers/spi/spi-stm32-ospi.c +++ b/drivers/spi/spi-stm32-ospi.c @@ -1012,7 +1012,7 @@ static void stm32_ospi_remove(struct platform_device *pdev) pm_runtime_force_suspend(ospi->dev); } -static int __maybe_unused stm32_ospi_suspend(struct device *dev) +static int stm32_ospi_suspend(struct device *dev) { struct stm32_ospi *ospi = dev_get_drvdata(dev); @@ -1023,7 +1023,7 @@ static int __maybe_unused stm32_ospi_suspend(struct device *dev) return pm_runtime_force_suspend(ospi->dev); } -static int __maybe_unused stm32_ospi_resume(struct device *dev) +static int stm32_ospi_resume(struct device *dev) { struct stm32_ospi *ospi = dev_get_drvdata(dev); void __iomem *regs_base = ospi->regs_base; @@ -1052,7 +1052,7 @@ static int __maybe_unused stm32_ospi_resume(struct device *dev) return 0; } -static int __maybe_unused stm32_ospi_runtime_suspend(struct device *dev) +static int stm32_ospi_runtime_suspend(struct device *dev) { struct stm32_ospi *ospi = dev_get_drvdata(dev); @@ -1061,7 +1061,7 @@ static int __maybe_unused stm32_ospi_runtime_suspend(struct device *dev) return 0; } -static int __maybe_unused stm32_ospi_runtime_resume(struct device *dev) +static int stm32_ospi_runtime_resume(struct device *dev) { struct stm32_ospi *ospi = dev_get_drvdata(dev); @@ -1069,9 +1069,8 @@ static int __maybe_unused stm32_ospi_runtime_resume(struct device *dev) } static const struct dev_pm_ops stm32_ospi_pm_ops = { - SET_SYSTEM_SLEEP_PM_OPS(stm32_ospi_suspend, stm32_ospi_resume) - SET_RUNTIME_PM_OPS(stm32_ospi_runtime_suspend, - stm32_ospi_runtime_resume, NULL) + SYSTEM_SLEEP_PM_OPS(stm32_ospi_suspend, stm32_ospi_resume) + RUNTIME_PM_OPS(stm32_ospi_runtime_suspend, stm32_ospi_runtime_resume, NULL) }; static const struct of_device_id stm32_ospi_of_match[] = { @@ -1085,7 +1084,7 @@ static struct platform_driver stm32_ospi_driver = { .remove = stm32_ospi_remove, .driver = { .name = "stm32-ospi", - .pm = &stm32_ospi_pm_ops, + .pm = pm_ptr(&stm32_ospi_pm_ops), .of_match_table = stm32_ospi_of_match, }, }; diff --git a/drivers/spi/spi-stm32-qspi.c b/drivers/spi/spi-stm32-qspi.c index d1df66875809..5354faef936a 100644 --- a/drivers/spi/spi-stm32-qspi.c +++ b/drivers/spi/spi-stm32-qspi.c @@ -910,7 +910,7 @@ static void stm32_qspi_remove(struct platform_device *pdev) clk_disable_unprepare(qspi->clk); } -static int __maybe_unused stm32_qspi_runtime_suspend(struct device *dev) +static int stm32_qspi_runtime_suspend(struct device *dev) { struct stm32_qspi *qspi = dev_get_drvdata(dev); @@ -919,21 +919,21 @@ static int __maybe_unused stm32_qspi_runtime_suspend(struct device *dev) return 0; } -static int __maybe_unused stm32_qspi_runtime_resume(struct device *dev) +static int stm32_qspi_runtime_resume(struct device *dev) { struct stm32_qspi *qspi = dev_get_drvdata(dev); return clk_prepare_enable(qspi->clk); } -static int __maybe_unused stm32_qspi_suspend(struct device *dev) +static int stm32_qspi_suspend(struct device *dev) { pinctrl_pm_select_sleep_state(dev); return pm_runtime_force_suspend(dev); } -static int __maybe_unused stm32_qspi_resume(struct device *dev) +static int stm32_qspi_resume(struct device *dev) { struct stm32_qspi *qspi = dev_get_drvdata(dev); int ret; @@ -957,9 +957,8 @@ static int __maybe_unused stm32_qspi_resume(struct device *dev) } static const struct dev_pm_ops stm32_qspi_pm_ops = { - SET_RUNTIME_PM_OPS(stm32_qspi_runtime_suspend, - stm32_qspi_runtime_resume, NULL) - SET_SYSTEM_SLEEP_PM_OPS(stm32_qspi_suspend, stm32_qspi_resume) + RUNTIME_PM_OPS(stm32_qspi_runtime_suspend, stm32_qspi_runtime_resume, NULL) + SYSTEM_SLEEP_PM_OPS(stm32_qspi_suspend, stm32_qspi_resume) }; static const struct of_device_id stm32_qspi_match[] = { @@ -974,7 +973,7 @@ static struct platform_driver stm32_qspi_driver = { .driver = { .name = "stm32-qspi", .of_match_table = stm32_qspi_match, - .pm = &stm32_qspi_pm_ops, + .pm = pm_ptr(&stm32_qspi_pm_ops), }, }; module_platform_driver(stm32_qspi_driver); diff --git a/drivers/spi/spi-stm32.c b/drivers/spi/spi-stm32.c index 8f8968383ad0..5c1e685a65d9 100644 --- a/drivers/spi/spi-stm32.c +++ b/drivers/spi/spi-stm32.c @@ -2614,7 +2614,7 @@ static void stm32_spi_remove(struct platform_device *pdev) pinctrl_pm_select_sleep_state(&pdev->dev); } -static int __maybe_unused stm32_spi_runtime_suspend(struct device *dev) +static int stm32_spi_runtime_suspend(struct device *dev) { struct spi_controller *ctrl = dev_get_drvdata(dev); struct stm32_spi *spi = spi_controller_get_devdata(ctrl); @@ -2624,7 +2624,7 @@ static int __maybe_unused stm32_spi_runtime_suspend(struct device *dev) return pinctrl_pm_select_sleep_state(dev); } -static int __maybe_unused stm32_spi_runtime_resume(struct device *dev) +static int stm32_spi_runtime_resume(struct device *dev) { struct spi_controller *ctrl = dev_get_drvdata(dev); struct stm32_spi *spi = spi_controller_get_devdata(ctrl); @@ -2637,7 +2637,7 @@ static int __maybe_unused stm32_spi_runtime_resume(struct device *dev) return clk_prepare_enable(spi->clk); } -static int __maybe_unused stm32_spi_suspend(struct device *dev) +static int stm32_spi_suspend(struct device *dev) { struct spi_controller *ctrl = dev_get_drvdata(dev); int ret; @@ -2649,7 +2649,7 @@ static int __maybe_unused stm32_spi_suspend(struct device *dev) return pm_runtime_force_suspend(dev); } -static int __maybe_unused stm32_spi_resume(struct device *dev) +static int stm32_spi_resume(struct device *dev) { struct spi_controller *ctrl = dev_get_drvdata(dev); struct stm32_spi *spi = spi_controller_get_devdata(ctrl); @@ -2679,9 +2679,8 @@ static int __maybe_unused stm32_spi_resume(struct device *dev) } static const struct dev_pm_ops stm32_spi_pm_ops = { - SET_SYSTEM_SLEEP_PM_OPS(stm32_spi_suspend, stm32_spi_resume) - SET_RUNTIME_PM_OPS(stm32_spi_runtime_suspend, - stm32_spi_runtime_resume, NULL) + SYSTEM_SLEEP_PM_OPS(stm32_spi_suspend, stm32_spi_resume) + RUNTIME_PM_OPS(stm32_spi_runtime_suspend, stm32_spi_runtime_resume, NULL) }; static struct platform_driver stm32_spi_driver = { @@ -2689,7 +2688,7 @@ static struct platform_driver stm32_spi_driver = { .remove = stm32_spi_remove, .driver = { .name = DRIVER_NAME, - .pm = &stm32_spi_pm_ops, + .pm = pm_ptr(&stm32_spi_pm_ops), .of_match_table = stm32_spi_of_match, }, }; diff --git a/drivers/spi/spi-sun6i.c b/drivers/spi/spi-sun6i.c index 871dfd3e77be..d1de6c99e762 100644 --- a/drivers/spi/spi-sun6i.c +++ b/drivers/spi/spi-sun6i.c @@ -795,10 +795,13 @@ static const struct sun6i_spi_cfg sun50i_r329_spi_cfg = { static const struct of_device_id sun6i_spi_match[] = { { .compatible = "allwinner,sun6i-a31-spi", .data = &sun6i_a31_spi_cfg }, { .compatible = "allwinner,sun8i-h3-spi", .data = &sun8i_h3_spi_cfg }, - { - .compatible = "allwinner,sun50i-r329-spi", - .data = &sun50i_r329_spi_cfg - }, + { .compatible = "allwinner,sun50i-r329-spi", .data = &sun50i_r329_spi_cfg }, + /* + * A523's SPI controller has a combined RX buffer + FIFO counter + * at offset 0x400, instead of split buffer count in FIFO status + * register. But in practice we only care about the FIFO level. + */ + { .compatible = "allwinner,sun55i-a523-spi", .data = &sun50i_r329_spi_cfg }, {} }; MODULE_DEVICE_TABLE(of, sun6i_spi_match); |
