diff options
| -rw-r--r-- | Documentation/thermal/sysfs-api.txt | 389 | ||||
| -rw-r--r-- | drivers/acpi/acpica/acconfig.h | 4 | ||||
| -rw-r--r-- | drivers/acpi/acpica/exregion.c | 35 | ||||
| -rw-r--r-- | drivers/acpi/power_meter.c | 6 | ||||
| -rw-r--r-- | drivers/acpi/proc.c | 2 | ||||
| -rw-r--r-- | drivers/acpi/processor_core.c | 2 | ||||
| -rw-r--r-- | drivers/acpi/processor_throttling.c | 6 | ||||
| -rw-r--r-- | drivers/acpi/sleep.c | 24 | ||||
| -rw-r--r-- | drivers/acpi/video.c | 8 | ||||
| -rw-r--r-- | drivers/platform/x86/eeepc-laptop.c | 30 | ||||
| -rw-r--r-- | drivers/thermal/thermal_sys.c | 10 |
11 files changed, 281 insertions, 235 deletions
diff --git a/Documentation/thermal/sysfs-api.txt b/Documentation/thermal/sysfs-api.txt index 70d68ce8640a..a87dc277a5ca 100644 --- a/Documentation/thermal/sysfs-api.txt +++ b/Documentation/thermal/sysfs-api.txt | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | Generic Thermal Sysfs driver How To | 1 | Generic Thermal Sysfs driver How To |
| 2 | ========================= | 2 | =================================== |
| 3 | 3 | ||
| 4 | Written by Sujith Thomas <sujith.thomas@intel.com>, Zhang Rui <rui.zhang@intel.com> | 4 | Written by Sujith Thomas <sujith.thomas@intel.com>, Zhang Rui <rui.zhang@intel.com> |
| 5 | 5 | ||
| @@ -10,20 +10,20 @@ Copyright (c) 2008 Intel Corporation | |||
| 10 | 10 | ||
| 11 | 0. Introduction | 11 | 0. Introduction |
| 12 | 12 | ||
| 13 | The generic thermal sysfs provides a set of interfaces for thermal zone devices (sensors) | 13 | The generic thermal sysfs provides a set of interfaces for thermal zone |
| 14 | and thermal cooling devices (fan, processor...) to register with the thermal management | 14 | devices (sensors) and thermal cooling devices (fan, processor...) to register |
| 15 | solution and to be a part of it. | 15 | with the thermal management solution and to be a part of it. |
| 16 | 16 | ||
| 17 | This how-to focuses on enabling new thermal zone and cooling devices to participate | 17 | This how-to focuses on enabling new thermal zone and cooling devices to |
| 18 | in thermal management. | 18 | participate in thermal management. |
| 19 | This solution is platform independent and any type of thermal zone devices and | 19 | This solution is platform independent and any type of thermal zone devices |
| 20 | cooling devices should be able to make use of the infrastructure. | 20 | and cooling devices should be able to make use of the infrastructure. |
| 21 | 21 | ||
| 22 | The main task of the thermal sysfs driver is to expose thermal zone attributes as well | 22 | The main task of the thermal sysfs driver is to expose thermal zone attributes |
| 23 | as cooling device attributes to the user space. | 23 | as well as cooling device attributes to the user space. |
| 24 | An intelligent thermal management application can make decisions based on inputs | 24 | An intelligent thermal management application can make decisions based on |
| 25 | from thermal zone attributes (the current temperature and trip point temperature) | 25 | inputs from thermal zone attributes (the current temperature and trip point |
| 26 | and throttle appropriate devices. | 26 | temperature) and throttle appropriate devices. |
| 27 | 27 | ||
| 28 | [0-*] denotes any positive number starting from 0 | 28 | [0-*] denotes any positive number starting from 0 |
| 29 | [1-*] denotes any positive number starting from 1 | 29 | [1-*] denotes any positive number starting from 1 |
| @@ -31,77 +31,77 @@ and throttle appropriate devices. | |||
| 31 | 1. thermal sysfs driver interface functions | 31 | 1. thermal sysfs driver interface functions |
| 32 | 32 | ||
| 33 | 1.1 thermal zone device interface | 33 | 1.1 thermal zone device interface |
| 34 | 1.1.1 struct thermal_zone_device *thermal_zone_device_register(char *name, int trips, | 34 | 1.1.1 struct thermal_zone_device *thermal_zone_device_register(char *name, |
| 35 | void *devdata, struct thermal_zone_device_ops *ops) | 35 | int trips, void *devdata, struct thermal_zone_device_ops *ops) |
| 36 | 36 | ||
| 37 | This interface function adds a new thermal zone device (sensor) to | 37 | This interface function adds a new thermal zone device (sensor) to |
| 38 | /sys/class/thermal folder as thermal_zone[0-*]. | 38 | /sys/class/thermal folder as thermal_zone[0-*]. It tries to bind all the |
| 39 | It tries to bind all the thermal cooling devices registered at the same time. | 39 | thermal cooling devices registered at the same time. |
| 40 | 40 | ||
| 41 | name: the thermal zone name. | 41 | name: the thermal zone name. |
| 42 | trips: the total number of trip points this thermal zone supports. | 42 | trips: the total number of trip points this thermal zone supports. |
| 43 | devdata: device private data | 43 | devdata: device private data |
| 44 | ops: thermal zone device call-backs. | 44 | ops: thermal zone device call-backs. |
| 45 | .bind: bind the thermal zone device with a thermal cooling device. | 45 | .bind: bind the thermal zone device with a thermal cooling device. |
| 46 | .unbind: unbind the thermal zone device with a thermal cooling device. | 46 | .unbind: unbind the thermal zone device with a thermal cooling device. |
| 47 | .get_temp: get the current temperature of the thermal zone. | 47 | .get_temp: get the current temperature of the thermal zone. |
| 48 | .get_mode: get the current mode (user/kernel) of the thermal zone. | 48 | .get_mode: get the current mode (user/kernel) of the thermal zone. |
| 49 | "kernel" means thermal management is done in kernel. | 49 | - "kernel" means thermal management is done in kernel. |
| 50 | "user" will prevent kernel thermal driver actions upon trip points | 50 | - "user" will prevent kernel thermal driver actions upon trip points |
| 51 | so that user applications can take charge of thermal management. | 51 | so that user applications can take charge of thermal management. |
| 52 | .set_mode: set the mode (user/kernel) of the thermal zone. | 52 | .set_mode: set the mode (user/kernel) of the thermal zone. |
| 53 | .get_trip_type: get the type of certain trip point. | 53 | .get_trip_type: get the type of certain trip point. |
| 54 | .get_trip_temp: get the temperature above which the certain trip point | 54 | .get_trip_temp: get the temperature above which the certain trip point |
| 55 | will be fired. | 55 | will be fired. |
| 56 | 56 | ||
| 57 | 1.1.2 void thermal_zone_device_unregister(struct thermal_zone_device *tz) | 57 | 1.1.2 void thermal_zone_device_unregister(struct thermal_zone_device *tz) |
| 58 | 58 | ||
| 59 | This interface function removes the thermal zone device. | 59 | This interface function removes the thermal zone device. |
| 60 | It deletes the corresponding entry form /sys/class/thermal folder and unbind all | 60 | It deletes the corresponding entry form /sys/class/thermal folder and |
| 61 | the thermal cooling devices it uses. | 61 | unbind all the thermal cooling devices it uses. |
| 62 | 62 | ||
| 63 | 1.2 thermal cooling device interface | 63 | 1.2 thermal cooling device interface |
| 64 | 1.2.1 struct thermal_cooling_device *thermal_cooling_device_register(char *name, | 64 | 1.2.1 struct thermal_cooling_device *thermal_cooling_device_register(char *name, |
| 65 | void *devdata, struct thermal_cooling_device_ops *) | 65 | void *devdata, struct thermal_cooling_device_ops *) |
| 66 | 66 | ||
| 67 | This interface function adds a new thermal cooling device (fan/processor/...) to | 67 | This interface function adds a new thermal cooling device (fan/processor/...) |
| 68 | /sys/class/thermal/ folder as cooling_device[0-*]. | 68 | to /sys/class/thermal/ folder as cooling_device[0-*]. It tries to bind itself |
| 69 | It tries to bind itself to all the thermal zone devices register at the same time. | 69 | to all the thermal zone devices register at the same time. |
| 70 | name: the cooling device name. | 70 | name: the cooling device name. |
| 71 | devdata: device private data. | 71 | devdata: device private data. |
| 72 | ops: thermal cooling devices call-backs. | 72 | ops: thermal cooling devices call-backs. |
| 73 | .get_max_state: get the Maximum throttle state of the cooling device. | 73 | .get_max_state: get the Maximum throttle state of the cooling device. |
| 74 | .get_cur_state: get the Current throttle state of the cooling device. | 74 | .get_cur_state: get the Current throttle state of the cooling device. |
| 75 | .set_cur_state: set the Current throttle state of the cooling device. | 75 | .set_cur_state: set the Current throttle state of the cooling device. |
| 76 | 76 | ||
| 77 | 1.2.2 void thermal_cooling_device_unregister(struct thermal_cooling_device *cdev) | 77 | 1.2.2 void thermal_cooling_device_unregister(struct thermal_cooling_device *cdev) |
| 78 | 78 | ||
| 79 | This interface function remove the thermal cooling device. | 79 | This interface function remove the thermal cooling device. |
| 80 | It deletes the corresponding entry form /sys/class/thermal folder and unbind | 80 | It deletes the corresponding entry form /sys/class/thermal folder and |
| 81 | itself from all the thermal zone devices using it. | 81 | unbind itself from all the thermal zone devices using it. |
| 82 | 82 | ||
| 83 | 1.3 interface for binding a thermal zone device with a thermal cooling device | 83 | 1.3 interface for binding a thermal zone device with a thermal cooling device |
| 84 | 1.3.1 int thermal_zone_bind_cooling_device(struct thermal_zone_device *tz, | 84 | 1.3.1 int thermal_zone_bind_cooling_device(struct thermal_zone_device *tz, |
| 85 | int trip, struct thermal_cooling_device *cdev); | 85 | int trip, struct thermal_cooling_device *cdev); |
| 86 | 86 | ||
| 87 | This interface function bind a thermal cooling device to the certain trip point | 87 | This interface function bind a thermal cooling device to the certain trip |
| 88 | of a thermal zone device. | 88 | point of a thermal zone device. |
| 89 | This function is usually called in the thermal zone device .bind callback. | 89 | This function is usually called in the thermal zone device .bind callback. |
| 90 | tz: the thermal zone device | 90 | tz: the thermal zone device |
| 91 | cdev: thermal cooling device | 91 | cdev: thermal cooling device |
| 92 | trip: indicates which trip point the cooling devices is associated with | 92 | trip: indicates which trip point the cooling devices is associated with |
| 93 | in this thermal zone. | 93 | in this thermal zone. |
| 94 | 94 | ||
| 95 | 1.3.2 int thermal_zone_unbind_cooling_device(struct thermal_zone_device *tz, | 95 | 1.3.2 int thermal_zone_unbind_cooling_device(struct thermal_zone_device *tz, |
| 96 | int trip, struct thermal_cooling_device *cdev); | 96 | int trip, struct thermal_cooling_device *cdev); |
| 97 | 97 | ||
| 98 | This interface function unbind a thermal cooling device from the certain trip point | 98 | This interface function unbind a thermal cooling device from the certain |
| 99 | of a thermal zone device. | 99 | trip point of a thermal zone device. This function is usually called in |
| 100 | This function is usually called in the thermal zone device .unbind callback. | 100 | the thermal zone device .unbind callback. |
| 101 | tz: the thermal zone device | 101 | tz: the thermal zone device |
| 102 | cdev: thermal cooling device | 102 | cdev: thermal cooling device |
| 103 | trip: indicates which trip point the cooling devices is associated with | 103 | trip: indicates which trip point the cooling devices is associated with |
| 104 | in this thermal zone. | 104 | in this thermal zone. |
| 105 | 105 | ||
| 106 | 2. sysfs attributes structure | 106 | 2. sysfs attributes structure |
| 107 | 107 | ||
| @@ -114,153 +114,166 @@ if hwmon is compiled in or built as a module. | |||
| 114 | 114 | ||
| 115 | Thermal zone device sys I/F, created once it's registered: | 115 | Thermal zone device sys I/F, created once it's registered: |
| 116 | /sys/class/thermal/thermal_zone[0-*]: | 116 | /sys/class/thermal/thermal_zone[0-*]: |
| 117 | |-----type: Type of the thermal zone | 117 | |---type: Type of the thermal zone |
| 118 | |-----temp: Current temperature | 118 | |---temp: Current temperature |
| 119 | |-----mode: Working mode of the thermal zone | 119 | |---mode: Working mode of the thermal zone |
| 120 | |-----trip_point_[0-*]_temp: Trip point temperature | 120 | |---trip_point_[0-*]_temp: Trip point temperature |
| 121 | |-----trip_point_[0-*]_type: Trip point type | 121 | |---trip_point_[0-*]_type: Trip point type |
| 122 | 122 | ||
| 123 | Thermal cooling device sys I/F, created once it's registered: | 123 | Thermal cooling device sys I/F, created once it's registered: |
| 124 | /sys/class/thermal/cooling_device[0-*]: | 124 | /sys/class/thermal/cooling_device[0-*]: |
| 125 | |-----type : Type of the cooling device(processor/fan/...) | 125 | |---type: Type of the cooling device(processor/fan/...) |
| 126 | |-----max_state: Maximum cooling state of the cooling device | 126 | |---max_state: Maximum cooling state of the cooling device |
| 127 | |-----cur_state: Current cooling state of the cooling device | 127 | |---cur_state: Current cooling state of the cooling device |
| 128 | 128 | ||
| 129 | 129 | ||
| 130 | These two dynamic attributes are created/removed in pairs. | 130 | Then next two dynamic attributes are created/removed in pairs. They represent |
| 131 | They represent the relationship between a thermal zone and its associated cooling device. | 131 | the relationship between a thermal zone and its associated cooling device. |
| 132 | They are created/removed for each | 132 | They are created/removed for each successful execution of |
| 133 | thermal_zone_bind_cooling_device/thermal_zone_unbind_cooling_device successful execution. | 133 | thermal_zone_bind_cooling_device/thermal_zone_unbind_cooling_device. |
| 134 | 134 | ||
| 135 | /sys/class/thermal/thermal_zone[0-*] | 135 | /sys/class/thermal/thermal_zone[0-*]: |
| 136 | |-----cdev[0-*]: The [0-*]th cooling device in the current thermal zone | 136 | |---cdev[0-*]: [0-*]th cooling device in current thermal zone |
| 137 | |-----cdev[0-*]_trip_point: Trip point that cdev[0-*] is associated with | 137 | |---cdev[0-*]_trip_point: Trip point that cdev[0-*] is associated with |
| 138 | 138 | ||
| 139 | Besides the thermal zone device sysfs I/F and cooling device sysfs I/F, | 139 | Besides the thermal zone device sysfs I/F and cooling device sysfs I/F, |
| 140 | the generic thermal driver also creates a hwmon sysfs I/F for each _type_ of | 140 | the generic thermal driver also creates a hwmon sysfs I/F for each _type_ |
| 141 | thermal zone device. E.g. the generic thermal driver registers one hwmon class device | 141 | of thermal zone device. E.g. the generic thermal driver registers one hwmon |
| 142 | and build the associated hwmon sysfs I/F for all the registered ACPI thermal zones. | 142 | class device and build the associated hwmon sysfs I/F for all the registered |
| 143 | ACPI thermal zones. | ||
| 144 | |||
| 143 | /sys/class/hwmon/hwmon[0-*]: | 145 | /sys/class/hwmon/hwmon[0-*]: |
| 144 | |-----name: The type of the thermal zone devices. | 146 | |---name: The type of the thermal zone devices |
| 145 | |-----temp[1-*]_input: The current temperature of thermal zone [1-*]. | 147 | |---temp[1-*]_input: The current temperature of thermal zone [1-*] |
| 146 | |-----temp[1-*]_critical: The critical trip point of thermal zone [1-*]. | 148 | |---temp[1-*]_critical: The critical trip point of thermal zone [1-*] |
| 149 | |||
| 147 | Please read Documentation/hwmon/sysfs-interface for additional information. | 150 | Please read Documentation/hwmon/sysfs-interface for additional information. |
| 148 | 151 | ||
| 149 | *************************** | 152 | *************************** |
| 150 | * Thermal zone attributes * | 153 | * Thermal zone attributes * |
| 151 | *************************** | 154 | *************************** |
| 152 | 155 | ||
| 153 | type Strings which represent the thermal zone type. | 156 | type |
| 154 | This is given by thermal zone driver as part of registration. | 157 | Strings which represent the thermal zone type. |
| 155 | Eg: "acpitz" indicates it's an ACPI thermal device. | 158 | This is given by thermal zone driver as part of registration. |
| 156 | In order to keep it consistent with hwmon sys attribute, | 159 | E.g: "acpitz" indicates it's an ACPI thermal device. |
| 157 | this should be a short, lowercase string, | 160 | In order to keep it consistent with hwmon sys attribute; this should |
| 158 | not containing spaces nor dashes. | 161 | be a short, lowercase string, not containing spaces nor dashes. |
| 159 | RO | 162 | RO, Required |
| 160 | Required | 163 | |
| 161 | 164 | temp | |
| 162 | temp Current temperature as reported by thermal zone (sensor) | 165 | Current temperature as reported by thermal zone (sensor). |
| 163 | Unit: millidegree Celsius | 166 | Unit: millidegree Celsius |
| 164 | RO | 167 | RO, Required |
| 165 | Required | 168 | |
| 166 | 169 | mode | |
| 167 | mode One of the predefined values in [kernel, user] | 170 | One of the predefined values in [kernel, user]. |
| 168 | This file gives information about the algorithm | 171 | This file gives information about the algorithm that is currently |
| 169 | that is currently managing the thermal zone. | 172 | managing the thermal zone. It can be either default kernel based |
| 170 | It can be either default kernel based algorithm | 173 | algorithm or user space application. |
| 171 | or user space application. | 174 | kernel = Thermal management in kernel thermal zone driver. |
| 172 | RW | 175 | user = Preventing kernel thermal zone driver actions upon |
| 173 | Optional | 176 | trip points so that user application can take full |
| 174 | kernel = Thermal management in kernel thermal zone driver. | 177 | charge of the thermal management. |
| 175 | user = Preventing kernel thermal zone driver actions upon | 178 | RW, Optional |
| 176 | trip points so that user application can take full | 179 | |
| 177 | charge of the thermal management. | 180 | trip_point_[0-*]_temp |
| 178 | 181 | The temperature above which trip point will be fired. | |
| 179 | trip_point_[0-*]_temp The temperature above which trip point will be fired | 182 | Unit: millidegree Celsius |
| 180 | Unit: millidegree Celsius | 183 | RO, Optional |
| 181 | RO | 184 | |
| 182 | Optional | 185 | trip_point_[0-*]_type |
| 183 | 186 | Strings which indicate the type of the trip point. | |
| 184 | trip_point_[0-*]_type Strings which indicate the type of the trip point | 187 | E.g. it can be one of critical, hot, passive, active[0-*] for ACPI |
| 185 | E.g. it can be one of critical, hot, passive, | 188 | thermal zone. |
| 186 | active[0-*] for ACPI thermal zone. | 189 | RO, Optional |
| 187 | RO | 190 | |
| 188 | Optional | 191 | cdev[0-*] |
| 189 | 192 | Sysfs link to the thermal cooling device node where the sys I/F | |
| 190 | cdev[0-*] Sysfs link to the thermal cooling device node where the sys I/F | 193 | for cooling device throttling control represents. |
| 191 | for cooling device throttling control represents. | 194 | RO, Optional |
| 192 | RO | 195 | |
| 193 | Optional | 196 | cdev[0-*]_trip_point |
| 194 | 197 | The trip point with which cdev[0-*] is associated in this thermal | |
| 195 | cdev[0-*]_trip_point The trip point with which cdev[0-*] is associated in this thermal zone | 198 | zone; -1 means the cooling device is not associated with any trip |
| 196 | -1 means the cooling device is not associated with any trip point. | 199 | point. |
| 197 | RO | 200 | RO, Optional |
| 198 | Optional | 201 | |
| 199 | 202 | passive | |
| 200 | ****************************** | 203 | Attribute is only present for zones in which the passive cooling |
| 201 | * Cooling device attributes * | 204 | policy is not supported by native thermal driver. Default is zero |
| 202 | ****************************** | 205 | and can be set to a temperature (in millidegrees) to enable a |
| 203 | 206 | passive trip point for the zone. Activation is done by polling with | |
| 204 | type String which represents the type of device | 207 | an interval of 1 second. |
| 205 | eg: For generic ACPI: this should be "Fan", | 208 | Unit: millidegrees Celsius |
| 206 | "Processor" or "LCD" | 209 | RW, Optional |
| 207 | eg. For memory controller device on intel_menlow platform: | 210 | |
| 208 | this should be "Memory controller" | 211 | ***************************** |
| 209 | RO | 212 | * Cooling device attributes * |
| 210 | Required | 213 | ***************************** |
| 211 | 214 | ||
| 212 | max_state The maximum permissible cooling state of this cooling device. | 215 | type |
| 213 | RO | 216 | String which represents the type of device, e.g: |
| 214 | Required | 217 | - for generic ACPI: should be "Fan", "Processor" or "LCD" |
| 215 | 218 | - for memory controller device on intel_menlow platform: | |
| 216 | cur_state The current cooling state of this cooling device. | 219 | should be "Memory controller". |
| 217 | the value can any integer numbers between 0 and max_state, | 220 | RO, Required |
| 218 | cur_state == 0 means no cooling | 221 | |
| 219 | cur_state == max_state means the maximum cooling. | 222 | max_state |
| 220 | RW | 223 | The maximum permissible cooling state of this cooling device. |
| 221 | Required | 224 | RO, Required |
| 225 | |||
| 226 | cur_state | ||
| 227 | The current cooling state of this cooling device. | ||
| 228 | The value can any integer numbers between 0 and max_state: | ||
| 229 | - cur_state == 0 means no cooling | ||
| 230 | - cur_state == max_state means the maximum cooling. | ||
| 231 | RW, Required | ||
| 222 | 232 | ||
| 223 | 3. A simple implementation | 233 | 3. A simple implementation |
| 224 | 234 | ||
| 225 | ACPI thermal zone may support multiple trip points like critical/hot/passive/active. | 235 | ACPI thermal zone may support multiple trip points like critical, hot, |
| 226 | If an ACPI thermal zone supports critical, passive, active[0] and active[1] at the same time, | 236 | passive, active. If an ACPI thermal zone supports critical, passive, |
| 227 | it may register itself as a thermal_zone_device (thermal_zone1) with 4 trip points in all. | 237 | active[0] and active[1] at the same time, it may register itself as a |
| 228 | It has one processor and one fan, which are both registered as thermal_cooling_device. | 238 | thermal_zone_device (thermal_zone1) with 4 trip points in all. |
| 229 | If the processor is listed in _PSL method, and the fan is listed in _AL0 method, | 239 | It has one processor and one fan, which are both registered as |
| 230 | the sys I/F structure will be built like this: | 240 | thermal_cooling_device. |
| 241 | |||
| 242 | If the processor is listed in _PSL method, and the fan is listed in _AL0 | ||
| 243 | method, the sys I/F structure will be built like this: | ||
| 231 | 244 | ||
| 232 | /sys/class/thermal: | 245 | /sys/class/thermal: |
| 233 | 246 | ||
| 234 | |thermal_zone1: | 247 | |thermal_zone1: |
| 235 | |-----type: acpitz | 248 | |---type: acpitz |
| 236 | |-----temp: 37000 | 249 | |---temp: 37000 |
| 237 | |-----mode: kernel | 250 | |---mode: kernel |
| 238 | |-----trip_point_0_temp: 100000 | 251 | |---trip_point_0_temp: 100000 |
| 239 | |-----trip_point_0_type: critical | 252 | |---trip_point_0_type: critical |
| 240 | |-----trip_point_1_temp: 80000 | 253 | |---trip_point_1_temp: 80000 |
| 241 | |-----trip_point_1_type: passive | 254 | |---trip_point_1_type: passive |
| 242 | |-----trip_point_2_temp: 70000 | 255 | |---trip_point_2_temp: 70000 |
| 243 | |-----trip_point_2_type: active0 | 256 | |---trip_point_2_type: active0 |
| 244 | |-----trip_point_3_temp: 60000 | 257 | |---trip_point_3_temp: 60000 |
| 245 | |-----trip_point_3_type: active1 | 258 | |---trip_point_3_type: active1 |
| 246 | |-----cdev0: --->/sys/class/thermal/cooling_device0 | 259 | |---cdev0: --->/sys/class/thermal/cooling_device0 |
| 247 | |-----cdev0_trip_point: 1 /* cdev0 can be used for passive */ | 260 | |---cdev0_trip_point: 1 /* cdev0 can be used for passive */ |
| 248 | |-----cdev1: --->/sys/class/thermal/cooling_device3 | 261 | |---cdev1: --->/sys/class/thermal/cooling_device3 |
| 249 | |-----cdev1_trip_point: 2 /* cdev1 can be used for active[0]*/ | 262 | |---cdev1_trip_point: 2 /* cdev1 can be used for active[0]*/ |
| 250 | 263 | ||
| 251 | |cooling_device0: | 264 | |cooling_device0: |
| 252 | |-----type: Processor | 265 | |---type: Processor |
| 253 | |-----max_state: 8 | 266 | |---max_state: 8 |
| 254 | |-----cur_state: 0 | 267 | |---cur_state: 0 |
| 255 | 268 | ||
| 256 | |cooling_device3: | 269 | |cooling_device3: |
| 257 | |-----type: Fan | 270 | |---type: Fan |
| 258 | |-----max_state: 2 | 271 | |---max_state: 2 |
| 259 | |-----cur_state: 0 | 272 | |---cur_state: 0 |
| 260 | 273 | ||
| 261 | /sys/class/hwmon: | 274 | /sys/class/hwmon: |
| 262 | 275 | ||
| 263 | |hwmon0: | 276 | |hwmon0: |
| 264 | |-----name: acpitz | 277 | |---name: acpitz |
| 265 | |-----temp1_input: 37000 | 278 | |---temp1_input: 37000 |
| 266 | |-----temp1_crit: 100000 | 279 | |---temp1_crit: 100000 |
diff --git a/drivers/acpi/acpica/acconfig.h b/drivers/acpi/acpica/acconfig.h index 8e679ef5b231..a4471e3d3853 100644 --- a/drivers/acpi/acpica/acconfig.h +++ b/drivers/acpi/acpica/acconfig.h | |||
| @@ -103,9 +103,9 @@ | |||
| 103 | 103 | ||
| 104 | #define ACPI_MAX_REFERENCE_COUNT 0x1000 | 104 | #define ACPI_MAX_REFERENCE_COUNT 0x1000 |
| 105 | 105 | ||
| 106 | /* Size of cached memory mapping for system memory operation region */ | 106 | /* Default page size for use in mapping memory for operation regions */ |
| 107 | 107 | ||
| 108 | #define ACPI_SYSMEM_REGION_WINDOW_SIZE 4096 | 108 | #define ACPI_DEFAULT_PAGE_SIZE 4096 /* Must be power of 2 */ |
| 109 | 109 | ||
| 110 | /* owner_id tracking. 8 entries allows for 255 owner_ids */ | 110 | /* owner_id tracking. 8 entries allows for 255 owner_ids */ |
| 111 | 111 | ||
diff --git a/drivers/acpi/acpica/exregion.c b/drivers/acpi/acpica/exregion.c index 3a54b737d2da..2bd83ac57c3a 100644 --- a/drivers/acpi/acpica/exregion.c +++ b/drivers/acpi/acpica/exregion.c | |||
| @@ -77,7 +77,8 @@ acpi_ex_system_memory_space_handler(u32 function, | |||
| 77 | void *logical_addr_ptr = NULL; | 77 | void *logical_addr_ptr = NULL; |
| 78 | struct acpi_mem_space_context *mem_info = region_context; | 78 | struct acpi_mem_space_context *mem_info = region_context; |
| 79 | u32 length; | 79 | u32 length; |
| 80 | acpi_size window_size; | 80 | acpi_size map_length; |
| 81 | acpi_size page_boundary_map_length; | ||
| 81 | #ifdef ACPI_MISALIGNMENT_NOT_SUPPORTED | 82 | #ifdef ACPI_MISALIGNMENT_NOT_SUPPORTED |
| 82 | u32 remainder; | 83 | u32 remainder; |
| 83 | #endif | 84 | #endif |
| @@ -144,25 +145,39 @@ acpi_ex_system_memory_space_handler(u32 function, | |||
| 144 | } | 145 | } |
| 145 | 146 | ||
| 146 | /* | 147 | /* |
| 147 | * Don't attempt to map memory beyond the end of the region, and | 148 | * Attempt to map from the requested address to the end of the region. |
| 148 | * constrain the maximum mapping size to something reasonable. | 149 | * However, we will never map more than one page, nor will we cross |
| 150 | * a page boundary. | ||
| 149 | */ | 151 | */ |
| 150 | window_size = (acpi_size) | 152 | map_length = (acpi_size) |
| 151 | ((mem_info->address + mem_info->length) - address); | 153 | ((mem_info->address + mem_info->length) - address); |
| 152 | 154 | ||
| 153 | if (window_size > ACPI_SYSMEM_REGION_WINDOW_SIZE) { | 155 | /* |
| 154 | window_size = ACPI_SYSMEM_REGION_WINDOW_SIZE; | 156 | * If mapping the entire remaining portion of the region will cross |
| 157 | * a page boundary, just map up to the page boundary, do not cross. | ||
| 158 | * On some systems, crossing a page boundary while mapping regions | ||
| 159 | * can cause warnings if the pages have different attributes | ||
| 160 | * due to resource management | ||
| 161 | */ | ||
| 162 | page_boundary_map_length = | ||
| 163 | ACPI_ROUND_UP(address, ACPI_DEFAULT_PAGE_SIZE) - address; | ||
| 164 | |||
| 165 | if (!page_boundary_map_length) { | ||
| 166 | page_boundary_map_length = ACPI_DEFAULT_PAGE_SIZE; | ||
| 167 | } | ||
| 168 | |||
| 169 | if (map_length > page_boundary_map_length) { | ||
| 170 | map_length = page_boundary_map_length; | ||
| 155 | } | 171 | } |
| 156 | 172 | ||
| 157 | /* Create a new mapping starting at the address given */ | 173 | /* Create a new mapping starting at the address given */ |
| 158 | 174 | ||
| 159 | mem_info->mapped_logical_address = | 175 | mem_info->mapped_logical_address = acpi_os_map_memory((acpi_physical_address) address, map_length); |
| 160 | acpi_os_map_memory((acpi_physical_address) address, window_size); | ||
| 161 | if (!mem_info->mapped_logical_address) { | 176 | if (!mem_info->mapped_logical_address) { |
| 162 | ACPI_ERROR((AE_INFO, | 177 | ACPI_ERROR((AE_INFO, |
| 163 | "Could not map memory at %8.8X%8.8X, size %X", | 178 | "Could not map memory at %8.8X%8.8X, size %X", |
| 164 | ACPI_FORMAT_NATIVE_UINT(address), | 179 | ACPI_FORMAT_NATIVE_UINT(address), |
| 165 | (u32) window_size)); | 180 | (u32) map_length)); |
| 166 | mem_info->mapped_length = 0; | 181 | mem_info->mapped_length = 0; |
| 167 | return_ACPI_STATUS(AE_NO_MEMORY); | 182 | return_ACPI_STATUS(AE_NO_MEMORY); |
| 168 | } | 183 | } |
| @@ -170,7 +185,7 @@ acpi_ex_system_memory_space_handler(u32 function, | |||
| 170 | /* Save the physical address and mapping size */ | 185 | /* Save the physical address and mapping size */ |
| 171 | 186 | ||
| 172 | mem_info->mapped_physical_address = address; | 187 | mem_info->mapped_physical_address = address; |
| 173 | mem_info->mapped_length = window_size; | 188 | mem_info->mapped_length = map_length; |
| 174 | } | 189 | } |
| 175 | 190 | ||
| 176 | /* | 191 | /* |
diff --git a/drivers/acpi/power_meter.c b/drivers/acpi/power_meter.c index e6bfd77986b8..2ef7030a0c28 100644 --- a/drivers/acpi/power_meter.c +++ b/drivers/acpi/power_meter.c | |||
| @@ -294,7 +294,11 @@ static int set_acpi_trip(struct acpi_power_meter_resource *resource) | |||
| 294 | return -EINVAL; | 294 | return -EINVAL; |
| 295 | } | 295 | } |
| 296 | 296 | ||
| 297 | return data; | 297 | /* _PTP returns 0 on success, nonzero otherwise */ |
| 298 | if (data) | ||
| 299 | return -EINVAL; | ||
| 300 | |||
| 301 | return 0; | ||
| 298 | } | 302 | } |
| 299 | 303 | ||
| 300 | static ssize_t set_trip(struct device *dev, struct device_attribute *devattr, | 304 | static ssize_t set_trip(struct device *dev, struct device_attribute *devattr, |
diff --git a/drivers/acpi/proc.c b/drivers/acpi/proc.c index f8b6f555ba52..d0d25e2e1ced 100644 --- a/drivers/acpi/proc.c +++ b/drivers/acpi/proc.c | |||
| @@ -393,7 +393,7 @@ acpi_system_write_wakeup_device(struct file *file, | |||
| 393 | struct list_head *node, *next; | 393 | struct list_head *node, *next; |
| 394 | char strbuf[5]; | 394 | char strbuf[5]; |
| 395 | char str[5] = ""; | 395 | char str[5] = ""; |
| 396 | int len = count; | 396 | unsigned int len = count; |
| 397 | struct acpi_device *found_dev = NULL; | 397 | struct acpi_device *found_dev = NULL; |
| 398 | 398 | ||
| 399 | if (len > 4) | 399 | if (len > 4) |
diff --git a/drivers/acpi/processor_core.c b/drivers/acpi/processor_core.c index c567b46dfa0f..ec742a4e5635 100644 --- a/drivers/acpi/processor_core.c +++ b/drivers/acpi/processor_core.c | |||
| @@ -770,7 +770,7 @@ static struct notifier_block acpi_cpu_notifier = | |||
| 770 | .notifier_call = acpi_cpu_soft_notify, | 770 | .notifier_call = acpi_cpu_soft_notify, |
| 771 | }; | 771 | }; |
| 772 | 772 | ||
| 773 | static int acpi_processor_add(struct acpi_device *device) | 773 | static int __cpuinit acpi_processor_add(struct acpi_device *device) |
| 774 | { | 774 | { |
| 775 | struct acpi_processor *pr = NULL; | 775 | struct acpi_processor *pr = NULL; |
| 776 | int result = 0; | 776 | int result = 0; |
diff --git a/drivers/acpi/processor_throttling.c b/drivers/acpi/processor_throttling.c index 4c6c14c1e307..1c5d7a8b2fdf 100644 --- a/drivers/acpi/processor_throttling.c +++ b/drivers/acpi/processor_throttling.c | |||
| @@ -1133,15 +1133,15 @@ int acpi_processor_get_throttling_info(struct acpi_processor *pr) | |||
| 1133 | int result = 0; | 1133 | int result = 0; |
| 1134 | struct acpi_processor_throttling *pthrottling; | 1134 | struct acpi_processor_throttling *pthrottling; |
| 1135 | 1135 | ||
| 1136 | if (!pr) | ||
| 1137 | return -EINVAL; | ||
| 1138 | |||
| 1136 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | 1139 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
| 1137 | "pblk_address[0x%08x] duty_offset[%d] duty_width[%d]\n", | 1140 | "pblk_address[0x%08x] duty_offset[%d] duty_width[%d]\n", |
| 1138 | pr->throttling.address, | 1141 | pr->throttling.address, |
| 1139 | pr->throttling.duty_offset, | 1142 | pr->throttling.duty_offset, |
| 1140 | pr->throttling.duty_width)); | 1143 | pr->throttling.duty_width)); |
| 1141 | 1144 | ||
| 1142 | if (!pr) | ||
| 1143 | return -EINVAL; | ||
| 1144 | |||
| 1145 | /* | 1145 | /* |
| 1146 | * Evaluate _PTC, _TSS and _TPC | 1146 | * Evaluate _PTC, _TSS and _TPC |
| 1147 | * They must all be present or none of them can be used. | 1147 | * They must all be present or none of them can be used. |
diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c index a90afcc723ab..4cc1b8116e76 100644 --- a/drivers/acpi/sleep.c +++ b/drivers/acpi/sleep.c | |||
| @@ -413,6 +413,30 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = { | |||
| 413 | }, | 413 | }, |
| 414 | }, | 414 | }, |
| 415 | { | 415 | { |
| 416 | .callback = init_set_sci_en_on_resume, | ||
| 417 | .ident = "Hewlett-Packard Pavilion dv4", | ||
| 418 | .matches = { | ||
| 419 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
| 420 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4"), | ||
| 421 | }, | ||
| 422 | }, | ||
| 423 | { | ||
| 424 | .callback = init_set_sci_en_on_resume, | ||
| 425 | .ident = "Hewlett-Packard Pavilion dv7", | ||
| 426 | .matches = { | ||
| 427 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
| 428 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv7"), | ||
| 429 | }, | ||
| 430 | }, | ||
| 431 | { | ||
| 432 | .callback = init_set_sci_en_on_resume, | ||
| 433 | .ident = "Hewlett-Packard Compaq Presario CQ40 Notebook PC", | ||
| 434 | .matches = { | ||
| 435 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
| 436 | DMI_MATCH(DMI_PRODUCT_NAME, "Compaq Presario CQ40 Notebook PC"), | ||
| 437 | }, | ||
| 438 | }, | ||
| 439 | { | ||
| 416 | .callback = init_old_suspend_ordering, | 440 | .callback = init_old_suspend_ordering, |
| 417 | .ident = "Panasonic CF51-2L", | 441 | .ident = "Panasonic CF51-2L", |
| 418 | .matches = { | 442 | .matches = { |
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index 64e3c581b7a9..05dff631591c 100644 --- a/drivers/acpi/video.c +++ b/drivers/acpi/video.c | |||
| @@ -1223,7 +1223,7 @@ acpi_video_device_write_state(struct file *file, | |||
| 1223 | u32 state = 0; | 1223 | u32 state = 0; |
| 1224 | 1224 | ||
| 1225 | 1225 | ||
| 1226 | if (!dev || count + 1 > sizeof str) | 1226 | if (!dev || count >= sizeof(str)) |
| 1227 | return -EINVAL; | 1227 | return -EINVAL; |
| 1228 | 1228 | ||
| 1229 | if (copy_from_user(str, buffer, count)) | 1229 | if (copy_from_user(str, buffer, count)) |
| @@ -1280,7 +1280,7 @@ acpi_video_device_write_brightness(struct file *file, | |||
| 1280 | int i; | 1280 | int i; |
| 1281 | 1281 | ||
| 1282 | 1282 | ||
| 1283 | if (!dev || !dev->brightness || count + 1 > sizeof str) | 1283 | if (!dev || !dev->brightness || count >= sizeof(str)) |
| 1284 | return -EINVAL; | 1284 | return -EINVAL; |
| 1285 | 1285 | ||
| 1286 | if (copy_from_user(str, buffer, count)) | 1286 | if (copy_from_user(str, buffer, count)) |
| @@ -1562,7 +1562,7 @@ acpi_video_bus_write_POST(struct file *file, | |||
| 1562 | unsigned long long opt, options; | 1562 | unsigned long long opt, options; |
| 1563 | 1563 | ||
| 1564 | 1564 | ||
| 1565 | if (!video || count + 1 > sizeof str) | 1565 | if (!video || count >= sizeof(str)) |
| 1566 | return -EINVAL; | 1566 | return -EINVAL; |
| 1567 | 1567 | ||
| 1568 | status = acpi_video_bus_POST_options(video, &options); | 1568 | status = acpi_video_bus_POST_options(video, &options); |
| @@ -1602,7 +1602,7 @@ acpi_video_bus_write_DOS(struct file *file, | |||
| 1602 | unsigned long opt; | 1602 | unsigned long opt; |
| 1603 | 1603 | ||
| 1604 | 1604 | ||
| 1605 | if (!video || count + 1 > sizeof str) | 1605 | if (!video || count >= sizeof(str)) |
| 1606 | return -EINVAL; | 1606 | return -EINVAL; |
| 1607 | 1607 | ||
| 1608 | if (copy_from_user(str, buffer, count)) | 1608 | if (copy_from_user(str, buffer, count)) |
diff --git a/drivers/platform/x86/eeepc-laptop.c b/drivers/platform/x86/eeepc-laptop.c index d379e74a05d0..4226e5352738 100644 --- a/drivers/platform/x86/eeepc-laptop.c +++ b/drivers/platform/x86/eeepc-laptop.c | |||
| @@ -150,8 +150,6 @@ struct eeepc_hotk { | |||
| 150 | /* The actual device the driver binds to */ | 150 | /* The actual device the driver binds to */ |
| 151 | static struct eeepc_hotk *ehotk; | 151 | static struct eeepc_hotk *ehotk; |
| 152 | 152 | ||
| 153 | static void eeepc_rfkill_hotplug(bool real); | ||
| 154 | |||
| 155 | /* Platform device/driver */ | 153 | /* Platform device/driver */ |
| 156 | static int eeepc_hotk_thaw(struct device *device); | 154 | static int eeepc_hotk_thaw(struct device *device); |
| 157 | static int eeepc_hotk_restore(struct device *device); | 155 | static int eeepc_hotk_restore(struct device *device); |
| @@ -345,16 +343,7 @@ static bool eeepc_wlan_rfkill_blocked(void) | |||
| 345 | static int eeepc_rfkill_set(void *data, bool blocked) | 343 | static int eeepc_rfkill_set(void *data, bool blocked) |
| 346 | { | 344 | { |
| 347 | unsigned long asl = (unsigned long)data; | 345 | unsigned long asl = (unsigned long)data; |
| 348 | int ret; | 346 | return set_acpi(asl, !blocked); |
| 349 | |||
| 350 | if (asl != CM_ASL_WLAN) | ||
| 351 | return set_acpi(asl, !blocked); | ||
| 352 | |||
| 353 | /* hack to avoid panic with rt2860sta */ | ||
| 354 | if (blocked) | ||
| 355 | eeepc_rfkill_hotplug(false); | ||
| 356 | ret = set_acpi(asl, !blocked); | ||
| 357 | return ret; | ||
| 358 | } | 347 | } |
| 359 | 348 | ||
| 360 | static const struct rfkill_ops eeepc_rfkill_ops = { | 349 | static const struct rfkill_ops eeepc_rfkill_ops = { |
| @@ -367,7 +356,8 @@ static void __devinit eeepc_enable_camera(void) | |||
| 367 | * If the following call to set_acpi() fails, it's because there's no | 356 | * If the following call to set_acpi() fails, it's because there's no |
| 368 | * camera so we can ignore the error. | 357 | * camera so we can ignore the error. |
| 369 | */ | 358 | */ |
| 370 | set_acpi(CM_ASL_CAMERA, 1); | 359 | if (get_acpi(CM_ASL_CAMERA) == 0) |
| 360 | set_acpi(CM_ASL_CAMERA, 1); | ||
| 371 | } | 361 | } |
| 372 | 362 | ||
| 373 | /* | 363 | /* |
| @@ -654,13 +644,13 @@ static int eeepc_get_adapter_status(struct hotplug_slot *hotplug_slot, | |||
| 654 | return 0; | 644 | return 0; |
| 655 | } | 645 | } |
| 656 | 646 | ||
| 657 | static void eeepc_rfkill_hotplug(bool real) | 647 | static void eeepc_rfkill_hotplug(void) |
| 658 | { | 648 | { |
| 659 | struct pci_dev *dev; | 649 | struct pci_dev *dev; |
| 660 | struct pci_bus *bus; | 650 | struct pci_bus *bus; |
| 661 | bool blocked = real ? eeepc_wlan_rfkill_blocked() : true; | 651 | bool blocked = eeepc_wlan_rfkill_blocked(); |
| 662 | 652 | ||
| 663 | if (real && ehotk->wlan_rfkill) | 653 | if (ehotk->wlan_rfkill) |
| 664 | rfkill_set_sw_state(ehotk->wlan_rfkill, blocked); | 654 | rfkill_set_sw_state(ehotk->wlan_rfkill, blocked); |
| 665 | 655 | ||
| 666 | mutex_lock(&ehotk->hotplug_lock); | 656 | mutex_lock(&ehotk->hotplug_lock); |
| @@ -703,7 +693,7 @@ static void eeepc_rfkill_notify(acpi_handle handle, u32 event, void *data) | |||
| 703 | if (event != ACPI_NOTIFY_BUS_CHECK) | 693 | if (event != ACPI_NOTIFY_BUS_CHECK) |
| 704 | return; | 694 | return; |
| 705 | 695 | ||
| 706 | eeepc_rfkill_hotplug(true); | 696 | eeepc_rfkill_hotplug(); |
| 707 | } | 697 | } |
| 708 | 698 | ||
| 709 | static void eeepc_hotk_notify(struct acpi_device *device, u32 event) | 699 | static void eeepc_hotk_notify(struct acpi_device *device, u32 event) |
| @@ -861,7 +851,7 @@ static int eeepc_hotk_restore(struct device *device) | |||
| 861 | { | 851 | { |
| 862 | /* Refresh both wlan rfkill state and pci hotplug */ | 852 | /* Refresh both wlan rfkill state and pci hotplug */ |
| 863 | if (ehotk->wlan_rfkill) | 853 | if (ehotk->wlan_rfkill) |
| 864 | eeepc_rfkill_hotplug(true); | 854 | eeepc_rfkill_hotplug(); |
| 865 | 855 | ||
| 866 | if (ehotk->bluetooth_rfkill) | 856 | if (ehotk->bluetooth_rfkill) |
| 867 | rfkill_set_sw_state(ehotk->bluetooth_rfkill, | 857 | rfkill_set_sw_state(ehotk->bluetooth_rfkill, |
| @@ -1004,7 +994,7 @@ static void eeepc_rfkill_exit(void) | |||
| 1004 | * Refresh pci hotplug in case the rfkill state was changed after | 994 | * Refresh pci hotplug in case the rfkill state was changed after |
| 1005 | * eeepc_unregister_rfkill_notifier() | 995 | * eeepc_unregister_rfkill_notifier() |
| 1006 | */ | 996 | */ |
| 1007 | eeepc_rfkill_hotplug(true); | 997 | eeepc_rfkill_hotplug(); |
| 1008 | if (ehotk->hotplug_slot) | 998 | if (ehotk->hotplug_slot) |
| 1009 | pci_hp_deregister(ehotk->hotplug_slot); | 999 | pci_hp_deregister(ehotk->hotplug_slot); |
| 1010 | 1000 | ||
| @@ -1120,7 +1110,7 @@ static int eeepc_rfkill_init(struct device *dev) | |||
| 1120 | * Refresh pci hotplug in case the rfkill state was changed during | 1110 | * Refresh pci hotplug in case the rfkill state was changed during |
| 1121 | * setup. | 1111 | * setup. |
| 1122 | */ | 1112 | */ |
| 1123 | eeepc_rfkill_hotplug(true); | 1113 | eeepc_rfkill_hotplug(); |
| 1124 | 1114 | ||
| 1125 | exit: | 1115 | exit: |
| 1126 | if (result && result != -ENODEV) | 1116 | if (result && result != -ENODEV) |
diff --git a/drivers/thermal/thermal_sys.c b/drivers/thermal/thermal_sys.c index 4e83c297ec9e..6f8d8f971212 100644 --- a/drivers/thermal/thermal_sys.c +++ b/drivers/thermal/thermal_sys.c | |||
| @@ -180,15 +180,15 @@ trip_point_type_show(struct device *dev, struct device_attribute *attr, | |||
| 180 | 180 | ||
| 181 | switch (type) { | 181 | switch (type) { |
| 182 | case THERMAL_TRIP_CRITICAL: | 182 | case THERMAL_TRIP_CRITICAL: |
| 183 | return sprintf(buf, "critical"); | 183 | return sprintf(buf, "critical\n"); |
| 184 | case THERMAL_TRIP_HOT: | 184 | case THERMAL_TRIP_HOT: |
| 185 | return sprintf(buf, "hot"); | 185 | return sprintf(buf, "hot\n"); |
| 186 | case THERMAL_TRIP_PASSIVE: | 186 | case THERMAL_TRIP_PASSIVE: |
| 187 | return sprintf(buf, "passive"); | 187 | return sprintf(buf, "passive\n"); |
| 188 | case THERMAL_TRIP_ACTIVE: | 188 | case THERMAL_TRIP_ACTIVE: |
| 189 | return sprintf(buf, "active"); | 189 | return sprintf(buf, "active\n"); |
| 190 | default: | 190 | default: |
| 191 | return sprintf(buf, "unknown"); | 191 | return sprintf(buf, "unknown\n"); |
| 192 | } | 192 | } |
| 193 | } | 193 | } |
| 194 | 194 | ||
