• Sjoerd Simons's avatar
    pwm: samsung: Fix output race on disabling · 4a1c683c
    Sjoerd Simons authored
    When disabling the Samsung PWM the output state remains at the level it
    was at the end of a PWM cycle. In other words, calling pwm_disable()
    when at 100% duty cycle will keep the output active, while at all other
    settings the output will go/stay inactive. On top of that the Samsung
    PWM settings are double-buffered, which means the new settings only get
    applied at the start of a new PWM cycle.
    
    This results in a race if the PWM is at 100% duty cycle and a driver
    calls:
    
      pwm_config(pwm, 0, period);
      pwm_disable(pwm);
    
    In this case the PWMs output will unexpectedly stay active, unless a new
    PWM cycle happened to start between the register writes in pwm_config()
    and pwm_disable(). As far as I can tell this is a regression introduced
    by 3bdf8781, before that a call to pwm_config() would call
    pwm_samsung_enable() which, while heavy-handed, made sure the expected
    settings were live.
    
    To resolve this, while not re-introducing the issues 3bdf8781 (flickering
    as the PWM got reset while in a PWM cycle) fixed, only force an update
    of the settings when at 100% duty cycle, which shouldn't have any
    noticeable effect on the output but is enough to ensure the behaviour is
    as expected on disable.
    Signed-off-by: default avatarSjoerd Simons <sjoerd.simons@collabora.co.uk>
    Reviewed-by: default avatarJavier Martinez Canillas <javier.martinez@collabora.co.uk>
    Acked-by: default avatarLukasz Majewski <l.majewski@samsung.com>
    Signed-off-by: default avatarThierry Reding <thierry.reding@gmail.com>
    4a1c683c
pwm-samsung.c 16.7 KB