--- drivers/pci/quirks.c.org	2004-10-18 23:53:06.000000000 +0200
+++ drivers/pci/quirks.c	2004-12-05 00:32:34.000000000 +0100
@@ -21,6 +21,23 @@
 
 #undef DEBUG
 
+/* Power Saving for Athlon/Duron CPUs on Via Chipsets has to be enabled by 
+ * kernel-boot-option "amd_disconnect=yes" . This is cause it looks like 
+ * there are some stability problems on some boards when this option is 
+ * enabled.
+ */
+
+int enable_amd_disconnect;
+
+static int __init amd_disconnect_setup (char *str) {
+	if(!strncmp(str,"yes",3)) {
+	    enable_amd_disconnect=1;
+	}
+	return 1;
+}
+
+__setup("amd_disconnect=", amd_disconnect_setup);
+
 /* Deal with broken BIOS'es that neglect to enable passive release,
    which can cause problems in combination with the 82441FX/PPro MTRRs */
 static void __devinit quirk_passive_release(struct pci_dev *dev)
@@ -158,6 +175,85 @@
 DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_8371_1,	quirk_vialatency );
 DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_8361,		quirk_vialatency );
 
+
+
+/* Power Saving for Athlon/Duron/AthonXP CPUs on Via Chipsets.
+ * Found in the net and modified for supporting KT266/KT266A chipsets
+ * by Daniel Nofftz <nofftz@castor.uni-trier.de>
+ * support for other VIA chipsets added by Sebastian Dröge <mail@slomosnail.de>
+ * This Funktion must be enabled by kernel booting option "amd_disconnect=yes"!
+ */
+
+static void __init quirk_amddisconnect(struct pci_dev *dev)
+{
+	u16 did;
+	u32 res32;
+
+	if(!enable_amd_disconnect) return;
+	
+	pci_read_config_word(dev,PCI_DEVICE_ID,&did);
+
+	if((did==PCI_DEVICE_ID_VIA_8371_0)||(did==PCI_DEVICE_ID_VIA_82C691_0)||(did==PCI_DEVICE_ID_VIA_8361)||(did==PCI_DEVICE_ID_VIA_8363_0)) {
+	    printk(KERN_INFO "Enabling Power Saving: VIA KT133/KX133/KM133/KL133/KN133[A]/KLE133 chipset found.\n");
+	    pci_read_config_dword(dev,0x52&0xfc,&res32);
+	    if ((res32&0x00800000)==0) {
+		printk(KERN_INFO "Enabling disconnect in VIA northbridge.\n");
+		res32|=0x00800000;
+		pci_write_config_dword(dev,0x52&0xfc,res32);
+	    } else
+		printk(KERN_INFO "Disconnect already enabled in VIA northbridge.\n");
+	    
+	}
+	else if((did==PCI_DEVICE_ID_VIA_8367_0)||(did==PCI_DEVICE_ID_VIA_XM266)||(did==PCI_DEVICE_ID_VIA_XN266)) {
+	    printk(KERN_INFO "Enabling Power Saving: KT266[A]/KM266/KN266/KT333[A] chipset found.\n");
+
+	    pci_read_config_dword(dev,0x92&0xfc,&res32);
+	    if ((res32&0x00800000)==0) {
+		printk(KERN_INFO "Enabling disconnect in VIA northbridge.\n");
+		res32|=0x00800000;
+		pci_write_config_dword(dev,0x92&0xfc,res32);
+	    } else
+		printk(KERN_INFO "Disconnect already enabled in VIA northbridge.\n");
+	    
+	    pci_read_config_dword(dev,0x95&0xfc,&res32);
+	    if ((res32&0x00000200)==0) {
+		printk(KERN_INFO "Enabling VLink Auto-disconnect in VIA northbridge.\n");
+		res32|=0x00000200;
+		pci_write_config_dword(dev,0x95&0xfc, res32);
+	    } else
+		printk(KERN_INFO "VLink Auto-disconnect already enabled in VIA northbridge.\n");
+	}
+	else if((did==PCI_DEVICE_ID_VIA_8377_0)||(did==PCI_DEVICE_ID_VIA_8378_0)) {
+	    printk(KERN_INFO "Enabling Power Saving: KT400[A]/KM400 chipset found.\n");
+
+	    pci_read_config_dword(dev,0xD2&0xfc,&res32);
+	    if ((res32&0x00800000)==0) {
+		printk(KERN_INFO "Enabling disconnect in VIA northbridge.\n");
+		res32|=0x00800000;
+		pci_write_config_dword(dev,0xD2&0xfc,res32);
+	    } else
+		printk(KERN_INFO "Disconnect already enabled in VIA northbridge.\n");
+	    
+	    pci_read_config_dword(dev,0xD5&0xfc,&res32);
+	    if ((res32&0x00000200)==0) {
+		printk(KERN_INFO "Enabling VLink Auto-disconnect in VIA northbridge\n");
+		res32|=0x00000200;
+		pci_write_config_dword(dev,0xD5&0xfc, res32);
+	    } else
+		printk(KERN_INFO "VLink Auto-disconnect already enabled in VIA northbridge\n");
+	}
+		
+}
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_8371_0,	quirk_amddisconnect);
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_82C691_0,	quirk_amddisconnect );
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_8361,		quirk_amddisconnect );
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_8363_0,	quirk_amddisconnect );
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_8367_0,	quirk_amddisconnect );
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_XM266,	quirk_amddisconnect );
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_XN266,	quirk_amddisconnect );
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_8377_0,	quirk_amddisconnect );
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_8378_0,	quirk_amddisconnect );
+
 /*
  *	VIA Apollo VP3 needs ETBF on BT848/878
  */
