USB: set SIDDQ to place USB PHY into a low power state.

This commit is contained in:
wlf
2014-04-23 15:52:32 +08:00
parent 93d866ae0c
commit d4cb6899ac
2 changed files with 25 additions and 54 deletions

View File

@@ -1576,74 +1576,22 @@ static struct platform_driver dwc_otg_driver = {
void rk_usb_power_up(void)
{
struct dwc_otg_platform_data *pldata_otg;
struct dwc_otg_platform_data *pldata_host;
struct rkehci_platform_data *pldata_ehci;
if(cpu_is_rk3288()){
#ifdef CONFIG_RK_USB_UART
/* enable USB bypass UART function */
writel_relaxed(0x00c00000 | usb_to_uart_status, RK_GRF_VIRT + RK3288_GRF_UOC0_CON3);
#endif
/* unset siddq,the analog blocks are powered up */
#ifdef CONFIG_USB20_OTG
if((pldata_otg = &usb20otg_pdata_rk3288)){
if(pldata_otg->phy_status == USB_PHY_SUSPEND)
writel_relaxed((0x01<<13)<<16, RK_GRF_VIRT + RK3288_GRF_UOC0_CON0);
}
#endif
#ifdef CONFIG_USB20_HOST
if((pldata_host = &usb20host_pdata_rk3288)){
if(pldata_host->phy_status == USB_PHY_SUSPEND)
writel_relaxed((0x01<<13)<<16, RK_GRF_VIRT + RK3288_GRF_UOC2_CON0);
}
#endif
#ifdef CONFIG_USB_EHCI_RK
if((pldata_ehci = &rkehci_pdata_rk3288)){
if(pldata_ehci->phy_status == USB_PHY_SUSPEND)
writel_relaxed((0x01<<13)<<16, RK_GRF_VIRT + RK3288_GRF_UOC1_CON0);
}
#endif
}
}
void rk_usb_power_down(void)
{
struct dwc_otg_platform_data *pldata_otg;
struct dwc_otg_platform_data *pldata_host;
struct rkehci_platform_data *pldata_ehci;
if(cpu_is_rk3288()){
#ifdef CONFIG_RK_USB_UART
/* disable USB bypass UART function */
usb_to_uart_status = readl_relaxed(RK_GRF_VIRT + RK3288_GRF_UOC0_CON3);
writel_relaxed(0x00c00000, RK_GRF_VIRT + RK3288_GRF_UOC0_CON3);
#endif
/* set siddq,the analog blocks are powered down
* note:
* 1. Before asserting SIDDQ, ensure that VDATSRCENB0,
* VDATDETENB0, DCDENB0, BYPASSSEL0, ADPPRBENB0,
* and TESTBURNIN are set to 1'b0.
* 2. Before asserting SIDDQ, ensure that phy enter suspend.*/
#ifdef CONFIG_USB20_OTG
if((pldata_otg = &usb20otg_pdata_rk3288)){
if(pldata_otg->phy_status == USB_PHY_SUSPEND)
writel_relaxed((0x01<<13)|((0x01<<13)<<16), RK_GRF_VIRT + RK3288_GRF_UOC0_CON0);
}
#endif
#ifdef CONFIG_USB20_HOST
if((pldata_host = &usb20host_pdata_rk3288)){
if(pldata_host->phy_status == USB_PHY_SUSPEND)
writel_relaxed((0x01<<13)|((0x01<<13)<<16), RK_GRF_VIRT + RK3288_GRF_UOC2_CON0);
}
#endif
#ifdef CONFIG_USB_EHCI_RK
if((pldata_ehci = &rkehci_pdata_rk3288)){
if(pldata_ehci->phy_status == USB_PHY_SUSPEND)
writel_relaxed((0x01<<13)|((0x01<<13)<<16), RK_GRF_VIRT + RK3288_GRF_UOC1_CON0);
}
#endif
}
}

View File

@@ -33,9 +33,20 @@ static void usb20otg_phy_suspend(void* pdata, int suspend)
control_usb->grf_uoc0_base->CON2 = (0x01<<2)|((0x01<<2)<<16);
//enter suspend
control_usb->grf_uoc0_base->CON3 = 0x2A|(0x3F<<16);
mdelay(1);
/* set siddq,the analog blocks are powered down
* note:
* 1. Before asserting SIDDQ, ensure that VDATSRCENB0,
* VDATDETENB0, DCDENB0, BYPASSSEL0, ADPPRBENB0,
* and TESTBURNIN are set to 1'b0.
* 2. Before asserting SIDDQ, ensure that phy enter suspend.*/
control_usb->grf_uoc0_base->CON0 = (0x01<<13)|((0x01<<13)<<16);
usbpdata->phy_status = 1;
}else{
// exit suspend.
/* unset siddq,the analog blocks are powered up */
control_usb->grf_uoc0_base->CON0 = (0x01<<13)<<16;
mdelay(1);
//exit suspend
control_usb->grf_uoc0_base->CON2 = ((0x01<<2)<<16);
usbpdata->phy_status = 0;
}
@@ -191,9 +202,15 @@ static void usb20host_phy_suspend(void* pdata, int suspend)
control_usb->grf_uoc2_base->CON2 = (0x01<<2)|((0x01<<2)<<16);
// enter suspend
control_usb->grf_uoc2_base->CON3 = 0x2A|(0x3F<<16);
mdelay(1);
// set siddq
control_usb->grf_uoc2_base->CON0 = (0x01<<13)|((0x01<<13)<<16);
usbpdata->phy_status = 1;
}else{
//exit suspend.
// unset siddq
control_usb->grf_uoc2_base->CON0 = (0x01<<13)<<16;
mdelay(1);
// exit suspend
control_usb->grf_uoc2_base->CON2 = ((0x01<<2)<<16);
usbpdata->phy_status = 0;
}
@@ -433,8 +450,14 @@ static void rk_ehci_phy_suspend(void* pdata, int suspend)
control_usb->grf_uoc1_base->CON2 = (0x01<<2)|((0x01<<2)<<16);
// enter suspend
control_usb->grf_uoc1_base->CON3 = 0x2A|(0x3F<<16);
mdelay(1);
// set siddq
control_usb->grf_uoc1_base->CON0 = (0x01<<13) | ((0x01<<13) << 16);
usbpdata->phy_status = 1;
}else{
// unset siddq
control_usb->grf_uoc1_base->CON0 = ((0x01<<13) << 16);
mdelay(1);
// exit suspend
control_usb->grf_uoc1_base->CON2 = ((0x01<<2)<<16);
usbpdata->phy_status = 0;