Skip to content

Commit 1695b42

Browse files
Uwe Kleine-Königthierryreding
authored andcommitted
pwm: sifive: Simplify clk handling
The clk is necessary for both register access and (enabled) operation of the PWM. Instead of clk_enable() update_hw() if pwm_got_enabled(): clk_enable() elif pwm_got_disabled(): clk_disable() clk_disable() which is some cases only calls clk_enable() to immediately afterwards call clk_disable again, do: if (!prev_state.enabled) clk_enable() # clk enabled exactly once update_hw() if (!next_state.enabled) clk_disable() which is much easier. Signed-off-by: Uwe Kleine-König <[email protected]> Tested-by: Emil Renner Berthing <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
1 parent 3586b02 commit 1695b42

File tree

1 file changed

+13
-13
lines changed

1 file changed

+13
-13
lines changed

drivers/pwm/pwm-sifive.c

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -168,24 +168,24 @@ static int pwm_sifive_apply(struct pwm_chip *chip, struct pwm_device *pwm,
168168
}
169169
mutex_unlock(&ddata->lock);
170170

171-
ret = clk_enable(ddata->clk);
172-
if (ret) {
173-
dev_err(ddata->chip.dev, "Enable clk failed\n");
174-
return ret;
171+
/*
172+
* If the PWM is enabled the clk is already on. So only enable it
173+
* conditionally to have it on exactly once afterwards independent of
174+
* the PWM state.
175+
*/
176+
if (!enabled) {
177+
ret = clk_enable(ddata->clk);
178+
if (ret) {
179+
dev_err(ddata->chip.dev, "Enable clk failed\n");
180+
return ret;
181+
}
175182
}
176183

177184
writel(frac, ddata->regs + PWM_SIFIVE_PWMCMP(pwm->hwpwm));
178185

179-
if (state->enabled != enabled) {
180-
if (state->enabled) {
181-
if (clk_enable(ddata->clk))
182-
dev_err(ddata->chip.dev, "Enable clk failed\n");
183-
} else {
184-
clk_disable(ddata->clk);
185-
}
186-
}
186+
if (!state->enabled)
187+
clk_disable(ddata->clk);
187188

188-
clk_disable(ddata->clk);
189189
return 0;
190190
}
191191

0 commit comments

Comments
 (0)