|
@@ -589,7 +589,15 @@ static irqreturn_t twl4030_usb_irq(int irq, void *_twl)
|
|
}
|
|
}
|
|
omap_musb_mailbox(status);
|
|
omap_musb_mailbox(status);
|
|
}
|
|
}
|
|
- sysfs_notify(&twl->dev->kobj, NULL, "vbus");
|
|
|
|
|
|
+
|
|
|
|
+ /* don't schedule during sleep - irq works right then */
|
|
|
|
+ if (status == OMAP_MUSB_ID_GROUND && !twl->asleep) {
|
|
|
|
+ cancel_delayed_work(&twl->id_workaround_work);
|
|
|
|
+ schedule_delayed_work(&twl->id_workaround_work, HZ);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (irq)
|
|
|
|
+ sysfs_notify(&twl->dev->kobj, NULL, "vbus");
|
|
|
|
|
|
return IRQ_HANDLED;
|
|
return IRQ_HANDLED;
|
|
}
|
|
}
|
|
@@ -598,29 +606,8 @@ static void twl4030_id_workaround_work(struct work_struct *work)
|
|
{
|
|
{
|
|
struct twl4030_usb *twl = container_of(work, struct twl4030_usb,
|
|
struct twl4030_usb *twl = container_of(work, struct twl4030_usb,
|
|
id_workaround_work.work);
|
|
id_workaround_work.work);
|
|
- enum omap_musb_vbus_id_status status;
|
|
|
|
- bool status_changed = false;
|
|
|
|
-
|
|
|
|
- status = twl4030_usb_linkstat(twl);
|
|
|
|
-
|
|
|
|
- spin_lock_irq(&twl->lock);
|
|
|
|
- if (status >= 0 && status != twl->linkstat) {
|
|
|
|
- twl->linkstat = status;
|
|
|
|
- status_changed = true;
|
|
|
|
- }
|
|
|
|
- spin_unlock_irq(&twl->lock);
|
|
|
|
-
|
|
|
|
- if (status_changed) {
|
|
|
|
- dev_dbg(twl->dev, "handle missing status change to %d\n",
|
|
|
|
- status);
|
|
|
|
- omap_musb_mailbox(status);
|
|
|
|
- }
|
|
|
|
|
|
|
|
- /* don't schedule during sleep - irq works right then */
|
|
|
|
- if (status == OMAP_MUSB_ID_GROUND && !twl->asleep) {
|
|
|
|
- cancel_delayed_work(&twl->id_workaround_work);
|
|
|
|
- schedule_delayed_work(&twl->id_workaround_work, HZ);
|
|
|
|
- }
|
|
|
|
|
|
+ twl4030_usb_irq(0, twl);
|
|
}
|
|
}
|
|
|
|
|
|
static int twl4030_phy_init(struct phy *phy)
|
|
static int twl4030_phy_init(struct phy *phy)
|