c4fcf1ada4
When the driver resumes, the tcc offset is set back to its previous value. But this only works if the value was user defined as otherwise the offset isn't saved. This asymmetric logic is harder to maintain and introduced some issues. Improve the logic by saving the tcc offset in a suspend op, so the right value is always restored after a resume. Signed-off-by: Antoine Tenart <atenart@kernel.org> Reviewed-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> Tested-by: Srinivas Pandruvada <srinivas.pI andruvada@linux.intel.com> Link: https://lore.kernel.org/r/20210909085613.5577-3-atenart@kernel.org Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
89 lines
1.9 KiB
C
89 lines
1.9 KiB
C
// SPDX-License-Identifier: GPL-2.0-only
|
|
/*
|
|
* INT3401 processor thermal device
|
|
* Copyright (c) 2020, Intel Corporation.
|
|
*/
|
|
#include <linux/acpi.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/module.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/thermal.h>
|
|
|
|
#include "int340x_thermal_zone.h"
|
|
#include "processor_thermal_device.h"
|
|
|
|
static const struct acpi_device_id int3401_device_ids[] = {
|
|
{"INT3401", 0},
|
|
{"", 0},
|
|
};
|
|
MODULE_DEVICE_TABLE(acpi, int3401_device_ids);
|
|
|
|
static int int3401_add(struct platform_device *pdev)
|
|
{
|
|
struct proc_thermal_device *proc_priv;
|
|
int ret;
|
|
|
|
proc_priv = devm_kzalloc(&pdev->dev, sizeof(*proc_priv), GFP_KERNEL);
|
|
if (!proc_priv)
|
|
return -ENOMEM;
|
|
|
|
ret = proc_thermal_add(&pdev->dev, proc_priv);
|
|
if (ret)
|
|
return ret;
|
|
|
|
platform_set_drvdata(pdev, proc_priv);
|
|
|
|
return ret;
|
|
}
|
|
|
|
static int int3401_remove(struct platform_device *pdev)
|
|
{
|
|
proc_thermal_remove(platform_get_drvdata(pdev));
|
|
|
|
return 0;
|
|
}
|
|
|
|
#ifdef CONFIG_PM_SLEEP
|
|
static int int3401_thermal_suspend(struct device *dev)
|
|
{
|
|
return proc_thermal_suspend(dev);
|
|
}
|
|
static int int3401_thermal_resume(struct device *dev)
|
|
{
|
|
return proc_thermal_resume(dev);
|
|
}
|
|
#else
|
|
#define int3401_thermal_suspend NULL
|
|
#define int3401_thermal_resume NULL
|
|
#endif
|
|
|
|
static SIMPLE_DEV_PM_OPS(int3401_proc_thermal_pm, int3401_thermal_suspend,
|
|
int3401_thermal_resume);
|
|
|
|
static struct platform_driver int3401_driver = {
|
|
.probe = int3401_add,
|
|
.remove = int3401_remove,
|
|
.driver = {
|
|
.name = "int3401 thermal",
|
|
.acpi_match_table = int3401_device_ids,
|
|
.pm = &int3401_proc_thermal_pm,
|
|
},
|
|
};
|
|
|
|
static int __init proc_thermal_init(void)
|
|
{
|
|
return platform_driver_register(&int3401_driver);
|
|
}
|
|
|
|
static void __exit proc_thermal_exit(void)
|
|
{
|
|
platform_driver_unregister(&int3401_driver);
|
|
}
|
|
|
|
module_init(proc_thermal_init);
|
|
module_exit(proc_thermal_exit);
|
|
|
|
MODULE_AUTHOR("Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>");
|
|
MODULE_DESCRIPTION("Processor Thermal Reporting Device Driver");
|
|
MODULE_LICENSE("GPL v2");
|