diff options
-rw-r--r-- | drivers/acpi/fan.c | 20 | ||||
-rw-r--r-- | drivers/acpi/processor_thermal.c | 20 | ||||
-rw-r--r-- | drivers/acpi/thermal.c | 80 | ||||
-rw-r--r-- | drivers/acpi/video.c | 22 | ||||
-rw-r--r-- | drivers/platform/x86/intel_menlow.c | 29 | ||||
-rw-r--r-- | drivers/thermal/thermal_sys.c | 91 | ||||
-rw-r--r-- | include/linux/thermal.h | 32 |
7 files changed, 198 insertions, 96 deletions
diff --git a/drivers/acpi/fan.c b/drivers/acpi/fan.c index eaaee1660bd..ae41cf3cf4e 100644 --- a/drivers/acpi/fan.c +++ b/drivers/acpi/fan.c | |||
@@ -68,31 +68,35 @@ static struct acpi_driver acpi_fan_driver = { | |||
68 | }; | 68 | }; |
69 | 69 | ||
70 | /* thermal cooling device callbacks */ | 70 | /* thermal cooling device callbacks */ |
71 | static int fan_get_max_state(struct thermal_cooling_device *cdev, char *buf) | 71 | static int fan_get_max_state(struct thermal_cooling_device *cdev, unsigned long |
72 | *state) | ||
72 | { | 73 | { |
73 | /* ACPI fan device only support two states: ON/OFF */ | 74 | /* ACPI fan device only support two states: ON/OFF */ |
74 | return sprintf(buf, "1\n"); | 75 | *state = 1; |
76 | return 0; | ||
75 | } | 77 | } |
76 | 78 | ||
77 | static int fan_get_cur_state(struct thermal_cooling_device *cdev, char *buf) | 79 | static int fan_get_cur_state(struct thermal_cooling_device *cdev, unsigned long |
80 | *state) | ||
78 | { | 81 | { |
79 | struct acpi_device *device = cdev->devdata; | 82 | struct acpi_device *device = cdev->devdata; |
80 | int state; | ||
81 | int result; | 83 | int result; |
84 | int acpi_state; | ||
82 | 85 | ||
83 | if (!device) | 86 | if (!device) |
84 | return -EINVAL; | 87 | return -EINVAL; |
85 | 88 | ||
86 | result = acpi_bus_get_power(device->handle, &state); | 89 | result = acpi_bus_get_power(device->handle, &acpi_state); |
87 | if (result) | 90 | if (result) |
88 | return result; | 91 | return result; |
89 | 92 | ||
90 | return sprintf(buf, "%s\n", state == ACPI_STATE_D3 ? "0" : | 93 | *state = (acpi_state == ACPI_STATE_D3 ? 0 : |
91 | (state == ACPI_STATE_D0 ? "1" : "unknown")); | 94 | (acpi_state == ACPI_STATE_D0 ? 1 : -1)); |
95 | return 0; | ||
92 | } | 96 | } |
93 | 97 | ||
94 | static int | 98 | static int |
95 | fan_set_cur_state(struct thermal_cooling_device *cdev, unsigned int state) | 99 | fan_set_cur_state(struct thermal_cooling_device *cdev, unsigned long state) |
96 | { | 100 | { |
97 | struct acpi_device *device = cdev->devdata; | 101 | struct acpi_device *device = cdev->devdata; |
98 | int result; | 102 | int result; |
diff --git a/drivers/acpi/processor_thermal.c b/drivers/acpi/processor_thermal.c index b1eb376fae4..0e47e299a9a 100644 --- a/drivers/acpi/processor_thermal.c +++ b/drivers/acpi/processor_thermal.c | |||
@@ -373,7 +373,8 @@ static int acpi_processor_max_state(struct acpi_processor *pr) | |||
373 | return max_state; | 373 | return max_state; |
374 | } | 374 | } |
375 | static int | 375 | static int |
376 | processor_get_max_state(struct thermal_cooling_device *cdev, char *buf) | 376 | processor_get_max_state(struct thermal_cooling_device *cdev, |
377 | unsigned long *state) | ||
377 | { | 378 | { |
378 | struct acpi_device *device = cdev->devdata; | 379 | struct acpi_device *device = cdev->devdata; |
379 | struct acpi_processor *pr = acpi_driver_data(device); | 380 | struct acpi_processor *pr = acpi_driver_data(device); |
@@ -381,28 +382,29 @@ processor_get_max_state(struct thermal_cooling_device *cdev, char *buf) | |||
381 | if (!device || !pr) | 382 | if (!device || !pr) |
382 | return -EINVAL; | 383 | return -EINVAL; |
383 | 384 | ||
384 | return sprintf(buf, "%d\n", acpi_processor_max_state(pr)); | 385 | *state = acpi_processor_max_state(pr); |
386 | return 0; | ||
385 | } | 387 | } |
386 | 388 | ||
387 | static int | 389 | static int |
388 | processor_get_cur_state(struct thermal_cooling_device *cdev, char *buf) | 390 | processor_get_cur_state(struct thermal_cooling_device *cdev, |
391 | unsigned long *cur_state) | ||
389 | { | 392 | { |
390 | struct acpi_device *device = cdev->devdata; | 393 | struct acpi_device *device = cdev->devdata; |
391 | struct acpi_processor *pr = acpi_driver_data(device); | 394 | struct acpi_processor *pr = acpi_driver_data(device); |
392 | int cur_state; | ||
393 | 395 | ||
394 | if (!device || !pr) | 396 | if (!device || !pr) |
395 | return -EINVAL; | 397 | return -EINVAL; |
396 | 398 | ||
397 | cur_state = cpufreq_get_cur_state(pr->id); | 399 | *cur_state = cpufreq_get_cur_state(pr->id); |
398 | if (pr->flags.throttling) | 400 | if (pr->flags.throttling) |
399 | cur_state += pr->throttling.state; | 401 | *cur_state += pr->throttling.state; |
400 | 402 | return 0; | |
401 | return sprintf(buf, "%d\n", cur_state); | ||
402 | } | 403 | } |
403 | 404 | ||
404 | static int | 405 | static int |
405 | processor_set_cur_state(struct thermal_cooling_device *cdev, unsigned int state) | 406 | processor_set_cur_state(struct thermal_cooling_device *cdev, |
407 | unsigned long state) | ||
406 | { | 408 | { |
407 | struct acpi_device *device = cdev->devdata; | 409 | struct acpi_device *device = cdev->devdata; |
408 | struct acpi_processor *pr = acpi_driver_data(device); | 410 | struct acpi_processor *pr = acpi_driver_data(device); |
diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c index 99e6f1f8ea4..1c410ef859c 100644 --- a/drivers/acpi/thermal.c +++ b/drivers/acpi/thermal.c | |||
@@ -954,7 +954,8 @@ static void acpi_thermal_check(void *data) | |||
954 | /* sys I/F for generic thermal sysfs support */ | 954 | /* sys I/F for generic thermal sysfs support */ |
955 | #define KELVIN_TO_MILLICELSIUS(t) (t * 100 - 273200) | 955 | #define KELVIN_TO_MILLICELSIUS(t) (t * 100 - 273200) |
956 | 956 | ||
957 | static int thermal_get_temp(struct thermal_zone_device *thermal, char *buf) | 957 | static int thermal_get_temp(struct thermal_zone_device *thermal, |
958 | unsigned long *temp) | ||
958 | { | 959 | { |
959 | struct acpi_thermal *tz = thermal->devdata; | 960 | struct acpi_thermal *tz = thermal->devdata; |
960 | int result; | 961 | int result; |
@@ -966,25 +967,28 @@ static int thermal_get_temp(struct thermal_zone_device *thermal, char *buf) | |||
966 | if (result) | 967 | if (result) |
967 | return result; | 968 | return result; |
968 | 969 | ||
969 | return sprintf(buf, "%ld\n", KELVIN_TO_MILLICELSIUS(tz->temperature)); | 970 | *temp = KELVIN_TO_MILLICELSIUS(tz->temperature); |
971 | return 0; | ||
970 | } | 972 | } |
971 | 973 | ||
972 | static const char enabled[] = "kernel"; | 974 | static const char enabled[] = "kernel"; |
973 | static const char disabled[] = "user"; | 975 | static const char disabled[] = "user"; |
974 | static int thermal_get_mode(struct thermal_zone_device *thermal, | 976 | static int thermal_get_mode(struct thermal_zone_device *thermal, |
975 | char *buf) | 977 | enum thermal_device_mode *mode) |
976 | { | 978 | { |
977 | struct acpi_thermal *tz = thermal->devdata; | 979 | struct acpi_thermal *tz = thermal->devdata; |
978 | 980 | ||
979 | if (!tz) | 981 | if (!tz) |
980 | return -EINVAL; | 982 | return -EINVAL; |
981 | 983 | ||
982 | return sprintf(buf, "%s\n", tz->tz_enabled ? | 984 | *mode = tz->tz_enabled ? THERMAL_DEVICE_ENABLED : |
983 | enabled : disabled); | 985 | THERMAL_DEVICE_DISABLED; |
986 | |||
987 | return 0; | ||
984 | } | 988 | } |
985 | 989 | ||
986 | static int thermal_set_mode(struct thermal_zone_device *thermal, | 990 | static int thermal_set_mode(struct thermal_zone_device *thermal, |
987 | const char *buf) | 991 | enum thermal_device_mode mode) |
988 | { | 992 | { |
989 | struct acpi_thermal *tz = thermal->devdata; | 993 | struct acpi_thermal *tz = thermal->devdata; |
990 | int enable; | 994 | int enable; |
@@ -995,9 +999,9 @@ static int thermal_set_mode(struct thermal_zone_device *thermal, | |||
995 | /* | 999 | /* |
996 | * enable/disable thermal management from ACPI thermal driver | 1000 | * enable/disable thermal management from ACPI thermal driver |
997 | */ | 1001 | */ |
998 | if (!strncmp(buf, enabled, sizeof enabled - 1)) | 1002 | if (mode == THERMAL_DEVICE_ENABLED) |
999 | enable = 1; | 1003 | enable = 1; |
1000 | else if (!strncmp(buf, disabled, sizeof disabled - 1)) | 1004 | else if (mode == THERMAL_DEVICE_DISABLED) |
1001 | enable = 0; | 1005 | enable = 0; |
1002 | else | 1006 | else |
1003 | return -EINVAL; | 1007 | return -EINVAL; |
@@ -1013,7 +1017,7 @@ static int thermal_set_mode(struct thermal_zone_device *thermal, | |||
1013 | } | 1017 | } |
1014 | 1018 | ||
1015 | static int thermal_get_trip_type(struct thermal_zone_device *thermal, | 1019 | static int thermal_get_trip_type(struct thermal_zone_device *thermal, |
1016 | int trip, char *buf) | 1020 | int trip, enum thermal_trip_type *type) |
1017 | { | 1021 | { |
1018 | struct acpi_thermal *tz = thermal->devdata; | 1022 | struct acpi_thermal *tz = thermal->devdata; |
1019 | int i; | 1023 | int i; |
@@ -1022,27 +1026,35 @@ static int thermal_get_trip_type(struct thermal_zone_device *thermal, | |||
1022 | return -EINVAL; | 1026 | return -EINVAL; |
1023 | 1027 | ||
1024 | if (tz->trips.critical.flags.valid) { | 1028 | if (tz->trips.critical.flags.valid) { |
1025 | if (!trip) | 1029 | if (!trip) { |
1026 | return sprintf(buf, "critical\n"); | 1030 | *type = THERMAL_TRIP_CRITICAL; |
1031 | return 0; | ||
1032 | } | ||
1027 | trip--; | 1033 | trip--; |
1028 | } | 1034 | } |
1029 | 1035 | ||
1030 | if (tz->trips.hot.flags.valid) { | 1036 | if (tz->trips.hot.flags.valid) { |
1031 | if (!trip) | 1037 | if (!trip) { |
1032 | return sprintf(buf, "hot\n"); | 1038 | *type = THERMAL_TRIP_HOT; |
1039 | return 0; | ||
1040 | } | ||
1033 | trip--; | 1041 | trip--; |
1034 | } | 1042 | } |
1035 | 1043 | ||
1036 | if (tz->trips.passive.flags.valid) { | 1044 | if (tz->trips.passive.flags.valid) { |
1037 | if (!trip) | 1045 | if (!trip) { |
1038 | return sprintf(buf, "passive\n"); | 1046 | *type = THERMAL_TRIP_PASSIVE; |
1047 | return 0; | ||
1048 | } | ||
1039 | trip--; | 1049 | trip--; |
1040 | } | 1050 | } |
1041 | 1051 | ||
1042 | for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE && | 1052 | for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE && |
1043 | tz->trips.active[i].flags.valid; i++) { | 1053 | tz->trips.active[i].flags.valid; i++) { |
1044 | if (!trip) | 1054 | if (!trip) { |
1045 | return sprintf(buf, "active%d\n", i); | 1055 | *type = THERMAL_TRIP_ACTIVE; |
1056 | return 0; | ||
1057 | } | ||
1046 | trip--; | 1058 | trip--; |
1047 | } | 1059 | } |
1048 | 1060 | ||
@@ -1050,7 +1062,7 @@ static int thermal_get_trip_type(struct thermal_zone_device *thermal, | |||
1050 | } | 1062 | } |
1051 | 1063 | ||
1052 | static int thermal_get_trip_temp(struct thermal_zone_device *thermal, | 1064 | static int thermal_get_trip_temp(struct thermal_zone_device *thermal, |
1053 | int trip, char *buf) | 1065 | int trip, unsigned long *temp) |
1054 | { | 1066 | { |
1055 | struct acpi_thermal *tz = thermal->devdata; | 1067 | struct acpi_thermal *tz = thermal->devdata; |
1056 | int i; | 1068 | int i; |
@@ -1059,31 +1071,39 @@ static int thermal_get_trip_temp(struct thermal_zone_device *thermal, | |||
1059 | return -EINVAL; | 1071 | return -EINVAL; |
1060 | 1072 | ||
1061 | if (tz->trips.critical.flags.valid) { | 1073 | if (tz->trips.critical.flags.valid) { |
1062 | if (!trip) | 1074 | if (!trip) { |
1063 | return sprintf(buf, "%ld\n", KELVIN_TO_MILLICELSIUS( | 1075 | *temp = KELVIN_TO_MILLICELSIUS( |
1064 | tz->trips.critical.temperature)); | 1076 | tz->trips.critical.temperature); |
1077 | return 0; | ||
1078 | } | ||
1065 | trip--; | 1079 | trip--; |
1066 | } | 1080 | } |
1067 | 1081 | ||
1068 | if (tz->trips.hot.flags.valid) { | 1082 | if (tz->trips.hot.flags.valid) { |
1069 | if (!trip) | 1083 | if (!trip) { |
1070 | return sprintf(buf, "%ld\n", KELVIN_TO_MILLICELSIUS( | 1084 | *temp = KELVIN_TO_MILLICELSIUS( |
1071 | tz->trips.hot.temperature)); | 1085 | tz->trips.hot.temperature); |
1086 | return 0; | ||
1087 | } | ||
1072 | trip--; | 1088 | trip--; |
1073 | } | 1089 | } |
1074 | 1090 | ||
1075 | if (tz->trips.passive.flags.valid) { | 1091 | if (tz->trips.passive.flags.valid) { |
1076 | if (!trip) | 1092 | if (!trip) { |
1077 | return sprintf(buf, "%ld\n", KELVIN_TO_MILLICELSIUS( | 1093 | *temp = KELVIN_TO_MILLICELSIUS( |
1078 | tz->trips.passive.temperature)); | 1094 | tz->trips.passive.temperature); |
1095 | return 0; | ||
1096 | } | ||
1079 | trip--; | 1097 | trip--; |
1080 | } | 1098 | } |
1081 | 1099 | ||
1082 | for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE && | 1100 | for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE && |
1083 | tz->trips.active[i].flags.valid; i++) { | 1101 | tz->trips.active[i].flags.valid; i++) { |
1084 | if (!trip) | 1102 | if (!trip) { |
1085 | return sprintf(buf, "%ld\n", KELVIN_TO_MILLICELSIUS( | 1103 | *temp = KELVIN_TO_MILLICELSIUS( |
1086 | tz->trips.active[i].temperature)); | 1104 | tz->trips.active[i].temperature); |
1105 | return 0; | ||
1106 | } | ||
1087 | trip--; | 1107 | trip--; |
1088 | } | 1108 | } |
1089 | 1109 | ||
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index bb5ed059114..5259d502add 100644 --- a/drivers/acpi/video.c +++ b/drivers/acpi/video.c | |||
@@ -358,32 +358,36 @@ static struct output_properties acpi_output_properties = { | |||
358 | 358 | ||
359 | 359 | ||
360 | /* thermal cooling device callbacks */ | 360 | /* thermal cooling device callbacks */ |
361 | static int video_get_max_state(struct thermal_cooling_device *cdev, char *buf) | 361 | static int video_get_max_state(struct thermal_cooling_device *cdev, unsigned |
362 | long *state) | ||
362 | { | 363 | { |
363 | struct acpi_device *device = cdev->devdata; | 364 | struct acpi_device *device = cdev->devdata; |
364 | struct acpi_video_device *video = acpi_driver_data(device); | 365 | struct acpi_video_device *video = acpi_driver_data(device); |
365 | 366 | ||
366 | return sprintf(buf, "%d\n", video->brightness->count - 3); | 367 | *state = video->brightness->count - 3; |
368 | return 0; | ||
367 | } | 369 | } |
368 | 370 | ||
369 | static int video_get_cur_state(struct thermal_cooling_device *cdev, char *buf) | 371 | static int video_get_cur_state(struct thermal_cooling_device *cdev, unsigned |
372 | long *state) | ||
370 | { | 373 | { |
371 | struct acpi_device *device = cdev->devdata; | 374 | struct acpi_device *device = cdev->devdata; |
372 | struct acpi_video_device *video = acpi_driver_data(device); | 375 | struct acpi_video_device *video = acpi_driver_data(device); |
373 | unsigned long long level; | 376 | unsigned long long level; |
374 | int state; | 377 | int offset; |
375 | 378 | ||
376 | acpi_video_device_lcd_get_level_current(video, &level); | 379 | acpi_video_device_lcd_get_level_current(video, &level); |
377 | for (state = 2; state < video->brightness->count; state++) | 380 | for (offset = 2; offset < video->brightness->count; offset++) |
378 | if (level == video->brightness->levels[state]) | 381 | if (level == video->brightness->levels[offset]) { |
379 | return sprintf(buf, "%d\n", | 382 | *state = video->brightness->count - offset - 1; |
380 | video->brightness->count - state - 1); | 383 | return 0; |
384 | } | ||
381 | 385 | ||
382 | return -EINVAL; | 386 | return -EINVAL; |
383 | } | 387 | } |
384 | 388 | ||
385 | static int | 389 | static int |
386 | video_set_cur_state(struct thermal_cooling_device *cdev, unsigned int state) | 390 | video_set_cur_state(struct thermal_cooling_device *cdev, unsigned long state) |
387 | { | 391 | { |
388 | struct acpi_device *device = cdev->devdata; | 392 | struct acpi_device *device = cdev->devdata; |
389 | struct acpi_video_device *video = acpi_driver_data(device); | 393 | struct acpi_video_device *video = acpi_driver_data(device); |
diff --git a/drivers/platform/x86/intel_menlow.c b/drivers/platform/x86/intel_menlow.c index 27b7662955b..29432a50be4 100644 --- a/drivers/platform/x86/intel_menlow.c +++ b/drivers/platform/x86/intel_menlow.c | |||
@@ -57,8 +57,8 @@ MODULE_LICENSE("GPL"); | |||
57 | * In that case max_cstate would be n-1 | 57 | * In that case max_cstate would be n-1 |
58 | * GTHS returning '0' would mean that no bandwidth control states are supported | 58 | * GTHS returning '0' would mean that no bandwidth control states are supported |
59 | */ | 59 | */ |
60 | static int memory_get_int_max_bandwidth(struct thermal_cooling_device *cdev, | 60 | static int memory_get_max_bandwidth(struct thermal_cooling_device *cdev, |
61 | unsigned long *max_state) | 61 | unsigned long *max_state) |
62 | { | 62 | { |
63 | struct acpi_device *device = cdev->devdata; | 63 | struct acpi_device *device = cdev->devdata; |
64 | acpi_handle handle = device->handle; | 64 | acpi_handle handle = device->handle; |
@@ -83,22 +83,12 @@ static int memory_get_int_max_bandwidth(struct thermal_cooling_device *cdev, | |||
83 | return 0; | 83 | return 0; |
84 | } | 84 | } |
85 | 85 | ||
86 | static int memory_get_max_bandwidth(struct thermal_cooling_device *cdev, | ||
87 | char *buf) | ||
88 | { | ||
89 | unsigned long value; | ||
90 | if (memory_get_int_max_bandwidth(cdev, &value)) | ||
91 | return -EINVAL; | ||
92 | |||
93 | return sprintf(buf, "%ld\n", value); | ||
94 | } | ||
95 | |||
96 | static int memory_get_cur_bandwidth(struct thermal_cooling_device *cdev, | 86 | static int memory_get_cur_bandwidth(struct thermal_cooling_device *cdev, |
97 | char *buf) | 87 | unsigned long *value) |
98 | { | 88 | { |
99 | struct acpi_device *device = cdev->devdata; | 89 | struct acpi_device *device = cdev->devdata; |
100 | acpi_handle handle = device->handle; | 90 | acpi_handle handle = device->handle; |
101 | unsigned long long value; | 91 | unsigned long long result; |
102 | struct acpi_object_list arg_list; | 92 | struct acpi_object_list arg_list; |
103 | union acpi_object arg; | 93 | union acpi_object arg; |
104 | acpi_status status = AE_OK; | 94 | acpi_status status = AE_OK; |
@@ -108,15 +98,16 @@ static int memory_get_cur_bandwidth(struct thermal_cooling_device *cdev, | |||
108 | arg.type = ACPI_TYPE_INTEGER; | 98 | arg.type = ACPI_TYPE_INTEGER; |
109 | arg.integer.value = MEMORY_ARG_CUR_BANDWIDTH; | 99 | arg.integer.value = MEMORY_ARG_CUR_BANDWIDTH; |
110 | status = acpi_evaluate_integer(handle, MEMORY_GET_BANDWIDTH, | 100 | status = acpi_evaluate_integer(handle, MEMORY_GET_BANDWIDTH, |
111 | &arg_list, &value); | 101 | &arg_list, &result); |
112 | if (ACPI_FAILURE(status)) | 102 | if (ACPI_FAILURE(status)) |
113 | return -EFAULT; | 103 | return -EFAULT; |
114 | 104 | ||
115 | return sprintf(buf, "%llu\n", value); | 105 | *value = result; |
106 | return 0; | ||
116 | } | 107 | } |
117 | 108 | ||
118 | static int memory_set_cur_bandwidth(struct thermal_cooling_device *cdev, | 109 | static int memory_set_cur_bandwidth(struct thermal_cooling_device *cdev, |
119 | unsigned int state) | 110 | unsigned long state) |
120 | { | 111 | { |
121 | struct acpi_device *device = cdev->devdata; | 112 | struct acpi_device *device = cdev->devdata; |
122 | acpi_handle handle = device->handle; | 113 | acpi_handle handle = device->handle; |
@@ -126,7 +117,7 @@ static int memory_set_cur_bandwidth(struct thermal_cooling_device *cdev, | |||
126 | unsigned long long temp; | 117 | unsigned long long temp; |
127 | unsigned long max_state; | 118 | unsigned long max_state; |
128 | 119 | ||
129 | if (memory_get_int_max_bandwidth(cdev, &max_state)) | 120 | if (memory_get_max_bandwidth(cdev, &max_state)) |
130 | return -EFAULT; | 121 | return -EFAULT; |
131 | 122 | ||
132 | if (state > max_state) | 123 | if (state > max_state) |
@@ -142,7 +133,7 @@ static int memory_set_cur_bandwidth(struct thermal_cooling_device *cdev, | |||
142 | &temp); | 133 | &temp); |
143 | 134 | ||
144 | printk(KERN_INFO | 135 | printk(KERN_INFO |
145 | "Bandwidth value was %d: status is %d\n", state, status); | 136 | "Bandwidth value was %ld: status is %d\n", state, status); |
146 | if (ACPI_FAILURE(status)) | 137 | if (ACPI_FAILURE(status)) |
147 | return -EFAULT; | 138 | return -EFAULT; |
148 | 139 | ||
diff --git a/drivers/thermal/thermal_sys.c b/drivers/thermal/thermal_sys.c index 8171ca17b93..bd139adc6d3 100644 --- a/drivers/thermal/thermal_sys.c +++ b/drivers/thermal/thermal_sys.c | |||
@@ -104,22 +104,36 @@ static ssize_t | |||
104 | temp_show(struct device *dev, struct device_attribute *attr, char *buf) | 104 | temp_show(struct device *dev, struct device_attribute *attr, char *buf) |
105 | { | 105 | { |
106 | struct thermal_zone_device *tz = to_thermal_zone(dev); | 106 | struct thermal_zone_device *tz = to_thermal_zone(dev); |
107 | long temperature; | ||
108 | int ret; | ||
107 | 109 | ||
108 | if (!tz->ops->get_temp) | 110 | if (!tz->ops->get_temp) |
109 | return -EPERM; | 111 | return -EPERM; |
110 | 112 | ||
111 | return tz->ops->get_temp(tz, buf); | 113 | ret = tz->ops->get_temp(tz, &temperature); |
114 | |||
115 | if (ret) | ||
116 | return ret; | ||
117 | |||
118 | return sprintf(buf, "%ld\n", temperature); | ||
112 | } | 119 | } |
113 | 120 | ||
114 | static ssize_t | 121 | static ssize_t |
115 | mode_show(struct device *dev, struct device_attribute *attr, char *buf) | 122 | mode_show(struct device *dev, struct device_attribute *attr, char *buf) |
116 | { | 123 | { |
117 | struct thermal_zone_device *tz = to_thermal_zone(dev); | 124 | struct thermal_zone_device *tz = to_thermal_zone(dev); |
125 | enum thermal_device_mode mode; | ||
126 | int result; | ||
118 | 127 | ||
119 | if (!tz->ops->get_mode) | 128 | if (!tz->ops->get_mode) |
120 | return -EPERM; | 129 | return -EPERM; |
121 | 130 | ||
122 | return tz->ops->get_mode(tz, buf); | 131 | result = tz->ops->get_mode(tz, &mode); |
132 | if (result) | ||
133 | return result; | ||
134 | |||
135 | return sprintf(buf, "%s\n", mode == THERMAL_DEVICE_ENABLED ? "enabled" | ||
136 | : "disabled"); | ||
123 | } | 137 | } |
124 | 138 | ||
125 | static ssize_t | 139 | static ssize_t |
@@ -132,7 +146,13 @@ mode_store(struct device *dev, struct device_attribute *attr, | |||
132 | if (!tz->ops->set_mode) | 146 | if (!tz->ops->set_mode) |
133 | return -EPERM; | 147 | return -EPERM; |
134 | 148 | ||
135 | result = tz->ops->set_mode(tz, buf); | 149 | if (!strncmp(buf, "enabled", sizeof("enabled"))) |
150 | result = tz->ops->set_mode(tz, THERMAL_DEVICE_ENABLED); | ||
151 | else if (!strncmp(buf, "disabled", sizeof("disabled"))) | ||
152 | result = tz->ops->set_mode(tz, THERMAL_DEVICE_DISABLED); | ||
153 | else | ||
154 | result = -EINVAL; | ||
155 | |||
136 | if (result) | 156 | if (result) |
137 | return result; | 157 | return result; |
138 | 158 | ||
@@ -144,7 +164,8 @@ trip_point_type_show(struct device *dev, struct device_attribute *attr, | |||
144 | char *buf) | 164 | char *buf) |
145 | { | 165 | { |
146 | struct thermal_zone_device *tz = to_thermal_zone(dev); | 166 | struct thermal_zone_device *tz = to_thermal_zone(dev); |
147 | int trip; | 167 | enum thermal_trip_type type; |
168 | int trip, result; | ||
148 | 169 | ||
149 | if (!tz->ops->get_trip_type) | 170 | if (!tz->ops->get_trip_type) |
150 | return -EPERM; | 171 | return -EPERM; |
@@ -152,7 +173,22 @@ trip_point_type_show(struct device *dev, struct device_attribute *attr, | |||
152 | if (!sscanf(attr->attr.name, "trip_point_%d_type", &trip)) | 173 | if (!sscanf(attr->attr.name, "trip_point_%d_type", &trip)) |
153 | return -EINVAL; | 174 | return -EINVAL; |
154 | 175 | ||
155 | return tz->ops->get_trip_type(tz, trip, buf); | 176 | result = tz->ops->get_trip_type(tz, trip, &type); |
177 | if (result) | ||
178 | return result; | ||
179 | |||
180 | switch (type) { | ||
181 | case THERMAL_TRIP_CRITICAL: | ||
182 | return sprintf(buf, "critical"); | ||
183 | case THERMAL_TRIP_HOT: | ||
184 | return sprintf(buf, "hot"); | ||
185 | case THERMAL_TRIP_PASSIVE: | ||
186 | return sprintf(buf, "passive"); | ||
187 | case THERMAL_TRIP_ACTIVE: | ||
188 | return sprintf(buf, "active"); | ||
189 | default: | ||
190 | return sprintf(buf, "unknown"); | ||
191 | } | ||
156 | } | 192 | } |
157 | 193 | ||
158 | static ssize_t | 194 | static ssize_t |
@@ -160,7 +196,8 @@ trip_point_temp_show(struct device *dev, struct device_attribute *attr, | |||
160 | char *buf) | 196 | char *buf) |
161 | { | 197 | { |
162 | struct thermal_zone_device *tz = to_thermal_zone(dev); | 198 | struct thermal_zone_device *tz = to_thermal_zone(dev); |
163 | int trip; | 199 | int trip, ret; |
200 | long temperature; | ||
164 | 201 | ||
165 | if (!tz->ops->get_trip_temp) | 202 | if (!tz->ops->get_trip_temp) |
166 | return -EPERM; | 203 | return -EPERM; |
@@ -168,7 +205,12 @@ trip_point_temp_show(struct device *dev, struct device_attribute *attr, | |||
168 | if (!sscanf(attr->attr.name, "trip_point_%d_temp", &trip)) | 205 | if (!sscanf(attr->attr.name, "trip_point_%d_temp", &trip)) |
169 | return -EINVAL; | 206 | return -EINVAL; |
170 | 207 | ||
171 | return tz->ops->get_trip_temp(tz, trip, buf); | 208 | ret = tz->ops->get_trip_temp(tz, trip, &temperature); |
209 | |||
210 | if (ret) | ||
211 | return ret; | ||
212 | |||
213 | return sprintf(buf, "%ld\n", temperature); | ||
172 | } | 214 | } |
173 | 215 | ||
174 | static DEVICE_ATTR(type, 0444, type_show, NULL); | 216 | static DEVICE_ATTR(type, 0444, type_show, NULL); |
@@ -236,8 +278,13 @@ thermal_cooling_device_max_state_show(struct device *dev, | |||
236 | struct device_attribute *attr, char *buf) | 278 | struct device_attribute *attr, char *buf) |
237 | { | 279 | { |
238 | struct thermal_cooling_device *cdev = to_cooling_device(dev); | 280 | struct thermal_cooling_device *cdev = to_cooling_device(dev); |
281 | unsigned long state; | ||
282 | int ret; | ||
239 | 283 | ||
240 | return cdev->ops->get_max_state(cdev, buf); | 284 | ret = cdev->ops->get_max_state(cdev, &state); |
285 | if (ret) | ||
286 | return ret; | ||
287 | return sprintf(buf, "%ld\n", state); | ||
241 | } | 288 | } |
242 | 289 | ||
243 | static ssize_t | 290 | static ssize_t |
@@ -245,8 +292,13 @@ thermal_cooling_device_cur_state_show(struct device *dev, | |||
245 | struct device_attribute *attr, char *buf) | 292 | struct device_attribute *attr, char *buf) |
246 | { | 293 | { |
247 | struct thermal_cooling_device *cdev = to_cooling_device(dev); | 294 | struct thermal_cooling_device *cdev = to_cooling_device(dev); |
295 | unsigned long state; | ||
296 | int ret; | ||
248 | 297 | ||
249 | return cdev->ops->get_cur_state(cdev, buf); | 298 | ret = cdev->ops->get_cur_state(cdev, &state); |
299 | if (ret) | ||
300 | return ret; | ||
301 | return sprintf(buf, "%ld\n", state); | ||
250 | } | 302 | } |
251 | 303 | ||
252 | static ssize_t | 304 | static ssize_t |
@@ -255,10 +307,10 @@ thermal_cooling_device_cur_state_store(struct device *dev, | |||
255 | const char *buf, size_t count) | 307 | const char *buf, size_t count) |
256 | { | 308 | { |
257 | struct thermal_cooling_device *cdev = to_cooling_device(dev); | 309 | struct thermal_cooling_device *cdev = to_cooling_device(dev); |
258 | int state; | 310 | unsigned long state; |
259 | int result; | 311 | int result; |
260 | 312 | ||
261 | if (!sscanf(buf, "%d\n", &state)) | 313 | if (!sscanf(buf, "%ld\n", &state)) |
262 | return -EINVAL; | 314 | return -EINVAL; |
263 | 315 | ||
264 | if (state < 0) | 316 | if (state < 0) |
@@ -312,13 +364,20 @@ static DEVICE_ATTR(name, 0444, name_show, NULL); | |||
312 | static ssize_t | 364 | static ssize_t |
313 | temp_input_show(struct device *dev, struct device_attribute *attr, char *buf) | 365 | temp_input_show(struct device *dev, struct device_attribute *attr, char *buf) |
314 | { | 366 | { |
367 | long temperature; | ||
368 | int ret; | ||
315 | struct thermal_hwmon_attr *hwmon_attr | 369 | struct thermal_hwmon_attr *hwmon_attr |
316 | = container_of(attr, struct thermal_hwmon_attr, attr); | 370 | = container_of(attr, struct thermal_hwmon_attr, attr); |
317 | struct thermal_zone_device *tz | 371 | struct thermal_zone_device *tz |
318 | = container_of(hwmon_attr, struct thermal_zone_device, | 372 | = container_of(hwmon_attr, struct thermal_zone_device, |
319 | temp_input); | 373 | temp_input); |
320 | 374 | ||
321 | return tz->ops->get_temp(tz, buf); | 375 | ret = tz->ops->get_temp(tz, &temperature); |
376 | |||
377 | if (ret) | ||
378 | return ret; | ||
379 | |||
380 | return sprintf(buf, "%ld\n", temperature); | ||
322 | } | 381 | } |
323 | 382 | ||
324 | static ssize_t | 383 | static ssize_t |
@@ -330,8 +389,14 @@ temp_crit_show(struct device *dev, struct device_attribute *attr, | |||
330 | struct thermal_zone_device *tz | 389 | struct thermal_zone_device *tz |
331 | = container_of(hwmon_attr, struct thermal_zone_device, | 390 | = container_of(hwmon_attr, struct thermal_zone_device, |
332 | temp_crit); | 391 | temp_crit); |
392 | long temperature; | ||
393 | int ret; | ||
394 | |||
395 | ret = tz->ops->get_trip_temp(tz, 0, &temperature); | ||
396 | if (ret) | ||
397 | return ret; | ||
333 | 398 | ||
334 | return tz->ops->get_trip_temp(tz, 0, buf); | 399 | return sprintf(buf, "%ld\n", temperature); |
335 | } | 400 | } |
336 | 401 | ||
337 | 402 | ||
diff --git a/include/linux/thermal.h b/include/linux/thermal.h index 917707e6151..4cb3292fb6e 100644 --- a/include/linux/thermal.h +++ b/include/linux/thermal.h | |||
@@ -31,23 +31,39 @@ | |||
31 | struct thermal_zone_device; | 31 | struct thermal_zone_device; |
32 | struct thermal_cooling_device; | 32 | struct thermal_cooling_device; |
33 | 33 | ||
34 | enum thermal_device_mode { | ||
35 | THERMAL_DEVICE_DISABLED = 0, | ||
36 | THERMAL_DEVICE_ENABLED, | ||
37 | }; | ||
38 | |||
39 | enum thermal_trip_type { | ||
40 | THERMAL_TRIP_ACTIVE = 0, | ||
41 | THERMAL_TRIP_PASSIVE, | ||
42 | THERMAL_TRIP_HOT, | ||
43 | THERMAL_TRIP_CRITICAL, | ||
44 | }; | ||
45 | |||
34 | struct thermal_zone_device_ops { | 46 | struct thermal_zone_device_ops { |
35 | int (*bind) (struct thermal_zone_device *, | 47 | int (*bind) (struct thermal_zone_device *, |
36 | struct thermal_cooling_device *); | 48 | struct thermal_cooling_device *); |
37 | int (*unbind) (struct thermal_zone_device *, | 49 | int (*unbind) (struct thermal_zone_device *, |
38 | struct thermal_cooling_device *); | 50 | struct thermal_cooling_device *); |
39 | int (*get_temp) (struct thermal_zone_device *, char *); | 51 | int (*get_temp) (struct thermal_zone_device *, unsigned long *); |
40 | int (*get_mode) (struct thermal_zone_device *, char *); | 52 | int (*get_mode) (struct thermal_zone_device *, |
41 | int (*set_mode) (struct thermal_zone_device *, const char *); | 53 | enum thermal_device_mode *); |
42 | int (*get_trip_type) (struct thermal_zone_device *, int, char *); | 54 | int (*set_mode) (struct thermal_zone_device *, |
43 | int (*get_trip_temp) (struct thermal_zone_device *, int, char *); | 55 | enum thermal_device_mode); |
56 | int (*get_trip_type) (struct thermal_zone_device *, int, | ||
57 | enum thermal_trip_type *); | ||
58 | int (*get_trip_temp) (struct thermal_zone_device *, int, | ||
59 | unsigned long *); | ||
44 | int (*get_crit_temp) (struct thermal_zone_device *, unsigned long *); | 60 | int (*get_crit_temp) (struct thermal_zone_device *, unsigned long *); |
45 | }; | 61 | }; |
46 | 62 | ||
47 | struct thermal_cooling_device_ops { | 63 | struct thermal_cooling_device_ops { |
48 | int (*get_max_state) (struct thermal_cooling_device *, char *); | 64 | int (*get_max_state) (struct thermal_cooling_device *, unsigned long *); |
49 | int (*get_cur_state) (struct thermal_cooling_device *, char *); | 65 | int (*get_cur_state) (struct thermal_cooling_device *, unsigned long *); |
50 | int (*set_cur_state) (struct thermal_cooling_device *, unsigned int); | 66 | int (*set_cur_state) (struct thermal_cooling_device *, unsigned long); |
51 | }; | 67 | }; |
52 | 68 | ||
53 | #define THERMAL_TRIPS_NONE -1 | 69 | #define THERMAL_TRIPS_NONE -1 |