diff --git a/src/intel_display.c b/src/intel_display.c index 2183f4de..5ad8625e 100644 --- a/src/intel_display.c +++ b/src/intel_display.c @@ -944,13 +944,19 @@ intel_output_dpms(xf86OutputPtr output, int dpms) continue; if (!strcmp(props->name, "DPMS")) { + /* Make sure to reverse the order between on and off. */ + if (dpms == DPMSModeOff) + intel_output_dpms_backlight(output, + intel_output->dpms_mode, + dpms); drmModeConnectorSetProperty(mode->fd, intel_output->output_id, props->prop_id, dpms); - intel_output_dpms_backlight(output, - intel_output->dpms_mode, - dpms); + if (dpms != DPMSModeOff) + intel_output_dpms_backlight(output, + intel_output->dpms_mode, + dpms); intel_output->dpms_mode = dpms; drmModeFreeProperty(props); return; diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c index 32162ef2..b1550a24 100644 --- a/src/sna/sna_display.c +++ b/src/sna/sna_display.c @@ -1142,13 +1142,28 @@ sna_output_dpms(xf86OutputPtr output, int dpms) continue; if (!strcmp(props->name, "DPMS")) { + /* Record thevalue of the backlight before turning + * off the display, and reset if after turnging it on. + * Order is important as the kernel may record and also + * reset the backlight across DPMS. Hence we need to + * record the value before the kernel modifies it + * and reapply it afterwards. + */ + if (dpms == DPMSModeOff) + sna_output_dpms_backlight(output, + sna_output->dpms_mode, + dpms); + drmModeConnectorSetProperty(sna->kgem.fd, sna_output->output_id, props->prop_id, dpms); - sna_output_dpms_backlight(output, - sna_output->dpms_mode, - dpms); + + if (dpms != DPMSModeOff) + sna_output_dpms_backlight(output, + sna_output->dpms_mode, + dpms); + sna_output->dpms_mode = dpms; drmModeFreeProperty(props); return;