• Hans de Goede's avatar
    pwm: lpss: Only set update bit if we are actually changing the settings · 4043bc0f
    Hans de Goede authored
    [ Upstream commit 2153bbc1 ]
    
    According to the datasheet the update bit must be set if the on-time-div
    or the base-unit changes.
    
    Now that we properly order device resume on Cherry Trail so that the GFX0
    _PS0 method no longer exits with an error, we end up with a sequence of
    events where we are writing the same values twice in a row.
    
    First the _PS0 method restores the duty cycle of 0% the GPU driver set
    on suspend and then the GPU driver first updates just the enabled bit in
    the pwm_state from 0 to 1, causing us to write the same values again,
    before restoring the pre-suspend duty-cycle in a separate pwm_apply call.
    
    When writing the update bit the second time, without changing any of
    the values the update bit clears immediately / instantly, instead of
    staying 1 for a while as usual. After this the next setting of the update
    bit seems to be ignored, causing the restoring of the pre-suspend
    duty-cycle to not get applied. This makes the backlight come up with
    a 0% dutycycle after suspend/resume.
    
    Any further brightness changes after this do work.
    
    This commit moves the setting of the update bit into pwm_lpss_prepare()
    and only sets the bit if we have actually changed any of the values.
    
    This avoids the setting of the update bit the second time we configure
    the PWM to 0% dutycycle, this fixes the backlight coming up with 0%
    duty-cycle after a suspend/resume.
    Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
    Signed-off-by: default avatarThierry Reding <thierry.reding@gmail.com>
    Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
    4043bc0f
pwm-lpss.c 6.37 KB