diff options
Diffstat (limited to 'arch/x86/kernel/quirks.c')
| -rw-r--r-- | arch/x86/kernel/quirks.c | 44 | 
1 files changed, 39 insertions, 5 deletions
diff --git a/arch/x86/kernel/quirks.c b/arch/x86/kernel/quirks.c index d1385881810..67465ed8931 100644 --- a/arch/x86/kernel/quirks.c +++ b/arch/x86/kernel/quirks.c @@ -35,9 +35,6 @@ static void __devinit quirk_intel_irqbalance(struct pci_dev *dev)  	if (!(word & (1 << 13))) {  		dev_info(&dev->dev, "Intel E7520/7320/7525 detected; "  			"disabling irq balancing and affinity\n"); -#ifdef CONFIG_IRQBALANCE -		irqbalance_disable(""); -#endif  		noirqdebug_setup("");  #ifdef CONFIG_PROC_FS  		no_irq_affinity = 1; @@ -354,9 +351,27 @@ static void ati_force_hpet_resume(void)  	printk(KERN_DEBUG "Force enabled HPET at resume\n");  } +static u32 ati_ixp4x0_rev(struct pci_dev *dev) +{ +	u32 d; +	u8  b; + +	pci_read_config_byte(dev, 0xac, &b); +	b &= ~(1<<5); +	pci_write_config_byte(dev, 0xac, b); +	pci_read_config_dword(dev, 0x70, &d); +	d |= 1<<8; +	pci_write_config_dword(dev, 0x70, d); +	pci_read_config_dword(dev, 0x8, &d); +	d &= 0xff; +	dev_printk(KERN_DEBUG, &dev->dev, "SB4X0 revision 0x%x\n", d); +	return d; +} +  static void ati_force_enable_hpet(struct pci_dev *dev)  { -	u32 uninitialized_var(val); +	u32 d, val; +	u8  b;  	if (hpet_address || force_hpet_address)  		return; @@ -366,14 +381,33 @@ static void ati_force_enable_hpet(struct pci_dev *dev)  		return;  	} +	d = ati_ixp4x0_rev(dev); +	if (d  < 0x82) +		return; + +	/* base address */  	pci_write_config_dword(dev, 0x14, 0xfed00000);  	pci_read_config_dword(dev, 0x14, &val); + +	/* enable interrupt */ +	outb(0x72, 0xcd6); b = inb(0xcd7); +	b |= 0x1; +	outb(0x72, 0xcd6); outb(b, 0xcd7); +	outb(0x72, 0xcd6); b = inb(0xcd7); +	if (!(b & 0x1)) +		return; +	pci_read_config_dword(dev, 0x64, &d); +	d |= (1<<10); +	pci_write_config_dword(dev, 0x64, d); +	pci_read_config_dword(dev, 0x64, &d); +	if (!(d & (1<<10))) +		return; +  	force_hpet_address = val;  	force_hpet_resume_type = ATI_FORCE_HPET_RESUME;  	dev_printk(KERN_DEBUG, &dev->dev, "Force enabled HPET at 0x%lx\n",  		   force_hpet_address);  	cached_dev = dev; -	return;  }  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP400_SMBUS,  			 ati_force_enable_hpet);  | 
