From patchwork Tue Jul 28 13:48:20 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Viresh Kumar X-Patchwork-Id: 51603 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-la0-f69.google.com (mail-la0-f69.google.com [209.85.215.69]) by patches.linaro.org (Postfix) with ESMTPS id 3C02720323 for ; Tue, 28 Jul 2015 13:48:47 +0000 (UTC) Received: by laah7 with SMTP id h7sf38259090laa.2 for ; Tue, 28 Jul 2015 06:48:42 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:delivered-to:date:from:to:cc:subject:message-id :references:mime-version:content-type:content-disposition :in-reply-to:user-agent:sender:precedence:list-id:x-original-sender :x-original-authentication-results:mailing-list:list-post:list-help :list-archive:list-unsubscribe; bh=lgnOuK/icSEQwz7eLwMoijxHTl4BgBadU0iRguaYxqw=; b=Hd/nld49em1+Bxa2z3Il8WCi6fXoYQ528vfHJXwc+W1JuAUQUa4vTrtO9FUZAVBA1q UOXx18EI6If3uy8LjEXwBloSjYXkqCEMeUsMMJvsMWx63eiAFo4Dc9vwOsS62mVLlhOz zGZDBdNEjdDCcO/b9M2i2aEfrqji2s9fK6XfcEtz25Pmwto97/NOX+VOZ33Bzn7yytUy +n9CxyjlXMfZfNHWEnX2TGxKayQsMQEZk0M8N5qJE8JFBxNS/XvQRrcr0dEyxOCayA/m KTq0DohScA7k3/mkjjOQrzwsmA4qht356Yj9FtQpqmiLM2epbzIYMVXDjoRATTtMKeno mMvA== X-Gm-Message-State: ALoCoQkHtcASCB0dvBYbEWWnUHyqtBV6stl3Z/PZwCYrDNIokJB8BCANl67VnXKuHI25Djzjg5Sg X-Received: by 10.194.60.73 with SMTP id f9mr14127305wjr.6.1438091322874; Tue, 28 Jul 2015 06:48:42 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.152.26.1 with SMTP id h1ls726457lag.36.gmail; Tue, 28 Jul 2015 06:48:42 -0700 (PDT) X-Received: by 10.152.10.97 with SMTP id h1mr33067728lab.45.1438091322614; Tue, 28 Jul 2015 06:48:42 -0700 (PDT) Received: from mail-lb0-f169.google.com (mail-lb0-f169.google.com. [209.85.217.169]) by mx.google.com with ESMTPS id d7si18389906lag.88.2015.07.28.06.48.42 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 28 Jul 2015 06:48:42 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.217.169 as permitted sender) client-ip=209.85.217.169; Received: by lbbqi7 with SMTP id qi7so75015732lbb.3 for ; Tue, 28 Jul 2015 06:48:42 -0700 (PDT) X-Received: by 10.152.37.228 with SMTP id b4mr32647978lak.117.1438091322494; Tue, 28 Jul 2015 06:48:42 -0700 (PDT) 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.7.198 with SMTP id l6csp2152341lba; Tue, 28 Jul 2015 06:48:41 -0700 (PDT) X-Received: by 10.107.16.169 with SMTP id 41mr50866594ioq.117.1438091320783; Tue, 28 Jul 2015 06:48:40 -0700 (PDT) Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id t84si18839255ioe.46.2015.07.28.06.48.36; Tue, 28 Jul 2015 06:48:40 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932599AbbG1Ns3 (ORCPT + 28 others); Tue, 28 Jul 2015 09:48:29 -0400 Received: from mail-pa0-f48.google.com ([209.85.220.48]:36277 "EHLO mail-pa0-f48.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755679AbbG1Ns1 (ORCPT ); Tue, 28 Jul 2015 09:48:27 -0400 Received: by pachj5 with SMTP id hj5so70221012pac.3 for ; Tue, 28 Jul 2015 06:48:26 -0700 (PDT) X-Received: by 10.66.101.104 with SMTP id ff8mr81431099pab.59.1438091306640; Tue, 28 Jul 2015 06:48:26 -0700 (PDT) Received: from localhost ([122.171.186.190]) by smtp.gmail.com with ESMTPSA id fn1sm24123099pab.8.2015.07.28.06.48.24 (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Tue, 28 Jul 2015 06:48:25 -0700 (PDT) Date: Tue, 28 Jul 2015 19:18:20 +0530 From: Viresh Kumar To: Rafael Wysocki Cc: linaro-kernel@lists.linaro.org, linux-pm@vger.kernel.org, b.zolnierkie@samsung.com, nm@ti.com, sboyd@codeaurora.org, open list Subject: Re: [PATCH 3/4] cpufreq: Allow drivers to enable boost support after registering driver Message-ID: <20150728134820.GB12877@linux> References: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org Precedence: list List-ID: X-Mailing-List: linux-kernel@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.169 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: , On 28-07-15, 16:50, Viresh Kumar wrote: > In some cases it wouldn't be known at time of driver registration, if > the driver needs to support boost/turbo frequencies. > > For example, while getting boost information from DT with opp-v2 > bindings, we need to parse the bindings for all the CPUs to know if > turbo/boost OPPs are supported or not. > > One way out to do that efficiently is to delay supporting boost mode > (i.e. creating /sys/devices/system/cpu/cpufreq/boost file), until the > time OPP bindings are parsed. > > At that point, the driver can enable boost support. This can be done at > ->init(), where the frequency table is created. > > To do that, the driver requires few APIs from cpufreq core. This patch > provides these APIs. > > Signed-off-by: Viresh Kumar > --- > drivers/cpufreq/cpufreq.c | 66 ++++++++++++++++++++++++++++++-------------- > drivers/cpufreq/freq_table.c | 15 ++++++++++ > include/linux/cpufreq.h | 12 ++++++++ > 3 files changed, 73 insertions(+), 20 deletions(-) Minor update that will make this patch work again :) ----------------------8<------------------------ Message-Id: <6c5b3d3f93adf53e5ba83e94fcc3df5b1abfc132.1438091239.git.viresh.kumar@linaro.org> From: Viresh Kumar Date: Tue, 28 Jul 2015 16:14:02 +0530 Subject: [PATCH] cpufreq: Allow drivers to enable boost support after registering driver In some cases it wouldn't be known at time of driver registration, if the driver needs to support boost frequencies. For example, while getting boost information from DT with opp-v2 bindings, we need to parse the bindings for all the CPUs to know if turbo/boost OPPs are supported or not. One way out to do that efficiently is to delay supporting boost mode (i.e. creating /sys/devices/system/cpu/cpufreq/boost file), until the time OPP bindings are parsed. At that point, the driver can enable boost support. This can be done at ->init(), where the frequency table is created. To do that, the driver requires few APIs from cpufreq core that let him do this. This patch provides these APIs. Signed-off-by: Viresh Kumar --- drivers/cpufreq/cpufreq.c | 68 +++++++++++++++++++++++++++++++------------- drivers/cpufreq/freq_table.c | 15 ++++++++++ include/linux/cpufreq.h | 12 ++++++++ 3 files changed, 75 insertions(+), 20 deletions(-) -- 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/ diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 46251e8d30f2..db4390ca5243 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c @@ -2459,6 +2459,49 @@ int cpufreq_boost_supported(void) } EXPORT_SYMBOL_GPL(cpufreq_boost_supported); +static int create_boost_sysfs_file(void) +{ + int ret; + + if (!cpufreq_boost_supported()) + return 0; + + /* + * Check if driver provides function to enable boost - + * if not, use cpufreq_boost_set_sw as default + */ + if (!cpufreq_driver->set_boost) + cpufreq_driver->set_boost = cpufreq_boost_set_sw; + + ret = cpufreq_sysfs_create_file(&boost.attr); + if (ret) + pr_err("%s: cannot register global BOOST sysfs file\n", + __func__); + + return ret; +} + +static void remove_boost_sysfs_file(void) +{ + if (cpufreq_boost_supported()) + cpufreq_sysfs_remove_file(&boost.attr); +} + +int cpufreq_enable_boost_support(void) +{ + if (!cpufreq_driver) + return -EINVAL; + + if (cpufreq_boost_supported()) + return 0; + + cpufreq_driver->boost_supported = true; + + /* This will get removed on driver unregister */ + return create_boost_sysfs_file(); +} +EXPORT_SYMBOL_GPL(cpufreq_enable_boost_support); + int cpufreq_boost_enabled(void) { return cpufreq_driver->boost_enabled; @@ -2508,21 +2551,9 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data) if (driver_data->setpolicy) driver_data->flags |= CPUFREQ_CONST_LOOPS; - if (cpufreq_boost_supported()) { - /* - * Check if driver provides function to enable boost - - * if not, use cpufreq_boost_set_sw as default - */ - if (!cpufreq_driver->set_boost) - cpufreq_driver->set_boost = cpufreq_boost_set_sw; - - ret = cpufreq_sysfs_create_file(&boost.attr); - if (ret) { - pr_err("%s: cannot register global BOOST sysfs file\n", - __func__); - goto err_null_driver; - } - } + ret = create_boost_sysfs_file(); + if (ret) + goto err_null_driver; ret = subsys_interface_register(&cpufreq_interface); if (ret) @@ -2543,8 +2574,7 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data) err_if_unreg: subsys_interface_unregister(&cpufreq_interface); err_boost_unreg: - if (cpufreq_boost_supported()) - cpufreq_sysfs_remove_file(&boost.attr); + remove_boost_sysfs_file(); err_null_driver: write_lock_irqsave(&cpufreq_driver_lock, flags); cpufreq_driver = NULL; @@ -2573,9 +2603,7 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver) /* Protect against concurrent cpu hotplug */ get_online_cpus(); subsys_interface_unregister(&cpufreq_interface); - if (cpufreq_boost_supported()) - cpufreq_sysfs_remove_file(&boost.attr); - + remove_boost_sysfs_file(); unregister_hotcpu_notifier(&cpufreq_cpu_notifier); write_lock_irqsave(&cpufreq_driver_lock, flags); diff --git a/drivers/cpufreq/freq_table.c b/drivers/cpufreq/freq_table.c index dfbbf981ed56..a8f1daffc9bc 100644 --- a/drivers/cpufreq/freq_table.c +++ b/drivers/cpufreq/freq_table.c @@ -18,6 +18,21 @@ * FREQUENCY TABLE HELPERS * *********************************************************************/ +bool policy_has_boost_freq(struct cpufreq_policy *policy) +{ + struct cpufreq_frequency_table *pos, *table = policy->freq_table; + + if (!table) + return false; + + cpufreq_for_each_valid_entry(pos, table) + if (pos->flags & CPUFREQ_BOOST_FREQ) + return true; + + return false; +} +EXPORT_SYMBOL_GPL(policy_has_boost_freq); + int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy, struct cpufreq_frequency_table *table) { diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h index bde1e567b3a9..95f018649abf 100644 --- a/include/linux/cpufreq.h +++ b/include/linux/cpufreq.h @@ -578,6 +578,8 @@ ssize_t cpufreq_show_cpus(const struct cpumask *mask, char *buf); int cpufreq_boost_trigger_state(int state); int cpufreq_boost_supported(void); int cpufreq_boost_enabled(void); +int cpufreq_enable_boost_support(void); +bool policy_has_boost_freq(struct cpufreq_policy *policy); #else static inline int cpufreq_boost_trigger_state(int state) { @@ -591,6 +593,16 @@ static inline int cpufreq_boost_enabled(void) { return 0; } + +static inline int cpufreq_enable_boost_support(void) +{ + return -EINVAL; +} + +static inline bool policy_has_boost_freq(struct cpufreq_policy *policy) +{ + return false; +} #endif /* the following funtion is for cpufreq core use only */ struct cpufreq_frequency_table *cpufreq_frequency_get_table(unsigned int cpu);