aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon/pwm-fan.c
diff options
context:
space:
mode:
authorThierry Reding <treding@nvidia.com>2018-09-21 06:10:48 -0400
committerGuenter Roeck <linux@roeck-us.net>2018-10-10 23:37:13 -0400
commit95dcd64bc5a27080beaa344edfe5bdcca3d2e7dc (patch)
tree100a7533f4fc8fbcc64d28fc37d8b951c33bd62e /drivers/hwmon/pwm-fan.c
parent9f67f7583e77fe5dc57aab3a6159c2642544eaad (diff)
hwmon: (pwm-fan) Set fan speed to 0 on suspend
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> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Diffstat (limited to 'drivers/hwmon/pwm-fan.c')
-rw-r--r--drivers/hwmon/pwm-fan.c12
1 files changed, 11 insertions, 1 deletions
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)
294static int pwm_fan_suspend(struct device *dev) 294static int pwm_fan_suspend(struct device *dev)
295{ 295{
296 struct pwm_fan_ctx *ctx = dev_get_drvdata(dev); 296 struct pwm_fan_ctx *ctx = dev_get_drvdata(dev);
297 struct pwm_args args;
298 int ret;
299
300 pwm_get_args(ctx->pwm, &args);
301
302 if (ctx->pwm_value) {
303 ret = pwm_config(ctx->pwm, 0, args.period);
304 if (ret < 0)
305 return ret;
297 306
298 if (ctx->pwm_value)
299 pwm_disable(ctx->pwm); 307 pwm_disable(ctx->pwm);
308 }
309
300 return 0; 310 return 0;
301} 311}
302 312