From patchwork Wed Nov 26 05:52:59 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Viresh Kumar X-Patchwork-Id: 41523 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-la0-f70.google.com (mail-la0-f70.google.com [209.85.215.70]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 867D825E72 for ; Wed, 26 Nov 2014 05:53:40 +0000 (UTC) Received: by mail-la0-f70.google.com with SMTP id q1sf1331286lam.1 for ; Tue, 25 Nov 2014 21:53:39 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:delivered-to:from:to:cc:subject :date:message-id:in-reply-to:references:in-reply-to:references :sender:precedence:list-id:x-original-sender :x-original-authentication-results:mailing-list:list-post:list-help :list-archive:list-unsubscribe; bh=aczJqFKJilrusyWl3TomciWUiUBtLLRGCrfPhoRvJdQ=; b=BbKnDv+hXM0qyzKb8xxZHNqm1sD5uuHA1wJxMepmhep1AQabZYLmBE5lGP8T2HWsCK dI22y1tGxZHOpw5A/U7X9yvDPDtN1pA9T3aKRDvveSCmfpqLmwuAulv59d2MXumGVDtQ Fwouy7fZzgRuOsxfpcJbG22gGi7oFv1bZRFUVxw1uEILtJ4nHiByL7j1R9hLYwlkI4iN Ro87Uo5Dm18j2pR+5/W7igLpReiKgxWtd8XktLbKCZVLlkD5TBdAYec+sG+x4sSl2bKl zPpgMSqcgCixgbwca46obbKBRp+KKQJV2EHQ8c//ckylWZRSK+GDOEY8qMEvIsCSM1FT 26Lw== X-Gm-Message-State: ALoCoQnz66DLAujShe4DLFF3eSVX3gwtTx73oDiEH+WKhxGdgIBB4oDdyIeETlPPKqMRZxkHIaaF X-Received: by 10.180.89.211 with SMTP id bq19mr1326941wib.4.1416981219445; Tue, 25 Nov 2014 21:53:39 -0800 (PST) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.152.20.101 with SMTP id m5ls112921lae.21.gmail; Tue, 25 Nov 2014 21:53:39 -0800 (PST) X-Received: by 10.112.161.161 with SMTP id xt1mr23544418lbb.9.1416981219026; Tue, 25 Nov 2014 21:53:39 -0800 (PST) Received: from mail-lb0-f171.google.com (mail-lb0-f171.google.com. [209.85.217.171]) by mx.google.com with ESMTPS id yf1si3311002lab.63.2014.11.25.21.53.38 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 25 Nov 2014 21:53:38 -0800 (PST) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.217.171 as permitted sender) client-ip=209.85.217.171; Received: by mail-lb0-f171.google.com with SMTP id n15so1878403lbi.16 for ; Tue, 25 Nov 2014 21:53:38 -0800 (PST) X-Received: by 10.152.9.7 with SMTP id v7mr32162921laa.40.1416981218687; Tue, 25 Nov 2014 21:53:38 -0800 (PST) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.112.184.201 with SMTP id ew9csp572431lbc; Tue, 25 Nov 2014 21:53:37 -0800 (PST) X-Received: by 10.70.51.232 with SMTP id n8mr37833308pdo.9.1416981215710; Tue, 25 Nov 2014 21:53:35 -0800 (PST) Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id fl2si5023000pad.233.2014.11.25.21.53.35 for ; Tue, 25 Nov 2014 21:53:35 -0800 (PST) Received-SPF: none (google.com: linux-pm-owner@vger.kernel.org does not designate permitted sender hosts) client-ip=209.132.180.67; Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752233AbaKZFxe (ORCPT + 12 others); Wed, 26 Nov 2014 00:53:34 -0500 Received: from mail-pa0-f47.google.com ([209.85.220.47]:62239 "EHLO mail-pa0-f47.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752216AbaKZFxd (ORCPT ); Wed, 26 Nov 2014 00:53:33 -0500 Received: by mail-pa0-f47.google.com with SMTP id kq14so2154564pab.34 for ; Tue, 25 Nov 2014 21:53:33 -0800 (PST) X-Received: by 10.66.119.237 with SMTP id kx13mr10830552pab.5.1416981213460; Tue, 25 Nov 2014 21:53:33 -0800 (PST) Received: from localhost ([122.167.111.40]) by mx.google.com with ESMTPSA id rh11sm3102120pdb.66.2014.11.25.21.53.32 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Tue, 25 Nov 2014 21:53:32 -0800 (PST) From: Viresh Kumar To: Rafael Wysocki , edubezval@gmail.com Cc: linaro-kernel@lists.linaro.org, linux-pm@vger.kernel.org, l.majewski@samsung.com, Viresh Kumar Subject: [PATCH 4/7] cpufreq-dt: register cooling device from ->usable() callback Date: Wed, 26 Nov 2014 11:22:59 +0530 Message-Id: <89d112f34aaecd8c90486617d57ee5d605678d56.1416980448.git.viresh.kumar@linaro.org> X-Mailer: git-send-email 2.0.3.693.g996b0fd In-Reply-To: References: In-Reply-To: References: Sender: linux-pm-owner@vger.kernel.org Precedence: list List-ID: X-Mailing-List: linux-pm@vger.kernel.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: viresh.kumar@linaro.org X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.217.171 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , Currently we are calling of_cpufreq_cooling_register() from ->init() callback. At this point of time cpufreq driver's policy isn't completely ready to be used as few of its fields/structure/pointers aren't yet initialized. Because of_cpufreq_cooling_register() tries to access policy with help of cpufreq_cpu_get() and then tries to get freq-table as well, these calls fail. To fix this, register the cooling device after the policy is ready to be used. And the right callback for it is the newly added ->usable() one. Signed-off-by: Viresh Kumar --- drivers/cpufreq/cpufreq-dt.c | 51 +++++++++++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/drivers/cpufreq/cpufreq-dt.c b/drivers/cpufreq/cpufreq-dt.c index 7374fc4..f7af5c8 100644 --- a/drivers/cpufreq/cpufreq-dt.c +++ b/drivers/cpufreq/cpufreq-dt.c @@ -186,7 +186,6 @@ static int cpufreq_init(struct cpufreq_policy *policy) { struct cpufreq_dt_platform_data *pd; struct cpufreq_frequency_table *freq_table; - struct thermal_cooling_device *cdev; struct device_node *np; struct private_data *priv; struct device *cpu_dev; @@ -269,20 +268,6 @@ static int cpufreq_init(struct cpufreq_policy *policy) goto out_free_priv; } - /* - * For now, just loading the cooling device; - * thermal DT code takes care of matching them. - */ - if (of_find_property(np, "#cooling-cells", NULL)) { - cdev = of_cpufreq_cooling_register(np, policy->related_cpus); - if (IS_ERR(cdev)) - dev_err(cpu_dev, - "running cpufreq without cooling device: %ld\n", - PTR_ERR(cdev)); - else - priv->cdev = cdev; - } - priv->cpu_dev = cpu_dev; priv->cpu_reg = cpu_reg; policy->driver_data = priv; @@ -292,7 +277,7 @@ static int cpufreq_init(struct cpufreq_policy *policy) if (ret) { dev_err(cpu_dev, "%s: invalid frequency table: %d\n", __func__, ret); - goto out_cooling_unregister; + goto out_free_cpufreq_table; } policy->cpuinfo.transition_latency = transition_latency; @@ -305,8 +290,7 @@ static int cpufreq_init(struct cpufreq_policy *policy) return 0; -out_cooling_unregister: - cpufreq_cooling_unregister(priv->cdev); +out_free_cpufreq_table: dev_pm_opp_free_cpufreq_table(cpu_dev, &freq_table); out_free_priv: kfree(priv); @@ -324,7 +308,8 @@ static int cpufreq_exit(struct cpufreq_policy *policy) { struct private_data *priv = policy->driver_data; - cpufreq_cooling_unregister(priv->cdev); + if (priv->cdev) + cpufreq_cooling_unregister(priv->cdev); dev_pm_opp_free_cpufreq_table(priv->cpu_dev, &policy->freq_table); clk_put(policy->clk); if (!IS_ERR(priv->cpu_reg)) @@ -334,6 +319,33 @@ static int cpufreq_exit(struct cpufreq_policy *policy) return 0; } +static void cpufreq_usable(struct cpufreq_policy *policy) +{ + struct private_data *priv = policy->driver_data; + struct device_node *np = of_node_get(priv->cpu_dev->of_node); + + if (WARN_ON(!np)) + return; + + /* + * For now, just loading the cooling device; + * thermal DT code takes care of matching them. + */ + if (of_find_property(np, "#cooling-cells", NULL)) { + priv->cdev = of_cpufreq_cooling_register(np, + policy->related_cpus); + if (IS_ERR(priv->cdev)) { + dev_err(priv->cpu_dev, + "running cpufreq without cooling device: %ld\n", + PTR_ERR(priv->cdev)); + + priv->cdev = NULL; + } + } + + of_node_put(np); +} + static struct cpufreq_driver dt_cpufreq_driver = { .flags = CPUFREQ_STICKY | CPUFREQ_NEED_INITIAL_FREQ_CHECK, .verify = cpufreq_generic_frequency_table_verify, @@ -341,6 +353,7 @@ static struct cpufreq_driver dt_cpufreq_driver = { .get = cpufreq_generic_get, .init = cpufreq_init, .exit = cpufreq_exit, + .usable = cpufreq_usable, .name = "cpufreq-dt", .attr = cpufreq_generic_attr, };