Re: [PATCH v2] pwm: imx-tpm: keep channel state instead of counting

From: Viorel Suman (OSS)

Date: Wed Mar 11 2026 - 06:28:31 EST


Hello,

On 26-03-05 10:29:21, Uwe Kleine-König wrote:
> 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) <viorel.suman@xxxxxxxxxxx>
>
> 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;
> + }
> +

Yes, the change above would be enough, will send v3.

Regards,
Viorel