mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-08 20:07:46 +09:00
USB: Add rk_usb_power_up and power_down function.
This commit is contained in:
@@ -104,6 +104,9 @@ static struct usb20host_pdata_id usb20host_pdata[] = {
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_RK_USB_UART
|
||||
static u32 usb_to_uart_status;
|
||||
#endif
|
||||
/*-------------------------------------------------------------------------*/
|
||||
/* Encapsulate the module parameter settings */
|
||||
|
||||
@@ -1571,6 +1574,82 @@ static struct platform_driver dwc_otg_driver = {
|
||||
};
|
||||
#endif
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(rk_usb_power_up);
|
||||
EXPORT_SYMBOL(rk_usb_power_down);
|
||||
/**
|
||||
* This function is called when the dwc_otg_driver is installed with the
|
||||
* insmod command. It registers the dwc_otg_driver structure with the
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/rockchip/cru.h>
|
||||
#include <linux/rockchip/grf.h>
|
||||
#include <linux/rockchip/cpu.h>
|
||||
|
||||
#include "usbdev_grf_regs.h"
|
||||
#include "usbdev_bc.h"
|
||||
|
||||
Reference in New Issue
Block a user