@@ -33,7 +33,6 @@ struct pwm_fan_ctx {
struct mutex lock;
struct pwm_device *pwm;
- struct pwm_state pwm_state;
struct regulator *reg_en;
bool enabled;
@@ -87,7 +86,7 @@ static void sample_timer(struct timer_list *t)
static int pwm_fan_power_on(struct pwm_fan_ctx *ctx)
{
- struct pwm_state *state = &ctx->pwm_state;
+ struct pwm_state state;
int ret;
if (ctx->enabled)
@@ -99,8 +98,9 @@ static int pwm_fan_power_on(struct pwm_fan_ctx *ctx)
return ret;
}
- state->enabled = true;
- ret = pwm_apply_state(ctx->pwm, state);
+ pwm_get_state(ctx->pwm, &state);
+ state.enabled = true;
+ ret = pwm_apply_state(ctx->pwm, &state);
if (ret) {
dev_err(ctx->dev, "failed to enable PWM\n");
goto disable_regulator;
@@ -122,6 +122,7 @@ static int pwm_fan_power_off(struct pwm_fan_ctx *ctx)
if (!ctx->enabled)
return 0;
+ pwm_get_state(ctx->pwm, &state);
state.enabled = false;
state.duty_cycle = 0;
pwm_apply_state(ctx->pwm, &state);
@@ -135,16 +136,17 @@ static int pwm_fan_power_off(struct pwm_fan_ctx *ctx)
static int __set_pwm(struct pwm_fan_ctx *ctx, unsigned long pwm)
{
- struct pwm_state *state = &ctx->pwm_state;
+ struct pwm_state state;
unsigned long period;
int ret = 0;
mutex_lock(&ctx->lock);
if (pwm > 0) {
- period = state->period;
- state->duty_cycle = DIV_ROUND_UP(pwm * (period - 1), MAX_PWM);
- ret = pwm_apply_state(ctx->pwm, state);
+ pwm_get_state(ctx->pwm, &state);
+ period = state.period;
+ state.duty_cycle = DIV_ROUND_UP(pwm * (period - 1), MAX_PWM);
+ ret = pwm_apply_state(ctx->pwm, &state);
if (ret)
goto exit_set_pwm_err;
ret = pwm_fan_power_on(ctx);
@@ -338,6 +340,7 @@ static int pwm_fan_probe(struct platform_device *pdev)
struct thermal_cooling_device *cdev;
struct device *dev = &pdev->dev;
struct pwm_fan_ctx *ctx;
+ struct pwm_state state;
struct device *hwmon;
int ret;
const struct hwmon_channel_info **channels;
@@ -366,18 +369,25 @@ static int pwm_fan_probe(struct platform_device *pdev)
ctx->reg_en = NULL;
}
- pwm_init_state(ctx->pwm, &ctx->pwm_state);
+ pwm_init_state(ctx->pwm, &state);
/*
* __set_pwm assumes that MAX_PWM * (period - 1) fits into an unsigned
* long. Check this here to prevent the fan running at a too low
* frequency.
*/
- if (ctx->pwm_state.period > ULONG_MAX / MAX_PWM + 1) {
+ if (state.period > ULONG_MAX / MAX_PWM + 1) {
dev_err(dev, "Configured period too big\n");
return -EINVAL;
}
+ /* Apply modified PWM default state */
+ ret = pwm_apply_state(ctx->pwm, &state);
+ if (ret) {
+ dev_err(dev, "failed to apply initial PWM state: %d\n", ret);
+ return -EINVAL;
+ }
+
/*
* Set duty cycle to maximum allowed and enable PWM output as well as
* the regulator. In case of error nothing is changed
Each pwm device has already a pwm_state. Use this one instead of managing an own copy of it. Signed-off-by: Alexander Stein <alexander.stein@ew.tq-group.com> --- drivers/hwmon/pwm-fan.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-)