diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2022-01-20 13:25:01 +0200 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2022-01-20 13:25:01 +0200 |
commit | 41652aae67c79a50d56174468de03bdb04d61d4b (patch) | |
tree | c4ce80b1654c40d85410ff81b730888311d78fa6 /drivers/pwm/pwm-img.c | |
parent | fa2e1ba3e9e39072fa7a6a9d11ac432c505b4ac7 (diff) | |
parent | 3f0565451cc0c5158513af0bc4e91aa8fb0b5e75 (diff) | |
download | linux-41652aae67c79a50d56174468de03bdb04d61d4b.tar.gz linux-41652aae67c79a50d56174468de03bdb04d61d4b.tar.bz2 linux-41652aae67c79a50d56174468de03bdb04d61d4b.zip |
Merge tag 'pwm/for-5.17-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/thierry.reding/linux-pwm
Pull pwm updates from Thierry Reding:
"This contains a number of nice cleanups and improvements for the core
and various drivers, as well as a minor tweak to the json-schema
device tree bindings"
* tag 'pwm/for-5.17-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/thierry.reding/linux-pwm:
dt-bindings: pwm: Avoid selecting schema on node name match
pwm: img: Use only a single idiom to get a runtime PM reference
pwm: vt8500: Implement .apply() callback
pwm: img: Implement .apply() callback
pwm: twl: Implement .apply() callback
pwm: Restore initial state if a legacy callback fails
pwm: Prevent a glitch for legacy drivers
pwm: Move legacy driver handling into a dedicated function
Diffstat (limited to 'drivers/pwm/pwm-img.c')
-rw-r--r-- | drivers/pwm/pwm-img.c | 35 |
1 files changed, 28 insertions, 7 deletions
diff --git a/drivers/pwm/pwm-img.c b/drivers/pwm/pwm-img.c index f97f82548293..5996049f66ec 100644 --- a/drivers/pwm/pwm-img.c +++ b/drivers/pwm/pwm-img.c @@ -128,11 +128,9 @@ static int img_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, duty = DIV_ROUND_UP(timebase * duty_ns, period_ns); - ret = pm_runtime_get_sync(chip->dev); - if (ret < 0) { - pm_runtime_put_autosuspend(chip->dev); + ret = pm_runtime_resume_and_get(chip->dev); + if (ret < 0) return ret; - } val = img_pwm_readl(pwm_chip, PWM_CTRL_CFG); val &= ~(PWM_CTRL_CFG_DIV_MASK << PWM_CTRL_CFG_DIV_SHIFT(pwm->hwpwm)); @@ -184,10 +182,33 @@ static void img_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm) pm_runtime_put_autosuspend(chip->dev); } +static int img_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, + const struct pwm_state *state) +{ + int err; + + if (state->polarity != PWM_POLARITY_NORMAL) + return -EINVAL; + + if (!state->enabled) { + if (pwm->state.enabled) + img_pwm_disable(chip, pwm); + + return 0; + } + + err = img_pwm_config(pwm->chip, pwm, state->duty_cycle, state->period); + if (err) + return err; + + if (!pwm->state.enabled) + err = img_pwm_enable(chip, pwm); + + return err; +} + static const struct pwm_ops img_pwm_ops = { - .config = img_pwm_config, - .enable = img_pwm_enable, - .disable = img_pwm_disable, + .apply = img_pwm_apply, .owner = THIS_MODULE, }; |