From patchwork Mon Aug 6 23:11:51 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rafael Wysocki X-Patchwork-Id: 1281891 Return-Path: X-Original-To: patchwork-linux-pm@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork2.kernel.org (Postfix) with ESMTP id 985AFDF288 for ; Mon, 6 Aug 2012 23:13:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932267Ab2HFXLy (ORCPT ); Mon, 6 Aug 2012 19:11:54 -0400 Received: from ogre.sisk.pl ([193.178.161.156]:44971 "EHLO ogre.sisk.pl" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932225Ab2HFXLv (ORCPT ); Mon, 6 Aug 2012 19:11:51 -0400 Received: from localhost (localhost.localdomain [127.0.0.1]) by ogre.sisk.pl (Postfix) with ESMTP id 866891DB9C9; Tue, 7 Aug 2012 01:01:54 +0200 (CEST) Received: from ogre.sisk.pl ([127.0.0.1]) by localhost (ogre.sisk.pl [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 03935-08; Tue, 7 Aug 2012 01:01:14 +0200 (CEST) Received: from ferrari.rjw.lan (62-121-64-87.home.aster.pl [62.121.64.87]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ogre.sisk.pl (Postfix) with ESMTP id CD7B81DB96F; Tue, 7 Aug 2012 01:00:55 +0200 (CEST) From: "Rafael J. Wysocki" To: "Linux-sh list" Subject: [PATCH 8/12] PM / shmobile: Do not access sh7372 A4S domain internals directly Date: Tue, 7 Aug 2012 01:11:51 +0200 User-Agent: KMail/1.13.6 (Linux/3.5.0+; KDE/4.6.0; x86_64; ; ) Cc: LKML , Linux PM list , Magnus Damm References: <201208070105.23262.rjw@sisk.pl> In-Reply-To: <201208070105.23262.rjw@sisk.pl> MIME-Version: 1.0 Message-Id: <201208070111.51313.rjw@sisk.pl> X-Virus-Scanned: amavisd-new at ogre.sisk.pl using MkS_Vir for Linux Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org The sh7372_enter_suspend() routine checks the status field of the generic PM domain object corresponding to the A4S domain in order to check if it can turn that domain off when entering system sleep. However, it shouldn't rely on the specific values of the generic data structures this way, so make it use its own mechanism to recognize when it is safe to turn that domain off. For this purpos, introduce a boolean variable a4s_suspend_ready that will be set by the A4S' suspend routine and unset by its resume routine executed by rmobile_pd_power_down() and __rmobile_pd_power_up(), respectively. Signed-off-by: Rafael J. Wysocki --- arch/arm/mach-shmobile/pm-sh7372.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe linux-pm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Index: linux/arch/arm/mach-shmobile/pm-sh7372.c =================================================================== --- linux.orig/arch/arm/mach-shmobile/pm-sh7372.c +++ linux/arch/arm/mach-shmobile/pm-sh7372.c @@ -110,21 +110,33 @@ struct rmobile_pm_domain sh7372_pd_a3ri .bit_shift = 8, }; +static bool a4s_suspend_ready; + static int sh7372_pd_a4s_suspend(void) { /* * The A4S domain contains the CPU core and therefore it should - * only be turned off if the CPU is in use. + * only be turned off if the CPU is not in use. This may happen + * during system suspend, when SYSC is going to be used for generating + * resume signals and a4s_suspend_ready is set to let + * sh7372_enter_suspend() know that it can turn A4S off. */ + a4s_suspend_ready = true; return -EBUSY; } +static void sh7372_pd_a4s_resume(void) +{ + a4s_suspend_ready = false; +} + struct rmobile_pm_domain sh7372_pd_a4s = { .genpd.name = "A4S", .bit_shift = 10, .gov = &pm_domain_always_on_gov, .no_debug = true, .suspend = sh7372_pd_a4s_suspend, + .resume = sh7372_pd_a4s_resume, }; static int sh7372_a3sp_pd_suspend(void) @@ -390,8 +402,7 @@ static int sh7372_enter_suspend(suspend_ /* check active clocks to determine potential wakeup sources */ if (sh7372_sysc_valid(&msk, &msk2)) { - if (!console_suspend_enabled && - sh7372_pd_a4s.genpd.status == GPD_STATE_POWER_OFF) { + if (!console_suspend_enabled && a4s_suspend_ready) { /* convert INTC mask/sense to SYSC mask/sense */ sh7372_setup_sysc(msk, msk2);