--- a/drivers/usb/host/adm5120-drv.c +++ b/drivers/usb/host/adm5120-drv.c @@ -174,7 +174,6 @@ static const struct hc_driver adm5120_hc */ .hub_status_data = admhc_hub_status_data, .hub_control = admhc_hub_control, - .hub_irq_enable = admhc_hub_irq_enable, #ifdef CONFIG_PM .bus_suspend = admhc_bus_suspend, .bus_resume = admhc_bus_resume, --- a/drivers/usb/host/adm5120-hub.c +++ b/drivers/usb/host/adm5120-hub.c @@ -63,20 +63,6 @@ /*-------------------------------------------------------------------------*/ -/* hcd->hub_irq_enable() */ -static void admhc_hub_irq_enable(struct usb_hcd *hcd) -{ - struct admhcd *ahcd = hcd_to_admhcd(hcd); - - spin_lock_irq(&ahcd->lock); - if (!ahcd->autostop) - del_timer(&hcd->rh_timer); /* Prevent next poll */ - admhc_intr_enable(ahcd, ADMHC_INTR_INSM); - spin_unlock_irq(&ahcd->lock); -} - -/*-------------------------------------------------------------------------*/ - /* build "status change" packet (one or two bytes) from HC registers */ static int --- a/drivers/usb/host/adm5120-pm.c +++ b/drivers/usb/host/adm5120-pm.c @@ -432,13 +432,17 @@ static inline int admhc_rh_resume(struct static int admhc_root_hub_state_changes(struct admhcd *ahcd, int changed, int any_connected) { - int poll_rh = 1; - - /* keep on polling until RHSC is enabled */ + /* If INSM is enabled, don't poll */ if (admhc_readl(ahcd, &ahcd->regs->int_enable) & ADMHC_INTR_INSM) - poll_rh = 0; + return 0; + + /* If no status changes are pending, enable status-change interrupts */ + if (!changed) { + admhc_intr_enable(ahcd, ADMHC_INTR_INSM); + return 0; + } - return poll_rh; + return 1; } #endif /* CONFIG_PM */ --- a/drivers/usb/host/adm5120-hcd.c +++ b/drivers/usb/host/adm5120-hcd.c @@ -46,7 +46,7 @@ #include "../core/hcd.h" #include "../core/hub.h" -#define DRIVER_VERSION "0.25.0" +#define DRIVER_VERSION "0.27.0" #define DRIVER_AUTHOR "Gabor Juhos " #define DRIVER_DESC "ADMtek USB 1.1 Host Controller Driver"