Commit 240b6367 authored by Li Jun's avatar Li Jun Committed by Jason Liu

MLK-16273-1 usb: dwc3: add suspend clock setting interface

Some dwc3 based USB3 IP may have a wrong default suspend clk
setting, so add an interface to correct it by board setting.
Acked-by: 's avatarPeng Fan <peng.fan@nxp.com>
Signed-off-by: 's avatarLi Jun <jun.li@nxp.com>
parent db4d4d44
......@@ -395,6 +395,25 @@ static void dwc3_phy_setup(struct dwc3 *dwc)
mdelay(100);
}
void dwc3_set_suspend_clk(struct dwc3 *dwc)
{
u32 reg;
/*
* DWC3_GCTL.PWRDNSCALE: The USB3 suspend_clk input replaces
* pipe3_rx_pclk as a clock source to a small part of the USB3
* core that operates when the SS PHY is in its lowest power
* (P3) state, and therefore does not provide a clock.
* The Power Down Scale field specifies how many suspend_clk
* periods fit into a 16 kHz clock period. When performing the
* division, round up the remainder.
*/
reg = dwc3_readl(dwc->regs, DWC3_GCTL);
reg &= ~(DWC3_GCTL_PWRDNSCALE(0x1fff));
reg |= DWC3_GCTL_PWRDNSCALE(dwc->power_down_scale);
dwc3_writel(dwc->regs, DWC3_GCTL, reg);
}
/**
* dwc3_core_init - Low-level initialization of DWC3 Core
* @dwc: Pointer to our controller context structure
......@@ -443,6 +462,9 @@ static int dwc3_core_init(struct dwc3 *dwc)
if (ret)
goto err0;
if (dwc->power_down_scale)
dwc3_set_suspend_clk(dwc);
reg = dwc3_readl(dwc->regs, DWC3_GCTL);
reg &= ~DWC3_GCTL_SCALEDOWN_MASK;
......@@ -672,6 +694,8 @@ int dwc3_uboot_init(struct dwc3_device *dwc3_dev)
if (dwc3_dev->tx_de_emphasis)
tx_de_emphasis = dwc3_dev->tx_de_emphasis;
dwc->power_down_scale = dwc3_dev->power_down_scale;
/* default to superspeed if no maximum_speed passed */
if (dwc->maximum_speed == USB_SPEED_UNKNOWN)
dwc->maximum_speed = USB_SPEED_SUPER;
......
......@@ -643,6 +643,7 @@ struct dwc3_scratchpad_array {
* @dr_mode: requested mode of operation
* @dcfg: saved contents of DCFG register
* @gctl: saved contents of GCTL register
* @power_down_scale: 16KHz clock periods for suspend_clk
* @isoch_delay: wValue from Set Isochronous Delay request;
* @u2sel: parameter from Set SEL request.
* @u2pel: parameter from Set SEL request.
......@@ -763,6 +764,7 @@ struct dwc3 {
enum dwc3_ep0_state ep0state;
enum dwc3_link_state link_state;
u16 power_down_scale;
u16 isoch_delay;
u16 u2sel;
u16 u2pel;
......
......@@ -16,6 +16,7 @@ struct dwc3_device {
unsigned long base;
enum usb_dr_mode dr_mode;
u32 maximum_speed;
u16 power_down_scale;
unsigned tx_fifo_resize:1;
unsigned has_lpm_erratum;
u8 lpm_nyet_threshold;
......
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