1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * thermal.c - Generic Thermal Management Sysfs support. 4 * 5 * Copyright (C) 2008 Intel Corp 6 * Copyright (C) 2008 Zhang Rui <rui.zhang@intel.com> 7 * Copyright (C) 2008 Sujith Thomas <sujith.thomas@intel.com> 8 */ 9 10 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 11 12 #include <linux/device.h> 13 #include <linux/err.h> 14 #include <linux/export.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 <linux/suspend.h> 23 24 #define CREATE_TRACE_POINTS 25 #include <trace/events/thermal.h> 26 27 #include "thermal_core.h" 28 #include "thermal_hwmon.h" 29 30 static DEFINE_IDA(thermal_tz_ida); 31 static DEFINE_IDA(thermal_cdev_ida); 32 33 static LIST_HEAD(thermal_tz_list); 34 static LIST_HEAD(thermal_cdev_list); 35 static LIST_HEAD(thermal_governor_list); 36 37 static DEFINE_MUTEX(thermal_list_lock); 38 static DEFINE_MUTEX(thermal_governor_lock); 39 40 static atomic_t in_suspend; 41 42 static struct thermal_governor *def_governor; 43 44 /* 45 * Governor section: set of functions to handle thermal governors 46 * 47 * Functions to help in the life cycle of thermal governors within 48 * the thermal core and by the thermal governor code. 49 */ 50 51 static struct thermal_governor *__find_governor(const char *name) 52 { 53 struct thermal_governor *pos; 54 55 if (!name || !name[0]) 56 return def_governor; 57 58 list_for_each_entry(pos, &thermal_governor_list, governor_list) 59 if (!strncasecmp(name, pos->name, THERMAL_NAME_LENGTH)) 60 return pos; 61 62 return NULL; 63 } 64 65 /** 66 * bind_previous_governor() - bind the previous governor of the thermal zone 67 * @tz: a valid pointer to a struct thermal_zone_device 68 * @failed_gov_name: the name of the governor that failed to register 69 * 70 * Register the previous governor of the thermal zone after a new 71 * governor has failed to be bound. 72 */ 73 static void bind_previous_governor(struct thermal_zone_device *tz, 74 const char *failed_gov_name) 75 { 76 if (tz->governor && tz->governor->bind_to_tz) { 77 if (tz->governor->bind_to_tz(tz)) { 78 dev_err(&tz->device, 79 "governor %s failed to bind and the previous one (%s) failed to bind again, thermal zone %s has no governor\n", 80 failed_gov_name, tz->governor->name, tz->type); 81 tz->governor = NULL; 82 } 83 } 84 } 85 86 /** 87 * thermal_set_governor() - Switch to another governor 88 * @tz: a valid pointer to a struct thermal_zone_device 89 * @new_gov: pointer to the new governor 90 * 91 * Change the governor of thermal zone @tz. 92 * 93 * Return: 0 on success, an error if the new governor's bind_to_tz() failed. 94 */ 95 static int thermal_set_governor(struct thermal_zone_device *tz, 96 struct thermal_governor *new_gov) 97 { 98 int ret = 0; 99 100 if (tz->governor && tz->governor->unbind_from_tz) 101 tz->governor->unbind_from_tz(tz); 102 103 if (new_gov && new_gov->bind_to_tz) { 104 ret = new_gov->bind_to_tz(tz); 105 if (ret) { 106 bind_previous_governor(tz, new_gov->name); 107 108 return ret; 109 } 110 } 111 112 tz->governor = new_gov; 113 114 return ret; 115 } 116 117 int thermal_register_governor(struct thermal_governor *governor) 118 { 119 int err; 120 const char *name; 121 struct thermal_zone_device *pos; 122 123 if (!governor) 124 return -EINVAL; 125 126 mutex_lock(&thermal_governor_lock); 127 128 err = -EBUSY; 129 if (!__find_governor(governor->name)) { 130 bool match_default; 131 132 err = 0; 133 list_add(&governor->governor_list, &thermal_governor_list); 134 match_default = !strncmp(governor->name, 135 DEFAULT_THERMAL_GOVERNOR, 136 THERMAL_NAME_LENGTH); 137 138 if (!def_governor && match_default) 139 def_governor = governor; 140 } 141 142 mutex_lock(&thermal_list_lock); 143 144 list_for_each_entry(pos, &thermal_tz_list, node) { 145 /* 146 * only thermal zones with specified tz->tzp->governor_name 147 * may run with tz->govenor unset 148 */ 149 if (pos->governor) 150 continue; 151 152 name = pos->tzp->governor_name; 153 154 if (!strncasecmp(name, governor->name, THERMAL_NAME_LENGTH)) { 155 int ret; 156 157 ret = thermal_set_governor(pos, governor); 158 if (ret) 159 dev_err(&pos->device, 160 "Failed to set governor %s for thermal zone %s: %d\n", 161 governor->name, pos->type, ret); 162 } 163 } 164 165 mutex_unlock(&thermal_list_lock); 166 mutex_unlock(&thermal_governor_lock); 167 168 return err; 169 } 170 171 void thermal_unregister_governor(struct thermal_governor *governor) 172 { 173 struct thermal_zone_device *pos; 174 175 if (!governor) 176 return; 177 178 mutex_lock(&thermal_governor_lock); 179 180 if (!__find_governor(governor->name)) 181 goto exit; 182 183 mutex_lock(&thermal_list_lock); 184 185 list_for_each_entry(pos, &thermal_tz_list, node) { 186 if (!strncasecmp(pos->governor->name, governor->name, 187 THERMAL_NAME_LENGTH)) 188 thermal_set_governor(pos, NULL); 189 } 190 191 mutex_unlock(&thermal_list_lock); 192 list_del(&governor->governor_list); 193 exit: 194 mutex_unlock(&thermal_governor_lock); 195 } 196 197 int thermal_zone_device_set_policy(struct thermal_zone_device *tz, 198 char *policy) 199 { 200 struct thermal_governor *gov; 201 int ret = -EINVAL; 202 203 mutex_lock(&thermal_governor_lock); 204 mutex_lock(&tz->lock); 205 206 if (!device_is_registered(&tz->device)) 207 goto exit; 208 209 gov = __find_governor(strim(policy)); 210 if (!gov) 211 goto exit; 212 213 ret = thermal_set_governor(tz, gov); 214 215 exit: 216 mutex_unlock(&tz->lock); 217 mutex_unlock(&thermal_governor_lock); 218 219 thermal_notify_tz_gov_change(tz->id, policy); 220 221 return ret; 222 } 223 224 int thermal_build_list_of_policies(char *buf) 225 { 226 struct thermal_governor *pos; 227 ssize_t count = 0; 228 229 mutex_lock(&thermal_governor_lock); 230 231 list_for_each_entry(pos, &thermal_governor_list, governor_list) { 232 count += scnprintf(buf + count, PAGE_SIZE - count, "%s ", 233 pos->name); 234 } 235 count += scnprintf(buf + count, PAGE_SIZE - count, "\n"); 236 237 mutex_unlock(&thermal_governor_lock); 238 239 return count; 240 } 241 242 static void __init thermal_unregister_governors(void) 243 { 244 struct thermal_governor **governor; 245 246 for_each_governor_table(governor) 247 thermal_unregister_governor(*governor); 248 } 249 250 static int __init thermal_register_governors(void) 251 { 252 int ret = 0; 253 struct thermal_governor **governor; 254 255 for_each_governor_table(governor) { 256 ret = thermal_register_governor(*governor); 257 if (ret) { 258 pr_err("Failed to register governor: '%s'", 259 (*governor)->name); 260 break; 261 } 262 263 pr_info("Registered thermal governor '%s'", 264 (*governor)->name); 265 } 266 267 if (ret) { 268 struct thermal_governor **gov; 269 270 for_each_governor_table(gov) { 271 if (gov == governor) 272 break; 273 thermal_unregister_governor(*gov); 274 } 275 } 276 277 return ret; 278 } 279 280 /* 281 * Zone update section: main control loop applied to each zone while monitoring 282 * 283 * in polling mode. The monitoring is done using a workqueue. 284 * Same update may be done on a zone by calling thermal_zone_device_update(). 285 * 286 * An update means: 287 * - Non-critical trips will invoke the governor responsible for that zone; 288 * - Hot trips will produce a notification to userspace; 289 * - Critical trip point will cause a system shutdown. 290 */ 291 static void thermal_zone_device_set_polling(struct thermal_zone_device *tz, 292 unsigned long delay) 293 { 294 if (delay) 295 mod_delayed_work(system_freezable_power_efficient_wq, 296 &tz->poll_queue, delay); 297 else 298 cancel_delayed_work(&tz->poll_queue); 299 } 300 301 static void monitor_thermal_zone(struct thermal_zone_device *tz) 302 { 303 if (tz->mode != THERMAL_DEVICE_ENABLED) 304 thermal_zone_device_set_polling(tz, 0); 305 else if (tz->passive) 306 thermal_zone_device_set_polling(tz, tz->passive_delay_jiffies); 307 else if (tz->polling_delay_jiffies) 308 thermal_zone_device_set_polling(tz, tz->polling_delay_jiffies); 309 } 310 311 static void handle_non_critical_trips(struct thermal_zone_device *tz, int trip) 312 { 313 tz->governor ? tz->governor->throttle(tz, trip) : 314 def_governor->throttle(tz, trip); 315 } 316 317 void thermal_zone_device_critical(struct thermal_zone_device *tz) 318 { 319 /* 320 * poweroff_delay_ms must be a carefully profiled positive value. 321 * Its a must for forced_emergency_poweroff_work to be scheduled. 322 */ 323 int poweroff_delay_ms = CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS; 324 325 dev_emerg(&tz->device, "%s: critical temperature reached, " 326 "shutting down\n", tz->type); 327 328 hw_protection_shutdown("Temperature too high", poweroff_delay_ms); 329 } 330 EXPORT_SYMBOL(thermal_zone_device_critical); 331 332 static void handle_critical_trips(struct thermal_zone_device *tz, 333 int trip, int trip_temp, enum thermal_trip_type trip_type) 334 { 335 /* If we have not crossed the trip_temp, we do not care. */ 336 if (trip_temp <= 0 || tz->temperature < trip_temp) 337 return; 338 339 trace_thermal_zone_trip(tz, trip, trip_type); 340 341 if (trip_type == THERMAL_TRIP_HOT && tz->ops->hot) 342 tz->ops->hot(tz); 343 else if (trip_type == THERMAL_TRIP_CRITICAL) 344 tz->ops->critical(tz); 345 } 346 347 static void handle_thermal_trip(struct thermal_zone_device *tz, int trip) 348 { 349 enum thermal_trip_type type; 350 int trip_temp, hyst = 0; 351 352 /* Ignore disabled trip points */ 353 if (test_bit(trip, &tz->trips_disabled)) 354 return; 355 356 tz->ops->get_trip_temp(tz, trip, &trip_temp); 357 tz->ops->get_trip_type(tz, trip, &type); 358 if (tz->ops->get_trip_hyst) 359 tz->ops->get_trip_hyst(tz, trip, &hyst); 360 361 if (tz->last_temperature != THERMAL_TEMP_INVALID) { 362 if (tz->last_temperature < trip_temp && 363 tz->temperature >= trip_temp) 364 thermal_notify_tz_trip_up(tz->id, trip, 365 tz->temperature); 366 if (tz->last_temperature >= trip_temp && 367 tz->temperature < (trip_temp - hyst)) 368 thermal_notify_tz_trip_down(tz->id, trip, 369 tz->temperature); 370 } 371 372 if (type == THERMAL_TRIP_CRITICAL || type == THERMAL_TRIP_HOT) 373 handle_critical_trips(tz, trip, trip_temp, type); 374 else 375 handle_non_critical_trips(tz, trip); 376 } 377 378 static void update_temperature(struct thermal_zone_device *tz) 379 { 380 int temp, ret; 381 382 ret = __thermal_zone_get_temp(tz, &temp); 383 if (ret) { 384 if (ret != -EAGAIN) 385 dev_warn(&tz->device, 386 "failed to read out thermal zone (%d)\n", 387 ret); 388 return; 389 } 390 391 tz->last_temperature = tz->temperature; 392 tz->temperature = temp; 393 394 trace_thermal_temperature(tz); 395 396 thermal_genl_sampling_temp(tz->id, temp); 397 } 398 399 static void thermal_zone_device_init(struct thermal_zone_device *tz) 400 { 401 struct thermal_instance *pos; 402 tz->temperature = THERMAL_TEMP_INVALID; 403 tz->prev_low_trip = -INT_MAX; 404 tz->prev_high_trip = INT_MAX; 405 list_for_each_entry(pos, &tz->thermal_instances, tz_node) 406 pos->initialized = false; 407 } 408 409 void __thermal_zone_device_update(struct thermal_zone_device *tz, 410 enum thermal_notify_event event) 411 { 412 int count; 413 414 if (atomic_read(&in_suspend)) 415 return; 416 417 if (WARN_ONCE(!tz->ops->get_temp, 418 "'%s' must not be called without 'get_temp' ops set\n", 419 __func__)) 420 return; 421 422 if (!thermal_zone_device_is_enabled(tz)) 423 return; 424 425 update_temperature(tz); 426 427 __thermal_zone_set_trips(tz); 428 429 tz->notify_event = event; 430 431 for (count = 0; count < tz->num_trips; count++) 432 handle_thermal_trip(tz, count); 433 434 monitor_thermal_zone(tz); 435 } 436 437 static int thermal_zone_device_set_mode(struct thermal_zone_device *tz, 438 enum thermal_device_mode mode) 439 { 440 int ret = 0; 441 442 mutex_lock(&tz->lock); 443 444 /* do nothing if mode isn't changing */ 445 if (mode == tz->mode) { 446 mutex_unlock(&tz->lock); 447 448 return ret; 449 } 450 451 if (!device_is_registered(&tz->device)) { 452 mutex_unlock(&tz->lock); 453 454 return -ENODEV; 455 } 456 457 if (tz->ops->change_mode) 458 ret = tz->ops->change_mode(tz, mode); 459 460 if (!ret) 461 tz->mode = mode; 462 463 __thermal_zone_device_update(tz, THERMAL_EVENT_UNSPECIFIED); 464 465 mutex_unlock(&tz->lock); 466 467 if (mode == THERMAL_DEVICE_ENABLED) 468 thermal_notify_tz_enable(tz->id); 469 else 470 thermal_notify_tz_disable(tz->id); 471 472 return ret; 473 } 474 475 int thermal_zone_device_enable(struct thermal_zone_device *tz) 476 { 477 return thermal_zone_device_set_mode(tz, THERMAL_DEVICE_ENABLED); 478 } 479 EXPORT_SYMBOL_GPL(thermal_zone_device_enable); 480 481 int thermal_zone_device_disable(struct thermal_zone_device *tz) 482 { 483 return thermal_zone_device_set_mode(tz, THERMAL_DEVICE_DISABLED); 484 } 485 EXPORT_SYMBOL_GPL(thermal_zone_device_disable); 486 487 int thermal_zone_device_is_enabled(struct thermal_zone_device *tz) 488 { 489 lockdep_assert_held(&tz->lock); 490 491 return tz->mode == THERMAL_DEVICE_ENABLED; 492 } 493 494 void thermal_zone_device_update(struct thermal_zone_device *tz, 495 enum thermal_notify_event event) 496 { 497 mutex_lock(&tz->lock); 498 if (device_is_registered(&tz->device)) 499 __thermal_zone_device_update(tz, event); 500 mutex_unlock(&tz->lock); 501 } 502 EXPORT_SYMBOL_GPL(thermal_zone_device_update); 503 504 static void thermal_zone_device_check(struct work_struct *work) 505 { 506 struct thermal_zone_device *tz = container_of(work, struct 507 thermal_zone_device, 508 poll_queue.work); 509 thermal_zone_device_update(tz, THERMAL_EVENT_UNSPECIFIED); 510 } 511 512 int for_each_thermal_governor(int (*cb)(struct thermal_governor *, void *), 513 void *data) 514 { 515 struct thermal_governor *gov; 516 int ret = 0; 517 518 mutex_lock(&thermal_governor_lock); 519 list_for_each_entry(gov, &thermal_governor_list, governor_list) { 520 ret = cb(gov, data); 521 if (ret) 522 break; 523 } 524 mutex_unlock(&thermal_governor_lock); 525 526 return ret; 527 } 528 529 int for_each_thermal_cooling_device(int (*cb)(struct thermal_cooling_device *, 530 void *), void *data) 531 { 532 struct thermal_cooling_device *cdev; 533 int ret = 0; 534 535 mutex_lock(&thermal_list_lock); 536 list_for_each_entry(cdev, &thermal_cdev_list, node) { 537 ret = cb(cdev, data); 538 if (ret) 539 break; 540 } 541 mutex_unlock(&thermal_list_lock); 542 543 return ret; 544 } 545 546 int for_each_thermal_zone(int (*cb)(struct thermal_zone_device *, void *), 547 void *data) 548 { 549 struct thermal_zone_device *tz; 550 int ret = 0; 551 552 mutex_lock(&thermal_list_lock); 553 list_for_each_entry(tz, &thermal_tz_list, node) { 554 ret = cb(tz, data); 555 if (ret) 556 break; 557 } 558 mutex_unlock(&thermal_list_lock); 559 560 return ret; 561 } 562 563 struct thermal_zone_device *thermal_zone_get_by_id(int id) 564 { 565 struct thermal_zone_device *tz, *match = NULL; 566 567 mutex_lock(&thermal_list_lock); 568 list_for_each_entry(tz, &thermal_tz_list, node) { 569 if (tz->id == id) { 570 match = tz; 571 break; 572 } 573 } 574 mutex_unlock(&thermal_list_lock); 575 576 return match; 577 } 578 579 /* 580 * Device management section: cooling devices, zones devices, and binding 581 * 582 * Set of functions provided by the thermal core for: 583 * - cooling devices lifecycle: registration, unregistration, 584 * binding, and unbinding. 585 * - thermal zone devices lifecycle: registration, unregistration, 586 * binding, and unbinding. 587 */ 588 589 /** 590 * thermal_zone_bind_cooling_device() - bind a cooling device to a thermal zone 591 * @tz: pointer to struct thermal_zone_device 592 * @trip: indicates which trip point the cooling devices is 593 * associated with in this thermal zone. 594 * @cdev: pointer to struct thermal_cooling_device 595 * @upper: the Maximum cooling state for this trip point. 596 * THERMAL_NO_LIMIT means no upper limit, 597 * and the cooling device can be in max_state. 598 * @lower: the Minimum cooling state can be used for this trip point. 599 * THERMAL_NO_LIMIT means no lower limit, 600 * and the cooling device can be in cooling state 0. 601 * @weight: The weight of the cooling device to be bound to the 602 * thermal zone. Use THERMAL_WEIGHT_DEFAULT for the 603 * default value 604 * 605 * This interface function bind a thermal cooling device to the certain trip 606 * point of a thermal zone device. 607 * This function is usually called in the thermal zone device .bind callback. 608 * 609 * Return: 0 on success, the proper error value otherwise. 610 */ 611 int thermal_zone_bind_cooling_device(struct thermal_zone_device *tz, 612 int trip, 613 struct thermal_cooling_device *cdev, 614 unsigned long upper, unsigned long lower, 615 unsigned int weight) 616 { 617 struct thermal_instance *dev; 618 struct thermal_instance *pos; 619 struct thermal_zone_device *pos1; 620 struct thermal_cooling_device *pos2; 621 int result; 622 623 if (trip >= tz->num_trips || trip < 0) 624 return -EINVAL; 625 626 list_for_each_entry(pos1, &thermal_tz_list, node) { 627 if (pos1 == tz) 628 break; 629 } 630 list_for_each_entry(pos2, &thermal_cdev_list, node) { 631 if (pos2 == cdev) 632 break; 633 } 634 635 if (tz != pos1 || cdev != pos2) 636 return -EINVAL; 637 638 /* lower default 0, upper default max_state */ 639 lower = lower == THERMAL_NO_LIMIT ? 0 : lower; 640 upper = upper == THERMAL_NO_LIMIT ? cdev->max_state : upper; 641 642 if (lower > upper || upper > cdev->max_state) 643 return -EINVAL; 644 645 dev = kzalloc(sizeof(*dev), GFP_KERNEL); 646 if (!dev) 647 return -ENOMEM; 648 dev->tz = tz; 649 dev->cdev = cdev; 650 dev->trip = trip; 651 dev->upper = upper; 652 dev->lower = lower; 653 dev->target = THERMAL_NO_TARGET; 654 dev->weight = weight; 655 656 result = ida_alloc(&tz->ida, GFP_KERNEL); 657 if (result < 0) 658 goto free_mem; 659 660 dev->id = result; 661 sprintf(dev->name, "cdev%d", dev->id); 662 result = 663 sysfs_create_link(&tz->device.kobj, &cdev->device.kobj, dev->name); 664 if (result) 665 goto release_ida; 666 667 sprintf(dev->attr_name, "cdev%d_trip_point", dev->id); 668 sysfs_attr_init(&dev->attr.attr); 669 dev->attr.attr.name = dev->attr_name; 670 dev->attr.attr.mode = 0444; 671 dev->attr.show = trip_point_show; 672 result = device_create_file(&tz->device, &dev->attr); 673 if (result) 674 goto remove_symbol_link; 675 676 sprintf(dev->weight_attr_name, "cdev%d_weight", dev->id); 677 sysfs_attr_init(&dev->weight_attr.attr); 678 dev->weight_attr.attr.name = dev->weight_attr_name; 679 dev->weight_attr.attr.mode = S_IWUSR | S_IRUGO; 680 dev->weight_attr.show = weight_show; 681 dev->weight_attr.store = weight_store; 682 result = device_create_file(&tz->device, &dev->weight_attr); 683 if (result) 684 goto remove_trip_file; 685 686 mutex_lock(&tz->lock); 687 mutex_lock(&cdev->lock); 688 list_for_each_entry(pos, &tz->thermal_instances, tz_node) 689 if (pos->tz == tz && pos->trip == trip && pos->cdev == cdev) { 690 result = -EEXIST; 691 break; 692 } 693 if (!result) { 694 list_add_tail(&dev->tz_node, &tz->thermal_instances); 695 list_add_tail(&dev->cdev_node, &cdev->thermal_instances); 696 atomic_set(&tz->need_update, 1); 697 } 698 mutex_unlock(&cdev->lock); 699 mutex_unlock(&tz->lock); 700 701 if (!result) 702 return 0; 703 704 device_remove_file(&tz->device, &dev->weight_attr); 705 remove_trip_file: 706 device_remove_file(&tz->device, &dev->attr); 707 remove_symbol_link: 708 sysfs_remove_link(&tz->device.kobj, dev->name); 709 release_ida: 710 ida_free(&tz->ida, dev->id); 711 free_mem: 712 kfree(dev); 713 return result; 714 } 715 EXPORT_SYMBOL_GPL(thermal_zone_bind_cooling_device); 716 717 /** 718 * thermal_zone_unbind_cooling_device() - unbind a cooling device from a 719 * thermal zone. 720 * @tz: pointer to a struct thermal_zone_device. 721 * @trip: indicates which trip point the cooling devices is 722 * associated with in this thermal zone. 723 * @cdev: pointer to a struct thermal_cooling_device. 724 * 725 * This interface function unbind a thermal cooling device from the certain 726 * trip point of a thermal zone device. 727 * This function is usually called in the thermal zone device .unbind callback. 728 * 729 * Return: 0 on success, the proper error value otherwise. 730 */ 731 int thermal_zone_unbind_cooling_device(struct thermal_zone_device *tz, 732 int trip, 733 struct thermal_cooling_device *cdev) 734 { 735 struct thermal_instance *pos, *next; 736 737 mutex_lock(&tz->lock); 738 mutex_lock(&cdev->lock); 739 list_for_each_entry_safe(pos, next, &tz->thermal_instances, tz_node) { 740 if (pos->tz == tz && pos->trip == trip && pos->cdev == cdev) { 741 list_del(&pos->tz_node); 742 list_del(&pos->cdev_node); 743 mutex_unlock(&cdev->lock); 744 mutex_unlock(&tz->lock); 745 goto unbind; 746 } 747 } 748 mutex_unlock(&cdev->lock); 749 mutex_unlock(&tz->lock); 750 751 return -ENODEV; 752 753 unbind: 754 device_remove_file(&tz->device, &pos->weight_attr); 755 device_remove_file(&tz->device, &pos->attr); 756 sysfs_remove_link(&tz->device.kobj, pos->name); 757 ida_free(&tz->ida, pos->id); 758 kfree(pos); 759 return 0; 760 } 761 EXPORT_SYMBOL_GPL(thermal_zone_unbind_cooling_device); 762 763 static void thermal_release(struct device *dev) 764 { 765 struct thermal_zone_device *tz; 766 struct thermal_cooling_device *cdev; 767 768 if (!strncmp(dev_name(dev), "thermal_zone", 769 sizeof("thermal_zone") - 1)) { 770 tz = to_thermal_zone(dev); 771 thermal_zone_destroy_device_groups(tz); 772 mutex_destroy(&tz->lock); 773 kfree(tz); 774 } else if (!strncmp(dev_name(dev), "cooling_device", 775 sizeof("cooling_device") - 1)) { 776 cdev = to_cooling_device(dev); 777 kfree(cdev); 778 } 779 } 780 781 static struct class thermal_class = { 782 .name = "thermal", 783 .dev_release = thermal_release, 784 }; 785 786 static inline 787 void print_bind_err_msg(struct thermal_zone_device *tz, 788 struct thermal_cooling_device *cdev, int ret) 789 { 790 dev_err(&tz->device, "binding zone %s with cdev %s failed:%d\n", 791 tz->type, cdev->type, ret); 792 } 793 794 static void __bind(struct thermal_zone_device *tz, int mask, 795 struct thermal_cooling_device *cdev, 796 unsigned long *limits, 797 unsigned int weight) 798 { 799 int i, ret; 800 801 for (i = 0; i < tz->num_trips; i++) { 802 if (mask & (1 << i)) { 803 unsigned long upper, lower; 804 805 upper = THERMAL_NO_LIMIT; 806 lower = THERMAL_NO_LIMIT; 807 if (limits) { 808 lower = limits[i * 2]; 809 upper = limits[i * 2 + 1]; 810 } 811 ret = thermal_zone_bind_cooling_device(tz, i, cdev, 812 upper, lower, 813 weight); 814 if (ret) 815 print_bind_err_msg(tz, cdev, ret); 816 } 817 } 818 } 819 820 static void bind_cdev(struct thermal_cooling_device *cdev) 821 { 822 int i, ret; 823 const struct thermal_zone_params *tzp; 824 struct thermal_zone_device *pos = NULL; 825 826 mutex_lock(&thermal_list_lock); 827 828 list_for_each_entry(pos, &thermal_tz_list, node) { 829 if (!pos->tzp && !pos->ops->bind) 830 continue; 831 832 if (pos->ops->bind) { 833 ret = pos->ops->bind(pos, cdev); 834 if (ret) 835 print_bind_err_msg(pos, cdev, ret); 836 continue; 837 } 838 839 tzp = pos->tzp; 840 if (!tzp || !tzp->tbp) 841 continue; 842 843 for (i = 0; i < tzp->num_tbps; i++) { 844 if (tzp->tbp[i].cdev || !tzp->tbp[i].match) 845 continue; 846 if (tzp->tbp[i].match(pos, cdev)) 847 continue; 848 tzp->tbp[i].cdev = cdev; 849 __bind(pos, tzp->tbp[i].trip_mask, cdev, 850 tzp->tbp[i].binding_limits, 851 tzp->tbp[i].weight); 852 } 853 } 854 855 mutex_unlock(&thermal_list_lock); 856 } 857 858 /** 859 * __thermal_cooling_device_register() - register a new thermal cooling device 860 * @np: a pointer to a device tree node. 861 * @type: the thermal cooling device type. 862 * @devdata: device private data. 863 * @ops: standard thermal cooling devices callbacks. 864 * 865 * This interface function adds a new thermal cooling device (fan/processor/...) 866 * to /sys/class/thermal/ folder as cooling_device[0-*]. It tries to bind itself 867 * to all the thermal zone devices registered at the same time. 868 * It also gives the opportunity to link the cooling device to a device tree 869 * node, so that it can be bound to a thermal zone created out of device tree. 870 * 871 * Return: a pointer to the created struct thermal_cooling_device or an 872 * ERR_PTR. Caller must check return value with IS_ERR*() helpers. 873 */ 874 static struct thermal_cooling_device * 875 __thermal_cooling_device_register(struct device_node *np, 876 const char *type, void *devdata, 877 const struct thermal_cooling_device_ops *ops) 878 { 879 struct thermal_cooling_device *cdev; 880 struct thermal_zone_device *pos = NULL; 881 int id, ret; 882 883 if (!ops || !ops->get_max_state || !ops->get_cur_state || 884 !ops->set_cur_state) 885 return ERR_PTR(-EINVAL); 886 887 cdev = kzalloc(sizeof(*cdev), GFP_KERNEL); 888 if (!cdev) 889 return ERR_PTR(-ENOMEM); 890 891 ret = ida_alloc(&thermal_cdev_ida, GFP_KERNEL); 892 if (ret < 0) 893 goto out_kfree_cdev; 894 cdev->id = ret; 895 id = ret; 896 897 cdev->type = kstrdup(type ? type : "", GFP_KERNEL); 898 if (!cdev->type) { 899 ret = -ENOMEM; 900 goto out_ida_remove; 901 } 902 903 mutex_init(&cdev->lock); 904 INIT_LIST_HEAD(&cdev->thermal_instances); 905 cdev->np = np; 906 cdev->ops = ops; 907 cdev->updated = false; 908 cdev->device.class = &thermal_class; 909 cdev->devdata = devdata; 910 911 ret = cdev->ops->get_max_state(cdev, &cdev->max_state); 912 if (ret) { 913 kfree(cdev->type); 914 goto out_ida_remove; 915 } 916 917 thermal_cooling_device_setup_sysfs(cdev); 918 919 ret = dev_set_name(&cdev->device, "cooling_device%d", cdev->id); 920 if (ret) { 921 kfree(cdev->type); 922 thermal_cooling_device_destroy_sysfs(cdev); 923 goto out_ida_remove; 924 } 925 926 ret = device_register(&cdev->device); 927 if (ret) 928 goto out_kfree_type; 929 930 /* Add 'this' new cdev to the global cdev list */ 931 mutex_lock(&thermal_list_lock); 932 list_add(&cdev->node, &thermal_cdev_list); 933 mutex_unlock(&thermal_list_lock); 934 935 /* Update binding information for 'this' new cdev */ 936 bind_cdev(cdev); 937 938 mutex_lock(&thermal_list_lock); 939 list_for_each_entry(pos, &thermal_tz_list, node) 940 if (atomic_cmpxchg(&pos->need_update, 1, 0)) 941 thermal_zone_device_update(pos, 942 THERMAL_EVENT_UNSPECIFIED); 943 mutex_unlock(&thermal_list_lock); 944 945 return cdev; 946 947 out_kfree_type: 948 thermal_cooling_device_destroy_sysfs(cdev); 949 kfree(cdev->type); 950 put_device(&cdev->device); 951 952 /* thermal_release() takes care of the rest */ 953 cdev = NULL; 954 out_ida_remove: 955 ida_free(&thermal_cdev_ida, id); 956 out_kfree_cdev: 957 kfree(cdev); 958 return ERR_PTR(ret); 959 } 960 961 /** 962 * thermal_cooling_device_register() - register a new thermal cooling device 963 * @type: the thermal cooling device type. 964 * @devdata: device private data. 965 * @ops: standard thermal cooling devices callbacks. 966 * 967 * This interface function adds a new thermal cooling device (fan/processor/...) 968 * to /sys/class/thermal/ folder as cooling_device[0-*]. It tries to bind itself 969 * to all the thermal zone devices registered at the same time. 970 * 971 * Return: a pointer to the created struct thermal_cooling_device or an 972 * ERR_PTR. Caller must check return value with IS_ERR*() helpers. 973 */ 974 struct thermal_cooling_device * 975 thermal_cooling_device_register(const char *type, void *devdata, 976 const struct thermal_cooling_device_ops *ops) 977 { 978 return __thermal_cooling_device_register(NULL, type, devdata, ops); 979 } 980 EXPORT_SYMBOL_GPL(thermal_cooling_device_register); 981 982 /** 983 * thermal_of_cooling_device_register() - register an OF thermal cooling device 984 * @np: a pointer to a device tree node. 985 * @type: the thermal cooling device type. 986 * @devdata: device private data. 987 * @ops: standard thermal cooling devices callbacks. 988 * 989 * This function will register a cooling device with device tree node reference. 990 * This interface function adds a new thermal cooling device (fan/processor/...) 991 * to /sys/class/thermal/ folder as cooling_device[0-*]. It tries to bind itself 992 * to all the thermal zone devices registered at the same time. 993 * 994 * Return: a pointer to the created struct thermal_cooling_device or an 995 * ERR_PTR. Caller must check return value with IS_ERR*() helpers. 996 */ 997 struct thermal_cooling_device * 998 thermal_of_cooling_device_register(struct device_node *np, 999 const char *type, void *devdata, 1000 const struct thermal_cooling_device_ops *ops) 1001 { 1002 return __thermal_cooling_device_register(np, type, devdata, ops); 1003 } 1004 EXPORT_SYMBOL_GPL(thermal_of_cooling_device_register); 1005 1006 static void thermal_cooling_device_release(struct device *dev, void *res) 1007 { 1008 thermal_cooling_device_unregister( 1009 *(struct thermal_cooling_device **)res); 1010 } 1011 1012 /** 1013 * devm_thermal_of_cooling_device_register() - register an OF thermal cooling 1014 * device 1015 * @dev: a valid struct device pointer of a sensor device. 1016 * @np: a pointer to a device tree node. 1017 * @type: the thermal cooling device type. 1018 * @devdata: device private data. 1019 * @ops: standard thermal cooling devices callbacks. 1020 * 1021 * This function will register a cooling device with device tree node reference. 1022 * This interface function adds a new thermal cooling device (fan/processor/...) 1023 * to /sys/class/thermal/ folder as cooling_device[0-*]. It tries to bind itself 1024 * to all the thermal zone devices registered at the same time. 1025 * 1026 * Return: a pointer to the created struct thermal_cooling_device or an 1027 * ERR_PTR. Caller must check return value with IS_ERR*() helpers. 1028 */ 1029 struct thermal_cooling_device * 1030 devm_thermal_of_cooling_device_register(struct device *dev, 1031 struct device_node *np, 1032 char *type, void *devdata, 1033 const struct thermal_cooling_device_ops *ops) 1034 { 1035 struct thermal_cooling_device **ptr, *tcd; 1036 1037 ptr = devres_alloc(thermal_cooling_device_release, sizeof(*ptr), 1038 GFP_KERNEL); 1039 if (!ptr) 1040 return ERR_PTR(-ENOMEM); 1041 1042 tcd = __thermal_cooling_device_register(np, type, devdata, ops); 1043 if (IS_ERR(tcd)) { 1044 devres_free(ptr); 1045 return tcd; 1046 } 1047 1048 *ptr = tcd; 1049 devres_add(dev, ptr); 1050 1051 return tcd; 1052 } 1053 EXPORT_SYMBOL_GPL(devm_thermal_of_cooling_device_register); 1054 1055 static void __unbind(struct thermal_zone_device *tz, int mask, 1056 struct thermal_cooling_device *cdev) 1057 { 1058 int i; 1059 1060 for (i = 0; i < tz->num_trips; i++) 1061 if (mask & (1 << i)) 1062 thermal_zone_unbind_cooling_device(tz, i, cdev); 1063 } 1064 1065 /** 1066 * thermal_cooling_device_unregister - removes a thermal cooling device 1067 * @cdev: the thermal cooling device to remove. 1068 * 1069 * thermal_cooling_device_unregister() must be called when a registered 1070 * thermal cooling device is no longer needed. 1071 */ 1072 void thermal_cooling_device_unregister(struct thermal_cooling_device *cdev) 1073 { 1074 int i; 1075 const struct thermal_zone_params *tzp; 1076 struct thermal_zone_device *tz; 1077 struct thermal_cooling_device *pos = NULL; 1078 1079 if (!cdev) 1080 return; 1081 1082 mutex_lock(&thermal_list_lock); 1083 list_for_each_entry(pos, &thermal_cdev_list, node) 1084 if (pos == cdev) 1085 break; 1086 if (pos != cdev) { 1087 /* thermal cooling device not found */ 1088 mutex_unlock(&thermal_list_lock); 1089 return; 1090 } 1091 list_del(&cdev->node); 1092 1093 /* Unbind all thermal zones associated with 'this' cdev */ 1094 list_for_each_entry(tz, &thermal_tz_list, node) { 1095 if (tz->ops->unbind) { 1096 tz->ops->unbind(tz, cdev); 1097 continue; 1098 } 1099 1100 if (!tz->tzp || !tz->tzp->tbp) 1101 continue; 1102 1103 tzp = tz->tzp; 1104 for (i = 0; i < tzp->num_tbps; i++) { 1105 if (tzp->tbp[i].cdev == cdev) { 1106 __unbind(tz, tzp->tbp[i].trip_mask, cdev); 1107 tzp->tbp[i].cdev = NULL; 1108 } 1109 } 1110 } 1111 1112 mutex_unlock(&thermal_list_lock); 1113 1114 ida_free(&thermal_cdev_ida, cdev->id); 1115 device_del(&cdev->device); 1116 thermal_cooling_device_destroy_sysfs(cdev); 1117 kfree(cdev->type); 1118 put_device(&cdev->device); 1119 } 1120 EXPORT_SYMBOL_GPL(thermal_cooling_device_unregister); 1121 1122 static void bind_tz(struct thermal_zone_device *tz) 1123 { 1124 int i, ret; 1125 struct thermal_cooling_device *pos = NULL; 1126 const struct thermal_zone_params *tzp = tz->tzp; 1127 1128 if (!tzp && !tz->ops->bind) 1129 return; 1130 1131 mutex_lock(&thermal_list_lock); 1132 1133 /* If there is ops->bind, try to use ops->bind */ 1134 if (tz->ops->bind) { 1135 list_for_each_entry(pos, &thermal_cdev_list, node) { 1136 ret = tz->ops->bind(tz, pos); 1137 if (ret) 1138 print_bind_err_msg(tz, pos, ret); 1139 } 1140 goto exit; 1141 } 1142 1143 if (!tzp || !tzp->tbp) 1144 goto exit; 1145 1146 list_for_each_entry(pos, &thermal_cdev_list, node) { 1147 for (i = 0; i < tzp->num_tbps; i++) { 1148 if (tzp->tbp[i].cdev || !tzp->tbp[i].match) 1149 continue; 1150 if (tzp->tbp[i].match(tz, pos)) 1151 continue; 1152 tzp->tbp[i].cdev = pos; 1153 __bind(tz, tzp->tbp[i].trip_mask, pos, 1154 tzp->tbp[i].binding_limits, 1155 tzp->tbp[i].weight); 1156 } 1157 } 1158 exit: 1159 mutex_unlock(&thermal_list_lock); 1160 } 1161 1162 static void thermal_set_delay_jiffies(unsigned long *delay_jiffies, int delay_ms) 1163 { 1164 *delay_jiffies = msecs_to_jiffies(delay_ms); 1165 if (delay_ms > 1000) 1166 *delay_jiffies = round_jiffies(*delay_jiffies); 1167 } 1168 1169 /** 1170 * thermal_zone_device_register_with_trips() - register a new thermal zone device 1171 * @type: the thermal zone device type 1172 * @trips: a pointer to an array of thermal trips 1173 * @num_trips: the number of trip points the thermal zone support 1174 * @mask: a bit string indicating the writeablility of trip points 1175 * @devdata: private device data 1176 * @ops: standard thermal zone device callbacks 1177 * @tzp: thermal zone platform parameters 1178 * @passive_delay: number of milliseconds to wait between polls when 1179 * performing passive cooling 1180 * @polling_delay: number of milliseconds to wait between polls when checking 1181 * whether trip points have been crossed (0 for interrupt 1182 * driven systems) 1183 * 1184 * This interface function adds a new thermal zone device (sensor) to 1185 * /sys/class/thermal folder as thermal_zone[0-*]. It tries to bind all the 1186 * thermal cooling devices registered at the same time. 1187 * thermal_zone_device_unregister() must be called when the device is no 1188 * longer needed. The passive cooling depends on the .get_trend() return value. 1189 * 1190 * Return: a pointer to the created struct thermal_zone_device or an 1191 * in case of error, an ERR_PTR. Caller must check return value with 1192 * IS_ERR*() helpers. 1193 */ 1194 struct thermal_zone_device * 1195 thermal_zone_device_register_with_trips(const char *type, struct thermal_trip *trips, int num_trips, int mask, 1196 void *devdata, struct thermal_zone_device_ops *ops, 1197 struct thermal_zone_params *tzp, int passive_delay, 1198 int polling_delay) 1199 { 1200 struct thermal_zone_device *tz; 1201 enum thermal_trip_type trip_type; 1202 int trip_temp; 1203 int id; 1204 int result; 1205 int count; 1206 struct thermal_governor *governor; 1207 1208 if (!type || strlen(type) == 0) { 1209 pr_err("No thermal zone type defined\n"); 1210 return ERR_PTR(-EINVAL); 1211 } 1212 1213 if (strlen(type) >= THERMAL_NAME_LENGTH) { 1214 pr_err("Thermal zone name (%s) too long, should be under %d chars\n", 1215 type, THERMAL_NAME_LENGTH); 1216 return ERR_PTR(-EINVAL); 1217 } 1218 1219 /* 1220 * Max trip count can't exceed 31 as the "mask >> num_trips" condition. 1221 * For example, shifting by 32 will result in compiler warning: 1222 * warning: right shift count >= width of type [-Wshift-count- overflow] 1223 * 1224 * Also "mask >> num_trips" will always be true with 32 bit shift. 1225 * E.g. mask = 0x80000000 for trip id 31 to be RW. Then 1226 * mask >> 32 = 0x80000000 1227 * This will result in failure for the below condition. 1228 * 1229 * Check will be true when the bit 31 of the mask is set. 1230 * 32 bit shift will cause overflow of 4 byte integer. 1231 */ 1232 if (num_trips > (BITS_PER_TYPE(int) - 1) || num_trips < 0 || mask >> num_trips) { 1233 pr_err("Incorrect number of thermal trips\n"); 1234 return ERR_PTR(-EINVAL); 1235 } 1236 1237 if (!ops) { 1238 pr_err("Thermal zone device ops not defined\n"); 1239 return ERR_PTR(-EINVAL); 1240 } 1241 1242 if (num_trips > 0 && (!ops->get_trip_type || !ops->get_trip_temp)) 1243 return ERR_PTR(-EINVAL); 1244 1245 tz = kzalloc(sizeof(*tz), GFP_KERNEL); 1246 if (!tz) 1247 return ERR_PTR(-ENOMEM); 1248 1249 INIT_LIST_HEAD(&tz->thermal_instances); 1250 ida_init(&tz->ida); 1251 mutex_init(&tz->lock); 1252 id = ida_alloc(&thermal_tz_ida, GFP_KERNEL); 1253 if (id < 0) { 1254 result = id; 1255 goto free_tz; 1256 } 1257 1258 tz->id = id; 1259 strscpy(tz->type, type, sizeof(tz->type)); 1260 1261 if (!ops->critical) 1262 ops->critical = thermal_zone_device_critical; 1263 1264 tz->ops = ops; 1265 tz->tzp = tzp; 1266 tz->device.class = &thermal_class; 1267 tz->devdata = devdata; 1268 tz->trips = trips; 1269 tz->num_trips = num_trips; 1270 1271 thermal_set_delay_jiffies(&tz->passive_delay_jiffies, passive_delay); 1272 thermal_set_delay_jiffies(&tz->polling_delay_jiffies, polling_delay); 1273 1274 /* sys I/F */ 1275 /* Add nodes that are always present via .groups */ 1276 result = thermal_zone_create_device_groups(tz, mask); 1277 if (result) 1278 goto remove_id; 1279 1280 /* A new thermal zone needs to be updated anyway. */ 1281 atomic_set(&tz->need_update, 1); 1282 1283 result = dev_set_name(&tz->device, "thermal_zone%d", tz->id); 1284 if (result) { 1285 thermal_zone_destroy_device_groups(tz); 1286 goto remove_id; 1287 } 1288 result = device_register(&tz->device); 1289 if (result) 1290 goto release_device; 1291 1292 for (count = 0; count < num_trips; count++) { 1293 if (tz->ops->get_trip_type(tz, count, &trip_type) || 1294 tz->ops->get_trip_temp(tz, count, &trip_temp) || 1295 !trip_temp) 1296 set_bit(count, &tz->trips_disabled); 1297 } 1298 1299 /* Update 'this' zone's governor information */ 1300 mutex_lock(&thermal_governor_lock); 1301 1302 if (tz->tzp) 1303 governor = __find_governor(tz->tzp->governor_name); 1304 else 1305 governor = def_governor; 1306 1307 result = thermal_set_governor(tz, governor); 1308 if (result) { 1309 mutex_unlock(&thermal_governor_lock); 1310 goto unregister; 1311 } 1312 1313 mutex_unlock(&thermal_governor_lock); 1314 1315 if (!tz->tzp || !tz->tzp->no_hwmon) { 1316 result = thermal_add_hwmon_sysfs(tz); 1317 if (result) 1318 goto unregister; 1319 } 1320 1321 mutex_lock(&thermal_list_lock); 1322 list_add_tail(&tz->node, &thermal_tz_list); 1323 mutex_unlock(&thermal_list_lock); 1324 1325 /* Bind cooling devices for this zone */ 1326 bind_tz(tz); 1327 1328 INIT_DELAYED_WORK(&tz->poll_queue, thermal_zone_device_check); 1329 1330 thermal_zone_device_init(tz); 1331 /* Update the new thermal zone and mark it as already updated. */ 1332 if (atomic_cmpxchg(&tz->need_update, 1, 0)) 1333 thermal_zone_device_update(tz, THERMAL_EVENT_UNSPECIFIED); 1334 1335 thermal_notify_tz_create(tz->id, tz->type); 1336 1337 return tz; 1338 1339 unregister: 1340 device_del(&tz->device); 1341 release_device: 1342 put_device(&tz->device); 1343 tz = NULL; 1344 remove_id: 1345 ida_free(&thermal_tz_ida, id); 1346 free_tz: 1347 kfree(tz); 1348 return ERR_PTR(result); 1349 } 1350 EXPORT_SYMBOL_GPL(thermal_zone_device_register_with_trips); 1351 1352 struct thermal_zone_device *thermal_zone_device_register(const char *type, int ntrips, int mask, 1353 void *devdata, struct thermal_zone_device_ops *ops, 1354 struct thermal_zone_params *tzp, int passive_delay, 1355 int polling_delay) 1356 { 1357 return thermal_zone_device_register_with_trips(type, NULL, ntrips, mask, 1358 devdata, ops, tzp, 1359 passive_delay, polling_delay); 1360 } 1361 EXPORT_SYMBOL_GPL(thermal_zone_device_register); 1362 1363 /** 1364 * thermal_zone_device_unregister - removes the registered thermal zone device 1365 * @tz: the thermal zone device to remove 1366 */ 1367 void thermal_zone_device_unregister(struct thermal_zone_device *tz) 1368 { 1369 int i, tz_id; 1370 const struct thermal_zone_params *tzp; 1371 struct thermal_cooling_device *cdev; 1372 struct thermal_zone_device *pos = NULL; 1373 1374 if (!tz) 1375 return; 1376 1377 tzp = tz->tzp; 1378 tz_id = tz->id; 1379 1380 mutex_lock(&thermal_list_lock); 1381 list_for_each_entry(pos, &thermal_tz_list, node) 1382 if (pos == tz) 1383 break; 1384 if (pos != tz) { 1385 /* thermal zone device not found */ 1386 mutex_unlock(&thermal_list_lock); 1387 return; 1388 } 1389 list_del(&tz->node); 1390 1391 /* Unbind all cdevs associated with 'this' thermal zone */ 1392 list_for_each_entry(cdev, &thermal_cdev_list, node) { 1393 if (tz->ops->unbind) { 1394 tz->ops->unbind(tz, cdev); 1395 continue; 1396 } 1397 1398 if (!tzp || !tzp->tbp) 1399 break; 1400 1401 for (i = 0; i < tzp->num_tbps; i++) { 1402 if (tzp->tbp[i].cdev == cdev) { 1403 __unbind(tz, tzp->tbp[i].trip_mask, cdev); 1404 tzp->tbp[i].cdev = NULL; 1405 } 1406 } 1407 } 1408 1409 mutex_unlock(&thermal_list_lock); 1410 1411 cancel_delayed_work_sync(&tz->poll_queue); 1412 1413 thermal_set_governor(tz, NULL); 1414 1415 thermal_remove_hwmon_sysfs(tz); 1416 ida_free(&thermal_tz_ida, tz->id); 1417 ida_destroy(&tz->ida); 1418 1419 mutex_lock(&tz->lock); 1420 device_del(&tz->device); 1421 mutex_unlock(&tz->lock); 1422 1423 put_device(&tz->device); 1424 1425 thermal_notify_tz_delete(tz_id); 1426 } 1427 EXPORT_SYMBOL_GPL(thermal_zone_device_unregister); 1428 1429 /** 1430 * thermal_zone_get_zone_by_name() - search for a zone and returns its ref 1431 * @name: thermal zone name to fetch the temperature 1432 * 1433 * When only one zone is found with the passed name, returns a reference to it. 1434 * 1435 * Return: On success returns a reference to an unique thermal zone with 1436 * matching name equals to @name, an ERR_PTR otherwise (-EINVAL for invalid 1437 * paramenters, -ENODEV for not found and -EEXIST for multiple matches). 1438 */ 1439 struct 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 /* nothing has been found, thus an error code for it */ 1456 if (found == 0) 1457 ref = ERR_PTR(-ENODEV); 1458 else if (found > 1) 1459 /* Success only when an unique zone is found */ 1460 ref = ERR_PTR(-EEXIST); 1461 1462 exit: 1463 return ref; 1464 } 1465 EXPORT_SYMBOL_GPL(thermal_zone_get_zone_by_name); 1466 1467 static int thermal_pm_notify(struct notifier_block *nb, 1468 unsigned long mode, void *_unused) 1469 { 1470 struct thermal_zone_device *tz; 1471 1472 switch (mode) { 1473 case PM_HIBERNATION_PREPARE: 1474 case PM_RESTORE_PREPARE: 1475 case PM_SUSPEND_PREPARE: 1476 atomic_set(&in_suspend, 1); 1477 break; 1478 case PM_POST_HIBERNATION: 1479 case PM_POST_RESTORE: 1480 case PM_POST_SUSPEND: 1481 atomic_set(&in_suspend, 0); 1482 list_for_each_entry(tz, &thermal_tz_list, node) { 1483 thermal_zone_device_init(tz); 1484 thermal_zone_device_update(tz, 1485 THERMAL_EVENT_UNSPECIFIED); 1486 } 1487 break; 1488 default: 1489 break; 1490 } 1491 return 0; 1492 } 1493 1494 static struct notifier_block thermal_pm_nb = { 1495 .notifier_call = thermal_pm_notify, 1496 }; 1497 1498 static int __init thermal_init(void) 1499 { 1500 int result; 1501 1502 result = thermal_netlink_init(); 1503 if (result) 1504 goto error; 1505 1506 result = thermal_register_governors(); 1507 if (result) 1508 goto error; 1509 1510 result = class_register(&thermal_class); 1511 if (result) 1512 goto unregister_governors; 1513 1514 result = register_pm_notifier(&thermal_pm_nb); 1515 if (result) 1516 pr_warn("Thermal: Can not register suspend notifier, return %d\n", 1517 result); 1518 1519 return 0; 1520 1521 unregister_governors: 1522 thermal_unregister_governors(); 1523 error: 1524 ida_destroy(&thermal_tz_ida); 1525 ida_destroy(&thermal_cdev_ida); 1526 mutex_destroy(&thermal_list_lock); 1527 mutex_destroy(&thermal_governor_lock); 1528 return result; 1529 } 1530 postcore_initcall(thermal_init); 1531