• Bryan O'Donoghue's avatar
    media: qcom: camss: Fix VFE-17x vfe_disable_output() · 3143ad28
    Bryan O'Donoghue authored
    There are two problems with the current vfe_disable_output() routine.
    
    Firstly we rightly use a spinlock to protect output->gen2.active_num
    everywhere except for in the IDLE timeout path of vfe_disable_output().
    Even if that is not racy "in practice" somehow it is by happenstance not
    by design.
    
    Secondly we do not get consistent behaviour from this routine. On
    sc8280xp 50% of the time I get "VFE idle timeout - resetting". In this
    case the subsequent capture will succeed. The other 50% of the time, we
    don't hit the idle timeout, never do the VFE reset and subsequent
    captures stall indefinitely.
    
    Rewrite the vfe_disable_output() routine to
    
    - Quiesce write masters with vfe_wm_stop()
    - Set active_num = 0
    
    remembering to hold the spinlock when we do so followed by
    
    - Reset the VFE
    
    Testing on sc8280xp and sdm845 shows this to be a valid fix.
    
    Fixes: 7319cdf1 ("media: camss: Add support for VFE hardware version Titan 170")
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarBryan O'Donoghue <bryan.odonoghue@linaro.org>
    Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
    3143ad28
camss-vfe-170.c 20.4 KB