drm/i2c: tda998x: avoid race when programming audio
authorRussell King <rmk+kernel@armlinux.org.uk>
Wed, 2 Nov 2016 21:38:34 +0000 (21:38 +0000)
committerRussell King <rmk+kernel@armlinux.org.uk>
Fri, 18 Nov 2016 00:00:40 +0000 (00:00 +0000)
Avoid a race between programming audio and an in-progress mode set.
A mode set is complex, and disables the ability to send infoframes
to the sink, and is disruptive to audio - we have to mute the audio
FIFO while doing a mode set.

If an attempt is made to start up the audio side, we will undo the
audio FIFO mute before the mode set has completed.

Move the lock so that we prevent audio interfering with an in-progress
mode set.

Tested-by: Jon Medhurst <tixy@linaro.org>
Acked-by: Jon Medhurst <tixy@linaro.org>
Tested-by: Jyri Sarha <jsarha@ti.com>
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
drivers/gpu/drm/i2c/tda998x_drv.c

index 422d63d5fb756fb6c5bab4730435a4429aed7673..dd183cee98b0384c9dc23b06dae8bf8de5b53b59 100644 (file)
@@ -971,6 +971,8 @@ tda998x_encoder_mode_set(struct drm_encoder *encoder,
                        div = 3;
        }
 
+       mutex_lock(&priv->audio_mutex);
+
        /* mute the audio FIFO: */
        reg_set(priv, REG_AIP_CNTRL_0, AIP_CNTRL_0_RST_FIFO);
 
@@ -1064,8 +1066,6 @@ tda998x_encoder_mode_set(struct drm_encoder *encoder,
        /* must be last register set: */
        reg_write(priv, REG_TBG_CNTRL_0, 0);
 
-       mutex_lock(&priv->audio_mutex);
-
        priv->tmds_clock = adjusted_mode->clock;
 
        /* Only setup the info frames if the sink is HDMI */