|
@@ -338,3 +338,32 @@ void chrp_pci_fixup_winbond_ata(struct pci_dev *sl82c105)
|
|
|
}
|
|
|
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_WINBOND, PCI_DEVICE_ID_WINBOND_82C105,
|
|
|
chrp_pci_fixup_winbond_ata);
|
|
|
+
|
|
|
+/* Pegasos2 firmware version 20040810 configures the built-in IDE controller
|
|
|
+ * in legacy mode, but sets the PCI registers to PCI native mode.
|
|
|
+ * The chip can only operate in legacy mode, so force the PCI class into legacy
|
|
|
+ * mode as well. The same fixup must be done to the class-code property in
|
|
|
+ * the IDE node /pci@80000000/ide@C,1
|
|
|
+ */
|
|
|
+static void chrp_pci_fixup_vt8231_ata(struct pci_dev *viaide)
|
|
|
+{
|
|
|
+ u8 progif;
|
|
|
+ struct pci_dev *viaisa;
|
|
|
+
|
|
|
+ if (!machine_is(chrp) || _chrp_type != _CHRP_Pegasos)
|
|
|
+ return;
|
|
|
+ if (viaide->irq != 14)
|
|
|
+ return;
|
|
|
+
|
|
|
+ viaisa = pci_get_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8231, NULL);
|
|
|
+ if (!viaisa)
|
|
|
+ return;
|
|
|
+ printk("Fixing VIA IDE, force legacy mode on '%s'\n", viaide->dev.bus_id);
|
|
|
+
|
|
|
+ pci_read_config_byte(viaide, PCI_CLASS_PROG, &progif);
|
|
|
+ pci_write_config_byte(viaide, PCI_CLASS_PROG, progif & ~0x5);
|
|
|
+ viaide->class &= ~0x5;
|
|
|
+
|
|
|
+ pci_dev_put(viaisa);
|
|
|
+}
|
|
|
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_1, chrp_pci_fixup_vt8231_ata);
|