Unverified Commit a8b6e373 authored by Jisheng Zhang's avatar Jisheng Zhang Committed by Mark Brown
Browse files

spi: dw-mmio: support suspend/resume



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: default avatarJisheng Zhang <jszhang@kernel.org>
Link: https://patch.msgid.link/20260122155046.12848-1-jszhang@kernel.org


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent db6a59cf
Loading
Loading
Loading
Loading
+33 −0
Original line number Diff line number Diff line
@@ -392,6 +392,38 @@ static int dw_spi_mmio_probe(struct platform_device *pdev)
	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);