]> git.karo-electronics.de Git - linux-beck.git/commitdiff
usb: musb: blackfin: usb dev_pm_ops structure
authorFelipe Balbi <balbi@ti.com>
Thu, 2 Dec 2010 11:13:09 +0000 (13:13 +0200)
committerFelipe Balbi <balbi@ti.com>
Fri, 10 Dec 2010 08:21:31 +0000 (10:21 +0200)
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>
drivers/usb/musb/blackfin.c

index 8c9c5fc3a6cad509874e51f782010f63c09b031b..df0e906b1850c7a84007eb808303d9b89a68cc79 100644 (file)
@@ -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,
        },
 };