History

Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/evalenti/linux-soc-thermal

Pull thermal fixes from Eduardo Valentin: "In this -rc still very minor changes: - Lee Jones fixes compilation warning in sti thermal driver - Marjus Elfring removes unnecessary checks in exynos thermal driver (as per coccinelle) - Now we always update cpufreq policies, and thus get (hopefully) always in sync with cpufreq, thanks to Yadwinder" * 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/evalenti/linux-soc-thermal: thermal: Exynos: Deletion of unnecessary checks before two function calls thermal: sti: Ignore suspend/resume functions when !PM_SLEEP thermal: cpu_cooling: Update always cpufreq policy with thermal constraints

Linus Torvalds committed 11 years ago

Commit cba3b002 parents 16cf45c d3e19563 files · +27 −22Browse files

Unified · Split

3 files
  1. drivers/thermal/cpu_cooling.c +21 −16
  2. drivers/thermal/samsung/exynos_thermal_common.c +3 −6
  3. drivers/thermal/st/st_thermal.c +3 −0
drivers/thermal/cpu_cooling.c+21−16
@@ -50,15 +50,14 @@ struct cpufreq_cooling_device { · 49 unmodified lines
5050 unsigned int cpufreq_state;
5151 unsigned int cpufreq_val;
5252 struct cpumask allowed_cpus;
53+ struct list_head node;
5354 };
5455 static DEFINE_IDR(cpufreq_idr);
5556 static DEFINE_MUTEX(cooling_cpufreq_lock);
5657
5758 static unsigned int cpufreq_dev_count;
5859
59−/* notify_table passes value to the CPUFREQ_ADJUST callback function. */
60−#define NOTIFY_INVALID NULL
61−static struct cpufreq_cooling_device *notify_device;
60+static LIST_HEAD(cpufreq_dev_list);
6261
6362 /**
6463 * get_idr - function to get a unique id.
@@ -287,15 +286,12 @@ static int cpufreq_apply_cooling(struct cpufreq_cooling_device *cpufreq_device, · 222 unmodified lines
287286
288287 cpufreq_device->cpufreq_state = cooling_state;
289288 cpufreq_device->cpufreq_val = clip_freq;
290− notify_device = cpufreq_device;
291289
292290 for_each_cpu(cpuid, mask) {
293291 if (is_cpufreq_valid(cpuid))
294292 cpufreq_update_policy(cpuid);
295293 }
296294
297− notify_device = NOTIFY_INVALID;
298−
299295 return 0;
300296 }
301297
@@ -316,21 +312,28 @@ static int cpufreq_thermal_notifier(struct notifier_block *nb, · 14 unmodified lines
316312 {
317313 struct cpufreq_policy *policy = data;
318314 unsigned long max_freq = 0;
315+ struct cpufreq_cooling_device *cpufreq_dev;
319316
320− if (event != CPUFREQ_ADJUST || notify_device == NOTIFY_INVALID)
317+ if (event != CPUFREQ_ADJUST)
321318 return 0;
322319
323− if (cpumask_test_cpu(policy->cpu, &notify_device->allowed_cpus))
324− max_freq = notify_device->cpufreq_val;
325− else
326− return 0;
320+ mutex_lock(&cooling_cpufreq_lock);
321+ list_for_each_entry(cpufreq_dev, &cpufreq_dev_list, node) {
322+ if (!cpumask_test_cpu(policy->cpu,
323+ &cpufreq_dev->allowed_cpus))
324+ continue;
325+
326+ if (!cpufreq_dev->cpufreq_val)
327+ cpufreq_dev->cpufreq_val = get_cpu_frequency(
328+ cpumask_any(&cpufreq_dev->allowed_cpus),
329+ cpufreq_dev->cpufreq_state);
327330
328− /* Never exceed user_policy.max */
329− if (max_freq > policy->user_policy.max)
330− max_freq = policy->user_policy.max;
331+ max_freq = cpufreq_dev->cpufreq_val;
331332
332− if (policy->max != max_freq)
333− cpufreq_verify_within_limits(policy, 0, max_freq);
333+ if (policy->max != max_freq)
334+ cpufreq_verify_within_limits(policy, 0, max_freq);
335+ }
336+ mutex_unlock(&cooling_cpufreq_lock);
334337
335338 return 0;
336339 }
@@ -486,6 +489,7 @@ __cpufreq_cooling_register(struct device_node *np, · 149 unmodified lines
486489 cpufreq_register_notifier(&thermal_cpufreq_notifier_block,
487490 CPUFREQ_POLICY_NOTIFIER);
488491 cpufreq_dev_count++;
492+ list_add(&cpufreq_dev->node, &cpufreq_dev_list);
489493
490494 mutex_unlock(&cooling_cpufreq_lock);
491495
@@ -549,6 +553,7 @@ void cpufreq_cooling_unregister(struct thermal_cooling_device *cdev) · 57 unmodified lines
549553
550554 cpufreq_dev = cdev->devdata;
551555 mutex_lock(&cooling_cpufreq_lock);
556+ list_del(&cpufreq_dev->node);
552557 cpufreq_dev_count--;
553558
554559 /* Unregister the notifier for the last cpufreq cooling device */
drivers/thermal/samsung/exynos_thermal_common.c+3−6
@@ -417,13 +417,10 @@ void exynos_unregister_thermal(struct thermal_sensor_conf *sensor_conf) · 416 unmodified lines
417417
418418 th_zone = sensor_conf->pzone_data;
419419
420− if (th_zone->therm_dev)
421− thermal_zone_device_unregister(th_zone->therm_dev);
420+ thermal_zone_device_unregister(th_zone->therm_dev);
422421
423− for (i = 0; i < th_zone->cool_dev_size; i++) {
424− if (th_zone->cool_dev[i])
425− cpufreq_cooling_unregister(th_zone->cool_dev[i]);
426− }
422+ for (i = 0; i < th_zone->cool_dev_size; ++i)
423+ cpufreq_cooling_unregister(th_zone->cool_dev[i]);
427424
428425 dev_info(sensor_conf->dev,
429426 "Exynos: Kernel Thermal management unregistered\n");
drivers/thermal/st/st_thermal.c+3−0
@@ -275,6 +275,7 @@ int st_thermal_unregister(struct platform_device *pdev) · 274 unmodified lines
275275 }
276276 EXPORT_SYMBOL_GPL(st_thermal_unregister);
277277
278+#ifdef CONFIG_PM_SLEEP
278279 static int st_thermal_suspend(struct device *dev)
279280 {
280281 struct platform_device *pdev = to_platform_device(dev);
@@ -305,6 +306,8 @@ static int st_thermal_resume(struct device *dev) · 24 unmodified lines
305306
306307 return 0;
307308 }
309+#endif
310+
308311 SIMPLE_DEV_PM_OPS(st_thermal_pm_ops, st_thermal_suspend, st_thermal_resume);
309312 EXPORT_SYMBOL_GPL(st_thermal_pm_ops);
310313