|
@@ -88,7 +88,7 @@ static void pwm_lpss_prepare(struct pwm_lpss_chip *lpwm, struct pwm_device *pwm,
|
|
|
unsigned long long on_time_div;
|
|
|
unsigned long c = lpwm->info->clk_rate, base_unit_range;
|
|
|
unsigned long long base_unit, freq = NSEC_PER_SEC;
|
|
|
- u32 ctrl;
|
|
|
+ u32 orig_ctrl, ctrl;
|
|
|
|
|
|
do_div(freq, period_ns);
|
|
|
|
|
@@ -105,13 +105,17 @@ static void pwm_lpss_prepare(struct pwm_lpss_chip *lpwm, struct pwm_device *pwm,
|
|
|
do_div(on_time_div, period_ns);
|
|
|
on_time_div = 255ULL - on_time_div;
|
|
|
|
|
|
- ctrl = pwm_lpss_read(pwm);
|
|
|
+ orig_ctrl = ctrl = pwm_lpss_read(pwm);
|
|
|
ctrl &= ~PWM_ON_TIME_DIV_MASK;
|
|
|
ctrl &= ~(base_unit_range << PWM_BASE_UNIT_SHIFT);
|
|
|
base_unit &= base_unit_range;
|
|
|
ctrl |= (u32) base_unit << PWM_BASE_UNIT_SHIFT;
|
|
|
ctrl |= on_time_div;
|
|
|
- pwm_lpss_write(pwm, ctrl);
|
|
|
+
|
|
|
+ if (orig_ctrl != ctrl) {
|
|
|
+ pwm_lpss_write(pwm, ctrl);
|
|
|
+ pwm_lpss_write(pwm, ctrl | PWM_SW_UPDATE);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static inline void pwm_lpss_cond_enable(struct pwm_device *pwm, bool cond)
|
|
@@ -135,7 +139,6 @@ static int pwm_lpss_apply(struct pwm_chip *chip, struct pwm_device *pwm,
|
|
|
return ret;
|
|
|
}
|
|
|
pwm_lpss_prepare(lpwm, pwm, state->duty_cycle, state->period);
|
|
|
- pwm_lpss_write(pwm, pwm_lpss_read(pwm) | PWM_SW_UPDATE);
|
|
|
pwm_lpss_cond_enable(pwm, lpwm->info->bypass == false);
|
|
|
ret = pwm_lpss_wait_for_update(pwm);
|
|
|
if (ret) {
|
|
@@ -148,7 +151,6 @@ static int pwm_lpss_apply(struct pwm_chip *chip, struct pwm_device *pwm,
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
pwm_lpss_prepare(lpwm, pwm, state->duty_cycle, state->period);
|
|
|
- pwm_lpss_write(pwm, pwm_lpss_read(pwm) | PWM_SW_UPDATE);
|
|
|
return pwm_lpss_wait_for_update(pwm);
|
|
|
}
|
|
|
} else if (pwm_is_enabled(pwm)) {
|