From patchwork Tue May 19 14:49:12 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tomeu Vizoso X-Patchwork-Id: 6438711 X-Patchwork-Delegate: rjw@sisk.pl Return-Path: X-Original-To: patchwork-linux-pm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 888999F38D for ; Tue, 19 May 2015 14:50:28 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id C32FF205F9 for ; Tue, 19 May 2015 14:50:24 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 8D3C820602 for ; Tue, 19 May 2015 14:50:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933238AbbESOty (ORCPT ); Tue, 19 May 2015 10:49:54 -0400 Received: from mail-wi0-f180.google.com ([209.85.212.180]:32857 "EHLO mail-wi0-f180.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933088AbbESOtx (ORCPT ); Tue, 19 May 2015 10:49:53 -0400 Received: by wicmx19 with SMTP id mx19so119917185wic.0; Tue, 19 May 2015 07:49:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id; bh=FkhqYj4zyttMGKOiMVBshxlWzPZ23qWchvor2i1h4pI=; b=s1CFruZUReVbRT1EUg3j2ib0OlOLwb8DrzXNYbxCqKr8bisPA1qEmBQ8GgawCT3BEb xpopOSWX66yUGb26fJTPajLXQiGvw1USLt3tMgO4cyDmr7s4Q0o33uDWmQkuEkJOzyNE 48NTfIvYpS/9JLTk8UFWWsvcoR1OdZSmP/3rVWw6DCOPVL/Q90L4gep+x3bHiN3igk3g fCKnDQ9LCfsjarSQDnnCZH5pyCerNV4Q5BuIly210Ue6mBw6VpSDJ/OXD6XVqdV1J30d dij+sDczpy5lVQahYFBi/YVFLId2t0eKv+HHDpJmqKCjJhc/5/8Nkyz18fgdwt5zfx8G DcIA== X-Received: by 10.194.239.99 with SMTP id vr3mr55961180wjc.151.1432046991783; Tue, 19 May 2015 07:49:51 -0700 (PDT) Received: from cizrna.lan ([109.72.12.94]) by mx.google.com with ESMTPSA id be3sm17677201wib.21.2015.05.19.07.49.48 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 19 May 2015 07:49:49 -0700 (PDT) From: Tomeu Vizoso To: linux-pm@vger.kernel.org Cc: Lorenzo Pieralisi , Tomeu Vizoso , "Rafael J. Wysocki" , Russell King , Stephen Warren , Thierry Reding , Alexandre Courbot , Kukjin Kim , Ingo Molnar , Bartlomiej Zolnierkiewicz , Daniel Lezcano , Thomas Gleixner , linux-arm-kernel@lists.infradead.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v3] ARM: tegra: cpuidle: implement cpuidle_state.enter_freeze() Date: Tue, 19 May 2015 16:49:12 +0200 Message-Id: <1432046953-12945-1-git-send-email-tomeu.vizoso@collabora.com> X-Mailer: git-send-email 2.4.1 Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org X-Spam-Status: No, score=-6.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID,T_RP_MATCHES_RCVD,UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This callback is expected to do the same as enter() but it has to guarantee that interrupts aren't enabled at any point in its execution, as the tick is frozen. It will be called when the system goes to suspend-to-idle and will reduce power usage because CPUs won't be awaken for unnecessary IRQs. By setting the CPUIDLE_FLAG_TIMER_STOP flag, we can reuse the same code for both the enter() and enter_freeze() callbacks. Signed-off-by: Tomeu Vizoso Cc: Rafael J. Wysocki --- v3: * Set CPUIDLE_FLAG_TIMER_STOP to simplify things as suggested by Lorenzo Pieralisi v2: * Disable FIQs also when suspending-to-idle --- arch/arm/mach-tegra/cpuidle-tegra114.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/arch/arm/mach-tegra/cpuidle-tegra114.c b/arch/arm/mach-tegra/cpuidle-tegra114.c index 155807f..7e59ac0 100644 --- a/arch/arm/mach-tegra/cpuidle-tegra114.c +++ b/arch/arm/mach-tegra/cpuidle-tegra114.c @@ -44,16 +44,12 @@ static int tegra114_idle_power_down(struct cpuidle_device *dev, tegra_set_cpu_in_lp2(); cpu_pm_enter(); - tick_broadcast_enter(); - call_firmware_op(prepare_idle); /* Do suspend by ourselves if the firmware does not implement it */ if (call_firmware_op(do_idle, 0) == -ENOSYS) cpu_suspend(0, tegra30_sleep_cpu_secondary_finish); - tick_broadcast_exit(); - cpu_pm_exit(); tegra_clear_cpu_in_lp2(); @@ -61,6 +57,13 @@ static int tegra114_idle_power_down(struct cpuidle_device *dev, return index; } + +static void tegra114_idle_enter_freeze(struct cpuidle_device *dev, + struct cpuidle_driver *drv, + int index) +{ + tegra114_idle_power_down(dev, drv, index); +} #endif static struct cpuidle_driver tegra_idle_driver = { @@ -72,8 +75,10 @@ static struct cpuidle_driver tegra_idle_driver = { #ifdef CONFIG_PM_SLEEP [1] = { .enter = tegra114_idle_power_down, + .enter_freeze = tegra114_idle_enter_freeze, .exit_latency = 500, .target_residency = 1000, + .flags = CPUIDLE_FLAG_TIMER_STOP, .power_usage = 0, .name = "powered-down", .desc = "CPU power gated",