aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/musb/omap2430.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/musb/omap2430.c')
-rw-r--r--drivers/usb/musb/omap2430.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/drivers/usb/musb/omap2430.c b/drivers/usb/musb/omap2430.c
index e279cf32772e..f40c8053a291 100644
--- a/drivers/usb/musb/omap2430.c
+++ b/drivers/usb/musb/omap2430.c
@@ -41,6 +41,8 @@
41struct omap2430_glue { 41struct omap2430_glue {
42 struct device *dev; 42 struct device *dev;
43 struct platform_device *musb; 43 struct platform_device *musb;
44 u8 xceiv_event;
45 struct work_struct omap_musb_mailbox_work;
44}; 46};
45#define glue_to_musb(g) platform_get_drvdata(g->musb) 47#define glue_to_musb(g) platform_get_drvdata(g->musb)
46 48
@@ -226,22 +228,26 @@ static inline void omap2430_low_level_init(struct musb *musb)
226static int musb_otg_notifications(struct notifier_block *nb, 228static int musb_otg_notifications(struct notifier_block *nb,
227 unsigned long event, void *unused) 229 unsigned long event, void *unused)
228{ 230{
229 struct musb *musb = container_of(nb, struct musb, nb); 231 struct musb *musb = container_of(nb, struct musb, nb);
232 struct device *dev = musb->controller;
233 struct omap2430_glue *glue = dev_get_drvdata(dev->parent);
230 234
231 musb->xceiv_event = event; 235 glue->xceiv_event = event;
232 schedule_work(&musb->otg_notifier_work); 236 schedule_work(&glue->omap_musb_mailbox_work);
233 237
234 return NOTIFY_OK; 238 return NOTIFY_OK;
235} 239}
236 240
237static void musb_otg_notifier_work(struct work_struct *data_notifier_work) 241static void omap_musb_mailbox_work(struct work_struct *data_notifier_work)
238{ 242{
239 struct musb *musb = container_of(data_notifier_work, struct musb, otg_notifier_work); 243 struct omap2430_glue *glue = container_of(data_notifier_work,
244 struct omap2430_glue, omap_musb_mailbox_work);
245 struct musb *musb = glue_to_musb(glue);
240 struct device *dev = musb->controller; 246 struct device *dev = musb->controller;
241 struct musb_hdrc_platform_data *pdata = dev->platform_data; 247 struct musb_hdrc_platform_data *pdata = dev->platform_data;
242 struct omap_musb_board_data *data = pdata->board_data; 248 struct omap_musb_board_data *data = pdata->board_data;
243 249
244 switch (musb->xceiv_event) { 250 switch (glue->xceiv_event) {
245 case USB_EVENT_ID: 251 case USB_EVENT_ID:
246 dev_dbg(musb->controller, "ID GND\n"); 252 dev_dbg(musb->controller, "ID GND\n");
247 253
@@ -298,8 +304,6 @@ static int omap2430_musb_init(struct musb *musb)
298 return -ENODEV; 304 return -ENODEV;
299 } 305 }
300 306
301 INIT_WORK(&musb->otg_notifier_work, musb_otg_notifier_work);
302
303 status = pm_runtime_get_sync(dev); 307 status = pm_runtime_get_sync(dev);
304 if (status < 0) { 308 if (status < 0) {
305 dev_err(dev, "pm_runtime_get_sync FAILED %d\n", status); 309 dev_err(dev, "pm_runtime_get_sync FAILED %d\n", status);
@@ -388,7 +392,6 @@ static void omap2430_musb_disable(struct musb *musb)
388static int omap2430_musb_exit(struct musb *musb) 392static int omap2430_musb_exit(struct musb *musb)
389{ 393{
390 del_timer_sync(&musb_idle_timer); 394 del_timer_sync(&musb_idle_timer);
391 cancel_work_sync(&musb->otg_notifier_work);
392 395
393 omap2430_low_level_exit(musb); 396 omap2430_low_level_exit(musb);
394 usb_put_phy(musb->xceiv); 397 usb_put_phy(musb->xceiv);
@@ -441,6 +444,8 @@ static int __devinit omap2430_probe(struct platform_device *pdev)
441 444
442 platform_set_drvdata(pdev, glue); 445 platform_set_drvdata(pdev, glue);
443 446
447 INIT_WORK(&glue->omap_musb_mailbox_work, omap_musb_mailbox_work);
448
444 ret = platform_device_add_resources(musb, pdev->resource, 449 ret = platform_device_add_resources(musb, pdev->resource,
445 pdev->num_resources); 450 pdev->num_resources);
446 if (ret) { 451 if (ret) {
@@ -478,6 +483,7 @@ static int __devexit omap2430_remove(struct platform_device *pdev)
478{ 483{
479 struct omap2430_glue *glue = platform_get_drvdata(pdev); 484 struct omap2430_glue *glue = platform_get_drvdata(pdev);
480 485
486 cancel_work_sync(&glue->omap_musb_mailbox_work);
481 platform_device_del(glue->musb); 487 platform_device_del(glue->musb);
482 platform_device_put(glue->musb); 488 platform_device_put(glue->musb);
483 kfree(glue); 489 kfree(glue);