diff options
author | Nikhil Badola <nikhil.badola@freescale.com> | 2015-03-26 03:44:00 (GMT) |
---|---|---|
committer | Honghua Yin <Hong-Hua.Yin@freescale.com> | 2015-03-30 01:46:51 (GMT) |
commit | ae91f5e5859b48f4b2a568b96ecd111003d6bca3 (patch) | |
tree | c9c5ef74c53d735ef03b017affb02e936dcbad69 /drivers/usb | |
parent | 4a8d624bde57986a84c07ce930a5a6a453ef9ff5 (diff) | |
download | linux-fsl-qoriq-ae91f5e5859b48f4b2a568b96ecd111003d6bca3.tar.xz |
drivers:usb:dwc3 : Implement workaround for Erratum A009116
Write fladj register adjusts (micro)frame length to appropriate
value thus avoiding USB 2.0 devices to time-out over a longer run
Signed-off-by: Nikhil Badola <nikhil.badola@freescale.com>
Change-Id: I26df8b7d134d08171a096dba7871f7334be02315
Reviewed-on: http://git.am.freescale.net:8181/33664
Tested-by: Review Code-CDREVIEW <CDREVIEW@freescale.com>
Reviewed-by: Ramneek Mehresh <ramneek.mehresh@freescale.com>
Reviewed-by: Honghua Yin <Hong-Hua.Yin@freescale.com>
Diffstat (limited to 'drivers/usb')
-rw-r--r-- | drivers/usb/dwc3/core.c | 7 | ||||
-rw-r--r-- | drivers/usb/dwc3/core.h | 7 |
2 files changed, 14 insertions, 0 deletions
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index bd1a8b6..4787d66 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c @@ -391,6 +391,8 @@ static int dwc3_probe(struct platform_device *pdev) dwc->usb3_phy = devm_usb_get_phy_by_phandle(dev, "usb-phy", 1); dwc->needs_fifo_resize = of_property_read_bool(node, "tx-fifo-resize"); + dwc->configure_gfladj = + of_property_read_bool(node, "configure-gfladj"); dwc->dr_mode = of_usb_get_dr_mode(node); } else if (pdata) { dwc->maximum_speed = pdata->maximum_speed; @@ -488,6 +490,11 @@ static int dwc3_probe(struct platform_device *pdev) goto err1; } + /* Adjust Frame Length */ + if (dwc->configure_gfladj) + dwc3_writel(dwc->regs, DWC3_GFLADJ, GFLADJ_30MHZ_REG_SEL | + GFLADJ_30MHZ(GFLADJ_30MHZ_DEFAULT)); + if (IS_ENABLED(CONFIG_USB_DWC3_HOST)) dwc->dr_mode = USB_DR_MODE_HOST; else if (IS_ENABLED(CONFIG_USB_DWC3_GADGET)) diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h index 546e67a..2d2ceae 100644 --- a/drivers/usb/dwc3/core.h +++ b/drivers/usb/dwc3/core.h @@ -118,6 +118,7 @@ #define DWC3_GEVNTCOUNT(n) (0xc40c + (n * 0x10)) #define DWC3_GHWPARAMS8 0xc600 +#define DWC3_GFLADJ 0xc630 /* Device Registers */ #define DWC3_DCFG 0xc700 @@ -191,6 +192,11 @@ #define DWC3_GHWPARAMS4_HIBER_SCRATCHBUFS(n) (((n) & (0x0f << 13)) >> 13) #define DWC3_MAX_HIBER_SCRATCHBUFS 15 +/* Global Frame Length Adjustment Register */ +#define GFLADJ_30MHZ_REG_SEL (1 << 7) +#define GFLADJ_30MHZ(n) ((n) & 0x3f) +#define GFLADJ_30MHZ_DEFAULT 0x20 + /* Device Configuration Register */ #define DWC3_DCFG_DEVADDR(addr) ((addr) << 3) #define DWC3_DCFG_DEVADDR_MASK DWC3_DCFG_DEVADDR(0x7f) @@ -704,6 +710,7 @@ struct dwc3 { unsigned setup_packet_pending:1; unsigned delayed_status:1; unsigned needs_fifo_resize:1; + unsigned configure_gfladj:1; unsigned resize_fifos:1; unsigned pullups_connected:1; |