ARM: tegra: powergate update
Bitan Biswas [Tue, 16 Oct 2012 14:04:48 +0000 (19:04 +0530)]
Tegra11x partition powergate and unpowergate is separated
from older chip implementation

Change-Id: I6669eac81f8c2964139637b5147c07005b594717
Signed-off-by: Bitan Biswas <bbiswas@nvidia.com>
Reviewed-on: http://git-master/r/159760
Reviewed-by: Simone Willett <swillett@nvidia.com>
Tested-by: Simone Willett <swillett@nvidia.com>

Rebase-Id: Rbc92c499be119854995d957e58219aae116c5a47

arch/arm/mach-tegra/powergate.c

index c357902..9add24b 100644 (file)
@@ -53,6 +53,7 @@ static void test_unpowergate_clk_on_parts(void);
 
 #if !defined(CONFIG_ARCH_TEGRA_2x_SOC) && !defined(CONFIG_ARCH_TEGRA_3x_SOC)
 static int tegra11x_check_partition_pug_seq(int id);
+static int tegra11x_unpowergate(int id);
 #endif
 
 #define PWRGATE_TOGGLE         0x30
@@ -737,12 +738,14 @@ b.        CLK_RST_CONTROLLER_PLLD2_BASE_0_PLLD2_ENABLE
 }
 #endif
 
+#if defined(CONFIG_ARCH_TEGRA_2x_SOC) || defined(CONFIG_ARCH_TEGRA_3x_SOC)
 static int unpowergate_module(int id)
 {
        if (id < 0 || id >= tegra_num_powerdomains)
                return -EINVAL;
        return tegra_powergate_set(id, true);
 }
+#endif
 
 static int powergate_module(int id)
 {
@@ -1078,9 +1081,6 @@ static void tegra11x_mipical_calibrate(int id)
        /* mipi cal status read - to flush writes */
        status = mipi_cal_read(MIPI_CAL_CIL_MIPI_CAL_STATUS_0);
        spin_unlock_irqrestore(&tegra_powergate_lock, flags);
-       if (status)
-               pr_err("Error: mipi_cal calibration failed at file: %s, func: %s, line=%d\n",
-               __FILE__, __func__, __LINE__);
 }
 #endif
 
@@ -1156,7 +1156,12 @@ int tegra_unpowergate_partition(int id)
        ret = tegra11x_check_partition_pug_seq(id);
        if (ret)
                return ret;
-#endif
+
+       ret = tegra11x_unpowergate(id);
+       return ret;
+#else
+       /* FIXME: not changing previous chip's power-ungate implementation */
+
        /* If first clk_ptr is null, fill clk info for the partition */
        if (!powergate_partition_info[id].clk_info[0].clk_ptr)
                get_clk_info(id);
@@ -1183,9 +1188,6 @@ int tegra_unpowergate_partition(int id)
 
        udelay(10);
 
-#if !defined(CONFIG_ARCH_TEGRA_2x_SOC) && !defined(CONFIG_ARCH_TEGRA_3x_SOC)
-       tegra11x_mipical_calibrate(id);
-#endif
        powergate_partition_deassert_reset(id);
 
        mc_flush_done(id);
@@ -1202,6 +1204,7 @@ err_clk_on:
 err_power:
        WARN(1, "Could not Un-Powergate %d", id);
        return ret;
+#endif
 }
 
 int tegra_cpu_powergate_id(int cpuid)
@@ -1291,7 +1294,7 @@ err_unpowergating:
 }
 
 #if !defined(CONFIG_ARCH_TEGRA_2x_SOC) && !defined(CONFIG_ARCH_TEGRA_3x_SOC)
-static int tegra11x_3d_powergate_set(int id, bool new_state)
+static int tegra11x_powergate_set(int id, bool new_state)
 {
 #ifndef CONFIG_TEGRA_SIMULATION_PLATFORM
        bool status;
@@ -1337,7 +1340,7 @@ static int tegra11x_3d_powergate_set(int id, bool new_state)
        return 0;
 }
 
