aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/adm5120/patches-2.6.28/800-usb_automatically_enable_rhsc_interrupt.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/adm5120/patches-2.6.28/800-usb_automatically_enable_rhsc_interrupt.patch')
-rw-r--r--target/linux/adm5120/patches-2.6.28/800-usb_automatically_enable_rhsc_interrupt.patch69
1 files changed, 69 insertions, 0 deletions
diff --git a/target/linux/adm5120/patches-2.6.28/800-usb_automatically_enable_rhsc_interrupt.patch b/target/linux/adm5120/patches-2.6.28/800-usb_automatically_enable_rhsc_interrupt.patch
new file mode 100644
index 0000000000..dc0f843c86
--- /dev/null
+++ b/target/linux/adm5120/patches-2.6.28/800-usb_automatically_enable_rhsc_interrupt.patch
@@ -0,0 +1,69 @@
+--- 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 <juhosg@openwrt.org>"
+ #define DRIVER_DESC "ADMtek USB 1.1 Host Controller Driver"
+