Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 460d098c authored by Huang Rui's avatar Huang Rui Committed by Felipe Balbi
Browse files

usb: dwc3: make HIRD threshold configurable



HIRD threshold should be configurable by different platforms.

From DesignWare databook:
When HIRD_Threshold[4] is set to 1b1 and HIRD value is greater than or
equal to the value in HIRD_Threshold[3:0], dwc3 asserts output signals
utmi_l1_suspend_n to put PHY into Deep Low-Power mode in L1.

When HIRD_Threshold[4] is set to 1b0 or the HIRD value is less than
HIRD_Threshold[3:0], dwc3 asserts output signals utmi_sleep_n on L1.

Signed-off-by: default avatarHuang Rui <ray.huang@amd.com>
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
parent 9755449d
Loading
Loading
Loading
Loading
+3 −0
Original line number Original line Diff line number Diff line
@@ -34,6 +34,9 @@ Optional properties:
			LTSSM during USB3 Compliance mode.
			LTSSM during USB3 Compliance mode.
 - snps,dis_u3_susphy_quirk: when set core will disable USB3 suspend phy.
 - snps,dis_u3_susphy_quirk: when set core will disable USB3 suspend phy.
 - snps,dis_u2_susphy_quirk: when set core will disable USB2 suspend phy.
 - snps,dis_u2_susphy_quirk: when set core will disable USB2 suspend phy.
 - snps,is-utmi-l1-suspend: true when DWC3 asserts output signal
			utmi_l1_suspend_n, false when asserts utmi_sleep_n
 - snps,hird-threshold: HIRD threshold


This is usually a subnode to DWC3 glue to which it is connected.
This is usually a subnode to DWC3 glue to which it is connected.


+17 −0
Original line number Original line Diff line number Diff line
@@ -730,6 +730,7 @@ static int dwc3_probe(struct platform_device *pdev)
	struct dwc3		*dwc;
	struct dwc3		*dwc;
	u8			lpm_nyet_threshold;
	u8			lpm_nyet_threshold;
	u8			tx_de_emphasis;
	u8			tx_de_emphasis;
	u8			hird_threshold;


	int			ret;
	int			ret;


