]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
spi: dw-mmio: support suspend/resume
authorJisheng Zhang <jszhang@kernel.org>
Thu, 22 Jan 2026 15:50:46 +0000 (23:50 +0800)
committerMark Brown <broonie@kernel.org>
Tue, 27 Jan 2026 12:46:30 +0000 (12:46 +0000)
Add system wide suspend and resume support, the implementation is
straightforward, just call spi_controller_suspend() then assert the
reset and disable clks for suspend, enable clks and deassert reset
then call spi_controller_resume() for resume.

Signed-off-by: Jisheng Zhang <jszhang@kernel.org>
Link: https://patch.msgid.link/20260122155046.12848-1-jszhang@kernel.org
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-dw-mmio.c

index 33239b4778cb64205be29b91ef2730ec8a02de91..b8123db4ad559e7f90556cefc525fc179f052027 100644 (file)
@@ -392,6 +392,38 @@ out_reset:
        return ret;
 }
 
+static int dw_spi_mmio_suspend(struct device *dev)
+{
+       struct dw_spi_mmio *dwsmmio = dev_get_drvdata(dev);
+       int ret;
+
+       ret = dw_spi_suspend_controller(&dwsmmio->dws);
+       if (ret)
+               return ret;
+
+       reset_control_assert(dwsmmio->rstc);
+
+       clk_disable_unprepare(dwsmmio->pclk);
+       clk_disable_unprepare(dwsmmio->clk);
+
+       return 0;
+}
+
+static int dw_spi_mmio_resume(struct device *dev)
+{
+       struct dw_spi_mmio *dwsmmio = dev_get_drvdata(dev);
+
+       clk_prepare_enable(dwsmmio->clk);
+       clk_prepare_enable(dwsmmio->pclk);
+
+       reset_control_deassert(dwsmmio->rstc);
+
+       return dw_spi_resume_controller(&dwsmmio->dws);
+}
+
+static DEFINE_SIMPLE_DEV_PM_OPS(dw_spi_mmio_pm_ops,
+                               dw_spi_mmio_suspend, dw_spi_mmio_resume);
+
 static void dw_spi_mmio_remove(struct platform_device *pdev)
 {
        struct dw_spi_mmio *dwsmmio = platform_get_drvdata(pdev);
@@ -435,6 +467,7 @@ static struct platform_driver dw_spi_mmio_driver = {
                .name   = DRIVER_NAME,
                .of_match_table = dw_spi_mmio_of_match,
                .acpi_match_table = ACPI_PTR(dw_spi_mmio_acpi_match),
+               .pm     = pm_sleep_ptr(&dw_spi_mmio_pm_ops),
        },
 };
 module_platform_driver(dw_spi_mmio_driver);