- Oct 08, 2021
-
-
YueHaibing authored
Fix sparse warning: drivers/opp/of.c:924 _opp_add_static_v2() warn: passing zero to 'ERR_PTR' For duplicate OPPs 'ret' be set to zero. Fixes: deac8703 ("PM / OPP: _of_add_opp_table_v2(): increment count only if OPP is added") Signed-off-by:
YueHaibing <yuehaibing@huawei.com> Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org>
-
- Oct 04, 2021
-
-
Dmitry Osipenko authored
Add resource-managed variants of dev_pm_opp_of_add_table_indexed() and dev_pm_opp_of_add_table_noclk(), allowing drivers to remove boilerplate code. Signed-off-by:
Dmitry Osipenko <digetx@gmail.com> [ Viresh: Added underscore to devm_of_add_table_indexed() ] Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org>
-
Dmitry Osipenko authored
Elements of the 'names' array are not changed by the code, constify them for consistency. Signed-off-by:
Dmitry Osipenko <digetx@gmail.com> Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org>
-
Pavankumar Kondeti authored
The 'required-opps' property is optional. So of_count_phandle_with_args() can return -ENOENT when queried for required-opps. Handle this case. Signed-off-by:
Pavankumar Kondeti <pkondeti@codeaurora.org> Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org>
-
- Aug 23, 2021
-
-
Marijn Suijten authored
Commit 4fa82a87 ("opp: Allow required-opps to be used for non genpd use cases") dereferences the pointers in required_opp_tables but these might be set to an ERR_PTR if the list still has lazy links pending, resulting in segfaults. Prior to this patch IS_ERR was also checked on required_opp_tables[i] before reading ->is_genpd inside _opp_table_alloc_required_tables, which is at the same time the predicate to add this table to the lazy list. This segfault is solved by reordering the checks to bail on lazy pending tables before reading ->is_genpd. Fixes: 4fa82a87 ("opp: Allow required-opps to be used for non genpd use cases") Reviewed-by:
AngeloGioacchino Del Regno <angelogioacchino.delregno@somainline.org> Signed-off-by:
Marijn Suijten <marijn.suijten@somainline.org> Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org>
-
- Aug 16, 2021
-
-
Rajendra Nayak authored
The 'required-opps' property is considered optional, hence remove the pr_err() in of_parse_required_opp() when we find the property is missing. While at it, also fix the return value of of_get_required_opp_performance_state() when of_parse_required_opp() fails, return a -ENODEV instead of the -EINVAL. Signed-off-by:
Rajendra Nayak <rnayak@codeaurora.org> Reviewed-by:
Ulf Hansson <ulf.hansson@linaro.org> Acked-by:
Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by:
Rafael J. Wysocki <rafael.j.wysocki@intel.com>
-
Dmitry Osipenko authored
The current_opp is released only when whole OPP table is released, otherwise it's only marked as removed by dev_pm_opp_remove_table(). Functions like dev_pm_opp_put_clkname() and dev_pm_opp_put_supported_hw() are checking whether OPP table is empty and it's not if current_opp is set since it holds the refcount of OPP, this produces a noisy warning from these functions about busy OPP table. Remove the checks to fix it. Cc: stable@vger.kernel.org Fixes: 81c4d8a3 ("opp: Keep track of currently programmed OPP") Signed-off-by:
Dmitry Osipenko <digetx@gmail.com> Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org>
-
- Aug 04, 2021
-
-
Michał Mirosław authored
This WARN can be triggered per-core and the stack trace is not useful. Replace it with plain dev_err(). Fix a comment while at it. Signed-off-by:
Michał Mirosław <mirq-linux@rere.qmqm.pl> Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org>
-
- Jun 18, 2021
-
-
Hsin-Yi Wang authored
Don't limit required_opp_table to genpd only. One possible use case is cpufreq based devfreq governor, which can use required-opps property to derive devfreq from cpufreq. Though the OPP core still doesn't support non-genpd required-opps in _set_required_opps(). Suggested-by:
Chanwoo Choi <cw00.choi@samsung.com> Signed-off-by:
Hsin-Yi Wang <hsinyi@chromium.org> [ Viresh: Update _set_required_opps() to check for genpd ] Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org>
-
- May 20, 2021
-
-
Yang Yingliang authored
Using list_del_init() instead of list_del() + INIT_LIST_HEAD() to simpify the code. Signed-off-by:
Yang Yingliang <yangyingliang@huawei.com> Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org>
-
- Mar 16, 2021
-
-
Dmitry Osipenko authored
Make devm_pm_opp_attach_genpd() to return error code instead of opp_table pointer in order to have return type consistent with the other resource-managed OPP helpers. Signed-off-by:
Dmitry Osipenko <digetx@gmail.com> Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org>
-
Dmitry Osipenko authored
Make devm_pm_opp_register_set_opp_helper() to return error code instead of opp_table pointer in order to have return type consistent with the other resource-managed OPP helpers. Signed-off-by:
Dmitry Osipenko <digetx@gmail.com> Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org>
-
- Mar 15, 2021
-
-
Yangtao Li authored
Add devres wrapper for dev_pm_opp_of_add_table() to simplify drivers code. Signed-off-by:
Yangtao Li <tiny.windzz@gmail.com> Signed-off-by:
Dmitry Osipenko <digetx@gmail.com> Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org>
-
Yangtao Li authored
Add devres wrapper for dev_pm_opp_set_supported_hw() to simplify drivers code. Signed-off-by:
Yangtao Li <tiny.windzz@gmail.com> Signed-off-by:
Dmitry Osipenko <digetx@gmail.com> Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org>
-
Yangtao Li authored
Add devres wrapper for dev_pm_opp_set_regulators() to simplify drivers code. Signed-off-by:
Yangtao Li <tiny.windzz@gmail.com> Signed-off-by:
Dmitry Osipenko <digetx@gmail.com> Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org>
-
Yangtao Li authored
Add devres wrapper for dev_pm_opp_set_clkname() to simplify drivers code. Signed-off-by:
Yangtao Li <tiny.windzz@gmail.com> Signed-off-by:
Dmitry Osipenko <digetx@gmail.com> Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org>
-
- Mar 12, 2021
-
-
Beata Michalska authored
We are required to call dev_pm_opp_put() from outside of the opp_table->lock as debugfs removal needs to happen lock-less to avoid circular dependency issues. commit cf1fac94 ("opp: Reduce the size of critical section in _opp_kref_release()") tried to fix that introducing a new routine _opp_get_next() which keeps returning OPPs that can be freed by the callers and this routine shall be called without holding the opp_table->lock. Though the commit overlooked the fact that the OPPs can be referenced by other users as well and this routine will end up dropping references which were taken by other users and hence freeing the OPPs prematurely. In effect, other users of the OPPs will end up having invalid pointers at hand. We didn't see any crash reports earlier as the exact situation never happened, though it is certainly possible. We need a way to mark which OPPs are no longer referenced by the OPP core, so we don't drop extra references to them accidentally. This commit adds another OPP flag, "removed", which is used to track this. And now we should never end up dropping extra references to the OPPs. Cc: v5.11+ <stable@vger.kernel.org> # v5.11+ Fixes: cf1fac94 ("opp: Reduce the size of critical section in _opp_kref_release()") Signed-off-by:
Beata Michalska <beata.michalska@arm.com> [ Viresh: Almost rewrote entire patch, added new "removed" field, rewrote commit log and added the correct Fixes tag. ] Co-developed-by:
Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org>
-
- Feb 18, 2021
-
-
Jonathan Marek authored
We skip the OPP update if the current and target OPPs are same. This is fine for the devices that don't support frequency but may cause issues for the ones that need to program frequency. An OPP entry doesn't really signify a single operating frequency but rather the highest frequency at which the other properties of the OPP entry apply. And we may reach here with different frequency values, while all of them would point to the same OPP entry in the OPP table. We just need to update the clock frequency in that case, though in order to not add special exit points we reuse the code flow from a normal path. While at it, rearrange the conditionals in the 'if' statement to check 'enabled' flag at the end. Fixes: 81c4d8a3 ("opp: Keep track of currently programmed OPP") Signed-off-by:
Jonathan Marek <jonathan@marek.ca> [ Viresh: Improved commit log and subject, rename current_freq as current_rate, document it, remove local variable and rearrange code. ] Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org>
-
- Feb 04, 2021
-
-
Saravana Kannan authored
Add a function that allows looking up required OPPs given a source OPP table, destination OPP table and the source OPP. Signed-off-by:
Saravana Kannan <saravanak@google.com> Signed-off-by:
Hsin-Yi Wang <hsinyi@chromium.org> [ Viresh: Rearranged code, fixed return errors ] Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org>
-
- Feb 02, 2021
-
-
Viresh Kumar authored
Not all devices that need to use OPP core need to have clocks, a missing clock is fine in which case -ENOENT shall be returned by clk_get(). Anything else is an error and must be handled properly. Reported-by:
Dmitry Osipenko <digetx@gmail.com> Tested-by:
Dmitry Osipenko <digetx@gmail.com> Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org>
-
Viresh Kumar authored
The bandwidth must be scaled at a different point in the code flow based on if we are scaling up or down the frequency, otherwise this may cause undesired effects as the device will try to use more of the memory bandwidth which may be shared across several devices. Much like how regulators and required-opps are programmed. Reported-by:
Dmitry Osipenko <digetx@gmail.com> Reported-by:
Akhil P Oommen <akhilpo@codeaurora.org> Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org> Tested-by:
Dmitry Osipenko <digetx@gmail.com>
-
Viresh Kumar authored
The OPP core currently requires the required opp tables to be available before the dependent OPP table is added, as it needs to create links from the dependent OPP table to the required ones. This may not be convenient for all the platforms though, as this requires strict ordering for probing the drivers. This patch allows lazy-linking of the required-opps. The OPP tables for which the required-opp-tables aren't available at the time of their initialization, are added to a special list of OPP tables: lazy_opp_tables. Later on, whenever a new OPP table is registered with the OPP core, we check if it is required by an OPP table in the pending list; if yes, then we complete the linking then and there. An OPP table is marked unusable until the time all its required-opp tables are available. And if lazy-linking fails for an OPP table, the OPP core disables all of its OPPs to make sure no one can use them. Tested-by:
Hsin-Yi Wang <hsinyi@chromium.org> Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org>
-
Viresh Kumar authored
All the users have migrated to dev_pm_opp_set_opp() now, get rid of the duplicate API, dev_pm_opp_set_bw(), which only performs a part of the new API. While at it, remove the unnecessary parameter to _set_opp_bw(). Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org> Tested-by:
Dmitry Osipenko <digetx@gmail.com>
-
Viresh Kumar authored
The new helper dev_pm_opp_set_opp() can be used for configuring the devices for a particular OPP and can be used by different type of devices, even the ones which don't change frequency (like power domains). Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org> Tested-by:
Dmitry Osipenko <digetx@gmail.com>
-
Viresh Kumar authored
Drop the unnecessary parameters and follow the pattern from _generic_set_opp_regulator(). While at it, also remove the local variable old_freq. Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org> Tested-by:
Dmitry Osipenko <digetx@gmail.com>
-
Viresh Kumar authored
In order to avoid conditional statements at the caller site, this patch updates _generic_set_opp_clk_only() to work for devices that don't change frequency (like power domains, etc.). Return 0 if the clk pointer passed to this routine is not valid. Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org> Tested-by:
Dmitry Osipenko <digetx@gmail.com>
-
Viresh Kumar authored
The _generic_set_opp_regulator() helper will be used for devices which don't change frequency (like power domains, etc.) later on, prepare for that by not relying on frequency for making decisions here. While at it, update its parameters to pass only what is necessary. Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org> Tested-by:
Dmitry Osipenko <digetx@gmail.com>
-
Viresh Kumar authored
The _set_opp() helper will be used for devices which don't change frequency (like power domains, etc.) later on, prepare for that by not relying on frequency for making decisions here. While at it, also update the debug print to contain all relevant information. Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org> Tested-by:
Dmitry Osipenko <digetx@gmail.com>
-
Viresh Kumar authored
The _set_opp() helper will be used for devices which don't change their frequency (like power domains, etc.) later on, prepare for that by breaking the generic part out of dev_pm_opp_set_rate(). Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org> Tested-by:
Dmitry Osipenko <digetx@gmail.com>
-
Viresh Kumar authored
The dev_pm_opp_set_rate() helper needs to know the currently programmed OPP to make few decisions and currently we try to find it on every invocation of this routine. Lets start keeping track of the current_opp programmed for the devices of the opp table, that will be quite useful going forward. If we fail to find the current OPP, we pick the first one available in the list, as the list is in ascending order of frequencies, level, or bandwidth and that's the best guess we can make anyway. Note that we used to do the frequency comparison a bit early in dev_pm_opp_set_rate() previously, and now instead we check the target opp, which shall be more accurate anyway. We need to make sure that current_opp's memory doesn't get freed while it is being used and so we keep a reference of it until the time it is used. Now that current_opp will always be set, we can drop some unnecessary checks as well. Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org> Tested-by:
Dmitry Osipenko <digetx@gmail.com>
-
Viresh Kumar authored
Clock is not optional for users who call into dev_pm_opp_set_rate(). Remove the unnecessary checks. While at it also drop the local variable for clk and use opp_table->clk instead. Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org> Tested-by:
Dmitry Osipenko <digetx@gmail.com>
-
Viresh Kumar authored
This routine has nothing to do with frequency, it just disables all the resources previously enabled. Rename it to match its purpose. Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org> Tested-by:
Dmitry Osipenko <digetx@gmail.com>
-
Dmitry Osipenko authored
Check whether OPP table has regulators in _set_opp_custom() and set up dev_pm_set_opp_data accordingly. Now _set_opp_custom() works properly, i.e. it doesn't crash if OPP table doesn't have assigned regulators. Signed-off-by:
Dmitry Osipenko <digetx@gmail.com> [ Viresh: Rearrange the routine a bit ] Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org>
-
Viresh Kumar authored
Until now the ->set_opp() helper (i.e. special implementation for setting the OPPs for platforms) was implemented only to take care of multiple regulators case, but going forward we would need that for other use cases as well. This patch prepares for that by allocating the regulator specific part from dev_pm_opp_set_regulators() and the opp helper part from dev_pm_opp_register_set_opp_helper(). Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org> Tested-by:
Dmitry Osipenko <digetx@gmail.com>
-
Dmitry Osipenko authored
Print OPP level in debug message of _opp_add_static_v2(). This helps to chase GENPD bugs. Tested-by:
Peter Geis <pgwipeout@gmail.com> Tested-by:
Nicolas Chauvet <kwizart@gmail.com> Tested-by:
Matt Merhar <mattmerhar@protonmail.com> Signed-off-by:
Dmitry Osipenko <digetx@gmail.com> Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org>
-
Dmitry Osipenko authored
NVIDIA Tegra SoCs have a power domains topology such that child domains only clamp a power rail, while parent domain controls shared performance state of the multiple child domains. In this case child's domain doesn't need to have OPP table. Hence we want to allow children power domains to pass performance state to the parent domain if child's domain doesn't have OPP table. The dev_pm_opp_xlate_performance_state() gets src_table=NULL if a child power domain doesn't have OPP table and in this case we should pass the performance state to the parent domain. Tested-by:
Peter Geis <pgwipeout@gmail.com> Tested-by:
Nicolas Chauvet <kwizart@gmail.com> Tested-by:
Matt Merhar <mattmerhar@protonmail.com> Signed-off-by:
Dmitry Osipenko <digetx@gmail.com> Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org>
-
Dmitry Osipenko authored
Add resource-managed version of dev_pm_opp_attach_genpd(). Signed-off-by:
Dmitry Osipenko <digetx@gmail.com> [ Viresh: Manually apply the patch and relocate the routines ] Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org>
-
Dmitry Osipenko authored
Add resource-managed version of dev_pm_opp_register_set_opp_helper(). Tested-by:
Peter Geis <pgwipeout@gmail.com> Tested-by:
Nicolas Chauvet <kwizart@gmail.com> Tested-by:
Matt Merhar <mattmerhar@protonmail.com> Signed-off-by:
Dmitry Osipenko <digetx@gmail.com> [ Viresh: Manually apply the patch and relocate the routines ] Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org>
-
Viresh Kumar authored
A few drivers have device's clk but they don't want the OPP core to handle that. Add a new helper for them, dev_pm_opp_of_add_table_noclk(). Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org> Tested-by:
Dmitry Osipenko <digetx@gmail.com>
-
Viresh Kumar authored
We acquire the clk at the time the OPP table is allocated, though it works fine, it is not the best place to do so. One of the main reason being we may need to acquire it again from dev_pm_opp_set_clkname() if the platform wants another clock to be acquired instead. There is also requirement from some of the platforms where they do not want the OPP core to manage the clock at all. This patch hence defers acquiring the clk until the time we are certain about which clk we need to acquire and if we really need to acquire one. With this commit, the clk will get acquired either from dev_pm_opp_set_clkname() or while we initialize the OPPs within the table. Signed-off-by:
Viresh Kumar <viresh.kumar@linaro.org> Tested-by:
Dmitry Osipenko <digetx@gmail.com>
-