-static int tegra11x_powergate_3d(int id)
+static int tegra11x_powergate(int id)
 {
        int ret;
 
@@ -1364,7 +1367,7 @@ static int tegra11x_powergate_3d(int id)
 
        udelay(10);
 
-       ret = tegra11x_3d_powergate_set(id, false);
+       ret = tegra11x_powergate_set(id, false);
        if (ret)
                goto err_power_off;
 
@@ -1375,7 +1378,7 @@ err_power_off:
        return ret;
 }
 
-static int tegra11x_unpowergate_3d(int id)
+static int tegra11x_unpowergate(int id)
 {
        int ret;
        /* If first clk_ptr is null, fill clk info for the partition */
@@ -1385,7 +1388,7 @@ static int tegra11x_unpowergate_3d(int id)
        if (tegra_powergate_is_powered(id))
                return tegra_powergate_reset_module(id);
 
-       ret = tegra11x_3d_powergate_set(id, true);
+       ret = tegra11x_powergate_set(id, true);
        if (ret)
                goto err_power;
 
@@ -1404,6 +1407,9 @@ static int tegra11x_unpowergate_3d(int id)
 
        udelay(10);
 
+#if !defined(CONFIG_ARCH_TEGRA_2x_SOC) && !defined(CONFIG_ARCH_TEGRA_3x_SOC)
+       tegra11x_mipical_calibrate(id);
+#endif
        powergate_partition_deassert_reset(id);
 
        udelay(10);
@@ -1466,6 +1472,10 @@ static int tegra11x_unpowergate_partition(int id)
        return 0;
 }
 
+/*
+ * Tegra11x has powergate dependencies between partitions.
+ * This function captures the dependencies.
+ */
 static int tegra11x_check_partition_pg_seq(int id)
 {
        int ret;
@@ -1478,18 +1488,14 @@ static int tegra11x_check_partition_pg_seq(int id)
                ret = tegra11x_powergate_partition(TEGRA_POWERGATE_DISB);
                if (ret < 0)
                        return ret;
-
                break;
-       case TEGRA_POWERGATE_3D:
-       case TEGRA_POWERGATE_HEG:
-       case TEGRA_POWERGATE_MPE:
-               ret = tegra11x_powergate_3d(id);
-               if (ret < 0)
-                       return ret;
        }
        return 0;
 }
 
+/*
+ * This function captures power-ungate dependencies between tegra11x partitions
+ */
 static int tegra11x_check_partition_pug_seq(int id)
 {
        int ret;
@@ -1502,12 +1508,6 @@ static int tegra11x_check_partition_pug_seq(int id)
                        return ret;
 
                break;
-       case TEGRA_POWERGATE_3D:
-       case TEGRA_POWERGATE_HEG:
-       case TEGRA_POWERGATE_MPE:
-               ret = tegra11x_unpowergate_3d(id);
-               if (ret < 0)
-                       return ret;
        }
        return 0;
 }
@@ -1529,7 +1529,13 @@ int tegra_powergate_partition(int id)
        ret = tegra11x_check_partition_pg_seq(id);
        if (ret)
                return ret;
-#endif
+
+       /* All Tegra11x partition powergate */
+       ret = tegra11x_powergate(id);
+       return ret;
+#else
+       /* FIXME: not changing previous chip's powergate implementation */
+
        /* If first clk_ptr is null, fill clk info for the partition */
        if (powergate_partition_info[id].clk_info[0].clk_ptr)
                get_clk_info(id);
@@ -1552,6 +1558,7 @@ err_power_off:
 err_clk_off:
        WARN(1, "Could not Powergate Partition %d, all clks not disabled", id);
        return ret;
+#endif
 }
 
 int tegra_powergate_partition_with_clk_off(int id)