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

Viorel Suman (OSS) viorel.suman at oss.nxp.com
Wed Mar 11 03:25:20 PDT 2026


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 at oss.nxp.com>
> 
> 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



More information about the linux-arm-kernel mailing list