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: Peng Fan <peng.fan@nxp.com> Signed-off-by: Li Jun <jun.li@nxp.com> (cherry picked from commit 240b636718313e03db505a713e66e3f893cb7727)
This commit is contained in:
parent
b81241ee36
commit
ac64f46053
|
|
@ -395,6 +395,25 @@ static void dwc3_phy_setup(struct dwc3 *dwc)
|
||||||
mdelay(100);
|
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
|
* dwc3_core_init - Low-level initialization of DWC3 Core
|
||||||
* @dwc: Pointer to our controller context structure
|
* @dwc: Pointer to our controller context structure
|
||||||
|
|
@ -443,6 +462,9 @@ static int dwc3_core_init(struct dwc3 *dwc)
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err0;
|
goto err0;
|
||||||
|
|
||||||
|
if (dwc->power_down_scale)
|
||||||
|
dwc3_set_suspend_clk(dwc);
|
||||||
|
|
||||||
reg = dwc3_readl(dwc->regs, DWC3_GCTL);
|
reg = dwc3_readl(dwc->regs, DWC3_GCTL);
|
||||||
reg &= ~DWC3_GCTL_SCALEDOWN_MASK;
|
reg &= ~DWC3_GCTL_SCALEDOWN_MASK;
|
||||||
|
|
||||||
|
|
@ -672,6 +694,8 @@ int dwc3_uboot_init(struct dwc3_device *dwc3_dev)
|
||||||
if (dwc3_dev->tx_de_emphasis)
|
if (dwc3_dev->tx_de_emphasis)
|
||||||
tx_de_emphasis = 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 */
|
/* default to superspeed if no maximum_speed passed */
|
||||||
if (dwc->maximum_speed == USB_SPEED_UNKNOWN)
|
if (dwc->maximum_speed == USB_SPEED_UNKNOWN)
|
||||||
dwc->maximum_speed = USB_SPEED_SUPER;
|
dwc->maximum_speed = USB_SPEED_SUPER;
|
||||||
|
|
|
||||||
|
|
@ -643,6 +643,7 @@ struct dwc3_scratchpad_array {
|
||||||
* @dr_mode: requested mode of operation
|
* @dr_mode: requested mode of operation
|
||||||
* @dcfg: saved contents of DCFG register
|
* @dcfg: saved contents of DCFG register
|
||||||
* @gctl: saved contents of GCTL register
|
* @gctl: saved contents of GCTL register
|
||||||
|
* @power_down_scale: 16KHz clock periods for suspend_clk
|
||||||
* @isoch_delay: wValue from Set Isochronous Delay request;
|
* @isoch_delay: wValue from Set Isochronous Delay request;
|
||||||
* @u2sel: parameter from Set SEL request.
|
* @u2sel: parameter from Set SEL request.
|
||||||
* @u2pel: parameter from Set SEL request.
|
* @u2pel: parameter from Set SEL request.
|
||||||
|
|
@ -763,6 +764,7 @@ struct dwc3 {
|
||||||
enum dwc3_ep0_state ep0state;
|
enum dwc3_ep0_state ep0state;
|
||||||
enum dwc3_link_state link_state;
|
enum dwc3_link_state link_state;
|
||||||
|
|
||||||
|
u16 power_down_scale;
|
||||||
u16 isoch_delay;
|
u16 isoch_delay;
|
||||||
u16 u2sel;
|
u16 u2sel;
|
||||||
u16 u2pel;
|
u16 u2pel;
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ struct dwc3_device {
|
||||||
unsigned long base;
|
unsigned long base;
|
||||||
enum usb_dr_mode dr_mode;
|
enum usb_dr_mode dr_mode;
|
||||||
u32 maximum_speed;
|
u32 maximum_speed;
|
||||||
|
u16 power_down_scale;
|
||||||
unsigned tx_fifo_resize:1;
|
unsigned tx_fifo_resize:1;
|
||||||
unsigned has_lpm_erratum;
|
unsigned has_lpm_erratum;
|
||||||
u8 lpm_nyet_threshold;
|
u8 lpm_nyet_threshold;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue