[MMC] wbsd pnp suspend
authorPierre Ossman <drzeus@drzeus.cx>
Sun, 8 Jan 2006 14:21:52 +0000 (14:21 +0000)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Sun, 8 Jan 2006 14:21:52 +0000 (14:21 +0000)
Allow the wbsd driver to use the new suspend/resume functions added to
the PnP layer.

Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
drivers/mmc/wbsd.c

index 4f13bd2ccf9a74b2479727951962b83deb79ffbb..60afc12351201bc666f6d306ee4dda79c30915c9 100644 (file)
@@ -1980,37 +1980,53 @@ static void __devexit wbsd_pnp_remove(struct pnp_dev * dev)
 
 #ifdef CONFIG_PM
 
-static int wbsd_suspend(struct platform_device *dev, pm_message_t state)
+static int wbsd_suspend(struct wbsd_host *host, pm_message_t state)
+{
+       BUG_ON(host == NULL);
+
+       return mmc_suspend_host(host->mmc, state);
+}
+
+static int wbsd_resume(struct wbsd_host *host)
+{
+       BUG_ON(host == NULL);
+
+       wbsd_init_device(host);
+
+       return mmc_resume_host(host->mmc);
+}
+
+static int wbsd_platform_suspend(struct platform_device *dev, pm_message_t state)
 {
        struct mmc_host *mmc = platform_get_drvdata(dev);
        struct wbsd_host *host;
        int ret;
 
-       if (!mmc)
+       if (mmc == NULL)
                return 0;
 
-       DBG("Suspending...\n");
-
-       ret = mmc_suspend_host(mmc, state);
-       if (!ret)
-               return ret;
+       DBGF("Suspending...\n");
 
        host = mmc_priv(mmc);
 
+       ret = wbsd_suspend(host, state);
+       if (ret)
+               return ret;
+
        wbsd_chip_poweroff(host);
 
        return 0;
 }
 
-static int wbsd_resume(struct platform_device *dev)
+static int wbsd_platform_resume(struct platform_device *dev)
 {
        struct mmc_host *mmc = platform_get_drvdata(dev);
        struct wbsd_host *host;
 
-       if (!mmc)
+       if (mmc == NULL)
                return 0;
 
-       DBG("Resuming...\n");
+       DBGF("Resuming...\n");
 
        host = mmc_priv(mmc);
 
@@ -2021,15 +2037,70 @@ static int wbsd_resume(struct platform_device *dev)
         */
        mdelay(5);
 
-       wbsd_init_device(host);
+       return wbsd_resume(host);
+}
+
+#ifdef CONFIG_PNP
+
+static int wbsd_pnp_suspend(struct pnp_dev *pnp_dev, pm_message_t state)
+{
+       struct mmc_host *mmc = dev_get_drvdata(&pnp_dev->dev);
+       struct wbsd_host *host;
+
+       if (mmc == NULL)
+               return 0;
 
-       return mmc_resume_host(mmc);
+       DBGF("Suspending...\n");
+
+       host = mmc_priv(mmc);
+
+       return wbsd_suspend(host, state);
 }
 
+static int wbsd_pnp_resume(struct pnp_dev *pnp_dev)
+{
+       struct mmc_host *mmc = dev_get_drvdata(&pnp_dev->dev);
+       struct wbsd_host *host;
+
+       if (mmc == NULL)
+               return 0;
+
+       DBGF("Resuming...\n");
+
+       host = mmc_priv(mmc);
+
+       /*
+        * See if chip needs to be configured.
+        */
+       if (host->config != 0)
+       {
+               if (!wbsd_chip_validate(host))
+               {
+                       printk(KERN_WARNING DRIVER_NAME
+                               ": PnP active but chip not configured! "
+                               "You probably have a buggy BIOS. "
+                               "Configuring chip manually.\n");
+                       wbsd_chip_config(host);
+               }
+       }
+
+       /*
+        * Allow device to initialise itself properly.
+        */
+       mdelay(5);
+
+       return wbsd_resume(host);
+}
+
+#endif /* CONFIG_PNP */
+
 #else /* CONFIG_PM */
 
-#define wbsd_suspend NULL
-#define wbsd_resume NULL
+#define wbsd_platform_suspend NULL
+#define wbsd_platform_resume NULL
+
+#define wbsd_pnp_suspend NULL
+#define wbsd_pnp_resume NULL
 
 #endif /* CONFIG_PM */
 
@@ -2039,8 +2110,8 @@ static struct platform_driver wbsd_driver = {
        .probe          = wbsd_probe,
        .remove         = __devexit_p(wbsd_remove),
 
-       .suspend        = wbsd_suspend,
-       .resume         = wbsd_resume,
+       .suspend        = wbsd_platform_suspend,
+       .resume         = wbsd_platform_resume,
        .driver         = {
                .name   = DRIVER_NAME,
        },
@@ -2053,6 +2124,9 @@ static struct pnp_driver wbsd_pnp_driver = {
        .id_table       = pnp_dev_table,
        .probe          = wbsd_pnp_probe,
        .remove         = __devexit_p(wbsd_pnp_remove),
+
+       .suspend        = wbsd_pnp_suspend,
+       .resume         = wbsd_pnp_resume,
 };
 
 #endif /* CONFIG_PNP */