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);
 
        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)
                                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) {
                        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)) {