diff options
Diffstat (limited to 'drivers/usb/host')
| -rw-r--r-- | drivers/usb/host/ehci-fsl.c | 3 | ||||
| -rw-r--r-- | drivers/usb/host/ohci-hub.c | 18 | ||||
| -rw-r--r-- | drivers/usb/host/ohci-pci.c | 1 | ||||
| -rw-r--r-- | drivers/usb/host/ohci.h | 2 | 
4 files changed, 23 insertions, 1 deletions
| diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c index 6f2c8d3899d2..cf2734b532a7 100644 --- a/drivers/usb/host/ehci-fsl.c +++ b/drivers/usb/host/ehci-fsl.c @@ -248,7 +248,8 @@ static int ehci_fsl_setup_phy(struct usb_hcd *hcd,  		break;  	} -	if (pdata->have_sysif_regs && pdata->controller_ver && +	if (pdata->have_sysif_regs && +	    pdata->controller_ver > FSL_USB_VER_1_6 &&  	    (phy_mode == FSL_USB2_PHY_ULPI)) {  		/* check PHY_CLK_VALID to get phy clk valid */  		if (!(spin_event_timeout(in_be32(non_ehci + FSL_SOC_USB_CTRL) & diff --git a/drivers/usb/host/ohci-hub.c b/drivers/usb/host/ohci-hub.c index c81c8721cc5a..cd871b895013 100644 --- a/drivers/usb/host/ohci-hub.c +++ b/drivers/usb/host/ohci-hub.c @@ -90,6 +90,24 @@ __acquires(ohci->lock)  	dl_done_list (ohci);  	finish_unlinks (ohci, ohci_frame_no(ohci)); +	/* +	 * Some controllers don't handle "global" suspend properly if +	 * there are unsuspended ports.  For these controllers, put all +	 * the enabled ports into suspend before suspending the root hub. +	 */ +	if (ohci->flags & OHCI_QUIRK_GLOBAL_SUSPEND) { +		__hc32 __iomem	*portstat = ohci->regs->roothub.portstatus; +		int		i; +		unsigned	temp; + +		for (i = 0; i < ohci->num_ports; (++i, ++portstat)) { +			temp = ohci_readl(ohci, portstat); +			if ((temp & (RH_PS_PES | RH_PS_PSS)) == +					RH_PS_PES) +				ohci_writel(ohci, RH_PS_PSS, portstat); +		} +	} +  	/* maybe resume can wake root hub */  	if (ohci_to_hcd(ohci)->self.root_hub->do_remote_wakeup || autostop) {  		ohci->hc_control |= OHCI_CTRL_RWE; diff --git a/drivers/usb/host/ohci-pci.c b/drivers/usb/host/ohci-pci.c index 90879e9ccbec..bb1509675727 100644 --- a/drivers/usb/host/ohci-pci.c +++ b/drivers/usb/host/ohci-pci.c @@ -160,6 +160,7 @@ static int ohci_quirk_amd700(struct usb_hcd *hcd)  		ohci_dbg(ohci, "enabled AMD prefetch quirk\n");  	} +	ohci->flags |= OHCI_QUIRK_GLOBAL_SUSPEND;  	return 0;  } diff --git a/drivers/usb/host/ohci.h b/drivers/usb/host/ohci.h index 9250cada13f0..4550ce05af7f 100644 --- a/drivers/usb/host/ohci.h +++ b/drivers/usb/host/ohci.h @@ -405,6 +405,8 @@ struct ohci_hcd {  #define	OHCI_QUIRK_HUB_POWER	0x100			/* distrust firmware power/oc setup */  #define	OHCI_QUIRK_AMD_PLL	0x200			/* AMD PLL quirk*/  #define	OHCI_QUIRK_AMD_PREFETCH	0x400			/* pre-fetch for ISO transfer */ +#define	OHCI_QUIRK_GLOBAL_SUSPEND	0x800		/* must suspend ports */ +  	// there are also chip quirks/bugs in init logic  	struct work_struct	nec_work;	/* Worker for NEC quirk */ |