+ if (temp > dvfs_node->target_temp) {
+ if (temp > dvfs_node->old_temp) {
+ delta_temp = temp - dvfs_node->target_temp;
+ for (i = 0;
+ dvfs_node->nor_temp_limit_table[i].frequency !=
+ CPUFREQ_TABLE_END; i++) {
+ if (delta_temp >
+ dvfs_node->nor_temp_limit_table[i].index)
+ arm_rate_step =
+ dvfs_node->nor_temp_limit_table[i].frequency;
+ }
+ if (arm_rate_step &&
+ (dvfs_node->temp_limit_rate > arm_rate_step)) {
+ dvfs_node->temp_limit_rate -= arm_rate_step;
+ if (dvfs_node->temp_limit_rate <
+ dvfs_node->min_temp_limit)
+ dvfs_node->temp_limit_rate =
+ dvfs_node->min_temp_limit;
+ dvfs_clk_set_rate(dvfs_node,
+ dvfs_node->last_set_rate);
+ }
+ }
+ } else {
+ if (dvfs_node->temp_limit_rate < dvfs_node->max_rate) {
+ delta_temp = dvfs_node->target_temp - temp;
+ for (i = 0;
+ dvfs_node->nor_temp_limit_table[i].frequency !=
+ CPUFREQ_TABLE_END; i++) {
+ if (delta_temp >
+ dvfs_node->nor_temp_limit_table[i].index)
+ arm_rate_step =
+ dvfs_node->nor_temp_limit_table[i].frequency;
+ }
+
+ if (arm_rate_step) {
+ dvfs_node->temp_limit_rate += arm_rate_step;
+ if (dvfs_node->temp_limit_rate >
+ dvfs_node->max_rate)
+ dvfs_node->temp_limit_rate =
+ dvfs_node->max_rate;
+ dvfs_clk_set_rate(dvfs_node,
+ dvfs_node->last_set_rate);
+ }
+ }
+ }
+}
+
+static void dvfs_temp_limit(struct dvfs_node *dvfs_node, int temp)
+{
+ int delta_temp = 0;