-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hi,
this is not a patch for mainline. It affects Dell Precision M3800 Laptop running Ubuntu with Intel Graphics. Problem manifests in a way where laptop after some use will not suspend anymore. It will attempt to suspend, blank out the screen and come back up. It's rather finicky as it doesn't happen consistently, but often enough that it started being mildly annoying. I tracked it down to a race condition between scheduled work and another thread. Essentially the driver would do a double put on a structure if the race condition was hit. This patch fixes the problem and my laptop has been suspending flawlessly for about a month and a half. - From my memory going back 1.5 months the race condition is between _edp_panel_vdd_on, intel_edp_panel_off, edp_panel_vdd_off_sync. Kernel and Distro info: :~/src/Dell-M4800-Hardware/kernel$ uname -r 3.16.7-ckt8 :~/src/Dell-M4800-Hardware/kernel$ cat /etc/issue Ubuntu 14.10 \n \l Hope someone else finds the attached patch useful. Thanks -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAEBAgAGBQJVZT1AAAoJEFvcFPjWWnki3NAP/Aq+o6HRWgJzjDPoHUnqoeuZ xU/N4/aSjEMS2qBdOz++86B1nloT4ztKTRlaOJ45BCvCW2SeyHtMfHwyvIVw29hc bo5+T4nOx0wHtX/iaULowM3++enEARH76SAFUcMsUJEX36nSJywyWSIM19h59L4z JxjrPUVnbFn5K4FTBJ1GhG/3QDfDoD/i7bH/v+MIJCXSYWeV9S273nG9onMz5NhW OxRx2avmat23zqwGDDTkLfOLCFVzByxPqbXU/muyo8yM9teHapfrMTOwYtWgIMDb vFkfLJmDpa2NhPefSacNIi/L23oK4poGK4nw8w/U+VUaGwmConOtJq7tR517sewh R481WfaZeJzCVt5IJtC076j+1YmtZQri7jdJJlxS1RW/2ZVGDNEWWFCMNo1g+ixl kht0o2FSqjKjtSpzNuXjoKldpCH+v91ix8JqJSdfkjj4VOljKJh+xnPxOelbdU5a aKnk6+hg8fc9CL37LHzV/nvIGaOht5VKPGSBZQQ0p7G+Oe169kPpE1gUfgsvzdw7 y0fkEaGV0iyuHMCrcY32dgEf0QrZyCqgmsts/u7q3bWoMSyWyYyE3gu8wQ1VT2Bb +4sHgIXYjQZpVoEMs2i4gezPHL6oDhuOk6enJYah0dKpp9uefCRXbEiwitbZdnLE P+l2M/QpOWM+qwvuV7Te =HAXT -----END PGP SIGNATURE-----
--- linux-3.16.0.ubt/drivers/gpu/drm/i915/intel_dp.c 2015-04-16 20:17:21.000000000 -0700 +++ linux-3.16.0/drivers/gpu/drm/i915/intel_dp.c 2015-04-16 20:29:45.040894002 -0700 @@ -1175,6 +1175,7 @@ if (!is_edp(intel_dp)) return false; + cancel_delayed_work(&intel_dp->panel_vdd_work); intel_dp->want_panel_vdd = true; if (edp_have_panel_vdd(intel_dp))