diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_lvds.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_lvds.c | 27 | 
1 files changed, 25 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index 6a1accd83ae..0eab8df5bf7 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c @@ -599,6 +599,26 @@ static int intel_lvds_get_modes(struct drm_connector *connector)  	return 0;  } +static int intel_no_modeset_on_lid_dmi_callback(const struct dmi_system_id *id) +{ +	DRM_DEBUG_KMS("Skipping forced modeset for %s\n", id->ident); +	return 1; +} + +/* The GPU hangs up on these systems if modeset is performed on LID open */ +static const struct dmi_system_id intel_no_modeset_on_lid[] = { +	{ +		.callback = intel_no_modeset_on_lid_dmi_callback, +		.ident = "Toshiba Tecra A11", +		.matches = { +			DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), +			DMI_MATCH(DMI_PRODUCT_NAME, "TECRA A11"), +		}, +	}, + +	{ }	/* terminating entry */ +}; +  /*   * Lid events. Note the use of 'modeset_on_lid':   *  - we set it on lid close, and reset it on open @@ -622,6 +642,9 @@ static int intel_lid_notify(struct notifier_block *nb, unsigned long val,  	 */  	if (connector)  		connector->status = connector->funcs->detect(connector); +	/* Don't force modeset on machines where it causes a GPU lockup */ +	if (dmi_check_system(intel_no_modeset_on_lid)) +		return NOTIFY_OK;  	if (!acpi_lid_open()) {  		dev_priv->modeset_on_lid = 1;  		return NOTIFY_OK; @@ -983,8 +1006,8 @@ void intel_lvds_init(struct drm_device *dev)  	drm_connector_attach_property(&intel_connector->base,  				      dev->mode_config.scaling_mode_property, -				      DRM_MODE_SCALE_FULLSCREEN); -	lvds_priv->fitting_mode = DRM_MODE_SCALE_FULLSCREEN; +				      DRM_MODE_SCALE_ASPECT); +	lvds_priv->fitting_mode = DRM_MODE_SCALE_ASPECT;  	/*  	 * LVDS discovery:  	 * 1) check for EDID on DDC  |