linux/drivers/thermal/thermal_core.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 *  thermal_core.h
   4 *
   5 *  Copyright (C) 2012  Intel Corp
   6 *  Author: Durgadoss R <durgadoss.r@intel.com>
   7 */
   8
   9#ifndef __THERMAL_CORE_H__
  10#define __THERMAL_CORE_H__
  11
  12#include <linux/device.h>
  13#include <linux/thermal.h>
  14
  15#include "thermal_netlink.h"
  16
  17/* Default Thermal Governor */
  18#if defined(CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE)
  19#define DEFAULT_THERMAL_GOVERNOR       "step_wise"
  20#elif defined(CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE)
  21#define DEFAULT_THERMAL_GOVERNOR       "fair_share"
  22#elif defined(CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE)
  23#define DEFAULT_THERMAL_GOVERNOR       "user_space"
  24#elif defined(CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR)
  25#define DEFAULT_THERMAL_GOVERNOR       "power_allocator"
  26#endif
  27
  28/* Initial state of a cooling device during binding */
  29#define THERMAL_NO_TARGET -1UL
  30
  31/* Init section thermal table */
  32extern struct thermal_governor *__governor_thermal_table[];
  33extern struct thermal_governor *__governor_thermal_table_end[];
  34
  35#define THERMAL_TABLE_ENTRY(table, name)                        \
  36        static typeof(name) *__thermal_table_entry_##name       \
  37        __used __section("__" #table "_thermal_table") = &name
  38
  39#define THERMAL_GOVERNOR_DECLARE(name)  THERMAL_TABLE_ENTRY(governor, name)
  40
  41#define for_each_governor_table(__governor)             \
  42        for (__governor = __governor_thermal_table;     \
  43             __governor < __governor_thermal_table_end; \
  44             __governor++)
  45
  46int for_each_thermal_zone(int (*cb)(struct thermal_zone_device *, void *),
  47                          void *);
  48
  49int for_each_thermal_cooling_device(int (*cb)(struct thermal_cooling_device *,
  50                                              void *), void *);
  51
  52int for_each_thermal_governor(int (*cb)(struct thermal_governor *, void *),
  53                              void *thermal_governor);
  54
  55struct thermal_zone_device *thermal_zone_get_by_id(int id);
  56
  57struct thermal_attr {
  58        struct device_attribute attr;
  59        char name[THERMAL_NAME_LENGTH];
  60};
  61
  62static inline bool cdev_is_power_actor(struct thermal_cooling_device *cdev)
  63{
  64        return cdev->ops->get_requested_power && cdev->ops->state2power &&
  65                cdev->ops->power2state;
  66}
  67
  68void thermal_cdev_update(struct thermal_cooling_device *);
  69void __thermal_cdev_update(struct thermal_cooling_device *cdev);
  70
  71/**
  72 * struct thermal_trip - representation of a point in temperature domain
  73 * @np: pointer to struct device_node that this trip point was created from
  74 * @temperature: temperature value in miliCelsius
  75 * @hysteresis: relative hysteresis in miliCelsius
  76 * @type: trip point type
  77 */
  78struct thermal_trip {
  79        struct device_node *np;
  80        int temperature;
  81        int hysteresis;
  82        enum thermal_trip_type type;
  83};
  84
  85int get_tz_trend(struct thermal_zone_device *tz, int trip);
  86
  87struct thermal_instance *
  88get_thermal_instance(struct thermal_zone_device *tz,
  89                     struct thermal_cooling_device *cdev,
  90                     int trip);
  91
  92/*
  93 * This structure is used to describe the behavior of
  94 * a certain cooling device on a certain trip point
  95 * in a certain thermal zone
  96 */
  97struct thermal_instance {
  98        int id;
  99        char name[THERMAL_NAME_LENGTH];
 100        struct thermal_zone_device *tz;
 101        struct thermal_cooling_device *cdev;
 102        int trip;
 103        bool initialized;
 104        unsigned long upper;    /* Highest cooling state for this trip point */
 105        unsigned long lower;    /* Lowest cooling state for this trip point */
 106        unsigned long target;   /* expected cooling state */
 107        char attr_name[THERMAL_NAME_LENGTH];
 108        struct device_attribute attr;
 109        char weight_attr_name[THERMAL_NAME_LENGTH];
 110        struct device_attribute weight_attr;
 111        struct list_head tz_node; /* node in tz->thermal_instances */
 112        struct list_head cdev_node; /* node in cdev->thermal_instances */
 113        unsigned int weight; /* The weight of the cooling device */
 114};
 115
 116#define to_thermal_zone(_dev) \
 117        container_of(_dev, struct thermal_zone_device, device)
 118
 119#define to_cooling_device(_dev) \
 120        container_of(_dev, struct thermal_cooling_device, device)
 121
 122int thermal_register_governor(struct thermal_governor *);
 123void thermal_unregister_governor(struct thermal_governor *);
 124int thermal_zone_device_set_policy(struct thermal_zone_device *, char *);
 125int thermal_build_list_of_policies(char *buf);
 126
 127/* Helpers */
 128void thermal_zone_set_trips(struct thermal_zone_device *tz);
 129void thermal_set_delay_jiffies(unsigned long *delay_jiffies, int delay_ms);
 130
 131/* sysfs I/F */
 132int thermal_zone_create_device_groups(struct thermal_zone_device *, int);
 133void thermal_zone_destroy_device_groups(struct thermal_zone_device *);
 134void thermal_cooling_device_setup_sysfs(struct thermal_cooling_device *);
 135void thermal_cooling_device_destroy_sysfs(struct thermal_cooling_device *cdev);
 136/* used only at binding time */
 137ssize_t trip_point_show(struct device *, struct device_attribute *, char *);
 138ssize_t weight_show(struct device *, struct device_attribute *, char *);
 139ssize_t weight_store(struct device *, struct device_attribute *, const char *,
 140                     size_t);
 141
 142#ifdef CONFIG_THERMAL_STATISTICS
 143void thermal_cooling_device_stats_update(struct thermal_cooling_device *cdev,
 144                                         unsigned long new_state);
 145#else
 146static inline void
 147thermal_cooling_device_stats_update(struct thermal_cooling_device *cdev,
 148                                    unsigned long new_state) {}
 149#endif /* CONFIG_THERMAL_STATISTICS */
 150
 151/* device tree support */
 152#ifdef CONFIG_THERMAL_OF
 153int of_parse_thermal_zones(void);
 154int of_thermal_get_ntrips(struct thermal_zone_device *);
 155bool of_thermal_is_trip_valid(struct thermal_zone_device *, int);
 156const struct thermal_trip *
 157of_thermal_get_trip_points(struct thermal_zone_device *);
 158#else
 159static inline int of_parse_thermal_zones(void) { return 0; }
 160static inline int of_thermal_get_ntrips(struct thermal_zone_device *tz)
 161{
 162        return 0;
 163}
 164static inline bool of_thermal_is_trip_valid(struct thermal_zone_device *tz,
 165                                            int trip)
 166{
 167        return false;
 168}
 169static inline const struct thermal_trip *
 170of_thermal_get_trip_points(struct thermal_zone_device *tz)
 171{
 172        return NULL;
 173}
 174#endif
 175
 176int thermal_zone_device_is_enabled(struct thermal_zone_device *tz);
 177
 178#endif /* __THERMAL_CORE_H__ */
 179