summaryrefslogtreecommitdiffstats
path: root/target
diff options
context:
space:
mode:
authorGabor Juhos <juhosg@openwrt.org>2007-08-03 17:31:52 +0000
committerGabor Juhos <juhosg@openwrt.org>2007-08-03 17:31:52 +0000
commit1152f2f11f340cffa9e2a6190ecf505e977ae3a7 (patch)
treec3afee740218ad1dec8c9fa095f2eef801c7a635 /target
parentce520f5424fb44d0bf5f0328f2e4b786e5d7d05e (diff)
downloadmaster-31e0f0ae-1152f2f11f340cffa9e2a6190ecf505e977ae3a7.tar.gz
master-31e0f0ae-1152f2f11f340cffa9e2a6190ecf505e977ae3a7.tar.bz2
master-31e0f0ae-1152f2f11f340cffa9e2a6190ecf505e977ae3a7.zip
fix reset function in USB driver
SVN-Revision: 8332
Diffstat (limited to 'target')
-rw-r--r--target/linux/adm5120-2.6/files/drivers/usb/host/adm5120-hcd.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/target/linux/adm5120-2.6/files/drivers/usb/host/adm5120-hcd.c b/target/linux/adm5120-2.6/files/drivers/usb/host/adm5120-hcd.c
index 6e005bffad..875dc6c0b4 100644
--- a/target/linux/adm5120-2.6/files/drivers/usb/host/adm5120-hcd.c
+++ b/target/linux/adm5120-2.6/files/drivers/usb/host/adm5120-hcd.c
@@ -54,6 +54,7 @@ MODULE_AUTHOR("Jeroen Vreeken (pe1rxq@amsat.org)");
#define ADMHCD_INTMASK 0x00000001 /* Interrupt mask */
#define ADMHCD_REG_HOSTCONTROL 0x10
#define ADMHCD_DMA_EN 0x00000004 /* USB host DMA enable */
+#define ADMHCD_STATE_MASK 0x00000003
#define ADMHCD_STATE_RST 0x00000000 /* bus state reset */
#define ADMHCD_STATE_RES 0x00000001 /* bus state resume */
#define ADMHCD_STATE_OP 0x00000002 /* bus state operational */
@@ -776,7 +777,7 @@ static int admhcd_sw_reset(struct admhcd *ahcd)
static int admhcd_reset(struct usb_hcd *hcd)
{
struct admhcd *ahcd = hcd_to_admhcd(hcd);
- u32 val = 0;
+ u32 state = 0;
int ret, timeout = 15; /* ms */
unsigned long t;
@@ -785,19 +786,22 @@ static int admhcd_reset(struct usb_hcd *hcd)
return ret;
t = jiffies + msecs_to_jiffies(timeout);
- while (time_before_eq(jiffies, t)) {
- msleep(4);
+ do {
spin_lock_irq(&ahcd->lock);
- val = admhcd_reg_get(ahcd, ADMHCD_REG_HOSTCONTROL) & ADMHCD_STATE_RST;
+ state = admhcd_reg_get(ahcd, ADMHCD_REG_HOSTCONTROL);
spin_unlock_irq(&ahcd->lock);
- if (val)
+ state &= ADMHCD_STATE_MASK;
+ if (state == ADMHCD_STATE_RST)
break;
- }
- if (!val) {
+ msleep(4);
+ } while (time_before_eq(jiffies, t));
+
+ if (state != ADMHCD_STATE_RST) {
printk(KERN_WARNING "%s: device not ready after %dms\n",
hcd_name, timeout);
ret = -ENODEV;
}
+
return ret;
}