aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc_linux.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/bcmdhd/bcmsdh_sdmmc_linux.c')
-rw-r--r--drivers/net/wireless/bcmdhd/bcmsdh_sdmmc_linux.c58
1 files changed, 28 insertions, 30 deletions
diff --git a/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc_linux.c b/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc_linux.c
index ed37e8c2c9b..609f8d0f8c5 100644
--- a/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc_linux.c
+++ b/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc_linux.c
@@ -21,7 +21,7 @@
* software in any way with any other Broadcom software provided under a license
* other than the GPL, without Broadcom's express prior written consent.
*
- * $Id: bcmsdh_sdmmc_linux.c 355594 2012-09-07 10:22:02Z $
+ * $Id: bcmsdh_sdmmc_linux.c 381717 2013-01-29 07:10:21Z $
*/
#include <typedefs.h>
@@ -136,6 +136,8 @@ static int bcmsdh_sdmmc_probe(struct sdio_func *func,
#endif
sd_trace(("F2 found, calling bcmsdh_probe...\n"));
ret = bcmsdh_probe(&func->dev);
+ if (ret < 0 && gInstance)
+ gInstance->func[2] = NULL;
}
} else {
ret = -ENODEV;
@@ -153,10 +155,12 @@ static void bcmsdh_sdmmc_remove(struct sdio_func *func)
sd_info(("sdio_device: 0x%04x\n", func->device));
sd_info(("Function#: 0x%04x\n", func->num));
- if (func->num == 2) {
+ if (gInstance->func[2]) {
sd_trace(("F2 found, calling bcmsdh_remove...\n"));
bcmsdh_remove(&func->dev);
- } else if (func->num == 1) {
+ gInstance->func[2] = NULL;
+ }
+ if (func->num == 1) {
sdio_claim_host(func);
sdio_disable_func(func);
sdio_release_host(func);
@@ -192,11 +196,13 @@ static int bcmsdh_sdmmc_suspend(struct device *pdev)
if (func->num != 2)
return 0;
- sd_trace_hw4(("%s Enter\n", __FUNCTION__));
-
+#ifdef CUSTOMER_HW4
+ sd_err(("%s Enter\n", __FUNCTION__));
+#else
+ sd_trace(("%s Enter\n", __FUNCTION__));
+#endif
if (dhd_os_check_wakelock(bcmsdh_get_drvdata()))
return -EBUSY;
-
sdio_flags = sdio_get_host_pm_caps(func);
if (!(sdio_flags & MMC_PM_KEEP_POWER)) {
@@ -210,16 +216,10 @@ static int bcmsdh_sdmmc_suspend(struct device *pdev)
sd_err(("%s: error while trying to keep power\n", __FUNCTION__));
return ret;
}
-
-#if !defined(CUSTOMER_HW4)
-#if defined(OOB_INTR_ONLY)
+#if defined(OOB_INTR_ONLY) && !defined(CUSTOMER_HW4)
bcmsdh_oob_intr_set(0);
-#endif /* defined(OOB_INTR_ONLY) */
-#endif /* !defined(CUSTOMER_HW4) */
+#endif /* OOB_INTR_ONLY && !CUSTOMER_HW4 */
dhd_mmc_suspend = TRUE;
-#if defined(CUSTOMER_HW4) && defined(CONFIG_ARCH_TEGRA)
- irq_set_irq_wake(390, 1);
-#endif
smp_mb();
return 0;
@@ -227,24 +227,20 @@ static int bcmsdh_sdmmc_suspend(struct device *pdev)
static int bcmsdh_sdmmc_resume(struct device *pdev)
{
-#if !defined(CUSTOMER_HW4)
-#if defined(OOB_INTR_ONLY)
+#if defined(OOB_INTR_ONLY) && !defined(CUSTOMER_HW4)
struct sdio_func *func = dev_to_sdio_func(pdev);
-#endif /* defined(OOB_INTR_ONLY) */
-#endif /* defined(CUSTOMER_HW4) */
- sd_trace_hw4(("%s Enter\n", __FUNCTION__));
-
+#endif /* OOB_INTR_ONLY && !CUSTOMER_HW4 */
+#ifdef CUSTOMER_HW4
+ sd_err(("%s Enter\n", __FUNCTION__));
+#else
+ sd_trace(("%s Enter\n", __FUNCTION__));
+#endif
dhd_mmc_suspend = FALSE;
-#if !defined(CUSTOMER_HW4)
-#if defined(OOB_INTR_ONLY)
+#if defined(OOB_INTR_ONLY) && !defined(CUSTOMER_HW4)
if ((func->num == 2) && dhd_os_check_if_up(bcmsdh_get_drvdata()))
bcmsdh_oob_intr_set(1);
-#endif /* (OOB_INTR_ONLY) */
-#endif /* !(CUSTOMER_HW4) */
-#if defined(CUSTOMER_HW4) && defined(CONFIG_ARCH_TEGRA)
- if (func->num == 2)
- irq_set_irq_wake(390, 0);
-#endif
+#endif /* OOB_INTR_ONLY && !CUSTOMER_HW4 */
+
smp_mb();
return 0;
}
@@ -412,7 +408,7 @@ int sdio_function_init(void)
error = sdio_register_driver(&bcmsdh_sdmmc_driver);
if (error && gInstance) {
kfree(gInstance);
- gInstance = 0;
+ gInstance = NULL;
}
return error;
@@ -429,6 +425,8 @@ void sdio_function_cleanup(void)
sdio_unregister_driver(&bcmsdh_sdmmc_driver);
- if (gInstance)
+ if (gInstance) {
kfree(gInstance);
+ gInstance = NULL;
+ }
}