aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2012-12-15 10:35:37 +1100
committerDenis 'GNUtoo' Carikli <GNUtoo@no-log.org>2013-03-09 15:41:40 +0100
commit4406b52a12d6f43cd16418a61f7157a7870a34bd (patch)
tree366cb8ede00b9d147dd1e84564d1ec874c03a95c
parent3370528f041a0da8701c8a2a7c4ff378bc35c4b1 (diff)
downloadkernel_goldelico_gta04-4406b52a12d6f43cd16418a61f7157a7870a34bd.zip
kernel_goldelico_gta04-4406b52a12d6f43cd16418a61f7157a7870a34bd.tar.gz
kernel_goldelico_gta04-4406b52a12d6f43cd16418a61f7157a7870a34bd.tar.bz2
twl4030-usb - re-instate event notifications
commit c9721438c009adf8e81d376839ed037c53b9b8d9 usb: musb: twl: use mailbox API to send VBUS or ID events went a bit too far in removing all event notification from twl4030-usb. The notifications are still needed for twl4030_charger.c to know when to enable the charger. Signed-off-by: NeilBrown <neilb@suse.de>
-rw-r--r--drivers/usb/otg/twl4030-usb.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/drivers/usb/otg/twl4030-usb.c b/drivers/usb/otg/twl4030-usb.c
index 58e406e..cc14e99 100644
--- a/drivers/usb/otg/twl4030-usb.c
+++ b/drivers/usb/otg/twl4030-usb.c
@@ -38,6 +38,7 @@
#include <linux/i2c/twl.h>
#include <linux/regulator/consumer.h>
#include <linux/err.h>
+#include <linux/notifier.h>
#include <linux/slab.h>
/* Register defines */
@@ -391,6 +392,28 @@ static void twl4030_phy_power(struct twl4030_usb *twl, int on)
}
}
+static void do_notify(struct twl4030_usb *twl,
+ enum omap_musb_vbus_id_status status)
+{
+ enum usb_phy_events event;
+
+ switch (status) {
+ case OMAP_MUSB_UNKNOWN:
+ event = USB_EVENT_NONE; break;
+ case OMAP_MUSB_ID_GROUND:
+ event = USB_EVENT_ID; break;
+ case OMAP_MUSB_ID_FLOAT:
+ event = USB_EVENT_NONE; break;
+ case OMAP_MUSB_VBUS_VALID:
+ event = USB_EVENT_VBUS; break;
+ case OMAP_MUSB_VBUS_OFF:
+ event = USB_EVENT_NONE; break;
+ }
+
+ atomic_notifier_call_chain(&twl->phy.notifier, event,
+ twl->phy.otg->gadget);
+}
+
static void twl4030_phy_suspend(struct twl4030_usb *twl, int controller_off)
{
if (twl->asleep)
@@ -552,6 +575,7 @@ static irqreturn_t twl4030_usb_irq(int irq, void *_twl)
twl4030_phy_suspend(twl, 0);
else
twl4030_phy_resume(twl);
+ do_notify(twl, status);
omap_musb_mailbox(twl->linkstat);
}
@@ -575,6 +599,7 @@ static void twl4030_usb_phy_init(struct twl4030_usb *twl)
twl->asleep = 0;
}
+ do_notify(twl, status);
omap_musb_mailbox(twl->linkstat);
}
sysfs_notify(&twl->dev->kobj, NULL, "vbus");
@@ -674,6 +699,8 @@ static int twl4030_usb_probe(struct platform_device *pdev)
if (device_create_file(&pdev->dev, &dev_attr_id))
dev_warn(&pdev->dev, "could not create sysfs file\n");
+ ATOMIC_INIT_NOTIFIER_HEAD(&twl->phy.notifier);
+
/* Our job is to use irqs and status from the power module
* to keep the transceiver disabled when nothing's connected.
*