diff --git a/src/i830_lvds.c b/src/i830_lvds.c index 0b6b192..6f448bd 100644 --- a/src/i830_lvds.c +++ b/src/i830_lvds.c @@ -83,16 +83,44 @@ i830_lvds_set_backlight(xf86OutputPtr output, int level) I830Ptr pI830 = I830PTR(pScrn); CARD32 blc_pwm_ctl; - if (i830_lvds_backlight_legacy(pI830)) + if (i830_lvds_backlight_legacy(pI830)) { #if XSERVER_LIBPCIACCESS - pci_device_cfg_write_u8 (pI830->PciInfo, 0xfe, LEGACY_BACKLIGHT_BRIGHTNESS); + pci_device_cfg_write_u8 (pI830->PciInfo, level, LEGACY_BACKLIGHT_BRIGHTNESS); #else - pciWriteByte(pI830->PciTag, LEGACY_BACKLIGHT_BRIGHTNESS, 0xfe); + pciWriteByte(pI830->PciTag, LEGACY_BACKLIGHT_BRIGHTNESS, level); #endif + } else { + blc_pwm_ctl = INREG(BLC_PWM_CTL); + blc_pwm_ctl &= ~BACKLIGHT_DUTY_CYCLE_MASK; + OUTREG(BLC_PWM_CTL, blc_pwm_ctl | (level << BACKLIGHT_DUTY_CYCLE_SHIFT)); + } +} - blc_pwm_ctl = INREG(BLC_PWM_CTL); - blc_pwm_ctl &= ~BACKLIGHT_DUTY_CYCLE_MASK; - OUTREG(BLC_PWM_CTL, blc_pwm_ctl | (level << BACKLIGHT_DUTY_CYCLE_SHIFT)); +/** + * Gets current backlight level. + * + * Returns current backlight level. + */ +static int +i830_lvds_get_backlight(xf86OutputPtr output) +{ + ScrnInfoPtr pScrn = output->scrn; + I830Ptr pI830 = I830PTR(pScrn); + + if (i830_lvds_backlight_legacy(pI830)) { + CARD8 val; +#if XSERVER_LIBPCIACCESS + pci_device_cfg_read_u8 (pI830->PciInfo, &val, LEGACY_BACKLIGHT_BRIGHTNESS); +#else + val = pciReadByte(pI830->PciTag, LEGACY_BACKLIGHT_BRIGHTNESS); + return val; +#endif + } else { + CARD32 blc_pwm_ctl; + blc_pwm_ctl = INREG(BLC_PWM_CTL); + blc_pwm_ctl &= BACKLIGHT_DUTY_CYCLE_MASK; + return blc_pwm_ctl; + } } /** @@ -106,6 +134,9 @@ i830_lvds_get_max_backlight(xf86OutputPtr output) CARD32 pwm_ctl = INREG(BLC_PWM_CTL); CARD32 val; + if (i830_lvds_backlight_legacy(pI830)) + return 0xff; + if (IS_I965GM(pI830)) { val = ((pwm_ctl & BACKLIGHT_MODULATION_FREQ_MASK2) >> BACKLIGHT_MODULATION_FREQ_SHIFT2); @@ -179,8 +210,7 @@ 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 = (pI830->saveBLC_PWM_CTL & - BACKLIGHT_DUTY_CYCLE_MASK); + dev_priv->backlight_duty_cycle = i830_lvds_get_backlight(output); /* * If the light is off at server startup, just make it full brightness