PATCH 2.3.41.2: Replace Via support for ACPI
Martin Mares
mj en suse.cz
Lun Ene 24 09:47:23 CST 2000
Hi Jeff,
> Attached is a patch against 2.3.41-pre2 which adds back Via support. It
> does so using the new PCI table-driven device matching code, which
> should make it easy to add other chipsets.
I don't understand why did you introduce the acpi_chip_info[] table
and especially why does it contain CH_xxx constants which are equivalent
to entry indices. To me, it looks best to use the driver data field
in acpi_pci_tbl[] to point directly to the init function.
Here I attach my patch to an older version of the ACPI driver, feel
free to adapt it for the new version.
Have a nice fortnight
--
Martin `MJ' Mares <mj en ucw.cz> <mj en suse.cz> http://atrey.karlin.mff.cuni.cz/~mj/
"IBM = Inferior, But Marketable"
--- arch/i386/kernel/acpi.c.mj Fri Jan 14 12:02:56 2000
+++ arch/i386/kernel/acpi.c Fri Jan 14 12:11:47 2000
@@ -516,7 +516,7 @@
pci_read_config_byte(dev, ACPI_PIIX4_PMREGMISC, &pmregmisc);
if (!(pmregmisc & ACPI_PIIX4_PMIOSE))
return -ENODEV;
-
+
pci_read_config_dword(dev, 0x40, &base);
if (!(base & PCI_BASE_ADDRESS_SPACE_IO))
return -ENODEV;
@@ -572,7 +572,7 @@
if (!(tmp & 0x80))
return -ENODEV;
- pci_read_config_byte(dev, 8, &tmp);
+ pci_read_config_byte(dev, PCI_CLASS_REVISION, &tmp);
tmp = (tmp & 0x10 ? 0x48 : 0x20);
pci_read_config_dword(dev, tmp, &base);
@@ -626,31 +626,35 @@
return 0;
}
-static struct pci_simple_probe_entry acpi_devices[] __initdata =
+static struct pci_device_id acpi_id_table[] __initdata =
{
- {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3, 0, 0,
- acpi_init_piix4},
- {PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_3, 0, 0,
- acpi_init_via},
+ {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3,
+ PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+ (unsigned long) acpi_init_piix4},
+ {PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_3,
+ PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+ (unsigned long) acpi_init_via},
{0,}
};
/*
* Probe for matching PCI device
*/
-static int __init acpi_probe(struct pci_dev *dev,
- int match,
- const struct pci_simple_probe_entry *entry,
- void *data)
-{
- if(entry->dev_data) {
- typedef int (*init_fn)(struct pci_dev*);
- init_fn init = (init_fn) entry->dev_data;
- return (*init)(dev);
- }
- return -ENODEV;
+static int __init acpi_probe(struct pci_dev *dev, struct pci_device_id *id)
+{
+ typedef int (*init_fn)(struct pci_dev*);
+ init_fn init = (init_fn) id->driver_data;
+ return (*init)(dev);
}
+static struct pci_driver acpi_driver = {
+ name: "acpi",
+ id_table: acpi_id_table,
+ probe: acpi_probe
+};
+
+static int acpi_chipset_known;
+
/*
* Handle an ACPI SCI (fixed or general purpose event)
*/
@@ -1254,10 +1258,11 @@
if (acpi_disabled)
return -ENODEV;
- if (acpi_find_tables()
- && pci_simple_probe(acpi_devices, 0, acpi_probe, NULL) <= 0) {
- // no ACPI tables and not a recognized ACPI chipset
- return -ENODEV;
+ if (acpi_find_tables()) {
+ // no ACPI tables, try to recognize the chipset
+ if (!pci_register_driver(&acpi_driver))
+ return -ENODEV;
+ acpi_chipset_known = 1;
}
/*
@@ -1287,6 +1292,8 @@
printk(KERN_ERR "ACPI: SCI (IRQ%d) allocation failed\n",
acpi_facp->sci_int);
acpi_destroy_tables();
+ if (acpi_chipset_known)
+ pci_unregister_driver(&acpi_driver);
return -ENODEV;
}
@@ -1333,6 +1340,8 @@
free_irq(acpi_facp->sci_int, acpi_facp);
acpi_destroy_tables();
+ if (acpi_chipset_known)
+ pci_unregister_driver(&acpi_driver);
}
static int __init acpi_setup(char *str)
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo en vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/
Más información sobre la lista de distribución Ayuda