mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	usb: dwc3: Check for ESS TX/RX threshold config
Check and configure TX/RX threshold for DWC_usb31. Update dwc3 structure with new fields to store these threshold configurations. Signed-off-by: Thinh Nguyen <thinhn@synopsys.com> Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
This commit is contained in:
		
							parent
							
								
									48f80609e5
								
							
						
					
					
						commit
						938a5ad1d3
					
				
					 2 changed files with 63 additions and 0 deletions
				
			
		| 
						 | 
					@ -872,6 +872,43 @@ static int dwc3_core_init(struct dwc3 *dwc)
 | 
				
			||||||
		dwc3_writel(dwc->regs, DWC3_GUCTL1, reg);
 | 
							dwc3_writel(dwc->regs, DWC3_GUCTL1, reg);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * Must config both number of packets and max burst settings to enable
 | 
				
			||||||
 | 
						 * RX and/or TX threshold.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						if (dwc3_is_usb31(dwc) && dwc->dr_mode == USB_DR_MODE_HOST) {
 | 
				
			||||||
 | 
							u8 rx_thr_num = dwc->rx_thr_num_pkt_prd;
 | 
				
			||||||
 | 
							u8 rx_maxburst = dwc->rx_max_burst_prd;
 | 
				
			||||||
 | 
							u8 tx_thr_num = dwc->tx_thr_num_pkt_prd;
 | 
				
			||||||
 | 
							u8 tx_maxburst = dwc->tx_max_burst_prd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (rx_thr_num && rx_maxburst) {
 | 
				
			||||||
 | 
								reg = dwc3_readl(dwc->regs, DWC3_GRXTHRCFG);
 | 
				
			||||||
 | 
								reg |= DWC31_RXTHRNUMPKTSEL_PRD;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								reg &= ~DWC31_RXTHRNUMPKT_PRD(~0);
 | 
				
			||||||
 | 
								reg |= DWC31_RXTHRNUMPKT_PRD(rx_thr_num);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								reg &= ~DWC31_MAXRXBURSTSIZE_PRD(~0);
 | 
				
			||||||
 | 
								reg |= DWC31_MAXRXBURSTSIZE_PRD(rx_maxburst);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								dwc3_writel(dwc->regs, DWC3_GRXTHRCFG, reg);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (tx_thr_num && tx_maxburst) {
 | 
				
			||||||
 | 
								reg = dwc3_readl(dwc->regs, DWC3_GTXTHRCFG);
 | 
				
			||||||
 | 
								reg |= DWC31_TXTHRNUMPKTSEL_PRD;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								reg &= ~DWC31_TXTHRNUMPKT_PRD(~0);
 | 
				
			||||||
 | 
								reg |= DWC31_TXTHRNUMPKT_PRD(tx_thr_num);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								reg &= ~DWC31_MAXTXBURSTSIZE_PRD(~0);
 | 
				
			||||||
 | 
								reg |= DWC31_MAXTXBURSTSIZE_PRD(tx_maxburst);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								dwc3_writel(dwc->regs, DWC3_GTXTHRCFG, reg);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
err4:
 | 
					err4:
 | 
				
			||||||
| 
						 | 
					@ -1042,6 +1079,10 @@ static void dwc3_get_properties(struct dwc3 *dwc)
 | 
				
			||||||
	u8			lpm_nyet_threshold;
 | 
						u8			lpm_nyet_threshold;
 | 
				
			||||||
	u8			tx_de_emphasis;
 | 
						u8			tx_de_emphasis;
 | 
				
			||||||
	u8			hird_threshold;
 | 
						u8			hird_threshold;
 | 
				
			||||||
 | 
						u8			rx_thr_num_pkt_prd;
 | 
				
			||||||
 | 
						u8			rx_max_burst_prd;
 | 
				
			||||||
 | 
						u8			tx_thr_num_pkt_prd;
 | 
				
			||||||
 | 
						u8			tx_max_burst_prd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* default to highest possible threshold */
 | 
						/* default to highest possible threshold */
 | 
				
			||||||
	lpm_nyet_threshold = 0xff;
 | 
						lpm_nyet_threshold = 0xff;
 | 
				
			||||||
| 
						 | 
					@ -1076,6 +1117,14 @@ static void dwc3_get_properties(struct dwc3 *dwc)
 | 
				
			||||||
				&hird_threshold);
 | 
									&hird_threshold);
 | 
				
			||||||
	dwc->usb3_lpm_capable = device_property_read_bool(dev,
 | 
						dwc->usb3_lpm_capable = device_property_read_bool(dev,
 | 
				
			||||||
				"snps,usb3_lpm_capable");
 | 
									"snps,usb3_lpm_capable");
 | 
				
			||||||
 | 
						device_property_read_u8(dev, "snps,rx-thr-num-pkt-prd",
 | 
				
			||||||
 | 
									&rx_thr_num_pkt_prd);
 | 
				
			||||||
 | 
						device_property_read_u8(dev, "snps,rx-max-burst-prd",
 | 
				
			||||||
 | 
									&rx_max_burst_prd);
 | 
				
			||||||
 | 
						device_property_read_u8(dev, "snps,tx-thr-num-pkt-prd",
 | 
				
			||||||
 | 
									&tx_thr_num_pkt_prd);
 | 
				
			||||||
 | 
						device_property_read_u8(dev, "snps,tx-max-burst-prd",
 | 
				
			||||||
 | 
									&tx_max_burst_prd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dwc->disable_scramble_quirk = device_property_read_bool(dev,
 | 
						dwc->disable_scramble_quirk = device_property_read_bool(dev,
 | 
				
			||||||
				"snps,disable_scramble_quirk");
 | 
									"snps,disable_scramble_quirk");
 | 
				
			||||||
| 
						 | 
					@ -1126,6 +1175,12 @@ static void dwc3_get_properties(struct dwc3 *dwc)
 | 
				
			||||||
	dwc->hird_threshold = hird_threshold
 | 
						dwc->hird_threshold = hird_threshold
 | 
				
			||||||
		| (dwc->is_utmi_l1_suspend << 4);
 | 
							| (dwc->is_utmi_l1_suspend << 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						dwc->rx_thr_num_pkt_prd = rx_thr_num_pkt_prd;
 | 
				
			||||||
 | 
						dwc->rx_max_burst_prd = rx_max_burst_prd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						dwc->tx_thr_num_pkt_prd = tx_thr_num_pkt_prd;
 | 
				
			||||||
 | 
						dwc->tx_max_burst_prd = tx_max_burst_prd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dwc->imod_interval = 0;
 | 
						dwc->imod_interval = 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -929,6 +929,10 @@ struct dwc3_scratchpad_array {
 | 
				
			||||||
 * @test_mode_nr: test feature selector
 | 
					 * @test_mode_nr: test feature selector
 | 
				
			||||||
 * @lpm_nyet_threshold: LPM NYET response threshold
 | 
					 * @lpm_nyet_threshold: LPM NYET response threshold
 | 
				
			||||||
 * @hird_threshold: HIRD threshold
 | 
					 * @hird_threshold: HIRD threshold
 | 
				
			||||||
 | 
					 * @rx_thr_num_pkt_prd: periodic ESS receive packet count
 | 
				
			||||||
 | 
					 * @rx_max_burst_prd: max periodic ESS receive burst size
 | 
				
			||||||
 | 
					 * @tx_thr_num_pkt_prd: periodic ESS transmit packet count
 | 
				
			||||||
 | 
					 * @tx_max_burst_prd: max periodic ESS transmit burst size
 | 
				
			||||||
 * @hsphy_interface: "utmi" or "ulpi"
 | 
					 * @hsphy_interface: "utmi" or "ulpi"
 | 
				
			||||||
 * @connected: true when we're connected to a host, false otherwise
 | 
					 * @connected: true when we're connected to a host, false otherwise
 | 
				
			||||||
 * @delayed_status: true when gadget driver asks for delayed status
 | 
					 * @delayed_status: true when gadget driver asks for delayed status
 | 
				
			||||||
| 
						 | 
					@ -1096,6 +1100,10 @@ struct dwc3 {
 | 
				
			||||||
	u8			test_mode_nr;
 | 
						u8			test_mode_nr;
 | 
				
			||||||
	u8			lpm_nyet_threshold;
 | 
						u8			lpm_nyet_threshold;
 | 
				
			||||||
	u8			hird_threshold;
 | 
						u8			hird_threshold;
 | 
				
			||||||
 | 
						u8			rx_thr_num_pkt_prd;
 | 
				
			||||||
 | 
						u8			rx_max_burst_prd;
 | 
				
			||||||
 | 
						u8			tx_thr_num_pkt_prd;
 | 
				
			||||||
 | 
						u8			tx_max_burst_prd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const char		*hsphy_interface;
 | 
						const char		*hsphy_interface;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue