Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752583AbbBXO6u (ORCPT ); Tue, 24 Feb 2015 09:58:50 -0500 Received: from canardo.mork.no ([148.122.252.1]:48530 "EHLO canardo.mork.no" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750925AbbBXO6s (ORCPT ); Tue, 24 Feb 2015 09:58:48 -0500 From: =?UTF-8?q?Bj=C3=B8rn=20Mork?= To: linux-kernel@vger.kernel.org Cc: Daniel Vetter , Jani Nikula , , , =?UTF-8?q?Bj=C3=B8rn=20Mork?= , , Imre Deak , =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= Subject: [PATCH] drm/i915: fix failure to power off after hibernate Date: Tue, 24 Feb 2015 15:58:24 +0100 Message-Id: <1424789904-26699-1-git-send-email-bjorn@mork.no> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <87bnkjcqjt.fsf@nemi.mork.no> References: <87bnkjcqjt.fsf@nemi.mork.no> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.3.9 (canardo.mork.no [IPv6:::1]); Tue, 24 Feb 2015 15:58:40 +0100 (CET) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2670 Lines: 63 This fixes a bug where hibernation completes, but the system fails to power off after the image has been saved. Bisection lead to commit da2bc1b9db33 ("drm/i915: add poweroff_late handler") which added a .poweroff_late hook pointing to the same function as the .freeze_late hook, without any justification or explanation why this would be correct, except "for consistency". The assumption that this "makes the power off handling identical to the S3 suspend and S4 freeze handling" is completely bogus. As clearly documented in Documentation/power/devices.txt, the poweroff* hooks are part of the hibernation API along with the freeze* hooks. The phases involved in hibernation are: prepare, freeze, freeze_late, freeze_noirq, thaw_noirq, thaw_early, thaw, complete, prepare, poweroff, poweroff_late, poweroff_noirq With the above sequence in mind, it should be fairly obvious that you cannot save registers and disable the device in both the freeze_late and poweroff_late phases. Or as Documentation/power/devices.txt explains it: The poweroff, poweroff_late and poweroff_noirq callbacks should do essentially the same things as the suspend, suspend_late and suspend_noirq callbacks, respectively. The only notable difference is that they need not store the device register values, because the registers should already have been stored during the freeze, freeze_late or freeze_noirq phases. The "consistency" between suspend and hibernate was already in place, with freeze_late pointing to the same function as suspend_late. There is no need for any poweroff_late hook in this driver. This reverts commit da2bc1b9db33. Fixes: da2bc1b9db33 ("drm/i915: add poweroff_late handler") Cc: Cc: Imre Deak Cc: Ville Syrjälä Signed-off-by: Bjørn Mork --- drivers/gpu/drm/i915/i915_drv.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 8039cec71fc2..9cd695710f93 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c @@ -1520,7 +1520,6 @@ static const struct dev_pm_ops i915_pm_ops = { .thaw_early = i915_pm_resume_early, .thaw = i915_pm_resume, .poweroff = i915_pm_suspend, - .poweroff_late = i915_pm_suspend_late, .restore_early = i915_pm_resume_early, .restore = i915_pm_resume, -- 1.7.10.4 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/