ARM: tegra: dvfs: Recompute EDP tables after dfll mode changes
Diwakar Tundlam [Tue, 6 Nov 2012 21:19:25 +0000 (13:19 -0800)]
Also recompute on clock-late-init for EDP table with correct dfll mode

Bug 1167145

Change-Id: Icff6c1c4b8fb7d861951abb0b4b6edbfeec32dba
Signed-off-by: Diwakar Tundlam <dtundlam@nvidia.com>
Reviewed-on: http://git-master/r/161773
Reviewed-by: Simone Willett <swillett@nvidia.com>
Tested-by: Simone Willett <swillett@nvidia.com>

arch/arm/mach-tegra/clock.c
arch/arm/mach-tegra/edp.c
arch/arm/mach-tegra/include/mach/edp.h
arch/arm/mach-tegra/tegra11_clocks.c

index a212b03..43fc15c 100644 (file)
@@ -37,6 +37,7 @@
 #include <trace/events/power.h>
 
 #include <mach/hardware.h>
+#include <mach/edp.h>
 
 #include "board.h"
 #include "clock.h"
@@ -875,6 +876,7 @@ static int __init tegra_clk_late_init(void)
        if (!tegra_dvfs_late_init())
                tegra_dfll_cpu_start(); /* after successful dvfs init only */
        tegra_sync_cpu_clock();         /* after attempt to get dfll ready */
+       tegra_recalculate_cpu_edp_limits();
        return 0;
 }
 late_initcall(tegra_clk_late_init);
index 95d9521..8478e82 100644 (file)
@@ -482,7 +482,7 @@ int edp_find_speedo_idx(int cpu_speedo_id, unsigned int *cpu_speedo_idx)
        return -EINVAL;
 }
 
-int init_cpu_edp_limits_calculated(int cpu_speedo_id)
+static int init_cpu_edp_limits_calculated(void)
 {
        unsigned int temp_idx, n_cores_idx;
        unsigned int cpu_g_minf, cpu_g_maxf;
@@ -492,6 +492,7 @@ int init_cpu_edp_limits_calculated(int cpu_speedo_id)
        struct tegra_edp_cpu_leakage_params *params;
        int ret;
        struct clk *clk_cpu_g = tegra_get_clock_by_name("cpu_g");
+       int cpu_speedo_id = tegra_cpu_speedo_id();
 
        /* Determine all inputs to EDP formula */
        iddq_mA = tegra_get_cpu_iddq_value();
@@ -553,12 +554,13 @@ int init_cpu_edp_limits_calculated(int cpu_speedo_id)
        return 0;
 }
 
-int __init init_cpu_edp_limits_lookup(int cpu_speedo_id)
+static int __init init_cpu_edp_limits_lookup(void)
 {
        int i, j;
        struct tegra_edp_limits *e;
        struct tegra_edp_vdd_cpu_entry *t;
        int tsize;
+       int cpu_speedo_id = tegra_cpu_speedo_id();
 
        t = (struct tegra_edp_vdd_cpu_entry *)tegra_edp_vdd_cpu_map;
        tsize = sizeof(tegra_edp_vdd_cpu_map)
@@ -601,14 +603,18 @@ int __init init_cpu_edp_limits_lookup(int cpu_speedo_id)
        return 0;
 }
 
+void tegra_recalculate_cpu_edp_limits(void)
+{
+       if (tegra_chip_id == TEGRA11X)
+               init_cpu_edp_limits_calculated();
+}
+
 /*
  * Specify regulator current in mA, e.g. 5000mA
  * Use 0 for default
  */
 void __init tegra_init_cpu_edp_limits(unsigned int regulator_mA)
 {
-       int cpu_speedo_id = tegra_cpu_speedo_id();
-
        if (!regulator_mA) {
                edp_limits = edp_default_limits;
                edp_limits_size = ARRAY_SIZE(edp_default_limits);
@@ -618,11 +624,11 @@ void __init tegra_init_cpu_edp_limits(unsigned int regulator_mA)
 
        switch (tegra_chip_id) {
        case TEGRA30:
-               if (init_cpu_edp_limits_lookup(cpu_speedo_id) == 0)
+               if (init_cpu_edp_limits_lookup() == 0)
                        return;
                break;
        case TEGRA11X:
-               if (init_cpu_edp_limits_calculated(cpu_speedo_id) == 0)
+               if (init_cpu_edp_limits_calculated() == 0)
                        return;
                break;
        case TEGRA20:
@@ -782,7 +788,6 @@ static int edp_reg_override_write(struct file *file,
        char buf[32], *end;
        unsigned int edp_reg_override_mA_temp;
        unsigned int edp_reg_override_mA_prev = edp_reg_override_mA;
-       int cpu_speedo_id;
 
        if (sizeof(buf) <= count)
                goto override_err;
@@ -806,8 +811,7 @@ static int edp_reg_override_write(struct file *file,
                return count;
 
        edp_reg_override_mA = edp_reg_override_mA_temp;
-       cpu_speedo_id = tegra_cpu_speedo_id();
-       if (init_cpu_edp_limits_calculated(cpu_speedo_id)) {
+       if (init_cpu_edp_limits_calculated()) {
                /* Revert to previous override value if new value fails */
                edp_reg_override_mA = edp_reg_override_mA_prev;
                goto override_err;
index 9984b17..a2860f6 100644 (file)
@@ -58,6 +58,7 @@ struct tegra_edp_freq_voltage_table {
 #ifdef CONFIG_TEGRA_EDP_LIMITS
 struct thermal_cooling_device *edp_cooling_device_create(void *v);
 void tegra_init_cpu_edp_limits(unsigned int regulator_mA);
+void tegra_recalculate_cpu_edp_limits(void);
 void tegra_init_system_edp_limits(unsigned int power_limit_mW);
 void tegra_get_cpu_edp_limits(const struct tegra_edp_limits **limits, int *size);
 unsigned int tegra_get_edp_limit(int *get_edp_thermal_index);
@@ -70,6 +71,8 @@ static inline struct thermal_cooling_device *edp_cooling_device_create(
 { return NULL; }
 static inline void tegra_init_cpu_edp_limits(int regulator_mA)
 {}
+static inline void tegra_recalculate_cpu_edp_limits(void)
+{}
 static inline void tegra_init_system_edp_limits(int power_limit_mW)
 {}
 static inline void tegra_get_cpu_edp_limits(struct tegra_edp_limits **limits,
index 0f0360b..4a13b4b 100644 (file)
@@ -3407,6 +3407,7 @@ static int tegra11_use_dfll_cb(const char *arg, const struct kernel_param *kp)
        }
        clk_unlock_restore(c->parent, &p_flags);
        clk_unlock_restore(c, &c_flags);
+       tegra_recalculate_cpu_edp_limits();
        return ret;
 }