From: Greg Kroah-Hartman Date: Thu, 9 May 2013 18:46:40 +0000 (-0700) Subject: 3.8-stable patches X-Git-Tag: v3.9.2~43 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5d70d47c5383a0380024746d1ce872ca082db211;p=thirdparty%2Fkernel%2Fstable-queue.git 3.8-stable patches added patches: drm-i915-ensure-single-initialization-and-cleanup-of-backlight-device.patch --- diff --git a/queue-3.8/drm-i915-ensure-single-initialization-and-cleanup-of-backlight-device.patch b/queue-3.8/drm-i915-ensure-single-initialization-and-cleanup-of-backlight-device.patch new file mode 100644 index 00000000000..96969a2c6b0 --- /dev/null +++ b/queue-3.8/drm-i915-ensure-single-initialization-and-cleanup-of-backlight-device.patch @@ -0,0 +1,99 @@ +From dc652f90e088798bfa31f496ba994ddadd5d5680 Mon Sep 17 00:00:00 2001 +From: Jani Nikula +Date: Fri, 12 Apr 2013 15:18:38 +0300 +Subject: drm/i915: ensure single initialization and cleanup of backlight device + +From: Jani Nikula + +commit dc652f90e088798bfa31f496ba994ddadd5d5680 upstream. + +Backlight cleanup in the eDP connector destroy callback caused the +backlight device to be removed on some systems that first initialized LVDS +and then attempted to initialize eDP. Prevent multiple backlight +initializations, and ensure backlight cleanup is only done once by moving +it to modeset cleanup. + +A small wrinkle is the introduced asymmetry in backlight +setup/cleanup. This could be solved by adding refcounting, but it seems +overkill considering that there should only ever be one backlight device. + +Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=55701 +Signed-off-by: Jani Nikula +Tested-by: Peter Verthez +Signed-off-by: Daniel Vetter +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/i915/intel_display.c | 3 +++ + drivers/gpu/drm/i915/intel_dp.c | 5 +---- + drivers/gpu/drm/i915/intel_lvds.c | 1 - + drivers/gpu/drm/i915/intel_panel.c | 7 ++++++- + 4 files changed, 10 insertions(+), 6 deletions(-) + +--- a/drivers/gpu/drm/i915/intel_display.c ++++ b/drivers/gpu/drm/i915/intel_display.c +@@ -9256,6 +9256,9 @@ void intel_modeset_cleanup(struct drm_de + /* flush any delayed tasks or pending work */ + flush_scheduled_work(); + ++ /* destroy backlight, if any, before the connectors */ ++ intel_panel_destroy_backlight(dev); ++ + drm_mode_config_cleanup(dev); + + intel_cleanup_overlay(dev); +--- a/drivers/gpu/drm/i915/intel_dp.c ++++ b/drivers/gpu/drm/i915/intel_dp.c +@@ -2538,17 +2538,14 @@ done: + static void + intel_dp_destroy(struct drm_connector *connector) + { +- struct drm_device *dev = connector->dev; + struct intel_dp *intel_dp = intel_attached_dp(connector); + struct intel_connector *intel_connector = to_intel_connector(connector); + + if (!IS_ERR_OR_NULL(intel_connector->edid)) + kfree(intel_connector->edid); + +- if (is_edp(intel_dp)) { +- intel_panel_destroy_backlight(dev); ++ if (is_edp(intel_dp)) + intel_panel_fini(&intel_connector->panel); +- } + + drm_sysfs_connector_remove(connector); + drm_connector_cleanup(connector); +--- a/drivers/gpu/drm/i915/intel_lvds.c ++++ b/drivers/gpu/drm/i915/intel_lvds.c +@@ -618,7 +618,6 @@ static void intel_lvds_destroy(struct dr + if (!IS_ERR_OR_NULL(lvds_connector->base.edid)) + kfree(lvds_connector->base.edid); + +- intel_panel_destroy_backlight(connector->dev); + intel_panel_fini(&lvds_connector->base.panel); + + drm_sysfs_connector_remove(connector); +--- a/drivers/gpu/drm/i915/intel_panel.c ++++ b/drivers/gpu/drm/i915/intel_panel.c +@@ -422,6 +422,9 @@ int intel_panel_setup_backlight(struct d + + intel_panel_init_backlight(dev); + ++ if (WARN_ON(dev_priv->backlight)) ++ return -ENODEV; ++ + memset(&props, 0, sizeof(props)); + props.type = BACKLIGHT_RAW; + props.max_brightness = _intel_panel_get_max_backlight(dev); +@@ -447,8 +450,10 @@ int intel_panel_setup_backlight(struct d + void intel_panel_destroy_backlight(struct drm_device *dev) + { + struct drm_i915_private *dev_priv = dev->dev_private; +- if (dev_priv->backlight) ++ if (dev_priv->backlight) { + backlight_device_unregister(dev_priv->backlight); ++ dev_priv->backlight = NULL; ++ } + } + #else + int intel_panel_setup_backlight(struct drm_connector *connector) diff --git a/queue-3.8/series b/queue-3.8/series index b5eca5ba27a..c46dbf90cfa 100644 --- a/queue-3.8/series +++ b/queue-3.8/series @@ -40,3 +40,4 @@ drm-i915-fix-sdvo-connector-and-encoder-get_hw_state-functions.patch drm-i915-workaround-incoherence-between-fences-and-llc-across-multiple-cpus.patch drm-i915-use-mlc-l3-for-context-objects.patch drm-i915-set-cpt-fdi-rx-polarity-bits-based-on-vbt.patch +drm-i915-ensure-single-initialization-and-cleanup-of-backlight-device.patch