[PATCH] pwm: berlin: Fix wrong register in suspend/resume

Jisheng Zhang posted 1 patch 4 months ago
There is a newer version of this series
drivers/pwm/pwm-berlin.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
[PATCH] pwm: berlin: Fix wrong register in suspend/resume
Posted by Jisheng Zhang 4 months ago
The 'enable' register should be BERLIN_PWM_EN rather than
BERLIN_PWM_ENABLE.

Fixes: bbf0722c1c66 ("pwm: berlin: Add suspend/resume support")
Signed-off-by: Jisheng Zhang <jszhang@kernel.org>
---
 drivers/pwm/pwm-berlin.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/pwm/pwm-berlin.c b/drivers/pwm/pwm-berlin.c
index 831aed228caf..858d36991374 100644
--- a/drivers/pwm/pwm-berlin.c
+++ b/drivers/pwm/pwm-berlin.c
@@ -234,7 +234,7 @@ static int berlin_pwm_suspend(struct device *dev)
 	for (i = 0; i < chip->npwm; i++) {
 		struct berlin_pwm_channel *channel = &bpc->channel[i];
 
-		channel->enable = berlin_pwm_readl(bpc, i, BERLIN_PWM_ENABLE);
+		channel->enable = berlin_pwm_readl(bpc, i, BERLIN_PWM_EN);
 		channel->ctrl = berlin_pwm_readl(bpc, i, BERLIN_PWM_CONTROL);
 		channel->duty = berlin_pwm_readl(bpc, i, BERLIN_PWM_DUTY);
 		channel->tcnt = berlin_pwm_readl(bpc, i, BERLIN_PWM_TCNT);
@@ -262,7 +262,7 @@ static int berlin_pwm_resume(struct device *dev)
 		berlin_pwm_writel(bpc, i, channel->ctrl, BERLIN_PWM_CONTROL);
 		berlin_pwm_writel(bpc, i, channel->duty, BERLIN_PWM_DUTY);
 		berlin_pwm_writel(bpc, i, channel->tcnt, BERLIN_PWM_TCNT);
-		berlin_pwm_writel(bpc, i, channel->enable, BERLIN_PWM_ENABLE);
+		berlin_pwm_writel(bpc, i, channel->enable, BERLIN_PWM_EN);
 	}
 
 	return 0;
-- 
2.50.0
Re: [PATCH] pwm: berlin: Fix wrong register in suspend/resume
Posted by Uwe Kleine-König 4 months ago
Hello,

