Commit 2f5c33b3 authored by Mark M. Hoffman's avatar Mark M. Hoffman Committed by Linus Torvalds

[PATCH] i2c/pci: fix sis96x smbus quirk once and for all

The sis96x SMBus PCI device depends on two different quirks to run
in a specific order.  Apart from being fragile, this was found to
actually break on (at least) recent FC4, FC5, and FC6 kernels.  This
patch fixes the quirks so that they work without relying on the
compiler and/or linker to put them in any specific order.

  http://lists.lm-sensors.org/pipermail/lm-sensors/2006-April/015962.html
  https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=189719

I tested this patch.
Signed-off-by: default avatarMark M. Hoffman <mhoffman@lightlink.com>
Cc: Andrew Morton <akpm@osdl.org>
Cc: Adrian Bunk <bunk@stusta.de>
Cc: Greg K-H <greg@kroah.com>
Cc: Jean Delvare <khali@linux-fr.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent efa06708
...@@ -1117,10 +1117,11 @@ DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_1, asus_h ...@@ -1117,10 +1117,11 @@ DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_1, asus_h
static void quirk_sis_96x_smbus(struct pci_dev *dev) static void quirk_sis_96x_smbus(struct pci_dev *dev)
{ {
u8 val = 0; u8 val = 0;
printk(KERN_INFO "Enabling SiS 96x SMBus.\n");
pci_read_config_byte(dev, 0x77, &val); pci_read_config_byte(dev, 0x77, &val);
if (val & 0x10) {
printk(KERN_INFO "Enabling SiS 96x SMBus.\n");
pci_write_config_byte(dev, 0x77, val & ~0x10); pci_write_config_byte(dev, 0x77, val & ~0x10);
pci_read_config_byte(dev, 0x77, &val); }
} }
/* /*
...@@ -1152,11 +1153,12 @@ static void quirk_sis_503(struct pci_dev *dev) ...@@ -1152,11 +1153,12 @@ static void quirk_sis_503(struct pci_dev *dev)
printk(KERN_WARNING "Uncovering SIS%x that hid as a SIS503 (compatible=%d)\n", devid, sis_96x_compatible); printk(KERN_WARNING "Uncovering SIS%x that hid as a SIS503 (compatible=%d)\n", devid, sis_96x_compatible);
/* /*
* Ok, it now shows up as a 96x.. The 96x quirks are after * Ok, it now shows up as a 96x.. run the 96x quirk by
* the 503 quirk in the quirk table, so they'll automatically * hand in case it has already been processed.
* run and enable things like the SMBus device * (depends on link order, which is apparently not guaranteed)
*/ */
dev->device = devid; dev->device = devid;
quirk_sis_96x_smbus(dev);
} }
static void __init quirk_sis_96x_compatible(struct pci_dev *dev) static void __init quirk_sis_96x_compatible(struct pci_dev *dev)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment