From patchwork Tue Aug 6 11:12:25 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leonard Crestez X-Patchwork-Id: 11078687 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 4B45713AC for ; Tue, 6 Aug 2019 11:12:36 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3A33B28911 for ; Tue, 6 Aug 2019 11:12:36 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2DB042892B; Tue, 6 Aug 2019 11:12:36 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id BD1BE28911 for ; Tue, 6 Aug 2019 11:12:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732733AbfHFLMf (ORCPT ); Tue, 6 Aug 2019 07:12:35 -0400 Received: from inva020.nxp.com ([92.121.34.13]:54140 "EHLO inva020.nxp.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731116AbfHFLMf (ORCPT ); Tue, 6 Aug 2019 07:12:35 -0400 Received: from inva020.nxp.com (localhost [127.0.0.1]) by inva020.eu-rdc02.nxp.com (Postfix) with ESMTP id 7FDE21A00D8; Tue, 6 Aug 2019 13:12:32 +0200 (CEST) Received: from inva024.eu-rdc02.nxp.com (inva024.eu-rdc02.nxp.com [134.27.226.22]) by inva020.eu-rdc02.nxp.com (Postfix) with ESMTP id 728261A00CD; Tue, 6 Aug 2019 13:12:32 +0200 (CEST) Received: from fsr-ub1864-112.ea.freescale.net (fsr-ub1864-112.ea.freescale.net [10.171.82.98]) by inva024.eu-rdc02.nxp.com (Postfix) with ESMTP id E465A205DD; Tue, 6 Aug 2019 13:12:31 +0200 (CEST) From: Leonard Crestez To: Viresh Kumar Cc: "Rafael J. Wysocki" , Stephen Boyd , =?utf-8?b?QXJ0dXIgxZp3aWdvxYQ=?= , Saravana Kannan , Krzysztof Kozlowski , Georgi Djakov , Chanwoo Choi , MyungJoo Ham , Kyungmin Park , Alexandre Bailon , linux-pm@vger.kernel.org Subject: [RFC 1/4] opp: Drop const from opp_device struct device Date: Tue, 6 Aug 2019 14:12:25 +0300 Message-Id: X-Mailer: git-send-email 2.17.1 In-Reply-To: References: In-Reply-To: References: X-Virus-Scanned: ClamAV using ClamSMTP Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This is required for fetching struct device from struct opp_table with casts Signed-off-by: Leonard Crestez --- Does "const" here have any particular significance? drivers/opp/core.c | 4 ++-- drivers/opp/opp.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/opp/core.c b/drivers/opp/core.c index 3b7ffd0234e9..77814d3bc4e6 100644 --- a/drivers/opp/core.c +++ b/drivers/opp/core.c @@ -913,11 +913,11 @@ static void _remove_opp_dev(struct opp_device *opp_dev, opp_debug_unregister(opp_dev, opp_table); list_del(&opp_dev->node); kfree(opp_dev); } -static struct opp_device *_add_opp_dev_unlocked(const struct device *dev, +static struct opp_device *_add_opp_dev_unlocked(struct device *dev, struct opp_table *opp_table) { struct opp_device *opp_dev; opp_dev = kzalloc(sizeof(*opp_dev), GFP_KERNEL); @@ -933,11 +933,11 @@ static struct opp_device *_add_opp_dev_unlocked(const struct device *dev, opp_debug_register(opp_dev, opp_table); return opp_dev; } -struct opp_device *_add_opp_dev(const struct device *dev, +struct opp_device *_add_opp_dev(struct device *dev, struct opp_table *opp_table) { struct opp_device *opp_dev; mutex_lock(&opp_table->lock); diff --git a/drivers/opp/opp.h b/drivers/opp/opp.h index 01a500e2c40a..5a7ddd55bd84 100644 --- a/drivers/opp/opp.h +++ b/drivers/opp/opp.h @@ -103,11 +103,11 @@ struct dev_pm_opp { * This is an internal data structure maintaining the devices that are managed * by 'struct opp_table'. */ struct opp_device { struct list_head node; - const struct device *dev; + struct device *dev; #ifdef CONFIG_DEBUG_FS struct dentry *dentry; #endif }; @@ -207,11 +207,11 @@ struct opp_table { void dev_pm_opp_get(struct dev_pm_opp *opp); void _opp_remove_all_static(struct opp_table *opp_table); void _get_opp_table_kref(struct opp_table *opp_table); int _get_opp_count(struct opp_table *opp_table); struct opp_table *_find_opp_table(struct device *dev); -struct opp_device *_add_opp_dev(const struct device *dev, struct opp_table *opp_table); +struct opp_device *_add_opp_dev(struct device *dev, struct opp_table *opp_table); void _dev_pm_opp_find_and_remove_table(struct device *dev); struct dev_pm_opp *_opp_allocate(struct opp_table *opp_table); void _opp_free(struct dev_pm_opp *opp); int _opp_add(struct device *dev, struct dev_pm_opp *new_opp, struct opp_table *opp_table, bool rate_not_available); int _opp_add_v1(struct opp_table *opp_table, struct device *dev, unsigned long freq, long u_volt, bool dynamic); From patchwork Tue Aug 6 11:12:26 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leonard Crestez X-Patchwork-Id: 11078689 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 94C681709 for ; Tue, 6 Aug 2019 11:12:36 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 82DF928911 for ; Tue, 6 Aug 2019 11:12:36 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7744A28925; Tue, 6 Aug 2019 11:12:36 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 170FC28913 for ; Tue, 6 Aug 2019 11:12:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731116AbfHFLMf (ORCPT ); Tue, 6 Aug 2019 07:12:35 -0400 Received: from inva021.nxp.com ([92.121.34.21]:32906 "EHLO inva021.nxp.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731309AbfHFLMf (ORCPT ); Tue, 6 Aug 2019 07:12:35 -0400 Received: from inva021.nxp.com (localhost [127.0.0.1]) by inva021.eu-rdc02.nxp.com (Postfix) with ESMTP id 1C8862002C1; Tue, 6 Aug 2019 13:12:33 +0200 (CEST) Received: from inva024.eu-rdc02.nxp.com (inva024.eu-rdc02.nxp.com [134.27.226.22]) by inva021.eu-rdc02.nxp.com (Postfix) with ESMTP id 0F32220020B; Tue, 6 Aug 2019 13:12:33 +0200 (CEST) Received: from fsr-ub1864-112.ea.freescale.net (fsr-ub1864-112.ea.freescale.net [10.171.82.98]) by inva024.eu-rdc02.nxp.com (Postfix) with ESMTP id 82289205DD; Tue, 6 Aug 2019 13:12:32 +0200 (CEST) From: Leonard Crestez To: Viresh Kumar Cc: "Rafael J. Wysocki" , Stephen Boyd , =?utf-8?b?QXJ0dXIgxZp3aWdvxYQ=?= , Saravana Kannan , Krzysztof Kozlowski , Georgi Djakov , Chanwoo Choi , MyungJoo Ham , Kyungmin Park , Alexandre Bailon , linux-pm@vger.kernel.org Subject: [RFC 2/4] opp: Add dev_pm_opp_table_get_device Date: Tue, 6 Aug 2019 14:12:26 +0300 Message-Id: <53d047703057fb09a0345b0a13715576d6eea3da.1565089196.git.leonard.crestez@nxp.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: References: In-Reply-To: References: X-Virus-Scanned: ClamAV using ClamSMTP Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This API is the opposite of dev_pm_opp_get_opp_table. OPP tables can be shared between devices but this ambiguity can be handled by returning an error if opp table is not exclusive. This can used for fetching the device pointed to by "required-opps". Signed-off-by: Leonard Crestez --- drivers/opp/core.c | 30 ++++++++++++++++++++++++++++++ include/linux/pm_opp.h | 6 ++++++ 2 files changed, 36 insertions(+) diff --git a/drivers/opp/core.c b/drivers/opp/core.c index 77814d3bc4e6..b8bbabbbe44a 100644 --- a/drivers/opp/core.c +++ b/drivers/opp/core.c @@ -87,10 +87,40 @@ struct opp_table *_find_opp_table(struct device *dev) mutex_unlock(&opp_table_lock); return opp_table; } +/** + * _find_opp_table() - find device struct using opp_table pointer + * + * OPP table must be exclusive: not be shared between devices. + */ +struct device *dev_pm_opp_table_get_device(struct opp_table *opp_table) +{ + struct opp_device *opp_dev; + struct device *dev = ERR_PTR(-EINVAL); + int opp_dev_cnt = 0; + + mutex_lock(&opp_table->lock); + + /* OPP table must not be shared: only one device */ + if (opp_table->shared_opp != OPP_TABLE_ACCESS_EXCLUSIVE) + goto out; + list_for_each_entry(opp_dev, &opp_table->dev_list, node) + opp_dev_cnt++; + if (opp_dev_cnt != 1) + goto out; + + opp_dev = list_first_entry(&opp_table->dev_list, struct opp_device, node); + dev = opp_dev->dev; + +out: + mutex_unlock(&opp_table->lock); + return dev; +} +EXPORT_SYMBOL_GPL(dev_pm_opp_table_get_device); + /** * dev_pm_opp_get_voltage() - Gets the voltage corresponding to an opp * @opp: opp for which voltage has to be returned for * * Return: voltage in micro volt corresponding to the opp, else diff --git a/include/linux/pm_opp.h b/include/linux/pm_opp.h index b8197ab014f2..a4db3f42d787 100644 --- a/include/linux/pm_opp.h +++ b/include/linux/pm_opp.h @@ -76,10 +76,11 @@ struct dev_pm_set_opp_data { #if defined(CONFIG_PM_OPP) struct opp_table *dev_pm_opp_get_opp_table(struct device *dev); struct opp_table *dev_pm_opp_get_opp_table_indexed(struct device *dev, int index); void dev_pm_opp_put_opp_table(struct opp_table *opp_table); +struct device *dev_pm_opp_table_get_device(struct opp_table *opp_table); unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp); unsigned long dev_pm_opp_get_freq(struct dev_pm_opp *opp); @@ -149,10 +150,15 @@ static inline struct opp_table *dev_pm_opp_get_opp_table_indexed(struct device * return ERR_PTR(-ENOTSUPP); } static inline void dev_pm_opp_put_opp_table(struct opp_table *opp_table) {} +struct struct device *dev_pm_opp_table_get_device(struct opp_table *opp_table) +{ + return ERR_PTR(-ENOTSUPP); +} + static inline unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp) { return 0; } From patchwork Tue Aug 6 11:12:27 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leonard Crestez X-Patchwork-Id: 11078691 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 7EADB13A4 for ; Tue, 6 Aug 2019 11:12:37 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6D88D28911 for ; Tue, 6 Aug 2019 11:12:37 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 61F6D2892B; Tue, 6 Aug 2019 11:12:37 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E93B828911 for ; Tue, 6 Aug 2019 11:12:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731309AbfHFLMg (ORCPT ); Tue, 6 Aug 2019 07:12:36 -0400 Received: from inva020.nxp.com ([92.121.34.13]:54204 "EHLO inva020.nxp.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732732AbfHFLMg (ORCPT ); Tue, 6 Aug 2019 07:12:36 -0400 Received: from inva020.nxp.com (localhost [127.0.0.1]) by inva020.eu-rdc02.nxp.com (Postfix) with ESMTP id B8CAA1A00CD; Tue, 6 Aug 2019 13:12:33 +0200 (CEST) Received: from inva024.eu-rdc02.nxp.com (inva024.eu-rdc02.nxp.com [134.27.226.22]) by inva020.eu-rdc02.nxp.com (Postfix) with ESMTP id A1FB31A00B7; Tue, 6 Aug 2019 13:12:33 +0200 (CEST) Received: from fsr-ub1864-112.ea.freescale.net (fsr-ub1864-112.ea.freescale.net [10.171.82.98]) by inva024.eu-rdc02.nxp.com (Postfix) with ESMTP id 1FA05205DD; Tue, 6 Aug 2019 13:12:33 +0200 (CEST) From: Leonard Crestez To: Viresh Kumar Cc: "Rafael J. Wysocki" , Stephen Boyd , =?utf-8?b?QXJ0dXIgxZp3aWdvxYQ=?= , Saravana Kannan , Krzysztof Kozlowski , Georgi Djakov , Chanwoo Choi , MyungJoo Ham , Kyungmin Park , Alexandre Bailon , linux-pm@vger.kernel.org Subject: [RFC 3/4] opp: Add dev_pm_parse_required_opp_as_qos Date: Tue, 6 Aug 2019 14:12:27 +0300 Message-Id: <0a7339f8b35d58c2272ce9fb7c025a5628afd921.1565089196.git.leonard.crestez@nxp.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: References: In-Reply-To: References: X-Virus-Scanned: ClamAV using ClamSMTP Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The "required-opps" property can be placed on any device and point to any OPP table according to bindings doc but this is not fully implemented. In practice it can only point from the opp table of a device to the opp table of a power domain. Add support for parsing "required-opps" as a DEV_PM_QOS_MIN_FREQUENCY request. Signed-off-by: Leonard Crestez --- drivers/opp/of.c | 65 ++++++++++++++++++++++++++++++++++++++++++ include/linux/pm_opp.h | 9 ++++++ 2 files changed, 74 insertions(+) diff --git a/drivers/opp/of.c b/drivers/opp/of.c index 1813f5ad5fa2..a086bb120fec 100644 --- a/drivers/opp/of.c +++ b/drivers/opp/of.c @@ -16,10 +16,11 @@ #include #include #include #include #include +#include #include "opp.h" /* * Returns opp descriptor node for a device node, caller must @@ -1119,5 +1120,69 @@ void dev_pm_opp_of_register_em(struct cpumask *cpus) return; em_register_perf_domain(cpus, nr_opp, &em_cb); } EXPORT_SYMBOL_GPL(dev_pm_opp_of_register_em); + +int dev_pm_parse_required_opp_as_qos(struct device_node *node, + struct dev_pm_qos_request *req) +{ + struct device_node *opp_node; + struct opp_table *opp_table; + struct dev_pm_opp *opp; + struct device *req_dev; + unsigned long req_val; + int ret; + + mutex_lock(&opp_table_lock); + + opp_node = of_parse_required_opp(node, 0); + if (!opp_node) { + ret = -ENOENT; + goto unlock_opp_tables; + } + + opp_table = _find_table_of_opp_np(opp_node); + if (IS_ERR(opp_table)) { + ret = -EPROBE_DEFER; + goto put_opp_node; + } + + opp = _find_opp_of_np(opp_table, opp_node); + if (!opp) { + ret = -ENOENT; + goto put_opp_table; + } + + req_dev = dev_pm_opp_table_get_device(opp_table); + if (IS_ERR(req_dev)) { + pr_err("%pOF: failed to fetch device for table %pOF\n", + node, opp_table->np); + ret = PTR_ERR(req_dev); + goto put_opp; + } + + req_val = dev_pm_opp_get_freq(opp); + if (req_val > S32_MAX) { + ret = -ERANGE; + goto put_opp; + } + + mutex_unlock(&opp_table_lock); + + ret = dev_pm_qos_add_request(req_dev, req, + DEV_PM_QOS_MIN_FREQUENCY, req_val); + if (ret < 0) + pr_err("%pOF: failed to add dev_pm_qos request: %d\n", node, ret); + ret = 0; + +put_opp: + dev_pm_opp_put(opp); +put_opp_table: + dev_pm_opp_put_opp_table(opp_table); +put_opp_node: + of_node_put(opp_node); +unlock_opp_tables: + mutex_unlock(&opp_table_lock); + return ret; +} +EXPORT_SYMBOL_GPL(dev_pm_parse_required_opp_as_qos); diff --git a/include/linux/pm_opp.h b/include/linux/pm_opp.h index a4db3f42d787..949c35e8f5ae 100644 --- a/include/linux/pm_opp.h +++ b/include/linux/pm_opp.h @@ -17,10 +17,11 @@ struct clk; struct regulator; struct dev_pm_opp; struct device; struct opp_table; +struct dev_pm_qos_request; enum dev_pm_opp_event { OPP_EVENT_ADD, OPP_EVENT_REMOVE, OPP_EVENT_ENABLE, OPP_EVENT_DISABLE, }; @@ -352,10 +353,12 @@ void dev_pm_opp_of_cpumask_remove_table(const struct cpumask *cpumask); int dev_pm_opp_of_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask); struct device_node *dev_pm_opp_of_get_opp_desc_node(struct device *dev); struct device_node *dev_pm_opp_get_of_node(struct dev_pm_opp *opp); int of_get_required_opp_performance_state(struct device_node *np, int index); void dev_pm_opp_of_register_em(struct cpumask *cpus); +int dev_pm_parse_required_opp_as_qos(struct device_node *node, + struct dev_pm_qos_request *req); #else static inline int dev_pm_opp_of_add_table(struct device *dev) { return -ENOTSUPP; } @@ -399,8 +402,14 @@ static inline void dev_pm_opp_of_register_em(struct cpumask *cpus) static inline int of_get_required_opp_performance_state(struct device_node *np, int index) { return -ENOTSUPP; } + +int dev_pm_parse_required_opp_as_qos(struct device_node *node, + struct dev_pm_qos_request *req) +{ + return -ENOTSUPP; +} #endif #endif /* __LINUX_OPP_H__ */ From patchwork Tue Aug 6 11:12:28 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leonard Crestez X-Patchwork-Id: 11078693 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id D4CAF1709 for ; Tue, 6 Aug 2019 11:12:37 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C355F28911 for ; Tue, 6 Aug 2019 11:12:37 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B736D28913; Tue, 6 Aug 2019 11:12:37 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4FBC928925 for ; Tue, 6 Aug 2019 11:12:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732732AbfHFLMg (ORCPT ); Tue, 6 Aug 2019 07:12:36 -0400 Received: from inva020.nxp.com ([92.121.34.13]:54224 "EHLO inva020.nxp.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730676AbfHFLMg (ORCPT ); Tue, 6 Aug 2019 07:12:36 -0400 Received: from inva020.nxp.com (localhost [127.0.0.1]) by inva020.eu-rdc02.nxp.com (Postfix) with ESMTP id 4C18A1A01DD; Tue, 6 Aug 2019 13:12:34 +0200 (CEST) Received: from inva024.eu-rdc02.nxp.com (inva024.eu-rdc02.nxp.com [134.27.226.22]) by inva020.eu-rdc02.nxp.com (Postfix) with ESMTP id 3F06F1A00B7; Tue, 6 Aug 2019 13:12:34 +0200 (CEST) Received: from fsr-ub1864-112.ea.freescale.net (fsr-ub1864-112.ea.freescale.net [10.171.82.98]) by inva024.eu-rdc02.nxp.com (Postfix) with ESMTP id B1E02205DD; Tue, 6 Aug 2019 13:12:33 +0200 (CEST) From: Leonard Crestez To: Viresh Kumar Cc: "Rafael J. Wysocki" , Stephen Boyd , =?utf-8?b?QXJ0dXIgxZp3aWdvxYQ=?= , Saravana Kannan , Krzysztof Kozlowski , Georgi Djakov , Chanwoo Choi , MyungJoo Ham , Kyungmin Park , Alexandre Bailon , linux-pm@vger.kernel.org Subject: [RFC 4/4] PM / QoS: Add dev_pm_qos_get_curr_value Date: Tue, 6 Aug 2019 14:12:28 +0300 Message-Id: <9d1620026842209841a122e17fa7686d02fa23e9.1565089196.git.leonard.crestez@nxp.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: References: In-Reply-To: References: X-Virus-Scanned: ClamAV using ClamSMTP Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Add a new API for fetching the value set with dev_pm_qos_add_request by refactoring __dev_pm_qos_update_request. Signed-off-by: Leonard Crestez --- drivers/base/power/qos.c | 59 ++++++++++++++++++++++++++++------------ include/linux/pm_qos.h | 1 + 2 files changed, 43 insertions(+), 17 deletions(-) diff --git a/drivers/base/power/qos.c b/drivers/base/power/qos.c index 6c90fd7e2ff8..f171a7137c5d 100644 --- a/drivers/base/power/qos.c +++ b/drivers/base/power/qos.c @@ -402,10 +402,49 @@ int dev_pm_qos_add_request(struct device *dev, struct dev_pm_qos_request *req, mutex_unlock(&dev_pm_qos_mtx); return ret; } EXPORT_SYMBOL_GPL(dev_pm_qos_add_request); +/** + * __dev_pm_qos_get_curr_value - Modify an existing device PM QoS request. + * @req : PM QoS request to query + */ +static int __dev_pm_qos_get_curr_value(struct dev_pm_qos_request *req, + s32 *curr_value) +{ + if (WARN(!dev_pm_qos_request_active(req), + "%s() called for unknown object\n", __func__)) + return -EINVAL; + + switch(req->type) { + case DEV_PM_QOS_RESUME_LATENCY: + case DEV_PM_QOS_LATENCY_TOLERANCE: + case DEV_PM_QOS_MIN_FREQUENCY: + case DEV_PM_QOS_MAX_FREQUENCY: + *curr_value = req->data.pnode.prio; + return 0; + case DEV_PM_QOS_FLAGS: + *curr_value = req->data.flr.flags; + return 0; + default: + return -EINVAL; + } +} + +int dev_pm_qos_get_curr_value(struct dev_pm_qos_request *req, + s32 *curr_value) +{ + int ret; + + mutex_lock(&dev_pm_qos_mtx); + ret = __dev_pm_qos_get_curr_value(req, curr_value); + mutex_unlock(&dev_pm_qos_mtx); + + return ret; +} +EXPORT_SYMBOL_GPL(dev_pm_qos_get_curr_value); + /** * __dev_pm_qos_update_request - Modify an existing device PM QoS request. * @req : PM QoS request to modify. * @new_value: New value to request. */ @@ -416,31 +455,17 @@ static int __dev_pm_qos_update_request(struct dev_pm_qos_request *req, int ret = 0; if (!req) /*guard against callers passing in null */ return -EINVAL; - if (WARN(!dev_pm_qos_request_active(req), - "%s() called for unknown object\n", __func__)) - return -EINVAL; + ret = __dev_pm_qos_get_curr_value(req, &curr_value); + if (ret) + return ret; if (IS_ERR_OR_NULL(req->dev->power.qos)) return -ENODEV; - switch(req->type) { - case DEV_PM_QOS_RESUME_LATENCY: - case DEV_PM_QOS_LATENCY_TOLERANCE: - case DEV_PM_QOS_MIN_FREQUENCY: - case DEV_PM_QOS_MAX_FREQUENCY: - curr_value = req->data.pnode.prio; - break; - case DEV_PM_QOS_FLAGS: - curr_value = req->data.flr.flags; - break; - default: - return -EINVAL; - } - trace_dev_pm_qos_update_request(dev_name(req->dev), req->type, new_value); if (curr_value != new_value) ret = apply_constraint(req, PM_QOS_UPDATE_REQ, new_value); diff --git a/include/linux/pm_qos.h b/include/linux/pm_qos.h index 2aebbc5b9950..ae42e58d02bb 100644 --- a/include/linux/pm_qos.h +++ b/include/linux/pm_qos.h @@ -149,10 +149,11 @@ enum pm_qos_flags_status __dev_pm_qos_flags(struct device *dev, s32 mask); enum pm_qos_flags_status dev_pm_qos_flags(struct device *dev, s32 mask); s32 __dev_pm_qos_resume_latency(struct device *dev); s32 dev_pm_qos_read_value(struct device *dev, enum dev_pm_qos_req_type type); int dev_pm_qos_add_request(struct device *dev, struct dev_pm_qos_request *req, enum dev_pm_qos_req_type type, s32 value); +int dev_pm_qos_get_curr_value(struct dev_pm_qos_request *req, s32 *value); int dev_pm_qos_update_request(struct dev_pm_qos_request *req, s32 new_value); int dev_pm_qos_remove_request(struct dev_pm_qos_request *req); int dev_pm_qos_add_notifier(struct device *dev, struct notifier_block *notifier, enum dev_pm_qos_req_type type);