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
}
}
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;
}
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;
}
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;