Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933634AbcCNEs3 (ORCPT ); Mon, 14 Mar 2016 00:48:29 -0400 Received: from mail.kernel.org ([198.145.29.136]:59854 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933615AbcCNEs0 (ORCPT ); Mon, 14 Mar 2016 00:48:26 -0400 From: Andy Lutomirski To: len.brown@intel.com Cc: "linux-kernel@vger.kernel.org" , Andy Lutomirski Subject: [PATCH 3/4] intel_idle: Fix MSRs after resume Date: Sun, 13 Mar 2016 21:48:12 -0700 Message-Id: X-Mailer: git-send-email 2.5.0 In-Reply-To: References: <1A7043D5F58CCB44A599DFD55ED4C94846A12FBC@fmsmsx115.amr.corp.intel.com> In-Reply-To: References: Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1569 Lines: 57 Firmware that enables auto-promotion / auto-demotion flags we don't like will probably re-enable them after suspend/resume. Disable them again after resume so they stay fixed. I've seen this on my Dell XPS 13 9350. Signed-off-by: Andy Lutomirski --- drivers/idle/intel_idle.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c index 338df09ad60b..e3d7d8bbc843 100644 --- a/drivers/idle/intel_idle.c +++ b/drivers/idle/intel_idle.c @@ -61,6 +61,7 @@ #include #include #include +#include #include #include #include @@ -1026,6 +1027,15 @@ void intel_idle_state_table_update(void) return; } +static void intel_idle_resume(void) +{ + on_each_cpu(fix_this_cpu, NULL, 1); +} + +static struct syscore_ops intel_idle_syscore_ops = { + .resume = intel_idle_resume, +}; + /* * intel_idle_cpuidle_driver_init() * allocate, initialize cpuidle_states @@ -1119,6 +1129,7 @@ static int __init intel_idle_init(void) if (retval) return retval; + register_syscore_ops(&intel_idle_syscore_ops); intel_idle_cpuidle_driver_init(); retval = cpuidle_register_driver(&intel_idle_driver); if (retval) { @@ -1153,6 +1164,7 @@ static void __exit intel_idle_exit(void) { intel_idle_cpuidle_devices_uninit(); cpuidle_unregister_driver(&intel_idle_driver); + unregister_syscore_ops(&intel_idle_syscore_ops); cpu_notifier_register_begin(); -- 2.5.0