Commit 219adae1 authored by Chris Wilson's avatar Chris Wilson

drm/i915: Cache LVDS EDID

We assume that the panel is permenantly connected and that the EDID data
is consistent from boot, so simply cache the whole EDID for the panel.
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
parent e9e5f8e8
...@@ -44,7 +44,7 @@ ...@@ -44,7 +44,7 @@
struct intel_lvds { struct intel_lvds {
struct intel_encoder base; struct intel_encoder base;
bool edid_good; struct edid *edid;
int fitting_mode; int fitting_mode;
u32 pfit_control; u32 pfit_control;
...@@ -475,14 +475,12 @@ static int intel_lvds_get_modes(struct drm_connector *connector) ...@@ -475,14 +475,12 @@ static int intel_lvds_get_modes(struct drm_connector *connector)
{ {
struct intel_lvds *intel_lvds = intel_attached_lvds(connector); struct intel_lvds *intel_lvds = intel_attached_lvds(connector);
struct drm_device *dev = connector->dev; struct drm_device *dev = connector->dev;
struct drm_i915_private *dev_priv = dev->dev_private;
struct drm_display_mode *mode; struct drm_display_mode *mode;
if (intel_lvds->edid_good) { if (intel_lvds->edid) {
int ret = intel_ddc_get_modes(connector, drm_mode_connector_update_edid_property(connector,
&dev_priv->gmbus[GMBUS_PORT_PANEL].adapter); intel_lvds->edid);
if (ret) return drm_add_edid_modes(connector, intel_lvds->edid);
return ret;
} }
mode = drm_mode_duplicate(dev, intel_lvds->fixed_mode); mode = drm_mode_duplicate(dev, intel_lvds->fixed_mode);
...@@ -906,11 +904,10 @@ void intel_lvds_init(struct drm_device *dev) ...@@ -906,11 +904,10 @@ void intel_lvds_init(struct drm_device *dev)
* Attempt to get the fixed panel mode from DDC. Assume that the * Attempt to get the fixed panel mode from DDC. Assume that the
* preferred mode is the right one. * preferred mode is the right one.
*/ */
intel_lvds->edid_good = true; intel_lvds->edid = drm_get_edid(connector,
if (!intel_ddc_get_modes(connector, &dev_priv->gmbus[GMBUS_PORT_PANEL].adapter)) &dev_priv->gmbus[GMBUS_PORT_PANEL].adapter);
intel_lvds->edid_good = false;
if (!intel_lvds->edid_good) { if (!intel_lvds->edid) {
/* Didn't get an EDID, so /* Didn't get an EDID, so
* Set wide sync ranges so we get all modes * Set wide sync ranges so we get all modes
* handed to valid_mode for checking * handed to valid_mode for checking
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment