diff options
author | Huang Rui <ray.huang@amd.com> | 2014-10-28 07:54:31 -0400 |
---|---|---|
committer | Felipe Balbi <balbi@ti.com> | 2014-11-03 11:03:37 -0500 |
commit | 41c06ffdf9cc63edd875cc8ff8ae002cd9b14f96 (patch) | |
tree | 5b0b161153620e1ab3fbe35ff14631794be3dd6e | |
parent | a2a1d0f5838d6aa0d1306ef9bb1011f501faa695 (diff) |
usb: dwc3: add delay phy power change quirk
This patch adds delay PHY power change from P0 to P1/P2/P3 when link state
changing from U0 to U1/U2/U3 respectively, and some special platforms can
configure that if it is needed.
[ balbi@ti.com : added DeviceTree binding documentation ]
Signed-off-by: Huang Rui <ray.huang@amd.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
-rw-r--r-- | Documentation/devicetree/bindings/usb/dwc3.txt | 2 | ||||
-rw-r--r-- | drivers/usb/dwc3/core.c | 6 | ||||
-rw-r--r-- | drivers/usb/dwc3/core.h | 3 | ||||
-rw-r--r-- | drivers/usb/dwc3/platform_data.h | 1 |
4 files changed, 12 insertions, 0 deletions
diff --git a/Documentation/devicetree/bindings/usb/dwc3.txt b/Documentation/devicetree/bindings/usb/dwc3.txt index 4c77ed6e7c07..a2598d3c7c12 100644 --- a/Documentation/devicetree/bindings/usb/dwc3.txt +++ b/Documentation/devicetree/bindings/usb/dwc3.txt | |||
@@ -24,6 +24,8 @@ Optional properties: | |||
24 | P1/P2/P3 transition sequence. | 24 | P1/P2/P3 transition sequence. |
25 | - snps,del_p1p2p3_quirk: when set core will delay P1/P2/P3 until a certain | 25 | - snps,del_p1p2p3_quirk: when set core will delay P1/P2/P3 until a certain |
26 | amount of 8B10B errors occur. | 26 | amount of 8B10B errors occur. |
27 | - snps,del_phy_power_chg_quirk: when set core will delay PHY power change | ||
28 | from P0 to P1/P2/P3. | ||
27 | 29 | ||
28 | This is usually a subnode to DWC3 glue to which it is connected. | 30 | This is usually a subnode to DWC3 glue to which it is connected. |
29 | 31 | ||
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index c07651484c60..de6a00969bc7 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c | |||
@@ -383,6 +383,9 @@ static void dwc3_phy_setup(struct dwc3 *dwc) | |||
383 | if (dwc->del_p1p2p3_quirk) | 383 | if (dwc->del_p1p2p3_quirk) |
384 | reg |= DWC3_GUSB3PIPECTL_DEP1P2P3_EN; | 384 | reg |= DWC3_GUSB3PIPECTL_DEP1P2P3_EN; |
385 | 385 | ||
386 | if (dwc->del_phy_power_chg_quirk) | ||
387 | reg |= DWC3_GUSB3PIPECTL_DEPOCHANGE; | ||
388 | |||
386 | dwc3_writel(dwc->regs, DWC3_GUSB3PIPECTL(0), reg); | 389 | dwc3_writel(dwc->regs, DWC3_GUSB3PIPECTL(0), reg); |
387 | 390 | ||
388 | mdelay(100); | 391 | mdelay(100); |
@@ -766,6 +769,8 @@ static int dwc3_probe(struct platform_device *pdev) | |||
766 | "snps,req_p1p2p3_quirk"); | 769 | "snps,req_p1p2p3_quirk"); |
767 | dwc->del_p1p2p3_quirk = of_property_read_bool(node, | 770 | dwc->del_p1p2p3_quirk = of_property_read_bool(node, |
768 | "snps,del_p1p2p3_quirk"); | 771 | "snps,del_p1p2p3_quirk"); |
772 | dwc->del_phy_power_chg_quirk = of_property_read_bool(node, | ||
773 | "snps,del_phy_power_chg_quirk"); | ||
769 | } else if (pdata) { | 774 | } else if (pdata) { |
770 | dwc->maximum_speed = pdata->maximum_speed; | 775 | dwc->maximum_speed = pdata->maximum_speed; |
771 | dwc->has_lpm_erratum = pdata->has_lpm_erratum; | 776 | dwc->has_lpm_erratum = pdata->has_lpm_erratum; |
@@ -780,6 +785,7 @@ static int dwc3_probe(struct platform_device *pdev) | |||
780 | dwc->u2ss_inp3_quirk = pdata->u2ss_inp3_quirk; | 785 | dwc->u2ss_inp3_quirk = pdata->u2ss_inp3_quirk; |
781 | dwc->req_p1p2p3_quirk = pdata->req_p1p2p3_quirk; | 786 | dwc->req_p1p2p3_quirk = pdata->req_p1p2p3_quirk; |
782 | dwc->del_p1p2p3_quirk = pdata->del_p1p2p3_quirk; | 787 | dwc->del_p1p2p3_quirk = pdata->del_p1p2p3_quirk; |
788 | dwc->del_phy_power_chg_quirk = pdata->del_phy_power_chg_quirk; | ||
783 | } | 789 | } |
784 | 790 | ||
785 | /* default to superspeed if no maximum_speed passed */ | 791 | /* default to superspeed if no maximum_speed passed */ |
diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h index b8fbc4a1ee4a..5e8a75c3f3c8 100644 --- a/drivers/usb/dwc3/core.h +++ b/drivers/usb/dwc3/core.h | |||
@@ -181,6 +181,7 @@ | |||
181 | #define DWC3_GUSB3PIPECTL_DEP1P2P3(n) ((n) << 19) | 181 | #define DWC3_GUSB3PIPECTL_DEP1P2P3(n) ((n) << 19) |
182 | #define DWC3_GUSB3PIPECTL_DEP1P2P3_MASK DWC3_GUSB3PIPECTL_DEP1P2P3(7) | 182 | #define DWC3_GUSB3PIPECTL_DEP1P2P3_MASK DWC3_GUSB3PIPECTL_DEP1P2P3(7) |
183 | #define DWC3_GUSB3PIPECTL_DEP1P2P3_EN DWC3_GUSB3PIPECTL_DEP1P2P3(1) | 183 | #define DWC3_GUSB3PIPECTL_DEP1P2P3_EN DWC3_GUSB3PIPECTL_DEP1P2P3(1) |
184 | #define DWC3_GUSB3PIPECTL_DEPOCHANGE (1 << 18) | ||
184 | #define DWC3_GUSB3PIPECTL_SUSPHY (1 << 17) | 185 | #define DWC3_GUSB3PIPECTL_SUSPHY (1 << 17) |
185 | 186 | ||
186 | /* Global TX Fifo Size Register */ | 187 | /* Global TX Fifo Size Register */ |
@@ -689,6 +690,7 @@ struct dwc3_scratchpad_array { | |||
689 | * @u2ss_inp3_quirk: set if we enable P3 OK for U2/SS Inactive quirk | 690 | * @u2ss_inp3_quirk: set if we enable P3 OK for U2/SS Inactive quirk |
690 | * @req_p1p2p3_quirk: set if we enable request p1p2p3 quirk | 691 | * @req_p1p2p3_quirk: set if we enable request p1p2p3 quirk |
691 | * @del_p1p2p3_quirk: set if we enable delay p1p2p3 quirk | 692 | * @del_p1p2p3_quirk: set if we enable delay p1p2p3 quirk |
693 | * @del_phy_power_chg_quirk: set if we enable delay phy power change quirk | ||
692 | */ | 694 | */ |
693 | struct dwc3 { | 695 | struct dwc3 { |
694 | struct usb_ctrlrequest *ctrl_req; | 696 | struct usb_ctrlrequest *ctrl_req; |
@@ -801,6 +803,7 @@ struct dwc3 { | |||
801 | unsigned u2ss_inp3_quirk:1; | 803 | unsigned u2ss_inp3_quirk:1; |
802 | unsigned req_p1p2p3_quirk:1; | 804 | unsigned req_p1p2p3_quirk:1; |
803 | unsigned del_p1p2p3_quirk:1; | 805 | unsigned del_p1p2p3_quirk:1; |
806 | unsigned del_phy_power_chg_quirk:1; | ||
804 | }; | 807 | }; |
805 | 808 | ||
806 | /* -------------------------------------------------------------------------- */ | 809 | /* -------------------------------------------------------------------------- */ |
diff --git a/drivers/usb/dwc3/platform_data.h b/drivers/usb/dwc3/platform_data.h index a421cecd6c16..ae67151dc870 100644 --- a/drivers/usb/dwc3/platform_data.h +++ b/drivers/usb/dwc3/platform_data.h | |||
@@ -33,4 +33,5 @@ struct dwc3_platform_data { | |||
33 | unsigned u2ss_inp3_quirk:1; | 33 | unsigned u2ss_inp3_quirk:1; |
34 | unsigned req_p1p2p3_quirk:1; | 34 | unsigned req_p1p2p3_quirk:1; |
35 | unsigned del_p1p2p3_quirk:1; | 35 | unsigned del_p1p2p3_quirk:1; |
36 | unsigned del_phy_power_chg_quirk:1; | ||
36 | }; | 37 | }; |