diff options
author | Mark Brown <broonie@kernel.org> | 2015-01-28 17:03:48 +0000 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2015-01-28 17:03:48 +0000 |
commit | 1874098820e8269fe88d67bc08c908134dd87102 (patch) | |
tree | 836a33047e4791d4d11b0f5e15a07de62294bb2a /drivers/usb/host | |
parent | 15f82fce54b86e159fe5a1d41dcdc89e12b26459 (diff) | |
parent | 5d53369ea537c7e13e151c157003c399d1d928c3 (diff) |
Merge tag 'v3.10.66' into linux-linaro-lsk
This is the 3.10.66 stable release
Diffstat (limited to 'drivers/usb/host')
-rw-r--r-- | drivers/usb/host/pci-quirks.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c index 9cfe3af3101a..66c905884496 100644 --- a/drivers/usb/host/pci-quirks.c +++ b/drivers/usb/host/pci-quirks.c @@ -470,7 +470,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)) @@ -480,6 +481,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. */ @@ -518,7 +526,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 */ @@ -527,7 +537,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); |