diff options
Diffstat (limited to 'drivers/usb/host/pci-quirks.c')
| -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 dd483c13565b..ce636466edb7 100644 --- a/drivers/usb/host/pci-quirks.c +++ b/drivers/usb/host/pci-quirks.c @@ -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); | 
