mtk_cpufreq_probe() registers the cpufreq driver and retains clocks, regulators, OPP tables and OPP notifiers in dvfs_info_list. There is no platform remove callback to undo this on device unbind or module unload. The devm-allocated DVFS information is freed while the list and cpufreq driver still refer to it, in addition to leaking the retained resources. Unregister the cpufreq driver before releasing the DVFS resources and removing their entries from the list, as in the probe failure path. Fixes: 89b56047f6f9 ("cpufreq: mt8173: Move resources allocation into ->probe()") Cc: stable@vger.kernel.org Assisted-by: DeepSeek-V4.1-Flash and OpenAI Codex Signed-off-by: Wentao Liang --- drivers/cpufreq/mediatek-cpufreq.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/drivers/cpufreq/mediatek-cpufreq.c b/drivers/cpufreq/mediatek-cpufreq.c index f9b1eca176eb..5776310d96c0 100644 --- a/drivers/cpufreq/mediatek-cpufreq.c +++ b/drivers/cpufreq/mediatek-cpufreq.c @@ -677,11 +677,24 @@ static int mtk_cpufreq_probe(struct platform_device *pdev) return ret; } +static void mtk_cpufreq_remove(struct platform_device *pdev) +{ + struct mtk_cpu_dvfs_info *info, *tmp; + + cpufreq_unregister_driver(&mtk_cpufreq_driver); + + list_for_each_entry_safe(info, tmp, &dvfs_info_list, list_head) { + mtk_cpu_dvfs_info_release(info); + list_del(&info->list_head); + } +} + static struct platform_driver mtk_cpufreq_platdrv = { .driver = { .name = "mtk-cpufreq", }, .probe = mtk_cpufreq_probe, + .remove = mtk_cpufreq_remove, }; static const struct mtk_cpufreq_platform_data mt2701_platform_data = { -- 2.34.1