diff options
Diffstat (limited to 'drivers/pci/quirks.c')
-rw-r--r-- | drivers/pci/quirks.c | 49 |
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_ | |||
1175 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_963, quirk_sis_96x_smbus ); | 1175 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_963, quirk_sis_96x_smbus ); |
1176 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_LPC, quirk_sis_96x_smbus ); | 1176 | DECLARE_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 | |||
1186 | static 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 | |||
1223 | DECLARE_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 |
1179 | static void __init quirk_alder_ioapic(struct pci_dev *pdev) | 1228 | static void __init quirk_alder_ioapic(struct pci_dev *pdev) |
1180 | { | 1229 | { |