ARM: tegra: pinmux: correct pinmux resume sequence
Mohan T [Thu, 2 Jan 2014 19:09:18 +0000 (00:09 +0530)]
Do not operate on DPD pads and do not TRISTATE
pins before restoring for T124

Bug 1416263
Bug 1429819

Change-Id: I7261c7e5d4341f6d74dadf1ab6af985e7965b860
Signed-off-by: Mohan T <mohant@nvidia.com>
Reviewed-on: http://git-master/r/351369
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Bitan Biswas <bbiswas@nvidia.com>
Tested-by: Bitan Biswas <bbiswas@nvidia.com>

arch/arm/mach-tegra/pm.c
drivers/pinctrl/pinctrl-tegra124.c
include/linux/tegra-pmc.h

index d8cf8c2..e6c0cbb 100644 (file)
@@ -3,7 +3,7 @@
  *
  * CPU complex suspend & resume functions for Tegra SoCs
  *
- * Copyright (c) 2009-2013, NVIDIA CORPORATION.  All rights reserved.
+ * Copyright (c) 2009-2014, NVIDIA CORPORATION.  All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -149,6 +149,8 @@ extern int tegra_smmu_resume(struct device *dev);
 extern int tegra_smmu_suspend(struct device *dev);
 #endif
 
+bool tegra_is_dpd_mode;
+
 #define TEGRA_POWER_PWRREQ_POLARITY    (1 << 8)   /* core power request polarity */
 #define TEGRA_POWER_PWRREQ_OE          (1 << 9)   /* core power request enable */
 #define TEGRA_POWER_SYSCLK_POLARITY    (1 << 10)  /* sys clk polarity */
@@ -1065,6 +1067,7 @@ static void tegra_pm_set(enum tegra_suspend_mode mode)
 #if !defined(CONFIG_ARCH_TEGRA_3x_SOC) && !defined(CONFIG_ARCH_TEGRA_2x_SOC)
 #if defined(CONFIG_ARCH_TEGRA_11x_SOC) || defined(CONFIG_ARCH_TEGRA_12x_SOC)
                writel(0x800fdfff, pmc + PMC_IO_DPD_REQ);
+               tegra_is_dpd_mode = true;
 #else
                writel(0x800fffff, pmc + PMC_IO_DPD_REQ);
 #endif
index 2da5478..24ed49f 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Pinctrl data for the NVIDIA Tegra124 pinmux
  *
- * Copyright (c) 2013, NVIDIA CORPORATION.  All rights reserved.
+ * Copyright (c) 2013-2014, NVIDIA CORPORATION.  All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms and conditions of the GNU General Public License,
@@ -3329,20 +3329,23 @@ static void tegra124_pinctrl_resume(u32 *pg_data)
 {
        int i;
        u32 *ctx = pg_data;
-       u32 *tmp = pg_data;
-       u32 reg_value;
-
-       for (i = 0; i < ARRAY_SIZE(tegra124_groups); i++) {
-               if (tegra124_groups[i].drv_reg < 0) {
-                       reg_value = *tmp++;
-                       reg_value |= BIT(4);
-                       tegra_pinctrl_writel(reg_value,
-                                       tegra124_groups[i].mux_bank,
-                                       tegra124_groups[i].mux_reg);
+
+       if (tegra_is_dpd_mode) {
+               u32 *tmp = pg_data;
+               u32 reg_value;
+               for (i = 0; i < ARRAY_SIZE(tegra124_groups); i++) {
+                       if (tegra124_groups[i].drv_reg < 0) {
+                               reg_value = *tmp++;
+                               reg_value |= BIT(4);
+                               tegra_pinctrl_writel(reg_value,
+                                               tegra124_groups[i].mux_bank,
+                                               tegra124_groups[i].mux_reg);
+                       }
                }
-       }
 
-       tegra_pmc_remove_dpd_req();
+               tegra_pmc_remove_dpd_req();
+               tegra_is_dpd_mode = false;
+       }
        for (i = 0; i <  ARRAY_SIZE(tegra124_groups); i++) {
                if (tegra124_groups[i].drv_reg < 0)
                        tegra_pinctrl_writel(*ctx++, tegra124_groups[i].mux_bank,
index c0b0248..b633efb 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * PMC interface for NVIDIA SoCs Tegra
  *
- * Copyright (c) 2013, NVIDIA CORPORATION.  All rights reserved.
+ * Copyright (c) 2013-2014, NVIDIA CORPORATION.  All rights reserved.
  *
  * Author: Laxman Dewangan <ldewangan@nvidia.com>
  *
@@ -25,4 +25,7 @@ extern void tegra_pmc_set_dpd_sample(void);
 extern void tegra_pmc_clear_dpd_sample(void);
 extern void tegra_pmc_remove_dpd_req(void);
 
+extern bool tegra_is_dpd_mode;
+
+
 #endif /* __LINUX_TEGRA_PMC_H__ */