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