diff options
Diffstat (limited to 'drivers/usb/musb/omap2430.c')
-rw-r--r-- | drivers/usb/musb/omap2430.c | 24 |
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 @@ | |||
41 | struct omap2430_glue { | 41 | struct 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) | |||
226 | static int musb_otg_notifications(struct notifier_block *nb, | 228 | static 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 | ||
237 | static void musb_otg_notifier_work(struct work_struct *data_notifier_work) | 241 | static 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) | |||
388 | static int omap2430_musb_exit(struct musb *musb) | 392 | static 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); |