Message ID | 20180921101048.11679-2-thierry.reding@gmail.com (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
Series | [1/2] hwmon: pwm-fan: Silence error on probe deferral | expand |
On Fri, Sep 21, 2018 at 12:10:48PM +0200, Thierry Reding wrote: > From: Thierry Reding <treding@nvidia.com> > > Technically this is not required because disabling the PWM should be > enough. However, when support for atomic operations was implemented in > the PWM subsystem, only actual changes to the PWM channel are applied > during pwm_config(), which means that during after resume from suspend > the old settings won't be applied. > > One possible solution is for the PWM driver to implement its own PM > operations such that settings from before suspend get applied on resume. > This has the disadvantage of completely ignoring any particular ordering > requirements that PWM user drivers might have, so it is best to leave it > up to the user drivers to apply the settings that they want at the > appropriate time. > > Another way to solve this would be to read back the current state of the > PWM at the time of resume. That way, in case the configuration was lost > during suspend, applying the old settings in PWM user drivers would > actually get them applied because they differ from the current settings. > However, not all PWM drivers support reading the hardware state, and not > all hardware may support it. > > The best workaround at this point seems to be to let PWM user drivers > tell the PWM subsystem that the PWM is turned off by, in addition to > disabling it, also setting the duty cycle to 0. This causes the resume > operation to apply a configuration that is different from the current > configuration, resulting in the proper state from before suspend getting > restored. > > Signed-off-by: Thierry Reding <treding@nvidia.com> Applied. Thanks, Guenter
diff --git a/drivers/hwmon/pwm-fan.c b/drivers/hwmon/pwm-fan.c index 936aaf76dd6e..7da6a160d45a 100644 --- a/drivers/hwmon/pwm-fan.c +++ b/drivers/hwmon/pwm-fan.c @@ -294,9 +294,19 @@ static int pwm_fan_remove(struct platform_device *pdev) static int pwm_fan_suspend(struct device *dev) { struct pwm_fan_ctx *ctx = dev_get_drvdata(dev); + struct pwm_args args; + int ret; + + pwm_get_args(ctx->pwm, &args); + + if (ctx->pwm_value) { + ret = pwm_config(ctx->pwm, 0, args.period); + if (ret < 0) + return ret; - if (ctx->pwm_value) pwm_disable(ctx->pwm); + } + return 0; }