aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci/quirks.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pci/quirks.c')
-rw-r--r--drivers/pci/quirks.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index e9a57afa1a08..de3bbc88fb26 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -1175,6 +1175,55 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_962, quirk_sis_96x_
1175DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_963, quirk_sis_96x_smbus ); 1175DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_963, quirk_sis_96x_smbus );
1176DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_LPC, quirk_sis_96x_smbus ); 1176DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_LPC, quirk_sis_96x_smbus );
1177 1177
1178#if defined(CONFIG_SCSI_SATA) || defined(CONFIG_SCSI_SATA_MODULE)
1179
1180/*
1181 * If we are using libata we can drive this chip properly but must
1182 * do this early on to make the additional device appear during
1183 * the PCI scanning.
1184 */
1185
1186static void __devinit quirk_jmicron_dualfn(struct pci_dev *pdev)
1187{
1188 u32 conf;
1189 u8 hdr;
1190
1191 /* Only poke fn 0 */
1192 if (PCI_FUNC(pdev->devfn))
1193 return;
1194
1195 switch(pdev->device) {
1196 case PCI_DEVICE_ID_JMICRON_JMB365:
1197 case PCI_DEVICE_ID_JMICRON_JMB366:
1198 /* Redirect IDE second PATA port to the right spot */
1199 pci_read_config_dword(pdev, 0x80, &conf);
1200 conf |= (1 << 24);
1201 /* Fall through */
1202 pci_write_config_dword(pdev, 0x80, conf);
1203 case PCI_DEVICE_ID_JMICRON_JMB361:
1204 case PCI_DEVICE_ID_JMICRON_JMB363:
1205 pci_read_config_dword(pdev, 0x40, &conf);
1206 /* Enable dual function mode, AHCI on fn 0, IDE fn1 */
1207 /* Set the class codes correctly and then direct IDE 0 */
1208 conf &= ~0x000F0200; /* Clear bit 9 and 16-19 */
1209 conf |= 0x00C20002; /* Set bit 1, 17, 22, 23 */
1210 pci_write_config_dword(pdev, 0x40, conf);
1211
1212 /* Reconfigure so that the PCI scanner discovers the
1213 device is now multifunction */
1214
1215 pci_read_config_byte(pdev, PCI_HEADER_TYPE, &hdr);
1216 pdev->hdr_type = hdr & 0x7f;
1217 pdev->multifunction = !!(hdr & 0x80);
1218
1219 break;
1220 }
1221}
1222
1223DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, quirk_jmicron_dualfn);
1224
1225#endif
1226
1178#ifdef CONFIG_X86_IO_APIC 1227#ifdef CONFIG_X86_IO_APIC
1179static void __init quirk_alder_ioapic(struct pci_dev *pdev) 1228static void __init quirk_alder_ioapic(struct pci_dev *pdev)
1180{ 1229{