1 // SPDX-License-Identifier: GPL-2.0-only
3 * INT3402 thermal driver for memory temperature reporting
5 * Copyright (C) 2014, Intel Corporation
6 * Authors: Aaron Lu <aaron.lu@intel.com>
9 #include <linux/module.h>
10 #include <linux/platform_device.h>
11 #include <linux/acpi.h>
12 #include <linux/thermal.h>
13 #include "int340x_thermal_zone.h"
15 #define INT3402_PERF_CHANGED_EVENT 0x80
16 #define INT3402_THERMAL_EVENT 0x90
18 struct int3402_thermal_data
{
20 struct int34x_thermal_zone
*int340x_zone
;
23 static void int3402_notify(acpi_handle handle
, u32 event
, void *data
)
25 struct int3402_thermal_data
*priv
= data
;
31 case INT3402_PERF_CHANGED_EVENT
:
33 case INT3402_THERMAL_EVENT
:
34 int340x_thermal_zone_device_update(priv
->int340x_zone
,
35 THERMAL_TRIP_VIOLATED
);
42 static int int3402_thermal_probe(struct platform_device
*pdev
)
44 struct acpi_device
*adev
= ACPI_COMPANION(&pdev
->dev
);
45 struct int3402_thermal_data
*d
;
48 if (!acpi_has_method(adev
->handle
, "_TMP"))
51 d
= devm_kzalloc(&pdev
->dev
, sizeof(*d
), GFP_KERNEL
);
55 d
->int340x_zone
= int340x_thermal_zone_add(adev
, NULL
);
56 if (IS_ERR(d
->int340x_zone
))
57 return PTR_ERR(d
->int340x_zone
);
59 ret
= acpi_install_notify_handler(adev
->handle
,
64 int340x_thermal_zone_remove(d
->int340x_zone
);
68 d
->handle
= adev
->handle
;
69 platform_set_drvdata(pdev
, d
);
74 static int int3402_thermal_remove(struct platform_device
*pdev
)
76 struct int3402_thermal_data
*d
= platform_get_drvdata(pdev
);
78 acpi_remove_notify_handler(d
->handle
,
79 ACPI_DEVICE_NOTIFY
, int3402_notify
);
80 int340x_thermal_zone_remove(d
->int340x_zone
);
85 static const struct acpi_device_id int3402_thermal_match
[] = {
90 MODULE_DEVICE_TABLE(acpi
, int3402_thermal_match
);
92 static struct platform_driver int3402_thermal_driver
= {
93 .probe
= int3402_thermal_probe
,
94 .remove
= int3402_thermal_remove
,
96 .name
= "int3402 thermal",
97 .acpi_match_table
= int3402_thermal_match
,
101 module_platform_driver(int3402_thermal_driver
);
103 MODULE_DESCRIPTION("INT3402 Thermal driver");
104 MODULE_LICENSE("GPL");