[Intel-gfx] [PATCH] drm/i915: add a "force-dvi" HDMI audio mode

Daniel Vetter daniel at ffwll.ch
Mon Feb 13 20:22:01 CET 2012


On Wed, Feb 08, 2012 at 10:48:20AM +0800, Wu Fengguang wrote:
> When HDMI-DVI converter is used, it's not only necessary to turn off
> audio, but also to disable HDMI_MODE_SELECT and video infoframe. Since
> the DVI mode is mainly tied to audio functionality from end user POV,
> add a new "force-dvi" audio mode:
> 
> 	xrandr --output HDMI1 --set audio force-dvi
> 
> Note that most users won't need to set this and happily rely on the
> EDID based DVI auto detection.
> 
> Reported-by: Andrea Arcangeli <aarcange at redhat.com>
> Signed-off-by: Wu Fengguang <fengguang.wu at intel.com>

Jesse acked this patch on irc, but I've noticed a few little things. See
below for the details.
-Daniel

> ---
>  drivers/gpu/drm/i915/i915_drv.h    |    7 +++++++
>  drivers/gpu/drm/i915/intel_hdmi.c  |    8 +++++---
>  drivers/gpu/drm/i915/intel_modes.c |    4 +++-
>  3 files changed, 15 insertions(+), 4 deletions(-)
> 
> --- linux-next.orig/drivers/gpu/drm/i915/i915_drv.h	2012-01-31 20:44:59.000000000 +0800
> +++ linux-next/drivers/gpu/drm/i915/i915_drv.h	2012-02-08 10:37:30.000000000 +0800
> @@ -749,6 +749,13 @@ typedef struct drm_i915_private {
>  	struct drm_property *force_audio_property;
>  } drm_i915_private_t;
>  
> +enum hdmi_force_audio {
> +	HDMI_AUDIO_OFF_DVI = -2,	/* no aux data for HDMI-DVI converter */
> +	HDMI_AUDIO_OFF,			/* force turn off HDMI audio */
> +	HDMI_AUDIO_AUTO,		/* trust EDID */
> +	HDMI_AUDIO_ON,			/* force turn on HDMI audio */
> +};
> +
>  enum i915_cache_level {
>  	I915_CACHE_NONE,
>  	I915_CACHE_LLC,
> --- linux-next.orig/drivers/gpu/drm/i915/intel_hdmi.c	2012-01-07 20:47:34.000000000 +0800
> +++ linux-next/drivers/gpu/drm/i915/intel_hdmi.c	2012-02-08 10:37:30.000000000 +0800
> @@ -339,7 +339,9 @@ intel_hdmi_detect(struct drm_connector *
>  	if (edid) {
>  		if (edid->input & DRM_EDID_INPUT_DIGITAL) {
>  			status = connector_status_connected;
> -			intel_hdmi->has_hdmi_sink = drm_detect_hdmi_monitor(edid);
> +			if (intel_hdmi->force_audio != HDMI_AUDIO_OFF_DVI)
> +				intel_hdmi->has_hdmi_sink =
> +						drm_detect_hdmi_monitor(edid);
>  			intel_hdmi->has_audio = drm_detect_monitor_audio(edid);
>  		}
>  		connector->display_info.raw_edid = NULL;
> @@ -415,8 +417,8 @@ intel_hdmi_set_property(struct drm_conne
>  		else
>  			has_audio = i > 0;

All these comparison with i use magic values instead of your new enum
definitions. Can you replace these with the enums like you've done below,
i.e. for the above if block:

		if (i == HDMI_AUDIO_AUOT)
			...
		else if (i == HDMI_AUDIO_ON)
			has_audio = true;

intel_hdmi_detect is also a place that checks these values (with
intel_hdmi->force_audio) - please use the enum values there, too. Also
please change the type of intel_hdmi->force_audio from int to the enum.

Another thing I've noticed is that in intel_hdmi_detect you don't force
has_hdmi_sink to false if the force_dvi option is set.

>  
> -		if (has_audio == intel_hdmi->has_audio)
> -			return 0;
> +		if (i == HDMI_AUDIO_OFF_DVI)
> +			intel_hdmi->has_hdmi_sink = 0;
>  
>  		intel_hdmi->has_audio = has_audio;
>  		goto done;
> --- linux-next.orig/drivers/gpu/drm/i915/intel_modes.c	2011-10-19 11:11:20.000000000 +0800
> +++ linux-next/drivers/gpu/drm/i915/intel_modes.c	2012-02-08 10:37:30.000000000 +0800
> @@ -84,6 +84,7 @@ int intel_ddc_get_modes(struct drm_conne
>  }
>  
>  static const char *force_audio_names[] = {
> +	"force-dvi",
>  	"off",
>  	"auto",
>  	"on",
> @@ -106,7 +107,8 @@ intel_attach_force_audio_property(struct
>  			return;
>  
>  		for (i = 0; i < ARRAY_SIZE(force_audio_names); i++)
> -			drm_property_add_enum(prop, i, i-1, force_audio_names[i]);
> +			drm_property_add_enum(prop, i, i-2,
> +					      force_audio_names[i]);
>  
>  		dev_priv->force_audio_property = prop;
>  	}
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Daniel Vetter
Mail: daniel at ffwll.ch
Mobile: +41 (0)79 365 57 48



More information about the Intel-gfx mailing list