]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
Thermal/int340x/int3402: Provide notification support
authorSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Tue, 23 Dec 2014 23:29:57 +0000 (15:29 -0800)
committerZhang Rui <rui.zhang@intel.com>
Tue, 20 Jan 2015 01:30:34 +0000 (09:30 +0800)
This driver supports programmable trips, but didn't register
notification handler to receive threshold violation notification.

Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
drivers/thermal/int340x_thermal/int3402_thermal.c

index 7ffc749ce0f2be6ce5009a8ce5967bbb10156bb0..69df3d960303170070d3a35f2037602129fbb613 100644 (file)
 #include <linux/thermal.h>
 #include "int340x_thermal_zone.h"
 
+#define INT3402_PERF_CHANGED_EVENT     0x80
+#define INT3402_THERMAL_EVENT          0x90
+
 struct int3402_thermal_data {
        acpi_handle *handle;
        struct int34x_thermal_zone *int340x_zone;
 };
 
+static void int3402_notify(acpi_handle handle, u32 event, void *data)
+{
+       struct int3402_thermal_data *priv = data;
+
+       if (!priv)
+               return;
+
+       switch (event) {
+       case INT3402_PERF_CHANGED_EVENT:
+               break;
+       case INT3402_THERMAL_EVENT:
+               int340x_thermal_zone_device_update(priv->int340x_zone);
+               break;
+       default:
+               break;
+       }
+}
+
 static int int3402_thermal_probe(struct platform_device *pdev)
 {
        struct acpi_device *adev = ACPI_COMPANION(&pdev->dev);
        struct int3402_thermal_data *d;
+       int ret;
 
        if (!acpi_has_method(adev->handle, "_TMP"))
                return -ENODEV;
@@ -37,6 +59,15 @@ static int int3402_thermal_probe(struct platform_device *pdev)
        if (IS_ERR(d->int340x_zone))
                return PTR_ERR(d->int340x_zone);
 
+       ret = acpi_install_notify_handler(adev->handle,
+                                         ACPI_DEVICE_NOTIFY,
+                                         int3402_notify,
+                                         d);
+       if (ret) {
+               int340x_thermal_zone_remove(d->int340x_zone);
+               return ret;
+       }
+
        d->handle = adev->handle;
        platform_set_drvdata(pdev, d);
 
@@ -47,6 +78,8 @@ static int int3402_thermal_remove(struct platform_device *pdev)
 {
        struct int3402_thermal_data *d = platform_get_drvdata(pdev);
 
+       acpi_remove_notify_handler(d->handle,
+                                  ACPI_DEVICE_NOTIFY, int3402_notify);
        int340x_thermal_zone_remove(d->int340x_zone);
 
        return 0;