Thermal/int340x: LPAT conversion for temperature
authorSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Wed, 28 Jan 2015 19:56:48 +0000 (11:56 -0800)
committerZhang Rui <rui.zhang@intel.com>
Thu, 29 Jan 2015 13:02:12 +0000 (21:02 +0800)
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>
drivers/thermal/int340x_thermal/int340x_thermal_zone.c
drivers/thermal/int340x_thermal/int340x_thermal_zone.h

index 162e545cc93a8adf577900e6036d517b24fecc29..f88b0887702568578a5d288f925ab1c5b08e7a97 100644 (file)
@@ -33,8 +33,17 @@ static int int340x_thermal_get_zone_temp(struct thermal_zone_device *zone,
        if (ACPI_FAILURE(status))
                return -EIO;
 
-       /* _TMP returns the temperature in tenths of degrees Kelvin */
-       *temp = DECI_KELVIN_TO_MILLICELSIUS(tmp);
+       if (d->lpat_table) {
+               int conv_temp;
+
+               conv_temp = acpi_lpat_raw_to_temp(d->lpat_table, (int)tmp);
+               if (conv_temp < 0)
+                       return conv_temp;
+
+               *temp = (unsigned long)conv_temp * 10;
+       } else
+               /* _TMP returns the temperature in tenths of degrees Kelvin */
+               *temp = DECI_KELVIN_TO_MILLICELSIUS(tmp);
 
        return 0;
 }
@@ -227,6 +236,8 @@ struct int34x_thermal_zone *int340x_thermal_zone_add(struct acpi_device *adev,
                int34x_thermal_zone->act_trips[i].id = trip_cnt++;
                int34x_thermal_zone->act_trips[i].valid = true;
        }
+       int34x_thermal_zone->lpat_table = acpi_lpat_get_conversion_table(
+                                                               adev->handle);
 
        int34x_thermal_zone->zone = thermal_zone_device_register(
                                                acpi_device_bid(adev),
@@ -237,11 +248,13 @@ struct int34x_thermal_zone *int340x_thermal_zone_add(struct acpi_device *adev,
                                                0, 0);
        if (IS_ERR(int34x_thermal_zone->zone)) {
                ret = PTR_ERR(int34x_thermal_zone->zone);
-               goto free_mem;
+               goto free_lpat;
        }
 
        return int34x_thermal_zone;
 
+free_lpat:
+       acpi_lpat_free_conversion_table(int34x_thermal_zone->lpat_table);
 free_mem:
        kfree(int34x_thermal_zone);
        return ERR_PTR(ret);
@@ -252,6 +265,7 @@ void int340x_thermal_zone_remove(struct int34x_thermal_zone
                                 *int34x_thermal_zone)
 {
        thermal_zone_device_unregister(int34x_thermal_zone->zone);
+       acpi_lpat_free_conversion_table(int34x_thermal_zone->lpat_table);
        kfree(int34x_thermal_zone);
 }
 EXPORT_SYMBOL_GPL(int340x_thermal_zone_remove);
index 11f2f5260c3adda6073102141dd5f9cc23ca4676..9f38ab72c4bf54f39318bd851674569eb8d757fd 100644 (file)
@@ -16,6 +16,8 @@
 #ifndef __INT340X_THERMAL_ZONE_H__
 #define __INT340X_THERMAL_ZONE_H__
 
+#include <acpi/acpi_lpat.h>
+
 #define INT340X_THERMAL_MAX_ACT_TRIP_COUNT     10
 
 struct active_trip {
@@ -38,6 +40,7 @@ struct int34x_thermal_zone {
        struct thermal_zone_device *zone;
        struct thermal_zone_device_ops *override_ops;
        void *priv_data;
+       struct acpi_lpat_conversion_table *lpat_table;
 };
 
 struct int34x_thermal_zone *int340x_thermal_zone_add(struct acpi_device *,