@ -33,6 +33,11 @@
# include <i2c.h>
# include <miiphy.h>
# include <cpsw.h>
# include <asm/errno.h>
# include <linux/usb/ch9.h>
# include <linux/usb/gadget.h>
# include <linux/usb/musb.h>
# include <asm/omap_musb.h>
DECLARE_GLOBAL_DATA_PTR ;
@ -63,3 +68,83 @@ void setup_clocks_for_console(void)
/* Not yet implemented */
return ;
}
/* AM33XX has two MUSB controllers which can be host or gadget */
# if (defined(CONFIG_MUSB_GADGET) || defined(CONFIG_MUSB_HOST)) && \
( defined ( CONFIG_AM335X_USB0 ) | | defined ( CONFIG_AM335X_USB1 ) )
static struct ctrl_dev * cdev = ( struct ctrl_dev * ) CTRL_DEVICE_BASE ;
/* USB 2.0 PHY Control */
# define CM_PHY_PWRDN (1 << 0)
# define CM_PHY_OTG_PWRDN (1 << 1)
# define OTGVDET_EN (1 << 19)
# define OTGSESSENDEN (1 << 20)
static void am33xx_usb_set_phy_power ( u8 on , u32 * reg_addr )
{
if ( on ) {
clrsetbits_le32 ( reg_addr , CM_PHY_PWRDN | CM_PHY_OTG_PWRDN ,
OTGVDET_EN | OTGSESSENDEN ) ;
} else {
clrsetbits_le32 ( reg_addr , 0 , CM_PHY_PWRDN | CM_PHY_OTG_PWRDN ) ;
}
}
static struct musb_hdrc_config musb_config = {
. multipoint = 1 ,
. dyn_fifo = 1 ,
. num_eps = 16 ,
. ram_bits = 12 ,
} ;
# ifdef CONFIG_AM335X_USB0
static void am33xx_otg0_set_phy_power ( u8 on )
{
am33xx_usb_set_phy_power ( on , & cdev - > usb_ctrl0 ) ;
}
struct omap_musb_board_data otg0_board_data = {
. set_phy_power = am33xx_otg0_set_phy_power ,
} ;
static struct musb_hdrc_platform_data otg0_plat = {
. mode = CONFIG_AM335X_USB0_MODE ,
. config = & musb_config ,
. power = 50 ,
. platform_ops = & musb_dsps_ops ,
. board_data = & otg0_board_data ,
} ;
# endif
# ifdef CONFIG_AM335X_USB1
static void am33xx_otg1_set_phy_power ( u8 on )
{
am33xx_usb_set_phy_power ( on , & cdev - > usb_ctrl1 ) ;
}
struct omap_musb_board_data otg1_board_data = {
. set_phy_power = am33xx_otg1_set_phy_power ,
} ;
static struct musb_hdrc_platform_data otg1_plat = {
. mode = CONFIG_AM335X_USB1_MODE ,
. config = & musb_config ,
. power = 50 ,
. platform_ops = & musb_dsps_ops ,
. board_data = & otg1_board_data ,
} ;
# endif
# endif
int arch_misc_init ( void )
{
# ifdef CONFIG_AM335X_USB0
musb_register ( & otg0_plat , & otg0_board_data ,
( void * ) AM335X_USB0_OTG_BASE ) ;
# endif
# ifdef CONFIG_AM335X_USB1
musb_register ( & otg1_plat , & otg1_board_data ,
( void * ) AM335X_USB1_OTG_BASE ) ;
# endif
return 0 ;
}