[PATCH v2 3/3] spi: nxp-fspi: check runtime PM get in cleanup

Jiawen Liu <[email protected]>
Newsgroups dev.linux.lists.imx,org.kernel.vger.linux-kernel,org.kernel.vger.linux-spi
Message-ID <[email protected]>
nxp_fspi_cleanup() resumes the device before disabling the controller,
because the cleanup path writes to controller registers. The return value
from the runtime PM get is currently ignored, so a failed resume can be
followed by MMIO access while the controller clock is still gated.

Use PM_RUNTIME_ACQUIRE() and check the acquire result before touching the
registers. If the device cannot be resumed, skip the hardware-disable MMIO
write and continue with the remaining cleanup.

Signed-off-by: Jiawen Liu <[email protected]>
---
 drivers/spi/spi-nxp-fspi.c | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/drivers/spi/spi-nxp-fspi.c b/drivers/spi/spi-nxp-fspi.c
index 3f1c3ed748eb..2671ffb49096 100644
--- a/drivers/spi/spi-nxp-fspi.c
+++ b/drivers/spi/spi-nxp-fspi.c
@@ -1268,14 +1268,21 @@ static const struct spi_controller_mem_caps nxp_fspi_mem_caps_disable_dtr = {
 static void nxp_fspi_cleanup(void *data)
 {
 	struct nxp_fspi *f = data;
+	int ret;
 
-	/* enable clock first since there is register access */
-	pm_runtime_get_sync(f->dev);
+	{
+		/* enable clock first since there is register access */
+		PM_RUNTIME_ACQUIRE(f->dev, pm);
 
-	/* disable the hardware */
-	fspi_writel(f, FSPI_MCR0_MDIS, f->iobase + FSPI_MCR0);
+		ret = PM_RUNTIME_ACQUIRE_ERR(&pm);
+		if (ret < 0) {
+			dev_warn(f->dev, "Failed to enable clock for cleanup: %d\n", ret);
+		} else {
+			/* disable the hardware */
+			fspi_writel(f, FSPI_MCR0_MDIS, f->iobase + FSPI_MCR0);
+		}
+	}
 
-	pm_runtime_put_noidle(f->dev);
 	nxp_fspi_clk_disable_unprep(f);
 
 	if (f->ahb_addr)
-- 
2.34.1
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.