@@ -791,12 +792,22 @@ static int dwc3_probe(struct platform_device *pdev)
	/* default to -3.5dB de-emphasis */
	/* default to -3.5dB de-emphasis */
	tx_de_emphasis = 1;
	tx_de_emphasis = 1;


	/*
	 * default to assert utmi_sleep_n and use maximum allowed HIRD
	 * threshold value of 0b1100
	 */
	hird_threshold = 12;

	if (node) {
	if (node) {
		dwc->maximum_speed = of_usb_get_maximum_speed(node);
		dwc->maximum_speed = of_usb_get_maximum_speed(node);
		dwc->has_lpm_erratum = of_property_read_bool(node,
		dwc->has_lpm_erratum = of_property_read_bool(node,
				"snps,has-lpm-erratum");
				"snps,has-lpm-erratum");
		of_property_read_u8(node, "snps,lpm-nyet-threshold",
		of_property_read_u8(node, "snps,lpm-nyet-threshold",
				&lpm_nyet_threshold);
				&lpm_nyet_threshold);
		dwc->is_utmi_l1_suspend = of_property_read_bool(node,
				"snps,is-utmi-l1-suspend");
		of_property_read_u8(node, "snps,hird-threshold",
				&hird_threshold);


		dwc->needs_fifo_resize = of_property_read_bool(node,
		dwc->needs_fifo_resize = of_property_read_bool(node,
				"tx-fifo-resize");
				"tx-fifo-resize");
@@ -832,6 +843,9 @@ static int dwc3_probe(struct platform_device *pdev)
		dwc->has_lpm_erratum = pdata->has_lpm_erratum;
		dwc->has_lpm_erratum = pdata->has_lpm_erratum;
		if (pdata->lpm_nyet_threshold)
		if (pdata->lpm_nyet_threshold)
			lpm_nyet_threshold = pdata->lpm_nyet_threshold;
			lpm_nyet_threshold = pdata->lpm_nyet_threshold;
		dwc->is_utmi_l1_suspend = pdata->is_utmi_l1_suspend;
		if (pdata->hird_threshold)
			hird_threshold = pdata->hird_threshold;


		dwc->needs_fifo_resize = pdata->tx_fifo_resize;
		dwc->needs_fifo_resize = pdata->tx_fifo_resize;
		dwc->dr_mode = pdata->dr_mode;
		dwc->dr_mode = pdata->dr_mode;
@@ -859,6 +873,9 @@ static int dwc3_probe(struct platform_device *pdev)
	dwc->lpm_nyet_threshold = lpm_nyet_threshold;
	dwc->lpm_nyet_threshold = lpm_nyet_threshold;
	dwc->tx_de_emphasis = tx_de_emphasis;
	dwc->tx_de_emphasis = tx_de_emphasis;


	dwc->hird_threshold = hird_threshold
		| (dwc->is_utmi_l1_suspend << 4);

	ret = dwc3_core_get_phy(dwc);
	ret = dwc3_core_get_phy(dwc);
	if (ret)
	if (ret)
		return ret;
		return ret;
+6 −0
Original line number Original line Diff line number Diff line
@@ -675,12 +675,16 @@ struct dwc3_scratchpad_array {
 * @test_mode: true when we're entering a USB test mode
 * @test_mode: true when we're entering a USB test mode
 * @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
 * @delayed_status: true when gadget driver asks for delayed status
 * @delayed_status: true when gadget driver asks for delayed status
 * @ep0_bounced: true when we used bounce buffer
 * @ep0_bounced: true when we used bounce buffer
 * @ep0_expect_in: true when we expect a DATA IN transfer
 * @ep0_expect_in: true when we expect a DATA IN transfer
 * @has_hibernation: true when dwc3 was configured with Hibernation
 * @has_hibernation: true when dwc3 was configured with Hibernation
 * @has_lpm_erratum: true when core was configured with LPM Erratum. Note that
 * @has_lpm_erratum: true when core was configured with LPM Erratum. Note that
 *			there's now way for software to detect this in runtime.
 *			there's now way for software to detect this in runtime.
 * @is_utmi_l1_suspend: the core asserts output signal
 * 	0	- utmi_sleep_n
 * 	1	- utmi_l1_suspend_n
 * @is_selfpowered: true when we are selfpowered
 * @is_selfpowered: true when we are selfpowered
 * @is_fpga: true when we are using the FPGA board
 * @is_fpga: true when we are using the FPGA board
 * @needs_fifo_resize: not all users might want fifo resizing, flag it
 * @needs_fifo_resize: not all users might want fifo resizing, flag it
@@ -797,12 +801,14 @@ struct dwc3 {
	u8			test_mode;
	u8			test_mode;
	u8			test_mode_nr;
	u8			test_mode_nr;
	u8			lpm_nyet_threshold;
	u8			lpm_nyet_threshold;
	u8			hird_threshold;


	unsigned		delayed_status:1;
	unsigned		delayed_status:1;
	unsigned		ep0_bounced:1;
	unsigned		ep0_bounced:1;
	unsigned		ep0_expect_in:1;
	unsigned		ep0_expect_in:1;
	unsigned		has_hibernation:1;
	unsigned		has_hibernation:1;
	unsigned		has_lpm_erratum:1;
	unsigned		has_lpm_erratum:1;
	unsigned		is_utmi_l1_suspend:1;
	unsigned		is_selfpowered:1;
	unsigned		is_selfpowered:1;
	unsigned		is_fpga:1;
	unsigned		is_fpga:1;
	unsigned		needs_fifo_resize:1;
	unsigned		needs_fifo_resize:1;
+1 −5
Original line number Original line Diff line number Diff line
@@ -2295,11 +2295,7 @@ static void dwc3_gadget_conndone_interrupt(struct dwc3 *dwc)
		reg = dwc3_readl(dwc->regs, DWC3_DCTL);
		reg = dwc3_readl(dwc->regs, DWC3_DCTL);
		reg &= ~(DWC3_DCTL_HIRD_THRES_MASK | DWC3_DCTL_L1_HIBER_EN);
		reg &= ~(DWC3_DCTL_HIRD_THRES_MASK | DWC3_DCTL_L1_HIBER_EN);


		/*
		reg |= DWC3_DCTL_HIRD_THRES(dwc->hird_threshold);
		 * TODO: This should be configurable. For now using
		 * maximum allowed HIRD threshold value of 0b1100
		 */
		reg |= DWC3_DCTL_HIRD_THRES(12);


		/*
		/*
		 * When dwc3 revisions >= 2.40a, LPM Erratum is enabled and
		 * When dwc3 revisions >= 2.40a, LPM Erratum is enabled and
+3 −0
Original line number Original line Diff line number Diff line
@@ -25,6 +25,9 @@ struct dwc3_platform_data {
	enum usb_dr_mode dr_mode;
	enum usb_dr_mode dr_mode;
	bool tx_fifo_resize;
	bool tx_fifo_resize;


	unsigned is_utmi_l1_suspend:1;
	u8 hird_threshold;

	u8 lpm_nyet_threshold;
	u8 lpm_nyet_threshold;


	unsigned disable_scramble_quirk:1;
	unsigned disable_scramble_quirk:1;