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

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
...@@ -34,6 +34,9 @@ Optional properties: ...@@ -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.
......
...@@ -730,6 +730,7 @@ static int dwc3_probe(struct platform_device *pdev) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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;
......
...@@ -675,12 +675,16 @@ struct dwc3_scratchpad_array { ...@@ -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 { ...@@ -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;
......
...@@ -2295,11 +2295,7 @@ static void dwc3_gadget_conndone_interrupt(struct dwc3 *dwc) ...@@ -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
......
...@@ -25,6 +25,9 @@ struct dwc3_platform_data { ...@@ -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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment