diff options
author | Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> | 2015-01-28 14:56:48 -0500 |
---|---|---|
committer | Zhang Rui <rui.zhang@intel.com> | 2015-01-29 08:02:12 -0500 |
commit | 317d9dda0522c18eb230367c88601c2e46cda4f8 (patch) | |
tree | 27fb5b40515e4ebf1e99f2f1b73270caaf39acfe | |
parent | ac586e2d6afb1935246c75f0e27a5c628712dbfa (diff) |
Thermal/int340x: LPAT conversion for temperature
When LPAT table is present, we need to convert raw temperature to
real temp using LPAT.
Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
-rw-r--r-- | drivers/thermal/int340x_thermal/int340x_thermal_zone.c | 20 | ||||
-rw-r--r-- | drivers/thermal/int340x_thermal/int340x_thermal_zone.h | 3 |
2 files changed, 20 insertions, 3 deletions
diff --git a/drivers/thermal/int340x_thermal/int340x_thermal_zone.c b/drivers/thermal/int340x_thermal/int340x_thermal_zone.c index 162e545cc93a..f88b08877025 100644 --- a/drivers/thermal/int340x_thermal/int340x_thermal_zone.c +++ b/drivers/thermal/int340x_thermal/int340x_thermal_zone.c | |||
@@ -33,8 +33,17 @@ static int int340x_thermal_get_zone_temp(struct thermal_zone_device *zone, | |||
33 | if (ACPI_FAILURE(status)) | 33 | if (ACPI_FAILURE(status)) |
34 | return -EIO; | 34 | return -EIO; |
35 | 35 | ||
36 | /* _TMP returns the temperature in tenths of degrees Kelvin */ | 36 | if (d->lpat_table) { |
37 | *temp = DECI_KELVIN_TO_MILLICELSIUS(tmp); | 37 | int conv_temp; |
38 | |||
39 | conv_temp = acpi_lpat_raw_to_temp(d->lpat_table, (int)tmp); | ||
40 | if (conv_temp < 0) | ||
41 | return conv_temp; | ||
42 | |||
43 | *temp = (unsigned long)conv_temp * 10; | ||
44 | } else | ||
45 | /* _TMP returns the temperature in tenths of degrees Kelvin */ | ||
46 | *temp = DECI_KELVIN_TO_MILLICELSIUS(tmp); | ||
38 | 47 | ||
39 | return 0; | 48 | return 0; |
40 | } | 49 | } |
@@ -227,6 +236,8 @@ struct int34x_thermal_zone *int340x_thermal_zone_add(struct acpi_device *adev, | |||
227 | int34x_thermal_zone->act_trips[i].id = trip_cnt++; | 236 | int34x_thermal_zone->act_trips[i].id = trip_cnt++; |
228 | int34x_thermal_zone->act_trips[i].valid = true; | 237 | int34x_thermal_zone->act_trips[i].valid = true; |
229 | } | 238 | } |
239 | int34x_thermal_zone->lpat_table = acpi_lpat_get_conversion_table( | ||
240 | adev->handle); | ||
230 | 241 | ||
231 | int34x_thermal_zone->zone = thermal_zone_device_register( | 242 | int34x_thermal_zone->zone = thermal_zone_device_register( |
232 | acpi_device_bid(adev), | 243 | acpi_device_bid(adev), |
@@ -237,11 +248,13 @@ struct int34x_thermal_zone *int340x_thermal_zone_add(struct acpi_device *adev, | |||
237 | 0, 0); | 248 | 0, 0); |
238 | if (IS_ERR(int34x_thermal_zone->zone)) { | 249 | if (IS_ERR(int34x_thermal_zone->zone)) { |
239 | ret = PTR_ERR(int34x_thermal_zone->zone); | 250 | ret = PTR_ERR(int34x_thermal_zone->zone); |
240 | goto free_mem; | 251 | goto free_lpat; |
241 | } | 252 | } |
242 | 253 | ||
243 | return int34x_thermal_zone; | 254 | return int34x_thermal_zone; |
244 | 255 | ||
256 | free_lpat: | ||
257 | acpi_lpat_free_conversion_table(int34x_thermal_zone->lpat_table); | ||
245 | free_mem: | 258 | free_mem: |
246 | kfree(int34x_thermal_zone); | 259 | kfree(int34x_thermal_zone); |
247 | return ERR_PTR(ret); | 260 | return ERR_PTR(ret); |
@@ -252,6 +265,7 @@ void int340x_thermal_zone_remove(struct int34x_thermal_zone | |||
252 | *int34x_thermal_zone) | 265 | *int34x_thermal_zone) |
253 | { | 266 | { |
254 | thermal_zone_device_unregister(int34x_thermal_zone->zone); | 267 | thermal_zone_device_unregister(int34x_thermal_zone->zone); |
268 | acpi_lpat_free_conversion_table(int34x_thermal_zone->lpat_table); | ||
255 | kfree(int34x_thermal_zone); | 269 | kfree(int34x_thermal_zone); |
256 | } | 270 | } |
257 | EXPORT_SYMBOL_GPL(int340x_thermal_zone_remove); | 271 | EXPORT_SYMBOL_GPL(int340x_thermal_zone_remove); |
diff --git a/drivers/thermal/int340x_thermal/int340x_thermal_zone.h b/drivers/thermal/int340x_thermal/int340x_thermal_zone.h index 11f2f5260c3a..9f38ab72c4bf 100644 --- a/drivers/thermal/int340x_thermal/int340x_thermal_zone.h +++ b/drivers/thermal/int340x_thermal/int340x_thermal_zone.h | |||
@@ -16,6 +16,8 @@ | |||
16 | #ifndef __INT340X_THERMAL_ZONE_H__ | 16 | #ifndef __INT340X_THERMAL_ZONE_H__ |
17 | #define __INT340X_THERMAL_ZONE_H__ | 17 | #define __INT340X_THERMAL_ZONE_H__ |
18 | 18 | ||
19 | #include <acpi/acpi_lpat.h> | ||
20 | |||
19 | #define INT340X_THERMAL_MAX_ACT_TRIP_COUNT 10 | 21 | #define INT340X_THERMAL_MAX_ACT_TRIP_COUNT 10 |
20 | 22 | ||
21 | struct active_trip { | 23 | struct active_trip { |
@@ -38,6 +40,7 @@ struct int34x_thermal_zone { | |||
38 | struct thermal_zone_device *zone; | 40 | struct thermal_zone_device *zone; |
39 | struct thermal_zone_device_ops *override_ops; | 41 | struct thermal_zone_device_ops *override_ops; |
40 | void *priv_data; | 42 | void *priv_data; |
43 | struct acpi_lpat_conversion_table *lpat_table; | ||
41 | }; | 44 | }; |
42 | 45 | ||
43 | struct int34x_thermal_zone *int340x_thermal_zone_add(struct acpi_device *, | 46 | struct int34x_thermal_zone *int340x_thermal_zone_add(struct acpi_device *, |