| From: Nikita Yushchenko <nyushchenko@dev.rtsoft.ru> |
| Subject: [PATCH] usb: pci-quirks: do not access OHCI_FMINTERVAL register on ULI hw |
| |
| This access causes hang on Freescale P2020DS board (that has OHCI |
| provided by ULI 1533 chip). |
| |
| Since preserving OHCI_FMINTERVAL was originally done only for NVIDIA |
| hardware and only later (in c6187597) was turned unconditional, and |
| c6187597 commit message again mentions only NVIDIA, I think it should be |
| safe to disable preserving OHCI_FMINTERVAL if device vendor is ULI. |
| |
| Signed-off-by: Nikita Yushchenko <nyushchenko@dev.rtsoft.ru> |
| --- |
| drivers/usb/host/pci-quirks.c | 8 +++++--- |
| 1 file changed, 5 insertions(+), 3 deletions(-) |
| |
| diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c |
| index 00661d3..5acbd5b 100644 |
| --- a/drivers/usb/host/pci-quirks.c |
| +++ b/drivers/usb/host/pci-quirks.c |
| @@ -571,7 +571,7 @@ static void quirk_usb_handoff_ohci(struct pci_dev *pdev) |
| { |
| void __iomem *base; |
| u32 control; |
| - u32 fminterval; |
| + u32 uninitialized_var(fminterval); |
| int cnt; |
| |
| if (!mmio_resource_enabled(pdev, 0)) |
| @@ -619,7 +619,8 @@ static void quirk_usb_handoff_ohci(struct pci_dev *pdev) |
| } |
| |
| /* software reset of the controller, preserving HcFmInterval */ |
| - fminterval = readl(base + OHCI_FMINTERVAL); |
| + if (pdev->vendor != PCI_VENDOR_ID_AL) |
| + fminterval = readl(base + OHCI_FMINTERVAL); |
| writel(OHCI_HCR, base + OHCI_CMDSTATUS); |
| |
| /* reset requires max 10 us delay */ |
| @@ -628,7 +629,8 @@ static void quirk_usb_handoff_ohci(struct pci_dev *pdev) |
| break; |
| udelay(1); |
| } |
| - writel(fminterval, base + OHCI_FMINTERVAL); |
| + if (pdev->vendor != PCI_VENDOR_ID_AL) |
| + writel(fminterval, base + OHCI_FMINTERVAL); |
| |
| /* Now the controller is safely in SUSPEND and nothing can wake it up */ |
| iounmap(base); |
| -- |
| 1.7.10.4 |