aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJani Nikula <jani.nikula@intel.com>2012-10-19 07:51:48 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-10-22 12:09:50 -0400
commitf8779fda5776dfb9369ec09fc21745c9d8057e81 (patch)
tree58acd604ce82cdbc8be10a28b64f5d1364183024
parent62165e0def63fa3a5073c7337f92660e526de370 (diff)
drm/i915/dp: Initialize eDP fixed mode in intel_dp_init
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> Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c53
1 files changed, 25 insertions, 28 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 015d8747147e..be47efff90f0 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -2401,42 +2401,20 @@ static int intel_dp_get_modes(struct drm_connector *connector)
2401{ 2401{
2402 struct intel_dp *intel_dp = intel_attached_dp(connector); 2402 struct intel_dp *intel_dp = intel_attached_dp(connector);
2403 struct drm_device *dev = intel_dp->base.base.dev; 2403 struct drm_device *dev = intel_dp->base.base.dev;
2404 struct drm_i915_private *dev_priv = dev->dev_private;
2405 int ret; 2404 int ret;
2406 2405
2407 /* We should parse the EDID data and find out if it has an audio sink 2406 /* We should parse the EDID data and find out if it has an audio sink
2408 */ 2407 */
2409 2408
2410 ret = intel_dp_get_edid_modes(connector, &intel_dp->adapter); 2409 ret = intel_dp_get_edid_modes(connector, &intel_dp->adapter);
2411 if (ret) { 2410 if (ret)
2412 if (is_edp(intel_dp) && !intel_dp->panel_fixed_mode) {
2413 struct drm_display_mode *newmode;
2414 list_for_each_entry(newmode, &connector->probed_modes,
2415 head) {
2416 if ((newmode->type & DRM_MODE_TYPE_PREFERRED)) {
2417 intel_dp->panel_fixed_mode =
2418 drm_mode_duplicate(dev, newmode);
2419 break;
2420 }
2421 }
2422 }
2423 return ret; 2411 return ret;
2424 }
2425 2412
2426 /* if eDP has no EDID, try to use fixed panel mode from VBT */ 2413 /* if eDP has no EDID, fall back to fixed mode */
2427 if (is_edp(intel_dp)) { 2414 if (is_edp(intel_dp) && intel_dp->panel_fixed_mode) {
2428 /* initialize panel mode from VBT if available for eDP */ 2415 struct drm_display_mode *mode;
2429 if (intel_dp->panel_fixed_mode == NULL && dev_priv->lfp_lvds_vbt_mode != NULL) { 2416 mode = drm_mode_duplicate(dev, intel_dp->panel_fixed_mode);
2430 intel_dp->panel_fixed_mode = 2417 if (mode) {
2431 drm_mode_duplicate(dev, dev_priv->lfp_lvds_vbt_mode);
2432 if (intel_dp->panel_fixed_mode) {
2433 intel_dp->panel_fixed_mode->type |=
2434 DRM_MODE_TYPE_PREFERRED;
2435 }
2436 }
2437 if (intel_dp->panel_fixed_mode) {
2438 struct drm_display_mode *mode;
2439 mode = drm_mode_duplicate(dev, intel_dp->panel_fixed_mode);
2440 drm_mode_probed_add(connector, mode); 2418 drm_mode_probed_add(connector, mode);
2441 return 1; 2419 return 1;
2442 } 2420 }
@@ -2633,6 +2611,7 @@ intel_dp_init(struct drm_device *dev, int output_reg, enum port port)
2633 struct intel_dp *intel_dp; 2611 struct intel_dp *intel_dp;
2634 struct intel_encoder *intel_encoder; 2612 struct intel_encoder *intel_encoder;
2635 struct intel_connector *intel_connector; 2613 struct intel_connector *intel_connector;
2614 struct drm_display_mode *fixed_mode = NULL;
2636 const char *name = NULL; 2615 const char *name = NULL;
2637 int type; 2616 int type;
2638 2617
@@ -2797,6 +2776,7 @@ intel_dp_init(struct drm_device *dev, int output_reg, enum port port)
2797 2776
2798 if (is_edp(intel_dp)) { 2777 if (is_edp(intel_dp)) {
2799 bool ret; 2778 bool ret;
2779 struct drm_display_mode *scan;
2800 struct edid *edid; 2780 struct edid *edid;
2801 2781
2802 ironlake_edp_panel_vdd_on(intel_dp); 2782 ironlake_edp_panel_vdd_on(intel_dp);
@@ -2826,6 +2806,23 @@ intel_dp_init(struct drm_device *dev, int output_reg, enum port port)
2826 drm_edid_to_eld(connector, edid); 2806 drm_edid_to_eld(connector, edid);
2827 intel_dp->edid = edid; 2807 intel_dp->edid = edid;
2828 } 2808 }
2809
2810 /* prefer fixed mode from EDID if available */
2811 list_for_each_entry(scan, &connector->probed_modes, head) {
2812 if ((scan->type & DRM_MODE_TYPE_PREFERRED)) {
2813 fixed_mode = drm_mode_duplicate(dev, scan);
2814 break;
2815 }
2816 }
2817
2818 /* fallback to VBT if available for eDP */
2819 if (!fixed_mode && dev_priv->lfp_lvds_vbt_mode) {
2820 fixed_mode = drm_mode_duplicate(dev, dev_priv->lfp_lvds_vbt_mode);
2821 if (fixed_mode)
2822 fixed_mode->type |= DRM_MODE_TYPE_PREFERRED;
2823 }
2824 intel_dp->panel_fixed_mode = fixed_mode;
2825
2829 ironlake_edp_panel_vdd_off(intel_dp, false); 2826 ironlake_edp_panel_vdd_off(intel_dp, false);
2830 } 2827 }
2831 2828