usb: dwc3: Add support for nominal elastic buffer

This patch adds support for nominal elastic buffer where elastic
buffer mode in GUSB3PIPE_CTRL(0) register will be cleared if
nominal elastic buffer is not present. This is done to avoid
high link error rates and superspeed mode transfer failures if
VDDCX is at super turbo mode voltage 1.05V.

Change-Id: Ifc21077c3009e025fb979132c7fd10b135bf69bb
Signed-off-by: Rohith Kollalsi <rkollals@codeaurora.org>
This commit is contained in:
Rohith Kollalsi 2020-10-29 10:07:31 +05:30
commit 3bb697514e
2 changed files with 14 additions and 0 deletions

View file

@ -1121,6 +1121,16 @@ int dwc3_core_init(struct dwc3 *dwc)
}
dwc3_notify_event(dwc, DWC3_CONTROLLER_POST_RESET_EVENT, 0);
/*
* clear Elastic buffer mode in GUSBPIPE_CTRL(0) register, otherwise
* it results in high link errors and could cause SS mode transfer
* failure.
*/
if (!dwc->nominal_elastic_buffer) {
reg = dwc3_readl(dwc->regs, DWC3_GUSB3PIPECTL(0));
reg &= ~DWC3_GUSB3PIPECTL_ELASTIC_BUF_MODE;
dwc3_writel(dwc->regs, DWC3_GUSB3PIPECTL(0), reg);
}
return 0;
@ -1369,6 +1379,8 @@ static void dwc3_get_properties(struct dwc3 *dwc)
&tx_thr_num_pkt_prd);
device_property_read_u8(dev, "snps,tx-max-burst-prd",
&tx_max_burst_prd);
dwc->nominal_elastic_buffer = of_property_read_bool(dev->of_node,
"nominal-elastic-buffer");
dwc->needs_fifo_resize = device_property_read_bool(dev,
"tx-fifo-resize");

View file

@ -337,6 +337,7 @@
#define DWC3_GUSB3PIPECTL_TX_DEEPH_MASK DWC3_GUSB3PIPECTL_TX_DEEPH(3)
#define DWC3_GUSB3PIPECTL_TX_DEEPH(n) ((n) << 1)
#define DWC3_GUSB3PIPECTL_DELAYP1TRANS BIT(18)
#define DWC3_GUSB3PIPECTL_ELASTIC_BUF_MODE (1 << 0)
/* Global TX Fifo Size Register */
#define DWC31_GTXFIFOSIZ_TXFRAMNUM BIT(15) /* DWC_usb31 only */
@ -1364,6 +1365,7 @@ struct dwc3 {
struct dwc3_gadget_events dbg_gadget_events;
int tx_fifo_size;
int last_fifo_depth;
bool nominal_elastic_buffer;
/* IRQ timing statistics */
int irq;