|
@@ -124,3 +124,55 @@ static void pci_fixup_83c553(struct pci_dev *dev)
|
|
|
/*
|
|
|
* Route INTA input to IRQ 11, and set IRQ11 to be level
|
|
|
* sensitive.
|
|
|
+ */
|
|
|
+ pci_write_config_word(dev, 0x44, 0xb000);
|
|
|
+ outb(0x08, 0x4d1);
|
|
|
+}
|
|
|
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_WINBOND, PCI_DEVICE_ID_WINBOND_83C553, pci_fixup_83c553);
|
|
|
+
|
|
|
+static void pci_fixup_unassign(struct pci_dev *dev)
|
|
|
+{
|
|
|
+ dev->resource[0].end -= dev->resource[0].start;
|
|
|
+ dev->resource[0].start = 0;
|
|
|
+}
|
|
|
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_WINBOND2, PCI_DEVICE_ID_WINBOND2_89C940F, pci_fixup_unassign);
|
|
|
+
|
|
|
+/*
|
|
|
+ * Prevent the PCI layer from seeing the resources allocated to this device
|
|
|
+ * if it is the host bridge by marking it as such. These resources are of
|
|
|
+ * no consequence to the PCI layer (they are handled elsewhere).
|
|
|
+ */
|
|
|
+static void pci_fixup_dec21285(struct pci_dev *dev)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+
|
|
|
+ if (dev->devfn == 0) {
|
|
|
+ dev->class &= 0xff;
|
|
|
+ dev->class |= PCI_CLASS_BRIDGE_HOST << 8;
|
|
|
+ for (i = 0; i < PCI_NUM_RESOURCES; i++) {
|
|
|
+ dev->resource[i].start = 0;
|
|
|
+ dev->resource[i].end = 0;
|
|
|
+ dev->resource[i].flags = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_21285, pci_fixup_dec21285);
|
|
|
+
|
|
|
+/*
|
|
|
+ * PCI IDE controllers use non-standard I/O port decoding, respect it.
|
|
|
+ */
|
|
|
+static void pci_fixup_ide_bases(struct pci_dev *dev)
|
|
|
+{
|
|
|
+ struct resource *r;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ if ((dev->class >> 8) != PCI_CLASS_STORAGE_IDE)
|
|
|
+ return;
|
|
|
+
|
|
|
+ for (i = 0; i < PCI_NUM_RESOURCES; i++) {
|
|
|
+ r = dev->resource + i;
|
|
|
+ if ((r->start & ~0x80) == 0x374) {
|
|
|
+ r->start |= 2;
|
|
|
+ r->end = r->start;
|
|
|
+ }
|
|
|
+ }
|