ARM: tegra: wifi dpd control for reset
Bitan Biswas [Fri, 27 Jul 2012 10:39:39 +0000 (15:39 +0530)]
Wifi On/Off needs to toggle GPIO pins under SDMMC that could be
in IO DPD mode.

bug 1021526

Change-Id: If514059372d2242c6f6512b30534536cbff455dd
Signed-off-by: Bitan Biswas <bbiswas@nvidia.com>
Reviewed-on: http://git-master/r/118940
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Pavan Kunapuli <pkunapuli@nvidia.com>
Tested-by: Pavan Kunapuli <pkunapuli@nvidia.com>

arch/arm/mach-tegra/board-cardhu-sdhci.c
arch/arm/mach-tegra/board-enterprise-sdhci.c
arch/arm/mach-tegra/board-kai-sdhci.c

index d8be9fe..df7177f 100644 (file)
@@ -28,6 +28,7 @@
 #include <mach/irqs.h>
 #include <mach/iomap.h>
 #include <mach/sdhci.h>
+#include <mach/io_dpd.h>
 
 #include "gpio-names.h"
 #include "board.h"
@@ -251,11 +252,31 @@ static int cardhu_wifi_set_carddetect(int val)
 
 static int cardhu_wifi_power(int on)
 {
+       struct tegra_io_dpd *sd_dpd;
+
        pr_debug("%s: %d\n", __func__, on);
+
+       /*
+        * FIXME : we need to revisit IO DPD code
+        * on how should multiple pins under DPD get controlled
+        *
+        * cardhu GPIO WLAN enable is part of SDMMC3 pin group
+        */
+       sd_dpd = tegra_io_dpd_get(&tegra_sdhci_device2.dev);
+       if (sd_dpd) {
+               mutex_lock(&sd_dpd->delay_lock);
+               tegra_io_dpd_disable(sd_dpd);
+               mutex_unlock(&sd_dpd->delay_lock);
+       }
        gpio_set_value(CARDHU_WLAN_PWR, on);
        mdelay(100);
        gpio_set_value(CARDHU_WLAN_RST, on);
        mdelay(200);
+       if (sd_dpd) {
+               mutex_lock(&sd_dpd->delay_lock);
+               tegra_io_dpd_enable(sd_dpd);
+               mutex_unlock(&sd_dpd->delay_lock);
+       }
 
        return 0;
 }
index 7a56326..8032f81 100644 (file)
@@ -27,6 +27,7 @@
 #include <mach/irqs.h>
 #include <mach/iomap.h>
 #include <mach/sdhci.h>
+#include <mach/io_dpd.h>
 
 #include "gpio-names.h"
 #include "board.h"
@@ -221,11 +222,31 @@ static int enterprise_wifi_set_carddetect(int val)
 
 static int enterprise_wifi_power(int on)
 {
+       struct tegra_io_dpd *sd_dpd;
+
        pr_debug("%s: %d\n", __func__, on);
+
+       /*
+        * FIXME : we need to revisit IO DPD code
+        * on how should multiple pins under DPD get controlled
+        *
+        * enterprise GPIO WLAN enable is part of SDMMC1 pin group
+        */
+       sd_dpd = tegra_io_dpd_get(&tegra_sdhci_device0.dev);
+       if (sd_dpd) {
+               mutex_lock(&sd_dpd->delay_lock);
+               tegra_io_dpd_disable(sd_dpd);
+               mutex_unlock(&sd_dpd->delay_lock);
+       }
        gpio_set_value(ENTERPRISE_WLAN_PWR, on);
        mdelay(100);
        gpio_set_value(ENTERPRISE_WLAN_RST, on);
        mdelay(200);
+       if (sd_dpd) {
+               mutex_lock(&sd_dpd->delay_lock);
+               tegra_io_dpd_enable(sd_dpd);
+               mutex_unlock(&sd_dpd->delay_lock);
+       }
 
        return 0;
 }
index 0fa39cc..70ba7bc 100644 (file)
@@ -28,6 +28,7 @@
 #include <mach/irqs.h>
 #include <mach/iomap.h>
 #include <mach/sdhci.h>
+#include <mach/io_dpd.h>
 
 #include "gpio-names.h"
 #include "board.h"
@@ -202,8 +203,21 @@ static int kai_wifi_set_carddetect(int val)
 
 static int kai_wifi_power(int power_on)
 {
+       struct tegra_io_dpd *sd_dpd;
        pr_err("Powering %s wifi\n", (power_on ? "on" : "off"));
 
+       /*
+        * FIXME : we need to revisit IO DPD code
+        * on how should multiple pins under DPD get controlled
+        *
+        * kai GPIO WLAN enable is part of SDMMC3 pin group
+        */
+       sd_dpd = tegra_io_dpd_get(&tegra_sdhci_device2.dev);
+       if (sd_dpd) {
+               mutex_lock(&sd_dpd->delay_lock);
+               tegra_io_dpd_disable(sd_dpd);
+               mutex_unlock(&sd_dpd->delay_lock);
+       }
        if (power_on) {
                gpio_set_value(KAI_WLAN_EN, 1);
                mdelay(15);
@@ -214,6 +228,11 @@ static int kai_wifi_power(int power_on)
        } else {
                gpio_set_value(KAI_WLAN_EN, 0);
        }
+       if (sd_dpd) {
+               mutex_lock(&sd_dpd->delay_lock);
+               tegra_io_dpd_enable(sd_dpd);
+               mutex_unlock(&sd_dpd->delay_lock);
+       }
 
        return 0;
 }