This code has two problems. First, it passes the wrong bit parameter to test_bit(). Second, it mixes using PWMF_REQUESTED in test_bit() and in open coded bit tests. The test_bit() function takes a bit number. In other words, "if (test_bit(0, &flags))" is the equivalent of "if (flags & (1 << 0))". Passing (1 << 0) to test_bit() is like writing BIT(BIT(0)). It's a double shift bug. In pwm_samsung_resume() these issues mean that the flag is never set and the function is essentially a no-op. Fixes: 4c9548d24c0d ("pwm: samsung: Put per-channel data into driver data") Signed-off-by: Dan Carpenter <dan.carpenter@xxxxxxxxxx> --- >From static analysis and not tested. drivers/pwm/pwm-samsung.c | 2 +- include/linux/pwm.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/pwm/pwm-samsung.c b/drivers/pwm/pwm-samsung.c index 10fe2c13cd80..acf4a0d8d990 100644 --- a/drivers/pwm/pwm-samsung.c +++ b/drivers/pwm/pwm-samsung.c @@ -630,7 +630,7 @@ static int pwm_samsung_resume(struct device *dev) struct pwm_device *pwm = &chip->pwms[i]; struct samsung_pwm_channel *chan = &our_chip->channel[i]; - if (!(pwm->flags & PWMF_REQUESTED)) + if (!test_bit(PWMF_REQUESTED, &pwm->flags)) continue; if (our_chip->variant.output_mask & BIT(i)) diff --git a/include/linux/pwm.h b/include/linux/pwm.h index e3b437587b32..3eee5bf367fb 100644 --- a/include/linux/pwm.h +++ b/include/linux/pwm.h @@ -41,8 +41,8 @@ struct pwm_args { }; enum { - PWMF_REQUESTED = 1 << 0, - PWMF_EXPORTED = 1 << 1, + PWMF_REQUESTED = 0, + PWMF_EXPORTED = 1, }; /* -- 2.39.2