@ -34,7 +34,7 @@ static struct pci_device_id ehci_pci_ids[] = {
{ 0 , 0 }
{ 0 , 0 }
} ;
} ;
# else
# else
static pci_dev_t ehci_find_class ( vo id)
static pci_dev_t ehci_find_class ( int in dex )
{
{
int bus ;
int bus ;
int devnum ;
int devnum ;
@ -54,7 +54,8 @@ static pci_dev_t ehci_find_class(void)
bdf + = PCI_BDF ( 0 , 0 , 1 ) ) {
bdf + = PCI_BDF ( 0 , 0 , 1 ) ) {
pci_read_config_dword ( bdf , PCI_CLASS_REVISION ,
pci_read_config_dword ( bdf , PCI_CLASS_REVISION ,
& class ) ;
& class ) ;
if ( class > > 8 = = PCI_CLASS_SERIAL_USB_EHCI )
if ( ( class > > 8 = = PCI_CLASS_SERIAL_USB_EHCI )
& & ! index - - )
return bdf ;
return bdf ;
}
}
}
}
@ -68,29 +69,35 @@ static pci_dev_t ehci_find_class(void)
* Create the appropriate control structures to manage
* Create the appropriate control structures to manage
* a new EHCI host controller .
* a new EHCI host controller .
*/
*/
int ehci_hcd_init ( int index , struct ehci_hccr * * hccr , struct ehci_hcor * * hcor )
int ehci_hcd_init ( int index , struct ehci_hccr * * ret_hccr ,
struct ehci_hcor * * ret_hcor )
{
{
pci_dev_t pdev ;
pci_dev_t pdev ;
uint32_t cmd ;
uint32_t cmd ;
struct ehci_hccr * hccr ;
struct ehci_hcor * hcor ;
# ifdef CONFIG_PCI_EHCI_DEVICE
# ifdef CONFIG_PCI_EHCI_DEVICE
pdev = pci_find_devices ( ehci_pci_ids , CONFIG_PCI_EHCI_DEVICE ) ;
pdev = pci_find_devices ( ehci_pci_ids , CONFIG_PCI_EHCI_DEVICE ) ;
# else
# else
pdev = ehci_find_class ( ) ;
pdev = ehci_find_class ( index ) ;
# endif
# endif
if ( pdev < 0 ) {
if ( pdev < 0 ) {
printf ( " EHCI host controller not found \n " ) ;
printf ( " EHCI host controller not found \n " ) ;
return - 1 ;
return - 1 ;
}
}
* hccr = ( struct ehci_hccr * ) pci_map_bar ( pdev ,
hccr = ( struct ehci_hccr * ) pci_map_bar ( pdev ,
PCI_BASE_ADDRESS_0 , PCI_REGION_MEM ) ;
PCI_BASE_ADDRESS_0 , PCI_REGION_MEM ) ;
* hcor = ( struct ehci_hcor * ) ( ( uint32_t ) * hccr +
hcor = ( struct ehci_hcor * ) ( ( uint32_t ) hccr +
HC_LENGTH ( ehci_readl ( & ( * hccr ) - > cr_capbase ) ) ) ;
HC_LENGTH ( ehci_readl ( & hccr - > cr_capbase ) ) ) ;
debug ( " EHCI-PCI init hccr 0x%x and hcor 0x%x hc_length %d \n " ,
debug ( " EHCI-PCI init hccr 0x%x and hcor 0x%x hc_length %d \n " ,
( uint32_t ) * hccr , ( uint32_t ) * hcor ,
( uint32_t ) hccr , ( uint32_t ) hcor ,
( uint32_t ) HC_LENGTH ( ehci_readl ( & ( * hccr ) - > cr_capbase ) ) ) ;
( uint32_t ) HC_LENGTH ( ehci_readl ( & hccr - > cr_capbase ) ) ) ;
* ret_hccr = hccr ;
* ret_hcor = hcor ;
/* enable busmaster */
/* enable busmaster */
pci_read_config_dword ( pdev , PCI_COMMAND , & cmd ) ;
pci_read_config_dword ( pdev , PCI_COMMAND , & cmd ) ;