ARM: tegra: add clamping status read.
Kevin Huang [Mon, 15 Apr 2013 22:59:15 +0000 (15:59 -0700)]
Signed-off-by: Kevin Huang <kevinh@nvidia.com>
Change-Id: I2bf7b0d4cd88583295183347ed6a4bc1c0e450f1
Reviewed-on: http://git-master/r/219959
Reviewed-by: Aleksandr Frid <afrid@nvidia.com>
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Jon Mayo <jmayo@nvidia.com>
(cherry picked from commit 56469c85646b8fb859f2f30325d53de989d554f4)
Reviewed-on: http://git-master/r/221740
Reviewed-by: Mrutyunjay Sawant <msawant@nvidia.com>
Tested-by: Mrutyunjay Sawant <msawant@nvidia.com>

arch/arm/mach-tegra/include/mach/powergate.h
arch/arm/mach-tegra/powergate-priv.h
arch/arm/mach-tegra/powergate-t11x.c
arch/arm/mach-tegra/powergate.c

index a1e821a..ab1a193 100644 (file)
@@ -118,4 +118,5 @@ int tegra_unpowergate_partition_with_clk_on(int id);
 int tegra_powergate_partition(int id);
 int tegra_unpowergate_partition(int id);
 
+bool tegra_powergate_check_clamping(int id);
 #endif /* _MACH_TEGRA_POWERGATE_H_ */
index 67aeb59..e178be0 100644 (file)
@@ -32,6 +32,7 @@
 #define MAX_CLK_EN_NUM                 9
 #define MAX_HOTRESET_CLIENT_NUM                4
 
+#define PWRGATE_CLAMP_STATUS   0x2c
 #define PWRGATE_TOGGLE         0x30
 #define PWRGATE_TOGGLE_START   (1 << 8)
 #define REMOVE_CLAMPING                0x34
@@ -102,6 +103,7 @@ struct powergate_ops {
        int (*powergate_mc_flush_done)(int id);
 
        int (*powergate_init_refcount)(void);
+       bool (*powergate_check_clamping)(int id);
 };
 
 void get_clk_info(struct powergate_partition_info *pg_info);
index 8dda1fb..242f1c1 100644 (file)
@@ -214,6 +214,23 @@ int tegra11x_powergate_mc_flush_done(int id);
 int tegra11x_unpowergate_partition_with_clk_on(int id);
 int tegra11x_powergate_partition_with_clk_off(int id);
 
+bool tegra11x_powergate_check_clamping(int id)
+{
+       u32 mask;
+       /*
+        * PCIE and VDE clamping masks are swapped with respect to their
+        * partition ids
+        */
+       if (id ==  TEGRA_POWERGATE_VDEC)
+               mask = (1 << TEGRA_POWERGATE_PCIE);
+       else if (id == TEGRA_POWERGATE_PCIE)
+               mask = (1 << TEGRA_POWERGATE_VDEC);
+       else
+               mask = (1 << id);
+
+       return !!(pmc_read(PWRGATE_CLAMP_STATUS) & mask);
+}
+
 #define HOTRESET_READ_COUNT    5
 static bool tegra11x_stable_hotreset_check(u32 *stat)
 {
@@ -646,6 +663,7 @@ static struct powergate_ops tegra11x_powergate_ops = {
        .powergate_mc_flush_done = tegra11x_powergate_mc_flush_done,
 
        .powergate_init_refcount = tegra11x_powergate_init_refcount,
+       .powergate_check_clamping = tegra11x_powergate_check_clamping,
 };
 
 struct powergate_ops *tegra11x_powergate_init_chip_support(void)
index 735b862..55af24d 100644 (file)
@@ -283,6 +283,19 @@ int tegra_powergate_reset_module(struct powergate_partition_info *pg_info)
        return 0;
 }
 
+bool tegra_powergate_check_clamping(int id)
+{
+       if (!pg_ops || !pg_ops->powergate_check_clamping) {
+               pr_info("This SOC can't check clamping status\n");
+               return -EINVAL;
+       }
+
+       if (id < 0 || id >= pg_ops->num_powerdomains)
+               return -EINVAL;
+
+       return pg_ops->powergate_check_clamping(id);
+}
+
 int tegra_powergate_remove_clamping(int id)
 {
        u32 mask;