summaryrefslogtreecommitdiffstats
path: root/drivers/platform/x86/pmc_atom.c
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2024-03-05 11:59:14 +0100
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>2024-03-12 12:48:20 +0200
commit86cef4593e04b192d62b71f7bcf97fced916150b (patch)
tree58e879a56143fb9b02f9416ba4ce5c43aea7a12d /drivers/platform/x86/pmc_atom.c
parent1bde4afcd190e74368438ddf98d50e637ff9303f (diff)
downloadlinux-stable-86cef4593e04b192d62b71f7bcf97fced916150b.tar.gz
linux-stable-86cef4593e04b192d62b71f7bcf97fced916150b.tar.bz2
linux-stable-86cef4593e04b192d62b71f7bcf97fced916150b.zip
platform/x86: pmc_atom: Check state of PMC clocks on s2idle
Extend the s2idle check with checking that none of the PMC clocks is in the forced-on state. If one of the clocks is in forced on state then S0i3 cannot be reached. Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> Signed-off-by: Hans de Goede <hdegoede@redhat.com> Link: https://lore.kernel.org/r/20240305105915.76242-5-hdegoede@redhat.com Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Diffstat (limited to 'drivers/platform/x86/pmc_atom.c')
-rw-r--r--drivers/platform/x86/pmc_atom.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/platform/x86/pmc_atom.c b/drivers/platform/x86/pmc_atom.c
index 7d391bd36eae..0aa7076bc9cc 100644
--- a/drivers/platform/x86/pmc_atom.c
+++ b/drivers/platform/x86/pmc_atom.c
@@ -477,6 +477,7 @@ static void pmc_s2idle_check(void)
u32 func_dis, func_dis_2;
u32 d3_sts_0, d3_sts_1;
u32 false_pos_sts_0, false_pos_sts_1;
+ int i;
func_dis = pmc_reg_read(pmc, PMC_FUNC_DIS);
func_dis_2 = pmc_reg_read(pmc, PMC_FUNC_DIS_2);
@@ -501,6 +502,16 @@ static void pmc_s2idle_check(void)
pmc_dev_state_check(d3_sts_0, m->d3_sts_0, func_dis, m->func_dis, false_pos_sts_0);
pmc_dev_state_check(d3_sts_1, m->d3_sts_1, func_dis_2, m->func_dis_2, false_pos_sts_1);
+
+ /* Forced-on PMC clocks prevent S0i3 */
+ for (i = 0; i < PMC_CLK_NUM; i++) {
+ u32 ctl = pmc_reg_read(pmc, PMC_CLK_CTL_OFFSET + 4 * i);
+
+ if ((ctl & PMC_MASK_CLK_CTL) != PMC_CLK_CTL_FORCE_ON)
+ continue;
+
+ pr_err("clock %d is ON prior to freeze (ctl 0x%08x)\n", i, ctl);
+ }
}
static struct acpi_s2idle_dev_ops pmc_s2idle_ops = {