]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
platform/x86/amd/pmc: Check for intermediate wakeup in function
authorDaniel Gibson <daniel@gibson.sh>
Thu, 11 Jun 2026 15:04:23 +0000 (17:04 +0200)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Thu, 11 Jun 2026 16:53:51 +0000 (19:53 +0300)
Refactor code introduced by commit 9f5595d5f03f ("pmc: Require at
least 2.5 seconds between HW sleep cycles") to allow adding different
conditions for that delay in an upcoming change.

Signed-off-by: Daniel Gibson <daniel@gibson.sh>
Cc: stable@vger.kernel.org
Link: https://patch.msgid.link/20260611150426.3683372-2-daniel@gibson.sh
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
drivers/platform/x86/amd/pmc/pmc.c

index ccb37383b33775afd28ae5877747e1b69d408fcb..25509099a958846e408b63b3eeac802867cec06e 100644 (file)
@@ -670,6 +670,19 @@ static int amd_pmc_verify_czn_rtc(struct amd_pmc_dev *pdev, u32 *arg)
        return rc;
 }
 
+static bool amd_pmc_intermediate_wakeup_need_delay(struct amd_pmc_dev *pdev)
+{
+       /*
+        * Starting a new HW sleep cycle right after waking from one
+        * can cause electrical problems triggering the over voltage protection.
+        * That is avoided by delaying the next suspend a bit, see also
+        * https://lore.kernel.org/all/20250414162446.3853194-1-superm1@kernel.org/
+        */
+       struct smu_metrics table;
+
+       return get_metrics_table(pdev, &table) == 0 && table.s0i3_last_entry_status;
+}
+
 static void amd_pmc_s2idle_prepare(void)
 {
        struct amd_pmc_dev *pdev = &pmc;
@@ -702,11 +715,9 @@ static void amd_pmc_s2idle_prepare(void)
 static void amd_pmc_s2idle_check(void)
 {
        struct amd_pmc_dev *pdev = &pmc;
-       struct smu_metrics table;
        int rc;
 
-       /* Avoid triggering OVP */
-       if (!get_metrics_table(pdev, &table) && table.s0i3_last_entry_status)
+       if (amd_pmc_intermediate_wakeup_need_delay(pdev))
                msleep(2500);
 
        /* Dump the IdleMask before we add to the STB */