]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/usb/host/ehci-pci.c
USB: EHCI: work around bug in the Philips ISP1562 controller
[karo-tx-linux.git] / drivers / usb / host / ehci-pci.c
index 01bb7241d6efd53f3769d47e86d59a28c5cf9ce2..4baafa3e80b270854bf43bf7f0563025c79bdb12 100644 (file)
@@ -97,6 +97,13 @@ static int ehci_pci_setup(struct usb_hcd *hcd)
                        break;
                }
                break;
+
+       case PCI_VENDOR_ID_PHILIPS:
+               /*
+                * Philips controllers set HCC_PGM_FRAMELISTLEN, but
+                * they don't implement schedule sizes shorter than 1024.
+                */
+               ehci->sched_size_bug = 1;
        }
 
        /* cache this readonly data; minimize chip reads */
@@ -144,6 +151,14 @@ static int ehci_pci_setup(struct usb_hcd *hcd)
                        hcd->has_tt = 1;
                        tdi_reset(ehci);
                }
+               if (pdev->subsystem_vendor == PCI_VENDOR_ID_ASUSTEK) {
+                       /* EHCI #1 or #2 on 6 Series/C200 Series chipset */
+                       if (pdev->device == 0x1c26 || pdev->device == 0x1c2d) {
+                               ehci_info(ehci, "broken D3 during system sleep on ASUS\n");
+                               hcd->broken_pci_sleep = 1;
+                               device_set_wakeup_capable(&pdev->dev, false);
+                       }
+               }
                break;
        case PCI_VENDOR_ID_TDI:
                if (pdev->device == PCI_DEVICE_ID_TDI_EHCI) {
@@ -360,7 +375,9 @@ static bool usb_is_intel_switchable_ehci(struct pci_dev *pdev)
 {
        return pdev->class == PCI_CLASS_SERIAL_USB_EHCI &&
                pdev->vendor == PCI_VENDOR_ID_INTEL &&
-               pdev->device == 0x1E26;
+               (pdev->device == 0x1E26 ||
+                pdev->device == 0x8C2D ||
+                pdev->device == 0x8C26);
 }
 
 static void ehci_enable_xhci_companion(void)