| From 2b758350af19db9a5c98241cf222c2e211d7a912 Mon Sep 17 00:00:00 2001 |
| From: Pratyush Anand <pratyush.anand@st.com> |
| Date: Mon, 14 Jan 2013 15:59:31 +0530 |
| Subject: usb: dwc3: Enable usb2 LPM only when connected as usb2.0 |
| |
| From: Pratyush Anand <pratyush.anand@st.com> |
| |
| commit 2b758350af19db9a5c98241cf222c2e211d7a912 upstream. |
| |
| Synopsys says: |
| The HIRD Threshold field must be set to ‘0’ when the device core is |
| operating in super speed mode. |
| |
| This patch implements above statement. |
| |
| Acked-by: Paul Zimmerman <paulz@synopsys.com> |
| Signed-off-by: Pratyush Anand <pratyush.anand@st.com> |
| Signed-off-by: Felipe Balbi <balbi@ti.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/usb/dwc3/gadget.c | 31 ++++++++++++++++++------------- |
| 1 file changed, 18 insertions(+), 13 deletions(-) |
| |
| --- a/drivers/usb/dwc3/gadget.c |
| +++ b/drivers/usb/dwc3/gadget.c |
| @@ -2157,6 +2157,23 @@ static void dwc3_gadget_conndone_interru |
| break; |
| } |
| |
| + /* Enable USB2 LPM Capability */ |
| + |
| + if ((dwc->revision > DWC3_REVISION_194A) |
| + && (speed != DWC3_DCFG_SUPERSPEED)) { |
| + reg = dwc3_readl(dwc->regs, DWC3_DCFG); |
| + reg |= DWC3_DCFG_LPM_CAP; |
| + dwc3_writel(dwc->regs, DWC3_DCFG, reg); |
| + |
| + reg = dwc3_readl(dwc->regs, DWC3_DCTL); |
| + reg &= ~(DWC3_DCTL_HIRD_THRES_MASK | DWC3_DCTL_L1_HIBER_EN); |
| + |
| + /* TODO: This should be configurable */ |
| + reg |= DWC3_DCTL_HIRD_THRES(28); |
| + |
| + dwc3_writel(dwc->regs, DWC3_DCTL, reg); |
| + } |
| + |
| /* Recent versions support automatic phy suspend and don't need this */ |
| if (dwc->revision < DWC3_REVISION_194A) { |
| /* Suspend unneeded PHY */ |
| @@ -2463,20 +2480,8 @@ int dwc3_gadget_init(struct dwc3 *dwc) |
| DWC3_DEVTEN_DISCONNEVTEN); |
| dwc3_writel(dwc->regs, DWC3_DEVTEN, reg); |
| |
| - /* Enable USB2 LPM and automatic phy suspend only on recent versions */ |
| + /* automatic phy suspend only on recent versions */ |
| if (dwc->revision >= DWC3_REVISION_194A) { |
| - reg = dwc3_readl(dwc->regs, DWC3_DCFG); |
| - reg |= DWC3_DCFG_LPM_CAP; |
| - dwc3_writel(dwc->regs, DWC3_DCFG, reg); |
| - |
| - reg = dwc3_readl(dwc->regs, DWC3_DCTL); |
| - reg &= ~(DWC3_DCTL_HIRD_THRES_MASK | DWC3_DCTL_L1_HIBER_EN); |
| - |
| - /* TODO: This should be configurable */ |
| - reg |= DWC3_DCTL_HIRD_THRES(28); |
| - |
| - dwc3_writel(dwc->regs, DWC3_DCTL, reg); |
| - |
| dwc3_gadget_usb2_phy_suspend(dwc, false); |
| dwc3_gadget_usb3_phy_suspend(dwc, false); |
| } |