[PATCH v5 09/16] usb: dwc3: Add disable u2mac linestate check quirk

Kever Yang kever.yang at rock-chips.com
Fri May 15 04:48:43 CEST 2020


On 2020/5/13 下午3:15, Frank Wang wrote:
> From: Jagan Teki <jagan at amarulasolutions.com>
>
> This patch adds a quirk to disable USB 2.0 MAC linestate check
> during HS transmit. Refer the dwc3 databook, we can use it for
> some special platforms if the linestate not reflect the expected
> line state(J) during transmission.
>
> When use this quirk, the controller implements a fixed 40-bit
> TxEndDelay after the packet is given on UTMI and ignores the
> linestate during the transmit of a token (during token-to-token
> and token-to-data IPGAP).
>
> On some rockchip platforms (e.g. rk3399), it requires to disable
> the u2mac linestate check to decrease the SSPLIT token to SETUP
> token inter-packet delay from 566ns to 466ns, and fix the issue
> that FS/LS devices not recognized if inserted through USB 3.0 HUB.
>
> Reference from below Linux commit,
>
> commit <65db7a0c9816> ("usb: dwc3: add disable u2mac linestate
> check quirk")
>
> Cc: Marek Vasut <marex at denx.de>
> Signed-off-by: Jagan Teki <jagan at amarulasolutions.com>

Reviewed-by: Kever Yang <kever.yang at rock-chips.com>

Thanks,
- Kever
> ---
>   drivers/usb/dwc3/core.c | 20 ++++++++++++++++++++
>   drivers/usb/dwc3/core.h |  7 +++++++
>   include/dwc3-uboot.h    |  1 +
>   3 files changed, 28 insertions(+)
>
> diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
> index 3cb66515a2..dc92f471c1 100644
> --- a/drivers/usb/dwc3/core.c
> +++ b/drivers/usb/dwc3/core.c
> @@ -725,6 +725,7 @@ int dwc3_uboot_init(struct dwc3_device *dwc3_dev)
>   	dwc->dis_u3_susphy_quirk = dwc3_dev->dis_u3_susphy_quirk;
>   	dwc->dis_u2_susphy_quirk = dwc3_dev->dis_u2_susphy_quirk;
>   	dwc->dis_del_phy_power_chg_quirk = dwc3_dev->dis_del_phy_power_chg_quirk;
> +	dwc->dis_tx_ipgap_linecheck_quirk = dwc3_dev->dis_tx_ipgap_linecheck_quirk;
>   	dwc->dis_enblslpm_quirk = dwc3_dev->dis_enblslpm_quirk;
>   	dwc->dis_u2_freeclk_exists_quirk = dwc3_dev->dis_u2_freeclk_exists_quirk;
>   
> @@ -934,6 +935,8 @@ void dwc3_of_parse(struct dwc3 *dwc)
>   				"snps,dis_u2_susphy_quirk");
>   	dwc->dis_del_phy_power_chg_quirk = dev_read_bool(dev,
>   				"snps,dis-del-phy-power-chg-quirk");
> +	dwc->dis_tx_ipgap_linecheck_quirk = dev_read_bool(dev,
> +				"snps,dis-tx-ipgap-linecheck-quirk");
>   	dwc->dis_enblslpm_quirk = dev_read_bool(dev,
>   				"snps,dis_enblslpm_quirk");
>   	dwc->dis_u2_freeclk_exists_quirk = dev_read_bool(dev,
> @@ -954,6 +957,7 @@ void dwc3_of_parse(struct dwc3 *dwc)
>   int dwc3_init(struct dwc3 *dwc)
>   {
>   	int ret;
> +	u32 reg;
>   
>   	dwc3_cache_hwparams(dwc);
>   
> @@ -975,6 +979,22 @@ int dwc3_init(struct dwc3 *dwc)
>   		goto event_fail;
>   	}
>   
> +	if (dwc->revision >= DWC3_REVISION_250A) {
> +		reg = dwc3_readl(dwc->regs, DWC3_GUCTL1);
> +
> +		/*
> +		 * Enable hardware control of sending remote wakeup
> +		 * in HS when the device is in the L1 state.
> +		 */
> +		if (dwc->revision >= DWC3_REVISION_290A)
> +			reg |= DWC3_GUCTL1_DEV_L1_EXIT_BY_HW;
> +
> +		if (dwc->dis_tx_ipgap_linecheck_quirk)
> +			reg |= DWC3_GUCTL1_TX_IPGAP_LINECHECK_DIS;
> +
> +		dwc3_writel(dwc->regs, DWC3_GUCTL1, reg);
> +	}
> +
>   	ret = dwc3_core_init_mode(dwc);
>   	if (ret)
>   		goto mode_fail;
> diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
> index c5e656885a..b510d8a983 100644
> --- a/drivers/usb/dwc3/core.h
> +++ b/drivers/usb/dwc3/core.h
> @@ -73,6 +73,7 @@
>   #define DWC3_GCTL		0xc110
>   #define DWC3_GEVTEN		0xc114
>   #define DWC3_GSTS		0xc118
> +#define DWC3_GUCTL1		0xc11c
>   #define DWC3_GSNPSID		0xc120
>   #define DWC3_GGPIO		0xc124
>   #define DWC3_GUID		0xc128
> @@ -159,6 +160,10 @@
>   #define DWC3_GCTL_GBLHIBERNATIONEN	(1 << 1)
>   #define DWC3_GCTL_DSBLCLKGTNG		(1 << 0)
>   
> +/* Global User Control 1 Register */
> +#define DWC3_GUCTL1_TX_IPGAP_LINECHECK_DIS	BIT(28)
> +#define DWC3_GUCTL1_DEV_L1_EXIT_BY_HW	BIT(24)
> +
>   /* Global USB2 PHY Configuration Register */
>   #define DWC3_GUSB2PHYCFG_PHYSOFTRST	(1 << 31)
>   #define DWC3_GUSB2PHYCFG_U2_FREECLK_EXISTS	(1 << 30)
> @@ -771,6 +776,7 @@ struct dwc3 {
>   #define DWC3_REVISION_260A	0x5533260a
>   #define DWC3_REVISION_270A	0x5533270a
>   #define DWC3_REVISION_280A	0x5533280a
> +#define DWC3_REVISION_290A	0x5533290a
>   
>   	enum dwc3_ep0_next	ep0_next_event;
>   	enum dwc3_ep0_state	ep0state;
> @@ -824,6 +830,7 @@ struct dwc3 {
>   	unsigned		dis_u3_susphy_quirk:1;
>   	unsigned		dis_u2_susphy_quirk:1;
>   	unsigned		dis_del_phy_power_chg_quirk:1;
> +	unsigned		dis_tx_ipgap_linecheck_quirk:1;
>   	unsigned		dis_enblslpm_quirk:1;
>   	unsigned		dis_u2_freeclk_exists_quirk:1;
>   
> diff --git a/include/dwc3-uboot.h b/include/dwc3-uboot.h
> index 193d225d31..e08530ec4e 100644
> --- a/include/dwc3-uboot.h
> +++ b/include/dwc3-uboot.h
> @@ -34,6 +34,7 @@ struct dwc3_device {
>   	unsigned dis_u3_susphy_quirk;
>   	unsigned dis_u2_susphy_quirk;
>   	unsigned dis_del_phy_power_chg_quirk;
> +	unsigned dis_tx_ipgap_linecheck_quirk;
>   	unsigned dis_enblslpm_quirk;
>   	unsigned dis_u2_freeclk_exists_quirk;
>   	unsigned tx_de_emphasis_quirk;




More information about the U-Boot mailing list