diff options
author | Felipe Balbi <balbi@ti.com> | 2010-12-02 13:13:09 +0200 |
---|---|---|
committer | Felipe Balbi <balbi@ti.com> | 2010-12-10 10:21:31 +0200 |
commit | fcd22e3b1f12e026dfefca20c97ff550a0e11b2b (patch) | |
tree | bbc97f1164cea1d37b110474c525c52b27ea5770 /drivers/usb | |
parent | 6f783e287c074afe1e9cf3f32ded9948e184b45e (diff) | |
download | op-kernel-dev-fcd22e3b1f12e026dfefca20c97ff550a0e11b2b.zip op-kernel-dev-fcd22e3b1f12e026dfefca20c97ff550a0e11b2b.tar.gz |
usb: musb: blackfin: usb dev_pm_ops structure
instead of using musb_platform_suspend_resume,
we can use dev_pm_ops and let platform_device
core handle when to call musb_core's suspend and
glue layer's suspend.
Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb')
-rw-r--r-- | drivers/usb/musb/blackfin.c | 64 |
1 files changed, 40 insertions, 24 deletions
diff --git a/drivers/usb/musb/blackfin.c b/drivers/usb/musb/blackfin.c index 8c9c5fc..df0e906 100644 --- a/drivers/usb/musb/blackfin.c +++ b/drivers/usb/musb/blackfin.c @@ -27,6 +27,7 @@ struct bfin_glue { struct device *dev; struct platform_device *musb; }; +#define glue_to_musb(g) platform_get_drvdata(g->musb) /* * Load an endpoint's FIFO @@ -406,27 +407,6 @@ static int bfin_musb_init(struct musb *musb) return 0; } -static int bfin_musb_suspend(struct musb *musb) -{ - if (is_host_active(musb)) - /* - * During hibernate gpio_vrsel will change from high to low - * low which will generate wakeup event resume the system - * immediately. Set it to 0 before hibernate to avoid this - * wakeup event. - */ - gpio_set_value(musb->config->gpio_vrsel, 0); - - return 0; -} - -static int bfin_musb_resume(struct musb *musb) -{ - bfin_musb_reg_init(musb); - - return 0; -} - static int bfin_musb_exit(struct musb *musb) { gpio_free(musb->config->gpio_vrsel); @@ -446,9 +426,6 @@ static const struct musb_platform_ops bfin_ops = { .set_mode = bfin_musb_set_mode, .try_idle = bfin_musb_try_idle, - .suspend = bfin_musb_suspend, - .resume = bfin_musb_resume, - .vbus_status = bfin_musb_vbus_status, .set_vbus = bfin_musb_set_vbus, }; @@ -528,10 +505,49 @@ static int __exit bfin_remove(struct platform_device *pdev) return 0; } +#ifdef CONFIG_PM +static int bfin_suspend(struct device *dev) +{ + struct bfin_glue *glue = dev_get_drvdata(dev); + struct musb *musb = glue_to_musb(glue); + + if (is_host_active(musb)) + /* + * During hibernate gpio_vrsel will change from high to low + * low which will generate wakeup event resume the system + * immediately. Set it to 0 before hibernate to avoid this + * wakeup event. + */ + gpio_set_value(musb->config->gpio_vrsel, 0); + + return 0; +} + +static int bfin_resume(struct device *dev) +{ + struct bfin_glue *glue = dev_get_drvdata(dev); + struct musb *musb = glue_to_musb(glue); + + bfin_musb_reg_init(musb); + + return 0; +} + +static struct dev_pm_ops bfin_pm_ops = { + .suspend = bfin_suspend, + .resume = bfin_resume, +}; + +#define DEV_PM_OPS &bfin_pm_op, +#else +#define DEV_PM_OPS NULL +#endif + static struct platform_driver bfin_driver = { .remove = __exit_p(bfin_remove), .driver = { .name = "musb-bfin", + .pm = DEV_PM_OPS, }, }; |