On Wed, 2005-03-16 at 10:16 -0500, Theodore Y. Ts'o wrote: > Force the Radeon video chipset on IBM Thinkpads to use the D2 state when > suspending in order to save a much greater amount of power. > > This patch is based on an earlier version by Volker Braun, but instead > of using an explicit whitelist that would have to contain hundreds of > entries, instead we enable going to the D2 state for IBM Thinkpads if a > CONFIG_EXPERIMENTAL option (CONFIG_FB_RADEON_THINKPAD_PM) is enabled and > use a black-list if necessary. > > Signed-off-by: "Theodore Ts'o" <[EMAIL PROTECTED]>
You probably want to remove the bit that does OUTREG(TV_DAC_CNTL, INREG(TV_DAC_CNTL) | 0x07000000); Or you'll lose TV output :) Ben. > > Index: src/drivers/video/Kconfig > =================================================================== > --- src.orig/drivers/video/Kconfig 2005-03-14 12:40:48.000000000 -0500 > +++ src/drivers/video/Kconfig 2005-03-16 00:40:21.000000000 -0500 > @@ -711,6 +711,15 @@ > help > Say Y here if you want DDC/I2C support for your Radeon board. > > +config FB_RADEON_THINKPAD_PM > + bool "Video Power Management for Thinkpads (EXPERIMENTAL)" > + depends on PM && FB_RADEON && X86 && EXPERIMENTAL > + default n > + help > + Say Y here if you want to force the Radeon video chipset on > + IBM Thinkpads to use the D2 state when suspending in order to > + save a much greater amount of power. > + > config FB_RADEON_DEBUG > bool "Lots of debug output from Radeon driver" > depends on FB_RADEON > Index: src/drivers/video/aty/radeon_base.c > =================================================================== > --- src.orig/drivers/video/aty/radeon_base.c 2005-03-14 12:40:48.000000000 > -0500 > +++ src/drivers/video/aty/radeon_base.c 2005-03-14 12:40:48.000000000 > -0500 > @@ -273,6 +273,9 @@ > #ifdef CONFIG_MTRR > static int nomtrr = 0; > #endif > +#ifdef CONFIG_FB_RADEON_THINKPAD_PM > +int radeon_force_sleep = 0; > +#endif > > /* > * prototypes > @@ -2535,6 +2538,10 @@ > force_measure_pll = 1; > } else if (!strncmp(this_opt, "ignore_edid", 11)) { > ignore_edid = 1; > +#ifdef CONFIG_FB_RADEON_THINKPAD_PM > + } else if (!strncmp(this_opt, "force_sleep", 11)) { > + radeon_force_sleep = 1; > +#endif > } else > mode_option = this_opt; > } > @@ -2574,3 +2581,7 @@ > MODULE_PARM_DESC(panel_yres, "int: set panel yres"); > module_param(mode_option, charp, 0); > MODULE_PARM_DESC(mode_option, "Specify resolution as > \"<xres>x<yres>[-<bpp>][@<refresh>]\" "); > +#ifdef CONFIG_FB_RADEON_THINKPAD_PM > +module_param(radeon_force_sleep, int, 0); > +MODULE_PARM_DESC(radeon_force_sleep, "bool: force ACPI sleep mode on > untested machines"); > +#endif > Index: src/drivers/video/aty/radeon_pm.c > =================================================================== > --- src.orig/drivers/video/aty/radeon_pm.c 2005-03-14 12:40:48.000000000 > -0500 > +++ src/drivers/video/aty/radeon_pm.c 2005-03-14 12:40:48.000000000 -0500 > @@ -27,6 +27,27 @@ > > #include "ati_ids.h" > > +#ifdef CONFIG_FB_RADEON_THINKPAD_PM > +#include <linux/dmi.h> > + > +static struct dmi_system_id __devinitdata radeonfb_dmi_table[] = { > + { > + .ident = "IBM ThinkPad", > + .matches = { > + DMI_MATCH(DMI_SYS_VENDOR, "IBM"), > + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad"), > + }, > + }, > + { }, > +}; > + > +static struct dmi_system_id __devinitdata radeonfb_dmi_blacklist[] = { > + { }, > +}; > + > +extern int radeon_force_sleep; > +#endif > + > void radeon_pm_disable_dynamic_mode(struct radeonfb_info *rinfo) > { > u32 tmp; > @@ -2750,6 +2771,30 @@ > #endif > } > #endif /* defined(CONFIG_PM) && defined(CONFIG_PPC_OF) */ > + > + /* The PM code also seems to work on many IBM ThinkPad models, > + * but of course Your Mileage May Vary. > + */ > +#ifdef CONFIG_FB_RADEON_THINKPAD_PM > + if (radeon_force_sleep || > + (rinfo->is_mobility && rinfo->pm_reg && > + (rinfo->family <= CHIP_FAMILY_RV250) && > + dmi_check_system(radeonfb_dmi_table) && > + !dmi_check_system(radeonfb_dmi_blacklist))) { > + if (radeon_force_sleep) > + printk("radeonfb: forcefully enabling sleep mode\n"); > + else > + printk("radeonfb: enabling sleep mode\n"); > + > + rinfo->pm_mode |= radeon_pm_d2; > + > + /* Power down TV DAC, that saves a significant amount of power, > + * we'll have something better once we actually have some TVOut > + * support > + */ > + OUTREG(TV_DAC_CNTL, INREG(TV_DAC_CNTL) | 0x07000000); > + } > +#endif /* CONFIG_FB_RADEON_THINKPAD_PM */ > } > > void radeonfb_pm_exit(struct radeonfb_info *rinfo) -- Benjamin Herrenschmidt <[EMAIL PROTECTED]> - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/