2 * INT3402 thermal driver for memory temperature reporting
4 * Copyright (C) 2014, Intel Corporation
5 * Authors: Aaron Lu <aaron.lu@intel.com>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
13 #include <linux/module.h>
14 #include <linux/platform_device.h>
15 #include <linux/acpi.h>
16 #include <linux/thermal.h>
17 #include "int340x_thermal_zone.h"
19 #define INT3402_PERF_CHANGED_EVENT 0x80
20 #define INT3402_THERMAL_EVENT 0x90
22 struct int3402_thermal_data
{
24 struct int34x_thermal_zone
*int340x_zone
;
27 static void int3402_notify(acpi_handle handle
, u32 event
, void *data
)
29 struct int3402_thermal_data
*priv
= data
;
35 case INT3402_PERF_CHANGED_EVENT
:
37 case INT3402_THERMAL_EVENT
:
38 int340x_thermal_zone_device_update(priv
->int340x_zone
);
45 static int int3402_thermal_probe(struct platform_device
*pdev
)
47 struct acpi_device
*adev
= ACPI_COMPANION(&pdev
->dev
);
48 struct int3402_thermal_data
*d
;
51 if (!acpi_has_method(adev
->handle
, "_TMP"))
54 d
= devm_kzalloc(&pdev
->dev
, sizeof(*d
), GFP_KERNEL
);
58 d
->int340x_zone
= int340x_thermal_zone_add(adev
, NULL
);
59 if (IS_ERR(d
->int340x_zone
))
60 return PTR_ERR(d
->int340x_zone
);
62 ret
= acpi_install_notify_handler(adev
->handle
,
67 int340x_thermal_zone_remove(d
->int340x_zone
);
71 d
->handle
= adev
->handle
;
72 platform_set_drvdata(pdev
, d
);
77 static int int3402_thermal_remove(struct platform_device
*pdev
)
79 struct int3402_thermal_data
*d
= platform_get_drvdata(pdev
);
81 acpi_remove_notify_handler(d
->handle
,
82 ACPI_DEVICE_NOTIFY
, int3402_notify
);
83 int340x_thermal_zone_remove(d
->int340x_zone
);
88 static const struct acpi_device_id int3402_thermal_match
[] = {
93 MODULE_DEVICE_TABLE(acpi
, int3402_thermal_match
);
95 static struct platform_driver int3402_thermal_driver
= {
96 .probe
= int3402_thermal_probe
,
97 .remove
= int3402_thermal_remove
,
99 .name
= "int3402 thermal",
100 .acpi_match_table
= int3402_thermal_match
,
104 module_platform_driver(int3402_thermal_driver
);
106 MODULE_DESCRIPTION("INT3402 Thermal driver");
107 MODULE_LICENSE("GPL");