xf86-video-intel: src/sna/sna_display.c

Chris Wilson ickle at kemper.freedesktop.org
Sat Jun 7 15:31:56 PDT 2014


 src/sna/sna_display.c |   26 +++++++++++++++++++++-----
 1 file changed, 21 insertions(+), 5 deletions(-)

New commits:
commit fc64ba821749ed0a0197a69d9bae81957aceb55f
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat Jun 7 23:27:49 2014 +0100

    sna: Restore backlight when switching to VT
    
    fbcon doesn't adjust the backlight when it takes over. Therefore if X
    performs a VT switch whilst its outputs are off, fbcon wakes up with no
    backlight and users are unhappy. Make the assumption that whoever takes
    over the VT will set the outputs as it desires, and that the failsafe
    value is to then turn the backlight to full.
    
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=67025
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 896c50c..231fc68 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -134,6 +134,7 @@ struct sna_property {
 };
 
 struct sna_output {
+	xf86OutputPtr base;
 	int id;
 	int serial;
 
@@ -523,9 +524,9 @@ static void sna_backlight_close(struct sna *sna) { }
 #endif
 
 static void
-sna_output_backlight_set(xf86OutputPtr output, int level)
+sna_output_backlight_set(struct sna_output *sna_output, int level)
 {
-	struct sna_output *sna_output = output->driver_private;
+	xf86OutputPtr output = sna_output->base;
 
 	DBG(("%s(%s) level=%d, max=%d\n", __FUNCTION__,
 	     output->name, level, sna_output->backlight.max));
@@ -2530,7 +2531,7 @@ sna_output_dpms(xf86OutputPtr output, int dpms)
 			     __FUNCTION__, sna_output->backlight_active_level));
 		}
 		sna_output->dpms_mode = dpms;
-		sna_output_backlight_set(output, 0);
+		sna_output_backlight_set(sna_output, 0);
 	}
 
 	if (output->crtc &&
@@ -2543,7 +2544,7 @@ sna_output_dpms(xf86OutputPtr output, int dpms)
 	if (sna_output->backlight.iface && dpms == DPMSModeOn) {
 		DBG(("%s: restoring previous backlight %d\n",
 		     __FUNCTION__, sna_output->backlight_active_level));
-		sna_output_backlight_set(output,
+		sna_output_backlight_set(sna_output,
 					 sna_output->backlight_active_level);
 	}
 
@@ -2710,7 +2711,7 @@ sna_output_set_property(xf86OutputPtr output, Atom property,
 
 		sna_output->backlight_active_level = val;
 		if (sna_output->dpms_mode == DPMSModeOn)
-			sna_output_backlight_set(output, val);
+			sna_output_backlight_set(sna_output, val);
 		return TRUE;
 	}
 
@@ -3196,6 +3197,7 @@ sna_output_add(struct sna *sna, int id, int serial)
 		compat_conn.conn.subpixel = 0;
 	output->subpixel_order = subpixel_conv_table[compat_conn.conn.subpixel];
 	output->driver_private = sna_output;
+	sna_output->base = output;
 
 	if (sna_output->is_panel)
 		sna_output_backlight_init(output);
@@ -5408,6 +5410,20 @@ void sna_mode_reset(struct sna *sna)
 		rotation_reset(&sna_crtc->primary_rotation);
 		rotation_reset(&sna_crtc->sprite_rotation);
 	}
+
+	/* VT switching, likely to fbcon so make the backlight usable */
+	for (i = 0; i < sna->mode.num_real_output; i++) {
+		struct sna_output *sna_output = to_sna_output(config->output[i]);
+
+		assert(sna_output != NULL);
+		assert(sna_output->dpms_mode == DPMSModeOff);
+
+		if (!sna_output->backlight.iface)
+			continue;
+
+		sna_output_backlight_set(sna_output,
+					 sna_output->backlight.max);
+	}
 }
 
 static void transformed_box(BoxRec *box, xf86CrtcPtr crtc)


More information about the xorg-commit mailing list