]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
spi: spi-fsl-dspi: Reinitialize DSPI regs after resuming for S32G
authorLarisa Grigore <larisa.grigore@nxp.com>
Thu, 22 May 2025 14:51:39 +0000 (15:51 +0100)
committerMark Brown <broonie@kernel.org>
Sun, 8 Jun 2025 22:35:35 +0000 (23:35 +0100)
After resuming, DSPI registers (MCR and SR) need to be reinitialized for
S32G platforms.

Signed-off-by: Larisa Grigore <larisa.grigore@nxp.com>
Signed-off-by: James Clark <james.clark@linaro.org>
Link: https://patch.msgid.link/20250522-james-nxp-spi-v2-10-bea884630cfb@linaro.org
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-fsl-dspi.c

index db5a2ed66f68b96bda0f985f430d40280b6a9a5c..a3efe1bd3b376efd275b6ba1abfff7994405a5b1 100644 (file)
@@ -1284,41 +1284,6 @@ static const struct of_device_id fsl_dspi_dt_ids[] = {
 };
 MODULE_DEVICE_TABLE(of, fsl_dspi_dt_ids);
 
-#ifdef CONFIG_PM_SLEEP
-static int dspi_suspend(struct device *dev)
-{
-       struct fsl_dspi *dspi = dev_get_drvdata(dev);
-
-       if (dspi->irq)
-               disable_irq(dspi->irq);
-       spi_controller_suspend(dspi->ctlr);
-       clk_disable_unprepare(dspi->clk);
-
-       pinctrl_pm_select_sleep_state(dev);
-
-       return 0;
-}
-
-static int dspi_resume(struct device *dev)
-{
-       struct fsl_dspi *dspi = dev_get_drvdata(dev);
-       int ret;
-
-       pinctrl_pm_select_default_state(dev);
-
-       ret = clk_prepare_enable(dspi->clk);
-       if (ret)
-               return ret;
-       spi_controller_resume(dspi->ctlr);
-       if (dspi->irq)
-               enable_irq(dspi->irq);
-
-       return 0;
-}
-#endif /* CONFIG_PM_SLEEP */
-
-static SIMPLE_DEV_PM_OPS(dspi_pm, dspi_suspend, dspi_resume);
-
 static int dspi_init(struct fsl_dspi *dspi)
 {
        unsigned int mcr;
@@ -1354,6 +1319,48 @@ static int dspi_init(struct fsl_dspi *dspi)
        return 0;
 }
 
+#ifdef CONFIG_PM_SLEEP
+static int dspi_suspend(struct device *dev)
+{
+       struct fsl_dspi *dspi = dev_get_drvdata(dev);
+
+       if (dspi->irq)
+               disable_irq(dspi->irq);
+       spi_controller_suspend(dspi->ctlr);
+       clk_disable_unprepare(dspi->clk);
+
+       pinctrl_pm_select_sleep_state(dev);
+
+       return 0;
+}
+
+static int dspi_resume(struct device *dev)
+{
+       struct fsl_dspi *dspi = dev_get_drvdata(dev);
+       int ret;
+
+       pinctrl_pm_select_default_state(dev);
+
+       ret = clk_prepare_enable(dspi->clk);
+       if (ret)
+               return ret;
+       spi_controller_resume(dspi->ctlr);
+
+       ret = dspi_init(dspi);
+       if (ret) {
+               dev_err(dev, "failed to initialize dspi during resume\n");
+               return ret;
+       }
+
+       if (dspi->irq)
+               enable_irq(dspi->irq);
+
+       return 0;
+}
+#endif /* CONFIG_PM_SLEEP */
+
+static SIMPLE_DEV_PM_OPS(dspi_pm, dspi_suspend, dspi_resume);
+
 static int dspi_target_abort(struct spi_controller *host)
 {
        struct fsl_dspi *dspi = spi_controller_get_devdata(host);