| From 3e45488069e20b07b83d8cbba88c7fa2b205e559 Mon Sep 17 00:00:00 2001 |
| From: Dave Stevenson <dave.stevenson@raspberrypi.com> |
| Date: Wed, 25 Mar 2020 18:01:04 +0000 |
| Subject: [PATCH] drm/vc4: Reset audio infoframe on encoder_enable if |
| previously streaming |
| |
| If the encoder is disabled and re-enabled (eg mode change) all infoframes |
| are reset, whilst the audio subsystem know nothing about this change. |
| The driver therefore needs to reinstate the audio infoframe for |
| itself. |
| |
| Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com> |
| --- |
| drivers/gpu/drm/vc4/vc4_hdmi.c | 12 ++++++++++++ |
| drivers/gpu/drm/vc4/vc4_hdmi.h | 2 ++ |
| 2 files changed, 14 insertions(+) |
| |
| --- a/drivers/gpu/drm/vc4/vc4_hdmi.c |
| +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c |
| @@ -344,8 +344,16 @@ static void vc4_hdmi_set_audio_infoframe |
| |
| static void vc4_hdmi_set_infoframes(struct drm_encoder *encoder) |
| { |
| + struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); |
| + |
| vc4_hdmi_set_avi_infoframe(encoder); |
| vc4_hdmi_set_spd_infoframe(encoder); |
| + /* |
| + * If audio was streaming, then we need to reenabled the audio |
| + * infoframe here during encoder_enable. |
| + */ |
| + if (vc4_hdmi->audio.streaming) |
| + vc4_hdmi_set_audio_infoframe(encoder); |
| } |
| |
| static void vc4_hdmi_encoder_disable(struct drm_encoder *encoder) |
| @@ -825,6 +833,7 @@ static void vc4_hdmi_audio_reset(struct |
| struct device *dev = &vc4_hdmi->pdev->dev; |
| int ret; |
| |
| + vc4_hdmi->audio.streaming = false; |
| ret = vc4_hdmi_stop_packet(encoder, HDMI_INFOFRAME_TYPE_AUDIO); |
| if (ret) |
| dev_err(dev, "Failed to stop audio infoframe: %d\n", ret); |
| @@ -928,6 +937,7 @@ static int vc4_hdmi_audio_trigger(struct |
| switch (cmd) { |
| case SNDRV_PCM_TRIGGER_START: |
| vc4_hdmi_set_audio_infoframe(encoder); |
| + vc4_hdmi->audio.streaming = true; |
| |
| if (vc4_hdmi->variant->phy_rng_enable) |
| vc4_hdmi->variant->phy_rng_enable(vc4_hdmi); |
| @@ -946,6 +956,8 @@ static int vc4_hdmi_audio_trigger(struct |
| if (vc4_hdmi->variant->phy_rng_disable) |
| vc4_hdmi->variant->phy_rng_disable(vc4_hdmi); |
| |
| + vc4_hdmi->audio.streaming = false; |
| + |
| break; |
| default: |
| break; |
| --- a/drivers/gpu/drm/vc4/vc4_hdmi.h |
| +++ b/drivers/gpu/drm/vc4/vc4_hdmi.h |
| @@ -101,6 +101,8 @@ struct vc4_hdmi_audio { |
| int channels; |
| struct snd_dmaengine_dai_dma_data dma_data; |
| struct snd_pcm_substream *substream; |
| + |
| + bool streaming; |
| }; |
| |
| /* General HDMI hardware state. */ |