mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 03:15:31 +09:00
USB: set SIDDQ to place USB PHY into a low power state.
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user