diff mbox series

[v2] drm/tegra: hdmi: Setup audio only if configured

Message ID 20190416151644.30974-1-thierry.reding@gmail.com
State Accepted
Headers show
Series [v2] drm/tegra: hdmi: Setup audio only if configured | expand

Commit Message

Thierry Reding April 16, 2019, 3:16 p.m. UTC
From: Thierry Reding <treding@nvidia.com>

The audio configuration is only valid if the HDMI codec has been
properly set up. Do not attempt to set up audio before that happens
because it causes a division by zero.

Note that this is only problematic on Tegra20 and Tegra30. Later chips
implement the division instructions which return zero when dividing by
zero and don't throw an exception.

Fixes: db5adf4d6dce ("drm/tegra: hdmi: Fix audio to work with any pixel clock rate")
Reported-by: Marcel Ziswiler <marcel.ziswiler@toradex.com>
Signed-off-by: Thierry Reding <treding@nvidia.com>
---
Changes in v2:
- setup audio at ->enable() time if it has been configured, otherwise
  audio playback needs to be restarted after the display goes through
  a disable/enable cycle

 drivers/gpu/drm/tegra/hdmi.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

Comments

Dmitry Osipenko April 16, 2019, 5:42 p.m. UTC | #1
16.04.2019 18:16, Thierry Reding пишет:
> From: Thierry Reding <treding@nvidia.com>
> 
> The audio configuration is only valid if the HDMI codec has been
> properly set up. Do not attempt to set up audio before that happens
> because it causes a division by zero.
> 
> Note that this is only problematic on Tegra20 and Tegra30. Later chips
> implement the division instructions which return zero when dividing by
> zero and don't throw an exception.
> 
> Fixes: db5adf4d6dce ("drm/tegra: hdmi: Fix audio to work with any pixel clock rate")
> Reported-by: Marcel Ziswiler <marcel.ziswiler@toradex.com>
> Signed-off-by: Thierry Reding <treding@nvidia.com>
> ---
> Changes in v2:
> - setup audio at ->enable() time if it has been configured, otherwise
>   audio playback needs to be restarted after the display goes through
>   a disable/enable cycle
> 
>  drivers/gpu/drm/tegra/hdmi.c | 12 +++++++++---
>  1 file changed, 9 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/tegra/hdmi.c b/drivers/gpu/drm/tegra/hdmi.c
> index 47c55974756d..d23c4bfde790 100644
> --- a/drivers/gpu/drm/tegra/hdmi.c
> +++ b/drivers/gpu/drm/tegra/hdmi.c
> @@ -1260,9 +1260,15 @@ static void tegra_hdmi_encoder_enable(struct drm_encoder *encoder)
>  
>  	hdmi->dvi = !tegra_output_is_hdmi(output);
>  	if (!hdmi->dvi) {
> -		err = tegra_hdmi_setup_audio(hdmi);
> -		if (err < 0)
> -			hdmi->dvi = true;
> +		/*
> +		 * Make sure that the audio format has been configured before
> +		 * enabling audio, otherwise we may try to divide by zero.
> +		*/
> +		if (hdmi->format.sample_rate > 0) {
> +			err = tegra_hdmi_setup_audio(hdmi);
> +			if (err < 0)
> +				hdmi->dvi = true;
> +		}
>  	}
>  
>  	if (hdmi->config->has_hda)
> 

Thank you very much!

Tested-by: Dmitry Osipenko <digetx@gmail.com>
diff mbox series

Patch

diff --git a/drivers/gpu/drm/tegra/hdmi.c b/drivers/gpu/drm/tegra/hdmi.c
index 47c55974756d..d23c4bfde790 100644
--- a/drivers/gpu/drm/tegra/hdmi.c
+++ b/drivers/gpu/drm/tegra/hdmi.c
@@ -1260,9 +1260,15 @@  static void tegra_hdmi_encoder_enable(struct drm_encoder *encoder)
 
 	hdmi->dvi = !tegra_output_is_hdmi(output);
 	if (!hdmi->dvi) {
-		err = tegra_hdmi_setup_audio(hdmi);
-		if (err < 0)
-			hdmi->dvi = true;
+		/*
+		 * Make sure that the audio format has been configured before
+		 * enabling audio, otherwise we may try to divide by zero.
+		*/
+		if (hdmi->format.sample_rate > 0) {
+			err = tegra_hdmi_setup_audio(hdmi);
+			if (err < 0)
+				hdmi->dvi = true;
+		}
 	}
 
 	if (hdmi->config->has_hda)