|
@@ -567,7 +567,8 @@ static void quirk_usb_handoff_ohci(struct pci_dev *pdev)
|
|
|
{
|
|
|
void __iomem *base;
|
|
|
u32 control;
|
|
|
- u32 fminterval;
|
|
|
+ u32 fminterval = 0;
|
|
|
+ bool no_fminterval = false;
|
|
|
int cnt;
|
|
|
|
|
|
if (!mmio_resource_enabled(pdev, 0))
|
|
@@ -577,6 +578,13 @@ static void quirk_usb_handoff_ohci(struct pci_dev *pdev)
|
|
|
if (base == NULL)
|
|
|
return;
|
|
|
|
|
|
+ /*
|
|
|
+ * ULi M5237 OHCI controller locks the whole system when accessing
|
|
|
+ * the OHCI_FMINTERVAL offset.
|
|
|
+ */
|
|
|
+ if (pdev->vendor == PCI_VENDOR_ID_AL && pdev->device == 0x5237)
|
|
|
+ no_fminterval = true;
|
|
|
+
|
|
|
control = readl(base + OHCI_CONTROL);
|
|
|
|
|
|
/* On PA-RISC, PDC can leave IR set incorrectly; ignore it there. */
|
|
@@ -615,7 +623,9 @@ static void quirk_usb_handoff_ohci(struct pci_dev *pdev)
|
|
|
}
|
|
|
|
|
|
/* software reset of the controller, preserving HcFmInterval */
|
|
|
- fminterval = readl(base + OHCI_FMINTERVAL);
|
|
|
+ if (!no_fminterval)
|
|
|
+ fminterval = readl(base + OHCI_FMINTERVAL);
|
|
|
+
|
|
|
writel(OHCI_HCR, base + OHCI_CMDSTATUS);
|
|
|
|
|
|
/* reset requires max 10 us delay */
|
|
@@ -624,7 +634,9 @@ static void quirk_usb_handoff_ohci(struct pci_dev *pdev)
|
|
|
break;
|
|
|
udelay(1);
|
|
|
}
|
|
|
- writel(fminterval, base + OHCI_FMINTERVAL);
|
|
|
+
|
|
|
+ if (!no_fminterval)
|
|
|
+ writel(fminterval, base + OHCI_FMINTERVAL);
|
|
|
|
|
|
/* Now the controller is safely in SUSPEND and nothing can wake it up */
|
|
|
iounmap(base);
|