Hello, On Mon, Feb 02, 2026 at 12:47:38PM +0200, Viorel Suman (OSS) wrote: > On a soft reset TPM PWM IP may preserve its internal state from > previous runtime, therefore on a subsequent OS boot and driver > probe "enable_count" value and TPM PWM IP internal channels > "enabled" states may get unaligned. In consequence on a suspend/resume > cycle the call "if (--tpm->enable_count == 0)" may lead to > "enable_count" overflow the system being blocked from entering > suspend due to: > > if (tpm->enable_count > 0) > return -EBUSY; > > Fix the problem by replacing counting logic with per-channel state > handling and by aligning IP and driver state at probe. > > Signed-off-by: Viorel Suman (OSS) I wonder if the following change would be enough: diff --git a/drivers/pwm/pwm-imx-tpm.c b/drivers/pwm/pwm-imx-tpm.c index 5b399de16d60..36f873133f94 100644 --- a/drivers/pwm/pwm-imx-tpm.c +++ b/drivers/pwm/pwm-imx-tpm.c @@ -352,7 +352,7 @@ static int pwm_imx_tpm_probe(struct platform_device *pdev) struct clk *clk; void __iomem *base; int ret; - unsigned int npwm; + unsigned int i, npwm; u32 val; base = devm_platform_ioremap_resource(pdev, 0); @@ -382,6 +382,12 @@ static int pwm_imx_tpm_probe(struct platform_device *pdev) mutex_init(&tpm->lock); + for (i = 0; i < npwm; ++i) { + val = readl(base + PWM_IMX_TPM_CnSC(i)); + if (FIELD_GET(PWM_IMX_TPM_CnSC_ELS, val)) + ++tpm->enable_count; + } + ret = devm_pwmchip_add(&pdev->dev, chip); if (ret) return dev_err_probe(&pdev->dev, ret, "failed to add PWM chip\n"); Best regards Uwe