On Fri, Aug 15, 2025 at 11:10:16AM +0800, Jisheng Zhang wrote:
> The 'enable' register should be BERLIN_PWM_EN rather than
> BERLIN_PWM_ENABLE.
> 
> Fixes: bbf0722c1c66 ("pwm: berlin: Add suspend/resume support")
> Signed-off-by: Jisheng Zhang <jszhang@kernel.org>
> ---
>  drivers/pwm/pwm-berlin.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/pwm/pwm-berlin.c b/drivers/pwm/pwm-berlin.c
> index 831aed228caf..858d36991374 100644
> --- a/drivers/pwm/pwm-berlin.c
> +++ b/drivers/pwm/pwm-berlin.c
> @@ -234,7 +234,7 @@ static int berlin_pwm_suspend(struct device *dev)
>  	for (i = 0; i < chip->npwm; i++) {
>  		struct berlin_pwm_channel *channel = &bpc->channel[i];
>  
> -		channel->enable = berlin_pwm_readl(bpc, i, BERLIN_PWM_ENABLE);
> +		channel->enable = berlin_pwm_readl(bpc, i, BERLIN_PWM_EN);

BERLIN_PWM_ENABLE is 1 and BERLIN_PWM_EN is 0. What is the effect? Is
the low bit just ignored and the right thing happens? Or does this
result in a bus exception and the machine catches fire?

If it's more the latter than the former, I wonder how that didn't pop up
earlier.

Best regards
Uwe
Re: [PATCH] pwm: berlin: Fix wrong register in suspend/resume
Posted by Jisheng Zhang 4 months ago
On Sun, Aug 17, 2025 at 12:52:01PM +0200, Uwe Kleine-König wrote:
> Hello,

Hi,

> 
> On Fri, Aug 15, 2025 at 11:10:16AM +0800, Jisheng Zhang wrote:
> > The 'enable' register should be BERLIN_PWM_EN rather than
> > BERLIN_PWM_ENABLE.
> > 
> > Fixes: bbf0722c1c66 ("pwm: berlin: Add suspend/resume support")
> > Signed-off-by: Jisheng Zhang <jszhang@kernel.org>
> > ---
> >  drivers/pwm/pwm-berlin.c | 4 ++--
> >  1 file changed, 2 insertions(+), 2 deletions(-)
> > 
> > diff --git a/drivers/pwm/pwm-berlin.c b/drivers/pwm/pwm-berlin.c
> > index 831aed228caf..858d36991374 100644
> > --- a/drivers/pwm/pwm-berlin.c
> > +++ b/drivers/pwm/pwm-berlin.c
> > @@ -234,7 +234,7 @@ static int berlin_pwm_suspend(struct device *dev)
> >  	for (i = 0; i < chip->npwm; i++) {
> >  		struct berlin_pwm_channel *channel = &bpc->channel[i];
> >  
> > -		channel->enable = berlin_pwm_readl(bpc, i, BERLIN_PWM_ENABLE);
> > +		channel->enable = berlin_pwm_readl(bpc, i, BERLIN_PWM_EN);
> 
> BERLIN_PWM_ENABLE is 1 and BERLIN_PWM_EN is 0. What is the effect? Is
> the low bit just ignored and the right thing happens? Or does this

operate the wrong address then kernel panic

> result in a bus exception and the machine catches fire?

Yep, cpu exception then kernel panic.

> 
> If it's more the latter than the former, I wonder how that didn't pop up
> earlier.

This bug has been fixed in vendor's repo for a long time, it's just
because we didn't upstream the fix.

Thanks
Re: [PATCH] pwm: berlin: Fix wrong register in suspend/resume
Posted by Uwe Kleine-König 4 months ago
Hello,

On Mon, Aug 18, 2025 at 08:09:33PM +0800, Jisheng Zhang wrote:
> On Sun, Aug 17, 2025 at 12:52:01PM +0200, Uwe Kleine-König wrote:
> > On Fri, Aug 15, 2025 at 11:10:16AM +0800, Jisheng Zhang wrote:
> > > diff --git a/drivers/pwm/pwm-berlin.c b/drivers/pwm/pwm-berlin.c
> > > index 831aed228caf..858d36991374 100644
> > > --- a/drivers/pwm/pwm-berlin.c
> > > +++ b/drivers/pwm/pwm-berlin.c
> > > @@ -234,7 +234,7 @@ static int berlin_pwm_suspend(struct device *dev)
> > >  	for (i = 0; i < chip->npwm; i++) {
> > >  		struct berlin_pwm_channel *channel = &bpc->channel[i];
> > >  
> > > -		channel->enable = berlin_pwm_readl(bpc, i, BERLIN_PWM_ENABLE);
> > > +		channel->enable = berlin_pwm_readl(bpc, i, BERLIN_PWM_EN);
> > 
> > BERLIN_PWM_ENABLE is 1 and BERLIN_PWM_EN is 0. What is the effect? Is
> > the low bit just ignored and the right thing happens? Or does this
> 
> operate the wrong address then kernel panic
> 
> > result in a bus exception and the machine catches fire?
> 
> Yep, cpu exception then kernel panic.

Can you please mention that in the commit log to make reader able to
judge the importance, please?

> > If it's more the latter than the former, I wonder how that didn't pop up
> > earlier.
> 
> This bug has been fixed in vendor's repo for a long time, it's just
> because we didn't upstream the fix.

Wow.

Best regards
Uwe