summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/i830_lvds.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/src/i830_lvds.c b/src/i830_lvds.c
index 899c6cbf..ecb41c91 100644
--- a/src/i830_lvds.c
+++ b/src/i830_lvds.c
@@ -63,6 +63,9 @@ struct i830_lvds_priv {
/* The panel needs dithering enabled */
Bool panel_wants_dither;
+ /* The panel is in DPMS off */
+ Bool dpmsoff;
+
/* restore backlight to this value */
int backlight_duty_cycle;
@@ -334,6 +337,7 @@ i830_lvds_get_backlight_kernel(xf86OutputPtr output)
return 0;
}
+ memset(val, 0, sizeof(val));
if (read(fd, val, BACKLIGHT_VALUE_LEN) == -1)
goto out_err;
@@ -388,6 +392,10 @@ i830SetLVDSPanelPower(xf86OutputPtr output, Bool on)
uint32_t pp_status;
if (on) {
+ /* if we're going from on->on, be aware to current level. */
+ if ((INREG(PP_CONTROL) & POWER_TARGET_ON) && !dev_priv->dpmsoff)
+ dev_priv->backlight_duty_cycle = dev_priv->get_backlight(output);
+
/*
* If we're going from off->on we may need to turn on the backlight.
* We should use the saved value whenever possible, but on some
@@ -405,12 +413,13 @@ i830SetLVDSPanelPower(xf86OutputPtr output, Bool on)
} while ((pp_status & PP_ON) == 0);
dev_priv->set_backlight(output, dev_priv->backlight_duty_cycle);
+ dev_priv->dpmsoff = FALSE;
} else {
/*
* Only save the current backlight value if we're going from
* on to off.
*/
- if (INREG(PP_CONTROL) & POWER_TARGET_ON)
+ if ((INREG(PP_CONTROL) & POWER_TARGET_ON) && !dev_priv->dpmsoff)
dev_priv->backlight_duty_cycle = dev_priv->get_backlight(output);
dev_priv->set_backlight(output, 0);
@@ -418,6 +427,8 @@ i830SetLVDSPanelPower(xf86OutputPtr output, Bool on)
do {
pp_status = INREG(PP_STATUS);
} while (pp_status & PP_ON);
+
+ dev_priv->dpmsoff = TRUE;
}
}
@@ -447,7 +458,8 @@ i830_lvds_save (xf86OutputPtr output)
pI830->savePP_CONTROL = INREG(PP_CONTROL);
pI830->savePP_CYCLE = INREG(PP_CYCLE);
pI830->saveBLC_PWM_CTL = INREG(BLC_PWM_CTL);
- dev_priv->backlight_duty_cycle = dev_priv->get_backlight(output);
+ if ((INREG(PP_CONTROL) & POWER_TARGET_ON) && !dev_priv->dpmsoff)
+ dev_priv->backlight_duty_cycle = dev_priv->get_backlight(output);
}
static void
@@ -1081,7 +1093,10 @@ i830_lvds_set_property(xf86OutputPtr output, Atom property,
"RRConfigureOutputProperty error, %d\n", ret);
}
/* Set the current value of the backlight property */
- data = dev_priv->get_backlight(output);
+ if ((INREG(PP_CONTROL) & POWER_TARGET_ON) && !dev_priv->dpmsoff)
+ data = dev_priv->get_backlight(output);
+ else
+ data = dev_priv->backlight_duty_cycle;
ret = RRChangeOutputProperty(output->randr_output, backlight_atom,
XA_INTEGER, 32, PropModeReplace, 1, &data,
FALSE, TRUE);
@@ -1140,8 +1155,11 @@ i830_lvds_get_property(xf86OutputPtr output, Atom property)
*/
if (property == backlight_atom) {
int val;
- val = dev_priv->get_backlight(output);
- dev_priv->backlight_duty_cycle = val;
+ if ((INREG(PP_CONTROL) & POWER_TARGET_ON) && !dev_priv->dpmsoff) {
+ val = dev_priv->get_backlight(output);
+ dev_priv->backlight_duty_cycle = val;
+ } else
+ val = dev_priv->backlight_duty_cycle;
ret = RRChangeOutputProperty(output->randr_output, backlight_atom,
XA_INTEGER, 32, PropModeReplace, 1, &val,
FALSE, TRUE);