aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb
diff options
context:
space:
mode:
authorFelipe Balbi <balbi@ti.com>2010-12-02 13:13:09 +0200
committerFelipe Balbi <balbi@ti.com>2010-12-10 10:21:31 +0200
commitfcd22e3b1f12e026dfefca20c97ff550a0e11b2b (patch)
treebbc97f1164cea1d37b110474c525c52b27ea5770 /drivers/usb
parent6f783e287c074afe1e9cf3f32ded9948e184b45e (diff)
downloadkernel_samsung_smdk4412-fcd22e3b1f12e026dfefca20c97ff550a0e11b2b.zip
kernel_samsung_smdk4412-fcd22e3b1f12e026dfefca20c97ff550a0e11b2b.tar.gz
kernel_samsung_smdk4412-fcd22e3b1f12e026dfefca20c97ff550a0e11b2b.tar.bz2
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.c64
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,
},
};