1
2
3
4
5
6
7
8
9
10#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
11
12#include <linux/module.h>
13#include <linux/device.h>
14#include <linux/err.h>
15#include <linux/slab.h>
16#include <linux/kdev_t.h>
17#include <linux/idr.h>
18#include <linux/thermal.h>
19#include <linux/reboot.h>
20#include <linux/string.h>
21#include <linux/of.h>
22#include <net/netlink.h>
23#include <net/genetlink.h>
24#include <linux/suspend.h>
25
26#define CREATE_TRACE_POINTS
27#include <trace/events/thermal.h>
28
29#include "thermal_core.h"
30#include "thermal_hwmon.h"
31
32MODULE_AUTHOR("Zhang Rui");
33MODULE_DESCRIPTION("Generic thermal management sysfs support");
34MODULE_LICENSE("GPL v2");
35
36static DEFINE_IDA(thermal_tz_ida);
37static DEFINE_IDA(thermal_cdev_ida);
38
39static LIST_HEAD(thermal_tz_list);
40static LIST_HEAD(thermal_cdev_list);
41static LIST_HEAD(thermal_governor_list);
42
43static DEFINE_MUTEX(thermal_list_lock);
44static DEFINE_MUTEX(thermal_governor_lock);
45static DEFINE_MUTEX(poweroff_lock);
46
47static atomic_t in_suspend;
48static bool power_off_triggered;
49
50static struct thermal_governor *def_governor;
51
52
53
54
55
56
57
58
59static struct thermal_governor *__find_governor(const char *name)
60{
61 struct thermal_governor *pos;
62
63 if (!name || !name[0])
64 return def_governor;
65
66 list_for_each_entry(pos, &thermal_governor_list, governor_list)
67 if (!strncasecmp(name, pos->name, THERMAL_NAME_LENGTH))
68 return pos;
69
70 return NULL;
71}
72
73
74
75
76
77
78
79
80
81static void bind_previous_governor(struct thermal_zone_device *tz,
82 const char *failed_gov_name)
83{
84 if (tz->governor && tz->governor->bind_to_tz) {
85 if (tz->governor->bind_to_tz(tz)) {
86 dev_err(&tz->device,
87 "governor %s failed to bind and the previous one (%s) failed to bind again, thermal zone %s has no governor\n",
88 failed_gov_name, tz->governor->name, tz->type);
89 tz->governor = NULL;
90 }
91 }
92}
93
94
95
96
97
98
99
100
101
102
103static int thermal_set_governor(struct thermal_zone_device *tz,
104 struct thermal_governor *new_gov)
105{
106 int ret = 0;
107
108 if (tz->governor && tz->governor->unbind_from_tz)
109 tz->governor->unbind_from_tz(tz);
110
111 if (new_gov && new_gov->bind_to_tz) {
112 ret = new_gov->bind_to_tz(tz);
113 if (ret) {
114 bind_previous_governor(tz, new_gov->name);
115
116 return ret;
117 }
118 }
119
120 tz->governor = new_gov;
121
122 return ret;
123}
124
125int thermal_register_governor(struct thermal_governor *governor)
126{
127 int err;
128 const char *name;
129 struct thermal_zone_device *pos;
130
131 if (!governor)
132 return -EINVAL;
133
134 mutex_lock(&thermal_governor_lock);
135
136 err = -EBUSY;
137 if (!__find_governor(governor->name)) {
138 bool match_default;
139
140 err = 0;
141 list_add(&governor->governor_list, &thermal_governor_list);
142 match_default = !strncmp(governor->name,
143 DEFAULT_THERMAL_GOVERNOR,
144 THERMAL_NAME_LENGTH);
145
146 if (!def_governor && match_default)
147 def_governor = governor;
148 }
149
150 mutex_lock(&thermal_list_lock);
151
152 list_for_each_entry(pos, &thermal_tz_list, node) {
153
154
155
156
157 if (pos->governor)
158 continue;
159
160 name = pos->tzp->governor_name;
161
162 if (!strncasecmp(name, governor->name, THERMAL_NAME_LENGTH)) {
163 int ret;
164
165 ret = thermal_set_governor(pos, governor);
166 if (ret)
167 dev_err(&pos->device,
168 "Failed to set governor %s for thermal zone %s: %d\n",
169 governor->name, pos->type, ret);
170 }
171 }
172
173 mutex_unlock(&thermal_list_lock);
174 mutex_unlock(&thermal_governor_lock);
175
176 return err;
177}
178
179void thermal_unregister_governor(struct thermal_governor *governor)
180{
181 struct thermal_zone_device *pos;
182
183 if (!governor)
184 return;
185
186 mutex_lock(&thermal_governor_lock);
187
188 if (!__find_governor(governor->name))
189 goto exit;
190
191 mutex_lock(&thermal_list_lock);
192
193 list_for_each_entry(pos, &thermal_tz_list, node) {
194 if (!strncasecmp(pos->governor->name, governor->name,
195 THERMAL_NAME_LENGTH))
196 thermal_set_governor(pos, NULL);
197 }
198
199 mutex_unlock(&thermal_list_lock);
200 list_del(&governor->governor_list);
201exit:
202 mutex_unlock(&thermal_governor_lock);
203}
204
205int thermal_zone_device_set_policy(struct thermal_zone_device *tz,
206 char *policy)
207{
208 struct thermal_governor *gov;
209 int ret = -EINVAL;
210
211 mutex_lock(&thermal_governor_lock);
212 mutex_lock(&tz->lock);
213
214 gov = __find_governor(strim(policy));
215 if (!gov)
216 goto exit;
217
218 ret = thermal_set_governor(tz, gov);
219
220exit:
221 mutex_unlock(&tz->lock);
222 mutex_unlock(&thermal_governor_lock);
223
224 return ret;
225}
226
227int thermal_build_list_of_policies(char *buf)
228{
229 struct thermal_governor *pos;
230 ssize_t count = 0;
231 ssize_t size = PAGE_SIZE;
232
233 mutex_lock(&thermal_governor_lock);
234
235 list_for_each_entry(pos, &thermal_governor_list, governor_list) {
236 size = PAGE_SIZE - count;
237 count += scnprintf(buf + count, size, "%s ", pos->name);
238 }
239 count += scnprintf(buf + count, size, "\n");
240
241 mutex_unlock(&thermal_governor_lock);
242
243 return count;
244}
245
246static void __init thermal_unregister_governors(void)
247{
248 struct thermal_governor **governor;
249
250 for_each_governor_table(governor)
251 thermal_unregister_governor(*governor);
252}
253
254static int __init thermal_register_governors(void)
255{
256 int ret = 0;
257 struct thermal_governor **governor;
258
259 for_each_governor_table(governor) {
260 ret = thermal_register_governor(*governor);
261 if (ret) {
262 pr_err("Failed to register governor: '%s'",
263 (*governor)->name);
264 break;
265 }
266
267 pr_info("Registered thermal governor '%s'",
268 (*governor)->name);
269 }
270
271 if (ret) {
272 struct thermal_governor **gov;
273
274 for_each_governor_table(gov) {
275 if (gov == governor)
276 break;
277 thermal_unregister_governor(*gov);
278 }
279 }
280
281 return ret;
282}
283
284
285
286
287
288
289
290
291
292
293
294
295static void thermal_zone_device_set_polling(struct thermal_zone_device *tz,
296 int delay)
297{
298 if (delay > 1000)
299 mod_delayed_work(system_freezable_power_efficient_wq,
300 &tz->poll_queue,
301 round_jiffies(msecs_to_jiffies(delay)));
302 else if (delay)
303 mod_delayed_work(system_freezable_power_efficient_wq,
304 &tz->poll_queue,
305 msecs_to_jiffies(delay));
306 else
307 cancel_delayed_work_sync(&tz->poll_queue);
308}
309
310static void monitor_thermal_zone(struct thermal_zone_device *tz)
311{
312 mutex_lock(&tz->lock);
313
314 if (tz->passive)
315 thermal_zone_device_set_polling(tz, tz->passive_delay);
316 else if (tz->polling_delay)
317 thermal_zone_device_set_polling(tz, tz->polling_delay);
318 else
319 thermal_zone_device_set_polling(tz, 0);
320
321 mutex_unlock(&tz->lock);
322}
323
324static void handle_non_critical_trips(struct thermal_zone_device *tz, int trip)
325{
326 tz->governor ? tz->governor->throttle(tz, trip) :
327 def_governor->throttle(tz, trip);
328}
329
330
331
332
333
334
335
336
337static void thermal_emergency_poweroff_func(struct work_struct *work)
338{
339
340
341
342
343
344
345
346 WARN(1, "Attempting kernel_power_off: Temperature too high\n");
347 kernel_power_off();
348
349
350
351
352 WARN(1, "Attempting emergency_restart: Temperature too high\n");
353 emergency_restart();
354}
355
356static DECLARE_DELAYED_WORK(thermal_emergency_poweroff_work,
357 thermal_emergency_poweroff_func);
358
359
360
361
362
363
364
365static void thermal_emergency_poweroff(void)
366{
367 int poweroff_delay_ms = CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS;
368
369
370
371
372 if (poweroff_delay_ms <= 0)
373 return;
374 schedule_delayed_work(&thermal_emergency_poweroff_work,
375 msecs_to_jiffies(poweroff_delay_ms));
376}
377
378static void handle_critical_trips(struct thermal_zone_device *tz,
379 int trip, enum thermal_trip_type trip_type)
380{
381 int trip_temp;
382
383 tz->ops->get_trip_temp(tz, trip, &trip_temp);
384
385
386 if (trip_temp <= 0 || tz->temperature < trip_temp)
387 return;
388
389 trace_thermal_zone_trip(tz, trip, trip_type);
390
391 if (tz->ops->notify)
392 tz->ops->notify(tz, trip, trip_type);
393
394 if (trip_type == THERMAL_TRIP_CRITICAL) {
395 dev_emerg(&tz->device,
396 "critical temperature reached (%d C), shutting down\n",
397 tz->temperature / 1000);
398 mutex_lock(&poweroff_lock);
399 if (!power_off_triggered) {
400
401
402
403
404 thermal_emergency_poweroff();
405 orderly_poweroff(true);
406 power_off_triggered = true;
407 }
408 mutex_unlock(&poweroff_lock);
409 }
410}
411
412static void handle_thermal_trip(struct thermal_zone_device *tz, int trip)
413{
414 enum thermal_trip_type type;
415
416
417 if (test_bit(trip, &tz->trips_disabled))
418 return;
419
420 tz->ops->get_trip_type(tz, trip, &type);
421
422 if (type == THERMAL_TRIP_CRITICAL || type == THERMAL_TRIP_HOT)
423 handle_critical_trips(tz, trip, type);
424 else
425 handle_non_critical_trips(tz, trip);
426
427
428
429
430 monitor_thermal_zone(tz);
431}
432
433static void update_temperature(struct thermal_zone_device *tz)
434{
435 int temp, ret;
436
437 ret = thermal_zone_get_temp(tz, &temp);
438 if (ret) {
439 if (ret != -EAGAIN)
440 dev_warn(&tz->device,
441 "failed to read out thermal zone (%d)\n",
442 ret);
443 return;
444 }
445
446 mutex_lock(&tz->lock);
447 tz->last_temperature = tz->temperature;
448 tz->temperature = temp;
449 mutex_unlock(&tz->lock);
450
451 trace_thermal_temperature(tz);
452 if (tz->last_temperature == THERMAL_TEMP_INVALID)
453 dev_dbg(&tz->device, "last_temperature N/A, current_temperature=%d\n",
454 tz->temperature);
455 else
456 dev_dbg(&tz->device, "last_temperature=%d, current_temperature=%d\n",
457 tz->last_temperature, tz->temperature);
458}
459
460static void thermal_zone_device_init(struct thermal_zone_device *tz)
461{
462 struct thermal_instance *pos;
463 tz->temperature = THERMAL_TEMP_INVALID;
464 list_for_each_entry(pos, &tz->thermal_instances, tz_node)
465 pos->initialized = false;
466}
467
468static void thermal_zone_device_reset(struct thermal_zone_device *tz)
469{
470 tz->passive = 0;
471 thermal_zone_device_init(tz);
472}
473
474void thermal_zone_device_update(struct thermal_zone_device *tz,
475 enum thermal_notify_event event)
476{
477 int count;
478
479 if (atomic_read(&in_suspend))
480 return;
481
482 if (!tz->ops->get_temp)
483 return;
484
485 update_temperature(tz);
486
487 thermal_zone_set_trips(tz);
488
489 tz->notify_event = event;
490
491 for (count = 0; count < tz->trips; count++)
492 handle_thermal_trip(tz, count);
493}
494EXPORT_SYMBOL_GPL(thermal_zone_device_update);
495
496
497
498
499
500
501
502
503
504
505
506
507
508void thermal_notify_framework(struct thermal_zone_device *tz, int trip)
509{
510 handle_thermal_trip(tz, trip);
511}
512EXPORT_SYMBOL_GPL(thermal_notify_framework);
513
514static void thermal_zone_device_check(struct work_struct *work)
515{
516 struct thermal_zone_device *tz = container_of(work, struct
517 thermal_zone_device,
518 poll_queue.work);
519 thermal_zone_device_update(tz, THERMAL_EVENT_UNSPECIFIED);
520}
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541int power_actor_get_max_power(struct thermal_cooling_device *cdev,
542 struct thermal_zone_device *tz, u32 *max_power)
543{
544 if (!cdev_is_power_actor(cdev))
545 return -EINVAL;
546
547 return cdev->ops->state2power(cdev, tz, 0, max_power);
548}
549
550
551
552
553
554
555
556
557
558
559
560
561
562int power_actor_get_min_power(struct thermal_cooling_device *cdev,
563 struct thermal_zone_device *tz, u32 *min_power)
564{
565 unsigned long max_state;
566 int ret;
567
568 if (!cdev_is_power_actor(cdev))
569 return -EINVAL;
570
571 ret = cdev->ops->get_max_state(cdev, &max_state);
572 if (ret)
573 return ret;
574
575 return cdev->ops->state2power(cdev, tz, max_state, min_power);
576}
577
578
579
580
581
582
583
584
585
586
587
588
589
590int power_actor_set_power(struct thermal_cooling_device *cdev,
591 struct thermal_instance *instance, u32 power)
592{
593 unsigned long state;
594 int ret;
595
596 if (!cdev_is_power_actor(cdev))
597 return -EINVAL;
598
599 ret = cdev->ops->power2state(cdev, instance->tz, power, &state);
600 if (ret)
601 return ret;
602
603 instance->target = state;
604 mutex_lock(&cdev->lock);
605 cdev->updated = false;
606 mutex_unlock(&cdev->lock);
607 thermal_cdev_update(cdev);
608
609 return 0;
610}
611
612void thermal_zone_device_rebind_exception(struct thermal_zone_device *tz,
613 const char *cdev_type, size_t size)
614{
615 struct thermal_cooling_device *cdev = NULL;
616
617 mutex_lock(&thermal_list_lock);
618 list_for_each_entry(cdev, &thermal_cdev_list, node) {
619
620 if (strncmp(cdev_type, cdev->type, size))
621 continue;
622
623
624 thermal_zone_bind_cooling_device(tz, THERMAL_TRIPS_NONE, cdev,
625 THERMAL_NO_LIMIT,
626 THERMAL_NO_LIMIT,
627 THERMAL_WEIGHT_DEFAULT);
628 }
629 mutex_unlock(&thermal_list_lock);
630}
631
632void thermal_zone_device_unbind_exception(struct thermal_zone_device *tz,
633 const char *cdev_type, size_t size)
634{
635 struct thermal_cooling_device *cdev = NULL;
636
637 mutex_lock(&thermal_list_lock);
638 list_for_each_entry(cdev, &thermal_cdev_list, node) {
639
640 if (strncmp(cdev_type, cdev->type, size))
641 continue;
642
643 thermal_zone_unbind_cooling_device(tz, THERMAL_TRIPS_NONE,
644 cdev);
645 }
646 mutex_unlock(&thermal_list_lock);
647}
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681int thermal_zone_bind_cooling_device(struct thermal_zone_device *tz,
682 int trip,
683 struct thermal_cooling_device *cdev,
684 unsigned long upper, unsigned long lower,
685 unsigned int weight)
686{
687 struct thermal_instance *dev;
688 struct thermal_instance *pos;
689 struct thermal_zone_device *pos1;
690 struct thermal_cooling_device *pos2;
691 unsigned long max_state;
692 int result, ret;
693
694 if (trip >= tz->trips || (trip < 0 && trip != THERMAL_TRIPS_NONE))
695 return -EINVAL;
696
697 list_for_each_entry(pos1, &thermal_tz_list, node) {
698 if (pos1 == tz)
699 break;
700 }
701 list_for_each_entry(pos2, &thermal_cdev_list, node) {
702 if (pos2 == cdev)
703 break;
704 }
705
706 if (tz != pos1 || cdev != pos2)
707 return -EINVAL;
708
709 ret = cdev->ops->get_max_state(cdev, &max_state);
710 if (ret)
711 return ret;
712
713
714 lower = lower == THERMAL_NO_LIMIT ? 0 : lower;
715 upper = upper == THERMAL_NO_LIMIT ? max_state : upper;
716
717 if (lower > upper || upper > max_state)
718 return -EINVAL;
719
720 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
721 if (!dev)
722 return -ENOMEM;
723 dev->tz = tz;
724 dev->cdev = cdev;
725 dev->trip = trip;
726 dev->upper = upper;
727 dev->lower = lower;
728 dev->target = THERMAL_NO_TARGET;
729 dev->weight = weight;
730
731 result = ida_simple_get(&tz->ida, 0, 0, GFP_KERNEL);
732 if (result < 0)
733 goto free_mem;
734
735 dev->id = result;
736 sprintf(dev->name, "cdev%d", dev->id);
737 result =
738 sysfs_create_link(&tz->device.kobj, &cdev->device.kobj, dev->name);
739 if (result)
740 goto release_ida;
741
742 sprintf(dev->attr_name, "cdev%d_trip_point", dev->id);
743 sysfs_attr_init(&dev->attr.attr);
744 dev->attr.attr.name = dev->attr_name;
745 dev->attr.attr.mode = 0444;
746 dev->attr.show = trip_point_show;
747 result = device_create_file(&tz->device, &dev->attr);
748 if (result)
749 goto remove_symbol_link;
750
751 sprintf(dev->weight_attr_name, "cdev%d_weight", dev->id);
752 sysfs_attr_init(&dev->weight_attr.attr);
753 dev->weight_attr.attr.name = dev->weight_attr_name;
754 dev->weight_attr.attr.mode = S_IWUSR | S_IRUGO;
755 dev->weight_attr.show = weight_show;
756 dev->weight_attr.store = weight_store;
757 result = device_create_file(&tz->device, &dev->weight_attr);
758 if (result)
759 goto remove_trip_file;
760
761 mutex_lock(&tz->lock);
762 mutex_lock(&cdev->lock);
763 list_for_each_entry(pos, &tz->thermal_instances, tz_node)
764 if (pos->tz == tz && pos->trip == trip && pos->cdev == cdev) {
765 result = -EEXIST;
766 break;
767 }
768 if (!result) {
769 list_add_tail(&dev->tz_node, &tz->thermal_instances);
770 list_add_tail(&dev->cdev_node, &cdev->thermal_instances);
771 atomic_set(&tz->need_update, 1);
772 }
773 mutex_unlock(&cdev->lock);
774 mutex_unlock(&tz->lock);
775
776 if (!result)
777 return 0;
778
779 device_remove_file(&tz->device, &dev->weight_attr);
780remove_trip_file:
781 device_remove_file(&tz->device, &dev->attr);
782remove_symbol_link:
783 sysfs_remove_link(&tz->device.kobj, dev->name);
784release_ida:
785 ida_simple_remove(&tz->ida, dev->id);
786free_mem:
787 kfree(dev);
788 return result;
789}
790EXPORT_SYMBOL_GPL(thermal_zone_bind_cooling_device);
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806int thermal_zone_unbind_cooling_device(struct thermal_zone_device *tz,
807 int trip,
808 struct thermal_cooling_device *cdev)
809{
810 struct thermal_instance *pos, *next;
811
812 mutex_lock(&tz->lock);
813 mutex_lock(&cdev->lock);
814 list_for_each_entry_safe(pos, next, &tz->thermal_instances, tz_node) {
815 if (pos->tz == tz && pos->trip == trip && pos->cdev == cdev) {
816 list_del(&pos->tz_node);
817 list_del(&pos->cdev_node);
818 mutex_unlock(&cdev->lock);
819 mutex_unlock(&tz->lock);
820 goto unbind;
821 }
822 }
823 mutex_unlock(&cdev->lock);
824 mutex_unlock(&tz->lock);
825
826 return -ENODEV;
827
828unbind:
829 device_remove_file(&tz->device, &pos->weight_attr);
830 device_remove_file(&tz->device, &pos->attr);
831 sysfs_remove_link(&tz->device.kobj, pos->name);
832 ida_simple_remove(&tz->ida, pos->id);
833 kfree(pos);
834 return 0;
835}
836EXPORT_SYMBOL_GPL(thermal_zone_unbind_cooling_device);
837
838static void thermal_release(struct device *dev)
839{
840 struct thermal_zone_device *tz;
841 struct thermal_cooling_device *cdev;
842
843 if (!strncmp(dev_name(dev), "thermal_zone",
844 sizeof("thermal_zone") - 1)) {
845 tz = to_thermal_zone(dev);
846 thermal_zone_destroy_device_groups(tz);
847 kfree(tz);
848 } else if (!strncmp(dev_name(dev), "cooling_device",
849 sizeof("cooling_device") - 1)) {
850 cdev = to_cooling_device(dev);
851 kfree(cdev);
852 }
853}
854
855static struct class thermal_class = {
856 .name = "thermal",
857 .dev_release = thermal_release,
858};
859
860static inline
861void print_bind_err_msg(struct thermal_zone_device *tz,
862 struct thermal_cooling_device *cdev, int ret)
863{
864 dev_err(&tz->device, "binding zone %s with cdev %s failed:%d\n",
865 tz->type, cdev->type, ret);
866}
867
868static void __bind(struct thermal_zone_device *tz, int mask,
869 struct thermal_cooling_device *cdev,
870 unsigned long *limits,
871 unsigned int weight)
872{
873 int i, ret;
874
875 for (i = 0; i < tz->trips; i++) {
876 if (mask & (1 << i)) {
877 unsigned long upper, lower;
878
879 upper = THERMAL_NO_LIMIT;
880 lower = THERMAL_NO_LIMIT;
881 if (limits) {
882 lower = limits[i * 2];
883 upper = limits[i * 2 + 1];
884 }
885 ret = thermal_zone_bind_cooling_device(tz, i, cdev,
886 upper, lower,
887 weight);
888 if (ret)
889 print_bind_err_msg(tz, cdev, ret);
890 }
891 }
892}
893
894static void bind_cdev(struct thermal_cooling_device *cdev)
895{
896 int i, ret;
897 const struct thermal_zone_params *tzp;
898 struct thermal_zone_device *pos = NULL;
899
900 mutex_lock(&thermal_list_lock);
901
902 list_for_each_entry(pos, &thermal_tz_list, node) {
903 if (!pos->tzp && !pos->ops->bind)
904 continue;
905
906 if (pos->ops->bind) {
907 ret = pos->ops->bind(pos, cdev);
908 if (ret)
909 print_bind_err_msg(pos, cdev, ret);
910 continue;
911 }
912
913 tzp = pos->tzp;
914 if (!tzp || !tzp->tbp)
915 continue;
916
917 for (i = 0; i < tzp->num_tbps; i++) {
918 if (tzp->tbp[i].cdev || !tzp->tbp[i].match)
919 continue;
920 if (tzp->tbp[i].match(pos, cdev))
921 continue;
922 tzp->tbp[i].cdev = cdev;
923 __bind(pos, tzp->tbp[i].trip_mask, cdev,
924 tzp->tbp[i].binding_limits,
925 tzp->tbp[i].weight);
926 }
927 }
928
929 mutex_unlock(&thermal_list_lock);
930}
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948static struct thermal_cooling_device *
949__thermal_cooling_device_register(struct device_node *np,
950 const char *type, void *devdata,
951 const struct thermal_cooling_device_ops *ops)
952{
953 struct thermal_cooling_device *cdev;
954 struct thermal_zone_device *pos = NULL;
955 int result;
956
957 if (type && strlen(type) >= THERMAL_NAME_LENGTH)
958 return ERR_PTR(-EINVAL);
959
960 if (!ops || !ops->get_max_state || !ops->get_cur_state ||
961 !ops->set_cur_state)
962 return ERR_PTR(-EINVAL);
963
964 cdev = kzalloc(sizeof(*cdev), GFP_KERNEL);
965 if (!cdev)
966 return ERR_PTR(-ENOMEM);
967
968 result = ida_simple_get(&thermal_cdev_ida, 0, 0, GFP_KERNEL);
969 if (result < 0) {
970 kfree(cdev);
971 return ERR_PTR(result);
972 }
973
974 cdev->id = result;
975 strlcpy(cdev->type, type ? : "", sizeof(cdev->type));
976 mutex_init(&cdev->lock);
977 INIT_LIST_HEAD(&cdev->thermal_instances);
978 cdev->np = np;
979 cdev->ops = ops;
980 cdev->updated = false;
981 cdev->device.class = &thermal_class;
982 cdev->devdata = devdata;
983 thermal_cooling_device_setup_sysfs(cdev);
984 dev_set_name(&cdev->device, "cooling_device%d", cdev->id);
985 result = device_register(&cdev->device);
986 if (result) {
987 ida_simple_remove(&thermal_cdev_ida, cdev->id);
988 put_device(&cdev->device);
989 return ERR_PTR(result);
990 }
991
992
993 mutex_lock(&thermal_list_lock);
994 list_add(&cdev->node, &thermal_cdev_list);
995 mutex_unlock(&thermal_list_lock);
996
997
998 bind_cdev(cdev);
999
1000 mutex_lock(&thermal_list_lock);
1001 list_for_each_entry(pos, &thermal_tz_list, node)
1002 if (atomic_cmpxchg(&pos->need_update, 1, 0))
1003 thermal_zone_device_update(pos,
1004 THERMAL_EVENT_UNSPECIFIED);
1005 mutex_unlock(&thermal_list_lock);
1006
1007 return cdev;
1008}
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023struct thermal_cooling_device *
1024thermal_cooling_device_register(const char *type, void *devdata,
1025 const struct thermal_cooling_device_ops *ops)
1026{
1027 return __thermal_cooling_device_register(NULL, type, devdata, ops);
1028}
1029EXPORT_SYMBOL_GPL(thermal_cooling_device_register);
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046struct thermal_cooling_device *
1047thermal_of_cooling_device_register(struct device_node *np,
1048 const char *type, void *devdata,
1049 const struct thermal_cooling_device_ops *ops)
1050{
1051 return __thermal_cooling_device_register(np, type, devdata, ops);
1052}
1053EXPORT_SYMBOL_GPL(thermal_of_cooling_device_register);
1054
1055static void thermal_cooling_device_release(struct device *dev, void *res)
1056{
1057 thermal_cooling_device_unregister(
1058 *(struct thermal_cooling_device **)res);
1059}
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078struct thermal_cooling_device *
1079devm_thermal_of_cooling_device_register(struct device *dev,
1080 struct device_node *np,
1081 char *type, void *devdata,
1082 const struct thermal_cooling_device_ops *ops)
1083{
1084 struct thermal_cooling_device **ptr, *tcd;
1085
1086 ptr = devres_alloc(thermal_cooling_device_release, sizeof(*ptr),
1087 GFP_KERNEL);
1088 if (!ptr)
1089 return ERR_PTR(-ENOMEM);
1090
1091 tcd = __thermal_cooling_device_register(np, type, devdata, ops);
1092 if (IS_ERR(tcd)) {
1093 devres_free(ptr);
1094 return tcd;
1095 }
1096
1097 *ptr = tcd;
1098 devres_add(dev, ptr);
1099
1100 return tcd;
1101}
1102EXPORT_SYMBOL_GPL(devm_thermal_of_cooling_device_register);
1103
1104static void __unbind(struct thermal_zone_device *tz, int mask,
1105 struct thermal_cooling_device *cdev)
1106{
1107 int i;
1108
1109 for (i = 0; i < tz->trips; i++)
1110 if (mask & (1 << i))
1111 thermal_zone_unbind_cooling_device(tz, i, cdev);
1112}
1113
1114
1115
1116
1117
1118
1119
1120
1121void thermal_cooling_device_unregister(struct thermal_cooling_device *cdev)
1122{
1123 int i;
1124 const struct thermal_zone_params *tzp;
1125 struct thermal_zone_device *tz;
1126 struct thermal_cooling_device *pos = NULL;
1127
1128 if (!cdev)
1129 return;
1130
1131 mutex_lock(&thermal_list_lock);
1132 list_for_each_entry(pos, &thermal_cdev_list, node)
1133 if (pos == cdev)
1134 break;
1135 if (pos != cdev) {
1136
1137 mutex_unlock(&thermal_list_lock);
1138 return;
1139 }
1140 list_del(&cdev->node);
1141
1142
1143 list_for_each_entry(tz, &thermal_tz_list, node) {
1144 if (tz->ops->unbind) {
1145 tz->ops->unbind(tz, cdev);
1146 continue;
1147 }
1148
1149 if (!tz->tzp || !tz->tzp->tbp)
1150 continue;
1151
1152 tzp = tz->tzp;
1153 for (i = 0; i < tzp->num_tbps; i++) {
1154 if (tzp->tbp[i].cdev == cdev) {
1155 __unbind(tz, tzp->tbp[i].trip_mask, cdev);
1156 tzp->tbp[i].cdev = NULL;
1157 }
1158 }
1159 }
1160
1161 mutex_unlock(&thermal_list_lock);
1162
1163 ida_simple_remove(&thermal_cdev_ida, cdev->id);
1164 device_del(&cdev->device);
1165 thermal_cooling_device_destroy_sysfs(cdev);
1166 put_device(&cdev->device);
1167}
1168EXPORT_SYMBOL_GPL(thermal_cooling_device_unregister);
1169
1170static void bind_tz(struct thermal_zone_device *tz)
1171{
1172 int i, ret;
1173 struct thermal_cooling_device *pos = NULL;
1174 const struct thermal_zone_params *tzp = tz->tzp;
1175
1176 if (!tzp && !tz->ops->bind)
1177 return;
1178
1179 mutex_lock(&thermal_list_lock);
1180
1181
1182 if (tz->ops->bind) {
1183 list_for_each_entry(pos, &thermal_cdev_list, node) {
1184 ret = tz->ops->bind(tz, pos);
1185 if (ret)
1186 print_bind_err_msg(tz, pos, ret);
1187 }
1188 goto exit;
1189 }
1190
1191 if (!tzp || !tzp->tbp)
1192 goto exit;
1193
1194 list_for_each_entry(pos, &thermal_cdev_list, node) {
1195 for (i = 0; i < tzp->num_tbps; i++) {
1196 if (tzp->tbp[i].cdev || !tzp->tbp[i].match)
1197 continue;
1198 if (tzp->tbp[i].match(tz, pos))
1199 continue;
1200 tzp->tbp[i].cdev = pos;
1201 __bind(tz, tzp->tbp[i].trip_mask, pos,
1202 tzp->tbp[i].binding_limits,
1203 tzp->tbp[i].weight);
1204 }
1205 }
1206exit:
1207 mutex_unlock(&thermal_list_lock);
1208}
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234struct thermal_zone_device *
1235thermal_zone_device_register(const char *type, int trips, int mask,
1236 void *devdata, struct thermal_zone_device_ops *ops,
1237 struct thermal_zone_params *tzp, int passive_delay,
1238 int polling_delay)
1239{
1240 struct thermal_zone_device *tz;
1241 enum thermal_trip_type trip_type;
1242 int trip_temp;
1243 int id;
1244 int result;
1245 int count;
1246 struct thermal_governor *governor;
1247
1248 if (!type || strlen(type) == 0) {
1249 pr_err("Error: No thermal zone type defined\n");
1250 return ERR_PTR(-EINVAL);
1251 }
1252
1253 if (type && strlen(type) >= THERMAL_NAME_LENGTH) {
1254 pr_err("Error: Thermal zone name (%s) too long, should be under %d chars\n",
1255 type, THERMAL_NAME_LENGTH);
1256 return ERR_PTR(-EINVAL);
1257 }
1258
1259 if (trips > THERMAL_MAX_TRIPS || trips < 0 || mask >> trips) {
1260 pr_err("Error: Incorrect number of thermal trips\n");
1261 return ERR_PTR(-EINVAL);
1262 }
1263
1264 if (!ops) {
1265 pr_err("Error: Thermal zone device ops not defined\n");
1266 return ERR_PTR(-EINVAL);
1267 }
1268
1269 if (trips > 0 && (!ops->get_trip_type || !ops->get_trip_temp))
1270 return ERR_PTR(-EINVAL);
1271
1272 tz = kzalloc(sizeof(*tz), GFP_KERNEL);
1273 if (!tz)
1274 return ERR_PTR(-ENOMEM);
1275
1276 INIT_LIST_HEAD(&tz->thermal_instances);
1277 ida_init(&tz->ida);
1278 mutex_init(&tz->lock);
1279 id = ida_simple_get(&thermal_tz_ida, 0, 0, GFP_KERNEL);
1280 if (id < 0) {
1281 result = id;
1282 goto free_tz;
1283 }
1284
1285 tz->id = id;
1286 strlcpy(tz->type, type, sizeof(tz->type));
1287 tz->ops = ops;
1288 tz->tzp = tzp;
1289 tz->device.class = &thermal_class;
1290 tz->devdata = devdata;
1291 tz->trips = trips;
1292 tz->passive_delay = passive_delay;
1293 tz->polling_delay = polling_delay;
1294
1295
1296
1297 result = thermal_zone_create_device_groups(tz, mask);
1298 if (result)
1299 goto remove_id;
1300
1301
1302 atomic_set(&tz->need_update, 1);
1303
1304 dev_set_name(&tz->device, "thermal_zone%d", tz->id);
1305 result = device_register(&tz->device);
1306 if (result)
1307 goto release_device;
1308
1309 for (count = 0; count < trips; count++) {
1310 if (tz->ops->get_trip_type(tz, count, &trip_type))
1311 set_bit(count, &tz->trips_disabled);
1312 if (tz->ops->get_trip_temp(tz, count, &trip_temp))
1313 set_bit(count, &tz->trips_disabled);
1314
1315 if (trip_temp == 0)
1316 set_bit(count, &tz->trips_disabled);
1317 }
1318
1319
1320 mutex_lock(&thermal_governor_lock);
1321
1322 if (tz->tzp)
1323 governor = __find_governor(tz->tzp->governor_name);
1324 else
1325 governor = def_governor;
1326
1327 result = thermal_set_governor(tz, governor);
1328 if (result) {
1329 mutex_unlock(&thermal_governor_lock);
1330 goto unregister;
1331 }
1332
1333 mutex_unlock(&thermal_governor_lock);
1334
1335 if (!tz->tzp || !tz->tzp->no_hwmon) {
1336 result = thermal_add_hwmon_sysfs(tz);
1337 if (result)
1338 goto unregister;
1339 }
1340
1341 mutex_lock(&thermal_list_lock);
1342 list_add_tail(&tz->node, &thermal_tz_list);
1343 mutex_unlock(&thermal_list_lock);
1344
1345
1346 bind_tz(tz);
1347
1348 INIT_DELAYED_WORK(&tz->poll_queue, thermal_zone_device_check);
1349
1350 thermal_zone_device_reset(tz);
1351
1352 if (atomic_cmpxchg(&tz->need_update, 1, 0))
1353 thermal_zone_device_update(tz, THERMAL_EVENT_UNSPECIFIED);
1354
1355 return tz;
1356
1357unregister:
1358 device_del(&tz->device);
1359release_device:
1360 put_device(&tz->device);
1361 tz = NULL;
1362remove_id:
1363 ida_simple_remove(&thermal_tz_ida, id);
1364free_tz:
1365 kfree(tz);
1366 return ERR_PTR(result);
1367}
1368EXPORT_SYMBOL_GPL(thermal_zone_device_register);
1369
1370
1371
1372
1373
1374void thermal_zone_device_unregister(struct thermal_zone_device *tz)
1375{
1376 int i;
1377 const struct thermal_zone_params *tzp;
1378 struct thermal_cooling_device *cdev;
1379 struct thermal_zone_device *pos = NULL;
1380
1381 if (!tz)
1382 return;
1383
1384 tzp = tz->tzp;
1385
1386 mutex_lock(&thermal_list_lock);
1387 list_for_each_entry(pos, &thermal_tz_list, node)
1388 if (pos == tz)
1389 break;
1390 if (pos != tz) {
1391
1392 mutex_unlock(&thermal_list_lock);
1393 return;
1394 }
1395 list_del(&tz->node);
1396
1397
1398 list_for_each_entry(cdev, &thermal_cdev_list, node) {
1399 if (tz->ops->unbind) {
1400 tz->ops->unbind(tz, cdev);
1401 continue;
1402 }
1403
1404 if (!tzp || !tzp->tbp)
1405 break;
1406
1407 for (i = 0; i < tzp->num_tbps; i++) {
1408 if (tzp->tbp[i].cdev == cdev) {
1409 __unbind(tz, tzp->tbp[i].trip_mask, cdev);
1410 tzp->tbp[i].cdev = NULL;
1411 }
1412 }
1413 }
1414
1415 mutex_unlock(&thermal_list_lock);
1416
1417 thermal_zone_device_set_polling(tz, 0);
1418
1419 thermal_set_governor(tz, NULL);
1420
1421 thermal_remove_hwmon_sysfs(tz);
1422 ida_simple_remove(&thermal_tz_ida, tz->id);
1423 ida_destroy(&tz->ida);
1424 mutex_destroy(&tz->lock);
1425 device_unregister(&tz->device);
1426}
1427EXPORT_SYMBOL_GPL(thermal_zone_device_unregister);
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439struct thermal_zone_device *thermal_zone_get_zone_by_name(const char *name)
1440{
1441 struct thermal_zone_device *pos = NULL, *ref = ERR_PTR(-EINVAL);
1442 unsigned int found = 0;
1443
1444 if (!name)
1445 goto exit;
1446
1447 mutex_lock(&thermal_list_lock);
1448 list_for_each_entry(pos, &thermal_tz_list, node)
1449 if (!strncasecmp(name, pos->type, THERMAL_NAME_LENGTH)) {
1450 found++;
1451 ref = pos;
1452 }
1453 mutex_unlock(&thermal_list_lock);
1454
1455
1456 if (found == 0)
1457 ref = ERR_PTR(-ENODEV);
1458 else if (found > 1)
1459
1460 ref = ERR_PTR(-EEXIST);
1461
1462exit:
1463 return ref;
1464}
1465EXPORT_SYMBOL_GPL(thermal_zone_get_zone_by_name);
1466
1467#ifdef CONFIG_NET
1468static const struct genl_multicast_group thermal_event_mcgrps[] = {
1469 { .name = THERMAL_GENL_MCAST_GROUP_NAME, },
1470};
1471
1472static struct genl_family thermal_event_genl_family __ro_after_init = {
1473 .module = THIS_MODULE,
1474 .name = THERMAL_GENL_FAMILY_NAME,
1475 .version = THERMAL_GENL_VERSION,
1476 .maxattr = THERMAL_GENL_ATTR_MAX,
1477 .mcgrps = thermal_event_mcgrps,
1478 .n_mcgrps = ARRAY_SIZE(thermal_event_mcgrps),
1479};
1480
1481int thermal_generate_netlink_event(struct thermal_zone_device *tz,
1482 enum events event)
1483{
1484 struct sk_buff *skb;
1485 struct nlattr *attr;
1486 struct thermal_genl_event *thermal_event;
1487 void *msg_header;
1488 int size;
1489 int result;
1490 static unsigned int thermal_event_seqnum;
1491
1492 if (!tz)
1493 return -EINVAL;
1494
1495
1496 size = nla_total_size(sizeof(struct thermal_genl_event)) +
1497 nla_total_size(0);
1498
1499 skb = genlmsg_new(size, GFP_ATOMIC);
1500 if (!skb)
1501 return -ENOMEM;
1502
1503
1504 msg_header = genlmsg_put(skb, 0, thermal_event_seqnum++,
1505 &thermal_event_genl_family, 0,
1506 THERMAL_GENL_CMD_EVENT);
1507 if (!msg_header) {
1508 nlmsg_free(skb);
1509 return -ENOMEM;
1510 }
1511
1512
1513 attr = nla_reserve(skb, THERMAL_GENL_ATTR_EVENT,
1514 sizeof(struct thermal_genl_event));
1515
1516 if (!attr) {
1517 nlmsg_free(skb);
1518 return -EINVAL;
1519 }
1520
1521 thermal_event = nla_data(attr);
1522 if (!thermal_event) {
1523 nlmsg_free(skb);
1524 return -EINVAL;
1525 }
1526
1527 memset(thermal_event, 0, sizeof(struct thermal_genl_event));
1528
1529 thermal_event->orig = tz->id;
1530 thermal_event->event = event;
1531
1532
1533 genlmsg_end(skb, msg_header);
1534
1535 result = genlmsg_multicast(&thermal_event_genl_family, skb, 0,
1536 0, GFP_ATOMIC);
1537 if (result)
1538 dev_err(&tz->device, "Failed to send netlink event:%d", result);
1539
1540 return result;
1541}
1542EXPORT_SYMBOL_GPL(thermal_generate_netlink_event);
1543
1544static int __init genetlink_init(void)
1545{
1546 return genl_register_family(&thermal_event_genl_family);
1547}
1548
1549static void genetlink_exit(void)
1550{
1551 genl_unregister_family(&thermal_event_genl_family);
1552}
1553#else
1554static inline int genetlink_init(void) { return 0; }
1555static inline void genetlink_exit(void) {}
1556#endif
1557
1558static int thermal_pm_notify(struct notifier_block *nb,
1559 unsigned long mode, void *_unused)
1560{
1561 struct thermal_zone_device *tz;
1562 enum thermal_device_mode tz_mode;
1563
1564 switch (mode) {
1565 case PM_HIBERNATION_PREPARE:
1566 case PM_RESTORE_PREPARE:
1567 case PM_SUSPEND_PREPARE:
1568 atomic_set(&in_suspend, 1);
1569 break;
1570 case PM_POST_HIBERNATION:
1571 case PM_POST_RESTORE:
1572 case PM_POST_SUSPEND:
1573 atomic_set(&in_suspend, 0);
1574 list_for_each_entry(tz, &thermal_tz_list, node) {
1575 tz_mode = THERMAL_DEVICE_ENABLED;
1576 if (tz->ops->get_mode)
1577 tz->ops->get_mode(tz, &tz_mode);
1578
1579 if (tz_mode == THERMAL_DEVICE_DISABLED)
1580 continue;
1581
1582 thermal_zone_device_init(tz);
1583 thermal_zone_device_update(tz,
1584 THERMAL_EVENT_UNSPECIFIED);
1585 }
1586 break;
1587 default:
1588 break;
1589 }
1590 return 0;
1591}
1592
1593static struct notifier_block thermal_pm_nb = {
1594 .notifier_call = thermal_pm_notify,
1595};
1596
1597static int __init thermal_init(void)
1598{
1599 int result;
1600
1601 mutex_init(&poweroff_lock);
1602 result = thermal_register_governors();
1603 if (result)
1604 goto error;
1605
1606 result = class_register(&thermal_class);
1607 if (result)
1608 goto unregister_governors;
1609
1610 result = genetlink_init();
1611 if (result)
1612 goto unregister_class;
1613
1614 result = of_parse_thermal_zones();
1615 if (result)
1616 goto exit_netlink;
1617
1618 result = register_pm_notifier(&thermal_pm_nb);
1619 if (result)
1620 pr_warn("Thermal: Can not register suspend notifier, return %d\n",
1621 result);
1622
1623 return 0;
1624
1625exit_netlink:
1626 genetlink_exit();
1627unregister_class:
1628 class_unregister(&thermal_class);
1629unregister_governors:
1630 thermal_unregister_governors();
1631error:
1632 ida_destroy(&thermal_tz_ida);
1633 ida_destroy(&thermal_cdev_ida);
1634 mutex_destroy(&thermal_list_lock);
1635 mutex_destroy(&thermal_governor_lock);
1636 mutex_destroy(&poweroff_lock);
1637 return result;
1638}
1639fs_initcall(thermal_init);
1640