diff options
author | Jani Nikula <jani.nikula@intel.com> | 2012-10-19 07:51:50 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2012-10-22 13:01:49 -0400 |
commit | dd06f90ee880c61a534ccbe07bd30a8a7d7f7567 (patch) | |
tree | 88390939b5c91a7f59878451a73621753c61a182 /drivers/gpu/drm/i915/intel_lvds.c | |
parent | 1d508706ea848e32ff20bb311f4325896c6eb7b9 (diff) |
drm/i915: Move the fixed mode to intel_panel
Pave the way for sharing some logic between eDP and LVDS.
Based on earlier work by Chris Wilson <chris@chris-wilson.co.uk>
CC: Chris Wilson <chris@chris-wilson.co.uk>
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>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_lvds.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_lvds.c | 36 |
1 files changed, 18 insertions, 18 deletions
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index 6b31e2556de0..50b6124a6943 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c | |||
@@ -44,7 +44,6 @@ struct intel_lvds_connector { | |||
44 | struct intel_connector base; | 44 | struct intel_connector base; |
45 | 45 | ||
46 | struct notifier_block lid_notifier; | 46 | struct notifier_block lid_notifier; |
47 | struct drm_display_mode *fixed_mode; | ||
48 | struct edid *edid; | 47 | struct edid *edid; |
49 | int fitting_mode; | 48 | int fitting_mode; |
50 | }; | 49 | }; |
@@ -177,8 +176,8 @@ static void intel_disable_lvds(struct intel_encoder *encoder) | |||
177 | static int intel_lvds_mode_valid(struct drm_connector *connector, | 176 | static int intel_lvds_mode_valid(struct drm_connector *connector, |
178 | struct drm_display_mode *mode) | 177 | struct drm_display_mode *mode) |
179 | { | 178 | { |
180 | struct intel_lvds_connector *lvds_connector = to_lvds_connector(connector); | 179 | struct intel_connector *intel_connector = to_intel_connector(connector); |
181 | struct drm_display_mode *fixed_mode = lvds_connector->fixed_mode; | 180 | struct drm_display_mode *fixed_mode = intel_connector->panel.fixed_mode; |
182 | 181 | ||
183 | if (mode->hdisplay > fixed_mode->hdisplay) | 182 | if (mode->hdisplay > fixed_mode->hdisplay) |
184 | return MODE_PANEL; | 183 | return MODE_PANEL; |
@@ -276,7 +275,8 @@ static bool intel_lvds_mode_fixup(struct drm_encoder *encoder, | |||
276 | * with the panel scaling set up to source from the H/VDisplay | 275 | * with the panel scaling set up to source from the H/VDisplay |
277 | * of the original mode. | 276 | * of the original mode. |
278 | */ | 277 | */ |
279 | intel_fixed_panel_mode(lvds_connector->fixed_mode, adjusted_mode); | 278 | intel_fixed_panel_mode(lvds_connector->base.panel.fixed_mode, |
279 | adjusted_mode); | ||
280 | 280 | ||
281 | if (HAS_PCH_SPLIT(dev)) { | 281 | if (HAS_PCH_SPLIT(dev)) { |
282 | intel_pch_panel_fitting(dev, lvds_connector->fitting_mode, | 282 | intel_pch_panel_fitting(dev, lvds_connector->fitting_mode, |
@@ -463,7 +463,7 @@ static int intel_lvds_get_modes(struct drm_connector *connector) | |||
463 | if (lvds_connector->edid) | 463 | if (lvds_connector->edid) |
464 | return drm_add_edid_modes(connector, lvds_connector->edid); | 464 | return drm_add_edid_modes(connector, lvds_connector->edid); |
465 | 465 | ||
466 | mode = drm_mode_duplicate(dev, lvds_connector->fixed_mode); | 466 | mode = drm_mode_duplicate(dev, lvds_connector->base.panel.fixed_mode); |
467 | if (mode == NULL) | 467 | if (mode == NULL) |
468 | return 0; | 468 | return 0; |
469 | 469 | ||
@@ -921,6 +921,7 @@ bool intel_lvds_init(struct drm_device *dev) | |||
921 | struct drm_connector *connector; | 921 | struct drm_connector *connector; |
922 | struct drm_encoder *encoder; | 922 | struct drm_encoder *encoder; |
923 | struct drm_display_mode *scan; /* *modes, *bios_mode; */ | 923 | struct drm_display_mode *scan; /* *modes, *bios_mode; */ |
924 | struct drm_display_mode *fixed_mode = NULL; | ||
924 | struct drm_crtc *crtc; | 925 | struct drm_crtc *crtc; |
925 | u32 lvds; | 926 | u32 lvds; |
926 | int pipe; | 927 | int pipe; |
@@ -1044,20 +1045,17 @@ bool intel_lvds_init(struct drm_device *dev) | |||
1044 | 1045 | ||
1045 | list_for_each_entry(scan, &connector->probed_modes, head) { | 1046 | list_for_each_entry(scan, &connector->probed_modes, head) { |
1046 | if (scan->type & DRM_MODE_TYPE_PREFERRED) { | 1047 | if (scan->type & DRM_MODE_TYPE_PREFERRED) { |
1047 | lvds_connector->fixed_mode = drm_mode_duplicate(dev, scan); | 1048 | fixed_mode = drm_mode_duplicate(dev, scan); |
1048 | intel_find_lvds_downclock(dev, | 1049 | intel_find_lvds_downclock(dev, fixed_mode, connector); |
1049 | lvds_connector->fixed_mode, | ||
1050 | connector); | ||
1051 | goto out; | 1050 | goto out; |
1052 | } | 1051 | } |
1053 | } | 1052 | } |
1054 | 1053 | ||
1055 | /* Failed to get EDID, what about VBT? */ | 1054 | /* Failed to get EDID, what about VBT? */ |
1056 | if (dev_priv->lfp_lvds_vbt_mode) { | 1055 | if (dev_priv->lfp_lvds_vbt_mode) { |
1057 | lvds_connector->fixed_mode = | 1056 | fixed_mode = drm_mode_duplicate(dev, dev_priv->lfp_lvds_vbt_mode); |
1058 | drm_mode_duplicate(dev, dev_priv->lfp_lvds_vbt_mode); | 1057 | if (fixed_mode) { |
1059 | if (lvds_connector->fixed_mode) { | 1058 | fixed_mode->type |= DRM_MODE_TYPE_PREFERRED; |
1060 | lvds_connector->fixed_mode->type |= DRM_MODE_TYPE_PREFERRED; | ||
1061 | goto out; | 1059 | goto out; |
1062 | } | 1060 | } |
1063 | } | 1061 | } |
@@ -1077,15 +1075,15 @@ bool intel_lvds_init(struct drm_device *dev) | |||
1077 | crtc = intel_get_crtc_for_pipe(dev, pipe); | 1075 | crtc = intel_get_crtc_for_pipe(dev, pipe); |
1078 | 1076 | ||
1079 | if (crtc && (lvds & LVDS_PORT_EN)) { | 1077 | if (crtc && (lvds & LVDS_PORT_EN)) { |
1080 | lvds_connector->fixed_mode = intel_crtc_mode_get(dev, crtc); | 1078 | fixed_mode = intel_crtc_mode_get(dev, crtc); |
1081 | if (lvds_connector->fixed_mode) { | 1079 | if (fixed_mode) { |
1082 | lvds_connector->fixed_mode->type |= DRM_MODE_TYPE_PREFERRED; | 1080 | fixed_mode->type |= DRM_MODE_TYPE_PREFERRED; |
1083 | goto out; | 1081 | goto out; |
1084 | } | 1082 | } |
1085 | } | 1083 | } |
1086 | 1084 | ||
1087 | /* If we still don't have a mode after all that, give up. */ | 1085 | /* If we still don't have a mode after all that, give up. */ |
1088 | if (!lvds_connector->fixed_mode) | 1086 | if (!fixed_mode) |
1089 | goto failed; | 1087 | goto failed; |
1090 | 1088 | ||
1091 | out: | 1089 | out: |
@@ -1107,7 +1105,7 @@ out: | |||
1107 | } | 1105 | } |
1108 | drm_sysfs_connector_add(connector); | 1106 | drm_sysfs_connector_add(connector); |
1109 | 1107 | ||
1110 | intel_panel_init(&intel_connector->panel); | 1108 | intel_panel_init(&intel_connector->panel, fixed_mode); |
1111 | intel_panel_setup_backlight(connector); | 1109 | intel_panel_setup_backlight(connector); |
1112 | 1110 | ||
1113 | return true; | 1111 | return true; |
@@ -1116,6 +1114,8 @@ failed: | |||
1116 | DRM_DEBUG_KMS("No LVDS modes found, disabling.\n"); | 1114 | DRM_DEBUG_KMS("No LVDS modes found, disabling.\n"); |
1117 | drm_connector_cleanup(connector); | 1115 | drm_connector_cleanup(connector); |
1118 | drm_encoder_cleanup(encoder); | 1116 | drm_encoder_cleanup(encoder); |
1117 | if (fixed_mode) | ||
1118 | drm_mode_destroy(dev, fixed_mode); | ||
1119 | kfree(lvds_encoder); | 1119 | kfree(lvds_encoder); |
1120 | kfree(lvds_connector); | 1120 | kfree(lvds_connector); |
1121 | return false; | 1121 | return false; |