[06/10] drm/i915/dp: Initialize eDP fixed mode in intel_dp_init
diff mbox

Message ID 59d015fdd087b23f4d19008bf18c823e1f00c4aa.1350644022.git.jani.nikula@intel.com
State New, archived
Headers show

Commit Message

Jani Nikula Oct. 19, 2012, 11:51 a.m. UTC
Since we do EDID caching in intel_dp_init, we can do the fixed mode
initialization there too. This should not change the functionality apart
from initializing fixed mode earlier. Particularly retain the behaviour of
only falling back to VBT if EDID is not available to not regress

commit 47f0eb2234a2a1c790825393bbaccfadf82463d3
Author: Keith Packard <keithp@keithp.com>
Date:   Mon Sep 19 14:33:26 2011 -0700

    drm/i915: Only use VBT panel mode on eDP if no EDID is found

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/i915/intel_dp.c |   53 ++++++++++++++++++---------------------
 1 file changed, 25 insertions(+), 28 deletions(-)

Comments

Jesse Barnes Oct. 19, 2012, 5 p.m. UTC | #1
On Fri, 19 Oct 2012 14:51:48 +0300
Jani Nikula <jani.nikula@intel.com> wrote:

> Since we do EDID caching in intel_dp_init, we can do the fixed mode
> initialization there too. This should not change the functionality apart
> from initializing fixed mode earlier. Particularly retain the behaviour of
> only falling back to VBT if EDID is not available to not regress
> 
> commit 47f0eb2234a2a1c790825393bbaccfadf82463d3
> Author: Keith Packard <keithp@keithp.com>
> Date:   Mon Sep 19 14:33:26 2011 -0700
> 
>     drm/i915: Only use VBT panel mode on eDP if no EDID is found
> 
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>  drivers/gpu/drm/i915/intel_dp.c |   53 ++++++++++++++++++---------------------
>  1 file changed, 25 insertions(+), 28 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
> index 09244f3..52cbee7 100644
> --- a/drivers/gpu/drm/i915/intel_dp.c
> +++ b/drivers/gpu/drm/i915/intel_dp.c
> @@ -2407,42 +2407,20 @@ static int intel_dp_get_modes(struct drm_connector *connector)
>  {
>  	struct intel_dp *intel_dp = intel_attached_dp(connector);
>  	struct drm_device *dev = intel_dp->base.base.dev;
> -	struct drm_i915_private *dev_priv = dev->dev_private;
>  	int ret;
>  
>  	/* We should parse the EDID data and find out if it has an audio sink
>  	 */
>  
>  	ret = intel_dp_get_edid_modes(connector, &intel_dp->adapter);
> -	if (ret) {
> -		if (is_edp(intel_dp) && !intel_dp->panel_fixed_mode) {
> -			struct drm_display_mode *newmode;
> -			list_for_each_entry(newmode, &connector->probed_modes,
> -					    head) {
> -				if ((newmode->type & DRM_MODE_TYPE_PREFERRED)) {
> -					intel_dp->panel_fixed_mode =
> -						drm_mode_duplicate(dev, newmode);
> -					break;
> -				}
> -			}
> -		}
> +	if (ret)
>  		return ret;
> -	}
>  
> -	/* if eDP has no EDID, try to use fixed panel mode from VBT */
> -	if (is_edp(intel_dp)) {
> -		/* initialize panel mode from VBT if available for eDP */
> -		if (intel_dp->panel_fixed_mode == NULL && dev_priv->lfp_lvds_vbt_mode != NULL) {
> -			intel_dp->panel_fixed_mode =
> -				drm_mode_duplicate(dev, dev_priv->lfp_lvds_vbt_mode);
> -			if (intel_dp->panel_fixed_mode) {
> -				intel_dp->panel_fixed_mode->type |=
> -					DRM_MODE_TYPE_PREFERRED;
> -			}
> -		}
> -		if (intel_dp->panel_fixed_mode) {
> -			struct drm_display_mode *mode;
> -			mode = drm_mode_duplicate(dev, intel_dp->panel_fixed_mode);
> +	/* if eDP has no EDID, fall back to fixed mode */
> +	if (is_edp(intel_dp) && intel_dp->panel_fixed_mode) {
> +		struct drm_display_mode *mode;
> +		mode = drm_mode_duplicate(dev, intel_dp->panel_fixed_mode);
> +		if (mode) {
>  			drm_mode_probed_add(connector, mode);
>  			return 1;
>  		}
> @@ -2638,6 +2616,7 @@ intel_dp_init(struct drm_device *dev, int output_reg, enum port port)
>  	struct intel_dp *intel_dp;
>  	struct intel_encoder *intel_encoder;
>  	struct intel_connector *intel_connector;
> +	struct drm_display_mode *fixed_mode = NULL;
>  	const char *name = NULL;
>  	int type;
>  
> @@ -2802,6 +2781,7 @@ intel_dp_init(struct drm_device *dev, int output_reg, enum port port)
>  
>  	if (is_edp(intel_dp)) {
>  		bool ret;
> +		struct drm_display_mode *scan;
>  		struct edid *edid;
>  
>  		ironlake_edp_panel_vdd_on(intel_dp);
> @@ -2831,6 +2811,23 @@ intel_dp_init(struct drm_device *dev, int output_reg, enum port port)
>  			drm_edid_to_eld(connector, edid);
>  			intel_dp->edid = edid;
>  		}
> +
> +		/* prefer fixed mode from EDID if available */
> +		list_for_each_entry(scan, &connector->probed_modes, head) {
> +			if ((scan->type & DRM_MODE_TYPE_PREFERRED)) {
> +				fixed_mode = drm_mode_duplicate(dev, scan);
> +				break;
> +			}
> +		}
> +
> +		/* fallback to VBT if available for eDP */
> +		if (!fixed_mode && dev_priv->lfp_lvds_vbt_mode) {
> +			fixed_mode = drm_mode_duplicate(dev, dev_priv->lfp_lvds_vbt_mode);
> +			if (fixed_mode)
> +				fixed_mode->type |= DRM_MODE_TYPE_PREFERRED;
> +		}
> +		intel_dp->panel_fixed_mode = fixed_mode;
> +
>  		ironlake_edp_panel_vdd_off(intel_dp, false);
>  	}
>  

Might be nice to factor out some of this fixed mode/eDP stuff into a
separate function, but that's just a cleanup and can happen on top.

Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org>

Patch
diff mbox

diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 09244f3..52cbee7 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -2407,42 +2407,20 @@  static int intel_dp_get_modes(struct drm_connector *connector)
 {
 	struct intel_dp *intel_dp = intel_attached_dp(connector);
 	struct drm_device *dev = intel_dp->base.base.dev;
-	struct drm_i915_private *dev_priv = dev->dev_private;
 	int ret;
 
 	/* We should parse the EDID data and find out if it has an audio sink
 	 */
 
 	ret = intel_dp_get_edid_modes(connector, &intel_dp->adapter);
-	if (ret) {
-		if (is_edp(intel_dp) && !intel_dp->panel_fixed_mode) {
-			struct drm_display_mode *newmode;
-			list_for_each_entry(newmode, &connector->probed_modes,
-					    head) {
-				if ((newmode->type & DRM_MODE_TYPE_PREFERRED)) {
-					intel_dp->panel_fixed_mode =
-						drm_mode_duplicate(dev, newmode);
-					break;
-				}
-			}
-		}
+	if (ret)
 		return ret;
-	}
 
-	/* if eDP has no EDID, try to use fixed panel mode from VBT */
-	if (is_edp(intel_dp)) {
-		/* initialize panel mode from VBT if available for eDP */
-		if (intel_dp->panel_fixed_mode == NULL && dev_priv->lfp_lvds_vbt_mode != NULL) {
-			intel_dp->panel_fixed_mode =
-				drm_mode_duplicate(dev, dev_priv->lfp_lvds_vbt_mode);
-			if (intel_dp->panel_fixed_mode) {
-				intel_dp->panel_fixed_mode->type |=
-					DRM_MODE_TYPE_PREFERRED;
-			}
-		}
-		if (intel_dp->panel_fixed_mode) {
-			struct drm_display_mode *mode;
-			mode = drm_mode_duplicate(dev, intel_dp->panel_fixed_mode);
+	/* if eDP has no EDID, fall back to fixed mode */
+	if (is_edp(intel_dp) && intel_dp->panel_fixed_mode) {
+		struct drm_display_mode *mode;
+		mode = drm_mode_duplicate(dev, intel_dp->panel_fixed_mode);
+		if (mode) {
 			drm_mode_probed_add(connector, mode);
 			return 1;
 		}
@@ -2638,6 +2616,7 @@  intel_dp_init(struct drm_device *dev, int output_reg, enum port port)
 	struct intel_dp *intel_dp;
 	struct intel_encoder *intel_encoder;
 	struct intel_connector *intel_connector;
+	struct drm_display_mode *fixed_mode = NULL;
 	const char *name = NULL;
 	int type;
 
@@ -2802,6 +2781,7 @@  intel_dp_init(struct drm_device *dev, int output_reg, enum port port)
 
 	if (is_edp(intel_dp)) {
 		bool ret;
+		struct drm_display_mode *scan;
 		struct edid *edid;
 
 		ironlake_edp_panel_vdd_on(intel_dp);
@@ -2831,6 +2811,23 @@  intel_dp_init(struct drm_device *dev, int output_reg, enum port port)
 			drm_edid_to_eld(connector, edid);
 			intel_dp->edid = edid;
 		}
+
+		/* prefer fixed mode from EDID if available */
+		list_for_each_entry(scan, &connector->probed_modes, head) {
+			if ((scan->type & DRM_MODE_TYPE_PREFERRED)) {
+				fixed_mode = drm_mode_duplicate(dev, scan);
+				break;
+			}
+		}
+
+		/* fallback to VBT if available for eDP */
+		if (!fixed_mode && dev_priv->lfp_lvds_vbt_mode) {
+			fixed_mode = drm_mode_duplicate(dev, dev_priv->lfp_lvds_vbt_mode);
+			if (fixed_mode)
+				fixed_mode->type |= DRM_MODE_TYPE_PREFERRED;
+		}
+		intel_dp->panel_fixed_mode = fixed_mode;
+
 		ironlake_edp_panel_vdd_off(intel_dp, false);
 	}