@ -75,6 +75,13 @@
* From usbc / usbc . c
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
struct sunxi_glue {
struct musb_host_data mdata ;
struct sunxi_ccm_reg * ccm ;
struct device dev ;
} ;
# define to_sunxi_glue(d) container_of(d, struct sunxi_glue, dev)
static u32 USBC_WakeUp_ClearChangeDetect ( u32 reg_val )
{
u32 temp = reg_val ;
@ -255,15 +262,15 @@ static void sunxi_musb_disable(struct musb *musb)
static int sunxi_musb_init ( struct musb * musb )
{
struct sunxi_ccm_reg * ccm = ( struct sunxi_ccm_reg * ) SUNXI_CCM_BASE ;
struct sunxi_glue * glue = to_sunxi_glue ( musb - > controller ) ;
pr_debug ( " %s(): \n " , __func__ ) ;
musb - > isr = sunxi_musb_interrupt ;
setbits_le32 ( & ccm - > ahb_gate0 , 1 < < AHB_GATE_OFFSET_USB0 ) ;
setbits_le32 ( & glue - > ccm - > ahb_gate0 , 1 < < AHB_GATE_OFFSET_USB0 ) ;
# ifdef CONFIG_SUNXI_GEN_SUN6I
setbits_le32 ( & ccm - > ahb_reset0_cfg , 1 < < AHB_GATE_OFFSET_USB0 ) ;
setbits_le32 ( & glue - > ccm - > ahb_reset0_cfg , 1 < < AHB_GATE_OFFSET_USB0 ) ;
# endif
sunxi_usb_phy_init ( 0 ) ;
@ -309,7 +316,8 @@ static struct musb_hdrc_platform_data musb_plat = {
static int musb_usb_probe ( struct udevice * dev )
{
struct musb_host_data * host = dev_get_priv ( dev ) ;
struct sunxi_glue * glue = dev_get_priv ( dev ) ;
struct musb_host_data * host = & glue - > mdata ;
struct usb_bus_priv * priv = dev_get_uclass_priv ( dev ) ;
void * base = dev_read_addr_ptr ( dev ) ;
int ret ;
@ -317,10 +325,14 @@ static int musb_usb_probe(struct udevice *dev)
if ( ! base )
return - EINVAL ;
glue - > ccm = ( struct sunxi_ccm_reg * ) SUNXI_CCM_BASE ;
if ( IS_ERR ( glue - > ccm ) )
return PTR_ERR ( glue - > ccm ) ;
priv - > desc_before_addr = true ;
# ifdef CONFIG_USB_MUSB_HOST
host - > host = musb_init_controller ( & musb_plat , NULL , base ) ;
host - > host = musb_init_controller ( & musb_plat , & glue - > dev , base ) ;
if ( ! host - > host )
return - EIO ;
@ -328,7 +340,7 @@ static int musb_usb_probe(struct udevice *dev)
if ( ! ret )
printf ( " Allwinner mUSB OTG (Host) \n " ) ;
# else
ret = musb_register ( & musb_plat , NULL , base ) ;
ret = musb_register ( & musb_plat , & glue - > dev , base ) ;
if ( ! ret )
printf ( " Allwinner mUSB OTG (Peripheral) \n " ) ;
# endif
@ -338,16 +350,16 @@ static int musb_usb_probe(struct udevice *dev)
static int musb_usb_remove ( struct udevice * dev )
{
struct musb_host_data * host = dev_get_priv ( dev ) ;
struct sunxi_ccm_reg * ccm = ( struct sunxi_ccm_reg * ) SUNXI_CCM_BASE ;
struct sunxi_glue * glue = dev_get_priv ( dev ) ;
struct musb_host_data * host = & glue - > mdata ;
musb_stop ( host - > host ) ;
sunxi_usb_phy_exit ( 0 ) ;
# ifdef CONFIG_SUNXI_GEN_SUN6I
clrbits_le32 ( & ccm - > ahb_reset0_cfg , 1 < < AHB_GATE_OFFSET_USB0 ) ;
clrbits_le32 ( & glue - > ccm - > ahb_reset0_cfg , 1 < < AHB_GATE_OFFSET_USB0 ) ;
# endif
clrbits_le32 ( & ccm - > ahb_gate0 , 1 < < AHB_GATE_OFFSET_USB0 ) ;
clrbits_le32 ( & glue - > ccm - > ahb_gate0 , 1 < < AHB_GATE_OFFSET_USB0 ) ;
free ( host - > host ) ;
host - > host = NULL ;
@ -377,5 +389,5 @@ U_BOOT_DRIVER(usb_musb) = {
. ops = & musb_usb_ops ,
# endif
. platdata_auto_alloc_size = sizeof ( struct usb_platdata ) ,
. priv_auto_alloc_size = sizeof ( struct musb_host_data ) ,
. priv_auto_alloc_size = sizeof ( struct sunxi_glue ) ,
} ;