Merge branch 'master' of github.com:davem330/net
[linux-2.6.git] / drivers / net / wireless / wl12xx / sdio.c
index 4d5b4ce..516a898 100644 (file)
@@ -23,7 +23,6 @@
 
 #include <linux/irq.h>
 #include <linux/module.h>
-#include <linux/crc7.h>
 #include <linux/vmalloc.h>
 #include <linux/mmc/sdio_func.h>
 #include <linux/mmc/sdio_ids.h>
@@ -162,15 +161,17 @@ static int wl1271_sdio_power_on(struct wl1271 *wl)
        struct sdio_func *func = wl_to_func(wl);
        int ret;
 
-       /* Make sure the card will not be powered off by runtime PM */
-       ret = pm_runtime_get_sync(&func->dev);
-       if (ret < 0)
-               goto out;
-
-       /* Runtime PM might be disabled, so power up the card manually */
-       ret = mmc_power_restore_host(func->card->host);
-       if (ret < 0)
-               goto out;
+       /* If enabled, tell runtime PM not to power off the card */
+       if (pm_runtime_enabled(&func->dev)) {
+               ret = pm_runtime_get_sync(&func->dev);
+               if (ret < 0)
+                       goto out;
+       } else {
+               /* Runtime PM is disabled: power up the card manually */
+               ret = mmc_power_restore_host(func->card->host);
+               if (ret < 0)
+                       goto out;
+       }
 
        sdio_claim_host(func);
        sdio_enable_func(func);
@@ -187,13 +188,16 @@ static int wl1271_sdio_power_off(struct wl1271 *wl)
        sdio_disable_func(func);
        sdio_release_host(func);
 
-       /* Runtime PM might be disabled, so power off the card manually */
+       /* Power off the card manually, even if runtime PM is enabled. */
        ret = mmc_power_save_host(func->card->host);
        if (ret < 0)
                return ret;
 
-       /* Let runtime PM know the card is powered off */
-       return pm_runtime_put_sync(&func->dev);
+       /* If enabled, let runtime PM know the card is powered off */
+       if (pm_runtime_enabled(&func->dev))
+               ret = pm_runtime_put_sync(&func->dev);
+
+       return ret;
 }
 
 static int wl1271_sdio_set_power(struct wl1271 *wl, bool enable)
@@ -268,17 +272,19 @@ static int __devinit wl1271_probe(struct sdio_func *func,
                goto out_free;
        }
 
-       enable_irq_wake(wl->irq);
-       device_init_wakeup(wl1271_sdio_wl_to_dev(wl), 1);
-
-       disable_irq(wl->irq);
+       ret = enable_irq_wake(wl->irq);
+       if (!ret) {
+               wl->irq_wake_enabled = true;
+               device_init_wakeup(wl1271_sdio_wl_to_dev(wl), 1);
 
-       /* if sdio can keep power while host is suspended, enable wow */
-       mmcflags = sdio_get_host_pm_caps(func);
-       wl1271_debug(DEBUG_SDIO, "sdio PM caps = 0x%x", mmcflags);
+               /* if sdio can keep power while host is suspended, enable wow */
+               mmcflags = sdio_get_host_pm_caps(func);
+               wl1271_debug(DEBUG_SDIO, "sdio PM caps = 0x%x", mmcflags);
 
-       if (mmcflags & MMC_PM_KEEP_POWER)
-               hw->wiphy->wowlan.flags = WIPHY_WOWLAN_ANY;
+               if (mmcflags & MMC_PM_KEEP_POWER)
+                       hw->wiphy->wowlan.flags = WIPHY_WOWLAN_ANY;
+       }
+       disable_irq(wl->irq);
 
        ret = wl1271_init_ieee80211(wl);
        if (ret)
@@ -312,8 +318,10 @@ static void __devexit wl1271_remove(struct sdio_func *func)
        pm_runtime_get_noresume(&func->dev);
 
        wl1271_unregister_hw(wl);
-       device_init_wakeup(wl1271_sdio_wl_to_dev(wl), 0);
-       disable_irq_wake(wl->irq);
+       if (wl->irq_wake_enabled) {
+               device_init_wakeup(wl1271_sdio_wl_to_dev(wl), 0);
+               disable_irq_wake(wl->irq);
+       }
        free_irq(wl->irq, wl);
        wl1271_free_hw(wl);
 }
@@ -404,7 +412,5 @@ module_exit(wl1271_exit);
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>");
 MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");
-MODULE_FIRMWARE(WL1271_FW_NAME);
+MODULE_FIRMWARE(WL127X_FW_NAME);
 MODULE_FIRMWARE(WL128X_FW_NAME);
-MODULE_FIRMWARE(WL127X_AP_FW_NAME);
-MODULE_FIRMWARE(WL128X_AP_FW_NAME);