linux/drivers/thermal/thermal_sys.c
<<
>>
Prefs
   1/*
   2 *  thermal.c - Generic Thermal Management Sysfs support.
   3 *
   4 *  Copyright (C) 2008 Intel Corp
   5 *  Copyright (C) 2008 Zhang Rui <rui.zhang@intel.com>
   6 *  Copyright (C) 2008 Sujith Thomas <sujith.thomas@intel.com>
   7 *
   8 *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   9 *
  10 *  This program is free software; you can redistribute it and/or modify
  11 *  it under the terms of the GNU General Public License as published by
  12 *  the Free Software Foundation; version 2 of the License.
  13 *
  14 *  This program is distributed in the hope that it will be useful, but
  15 *  WITHOUT ANY WARRANTY; without even the implied warranty of
  16 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  17 *  General Public License for more details.
  18 *
  19 *  You should have received a copy of the GNU General Public License along
  20 *  with this program; if not, write to the Free Software Foundation, Inc.,
  21 *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  22 *
  23 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  24 */
  25
  26#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  27
  28#include <linux/module.h>
  29#include <linux/device.h>
  30#include <linux/err.h>
  31#include <linux/slab.h>
  32#include <linux/kdev_t.h>
  33#include <linux/idr.h>
  34#include <linux/thermal.h>
  35#include <linux/reboot.h>
  36#include <net/netlink.h>
  37#include <net/genetlink.h>
  38
  39#include "thermal_core.h"
  40
  41MODULE_AUTHOR("Zhang Rui");
  42MODULE_DESCRIPTION("Generic thermal management sysfs support");
  43MODULE_LICENSE("GPL");
  44
  45static DEFINE_IDR(thermal_tz_idr);
  46static DEFINE_IDR(thermal_cdev_idr);
  47static DEFINE_MUTEX(thermal_idr_lock);
  48
  49static LIST_HEAD(thermal_tz_list);
  50static LIST_HEAD(thermal_cdev_list);
  51static LIST_HEAD(thermal_governor_list);
  52
  53static DEFINE_MUTEX(thermal_list_lock);
  54static DEFINE_MUTEX(thermal_governor_lock);
  55
  56static struct thermal_governor *__find_governor(const char *name)
  57{
  58        struct thermal_governor *pos;
  59
  60        list_for_each_entry(pos, &thermal_governor_list, governor_list)
  61                if (!strnicmp(name, pos->name, THERMAL_NAME_LENGTH))
  62                        return pos;
  63
  64        return NULL;
  65}
  66
  67int thermal_register_governor(struct thermal_governor *governor)
  68{
  69        int err;
  70        const char *name;
  71        struct thermal_zone_device *pos;
  72
  73        if (!governor)
  74                return -EINVAL;
  75
  76        mutex_lock(&thermal_governor_lock);
  77
  78        err = -EBUSY;
  79        if (__find_governor(governor->name) == NULL) {
  80                err = 0;
  81                list_add(&governor->governor_list, &thermal_governor_list);
  82        }
  83
  84        mutex_lock(&thermal_list_lock);
  85
  86        list_for_each_entry(pos, &thermal_tz_list, node) {
  87                if (pos->governor)
  88                        continue;
  89                if (pos->tzp)
  90                        name = pos->tzp->governor_name;
  91                else
  92                        name = DEFAULT_THERMAL_GOVERNOR;
  93                if (!strnicmp(name, governor->name, THERMAL_NAME_LENGTH))
  94                        pos->governor = governor;
  95        }
  96
  97        mutex_unlock(&thermal_list_lock);
  98        mutex_unlock(&thermal_governor_lock);
  99
 100        return err;
 101}
 102EXPORT_SYMBOL_GPL(thermal_register_governor);
 103
 104void thermal_unregister_governor(struct thermal_governor *governor)
 105{
 106        struct thermal_zone_device *pos;
 107
 108        if (!governor)
 109                return;
 110
 111        mutex_lock(&thermal_governor_lock);
 112
 113        if (__find_governor(governor->name) == NULL)
 114                goto exit;
 115
 116        mutex_lock(&thermal_list_lock);
 117
 118        list_for_each_entry(pos, &thermal_tz_list, node) {
 119                if (!strnicmp(pos->governor->name, governor->name,
 120                                                THERMAL_NAME_LENGTH))
 121                        pos->governor = NULL;
 122        }
 123
 124        mutex_unlock(&thermal_list_lock);
 125        list_del(&governor->governor_list);
 126exit:
 127        mutex_unlock(&thermal_governor_lock);
 128        return;
 129}
 130EXPORT_SYMBOL_GPL(thermal_unregister_governor);
 131
 132static int get_idr(struct idr *idr, struct mutex *lock, int *id)
 133{
 134        int ret;
 135
 136        if (lock)
 137                mutex_lock(lock);
 138        ret = idr_alloc(idr, NULL, 0, 0, GFP_KERNEL);
 139        if (lock)
 140                mutex_unlock(lock);
 141        if (unlikely(ret < 0))
 142                return ret;
 143        *id = ret;
 144        return 0;
 145}
 146
 147static void release_idr(struct idr *idr, struct mutex *lock, int id)
 148{
 149        if (lock)
 150                mutex_lock(lock);
 151        idr_remove(idr, id);
 152        if (lock)
 153                mutex_unlock(lock);
 154}
 155
 156int get_tz_trend(struct thermal_zone_device *tz, int trip)
 157{
 158        enum thermal_trend trend;
 159
 160        if (!tz->ops->get_trend || tz->ops->get_trend(tz, trip, &trend)) {
 161                if (tz->temperature > tz->last_temperature)
 162                        trend = THERMAL_TREND_RAISING;
 163                else if (tz->temperature < tz->last_temperature)
 164                        trend = THERMAL_TREND_DROPPING;
 165                else
 166                        trend = THERMAL_TREND_STABLE;
 167        }
 168
 169        return trend;
 170}
 171EXPORT_SYMBOL(get_tz_trend);
 172
 173struct thermal_instance *get_thermal_instance(struct thermal_zone_device *tz,
 174                        struct thermal_cooling_device *cdev, int trip)
 175{
 176        struct thermal_instance *pos = NULL;
 177        struct thermal_instance *target_instance = NULL;
 178
 179        mutex_lock(&tz->lock);
 180        mutex_lock(&cdev->lock);
 181
 182        list_for_each_entry(pos, &tz->thermal_instances, tz_node) {
 183                if (pos->tz == tz && pos->trip == trip && pos->cdev == cdev) {
 184                        target_instance = pos;
 185                        break;
 186                }
 187        }
 188
 189        mutex_unlock(&cdev->lock);
 190        mutex_unlock(&tz->lock);
 191
 192        return target_instance;
 193}
 194EXPORT_SYMBOL(get_thermal_instance);
 195
 196static void print_bind_err_msg(struct thermal_zone_device *tz,
 197                        struct thermal_cooling_device *cdev, int ret)
 198{
 199        dev_err(&tz->device, "binding zone %s with cdev %s failed:%d\n",
 200                                tz->type, cdev->type, ret);
 201}
 202
 203static void __bind(struct thermal_zone_device *tz, int mask,
 204                        struct thermal_cooling_device *cdev)
 205{
 206        int i, ret;
 207
 208        for (i = 0; i < tz->trips; i++) {
 209                if (mask & (1 << i)) {
 210                        ret = thermal_zone_bind_cooling_device(tz, i, cdev,
 211                                        THERMAL_NO_LIMIT, THERMAL_NO_LIMIT);
 212                        if (ret)
 213                                print_bind_err_msg(tz, cdev, ret);
 214                }
 215        }
 216}
 217
 218static void __unbind(struct thermal_zone_device *tz, int mask,
 219                        struct thermal_cooling_device *cdev)
 220{
 221        int i;
 222
 223        for (i = 0; i < tz->trips; i++)
 224                if (mask & (1 << i))
 225                        thermal_zone_unbind_cooling_device(tz, i, cdev);
 226}
 227
 228static void bind_cdev(struct thermal_cooling_device *cdev)
 229{
 230        int i, ret;
 231        const struct thermal_zone_params *tzp;
 232        struct thermal_zone_device *pos = NULL;
 233
 234        mutex_lock(&thermal_list_lock);
 235
 236        list_for_each_entry(pos, &thermal_tz_list, node) {
 237                if (!pos->tzp && !pos->ops->bind)
 238                        continue;
 239
 240                if (!pos->tzp && pos->ops->bind) {
 241                        ret = pos->ops->bind(pos, cdev);
 242                        if (ret)
 243                                print_bind_err_msg(pos, cdev, ret);
 244                }
 245
 246                tzp = pos->tzp;
 247                if (!tzp || !tzp->tbp)
 248                        continue;
 249
 250                for (i = 0; i < tzp->num_tbps; i++) {
 251                        if (tzp->tbp[i].cdev || !tzp->tbp[i].match)
 252                                continue;
 253                        if (tzp->tbp[i].match(pos, cdev))
 254                                continue;
 255                        tzp->tbp[i].cdev = cdev;
 256                        __bind(pos, tzp->tbp[i].trip_mask, cdev);
 257                }
 258        }
 259
 260        mutex_unlock(&thermal_list_lock);
 261}
 262
 263static void bind_tz(struct thermal_zone_device *tz)
 264{
 265        int i, ret;
 266        struct thermal_cooling_device *pos = NULL;
 267        const struct thermal_zone_params *tzp = tz->tzp;
 268
 269        if (!tzp && !tz->ops->bind)
 270                return;
 271
 272        mutex_lock(&thermal_list_lock);
 273
 274        /* If there is no platform data, try to use ops->bind */
 275        if (!tzp && tz->ops->bind) {
 276                list_for_each_entry(pos, &thermal_cdev_list, node) {
 277                        ret = tz->ops->bind(tz, pos);
 278                        if (ret)
 279                                print_bind_err_msg(tz, pos, ret);
 280                }
 281                goto exit;
 282        }
 283
 284        if (!tzp || !tzp->tbp)
 285                goto exit;
 286
 287        list_for_each_entry(pos, &thermal_cdev_list, node) {
 288                for (i = 0; i < tzp->num_tbps; i++) {
 289                        if (tzp->tbp[i].cdev || !tzp->tbp[i].match)
 290                                continue;
 291                        if (tzp->tbp[i].match(tz, pos))
 292                                continue;
 293                        tzp->tbp[i].cdev = pos;
 294                        __bind(tz, tzp->tbp[i].trip_mask, pos);
 295                }
 296        }
 297exit:
 298        mutex_unlock(&thermal_list_lock);
 299}
 300
 301static void thermal_zone_device_set_polling(struct thermal_zone_device *tz,
 302                                            int delay)
 303{
 304        if (delay > 1000)
 305                mod_delayed_work(system_freezable_wq, &tz->poll_queue,
 306                                 round_jiffies(msecs_to_jiffies(delay)));
 307        else if (delay)
 308                mod_delayed_work(system_freezable_wq, &tz->poll_queue,
 309                                 msecs_to_jiffies(delay));
 310        else
 311                cancel_delayed_work(&tz->poll_queue);
 312}
 313
 314static void monitor_thermal_zone(struct thermal_zone_device *tz)
 315{
 316        mutex_lock(&tz->lock);
 317
 318        if (tz->passive)
 319                thermal_zone_device_set_polling(tz, tz->passive_delay);
 320        else if (tz->polling_delay)
 321                thermal_zone_device_set_polling(tz, tz->polling_delay);
 322        else
 323                thermal_zone_device_set_polling(tz, 0);
 324
 325        mutex_unlock(&tz->lock);
 326}
 327
 328static void handle_non_critical_trips(struct thermal_zone_device *tz,
 329                        int trip, enum thermal_trip_type trip_type)
 330{
 331        if (tz->governor)
 332                tz->governor->throttle(tz, trip);
 333}
 334
 335static void handle_critical_trips(struct thermal_zone_device *tz,
 336                                int trip, enum thermal_trip_type trip_type)
 337{
 338        long trip_temp;
 339
 340        tz->ops->get_trip_temp(tz, trip, &trip_temp);
 341
 342        /* If we have not crossed the trip_temp, we do not care. */
 343        if (tz->temperature < trip_temp)
 344                return;
 345
 346        if (tz->ops->notify)
 347                tz->ops->notify(tz, trip, trip_type);
 348
 349        if (trip_type == THERMAL_TRIP_CRITICAL) {
 350                dev_emerg(&tz->device,
 351                          "critical temperature reached(%d C),shutting down\n",
 352                          tz->temperature / 1000);
 353                orderly_poweroff(true);
 354        }
 355}
 356
 357static void handle_thermal_trip(struct thermal_zone_device *tz, int trip)
 358{
 359        enum thermal_trip_type type;
 360
 361        tz->ops->get_trip_type(tz, trip, &type);
 362
 363        if (type == THERMAL_TRIP_CRITICAL || type == THERMAL_TRIP_HOT)
 364                handle_critical_trips(tz, trip, type);
 365        else
 366                handle_non_critical_trips(tz, trip, type);
 367        /*
 368         * Alright, we handled this trip successfully.
 369         * So, start monitoring again.
 370         */
 371        monitor_thermal_zone(tz);
 372}
 373
 374static int thermal_zone_get_temp(struct thermal_zone_device *tz,
 375                                unsigned long *temp)
 376{
 377        int ret = 0;
 378#ifdef CONFIG_THERMAL_EMULATION
 379        int count;
 380        unsigned long crit_temp = -1UL;
 381        enum thermal_trip_type type;
 382#endif
 383
 384        mutex_lock(&tz->lock);
 385
 386        ret = tz->ops->get_temp(tz, temp);
 387#ifdef CONFIG_THERMAL_EMULATION
 388        if (!tz->emul_temperature)
 389                goto skip_emul;
 390
 391        for (count = 0; count < tz->trips; count++) {
 392                ret = tz->ops->get_trip_type(tz, count, &type);
 393                if (!ret && type == THERMAL_TRIP_CRITICAL) {
 394                        ret = tz->ops->get_trip_temp(tz, count, &crit_temp);
 395                        break;
 396                }
 397        }
 398
 399        if (ret)
 400                goto skip_emul;
 401
 402        if (*temp < crit_temp)
 403                *temp = tz->emul_temperature;
 404skip_emul:
 405#endif
 406        mutex_unlock(&tz->lock);
 407        return ret;
 408}
 409
 410static void update_temperature(struct thermal_zone_device *tz)
 411{
 412        long temp;
 413        int ret;
 414
 415        ret = thermal_zone_get_temp(tz, &temp);
 416        if (ret) {
 417                dev_warn(&tz->device, "failed to read out thermal zone %d\n",
 418                         tz->id);
 419                return;
 420        }
 421
 422        mutex_lock(&tz->lock);
 423        tz->last_temperature = tz->temperature;
 424        tz->temperature = temp;
 425        mutex_unlock(&tz->lock);
 426}
 427
 428void thermal_zone_device_update(struct thermal_zone_device *tz)
 429{
 430        int count;
 431
 432        update_temperature(tz);
 433
 434        for (count = 0; count < tz->trips; count++)
 435                handle_thermal_trip(tz, count);
 436}
 437EXPORT_SYMBOL(thermal_zone_device_update);
 438
 439static void thermal_zone_device_check(struct work_struct *work)
 440{
 441        struct thermal_zone_device *tz = container_of(work, struct
 442                                                      thermal_zone_device,
 443                                                      poll_queue.work);
 444        thermal_zone_device_update(tz);
 445}
 446
 447/* sys I/F for thermal zone */
 448
 449#define to_thermal_zone(_dev) \
 450        container_of(_dev, struct thermal_zone_device, device)
 451
 452static ssize_t
 453type_show(struct device *dev, struct device_attribute *attr, char *buf)
 454{
 455        struct thermal_zone_device *tz = to_thermal_zone(dev);
 456
 457        return sprintf(buf, "%s\n", tz->type);
 458}
 459
 460static ssize_t
 461temp_show(struct device *dev, struct device_attribute *attr, char *buf)
 462{
 463        struct thermal_zone_device *tz = to_thermal_zone(dev);
 464        long temperature;
 465        int ret;
 466
 467        ret = thermal_zone_get_temp(tz, &temperature);
 468
 469        if (ret)
 470                return ret;
 471
 472        return sprintf(buf, "%ld\n", temperature);
 473}
 474
 475static ssize_t
 476mode_show(struct device *dev, struct device_attribute *attr, char *buf)
 477{
 478        struct thermal_zone_device *tz = to_thermal_zone(dev);
 479        enum thermal_device_mode mode;
 480        int result;
 481
 482        if (!tz->ops->get_mode)
 483                return -EPERM;
 484
 485        result = tz->ops->get_mode(tz, &mode);
 486        if (result)
 487                return result;
 488
 489        return sprintf(buf, "%s\n", mode == THERMAL_DEVICE_ENABLED ? "enabled"
 490                       : "disabled");
 491}
 492
 493static ssize_t
 494mode_store(struct device *dev, struct device_attribute *attr,
 495           const char *buf, size_t count)
 496{
 497        struct thermal_zone_device *tz = to_thermal_zone(dev);
 498        int result;
 499
 500        if (!tz->ops->set_mode)
 501                return -EPERM;
 502
 503        if (!strncmp(buf, "enabled", sizeof("enabled") - 1))
 504                result = tz->ops->set_mode(tz, THERMAL_DEVICE_ENABLED);
 505        else if (!strncmp(buf, "disabled", sizeof("disabled") - 1))
 506                result = tz->ops->set_mode(tz, THERMAL_DEVICE_DISABLED);
 507        else
 508                result = -EINVAL;
 509
 510        if (result)
 511                return result;
 512
 513        return count;
 514}
 515
 516static ssize_t
 517trip_point_type_show(struct device *dev, struct device_attribute *attr,
 518                     char *buf)
 519{
 520        struct thermal_zone_device *tz = to_thermal_zone(dev);
 521        enum thermal_trip_type type;
 522        int trip, result;
 523
 524        if (!tz->ops->get_trip_type)
 525                return -EPERM;
 526
 527        if (!sscanf(attr->attr.name, "trip_point_%d_type", &trip))
 528                return -EINVAL;
 529
 530        result = tz->ops->get_trip_type(tz, trip, &type);
 531        if (result)
 532                return result;
 533
 534        switch (type) {
 535        case THERMAL_TRIP_CRITICAL:
 536                return sprintf(buf, "critical\n");
 537        case THERMAL_TRIP_HOT:
 538                return sprintf(buf, "hot\n");
 539        case THERMAL_TRIP_PASSIVE:
 540                return sprintf(buf, "passive\n");
 541        case THERMAL_TRIP_ACTIVE:
 542                return sprintf(buf, "active\n");
 543        default:
 544                return sprintf(buf, "unknown\n");
 545        }
 546}
 547
 548static ssize_t
 549trip_point_temp_store(struct device *dev, struct device_attribute *attr,
 550                     const char *buf, size_t count)
 551{
 552        struct thermal_zone_device *tz = to_thermal_zone(dev);
 553        int trip, ret;
 554        unsigned long temperature;
 555
 556        if (!tz->ops->set_trip_temp)
 557                return -EPERM;
 558
 559        if (!sscanf(attr->attr.name, "trip_point_%d_temp", &trip))
 560                return -EINVAL;
 561
 562        if (kstrtoul(buf, 10, &temperature))
 563                return -EINVAL;
 564
 565        ret = tz->ops->set_trip_temp(tz, trip, temperature);
 566
 567        return ret ? ret : count;
 568}
 569
 570static ssize_t
 571trip_point_temp_show(struct device *dev, struct device_attribute *attr,
 572                     char *buf)
 573{
 574        struct thermal_zone_device *tz = to_thermal_zone(dev);
 575        int trip, ret;
 576        long temperature;
 577
 578        if (!tz->ops->get_trip_temp)
 579                return -EPERM;
 580
 581        if (!sscanf(attr->attr.name, "trip_point_%d_temp", &trip))
 582                return -EINVAL;
 583
 584        ret = tz->ops->get_trip_temp(tz, trip, &temperature);
 585
 586        if (ret)
 587                return ret;
 588
 589        return sprintf(buf, "%ld\n", temperature);
 590}
 591
 592static ssize_t
 593trip_point_hyst_store(struct device *dev, struct device_attribute *attr,
 594                        const char *buf, size_t count)
 595{
 596        struct thermal_zone_device *tz = to_thermal_zone(dev);
 597        int trip, ret;
 598        unsigned long temperature;
 599
 600        if (!tz->ops->set_trip_hyst)
 601                return -EPERM;
 602
 603        if (!sscanf(attr->attr.name, "trip_point_%d_hyst", &trip))
 604                return -EINVAL;
 605
 606        if (kstrtoul(buf, 10, &temperature))
 607                return -EINVAL;
 608
 609        /*
 610         * We are not doing any check on the 'temperature' value
 611         * here. The driver implementing 'set_trip_hyst' has to
 612         * take care of this.
 613         */
 614        ret = tz->ops->set_trip_hyst(tz, trip, temperature);
 615
 616        return ret ? ret : count;
 617}
 618
 619static ssize_t
 620trip_point_hyst_show(struct device *dev, struct device_attribute *attr,
 621                        char *buf)
 622{
 623        struct thermal_zone_device *tz = to_thermal_zone(dev);
 624        int trip, ret;
 625        unsigned long temperature;
 626
 627        if (!tz->ops->get_trip_hyst)
 628                return -EPERM;
 629
 630        if (!sscanf(attr->attr.name, "trip_point_%d_hyst", &trip))
 631                return -EINVAL;
 632
 633        ret = tz->ops->get_trip_hyst(tz, trip, &temperature);
 634
 635        return ret ? ret : sprintf(buf, "%ld\n", temperature);
 636}
 637
 638static ssize_t
 639passive_store(struct device *dev, struct device_attribute *attr,
 640                    const char *buf, size_t count)
 641{
 642        struct thermal_zone_device *tz = to_thermal_zone(dev);
 643        struct thermal_cooling_device *cdev = NULL;
 644        int state;
 645
 646        if (!sscanf(buf, "%d\n", &state))
 647                return -EINVAL;
 648
 649        /* sanity check: values below 1000 millicelcius don't make sense
 650         * and can cause the system to go into a thermal heart attack
 651         */
 652        if (state && state < 1000)
 653                return -EINVAL;
 654
 655        if (state && !tz->forced_passive) {
 656                mutex_lock(&thermal_list_lock);
 657                list_for_each_entry(cdev, &thermal_cdev_list, node) {
 658                        if (!strncmp("Processor", cdev->type,
 659                                     sizeof("Processor")))
 660                                thermal_zone_bind_cooling_device(tz,
 661                                                THERMAL_TRIPS_NONE, cdev,
 662                                                THERMAL_NO_LIMIT,
 663                                                THERMAL_NO_LIMIT);
 664                }
 665                mutex_unlock(&thermal_list_lock);
 666                if (!tz->passive_delay)
 667                        tz->passive_delay = 1000;
 668        } else if (!state && tz->forced_passive) {
 669                mutex_lock(&thermal_list_lock);
 670                list_for_each_entry(cdev, &thermal_cdev_list, node) {
 671                        if (!strncmp("Processor", cdev->type,
 672                                     sizeof("Processor")))
 673                                thermal_zone_unbind_cooling_device(tz,
 674                                                                   THERMAL_TRIPS_NONE,
 675                                                                   cdev);
 676                }
 677                mutex_unlock(&thermal_list_lock);
 678                tz->passive_delay = 0;
 679        }
 680
 681        tz->forced_passive = state;
 682
 683        thermal_zone_device_update(tz);
 684
 685        return count;
 686}
 687
 688static ssize_t
 689passive_show(struct device *dev, struct device_attribute *attr,
 690                   char *buf)
 691{
 692        struct thermal_zone_device *tz = to_thermal_zone(dev);
 693
 694        return sprintf(buf, "%d\n", tz->forced_passive);
 695}
 696
 697static ssize_t
 698policy_store(struct device *dev, struct device_attribute *attr,
 699                    const char *buf, size_t count)
 700{
 701        int ret = -EINVAL;
 702        struct thermal_zone_device *tz = to_thermal_zone(dev);
 703        struct thermal_governor *gov;
 704
 705        mutex_lock(&thermal_governor_lock);
 706
 707        gov = __find_governor(buf);
 708        if (!gov)
 709                goto exit;
 710
 711        tz->governor = gov;
 712        ret = count;
 713
 714exit:
 715        mutex_unlock(&thermal_governor_lock);
 716        return ret;
 717}
 718
 719static ssize_t
 720policy_show(struct device *dev, struct device_attribute *devattr, char *buf)
 721{
 722        struct thermal_zone_device *tz = to_thermal_zone(dev);
 723
 724        return sprintf(buf, "%s\n", tz->governor->name);
 725}
 726
 727#ifdef CONFIG_THERMAL_EMULATION
 728static ssize_t
 729emul_temp_store(struct device *dev, struct device_attribute *attr,
 730                     const char *buf, size_t count)
 731{
 732        struct thermal_zone_device *tz = to_thermal_zone(dev);
 733        int ret = 0;
 734        unsigned long temperature;
 735
 736        if (kstrtoul(buf, 10, &temperature))
 737                return -EINVAL;
 738
 739        if (!tz->ops->set_emul_temp) {
 740                mutex_lock(&tz->lock);
 741                tz->emul_temperature = temperature;
 742                mutex_unlock(&tz->lock);
 743        } else {
 744                ret = tz->ops->set_emul_temp(tz, temperature);
 745        }
 746
 747        return ret ? ret : count;
 748}
 749static DEVICE_ATTR(emul_temp, S_IWUSR, NULL, emul_temp_store);
 750#endif/*CONFIG_THERMAL_EMULATION*/
 751
 752static DEVICE_ATTR(type, 0444, type_show, NULL);
 753static DEVICE_ATTR(temp, 0444, temp_show, NULL);
 754static DEVICE_ATTR(mode, 0644, mode_show, mode_store);
 755static DEVICE_ATTR(passive, S_IRUGO | S_IWUSR, passive_show, passive_store);
 756static DEVICE_ATTR(policy, S_IRUGO | S_IWUSR, policy_show, policy_store);
 757
 758/* sys I/F for cooling device */
 759#define to_cooling_device(_dev) \
 760        container_of(_dev, struct thermal_cooling_device, device)
 761
 762static ssize_t
 763thermal_cooling_device_type_show(struct device *dev,
 764                                 struct device_attribute *attr, char *buf)
 765{
 766        struct thermal_cooling_device *cdev = to_cooling_device(dev);
 767
 768        return sprintf(buf, "%s\n", cdev->type);
 769}
 770
 771static ssize_t
 772thermal_cooling_device_max_state_show(struct device *dev,
 773                                      struct device_attribute *attr, char *buf)
 774{
 775        struct thermal_cooling_device *cdev = to_cooling_device(dev);
 776        unsigned long state;
 777        int ret;
 778
 779        ret = cdev->ops->get_max_state(cdev, &state);
 780        if (ret)
 781                return ret;
 782        return sprintf(buf, "%ld\n", state);
 783}
 784
 785static ssize_t
 786thermal_cooling_device_cur_state_show(struct device *dev,
 787                                      struct device_attribute *attr, char *buf)
 788{
 789        struct thermal_cooling_device *cdev = to_cooling_device(dev);
 790        unsigned long state;
 791        int ret;
 792
 793        ret = cdev->ops->get_cur_state(cdev, &state);
 794        if (ret)
 795                return ret;
 796        return sprintf(buf, "%ld\n", state);
 797}
 798
 799static ssize_t
 800thermal_cooling_device_cur_state_store(struct device *dev,
 801                                       struct device_attribute *attr,
 802                                       const char *buf, size_t count)
 803{
 804        struct thermal_cooling_device *cdev = to_cooling_device(dev);
 805        unsigned long state;
 806        int result;
 807
 808        if (!sscanf(buf, "%ld\n", &state))
 809                return -EINVAL;
 810
 811        if ((long)state < 0)
 812                return -EINVAL;
 813
 814        result = cdev->ops->set_cur_state(cdev, state);
 815        if (result)
 816                return result;
 817        return count;
 818}
 819
 820static struct device_attribute dev_attr_cdev_type =
 821__ATTR(type, 0444, thermal_cooling_device_type_show, NULL);
 822static DEVICE_ATTR(max_state, 0444,
 823                   thermal_cooling_device_max_state_show, NULL);
 824static DEVICE_ATTR(cur_state, 0644,
 825                   thermal_cooling_device_cur_state_show,
 826                   thermal_cooling_device_cur_state_store);
 827
 828static ssize_t
 829thermal_cooling_device_trip_point_show(struct device *dev,
 830                                       struct device_attribute *attr, char *buf)
 831{
 832        struct thermal_instance *instance;
 833
 834        instance =
 835            container_of(attr, struct thermal_instance, attr);
 836
 837        if (instance->trip == THERMAL_TRIPS_NONE)
 838                return sprintf(buf, "-1\n");
 839        else
 840                return sprintf(buf, "%d\n", instance->trip);
 841}
 842
 843/* Device management */
 844
 845#if defined(CONFIG_THERMAL_HWMON)
 846
 847/* hwmon sys I/F */
 848#include <linux/hwmon.h>
 849
 850/* thermal zone devices with the same type share one hwmon device */
 851struct thermal_hwmon_device {
 852        char type[THERMAL_NAME_LENGTH];
 853        struct device *device;
 854        int count;
 855        struct list_head tz_list;
 856        struct list_head node;
 857};
 858
 859struct thermal_hwmon_attr {
 860        struct device_attribute attr;
 861        char name[16];
 862};
 863
 864/* one temperature input for each thermal zone */
 865struct thermal_hwmon_temp {
 866        struct list_head hwmon_node;
 867        struct thermal_zone_device *tz;
 868        struct thermal_hwmon_attr temp_input;   /* hwmon sys attr */
 869        struct thermal_hwmon_attr temp_crit;    /* hwmon sys attr */
 870};
 871
 872static LIST_HEAD(thermal_hwmon_list);
 873
 874static ssize_t
 875name_show(struct device *dev, struct device_attribute *attr, char *buf)
 876{
 877        struct thermal_hwmon_device *hwmon = dev_get_drvdata(dev);
 878        return sprintf(buf, "%s\n", hwmon->type);
 879}
 880static DEVICE_ATTR(name, 0444, name_show, NULL);
 881
 882static ssize_t
 883temp_input_show(struct device *dev, struct device_attribute *attr, char *buf)
 884{
 885        long temperature;
 886        int ret;
 887        struct thermal_hwmon_attr *hwmon_attr
 888                        = container_of(attr, struct thermal_hwmon_attr, attr);
 889        struct thermal_hwmon_temp *temp
 890                        = container_of(hwmon_attr, struct thermal_hwmon_temp,
 891                                       temp_input);
 892        struct thermal_zone_device *tz = temp->tz;
 893
 894        ret = thermal_zone_get_temp(tz, &temperature);
 895
 896        if (ret)
 897                return ret;
 898
 899        return sprintf(buf, "%ld\n", temperature);
 900}
 901
 902static ssize_t
 903temp_crit_show(struct device *dev, struct device_attribute *attr,
 904                char *buf)
 905{
 906        struct thermal_hwmon_attr *hwmon_attr
 907                        = container_of(attr, struct thermal_hwmon_attr, attr);
 908        struct thermal_hwmon_temp *temp
 909                        = container_of(hwmon_attr, struct thermal_hwmon_temp,
 910                                       temp_crit);
 911        struct thermal_zone_device *tz = temp->tz;
 912        long temperature;
 913        int ret;
 914
 915        ret = tz->ops->get_trip_temp(tz, 0, &temperature);
 916        if (ret)
 917                return ret;
 918
 919        return sprintf(buf, "%ld\n", temperature);
 920}
 921
 922
 923static struct thermal_hwmon_device *
 924thermal_hwmon_lookup_by_type(const struct thermal_zone_device *tz)
 925{
 926        struct thermal_hwmon_device *hwmon;
 927
 928        mutex_lock(&thermal_list_lock);
 929        list_for_each_entry(hwmon, &thermal_hwmon_list, node)
 930                if (!strcmp(hwmon->type, tz->type)) {
 931                        mutex_unlock(&thermal_list_lock);
 932                        return hwmon;
 933                }
 934        mutex_unlock(&thermal_list_lock);
 935
 936        return NULL;
 937}
 938
 939/* Find the temperature input matching a given thermal zone */
 940static struct thermal_hwmon_temp *
 941thermal_hwmon_lookup_temp(const struct thermal_hwmon_device *hwmon,
 942                          const struct thermal_zone_device *tz)
 943{
 944        struct thermal_hwmon_temp *temp;
 945
 946        mutex_lock(&thermal_list_lock);
 947        list_for_each_entry(temp, &hwmon->tz_list, hwmon_node)
 948                if (temp->tz == tz) {
 949                        mutex_unlock(&thermal_list_lock);
 950                        return temp;
 951                }
 952        mutex_unlock(&thermal_list_lock);
 953
 954        return NULL;
 955}
 956
 957static int
 958thermal_add_hwmon_sysfs(struct thermal_zone_device *tz)
 959{
 960        struct thermal_hwmon_device *hwmon;
 961        struct thermal_hwmon_temp *temp;
 962        int new_hwmon_device = 1;
 963        int result;
 964
 965        hwmon = thermal_hwmon_lookup_by_type(tz);
 966        if (hwmon) {
 967                new_hwmon_device = 0;
 968                goto register_sys_interface;
 969        }
 970
 971        hwmon = kzalloc(sizeof(struct thermal_hwmon_device), GFP_KERNEL);
 972        if (!hwmon)
 973                return -ENOMEM;
 974
 975        INIT_LIST_HEAD(&hwmon->tz_list);
 976        strlcpy(hwmon->type, tz->type, THERMAL_NAME_LENGTH);
 977        hwmon->device = hwmon_device_register(NULL);
 978        if (IS_ERR(hwmon->device)) {
 979                result = PTR_ERR(hwmon->device);
 980                goto free_mem;
 981        }
 982        dev_set_drvdata(hwmon->device, hwmon);
 983        result = device_create_file(hwmon->device, &dev_attr_name);
 984        if (result)
 985                goto free_mem;
 986
 987 register_sys_interface:
 988        temp = kzalloc(sizeof(struct thermal_hwmon_temp), GFP_KERNEL);
 989        if (!temp) {
 990                result = -ENOMEM;
 991                goto unregister_name;
 992        }
 993
 994        temp->tz = tz;
 995        hwmon->count++;
 996
 997        snprintf(temp->temp_input.name, sizeof(temp->temp_input.name),
 998                 "temp%d_input", hwmon->count);
 999        temp->temp_input.attr.attr.name = temp->temp_input.name;
1000        temp->temp_input.attr.attr.mode = 0444;
1001        temp->temp_input.attr.show = temp_input_show;
1002        sysfs_attr_init(&temp->temp_input.attr.attr);
1003        result = device_create_file(hwmon->device, &temp->temp_input.attr);
1004        if (result)
1005                goto free_temp_mem;
1006
1007        if (tz->ops->get_crit_temp) {
1008                unsigned long temperature;
1009                if (!tz->ops->get_crit_temp(tz, &temperature)) {
1010                        snprintf(temp->temp_crit.name,
1011                                 sizeof(temp->temp_crit.name),
1012                                "temp%d_crit", hwmon->count);
1013                        temp->temp_crit.attr.attr.name = temp->temp_crit.name;
1014                        temp->temp_crit.attr.attr.mode = 0444;
1015                        temp->temp_crit.attr.show = temp_crit_show;
1016                        sysfs_attr_init(&temp->temp_crit.attr.attr);
1017                        result = device_create_file(hwmon->device,
1018                                                    &temp->temp_crit.attr);
1019                        if (result)
1020                                goto unregister_input;
1021                }
1022        }
1023
1024        mutex_lock(&thermal_list_lock);
1025        if (new_hwmon_device)
1026                list_add_tail(&hwmon->node, &thermal_hwmon_list);
1027        list_add_tail(&temp->hwmon_node, &hwmon->tz_list);
1028        mutex_unlock(&thermal_list_lock);
1029
1030        return 0;
1031
1032 unregister_input:
1033        device_remove_file(hwmon->device, &temp->temp_input.attr);
1034 free_temp_mem:
1035        kfree(temp);
1036 unregister_name:
1037        if (new_hwmon_device) {
1038                device_remove_file(hwmon->device, &dev_attr_name);
1039                hwmon_device_unregister(hwmon->device);
1040        }
1041 free_mem:
1042        if (new_hwmon_device)
1043                kfree(hwmon);
1044
1045        return result;
1046}
1047
1048static void
1049thermal_remove_hwmon_sysfs(struct thermal_zone_device *tz)
1050{
1051        struct thermal_hwmon_device *hwmon;
1052        struct thermal_hwmon_temp *temp;
1053
1054        hwmon = thermal_hwmon_lookup_by_type(tz);
1055        if (unlikely(!hwmon)) {
1056                /* Should never happen... */
1057                dev_dbg(&tz->device, "hwmon device lookup failed!\n");
1058                return;
1059        }
1060
1061        temp = thermal_hwmon_lookup_temp(hwmon, tz);
1062        if (unlikely(!temp)) {
1063                /* Should never happen... */
1064                dev_dbg(&tz->device, "temperature input lookup failed!\n");
1065                return;
1066        }
1067
1068        device_remove_file(hwmon->device, &temp->temp_input.attr);
1069        if (tz->ops->get_crit_temp)
1070                device_remove_file(hwmon->device, &temp->temp_crit.attr);
1071
1072        mutex_lock(&thermal_list_lock);
1073        list_del(&temp->hwmon_node);
1074        kfree(temp);
1075        if (!list_empty(&hwmon->tz_list)) {
1076                mutex_unlock(&thermal_list_lock);
1077                return;
1078        }
1079        list_del(&hwmon->node);
1080        mutex_unlock(&thermal_list_lock);
1081
1082        device_remove_file(hwmon->device, &dev_attr_name);
1083        hwmon_device_unregister(hwmon->device);
1084        kfree(hwmon);
1085}
1086#else
1087static int
1088thermal_add_hwmon_sysfs(struct thermal_zone_device *tz)
1089{
1090        return 0;
1091}
1092
1093static void
1094thermal_remove_hwmon_sysfs(struct thermal_zone_device *tz)
1095{
1096}
1097#endif
1098
1099/**
1100 * thermal_zone_bind_cooling_device - bind a cooling device to a thermal zone
1101 * @tz:         thermal zone device
1102 * @trip:       indicates which trip point the cooling devices is
1103 *              associated with in this thermal zone.
1104 * @cdev:       thermal cooling device
1105 *
1106 * This function is usually called in the thermal zone device .bind callback.
1107 */
1108int thermal_zone_bind_cooling_device(struct thermal_zone_device *tz,
1109                                     int trip,
1110                                     struct thermal_cooling_device *cdev,
1111                                     unsigned long upper, unsigned long lower)
1112{
1113        struct thermal_instance *dev;
1114        struct thermal_instance *pos;
1115        struct thermal_zone_device *pos1;
1116        struct thermal_cooling_device *pos2;
1117        unsigned long max_state;
1118        int result;
1119
1120        if (trip >= tz->trips || (trip < 0 && trip != THERMAL_TRIPS_NONE))
1121                return -EINVAL;
1122
1123        list_for_each_entry(pos1, &thermal_tz_list, node) {
1124                if (pos1 == tz)
1125                        break;
1126        }
1127        list_for_each_entry(pos2, &thermal_cdev_list, node) {
1128                if (pos2 == cdev)
1129                        break;
1130        }
1131
1132        if (tz != pos1 || cdev != pos2)
1133                return -EINVAL;
1134
1135        cdev->ops->get_max_state(cdev, &max_state);
1136
1137        /* lower default 0, upper default max_state */
1138        lower = lower == THERMAL_NO_LIMIT ? 0 : lower;
1139        upper = upper == THERMAL_NO_LIMIT ? max_state : upper;
1140
1141        if (lower > upper || upper > max_state)
1142                return -EINVAL;
1143
1144        dev =
1145            kzalloc(sizeof(struct thermal_instance), GFP_KERNEL);
1146        if (!dev)
1147                return -ENOMEM;
1148        dev->tz = tz;
1149        dev->cdev = cdev;
1150        dev->trip = trip;
1151        dev->upper = upper;
1152        dev->lower = lower;
1153        dev->target = THERMAL_NO_TARGET;
1154
1155        result = get_idr(&tz->idr, &tz->lock, &dev->id);
1156        if (result)
1157                goto free_mem;
1158
1159        sprintf(dev->name, "cdev%d", dev->id);
1160        result =
1161            sysfs_create_link(&tz->device.kobj, &cdev->device.kobj, dev->name);
1162        if (result)
1163                goto release_idr;
1164
1165        sprintf(dev->attr_name, "cdev%d_trip_point", dev->id);
1166        sysfs_attr_init(&dev->attr.attr);
1167        dev->attr.attr.name = dev->attr_name;
1168        dev->attr.attr.mode = 0444;
1169        dev->attr.show = thermal_cooling_device_trip_point_show;
1170        result = device_create_file(&tz->device, &dev->attr);
1171        if (result)
1172                goto remove_symbol_link;
1173
1174        mutex_lock(&tz->lock);
1175        mutex_lock(&cdev->lock);
1176        list_for_each_entry(pos, &tz->thermal_instances, tz_node)
1177            if (pos->tz == tz && pos->trip == trip && pos->cdev == cdev) {
1178                result = -EEXIST;
1179                break;
1180        }
1181        if (!result) {
1182                list_add_tail(&dev->tz_node, &tz->thermal_instances);
1183                list_add_tail(&dev->cdev_node, &cdev->thermal_instances);
1184        }
1185        mutex_unlock(&cdev->lock);
1186        mutex_unlock(&tz->lock);
1187
1188        if (!result)
1189                return 0;
1190
1191        device_remove_file(&tz->device, &dev->attr);
1192remove_symbol_link:
1193        sysfs_remove_link(&tz->device.kobj, dev->name);
1194release_idr:
1195        release_idr(&tz->idr, &tz->lock, dev->id);
1196free_mem:
1197        kfree(dev);
1198        return result;
1199}
1200EXPORT_SYMBOL(thermal_zone_bind_cooling_device);
1201
1202/**
1203 * thermal_zone_unbind_cooling_device - unbind a cooling device from a thermal zone
1204 * @tz:         thermal zone device
1205 * @trip:       indicates which trip point the cooling devices is
1206 *              associated with in this thermal zone.
1207 * @cdev:       thermal cooling device
1208 *
1209 * This function is usually called in the thermal zone device .unbind callback.
1210 */
1211int thermal_zone_unbind_cooling_device(struct thermal_zone_device *tz,
1212                                       int trip,
1213                                       struct thermal_cooling_device *cdev)
1214{
1215        struct thermal_instance *pos, *next;
1216
1217        mutex_lock(&tz->lock);
1218        mutex_lock(&cdev->lock);
1219        list_for_each_entry_safe(pos, next, &tz->thermal_instances, tz_node) {
1220                if (pos->tz == tz && pos->trip == trip && pos->cdev == cdev) {
1221                        list_del(&pos->tz_node);
1222                        list_del(&pos->cdev_node);
1223                        mutex_unlock(&cdev->lock);
1224                        mutex_unlock(&tz->lock);
1225                        goto unbind;
1226                }
1227        }
1228        mutex_unlock(&cdev->lock);
1229        mutex_unlock(&tz->lock);
1230
1231        return -ENODEV;
1232
1233unbind:
1234        device_remove_file(&tz->device, &pos->attr);
1235        sysfs_remove_link(&tz->device.kobj, pos->name);
1236        release_idr(&tz->idr, &tz->lock, pos->id);
1237        kfree(pos);
1238        return 0;
1239}
1240EXPORT_SYMBOL(thermal_zone_unbind_cooling_device);
1241
1242static void thermal_release(struct device *dev)
1243{
1244        struct thermal_zone_device *tz;
1245        struct thermal_cooling_device *cdev;
1246
1247        if (!strncmp(dev_name(dev), "thermal_zone",
1248                     sizeof("thermal_zone") - 1)) {
1249                tz = to_thermal_zone(dev);
1250                kfree(tz);
1251        } else {
1252                cdev = to_cooling_device(dev);
1253                kfree(cdev);
1254        }
1255}
1256
1257static struct class thermal_class = {
1258        .name = "thermal",
1259        .dev_release = thermal_release,
1260};
1261
1262/**
1263 * thermal_cooling_device_register - register a new thermal cooling device
1264 * @type:       the thermal cooling device type.
1265 * @devdata:    device private data.
1266 * @ops:                standard thermal cooling devices callbacks.
1267 */
1268struct thermal_cooling_device *
1269thermal_cooling_device_register(char *type, void *devdata,
1270                                const struct thermal_cooling_device_ops *ops)
1271{
1272        struct thermal_cooling_device *cdev;
1273        int result;
1274
1275        if (type && strlen(type) >= THERMAL_NAME_LENGTH)
1276                return ERR_PTR(-EINVAL);
1277
1278        if (!ops || !ops->get_max_state || !ops->get_cur_state ||
1279            !ops->set_cur_state)
1280                return ERR_PTR(-EINVAL);
1281
1282        cdev = kzalloc(sizeof(struct thermal_cooling_device), GFP_KERNEL);
1283        if (!cdev)
1284                return ERR_PTR(-ENOMEM);
1285
1286        result = get_idr(&thermal_cdev_idr, &thermal_idr_lock, &cdev->id);
1287        if (result) {
1288                kfree(cdev);
1289                return ERR_PTR(result);
1290        }
1291
1292        strcpy(cdev->type, type ? : "");
1293        mutex_init(&cdev->lock);
1294        INIT_LIST_HEAD(&cdev->thermal_instances);
1295        cdev->ops = ops;
1296        cdev->updated = true;
1297        cdev->device.class = &thermal_class;
1298        cdev->devdata = devdata;
1299        dev_set_name(&cdev->device, "cooling_device%d", cdev->id);
1300        result = device_register(&cdev->device);
1301        if (result) {
1302                release_idr(&thermal_cdev_idr, &thermal_idr_lock, cdev->id);
1303                kfree(cdev);
1304                return ERR_PTR(result);
1305        }
1306
1307        /* sys I/F */
1308        if (type) {
1309                result = device_create_file(&cdev->device, &dev_attr_cdev_type);
1310                if (result)
1311                        goto unregister;
1312        }
1313
1314        result = device_create_file(&cdev->device, &dev_attr_max_state);
1315        if (result)
1316                goto unregister;
1317
1318        result = device_create_file(&cdev->device, &dev_attr_cur_state);
1319        if (result)
1320                goto unregister;
1321
1322        /* Add 'this' new cdev to the global cdev list */
1323        mutex_lock(&thermal_list_lock);
1324        list_add(&cdev->node, &thermal_cdev_list);
1325        mutex_unlock(&thermal_list_lock);
1326
1327        /* Update binding information for 'this' new cdev */
1328        bind_cdev(cdev);
1329
1330        return cdev;
1331
1332unregister:
1333        release_idr(&thermal_cdev_idr, &thermal_idr_lock, cdev->id);
1334        device_unregister(&cdev->device);
1335        return ERR_PTR(result);
1336}
1337EXPORT_SYMBOL(thermal_cooling_device_register);
1338
1339/**
1340 * thermal_cooling_device_unregister - removes the registered thermal cooling device
1341 * @cdev:       the thermal cooling device to remove.
1342 *
1343 * thermal_cooling_device_unregister() must be called when the device is no
1344 * longer needed.
1345 */
1346void thermal_cooling_device_unregister(struct thermal_cooling_device *cdev)
1347{
1348        int i;
1349        const struct thermal_zone_params *tzp;
1350        struct thermal_zone_device *tz;
1351        struct thermal_cooling_device *pos = NULL;
1352
1353        if (!cdev)
1354                return;
1355
1356        mutex_lock(&thermal_list_lock);
1357        list_for_each_entry(pos, &thermal_cdev_list, node)
1358            if (pos == cdev)
1359                break;
1360        if (pos != cdev) {
1361                /* thermal cooling device not found */
1362                mutex_unlock(&thermal_list_lock);
1363                return;
1364        }
1365        list_del(&cdev->node);
1366
1367        /* Unbind all thermal zones associated with 'this' cdev */
1368        list_for_each_entry(tz, &thermal_tz_list, node) {
1369                if (tz->ops->unbind) {
1370                        tz->ops->unbind(tz, cdev);
1371                        continue;
1372                }
1373
1374                if (!tz->tzp || !tz->tzp->tbp)
1375                        continue;
1376
1377                tzp = tz->tzp;
1378                for (i = 0; i < tzp->num_tbps; i++) {
1379                        if (tzp->tbp[i].cdev == cdev) {
1380                                __unbind(tz, tzp->tbp[i].trip_mask, cdev);
1381                                tzp->tbp[i].cdev = NULL;
1382                        }
1383                }
1384        }
1385
1386        mutex_unlock(&thermal_list_lock);
1387
1388        if (cdev->type[0])
1389                device_remove_file(&cdev->device, &dev_attr_cdev_type);
1390        device_remove_file(&cdev->device, &dev_attr_max_state);
1391        device_remove_file(&cdev->device, &dev_attr_cur_state);
1392
1393        release_idr(&thermal_cdev_idr, &thermal_idr_lock, cdev->id);
1394        device_unregister(&cdev->device);
1395        return;
1396}
1397EXPORT_SYMBOL(thermal_cooling_device_unregister);
1398
1399void thermal_cdev_update(struct thermal_cooling_device *cdev)
1400{
1401        struct thermal_instance *instance;
1402        unsigned long target = 0;
1403
1404        /* cooling device is updated*/
1405        if (cdev->updated)
1406                return;
1407
1408        mutex_lock(&cdev->lock);
1409        /* Make sure cdev enters the deepest cooling state */
1410        list_for_each_entry(instance, &cdev->thermal_instances, cdev_node) {
1411                if (instance->target == THERMAL_NO_TARGET)
1412                        continue;
1413                if (instance->target > target)
1414                        target = instance->target;
1415        }
1416        mutex_unlock(&cdev->lock);
1417        cdev->ops->set_cur_state(cdev, target);
1418        cdev->updated = true;
1419}
1420EXPORT_SYMBOL(thermal_cdev_update);
1421
1422/**
1423 * notify_thermal_framework - Sensor drivers use this API to notify framework
1424 * @tz:         thermal zone device
1425 * @trip:       indicates which trip point has been crossed
1426 *
1427 * This function handles the trip events from sensor drivers. It starts
1428 * throttling the cooling devices according to the policy configured.
1429 * For CRITICAL and HOT trip points, this notifies the respective drivers,
1430 * and does actual throttling for other trip points i.e ACTIVE and PASSIVE.
1431 * The throttling policy is based on the configured platform data; if no
1432 * platform data is provided, this uses the step_wise throttling policy.
1433 */
1434void notify_thermal_framework(struct thermal_zone_device *tz, int trip)
1435{
1436        handle_thermal_trip(tz, trip);
1437}
1438EXPORT_SYMBOL(notify_thermal_framework);
1439
1440/**
1441 * create_trip_attrs - create attributes for trip points
1442 * @tz:         the thermal zone device
1443 * @mask:       Writeable trip point bitmap.
1444 */
1445static int create_trip_attrs(struct thermal_zone_device *tz, int mask)
1446{
1447        int indx;
1448        int size = sizeof(struct thermal_attr) * tz->trips;
1449
1450        tz->trip_type_attrs = kzalloc(size, GFP_KERNEL);
1451        if (!tz->trip_type_attrs)
1452                return -ENOMEM;
1453
1454        tz->trip_temp_attrs = kzalloc(size, GFP_KERNEL);
1455        if (!tz->trip_temp_attrs) {
1456                kfree(tz->trip_type_attrs);
1457                return -ENOMEM;
1458        }
1459
1460        if (tz->ops->get_trip_hyst) {
1461                tz->trip_hyst_attrs = kzalloc(size, GFP_KERNEL);
1462                if (!tz->trip_hyst_attrs) {
1463                        kfree(tz->trip_type_attrs);
1464                        kfree(tz->trip_temp_attrs);
1465                        return -ENOMEM;
1466                }
1467        }
1468
1469
1470        for (indx = 0; indx < tz->trips; indx++) {
1471                /* create trip type attribute */
1472                snprintf(tz->trip_type_attrs[indx].name, THERMAL_NAME_LENGTH,
1473                         "trip_point_%d_type", indx);
1474
1475                sysfs_attr_init(&tz->trip_type_attrs[indx].attr.attr);
1476                tz->trip_type_attrs[indx].attr.attr.name =
1477                                                tz->trip_type_attrs[indx].name;
1478                tz->trip_type_attrs[indx].attr.attr.mode = S_IRUGO;
1479                tz->trip_type_attrs[indx].attr.show = trip_point_type_show;
1480
1481                device_create_file(&tz->device,
1482                                   &tz->trip_type_attrs[indx].attr);
1483
1484                /* create trip temp attribute */
1485                snprintf(tz->trip_temp_attrs[indx].name, THERMAL_NAME_LENGTH,
1486                         "trip_point_%d_temp", indx);
1487
1488                sysfs_attr_init(&tz->trip_temp_attrs[indx].attr.attr);
1489                tz->trip_temp_attrs[indx].attr.attr.name =
1490                                                tz->trip_temp_attrs[indx].name;
1491                tz->trip_temp_attrs[indx].attr.attr.mode = S_IRUGO;
1492                tz->trip_temp_attrs[indx].attr.show = trip_point_temp_show;
1493                if (mask & (1 << indx)) {
1494                        tz->trip_temp_attrs[indx].attr.attr.mode |= S_IWUSR;
1495                        tz->trip_temp_attrs[indx].attr.store =
1496                                                        trip_point_temp_store;
1497                }
1498
1499                device_create_file(&tz->device,
1500                                   &tz->trip_temp_attrs[indx].attr);
1501
1502                /* create Optional trip hyst attribute */
1503                if (!tz->ops->get_trip_hyst)
1504                        continue;
1505                snprintf(tz->trip_hyst_attrs[indx].name, THERMAL_NAME_LENGTH,
1506                         "trip_point_%d_hyst", indx);
1507
1508                sysfs_attr_init(&tz->trip_hyst_attrs[indx].attr.attr);
1509                tz->trip_hyst_attrs[indx].attr.attr.name =
1510                                        tz->trip_hyst_attrs[indx].name;
1511                tz->trip_hyst_attrs[indx].attr.attr.mode = S_IRUGO;
1512                tz->trip_hyst_attrs[indx].attr.show = trip_point_hyst_show;
1513                if (tz->ops->set_trip_hyst) {
1514                        tz->trip_hyst_attrs[indx].attr.attr.mode |= S_IWUSR;
1515                        tz->trip_hyst_attrs[indx].attr.store =
1516                                        trip_point_hyst_store;
1517                }
1518
1519                device_create_file(&tz->device,
1520                                   &tz->trip_hyst_attrs[indx].attr);
1521        }
1522        return 0;
1523}
1524
1525static void remove_trip_attrs(struct thermal_zone_device *tz)
1526{
1527        int indx;
1528
1529        for (indx = 0; indx < tz->trips; indx++) {
1530                device_remove_file(&tz->device,
1531                                   &tz->trip_type_attrs[indx].attr);
1532                device_remove_file(&tz->device,
1533                                   &tz->trip_temp_attrs[indx].attr);
1534                if (tz->ops->get_trip_hyst)
1535                        device_remove_file(&tz->device,
1536                                  &tz->trip_hyst_attrs[indx].attr);
1537        }
1538        kfree(tz->trip_type_attrs);
1539        kfree(tz->trip_temp_attrs);
1540        kfree(tz->trip_hyst_attrs);
1541}
1542
1543/**
1544 * thermal_zone_device_register - register a new thermal zone device
1545 * @type:       the thermal zone device type
1546 * @trips:      the number of trip points the thermal zone support
1547 * @mask:       a bit string indicating the writeablility of trip points
1548 * @devdata:    private device data
1549 * @ops:        standard thermal zone device callbacks
1550 * @tzp:        thermal zone platform parameters
1551 * @passive_delay: number of milliseconds to wait between polls when
1552 *                 performing passive cooling
1553 * @polling_delay: number of milliseconds to wait between polls when checking
1554 *                 whether trip points have been crossed (0 for interrupt
1555 *                 driven systems)
1556 *
1557 * thermal_zone_device_unregister() must be called when the device is no
1558 * longer needed. The passive cooling depends on the .get_trend() return value.
1559 */
1560struct thermal_zone_device *thermal_zone_device_register(const char *type,
1561        int trips, int mask, void *devdata,
1562        const struct thermal_zone_device_ops *ops,
1563        const struct thermal_zone_params *tzp,
1564        int passive_delay, int polling_delay)
1565{
1566        struct thermal_zone_device *tz;
1567        enum thermal_trip_type trip_type;
1568        int result;
1569        int count;
1570        int passive = 0;
1571
1572        if (type && strlen(type) >= THERMAL_NAME_LENGTH)
1573                return ERR_PTR(-EINVAL);
1574
1575        if (trips > THERMAL_MAX_TRIPS || trips < 0 || mask >> trips)
1576                return ERR_PTR(-EINVAL);
1577
1578        if (!ops || !ops->get_temp)
1579                return ERR_PTR(-EINVAL);
1580
1581        if (trips > 0 && !ops->get_trip_type)
1582                return ERR_PTR(-EINVAL);
1583
1584        tz = kzalloc(sizeof(struct thermal_zone_device), GFP_KERNEL);
1585        if (!tz)
1586                return ERR_PTR(-ENOMEM);
1587
1588        INIT_LIST_HEAD(&tz->thermal_instances);
1589        idr_init(&tz->idr);
1590        mutex_init(&tz->lock);
1591        result = get_idr(&thermal_tz_idr, &thermal_idr_lock, &tz->id);
1592        if (result) {
1593                kfree(tz);
1594                return ERR_PTR(result);
1595        }
1596
1597        strcpy(tz->type, type ? : "");
1598        tz->ops = ops;
1599        tz->tzp = tzp;
1600        tz->device.class = &thermal_class;
1601        tz->devdata = devdata;
1602        tz->trips = trips;
1603        tz->passive_delay = passive_delay;
1604        tz->polling_delay = polling_delay;
1605
1606        dev_set_name(&tz->device, "thermal_zone%d", tz->id);
1607        result = device_register(&tz->device);
1608        if (result) {
1609                release_idr(&thermal_tz_idr, &thermal_idr_lock, tz->id);
1610                kfree(tz);
1611                return ERR_PTR(result);
1612        }
1613
1614        /* sys I/F */
1615        if (type) {
1616                result = device_create_file(&tz->device, &dev_attr_type);
1617                if (result)
1618                        goto unregister;
1619        }
1620
1621        result = device_create_file(&tz->device, &dev_attr_temp);
1622        if (result)
1623                goto unregister;
1624
1625        if (ops->get_mode) {
1626                result = device_create_file(&tz->device, &dev_attr_mode);
1627                if (result)
1628                        goto unregister;
1629        }
1630
1631        result = create_trip_attrs(tz, mask);
1632        if (result)
1633                goto unregister;
1634
1635        for (count = 0; count < trips; count++) {
1636                tz->ops->get_trip_type(tz, count, &trip_type);
1637                if (trip_type == THERMAL_TRIP_PASSIVE)
1638                        passive = 1;
1639        }
1640
1641        if (!passive) {
1642                result = device_create_file(&tz->device, &dev_attr_passive);
1643                if (result)
1644                        goto unregister;
1645        }
1646
1647#ifdef CONFIG_THERMAL_EMULATION
1648        result = device_create_file(&tz->device, &dev_attr_emul_temp);
1649        if (result)
1650                goto unregister;
1651#endif
1652        /* Create policy attribute */
1653        result = device_create_file(&tz->device, &dev_attr_policy);
1654        if (result)
1655                goto unregister;
1656
1657        /* Update 'this' zone's governor information */
1658        mutex_lock(&thermal_governor_lock);
1659
1660        if (tz->tzp)
1661                tz->governor = __find_governor(tz->tzp->governor_name);
1662        else
1663                tz->governor = __find_governor(DEFAULT_THERMAL_GOVERNOR);
1664
1665        mutex_unlock(&thermal_governor_lock);
1666
1667        result = thermal_add_hwmon_sysfs(tz);
1668        if (result)
1669                goto unregister;
1670
1671        mutex_lock(&thermal_list_lock);
1672        list_add_tail(&tz->node, &thermal_tz_list);
1673        mutex_unlock(&thermal_list_lock);
1674
1675        /* Bind cooling devices for this zone */
1676        bind_tz(tz);
1677
1678        INIT_DELAYED_WORK(&(tz->poll_queue), thermal_zone_device_check);
1679
1680        thermal_zone_device_update(tz);
1681
1682        if (!result)
1683                return tz;
1684
1685unregister:
1686        release_idr(&thermal_tz_idr, &thermal_idr_lock, tz->id);
1687        device_unregister(&tz->device);
1688        return ERR_PTR(result);
1689}
1690EXPORT_SYMBOL(thermal_zone_device_register);
1691
1692/**
1693 * thermal_device_unregister - removes the registered thermal zone device
1694 * @tz: the thermal zone device to remove
1695 */
1696void thermal_zone_device_unregister(struct thermal_zone_device *tz)
1697{
1698        int i;
1699        const struct thermal_zone_params *tzp;
1700        struct thermal_cooling_device *cdev;
1701        struct thermal_zone_device *pos = NULL;
1702
1703        if (!tz)
1704                return;
1705
1706        tzp = tz->tzp;
1707
1708        mutex_lock(&thermal_list_lock);
1709        list_for_each_entry(pos, &thermal_tz_list, node)
1710            if (pos == tz)
1711                break;
1712        if (pos != tz) {
1713                /* thermal zone device not found */
1714                mutex_unlock(&thermal_list_lock);
1715                return;
1716        }
1717        list_del(&tz->node);
1718
1719        /* Unbind all cdevs associated with 'this' thermal zone */
1720        list_for_each_entry(cdev, &thermal_cdev_list, node) {
1721                if (tz->ops->unbind) {
1722                        tz->ops->unbind(tz, cdev);
1723                        continue;
1724                }
1725
1726                if (!tzp || !tzp->tbp)
1727                        break;
1728
1729                for (i = 0; i < tzp->num_tbps; i++) {
1730                        if (tzp->tbp[i].cdev == cdev) {
1731                                __unbind(tz, tzp->tbp[i].trip_mask, cdev);
1732                                tzp->tbp[i].cdev = NULL;
1733                        }
1734                }
1735        }
1736
1737        mutex_unlock(&thermal_list_lock);
1738
1739        thermal_zone_device_set_polling(tz, 0);
1740
1741        if (tz->type[0])
1742                device_remove_file(&tz->device, &dev_attr_type);
1743        device_remove_file(&tz->device, &dev_attr_temp);
1744        if (tz->ops->get_mode)
1745                device_remove_file(&tz->device, &dev_attr_mode);
1746        device_remove_file(&tz->device, &dev_attr_policy);
1747        remove_trip_attrs(tz);
1748        tz->governor = NULL;
1749
1750        thermal_remove_hwmon_sysfs(tz);
1751        release_idr(&thermal_tz_idr, &thermal_idr_lock, tz->id);
1752        idr_destroy(&tz->idr);
1753        mutex_destroy(&tz->lock);
1754        device_unregister(&tz->device);
1755        return;
1756}
1757EXPORT_SYMBOL(thermal_zone_device_unregister);
1758
1759#ifdef CONFIG_NET
1760static struct genl_family thermal_event_genl_family = {
1761        .id = GENL_ID_GENERATE,
1762        .name = THERMAL_GENL_FAMILY_NAME,
1763        .version = THERMAL_GENL_VERSION,
1764        .maxattr = THERMAL_GENL_ATTR_MAX,
1765};
1766
1767static struct genl_multicast_group thermal_event_mcgrp = {
1768        .name = THERMAL_GENL_MCAST_GROUP_NAME,
1769};
1770
1771int thermal_generate_netlink_event(struct thermal_zone_device *tz,
1772                                        enum events event)
1773{
1774        struct sk_buff *skb;
1775        struct nlattr *attr;
1776        struct thermal_genl_event *thermal_event;
1777        void *msg_header;
1778        int size;
1779        int result;
1780        static unsigned int thermal_event_seqnum;
1781
1782        if (!tz)
1783                return -EINVAL;
1784
1785        /* allocate memory */
1786        size = nla_total_size(sizeof(struct thermal_genl_event)) +
1787               nla_total_size(0);
1788
1789        skb = genlmsg_new(size, GFP_ATOMIC);
1790        if (!skb)
1791                return -ENOMEM;
1792
1793        /* add the genetlink message header */
1794        msg_header = genlmsg_put(skb, 0, thermal_event_seqnum++,
1795                                 &thermal_event_genl_family, 0,
1796                                 THERMAL_GENL_CMD_EVENT);
1797        if (!msg_header) {
1798                nlmsg_free(skb);
1799                return -ENOMEM;
1800        }
1801
1802        /* fill the data */
1803        attr = nla_reserve(skb, THERMAL_GENL_ATTR_EVENT,
1804                           sizeof(struct thermal_genl_event));
1805
1806        if (!attr) {
1807                nlmsg_free(skb);
1808                return -EINVAL;
1809        }
1810
1811        thermal_event = nla_data(attr);
1812        if (!thermal_event) {
1813                nlmsg_free(skb);
1814                return -EINVAL;
1815        }
1816
1817        memset(thermal_event, 0, sizeof(struct thermal_genl_event));
1818
1819        thermal_event->orig = tz->id;
1820        thermal_event->event = event;
1821
1822        /* send multicast genetlink message */
1823        result = genlmsg_end(skb, msg_header);
1824        if (result < 0) {
1825                nlmsg_free(skb);
1826                return result;
1827        }
1828
1829        result = genlmsg_multicast(skb, 0, thermal_event_mcgrp.id, GFP_ATOMIC);
1830        if (result)
1831                dev_err(&tz->device, "Failed to send netlink event:%d", result);
1832
1833        return result;
1834}
1835EXPORT_SYMBOL(thermal_generate_netlink_event);
1836
1837static int genetlink_init(void)
1838{
1839        int result;
1840
1841        result = genl_register_family(&thermal_event_genl_family);
1842        if (result)
1843                return result;
1844
1845        result = genl_register_mc_group(&thermal_event_genl_family,
1846                                        &thermal_event_mcgrp);
1847        if (result)
1848                genl_unregister_family(&thermal_event_genl_family);
1849        return result;
1850}
1851
1852static void genetlink_exit(void)
1853{
1854        genl_unregister_family(&thermal_event_genl_family);
1855}
1856#else /* !CONFIG_NET */
1857static inline int genetlink_init(void) { return 0; }
1858static inline void genetlink_exit(void) {}
1859#endif /* !CONFIG_NET */
1860
1861static int __init thermal_init(void)
1862{
1863        int result = 0;
1864
1865        result = class_register(&thermal_class);
1866        if (result) {
1867                idr_destroy(&thermal_tz_idr);
1868                idr_destroy(&thermal_cdev_idr);
1869                mutex_destroy(&thermal_idr_lock);
1870                mutex_destroy(&thermal_list_lock);
1871                return result;
1872        }
1873        result = genetlink_init();
1874        return result;
1875}
1876
1877static void __exit thermal_exit(void)
1878{
1879        class_unregister(&thermal_class);
1880        idr_destroy(&thermal_tz_idr);
1881        idr_destroy(&thermal_cdev_idr);
1882        mutex_destroy(&thermal_idr_lock);
1883        mutex_destroy(&thermal_list_lock);
1884        genetlink_exit();
1885}
1886
1887fs_initcall(thermal_init);
1888module_exit(thermal_exit);
1889
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.