[PATCH] platform/x86/amd/pmc: Fix RTC device leak in amd_pmc_verify_czn_rtc()

From: Wentao Liang

Date: Thu Sep 17 2026 - 09:59:08 EST


rtc_class_open() takes a reference to the RTC device, but all paths
that return after it succeeded, apart from the final one where the
alarm is programmed, leave the function without dropping it. Route
them through a common exit that calls rtc_class_close().

Fixes: 59348401ebed ("platform/x86: amd-pmc: Add special handling for timer based S0i3 wakeup")
Cc: stable@xxxxxxxxxxxxxxx
Signed-off-by: Wentao Liang <vulab@xxxxxxxxxxx>
---
drivers/platform/x86/amd/pmc/pmc.c | 21 ++++++++++++++-------
1 file changed, 14 insertions(+), 7 deletions(-)

diff --git a/drivers/platform/x86/amd/pmc/pmc.c b/drivers/platform/x86/amd/pmc/pmc.c
index cae3fcafd4d7..f40e8d9b124a 100644
--- a/drivers/platform/x86/amd/pmc/pmc.c
+++ b/drivers/platform/x86/amd/pmc/pmc.c
@@ -569,32 +569,39 @@ static int amd_pmc_verify_czn_rtc(struct amd_pmc_dev *pdev, u32 *arg)
return 0;
rc = rtc_read_alarm(rtc_device, &alarm);
if (rc)
- return rc;
+ goto out;
if (!alarm.enabled) {
dev_dbg(pdev->dev, "alarm not enabled\n");
- return 0;
+ rc = 0;
+ goto out;
}
rc = rtc_read_time(rtc_device, &tm);
if (rc)
- return rc;
+ goto out;
then = rtc_tm_to_time64(&alarm.time);
now = rtc_tm_to_time64(&tm);
duration = then-now;

/* in the past */
- if (then < now)
- return 0;
+ if (then < now) {
+ rc = 0;
+ goto out;
+ }

/* will be stored in upper 16 bits of s0i3 hint argument,
* so timer wakeup from s0i3 is limited to ~18 hours or less
*/
- if (duration <= 4 || duration > U16_MAX)
- return -EINVAL;
+ if (duration <= 4 || duration > U16_MAX) {
+ rc = -EINVAL;
+ goto out;
+ }

*arg |= (duration << 16);
rc = rtc_alarm_irq_enable(rtc_device, 0);
pm_pr_dbg("wakeup timer programmed for %lld seconds\n", duration);

+out:
+ rtc_class_close(rtc_device);
return rc;
}

--
2.34.1