1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * INT3401 processor thermal device 4 * Copyright (c) 2020, Intel Corporation. 5 */ 6 #include <linux/acpi.h> 7 #include <linux/kernel.h> 8 #include <linux/module.h> 9 #include <linux/platform_device.h> 10 #include <linux/thermal.h> 11 12 #include "int340x_thermal_zone.h" 13 #include "processor_thermal_device.h" 14 15 static const struct acpi_device_id int3401_device_ids[] = { 16 {"INT3401", 0}, 17 {"", 0}, 18 }; 19 MODULE_DEVICE_TABLE(acpi, int3401_device_ids); 20 21 static int int3401_add(struct platform_device *pdev) 22 { 23 struct proc_thermal_device *proc_priv; 24 int ret; 25 26 proc_priv = devm_kzalloc(&pdev->dev, sizeof(*proc_priv), GFP_KERNEL); 27 if (!proc_priv) 28 return -ENOMEM; 29 30 ret = proc_thermal_add(&pdev->dev, proc_priv); 31 if (ret) 32 return ret; 33 34 platform_set_drvdata(pdev, proc_priv); 35 36 return ret; 37 } 38 39 static int int3401_remove(struct platform_device *pdev) 40 { 41 proc_thermal_remove(platform_get_drvdata(pdev)); 42 43 return 0; 44 } 45 46 #ifdef CONFIG_PM_SLEEP 47 static int int3401_thermal_resume(struct device *dev) 48 { 49 return proc_thermal_resume(dev); 50 } 51 #else 52 #define int3401_thermal_resume NULL 53 #endif 54 55 static SIMPLE_DEV_PM_OPS(int3401_proc_thermal_pm, NULL, int3401_thermal_resume); 56 57 static struct platform_driver int3401_driver = { 58 .probe = int3401_add, 59 .remove = int3401_remove, 60 .driver = { 61 .name = "int3401 thermal", 62 .acpi_match_table = int3401_device_ids, 63 .pm = &int3401_proc_thermal_pm, 64 }, 65 }; 66 67 static int __init proc_thermal_init(void) 68 { 69 return platform_driver_register(&int3401_driver); 70 } 71 72 static void __exit proc_thermal_exit(void) 73 { 74 platform_driver_unregister(&int3401_driver); 75 } 76 77 module_init(proc_thermal_init); 78 module_exit(proc_thermal_exit); 79 80 MODULE_AUTHOR("Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>"); 81 MODULE_DESCRIPTION("Processor Thermal Reporting Device Driver"); 82 MODULE_LICENSE("GPL v2"); 83