@ -61,6 +61,14 @@ enum dr_mode {
DR_MODE_OTG , /* supports both */
} ;
enum usb_ctlr_type {
USB_CTLR_T20 ,
USB_CTLR_T30 ,
USB_CTLR_T114 ,
USB_CTRL_COUNT ,
} ;
/* Information about a USB port */
struct fdt_usb {
struct usb_ctlr * reg ; /* address of registers in physical memory */
@ -69,6 +77,7 @@ struct fdt_usb {
unsigned enabled : 1 ; /* 1 to enable, 0 to disable */
unsigned has_legacy_mode : 1 ; /* 1 if this port has legacy mode */
unsigned initialized : 1 ; /* has this port already been initialized? */
enum usb_ctlr_type type ;
enum usb_init_type init_type ;
enum dr_mode dr_mode ; /* dual role mode */
enum periph_id periph_id ; /* peripheral id */
@ -162,7 +171,7 @@ struct fdt_usb_controller {
const unsigned * pll_parameter ;
} ;
static struct fdt_usb_controller fdt_usb_controllers [ ] = {
static struct fdt_usb_controller fdt_usb_controllers [ USB_CTRL_COUNT ] = {
{
. compat = COMPAT_NVIDIA_TEGRA20_USB ,
. has_hostpc = 0 ,
@ -284,7 +293,7 @@ void usbf_reset_controller(struct fdt_usb *config, struct usb_ctlr *usbctlr)
setbits_le32 ( & usbctlr - > susp_ctrl , UTMIP_PHY_ENB ) ;
}
static const unsigned * get_pll_timing ( void )
static const unsigned * get_pll_timing ( struct fdt_usb_controller * controller )
{
const unsigned * timing ;
@ -331,6 +340,7 @@ static void init_phy_mux(struct fdt_usb *config, uint pts,
static int init_utmi_usb_controller ( struct fdt_usb * config ,
enum usb_init_type init )
{
struct fdt_usb_controller * controller ;
u32 b_sess_valid_mask , val ;
int loop_count ;
const unsigned * timing ;
@ -363,11 +373,14 @@ static int init_utmi_usb_controller(struct fdt_usb *config,
VBUS_SENSE_CTL_MASK ,
VBUS_SENSE_CTL_A_SESS_VLD < < VBUS_SENSE_CTL_SHIFT ) ;
controller = & fdt_usb_controllers [ config - > type ] ;
debug ( " controller=%p, type=%d \n " , controller , config - > type ) ;
/*
* PLL Delay CONFIGURATION settings . The following parameters control
* the bring up of the plls .
*/
timing = get_pll_timing ( ) ;
timing = get_pll_timing ( controller ) ;
if ( ! controller - > has_hostpc ) {
val = readl ( & usbctlr - > utmip_misc_cfg1 ) ;
@ -702,10 +715,12 @@ static int fdt_decode_usb(const void *blob, int node, struct fdt_usb *config)
* @ blob : fdt blob
* @ node_list : list of nodes to process ( any < = 0 are ignored )
* @ count : number of nodes to process
* @ id : controller type ( enum usb_ctlr_type )
*
* Return : 0 - ok , - 1 - error
*/
static int process_usb_nodes ( const void * blob , int node_list [ ] , int count )
static int process_usb_nodes ( const void * blob , int node_list [ ] , int count ,
enum usb_ctlr_type id )
{
struct fdt_usb config ;
int node , i ;
@ -729,9 +744,11 @@ static int process_usb_nodes(const void *blob, int node_list[], int count)
return - 1 ;
}
if ( ! clk_done ) {
config_clock ( get_pll_timing ( ) ) ;
config_clock ( get_pll_timing (
& fdt_usb_controllers [ id ] ) ) ;
clk_done = 1 ;
}
config . type = id ;
config . initialized = 0 ;
/* add new USB port to the list of available ports */
@ -753,7 +770,7 @@ int usb_process_devicetree(const void *blob)
count = fdtdec_find_aliases_for_id ( blob , " usb " ,
controller - > compat , node_list , USB_PORTS_MAX ) ;
if ( count ) {
err = process_usb_nodes ( blob , node_list , count ) ;
err = process_usb_nodes ( blob , node_list , count , i ) ;
if ( err )
printf ( " %s: Error processing USB node! \n " ,
__func__ ) ;
@ -786,6 +803,7 @@ int ehci_hcd_init(int index, enum usb_init_type init,
return - 1 ;
config = & port [ index ] ;
ehci_set_controller_priv ( index , config ) ;
switch ( init ) {
case USB_INIT_HOST :