From patchwork Fri Apr 17 23:49:04 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lina Iyer X-Patchwork-Id: 6235881 Return-Path: X-Original-To: patchwork-linux-arm-msm@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 BBC9F9F2EC for ; Fri, 17 Apr 2015 23:49:29 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id D62362038D for ; Fri, 17 Apr 2015 23:49:28 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id E6E8C20398 for ; Fri, 17 Apr 2015 23:49:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753609AbbDQXt0 (ORCPT ); Fri, 17 Apr 2015 19:49:26 -0400 Received: from mail-pd0-f179.google.com ([209.85.192.179]:36098 "EHLO mail-pd0-f179.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753533AbbDQXtZ (ORCPT ); Fri, 17 Apr 2015 19:49:25 -0400 Received: by pdea3 with SMTP id a3so142837151pde.3 for ; Fri, 17 Apr 2015 16:49:24 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=GpJtSUpxf9HGpds5LkWWPE106iIiVkIsSAkCHohtk74=; b=ElGldNF7ccOyVEION4uOdUG9omlshLrNKJc77lya2+h8eDcepa4+X+XWRCdXWUdUIG 6+KxqluswkMODZV4cPsUdKfDn4ooHI4HgiGW3IjlpWPzk/joNT/b85joEdOi5+/qW9uf kCH0d36kd67RkqrshANwww9Gujo+Ph791n/Vb5yYhGneFp2tbuaNOtYHkPg9yEHKvzdy 99G7LJaK9EuHL+c6XYdh9B67up+0c/xlnYKmjHvee+/M9HHa6ELcHYwVLksaACJtn+WI yxkuJyiidEReHeH80KPg8Mm2m17FEMlBzXt5YNkrcHq+vFOBqErAgb6e+6gM8m4VqfCN 9myw== X-Gm-Message-State: ALoCoQmM5UUiNWPPJlSx3+nK4upPTcWlfqk0FmfUoVr+XWOMEQGJ5oGGoT9XEP6JwX50FTBvz+wO X-Received: by 10.70.128.9 with SMTP id nk9mr9574316pdb.58.1429314564782; Fri, 17 Apr 2015 16:49:24 -0700 (PDT) Received: from ubuntu.localdomain (i-global254.qualcomm.com. [199.106.103.254]) by mx.google.com with ESMTPSA id hv7sm11157144pdb.86.2015.04.17.16.49.21 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 17 Apr 2015 16:49:23 -0700 (PDT) From: Lina Iyer To: arnd@arndb.de, catalin.marinas@arm.com, mark.rutland@arm.com, Will.Deacon@arm.com, lorenzo.pieralisi@arm.com Cc: daniel.lezcano@linaro.org, khilman@linaro.org, sboyd@codeaurora.org, galak@codeaurora.org, linux-arm-msm@vger.kernel.org, linux-pm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, msivasub@codeaurora.org, agross@codeaurora.org, mlocke@codeaurora.org, bryanh@codeaurora.org, Lina Iyer Subject: [PATCH RFC 2/7] arm64: qcom: Add SPM driver support for ARM and ARM64 Date: Fri, 17 Apr 2015 17:49:04 -0600 Message-Id: <1429314549-6730-3-git-send-email-lina.iyer@linaro.org> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1429314549-6730-1-git-send-email-lina.iyer@linaro.org> References: <1429314549-6730-1-git-send-email-lina.iyer@linaro.org> Sender: linux-arm-msm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, 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 The SAW power controller can be used with both ARM v7 and v8 cpus. The driver registers with the cpuidle framework as a provider of idle entry points for all idle states. Certain aspects of cpuidle callback registration are different been ARM and ARM64 variants. Use compile time definitions to use appropriate idle and registration functions. Signed-off-by: Lina Iyer --- drivers/soc/qcom/cpu_ops.c | 5 +++++ drivers/soc/qcom/spm.c | 12 +++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/drivers/soc/qcom/cpu_ops.c b/drivers/soc/qcom/cpu_ops.c index d831cb0..363147c 100644 --- a/drivers/soc/qcom/cpu_ops.c +++ b/drivers/soc/qcom/cpu_ops.c @@ -32,6 +32,9 @@ #include #include +extern int qcom_idle_enter(unsigned long index); +extern int qcom_cpuidle_init(struct device_node *cpu_node, u32 cpu); + static DEFINE_RAW_SPINLOCK(boot_lock); DEFINE_PER_CPU(int, cold_boot_done); @@ -339,5 +342,7 @@ static const struct cpu_operations msm_cortex_a_ops = { .cpu_prepare = msm_cpu_prepare, .cpu_boot = msm_cpu_boot, .cpu_postboot = msm_cpu_postboot, + .cpu_suspend = qcom_idle_enter, + .cpu_init_idle = qcom_cpuidle_init, }; CPU_METHOD_OF_DECLARE(msm_cortex_a_ops, &msm_cortex_a_ops); diff --git a/drivers/soc/qcom/spm.c b/drivers/soc/qcom/spm.c index 5d0dd8c..b66d86c 100644 --- a/drivers/soc/qcom/spm.c +++ b/drivers/soc/qcom/spm.c @@ -29,6 +29,7 @@ #include #include #include +#include #define MAX_PMIC_DATA 2 #define MAX_SEQ_DATA 64 @@ -185,7 +186,11 @@ static int qcom_cpu_spc(int cpu) struct spm_driver_data *drv = per_cpu(cpu_spm_drv, cpu); spm_set_low_power_mode(drv, PM_SLEEP_MODE_SPC); +#if defined (CONFIG_ARCH_ARM) ret = cpu_suspend(0, qcom_pm_collapse); +#else + ret = __cpu_suspend(0, qcom_pm_collapse); +#endif /* * ARM common code executes WFI without calling into our driver and * if the SPM mode is not reset, then we may accidently power down the @@ -197,7 +202,7 @@ static int qcom_cpu_spc(int cpu) return ret; } -static int qcom_idle_enter(unsigned long index) +int qcom_idle_enter(unsigned long index) { int cpu = smp_processor_id(); return per_cpu(qcom_idle_ops, cpu)[index](cpu); @@ -208,7 +213,7 @@ static const struct of_device_id qcom_idle_state_match[] __initconst = { { }, }; -static int __init qcom_cpuidle_init(struct device_node *cpu_node, u32 cpu) +int __init qcom_cpuidle_init(struct device_node *cpu_node, u32 cpu) { const struct of_device_id *match_id; struct device_node *state_node; @@ -275,13 +280,14 @@ check_spm: return per_cpu(cpu_spm_drv, cpu) ? 0 : -ENXIO; } +#if defined (CONFIG_ARCH_ARM) static struct cpuidle_ops qcom_cpuidle_ops __initdata = { .suspend = qcom_idle_enter, .init = qcom_cpuidle_init, }; - CPUIDLE_METHOD_OF_DECLARE(qcom_idle_v1, "qcom,kpss-acc-v1", &qcom_cpuidle_ops); CPUIDLE_METHOD_OF_DECLARE(qcom_idle_v2, "qcom,kpss-acc-v2", &qcom_cpuidle_ops); +#endif static struct spm_driver_data *spm_get_drv(struct platform_device *pdev, int *spm_cpu)