]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
i2c: imx-lpi2c: change to PIO mode in system-wide suspend/resume progress
authorCarlos Song <carlos.song@nxp.com>
Fri, 21 Nov 2025 03:00:30 +0000 (11:00 +0800)
committerWolfram Sang <wsa+renesas@sang-engineering.com>
Wed, 14 Jan 2026 11:58:26 +0000 (12:58 +0100)
EDMA resumes early and suspends late in the system power transition
sequence, while LPI2C enters the NOIRQ stage for both suspend and resume.
This means LPI2C resources become available before EDMA is fully resumed.
Once IRQs are enabled, a slave device may immediately trigger an LPI2C
transfer. If the transfer length meets DMA requirements, the driver will
attempt to use EDMA even though EDMA may still be unavailable.

This timing gap can lead to transfer failures. To prevent this, force
LPI2C to use PIO mode during system-wide suspend and resume transitions.
This reduces dependency on EDMA and avoids using an unready DMA resource.

Fixes: a09c8b3f9047 ("i2c: imx-lpi2c: add eDMA mode support for LPI2C")
Signed-off-by: Carlos Song <carlos.song@nxp.com>
Reviewed-by: Frank Li <Frank.Li@nxp.com>
Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
drivers/i2c/busses/i2c-imx-lpi2c.c

index 2a0962a0b441754577c15ef3a67a7640d41785cc..d882126c1778cbfd7434c66a6213ab773d41329f 100644 (file)
@@ -592,6 +592,13 @@ static bool is_use_dma(struct lpi2c_imx_struct *lpi2c_imx, struct i2c_msg *msg)
        if (!lpi2c_imx->can_use_dma)
                return false;
 
+       /*
+        * A system-wide suspend or resume transition is in progress. LPI2C should use PIO to
+        * transfer data to avoid issue caused by no ready DMA HW resource.
+        */
+       if (pm_suspend_in_progress())
+               return false;
+
        /*
         * When the length of data is less than I2C_DMA_THRESHOLD,
         * cpu mode is used directly to avoid low performance.