OPP: Add new configuration interface: dev_pm_opp_set_config()
Subsystems (29)
Viresh Kumar
maintainerv2 cover OPP: Add new configuration interface: dev_pm_opp_set_config()
Hello,
We have too many configuration specific APIs currently, six of them already, like dev_pm_opp_set_regulators(). This makes it complex/messy for both the OPP core and its users to manage. There is also code redundancy in these APIs, in the way they add/manage the OPP table specific stuff.
This patch series is an attempt to simplify these interfaces by adding a single interface, dev_pm_opp_set_config(), which replaces all the existing ones. This series also migrates the users to the new API.
The first two patches help get the API in place, followed by patches to migrate the end users. Once all the users are migrated, the last few patches remove the now unused interfaces.
This is pushed here:
git://git.kernel.org/pub/scm/linux/kernel/git/vireshk/pm.git opp/linux-next
This is already tested by various folks now.
The entire patchset shall get merged via the OPP tree in 5.20-rc1, please do not merge individual patches.
V1->V2:
- dev_pm_opp_set_config() doesn't return the OPP table anymore, but a token allocated with xa_alloc(). The same needs to be passed to clear-config API.
- Updated all users according to that as well.
- The clk_names interface is updated to allow multiple clocks.
- Converted few // comments to /* */.
- Added tags by few people.
- Dropped the last patch to rearrange stuff, not required anymore.
Thanks.
--
Viresh
Viresh Kumar (30):
OPP: Track if clock name is configured by platform
OPP: Add dev_pm_opp_set_config() and friends
cpufreq: dt: Migrate to dev_pm_opp_set_config()
cpufreq: imx: Migrate to dev_pm_opp_set_config()
cpufreq: qcom-nvmem: Migrate to dev_pm_opp_set_config()
cpufreq: sti: Migrate to dev_pm_opp_set_config()
cpufreq: sun50i: Migrate to dev_pm_opp_set_config()
cpufreq: tegra20: Migrate to dev_pm_opp_set_config()
cpufreq: ti: Migrate to dev_pm_opp_set_config()
devfreq: exynos: Migrate to dev_pm_opp_set_config()
devfreq: sun8i: Migrate to dev_pm_opp_set_config()
devfreq: tegra30: Migrate to dev_pm_opp_set_config() drm/lima: Migrate to dev_pm_opp_set_config() drm/msm: Migrate to dev_pm_opp_set_config() drm/panfrost: Migrate to dev_pm_opp_set_config() drm/tegra: Migrate to dev_pm_opp_set_config()
media: venus: Migrate to dev_pm_opp_set_config()
memory: tegra: Migrate to dev_pm_opp_set_config()
mmc: sdhci-msm: Migrate to dev_pm_opp_set_config()
OPP: ti: Migrate to dev_pm_opp_set_config() soc/tegra: Add comment over devm_pm_opp_set_clkname() soc/tegra: Migrate to dev_pm_opp_set_config()
spi: qcom: Migrate to dev_pm_opp_set_config()
serial: qcom: Migrate to dev_pm_opp_set_config()
OPP: Remove dev_pm_opp_set_regulators() and friends
OPP: Remove dev_pm_opp_set_supported_hw() and friends
OPP: Remove dev_pm_opp_set_clkname() and friends
OPP: Remove dev_pm_opp_register_set_opp_helper() and friends
OPP: Remove dev_pm_opp_attach_genpd() and friends
OPP: Remove dev_pm_opp_set_prop_name() and friends
drivers/cpufreq/cpufreq-dt.c | 20 +- drivers/cpufreq/imx-cpufreq-dt.c | 18 +- drivers/cpufreq/qcom-cpufreq-nvmem.c | 109 +-- drivers/cpufreq/sti-cpufreq.c | 27 +- drivers/cpufreq/sun50i-cpufreq-nvmem.c | 36 +- drivers/cpufreq/tegra20-cpufreq.c | 18 +- drivers/cpufreq/ti-cpufreq.c | 38 +- drivers/devfreq/exynos-bus.c | 25 +- drivers/devfreq/sun8i-a33-mbus.c | 8 +- drivers/devfreq/tegra30-devfreq.c | 8 +- drivers/gpu/drm/lima/lima_devfreq.c | 12 +- drivers/gpu/drm/msm/adreno/a5xx_gpu.c | 8 +- drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 10 +- drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 6 +- drivers/gpu/drm/msm/dp/dp_ctrl.c | 6 +- drivers/gpu/drm/msm/dsi/dsi_host.c | 6 +- drivers/gpu/drm/panfrost/panfrost_devfreq.c | 9 +- drivers/gpu/drm/tegra/gr3d.c | 6 +- .../media/platform/qcom/venus/pm_helpers.c | 18 +- drivers/memory/tegra/tegra124-emc.c | 17 +- drivers/mmc/host/sdhci-msm.c | 6 +- drivers/opp/core.c | 632 ++++++++---------- drivers/opp/opp.h | 23 + drivers/opp/ti-opp-supply.c | 8 +- drivers/soc/tegra/common.c | 45 +- drivers/soc/tegra/pmc.c | 8 +- drivers/spi/spi-geni-qcom.c | 6 +- drivers/spi/spi-qcom-qspi.c | 6 +- drivers/tty/serial/qcom_geni_serial.c | 6 +- include/linux/pm_opp.h | 121 +--- 30 files changed, 605 insertions(+), 661 deletions(-)
Signature · 1 line
2.31.1.272.g89b43f80a514
Viresh Kumar
maintainerPATCH v2 1/30 OPP: Track if clock name is configured by platform
Track if the clock name is configured by the platform or not. This is a preparatory change and will be used by later commits. This also makes the behavior of the clkname API similar to other ones, which allow repeated calls to the same API for each CPU.
--- drivers/opp/core.c | 7 +++++++ drivers/opp/opp.h | 2 ++ 2 files changed, 9 insertions(+)
drivers/opp/core.c +7 -0
@@ -2277,6 +2277,10 @@ struct opp_table *dev_pm_opp_set_clkname(struct device *dev, const char *name) goto err; } +/* Another CPU that shares the OPP table has set the clkname ? */ +if (opp_table->clk_configured) +return opp_table; +/* clk shouldn't be initialized at this point */ if (WARN_ON (opp_table->clk)) { ret = -EBUSY ;
@@ -2291,6 +2295,8 @@ struct opp_table *dev_pm_opp_set_clkname(struct device *dev, const char *name) goto err; } + opp_table->clk_configured = true; +return opp_table; err:
@@ -2311,6 +2317,7 @@ void dev_pm_opp_put_clkname(struct opp_table *opp_table)clk_put (opp_table->clk); opp_table->clk =ERR_PTR (-EINVAL ); + opp_table->clk_configured = false;dev_pm_opp_put_opp_table (opp_table); }
drivers/opp/opp.h +2 -0
@@ -149,6 +149,7 @@ enum opp_table_access {* @supported_hw: Array of version number to support. * @supported_hw_count: Number of elements in supported_hw array. * @prop_name: A name to postfix to many DT properties, while parsing them. +* @clk_configured: Clock name is configured by the platform. * @clk: Device's clock handle * @regulators: Supply regulators * @regulator_count: Number of power supply regulators. Its value can be -1
@@ -200,6 +201,7 @@ struct opp_table {unsigned int *supported_hw;unsigned int supported_hw_count;const char *prop_name; +bool clk_configured;struct clk *clk;struct regulator **regulators;int regulator_count;
Signature · 1 line
2.31.1.272.g89b43f80a514
Viresh Kumar
maintainerPATCH v2 2/30 OPP: Add dev_pm_opp_set_config() and friends
In reply to Viresh KumarThe OPP core already have few configuration specific APIs and it is getting complex or messy for both the OPP core and its users.
Lets introduce a new set of API which will be used for all kind of different configurations, and shall eventually replace all the existing ones.
The new API, returns a unique token instead of a pointer to the OPP table, which allows the OPP core to drop the resources selectively later on.
--- drivers/opp/core.c | 214 ++++++++++++++++++++++++++++++++++++++++- drivers/opp/opp.h | 21 ++++ include/linux/pm_opp.h | 45 +++++++++ 3 files changed, 279 insertions(+), 1 deletion(-)
drivers/opp/core.c +213 -1
@@ -13,11 +13,12 @@#include <linux/clk.h> #include <linux/errno.h> #include <linux/err.h> -#include <linux/slab.h> #include <linux/device.h> #include <linux/export.h> #include <linux/pm_domain.h> #include <linux/regulator/consumer.h> +#include <linux/slab.h> +#include <linux/xarray.h> #include "opp.h"
@@ -36,6 +37,9 @@ DEFINE_MUTEX(opp_table_lock);/* Flag indicating that opp_tables list is being updated at the moment */ static bool opp_tables_busy; +/* OPP ID allocator */ +static DEFINE_XARRAY_ALLOC1 (opp_configs); +static bool _find_opp_dev (const struct device *dev,struct opp_table *opp_table) {struct opp_device *opp_dev;
@@ -2618,6 +2622,214 @@ int devm_pm_opp_attach_genpd(struct device *dev, const char * const *names, }EXPORT_SYMBOL_GPL (devm_pm_opp_attach_genpd); +static void _opp_clear_config (struct opp_config_data *data) +{ +if (data->flags &OPP_CONFIG_GENPD ) +dev_pm_opp_detach_genpd (data->opp_table); +if (data->flags &OPP_CONFIG_REGULATOR ) +dev_pm_opp_put_regulators (data->opp_table); +if (data->flags &OPP_CONFIG_SUPPORTED_HW ) +dev_pm_opp_put_supported_hw (data->opp_table); +if (data->flags &OPP_CONFIG_REGULATOR_HELPER ) +dev_pm_opp_unregister_set_opp_helper (data->opp_table); +if (data->flags &OPP_CONFIG_PROP_NAME ) +dev_pm_opp_put_prop_name (data->opp_table); +if (data->flags &OPP_CONFIG_CLK ) +dev_pm_opp_put_clkname (data->opp_table); + +dev_pm_opp_put_opp_table (data->opp_table); +kfree (data); +} + +/** +* dev_pm_opp_set_config() - Set OPP configuration for the device. +* @dev: Device for which configuration is being set. +* @config: OPP configuration. +* +* This allows all device OPP configurations to be performed at once. +* +* This must be called before any OPPs are initialized for the device. This may +* be called multiple times for the same OPP table, for example once for each +* CPU that share the same table. This must be balanced by the same number of +* calls to dev_pm_opp_clear_config() in order to free the OPP table properly. +* +* This returns a token to the caller, which must be passed to +* dev_pm_opp_clear_config() to free the resources later. The value of the +* returned token will be >= 1 for success and negative for errors. The minimum +* value of 1 is chosen here to make it easy for callers to manage the resource. +*/ +int dev_pm_opp_set_config (struct device *dev,struct dev_pm_opp_config *config) +{ +struct opp_table *opp_table, *err; +struct opp_config_data *data; +unsigned int id; +int ret; + + data =kmalloc (sizeof (*data),GFP_KERNEL ); +if (!data) +return -ENOMEM ; + + opp_table =_add_opp_table (dev, false); +if (IS_ERR (opp_table)) { +kfree (data); +return PTR_ERR (opp_table); + } + + data->opp_table = opp_table; + data->flags =0 ; + +/* This should be called before OPPs are initialized */ +if (WARN_ON (!list_empty (&opp_table->opp_list))) { + ret = -EBUSY ; + goto err; + } + +/* Configure clocks */ +if (config->clk_names) { +/* We support only one clock name for now */ +if (config->clk_count !=1 ) { + ret = -EINVAL ; + goto err; + } + + err =dev_pm_opp_set_clkname (dev, config->clk_names[0 ]); +if (IS_ERR (err)) { + ret =PTR_ERR (err); + goto err; + } + + data->flags |=OPP_CONFIG_CLK ; + } + +/* Configure property names */ +if (config->prop_name) { + err =dev_pm_opp_set_prop_name (dev, config->prop_name); +if (IS_ERR (err)) { + ret =PTR_ERR (err); + goto err; + } + + data->flags |=OPP_CONFIG_PROP_NAME ; + } + +/* Configure opp helper */ +if (config->set_opp) { + err =dev_pm_opp_register_set_opp_helper (dev, config->set_opp); +if (IS_ERR (err)) { + ret =PTR_ERR (err); + goto err; + } + + data->flags |=OPP_CONFIG_REGULATOR_HELPER ; + } + +/* Configure supported hardware */ +if (config->supported_hw) { + err =dev_pm_opp_set_supported_hw (dev, config->supported_hw, + config->supported_hw_count); +if (IS_ERR (err)) { + ret =PTR_ERR (err); + goto err; + } + + data->flags |=OPP_CONFIG_SUPPORTED_HW ; + } + +/* Configure supplies */ +if (config->regulator_names) { + err =dev_pm_opp_set_regulators (dev, config->regulator_names, + config->regulator_count); +if (IS_ERR (err)) { + ret =PTR_ERR (err); + goto err; + } + + data->flags |=OPP_CONFIG_REGULATOR ; + } + +/* Attach genpds */ +if (config->genpd_names) { + err =dev_pm_opp_attach_genpd (dev, config->genpd_names, + config->virt_devs); +if (IS_ERR (err)) { + ret =PTR_ERR (err); + goto err; + } + + data->flags |=OPP_CONFIG_GENPD ; + } + + ret =xa_alloc (&opp_configs, &id, data,XA_LIMIT (1 ,INT_MAX ), +GFP_KERNEL ); +if (ret) + goto err; + +return id; + +err: +_opp_clear_config (data); +return ret; +} +EXPORT_SYMBOL_GPL (dev_pm_opp_set_config); + +/** +* dev_pm_opp_clear_config() - Releases resources blocked for OPP configuration. +* @opp_table: OPP table returned from dev_pm_opp_set_config(). +* +* This allows all device OPP configurations to be cleared at once. This must be +* called once for each call made to dev_pm_opp_set_config(), in order to free +* the OPPs properly. +* +* Currently the first call itself ends up freeing all the OPP configurations, +* while the later ones only drop the OPP table reference. This works well for +* now as we would never want to use an half initialized OPP table and want to +* remove the configurations together. +*/ +void dev_pm_opp_clear_config (int token) +{ +struct opp_config_data *data; + +/* +* This lets the callers call this unconditionally and keep their code +* simple. +*/ +if (unlikely (token <=0 )) +return ; + + data =xa_erase (&opp_configs, token); +if (WARN_ON (!data)) +return ; + +_opp_clear_config (data); +} +EXPORT_SYMBOL_GPL (dev_pm_opp_clear_config); + +static void devm_pm_opp_config_release (void *token) +{ +dev_pm_opp_clear_config ((unsigned long )token); +} + +/** +* devm_pm_opp_set_config() - Set OPP configuration for the device. +* @dev: Device for which configuration is being set. +* @config: OPP configuration. +* +* This allows all device OPP configurations to be performed at once. +* This is a resource-managed variant of dev_pm_opp_set_config(). +* +* Return: 0 on success and errorno otherwise. +*/ +int devm_pm_opp_set_config (struct device *dev,struct dev_pm_opp_config *config) +{ +int token =dev_pm_opp_set_config (dev, config); +if (token <0 ) +return token; + +return devm_add_action_or_reset (dev, devm_pm_opp_config_release, + (void *) ((unsigned long ) token)); +} +EXPORT_SYMBOL_GPL (devm_pm_opp_set_config); +/** * dev_pm_opp_xlate_required_opp() - Find required OPP for @src_table OPP. * @src_table: OPP table which has @dst_table as one of its required OPP table.
drivers/opp/opp.h +21 -0
@@ -28,6 +28,27 @@ extern struct mutex opp_table_lock;extern struct list_head opp_tables, lazy_opp_tables; +/* OPP Config flags */ +#define OPP_CONFIG_CLK BIT(0) +#define OPP_CONFIG_REGULATOR BIT(1) +#define OPP_CONFIG_REGULATOR_HELPER BIT(2) +#define OPP_CONFIG_PROP_NAME BIT(3) +#define OPP_CONFIG_SUPPORTED_HW BIT(4) +#define OPP_CONFIG_GENPD BIT(5) + +/** +* struct opp_config_data - data for set config operations +* @opp_table: OPP table +* @flags: OPP config flags +* +* This structure stores the OPP config information for each OPP table +* configuration by the callers. +*/ +struct opp_config_data { +struct opp_table *opp_table; +unsigned int flags; +}; +/* * Internal data structure organization with the OPP layer library is as * follows:
include/linux/pm_opp.h +45 -0
63 lines not on this page · raw message
Signature · 1 line
2.31.1.272.g89b43f80a514
Viresh Kumar
maintainerPATCH v2 3/30 cpufreq: dt: Migrate to dev_pm_opp_set_config()
In reply to Viresh KumarThe OPP core now provides a unified API for setting all configuration types, i.e. dev_pm_opp_set_config().
Lets start using it.
--- drivers/cpufreq/cpufreq-dt.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-)
drivers/cpufreq/cpufreq-dt.c +12 -8
@@ -29,8 +29,8 @@ struct private_data {cpumask_var_t cpus;struct device *cpu_dev; -struct opp_table *opp_table;struct cpufreq_frequency_table *freq_table; +int opp_token;bool have_static_opps; };
@@ -220,12 +220,16 @@ static int dt_cpufreq_early_init(struct device *dev, int cpu)*/ reg_name =find_supply_name (cpu_dev);if (reg_name) { - priv->opp_table =dev_pm_opp_set_regulators (cpu_dev, ®_name, -1 ); -if (IS_ERR (priv->opp_table)) { - ret =PTR_ERR (priv->opp_table); +struct dev_pm_opp_config config = { + .regulator_names = ®_name, + .regulator_count =1 , + }; + + priv->opp_token =dev_pm_opp_set_config (cpu_dev, &config); +if (priv->opp_token <0 ) { + ret = priv->opp_token;if (ret != -EPROBE_DEFER ) -dev_err (cpu_dev,"failed to set regulators: %d\n" , +dev_err (cpu_dev,"failed to set OPP config: %d\n" , ret); goto free_cpumask; }
@@ -295,7 +299,7 @@ static int dt_cpufreq_early_init(struct device *dev, int cpu) out:if (priv->have_static_opps)dev_pm_opp_of_cpumask_remove_table (priv->cpus); -dev_pm_opp_put_regulators (priv->opp_table); +dev_pm_opp_clear_config (priv->opp_token); free_cpumask:free_cpumask_var (priv->cpus);return ret;
@@ -309,7 +313,7 @@ static void dt_cpufreq_release(void)dev_pm_opp_free_cpufreq_table (priv->cpu_dev, &priv->freq_table);if (priv->have_static_opps)dev_pm_opp_of_cpumask_remove_table (priv->cpus); -dev_pm_opp_put_regulators (priv->opp_table); +dev_pm_opp_clear_config (priv->opp_token);free_cpumask_var (priv->cpus);list_del (&priv->node); }
Signature · 1 line
2.31.1.272.g89b43f80a514
Viresh Kumar
maintainerPATCH v2 4/30 cpufreq: imx: Migrate to dev_pm_opp_set_config()
In reply to Viresh KumarThe OPP core now provides a unified API for setting all configuration types, i.e. dev_pm_opp_set_config().
Lets start using it.
--- drivers/cpufreq/imx-cpufreq-dt.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-)
drivers/cpufreq/imx-cpufreq-dt.c +11 -7
@@ -31,8 +31,8 @@/* cpufreq-dt device registered by imx-cpufreq-dt */ static struct platform_device *cpufreq_dt_pdev; -static struct opp_table *cpufreq_opp_table;static struct device *cpu_dev; +static int cpufreq_opp_token;enum IMX7ULP_CPUFREQ_CLKS {ARM ,
@@ -86,6 +86,10 @@ static int imx_cpufreq_dt_probe(struct platform_device *pdev)u32 cell_value, supported_hw[2 ];int speed_grade, mkt_segment;int ret; +struct dev_pm_opp_config config = { + .supported_hw = supported_hw, + .supported_hw_count =ARRAY_SIZE (supported_hw), + }; cpu_dev =get_cpu_device (0 );
@@ -153,17 +157,17 @@ static int imx_cpufreq_dt_probe(struct platform_device *pdev)dev_info (&pdev->dev,"cpu speed grade %d mkt segment %d supported-hw %#x %#x\n" , speed_grade, mkt_segment, supported_hw[0 ], supported_hw[1 ]); - cpufreq_opp_table =dev_pm_opp_set_supported_hw (cpu_dev, supported_hw,2 ); -if (IS_ERR (cpufreq_opp_table)) { - ret =PTR_ERR (cpufreq_opp_table); -dev_err (&pdev->dev,"Failed to set supported opp: %d\n" , ret); + cpufreq_opp_token =dev_pm_opp_set_config (cpu_dev, &config); +if (cpufreq_opp_token <0 ) { + ret = cpufreq_opp_token; +dev_err (&pdev->dev,"Failed to set Opp config: %d\n" , ret);return ret; } cpufreq_dt_pdev =platform_device_register_data ( &pdev->dev,"cpufreq-dt" ,-1 ,NULL ,0 );if (IS_ERR (cpufreq_dt_pdev)) { -dev_pm_opp_put_supported_hw (cpufreq_opp_table); +dev_pm_opp_clear_config (cpufreq_opp_token); ret =PTR_ERR (cpufreq_dt_pdev);dev_err (&pdev->dev,"Failed to register cpufreq-dt: %d\n" , ret);return ret;
@@ -176,7 +180,7 @@ static int imx_cpufreq_dt_remove(struct platform_device *pdev) {platform_device_unregister (cpufreq_dt_pdev);if (!of_machine_is_compatible ("fsl,imx7ulp" )) -dev_pm_opp_put_supported_hw (cpufreq_opp_table); +dev_pm_opp_clear_config (cpufreq_opp_token);else clk_bulk_put (ARRAY_SIZE (imx7ulp_clks), imx7ulp_clks);
Signature · 1 line
2.31.1.272.g89b43f80a514
Viresh Kumar
maintainerPATCH v2 5/30 cpufreq: qcom-nvmem: Migrate to dev_pm_opp_set_config()
In reply to Viresh KumarThe OPP core now provides a unified API for setting all configuration types, i.e. dev_pm_opp_set_config().
Lets start using it.
--- drivers/cpufreq/qcom-cpufreq-nvmem.c | 109 +++++++-------------------- 1 file changed, 28 insertions(+), 81 deletions(-)
drivers/cpufreq/qcom-cpufreq-nvmem.c +28 -81
@@ -55,9 +55,7 @@ struct qcom_cpufreq_match_data { };struct qcom_cpufreq_drv { -struct opp_table **names_opp_tables; -struct opp_table **hw_opp_tables; -struct opp_table **genpd_opp_tables; +int *opp_tokens;u32 versions;const struct qcom_cpufreq_match_data *data; };
@@ -315,72 +313,43 @@ static int qcom_cpufreq_probe(struct platform_device *pdev) }of_node_put (np); - drv->names_opp_tables =kcalloc (num_possible_cpus (), -sizeof (*drv->names_opp_tables), + drv->opp_tokens =kcalloc (num_possible_cpus (),sizeof (*drv->opp_tokens),GFP_KERNEL ); -if (!drv->names_opp_tables) { +if (!drv->opp_tokens) { ret = -ENOMEM ; goto free_drv; } - drv->hw_opp_tables =kcalloc (num_possible_cpus (), -sizeof (*drv->hw_opp_tables), -GFP_KERNEL ); -if (!drv->hw_opp_tables) { - ret = -ENOMEM ; - goto free_opp_names; - } - - drv->genpd_opp_tables =kcalloc (num_possible_cpus (), -sizeof (*drv->genpd_opp_tables), -GFP_KERNEL ); -if (!drv->genpd_opp_tables) { - ret = -ENOMEM ; - goto free_opp; - }for_each_possible_cpu (cpu) { +struct dev_pm_opp_config config = { + .supported_hw =NULL , + }; + cpu_dev =get_cpu_device (cpu);if (NULL == cpu_dev) { ret = -ENODEV ; - goto free_genpd_opp; + goto free_opp; }if (drv->data->get_version) { + config.supported_hw = &drv->versions; + config.supported_hw_count =1 ; -if (pvs_name) { - drv->names_opp_tables[cpu] =dev_pm_opp_set_prop_name ( - cpu_dev, - pvs_name); -if (IS_ERR (drv->names_opp_tables[cpu])) { - ret =PTR_ERR (drv->names_opp_tables[cpu]); -dev_err (cpu_dev,"Failed to add OPP name %s\n" , - pvs_name); - goto free_opp; - } - } - - drv->hw_opp_tables[cpu] =dev_pm_opp_set_supported_hw ( - cpu_dev, &drv->versions,1 ); -if (IS_ERR (drv->hw_opp_tables[cpu])) { - ret =PTR_ERR (drv->hw_opp_tables[cpu]); -dev_err (cpu_dev, -"Failed to set supported hardware\n" ); - goto free_genpd_opp; - } +if (pvs_name) + config.prop_name = pvs_name; }if (drv->data->genpd_names) { - drv->genpd_opp_tables[cpu] = -dev_pm_opp_attach_genpd (cpu_dev, - drv->data->genpd_names, -NULL ); -if (IS_ERR (drv->genpd_opp_tables[cpu])) { - ret =PTR_ERR (drv->genpd_opp_tables[cpu]); -if (ret != -EPROBE_DEFER ) -dev_err (cpu_dev, -"Could not attach to pm_domain: %d\n" , - ret); - goto free_genpd_opp; + config.genpd_names = drv->data->genpd_names; + config.virt_devs =NULL ; + } + +if (config.supported_hw || config.genpd_names) { + drv->opp_tokens[cpu] =dev_pm_opp_set_config (cpu_dev, &config); +if (drv->opp_tokens[cpu] <0 ) { + ret = drv->opp_tokens[cpu]; +dev_err (cpu_dev,"Failed to set OPP config\n" ); + goto free_opp; } } }
@@ -395,27 +364,10 @@ static int qcom_cpufreq_probe(struct platform_device *pdev) ret =PTR_ERR (cpufreq_dt_pdev);dev_err (cpu_dev,"Failed to register platform device\n" ); -free_genpd_opp: -for_each_possible_cpu (cpu) { -if (IS_ERR (drv->genpd_opp_tables[cpu])) -break ; -dev_pm_opp_detach_genpd (drv->genpd_opp_tables[cpu]); - } -kfree (drv->genpd_opp_tables); free_opp: -for_each_possible_cpu (cpu) { -if (IS_ERR (drv->names_opp_tables[cpu])) -break ; -dev_pm_opp_put_prop_name (drv->names_opp_tables[cpu]); - } -for_each_possible_cpu (cpu) { -if (IS_ERR (drv->hw_opp_tables[cpu])) -break ; -dev_pm_opp_put_supported_hw (drv->hw_opp_tables[cpu]); - } -kfree (drv->hw_opp_tables); -free_opp_names: -kfree (drv->names_opp_tables); +for_each_possible_cpu (cpu) +dev_pm_opp_clear_config (drv->opp_tokens[cpu]); +kfree (drv->opp_tokens); free_drv:kfree (drv);
@@ -429,15 +381,10 @@ static int qcom_cpufreq_remove(struct platform_device *pdev)platform_device_unregister (cpufreq_dt_pdev); -for_each_possible_cpu (cpu) { -dev_pm_opp_put_supported_hw (drv->names_opp_tables[cpu]); -dev_pm_opp_put_supported_hw (drv->hw_opp_tables[cpu]); -dev_pm_opp_detach_genpd (drv->genpd_opp_tables[cpu]); - } +for_each_possible_cpu (cpu) +dev_pm_opp_clear_config (drv->opp_tokens[cpu]); -kfree (drv->names_opp_tables); -kfree (drv->hw_opp_tables); -kfree (drv->genpd_opp_tables); +kfree (drv->opp_tokens);kfree (drv);return 0 ;
Signature · 1 line
2.31.1.272.g89b43f80a514
Viresh Kumar
maintainerPATCH v2 6/30 cpufreq: sti: Migrate to dev_pm_opp_set_config()
In reply to Viresh KumarThe OPP core now provides a unified API for setting all configuration types, i.e. dev_pm_opp_set_config().
Lets start using it.
--- drivers/cpufreq/sti-cpufreq.c | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-)
drivers/cpufreq/sti-cpufreq.c +10 -17
@@ -156,9 +156,13 @@ static int sti_cpufreq_set_opp_info(void)unsigned int hw_info_offset;unsigned int version[VERSION_ELEMENTS ];int pcode, substrate, major, minor; -int ret; +int opp_token, ret;char name[MAX_PCODE_NAME_LEN ]; -struct opp_table *opp_table; +struct dev_pm_opp_config config = { + .supported_hw = version, + .supported_hw_count =ARRAY_SIZE (version), + .prop_name = name, + }; reg_fields =sti_cpufreq_match ();if (!reg_fields) {
@@ -210,21 +214,14 @@ static int sti_cpufreq_set_opp_info(void)snprintf (name,MAX_PCODE_NAME_LEN ,"pcode%d" , pcode); - opp_table =dev_pm_opp_set_prop_name (dev, name); -if (IS_ERR (opp_table)) { -dev_err (dev,"Failed to set prop name\n" ); -return PTR_ERR (opp_table); - } - version[0 ] =BIT (major); version[1 ] =BIT (minor); version[2 ] =BIT (substrate); - opp_table =dev_pm_opp_set_supported_hw (dev, version,VERSION_ELEMENTS ); -if (IS_ERR (opp_table)) { -dev_err (dev,"Failed to set supported hardware\n" ); - ret =PTR_ERR (opp_table); - goto err_put_prop_name; + opp_token =dev_pm_opp_set_config (dev, &config); +if (opp_token <0 ) { +dev_err (dev,"Failed to set OPP config\n" ); +return opp_token; } dev_dbg(dev, "pcode: %d major: %d minor: %d substrate: %d\n",
@@ -233,10 +230,6 @@ static int sti_cpufreq_set_opp_info(void) version[0], version[1], version[2]);return 0 ; - -err_put_prop_name: -dev_pm_opp_put_prop_name (opp_table); -return ret; }static int sti_cpufreq_fetch_syscon_registers (void )
Signature · 1 line
2.31.1.272.g89b43f80a514
Viresh Kumar
maintainerPATCH v2 7/30 cpufreq: sun50i: Migrate to dev_pm_opp_set_config()
In reply to Viresh KumarThe OPP core now provides a unified API for setting all configuration types, i.e. dev_pm_opp_set_config().
Lets start using it.
--- drivers/cpufreq/sun50i-cpufreq-nvmem.c | 36 +++++++++++++------------- 1 file changed, 18 insertions(+), 18 deletions(-)
drivers/cpufreq/sun50i-cpufreq-nvmem.c +18 -18
@@ -86,26 +86,29 @@ static int sun50i_cpufreq_get_efuse(u32 *versions)static int sun50i_cpufreq_nvmem_probe (struct platform_device *pdev) { -struct opp_table **opp_tables; +int *opp_tokens;char name[MAX_NAME_LEN ];unsigned int cpu;u32 speed =0 ;int ret; - opp_tables =kcalloc (num_possible_cpus (),sizeof (*opp_tables), + opp_tokens =kcalloc (num_possible_cpus (),sizeof (*opp_tokens),GFP_KERNEL ); -if (!opp_tables) +if (!opp_tokens)return -ENOMEM ; ret =sun50i_cpufreq_get_efuse (&speed);if (ret) { -kfree (opp_tables); +kfree (opp_tokens);return ret; }snprintf (name,MAX_NAME_LEN ,"speed%d" , speed);for_each_possible_cpu (cpu) { +struct dev_pm_opp_config config = { + .prop_name = name, + };struct device *cpu_dev =get_cpu_device (cpu);if (!cpu_dev) {
@@ -113,10 +116,10 @@ static int sun50i_cpufreq_nvmem_probe(struct platform_device *pdev) goto free_opp; } - opp_tables[cpu] =dev_pm_opp_set_prop_name (cpu_dev, name); -if (IS_ERR (opp_tables[cpu])) { - ret =PTR_ERR (opp_tables[cpu]); -pr_err ("Failed to set prop name\n" ); + opp_tokens[cpu] =dev_pm_opp_set_config (cpu_dev, &config); +if (opp_tokens[cpu] <0 ) { + ret = opp_tokens[cpu]; +pr_err ("Failed to set OPP config\n" ); goto free_opp; } }
@@ -124,7 +127,7 @@ static int sun50i_cpufreq_nvmem_probe(struct platform_device *pdev) cpufreq_dt_pdev =platform_device_register_simple ("cpufreq-dt" ,-1 ,NULL ,0 );if (!IS_ERR (cpufreq_dt_pdev)) { -platform_set_drvdata (pdev, opp_tables); +platform_set_drvdata (pdev, opp_tokens);return 0 ; }
@@ -132,27 +135,24 @@ static int sun50i_cpufreq_nvmem_probe(struct platform_device *pdev)pr_err ("Failed to register platform device\n" ); free_opp: -for_each_possible_cpu (cpu) { -if (IS_ERR_OR_NULL (opp_tables[cpu])) -break ; -dev_pm_opp_put_prop_name (opp_tables[cpu]); - } -kfree (opp_tables); +for_each_possible_cpu (cpu) +dev_pm_opp_clear_config (opp_tokens[cpu]); +kfree (opp_tokens);return ret; }static int sun50i_cpufreq_nvmem_remove (struct platform_device *pdev) { -struct opp_table **opp_tables =platform_get_drvdata (pdev); +int *opp_tokens =platform_get_drvdata (pdev);unsigned int cpu;platform_device_unregister (cpufreq_dt_pdev);for_each_possible_cpu (cpu) -dev_pm_opp_put_prop_name (opp_tables[cpu]); +dev_pm_opp_clear_config (opp_tokens[cpu]); -kfree (opp_tables); +kfree (opp_tokens);return 0 ; }
Signature · 1 line
2.31.1.272.g89b43f80a514
Viresh Kumar
maintainerPATCH v2 8/30 cpufreq: tegra20: Migrate to dev_pm_opp_set_config()
In reply to Viresh KumarThe OPP core now provides a unified API for setting all configuration types, i.e. dev_pm_opp_set_config().
Lets start using it.
--- drivers/cpufreq/tegra20-cpufreq.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-)
drivers/cpufreq/tegra20-cpufreq.c +10 -8
@@ -32,9 +32,9 @@ static bool cpu0_node_has_opp_v2_prop(void)return ret; } -static void tegra20_cpufreq_put_supported_hw (void *opp_table) +static void tegra20_cpufreq_put_supported_hw (void *opp_token) { -dev_pm_opp_put_supported_hw (opp_table); +dev_pm_opp_clear_config ((unsigned long ) opp_token); }static void tegra20_cpufreq_dt_unregister (void *cpufreq_dt)
@@ -45,10 +45,13 @@ static void tegra20_cpufreq_dt_unregister(void *cpufreq_dt)static int tegra20_cpufreq_probe (struct platform_device *pdev) {struct platform_device *cpufreq_dt; -struct opp_table *opp_table;struct device *cpu_dev;u32 versions[2 ];int err; +struct dev_pm_opp_config config = { + .supported_hw = versions, + .supported_hw_count =ARRAY_SIZE (versions), + };if (!cpu0_node_has_opp_v2_prop ()) {dev_err (&pdev->dev,"operating points not found\n" );
@@ -71,16 +74,15 @@ static int tegra20_cpufreq_probe(struct platform_device *pdev)if (WARN_ON (!cpu_dev))return -ENODEV ; - opp_table =dev_pm_opp_set_supported_hw (cpu_dev, versions,2 ); - err =PTR_ERR_OR_ZERO (opp_table); -if (err) { -dev_err (&pdev->dev,"failed to set supported hw: %d\n" , err); + err =dev_pm_opp_set_config (cpu_dev, &config); +if (err <0 ) { +dev_err (&pdev->dev,"failed to set OPP config: %d\n" , err);return err; } err =devm_add_action_or_reset (&pdev->dev, tegra20_cpufreq_put_supported_hw, - opp_table); + (void *)((unsigned long ) err));if (err)return err;
Signature · 1 line
2.31.1.272.g89b43f80a514
Viresh Kumar
maintainerPATCH v2 9/30 cpufreq: ti: Migrate to dev_pm_opp_set_config()
In reply to Viresh KumarThe OPP core now provides a unified API for setting all configuration types, i.e. dev_pm_opp_set_config().
Lets start using it.
--- drivers/cpufreq/ti-cpufreq.c | 38 ++++++++++++++---------------------- 1 file changed, 15 insertions(+), 23 deletions(-)
drivers/cpufreq/ti-cpufreq.c +15 -23
@@ -60,7 +60,6 @@ struct ti_cpufreq_data {struct device_node *opp_node;struct regmap *syscon;const struct ti_cpufreq_soc_data *soc_data; -struct opp_table *opp_table; }; static unsigned long amx3_efuse_xlate(struct ti_cpufreq_data *opp_data,
@@ -324,10 +323,13 @@ static int ti_cpufreq_probe(struct platform_device *pdev) {u32 version[VERSION_COUNT ];const struct of_device_id *match; -struct opp_table *ti_opp_table;struct ti_cpufreq_data *opp_data;const char *const default_reg_names[] = {"vdd" ,"vbb" };int ret; +struct dev_pm_opp_config config = { + .supported_hw = version, + .supported_hw_count =ARRAY_SIZE (version), + }; match =dev_get_platdata (&pdev->dev);if (!match)
@@ -370,33 +372,23 @@ static int ti_cpufreq_probe(struct platform_device *pdev)if (ret) goto fail_put_node; - ti_opp_table =dev_pm_opp_set_supported_hw (opp_data->cpu_dev, - version,VERSION_COUNT ); -if (IS_ERR (ti_opp_table)) { -dev_err (opp_data->cpu_dev, -"Failed to set supported hardware\n" ); - ret =PTR_ERR (ti_opp_table); - goto fail_put_node; - } - - opp_data->opp_table = ti_opp_table; -if (opp_data->soc_data->multi_regulator) { -const char *const *reg_names = default_reg_names; + config.regulator_count =ARRAY_SIZE (default_reg_names);if (opp_data->soc_data->reg_names) - reg_names = opp_data->soc_data->reg_names; - ti_opp_table =dev_pm_opp_set_regulators (opp_data->cpu_dev, - reg_names, -ARRAY_SIZE (default_reg_names)); -if (IS_ERR (ti_opp_table)) { -dev_pm_opp_put_supported_hw (opp_data->opp_table); - ret =PTR_ERR (ti_opp_table); - goto fail_put_node; - } + config.regulator_names = opp_data->soc_data->reg_names; +else + config.regulator_names = default_reg_names; + } + + ret =dev_pm_opp_set_config (opp_data->cpu_dev, &config); +if (ret <0 ) { +dev_err (opp_data->cpu_dev,"Failed to set OPP config\n" ); + goto fail_put_node; }of_node_put (opp_data->opp_node); + register_cpufreq_dt:platform_device_register_simple ("cpufreq-dt" ,-1 ,NULL ,0 );
Signature · 1 line
2.31.1.272.g89b43f80a514
Viresh Kumar
maintainerPATCH v2 10/30 devfreq: exynos: Migrate to dev_pm_opp_set_config()
In reply to Viresh KumarThe OPP core now provides a unified API for setting all configuration types, i.e. dev_pm_opp_set_config().
Lets start using it.
--- drivers/devfreq/exynos-bus.c | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-)
drivers/devfreq/exynos-bus.c +12 -13
@@ -33,7 +33,7 @@ struct exynos_bus {unsigned long curr_freq; -struct opp_table *opp_table; +int opp_token;struct clk *clk;unsigned int ratio; };
@@ -161,8 +161,7 @@ static void exynos_bus_exit(struct device *dev)dev_pm_opp_of_remove_table (dev);clk_disable_unprepare (bus->clk); -dev_pm_opp_put_regulators (bus->opp_table); - bus->opp_table =NULL ; +dev_pm_opp_clear_config (bus->opp_token); }static void exynos_bus_passive_exit (struct device *dev)
@@ -179,18 +178,20 @@ static int exynos_bus_parent_parse_of(struct device_node *np, struct exynos_bus *bus) {struct device *dev = bus->dev; -struct opp_table *opp_table;const char *vdd ="vdd" ;int i, ret, count, size; +struct dev_pm_opp_config config = { + .regulator_names = &vdd, + .regulator_count =1 , + }; - opp_table =dev_pm_opp_set_regulators (dev, &vdd,1 ); -if (IS_ERR (opp_table)) { - ret =PTR_ERR (opp_table); -dev_err (dev,"failed to set regulators %d\n" , ret); + ret =dev_pm_opp_set_config (dev, &config); +if (ret <0 ) { +dev_err (dev,"failed to set OPP config %d\n" , ret);return ret; } - bus->opp_table = opp_table; + bus->opp_token = ret;/* * Get the devfreq-event devices to get the current utilization of
@@ -236,8 +237,7 @@ static int exynos_bus_parent_parse_of(struct device_node *np,return 0 ; err_regulator: -dev_pm_opp_put_regulators (bus->opp_table); - bus->opp_table =NULL ; +dev_pm_opp_clear_config (bus->opp_token);return ret; }
@@ -459,8 +459,7 @@ static int exynos_bus_probe(struct platform_device *pdev)dev_pm_opp_of_remove_table (dev);clk_disable_unprepare (bus->clk); err_reg: -dev_pm_opp_put_regulators (bus->opp_table); - bus->opp_table =NULL ; +dev_pm_opp_clear_config (bus->opp_token);return ret; }
Signature · 1 line
2.31.1.272.g89b43f80a514
Viresh Kumar
maintainerPATCH v2 11/30 devfreq: sun8i: Migrate to dev_pm_opp_set_config()
In reply to Viresh KumarThe OPP core now provides a unified API for setting all configuration types, i.e. dev_pm_opp_set_config().
Lets start using it.
--- drivers/devfreq/sun8i-a33-mbus.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/devfreq/sun8i-a33-mbus.c +6 -2
@@ -337,6 +337,10 @@ static int sun8i_a33_mbus_probe(struct platform_device *pdev)unsigned int max_state;const char *err;int i, ret; +struct dev_pm_opp_config config = { + .clk_names = (const char *[]){"dram" }, + .clk_count =1 , + }; variant =device_get_match_data (dev);if (!variant)
@@ -404,9 +408,9 @@ static int sun8i_a33_mbus_probe(struct platform_device *pdev) priv->profile.freq_table = priv->freq_table; priv->profile.max_state = max_state; - ret =devm_pm_opp_set_clkname (dev,"dram" ); + ret =devm_pm_opp_set_config (dev, &config);if (ret) { - err ="failed to add OPP table\n" ; + err ="failed to set OPP config\n" ; goto err_unlock_mbus; }
Signature · 1 line
2.31.1.272.g89b43f80a514
Viresh Kumar
maintainerPATCH v2 12/30 devfreq: tegra30: Migrate to dev_pm_opp_set_config()
In reply to Viresh KumarThe OPP core now provides a unified API for setting all configuration types, i.e. dev_pm_opp_set_config().
Lets start using it.
--- drivers/devfreq/tegra30-devfreq.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/devfreq/tegra30-devfreq.c +6 -2
@@ -830,6 +830,10 @@ static int tegra_devfreq_probe(struct platform_device *pdev)unsigned int i;long rate;int err; +struct dev_pm_opp_config config = { + .supported_hw = &hw_version, + .supported_hw_count =1 , + }; tegra =devm_kzalloc (&pdev->dev,sizeof (*tegra),GFP_KERNEL );if (!tegra)
@@ -874,9 +878,9 @@ static int tegra_devfreq_probe(struct platform_device *pdev)return err; } - err =devm_pm_opp_set_supported_hw (&pdev->dev, &hw_version,1 ); + err =devm_pm_opp_set_config (&pdev->dev, &config);if (err) { -dev_err (&pdev->dev,"Failed to set supported HW: %d\n" , err); +dev_err (&pdev->dev,"Failed to set OPP config: %d\n" , err);return err; }
Signature · 1 line
2.31.1.272.g89b43f80a514
Viresh Kumar
maintainerPATCH v2 13/30 drm/lima: Migrate to dev_pm_opp_set_config()
In reply to Viresh KumarThe OPP core now provides a unified API for setting all configuration types, i.e. dev_pm_opp_set_config().
Lets start using it.
--- drivers/gpu/drm/lima/lima_devfreq.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
drivers/gpu/drm/lima/lima_devfreq.c +7 -5
@@ -111,6 +111,12 @@ int lima_devfreq_init(struct lima_device *ldev)struct dev_pm_opp *opp;unsigned long cur_freq;int ret; +struct dev_pm_opp_config config = { + .regulator_names = (const char *[]){"mali" }, + .regulator_count =1 , + .clk_names = (const char *[]){"core" }, + .clk_count =1 , + };if (!device_property_present (dev,"operating-points-v2" ))/* Optional, continue without devfreq */
@@ -118,11 +124,7 @@ int lima_devfreq_init(struct lima_device *ldev)spin_lock_init (&ldevfreq->lock); - ret =devm_pm_opp_set_clkname (dev,"core" ); -if (ret) -return ret; - - ret =devm_pm_opp_set_regulators (dev, (const char *[]){"mali" },1 ); + ret =devm_pm_opp_set_config (dev, &config);if (ret) {/* Continue if the optional regulator is missing */ if (ret != -ENODEV )
Signature · 1 line
2.31.1.272.g89b43f80a514
Viresh Kumar
maintainerPATCH v2 14/30 drm/msm: Migrate to dev_pm_opp_set_config()
In reply to Viresh KumarThe OPP core now provides a unified API for setting all configuration types, i.e. dev_pm_opp_set_config().
Lets start using it.
--- drivers/gpu/drm/msm/adreno/a5xx_gpu.c | 8 ++++++-- drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 10 +++++----- drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 6 +++++- drivers/gpu/drm/msm/dp/dp_ctrl.c | 6 +++++- drivers/gpu/drm/msm/dsi/dsi_host.c | 6 +++++- 5 files changed, 26 insertions(+), 10 deletions(-)
drivers/gpu/drm/msm/adreno/a5xx_gpu.c +6 -2
@@ -1723,10 +1723,14 @@ static void check_speed_bin(struct device *dev) {struct nvmem_cell *cell;u32 val; +struct dev_pm_opp_config config = { + .supported_hw = &val, + .supported_hw_count =1 , + };/* * If the OPP table specifies a opp-supported-hw property then we have -* to set something with dev_pm_opp_set_supported_hw() or the table +* to set something with dev_pm_opp_set_config() or the table * doesn't get populated so pick an arbitrary value that should * ensure the default frequencies are selected but not conflict with any * actual bins
@@ -1748,7 +1752,7 @@ static void check_speed_bin(struct device *dev)nvmem_cell_put (cell); } -devm_pm_opp_set_supported_hw (dev, &val,1 ); +devm_pm_opp_set_config (dev, &config); }struct msm_gpu *a5xx_gpu_init (struct drm_device *dev)
drivers/gpu/drm/msm/adreno/a6xx_gpu.c +5 -5
@@ -1800,6 +1800,10 @@ static int a6xx_set_supported_hw(struct device *dev, struct adreno_rev rev)u32 supp_hw =UINT_MAX ;u32 speedbin;int ret; +struct dev_pm_opp_config config = { + .supported_hw = &supp_hw, + .supported_hw_count =1 , + }; ret =adreno_read_speedbin (dev, &speedbin);/*
@@ -1818,11 +1822,7 @@ static int a6xx_set_supported_hw(struct device *dev, struct adreno_rev rev) supp_hw =fuse_to_supp_hw (dev, rev, speedbin); done: - ret =devm_pm_opp_set_supported_hw (dev, &supp_hw,1 ); -if (ret) -return ret; - -return 0 ; +return devm_pm_opp_set_config (dev, &config); }static const struct adreno_gpu_funcs funcs = {
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +5 -1
@@ -1215,12 +1215,16 @@ static int dpu_kms_init(struct drm_device *ddev)struct dev_pm_opp *opp;int ret =0 ;unsigned long max_freq =ULONG_MAX ; +struct dev_pm_opp_config config = { + .clk_names = (const char *[]){"core" }, + .clk_count =1 , + }; dpu_kms =devm_kzalloc (&pdev->dev,sizeof (*dpu_kms),GFP_KERNEL );if (!dpu_kms)return -ENOMEM ; - ret =devm_pm_opp_set_clkname (dev,"core" ); + ret =devm_pm_opp_set_config (dev, &config);if (ret)return ret;/* OPP table is optional */
drivers/gpu/drm/msm/dp/dp_ctrl.c +5 -1
@@ -2022,6 +2022,10 @@ struct dp_ctrl *dp_ctrl_get(struct device *dev, struct dp_link *link, {struct dp_ctrl_private *ctrl;int ret; +struct dev_pm_opp_config config = { + .clk_names = (const char *[]){"ctrl_link" }, + .clk_count =1 , + };if (!dev || !panel || !aux || !link || !catalog) {
@@ -2035,7 +2039,7 @@ struct dp_ctrl *dp_ctrl_get(struct device *dev, struct dp_link *link,return ERR_PTR (-ENOMEM ); } - ret =devm_pm_opp_set_clkname (dev,"ctrl_link" ); + ret =devm_pm_opp_set_config (dev, &config);if (ret) {dev_err (dev,"invalid DP OPP table in device tree\n" );/* caller do PTR_ERR(opp_table) */
drivers/gpu/drm/msm/dsi/dsi_host.c +5 -1
@@ -2034,6 +2034,10 @@ int msm_dsi_host_init(struct msm_dsi *msm_dsi)struct msm_dsi_host *msm_host =NULL ;struct platform_device *pdev = msm_dsi->pdev;int ret; +struct dev_pm_opp_config config = { + .clk_names = (const char *[]){"byte" }, + .clk_count =1 , + }; msm_host =devm_kzalloc (&pdev->dev,sizeof (*msm_host),GFP_KERNEL );if (!msm_host) {
@@ -2095,7 +2099,7 @@ int msm_dsi_host_init(struct msm_dsi *msm_dsi) goto fail; } - ret =devm_pm_opp_set_clkname (&pdev->dev,"byte" ); + ret =devm_pm_opp_set_config (&pdev->dev, &config);if (ret)return ret;/* OPP table is optional */
Signature · 1 line
2.31.1.272.g89b43f80a514
Viresh Kumar
maintainerPATCH v2 15/30 drm/panfrost: Migrate to dev_pm_opp_set_config()
In reply to Viresh KumarThe OPP core now provides a unified API for setting all configuration types, i.e. dev_pm_opp_set_config().
Lets start using it.
--- drivers/gpu/drm/panfrost/panfrost_devfreq.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/gpu/drm/panfrost/panfrost_devfreq.c +6 -3
@@ -91,6 +91,10 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev)struct devfreq *devfreq;struct thermal_cooling_device *cooling;struct panfrost_devfreq *pfdevfreq = &pfdev->pfdevfreq; +struct dev_pm_opp_config config = { + .regulator_names = pfdev->comp->supply_names, + .regulator_count = pfdev->comp->num_supplies, + };if (pfdev->comp->num_supplies >1 ) {/*
@@ -101,13 +105,12 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev)return 0 ; } - ret =devm_pm_opp_set_regulators (dev, pfdev->comp->supply_names, - pfdev->comp->num_supplies); + ret =devm_pm_opp_set_config (dev, &config);if (ret) {/* Continue if the optional regulator is missing */ if (ret != -ENODEV ) {if (ret != -EPROBE_DEFER ) -DRM_DEV_ERROR (dev,"Couldn't set OPP regulators\n" ); +DRM_DEV_ERROR (dev,"Couldn't set OPP config\n" );return ret; } }
Signature · 1 line
2.31.1.272.g89b43f80a514
Viresh Kumar
maintainerPATCH v2 16/30 drm/tegra: Migrate to dev_pm_opp_set_config()
In reply to Viresh KumarThe OPP core now provides a unified API for setting all configuration types, i.e. dev_pm_opp_set_config().
Lets start using it.
--- drivers/gpu/drm/tegra/gr3d.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/gpu/drm/tegra/gr3d.c +5 -1
@@ -389,6 +389,10 @@ static int gr3d_init_power(struct device *dev, struct gr3d *gr3d)struct device_link *link;unsigned int i;int err; +struct dev_pm_opp_config config = { + .genpd_names = opp_genpd_names, + .virt_devs = &opp_virt_devs, + }; err =of_count_phandle_with_args (dev->of_node,"power-domains" ,"#power-domain-cells" );
@@ -421,7 +425,7 @@ static int gr3d_init_power(struct device *dev, struct gr3d *gr3d)if (dev->pm_domain)return 0 ; - err =devm_pm_opp_attach_genpd (dev, opp_genpd_names, &opp_virt_devs); + err =devm_pm_opp_set_config (dev, &config);if (err)return err;
Signature · 1 line
2.31.1.272.g89b43f80a514
Viresh Kumar
maintainerPATCH v2 17/30 media: venus: Migrate to dev_pm_opp_set_config()
In reply to Viresh KumarThe OPP core now provides a unified API for setting all configuration types, i.e. dev_pm_opp_set_config().
Lets start using it.
--- drivers/media/platform/qcom/venus/pm_helpers.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-)
drivers/media/platform/qcom/venus/pm_helpers.c +15 -3
@@ -294,12 +294,16 @@ static int load_scale_v1(struct venus_inst *inst)static int core_get_v1 (struct venus_core *core) {int ret; +struct dev_pm_opp_config config = { + .clk_names = (const char *[]){"core" }, + .clk_count =1 , + }; ret =core_clks_get (core);if (ret)return ret; - ret =devm_pm_opp_set_clkname (core->dev,"core" ); + ret =devm_pm_opp_set_config (core->dev, &config);if (ret)return ret;
@@ -862,6 +866,10 @@ static int vcodec_domains_get(struct venus_core *core)const struct venus_resources *res = core->res;struct device *pd;unsigned int i; +struct dev_pm_opp_config config = { + .genpd_names = res->opp_pmdomain, + .virt_devs = &opp_virt_dev, + };if (!res->vcodec_pmdomains_num) goto skip_pmdomains;
@@ -879,7 +887,7 @@ static int vcodec_domains_get(struct venus_core *core)return 0 ;/* Attach the power domain for setting performance state */ - ret =devm_pm_opp_attach_genpd (dev, res->opp_pmdomain, &opp_virt_dev); + ret =devm_pm_opp_set_config (dev, &config);if (ret) goto opp_attach_err;
@@ -978,6 +986,10 @@ static int core_get_v4(struct venus_core *core)struct device *dev = core->dev;const struct venus_resources *res = core->res;int ret; +struct dev_pm_opp_config config = { + .clk_names = (const char *[]){"core" }, + .clk_count =1 , + }; ret =core_clks_get (core);if (ret)
@@ -1003,7 +1015,7 @@ static int core_get_v4(struct venus_core *core)if (legacy_binding)return 0 ; - ret =devm_pm_opp_set_clkname (dev,"core" ); + ret =devm_pm_opp_set_config (dev, &config);if (ret)return ret;
Signature · 1 line
2.31.1.272.g89b43f80a514
Viresh Kumar
maintainerPATCH v2 18/30 memory: tegra: Migrate to dev_pm_opp_set_config()
In reply to Viresh KumarThe OPP core now provides a unified API for setting all configuration types, i.e. dev_pm_opp_set_config().
Lets start using it.
--- drivers/memory/tegra/tegra124-emc.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-)
drivers/memory/tegra/tegra124-emc.c +10 -7
@@ -1395,15 +1395,18 @@ static int tegra_emc_interconnect_init(struct tegra_emc *emc)static int tegra_emc_opp_table_init (struct tegra_emc *emc) {u32 hw_version =BIT (tegra_sku_info.soc_speedo_id); -struct opp_table *hw_opp_table; -int err; +int opp_token, err; +struct dev_pm_opp_config config = { + .supported_hw = &hw_version, + .supported_hw_count =1 , + }; - hw_opp_table =dev_pm_opp_set_supported_hw (emc->dev, &hw_version,1 ); - err =PTR_ERR_OR_ZERO (hw_opp_table); -if (err) { -dev_err (emc->dev,"failed to set OPP supported HW: %d\n" , err); + err =dev_pm_opp_set_config (emc->dev, &config); +if (err <0 ) { +dev_err (emc->dev,"failed to set OPP config: %d\n" , err);return err; } + opp_token = err; err =dev_pm_opp_of_add_table (emc->dev);if (err) {
@@ -1430,7 +1433,7 @@ static int tegra_emc_opp_table_init(struct tegra_emc *emc) remove_table:dev_pm_opp_of_remove_table (emc->dev); put_hw_table: -dev_pm_opp_put_supported_hw (hw_opp_table); +dev_pm_opp_clear_config (opp_token);return err; }
Signature · 1 line
2.31.1.272.g89b43f80a514
Viresh Kumar
maintainerPATCH v2 19/30 mmc: sdhci-msm: Migrate to dev_pm_opp_set_config()
In reply to Viresh KumarThe OPP core now provides a unified API for setting all configuration types, i.e. dev_pm_opp_set_config().
Lets start using it.
---
Ulf, I have kept your Ack as the diff is really small, clk_names is an array now.
drivers/mmc/host/sdhci-msm.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/mmc/host/sdhci-msm.c +5 -1
@@ -2559,6 +2559,10 @@ static int sdhci_msm_probe(struct platform_device *pdev)const struct sdhci_msm_offset *msm_offset;const struct sdhci_msm_variant_info *var_info;struct device_node *node = pdev->dev.of_node; +struct dev_pm_opp_config opp_config = { + .clk_names = (const char *[]){"core" }, + .clk_count =1 , + }; host =sdhci_pltfm_init (pdev, &sdhci_msm_pdata,sizeof (*msm_host));if (IS_ERR (host))
@@ -2631,7 +2635,7 @@ static int sdhci_msm_probe(struct platform_device *pdev)if (ret) goto bus_clk_disable; - ret =devm_pm_opp_set_clkname (&pdev->dev,"core" ); + ret =devm_pm_opp_set_config (&pdev->dev, &opp_config);if (ret) goto bus_clk_disable;
Signature · 1 line
2.31.1.272.g89b43f80a514
Viresh Kumar
maintainerPATCH v2 20/30 OPP: ti: Migrate to dev_pm_opp_set_config()
In reply to Viresh KumarThe OPP core now provides a unified API for setting all configuration types, i.e. dev_pm_opp_set_config().
Lets start using it.
--- drivers/opp/ti-opp-supply.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/opp/ti-opp-supply.c +5 -3
@@ -382,6 +382,9 @@ static int ti_opp_supply_probe(struct platform_device *pdev)const struct of_device_id *match;const struct ti_opp_supply_of_data *of_data;int ret =0 ; +struct dev_pm_opp_config config = { + .set_opp = ti_opp_supply_set_opp, + }; match =of_match_device (ti_opp_supply_of_match, dev);if (!match) {
@@ -405,9 +408,8 @@ static int ti_opp_supply_probe(struct platform_device *pdev)return ret; } - ret =PTR_ERR_OR_ZERO (dev_pm_opp_register_set_opp_helper (cpu_dev, - ti_opp_supply_set_opp)); -if (ret) + ret =dev_pm_opp_set_config (cpu_dev, &config); +if (ret <0 )_free_optimized_voltages (dev, &opp_data);return ret;
Signature · 1 line
2.31.1.272.g89b43f80a514
Viresh Kumar
maintainerPATCH v2 21/30 soc/tegra: Add comment over devm_pm_opp_set_clkname()
In reply to Viresh KumarExplain why special handling was required here, it isn't obvious at all.
--- drivers/soc/tegra/common.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/soc/tegra/common.c +7 -0
@@ -108,6 +108,13 @@ int devm_tegra_core_dev_init_opp_table(struct device *dev,u32 hw_version;int err; +/* +* For some devices we don't have any OPP table in the DT, and in order +* to use the same code path for all the devices, we create a dummy OPP +* table for them via this call. The dummy OPP table is only capable of +* doing clk_set_rate() on invocation of dev_pm_opp_set_rate() and +* doesn't provide any other functionality. +*/ err =devm_pm_opp_set_clkname (dev,NULL );if (err) {dev_err (dev,"failed to set OPP clk: %d\n" , err);
Signature · 1 line
2.31.1.272.g89b43f80a514
Viresh Kumar
maintainerPATCH v2 22/30 soc/tegra: Migrate to dev_pm_opp_set_config()
In reply to Viresh KumarThe OPP core now provides a unified API for setting all configuration types, i.e. dev_pm_opp_set_config().
Lets start using it.
--- drivers/soc/tegra/common.c | 52 +++++++++++++++++++++----------------- drivers/soc/tegra/pmc.c | 8 ++++-- 2 files changed, 35 insertions(+), 25 deletions(-)
drivers/soc/tegra/common.c +29 -23
@@ -107,36 +107,42 @@ int devm_tegra_core_dev_init_opp_table(struct device *dev, {u32 hw_version;int err; - -/* -* For some devices we don't have any OPP table in the DT, and in order -* to use the same code path for all the devices, we create a dummy OPP -* table for them via this call. The dummy OPP table is only capable of -* doing clk_set_rate() on invocation of dev_pm_opp_set_rate() and -* doesn't provide any other functionality. -*/ - err =devm_pm_opp_set_clkname (dev,NULL ); -if (err) { -dev_err (dev,"failed to set OPP clk: %d\n" , err); -return err; - } - -/* Tegra114+ doesn't support OPP yet */ -if (!of_machine_is_compatible ("nvidia,tegra20" ) && - !of_machine_is_compatible ("nvidia,tegra30" )) -return -ENODEV ; - -if (of_machine_is_compatible ("nvidia,tegra20" )) +struct dev_pm_opp_config config = { +/* +* For some devices we don't have any OPP table in the DT, and +* in order to use the same code path for all the devices, we +* create a dummy OPP table for them via this. The dummy OPP +* table is only capable of doing clk_set_rate() on invocation +* of dev_pm_opp_set_rate() and doesn't provide any other +* functionality. +*/ + .clk_names = (const char *[]){NULL }, + .clk_count =1 , + }; + +if (of_machine_is_compatible ("nvidia,tegra20" )) { hw_version =BIT (tegra_sku_info.soc_process_id); -else + config.supported_hw = &hw_version; + config.supported_hw_count =1 ; + }else if (of_machine_is_compatible ("nvidia,tegra30" )) { hw_version =BIT (tegra_sku_info.soc_speedo_id); + config.supported_hw = &hw_version; + config.supported_hw_count =1 ; + } - err =devm_pm_opp_set_supported_hw (dev, &hw_version,1 ); + err =devm_pm_opp_set_config (dev, &config);if (err) { -dev_err (dev,"failed to set OPP supported HW: %d\n" , err); +dev_err (dev,"failed to set OPP config: %d\n" , err);return err; } +/* +* Tegra114+ doesn't support OPP yet, return early for non tegra20/30 +* case. +*/ +if (!config.supported_hw) +return -ENODEV ; +/* * Older device-trees have an empty OPP table, we will get * -ENODEV from devm_pm_opp_of_add_table() in this case.
drivers/soc/tegra/pmc.c +6 -2
@@ -1386,6 +1386,10 @@ static int tegra_pmc_core_pd_add(struct tegra_pmc *pmc, struct device_node *np)struct generic_pm_domain *genpd;const char *rname ="core" ;int err; +struct dev_pm_opp_config config = { + .regulator_names = &rname, + .regulator_count =1 , + }; genpd =devm_kzalloc (pmc->dev,sizeof (*genpd),GFP_KERNEL );if (!genpd)
@@ -1395,10 +1399,10 @@ static int tegra_pmc_core_pd_add(struct tegra_pmc *pmc, struct device_node *np) genpd->set_performance_state = tegra_pmc_core_pd_set_performance_state; genpd->opp_to_performance_state = tegra_pmc_core_pd_opp_to_performance_state; - err =devm_pm_opp_set_regulators (pmc->dev, &rname,1 ); + err =devm_pm_opp_set_config (pmc->dev, &config);if (err)return dev_err_probe (pmc->dev, err, -"failed to set core OPP regulator\n" ); +"failed to set OPP config\n" ); err =pm_genpd_init (genpd,NULL , false);if (err) {
Signature · 1 line
2.31.1.272.g89b43f80a514
Viresh Kumar
maintainerPATCH v2 23/30 spi: qcom: Migrate to dev_pm_opp_set_config()
In reply to Viresh KumarThe OPP core now provides a unified API for setting all configuration types, i.e. dev_pm_opp_set_config().
Lets start using it.
---
Mark, I have kept your Ack as the diff is really small, clk_names is an array now.
drivers/spi/spi-geni-qcom.c | 6 +++++- drivers/spi/spi-qcom-qspi.c | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-)
drivers/spi/spi-geni-qcom.c +5 -1
@@ -892,6 +892,10 @@ static int spi_geni_probe(struct platform_device *pdev)void __iomem *base;struct clk *clk;struct device *dev = &pdev->dev; +struct dev_pm_opp_config config = { + .clk_names = (const char *[]){"se" }, + .clk_count =1 , + }; irq =platform_get_irq (pdev,0 );if (irq <0 )
@@ -922,7 +926,7 @@ static int spi_geni_probe(struct platform_device *pdev) mas->se.base = base; mas->se.clk = clk; - ret =devm_pm_opp_set_clkname (&pdev->dev,"se" ); + ret =devm_pm_opp_set_config (&pdev->dev, &config);if (ret)return ret;/* OPP table is optional */
drivers/spi/spi-qcom-qspi.c +5 -1
@@ -458,6 +458,10 @@ static int qcom_qspi_probe(struct platform_device *pdev)struct device *dev;struct spi_master *master;struct qcom_qspi *ctrl; +struct dev_pm_opp_config config = { + .clk_names = (const char *[]){"core" }, + .clk_count =1 , + }; dev = &pdev->dev;
@@ -529,7 +533,7 @@ static int qcom_qspi_probe(struct platform_device *pdev) master->handle_err = qcom_qspi_handle_err; master->auto_runtime_pm = true; - ret =devm_pm_opp_set_clkname (&pdev->dev,"core" ); + ret =devm_pm_opp_set_config (&pdev->dev, &config);if (ret)return ret;/* OPP table is optional */
Signature · 1 line
2.31.1.272.g89b43f80a514
Viresh Kumar
maintainerPATCH v2 24/30 serial: qcom: Migrate to dev_pm_opp_set_config()
In reply to Viresh KumarThe OPP core now provides a unified API for setting all configuration types, i.e. dev_pm_opp_set_config().
Lets start using it.
--- drivers/tty/serial/qcom_geni_serial.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/tty/serial/qcom_geni_serial.c +5 -1
@@ -1347,6 +1347,10 @@ static int qcom_geni_serial_probe(struct platform_device *pdev)int irq;bool console = false;struct uart_driver *drv; +struct dev_pm_opp_config config = { + .clk_names = (const char *[]){"se" }, + .clk_count =1 , + };if (of_device_is_compatible (pdev->dev.of_node,"qcom,geni-debug-uart" )) console = true;
@@ -1430,7 +1434,7 @@ static int qcom_geni_serial_probe(struct platform_device *pdev)if (of_property_read_bool (pdev->dev.of_node,"cts-rts-swap" )) port->cts_rts_swap = true; - ret =devm_pm_opp_set_clkname (&pdev->dev,"se" ); + ret =devm_pm_opp_set_config (&pdev->dev, &config);if (ret)return ret;/* OPP table is optional */
Signature · 1 line
2.31.1.272.g89b43f80a514
Greg Kroah-Hartman
maintainerRe: [PATCH V2 24/30] serial: qcom: Migrate to dev_pm_opp_set_config()
Quoted 26 lines · Viresh Kumar
The OPP core now provides a unified API for setting all configuration types, i.e.
dev_pm_opp_set_config().Lets start using it.
Signed-off-by Viresh Kumar <[email protected]>--- drivers/tty/serial/qcom_geni_serial.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)drivers/tty/serial/qcom_geni_serial.c +4
-0@@ -1347,6 +1347,10 @@ static int qcom_geni_serial_probe(struct platform_device *pdev)int irq;bool console = false;struct uart_driver *drv; +struct dev_pm_opp_config config = { + .clk_names = (const char *[]){"se" }, + .clk_count =1 , + };if (of_device_is_compatible (pdev->dev.of_node,"qcom,geni-debug-uart" )) console = true;
drivers/tty/serial/qcom_geni_serial.c static int qcom_geni_serial_probe(struct platform_device *pdev) · line 1437
Quoted 5 lines
drivers/tty/serial/qcom_geni_serial.c +1
-1@@ -1430,7 +1434,7 @@ static int qcom_geni_serial_probe(struct platform_device *pdev)if (of_property_read_bool (pdev->dev.of_node,"cts-rts-swap" )) port->cts_rts_swap = true; - ret =devm_pm_opp_set_clkname (&pdev->dev,"se" ); + ret =devm_pm_opp_set_config (&pdev->dev, &config);
This feels like a step back. This is much harder now, what's wrong with devm_pm_opp_set_clkname() as is?
thanks,
greg k-h
Viresh Kumar
maintainerRe: [PATCH V2 24/30] serial: qcom: Migrate to dev_pm_opp_set_config()
Quoted 7 lines · Greg Kroah-Hartman
Quoted 6 lines · Viresh Kumar
drivers/tty/serial/qcom_geni_serial.c +4
-0+struct dev_pm_opp_config config = { + .clk_names = (const char *[]){"se" }, + .clk_count =1 , + };
Quoted 5 lines
drivers/tty/serial/qcom_geni_serial.c static int qcom_geni_serial_probe(struct platform_device *pdev) · line 1437
Quoted 2 lines
drivers/tty/serial/qcom_geni_serial.c +1
-1- ret =devm_pm_opp_set_clkname (&pdev->dev,"se" ); + ret =devm_pm_opp_set_config (&pdev->dev, &config);This feels like a step back. This is much harder now, what's wrong with
devm_pm_opp_set_clkname()as is?
Hi Greg,
There are a number of configurations one can do for a device's OPP table currently:
- clk, single or multiple (new)
- helper to configure multiple clocks (for multiple clocks)
- supplies or regulators
- helper to configure supplies (for multiple supplies)
- OPP supported-hw property
- OPP Property-name
- Genpd specific one
- etc
One problem was that it was a mess within the OPP core with a separate interface for each of these interfaces, almost duplicate code, etc.
But then it was a bigger mess for the user drivers that need to manage a few of these. They were required to call multiple APIs, with all the interfaces returning tokens, which the callers need to save and supply back to free the resources later. More code, hard to manage, easy to abuse and add bugs to.
The new interface makes it easier and clean for everyone and allows easy upgrades of interfaces in future. Adding a new interface, like support for multiple clocks for a device that I just did, is much easier now.
I really believe this is a step in the right direction :)
Signature · 1 line
viresh
Greg Kroah-Hartman
maintainerRe: [PATCH V2 24/30] serial: qcom: Migrate to dev_pm_opp_set_config()
Quoted 37 lines · Viresh Kumar
Quoted 7 lines · Greg Kroah-Hartman
Quoted 6 lines · Viresh Kumar
drivers/tty/serial/qcom_geni_serial.c +4
-0+struct dev_pm_opp_config config = { + .clk_names = (const char *[]){"se" }, + .clk_count =1 , + };Quoted 5 lines
drivers/tty/serial/qcom_geni_serial.c static int qcom_geni_serial_probe(struct platform_device *pdev) · line 1437
Quoted 2 lines
drivers/tty/serial/qcom_geni_serial.c +1
-1- ret =devm_pm_opp_set_clkname (&pdev->dev,"se" ); + ret =devm_pm_opp_set_config (&pdev->dev, &config);This feels like a step back. This is much harder now, what's wrong with
devm_pm_opp_set_clkname()as is?Hi Greg,
There are a number of configurations one can do for a device's OPP table currently:
- clk, single or multiple (new)
- helper to configure multiple clocks (for multiple clocks)
- supplies or regulators
- helper to configure supplies (for multiple supplies)
- OPP supported-hw property
- OPP Property-name
- Genpd specific one
- etcOne problem was that it was a mess within the OPP core with a separate interface for each of these interfaces, almost duplicate code, etc.
But then it was a bigger mess for the user drivers that need to manage a few of these. They were required to call multiple APIs, with all the interfaces returning tokens, which the callers need to save and supply back to free the resources later. More code, hard to manage, easy to abuse and add bugs to.
Quoted 6 lines
The new interface makes it easier and clean for everyone and allows easy upgrades of interfaces in future. Adding a new interface, like support for multiple clocks for a device that I just did, is much easier now.
I really believe this is a step in the right direction :)
It's now more complex for simple drivers like this, right? Why not provide translations of the devm_pm_opp_set_clkname() to use internally devm_pm_opp_set_config() if you want to do complex things, allowing you to continue to do simple things without the overhead of a driver having to create a structure on the stack and remember how the "const char *[]" syntax looks like (seriously, that's crazy).
Make it simple for simple things, and provide the ability to do complex things only if that is required.
thanks,
greg k-h
Viresh Kumar
maintainerRe: [PATCH V2 24/30] serial: qcom: Migrate to dev_pm_opp_set_config()
Quoted 1 line · Greg Kroah-Hartman
It's now more complex for simple drivers like this, right?
They need to add a structure, yes.
Quoted 3 lines
Why not
provide translations of thedevm_pm_opp_set_clkname()to use internallydevm_pm_opp_set_config()if you want to do complex things,
That can be done, yes.
Quoted 3 lines
allowing you
to continue to do simple things without the overhead of a driver having to create a structure on the stack
I didn't think of it as complexity, and I still feel it is okay-ish.
Quoted 2 lines
and remember how the "const char *[]"
syntax looks like (seriously, that's crazy).
The syntax can be fixed, if we want, by avoiding the cast with something like this:
drivers/mmc/host/sdhci-msm.c +2 -1
@@ -2559,8 +2559,9 @@ static int sdhci_msm_probe(struct platform_device *pdev)const struct sdhci_msm_offset *msm_offset;const struct sdhci_msm_variant_info *var_info;struct device_node *node = pdev->dev.of_node; +const char *clks[] = {"core" };struct dev_pm_opp_config opp_config = { - .clk_names = (const char *[]){"core" }, + .clk_names = clks, .clk_count =1 , };
Quoted 2 lines
Make it simple for simple things, and provide the ability to do complex things only if that is required.
I still feel it isn't too bad for simple cases right now too, it is just a structure to fill out but I don't have hard feelings for keeping the old API around. I just feel it isn't too helpful to keep the old interfaces around, it will just confuse people at the best.
Anyway, I will keep them around.
Signature · 1 line
viresh
Greg Kroah-Hartman
maintainerRe: [PATCH V2 24/30] serial: qcom: Migrate to dev_pm_opp_set_config()
Quoted 28 lines · Viresh Kumar
Quoted 1 line · Greg Kroah-Hartman
It's now more complex for simple drivers like this, right?
They need to add a structure, yes.
Quoted 3 lines
Why not
provide translations of thedevm_pm_opp_set_clkname()to use internallydevm_pm_opp_set_config()if you want to do complex things,That can be done, yes.
Quoted 3 lines
allowing you
to continue to do simple things without the overhead of a driver having to create a structure on the stackI didn't think of it as complexity, and I still feel it is okay-ish.
Quoted 2 lines
and remember how the "const char *[]"
syntax looks like (seriously, that's crazy).The syntax can be fixed, if we want, by avoiding the cast with something like this:
drivers/mmc/host/sdhci-msm.c +0
-0
drivers/mmc/host/sdhci-msm.c static int sdhci_msm_probe(struct platform_device *pdev) · line 2566
Quoted 9 lines
drivers/mmc/host/sdhci-msm.c +2
-1@@ -2559,8 +2559,9 @@ static int sdhci_msm_probe(struct platform_device *pdev)const struct sdhci_msm_offset *msm_offset;const struct sdhci_msm_variant_info *var_info;struct device_node *node = pdev->dev.of_node; +const char *clks[] = {"core" };struct dev_pm_opp_config opp_config = { - .clk_names = (const char *[]){"core" }, + .clk_names = clks, .clk_count =1 , };
Still crazy, but a bit better.
Why do you need the clk_count? A null terminated list is better, as the compiler can do it for you and you do not have to keep things in sync like you are expecting people to be forced to do now.
Quoted 7 lines
Quoted 2 lines
Make it simple for simple things, and provide the ability to do complex things only if that is required.
I still feel it isn't too bad for simple cases right now too, it is just a structure to fill out but I don't have hard feelings for keeping the old API around. I just feel it isn't too helpful to keep the old interfaces around, it will just confuse people at the best.
The above is much more complex than a simple function call to make. Remember to make it very simple for driver authors, and more importantly, reviewers.
Quoted 1 line
Anyway, I will keep them around.
Thanks, and drop the count field please.
thanks,
greg k-h
Viresh Kumar
maintainerRe: [PATCH V2 24/30] serial: qcom: Migrate to dev_pm_opp_set_config()
Quoted 2 lines · Greg Kroah-Hartman
On Fri, Jul 01, 2022 at 03:31:00PM +0530, Viresh Kumar wrote:
Still crazy, but a bit better.
:)
Quoted 1 line
Why do you need the
clk_count? A null terminated list is better,
Because I am not a big fan of the null terminated lists :)
I had to chase a bug once where someone removed that NULL at the end and it was a nightmare to understand what's going on.
Quoted 3 lines
as the
compiler can do it for you and you do not have to keep things in sync like you are expecting people to be forced to do now.
I am not sure I understand what the compiler can do for us here.
The users will be required to do this here, isn't it ?
const char *clks[] = { "core", NULL };
struct dev_pm_opp_config opp_config = {
.clk_names = clks,
};Quoted 3 lines
The above is much more complex than a simple function call to make. Remember to make it very simple for driver authors, and more importantly, reviewers.
Hmm.
Quoted 1 line
Thanks, and drop the count field please.
There is one case at least [1] where we actually have to pass NULL in the clk name. This is basically to allow the same code to run on different devices, one where an OPP table is present and one where it isn't. We don't want to do clk_set_rate() for the second case but just use dev_pm_opp_set_rate() (which does a lot of stuff apart from just clk).
Signature · 3 lines
viresh [1] https://lore.kernel.org/lkml/b19a02422cae2408f953b92ae3c46a37fba688a3.1656660185.git.viresh.kumar@linaro.org/
Greg Kroah-Hartman
maintainerRe: [PATCH V2 24/30] serial: qcom: Migrate to dev_pm_opp_set_config()
Quoted 4 lines · Viresh Kumar
Quoted 2 lines · Greg Kroah-Hartman
On Fri, Jul 01, 2022 at 03:31:00PM +0530, Viresh Kumar wrote:
Still crazy, but a bit better.
Quoted 8 lines
:)
Quoted 1 line
Why do you need the
clk_count? A null terminated list is better,Because I am not a big fan of the null terminated lists :)
I had to chase a bug once where someone removed that NULL at the end and it was a nightmare to understand what's going on.
But that's the "normal" way the kernel does things. Trying to keep a count in sync with a list is a pain, and just gets harder and harder over time. Make it a null-terminated list so that the cpu makes this always work and prevents errors.
Quoted 4 lines
Quoted 3 lines
as the
compiler can do it for you and you do not have to keep things in sync like you are expecting people to be forced to do now.
Quoted 9 lines
I am not sure I understand what the compiler can do for us here.
The users will be required to do this here, isn't it ?
const char *clks[] = { "core", NULL }; struct dev_pm_opp_config opp_config = { .clk_names = clks, };
The "in sync" is the count issue. Don't force humans to count up the number of items in a list please.
Quoted 6 lines
Quoted 3 lines
The above is much more complex than a simple function call to make. Remember to make it very simple for driver authors, and more importantly, reviewers.
Hmm.
Quoted 8 lines
Quoted 1 line
Thanks, and drop the count field please.
There is one case at least [1] where we actually have to pass NULL in the clk name. This is basically to allow the same code to run on different devices, one where an OPP table is present and one where it isn't. We don't want to do
clk_set_rate()for the second case but just usedev_pm_opp_set_rate()(which does a lot of stuff apart from just clk).
That feels completely wrong, don't have NULL for a name, make a fake name or something. Don't make all users in the kernel have a horrible interface just for one piece of broken hardware out there.
Worst case, name it "".
thanks,
greg k-h
Viresh Kumar
maintainerRe: [PATCH V2 24/30] serial: qcom: Migrate to dev_pm_opp_set_config()
Quoted 5 lines · Greg Kroah-Hartman
That feels completely wrong, don't have NULL for a name, make a fake name or something. Don't make all users in the kernel have a horrible interface just for one piece of broken hardware out there.
Worst case, name it "".
This name goes into the second argument of clk_get(dev, const char *con_id);
I will see how else I should hack it :)
Signature · 1 line
viresh
Viresh Kumar
maintainerPATCH v2 25/30 OPP: Remove dev_pm_opp_set_regulators() and friends
In reply to Viresh KumarNow that everyone has migrated to dev_pm_opp_set_config(), remove the public interface for dev_pm_opp_set_regulators() and friends.
--- drivers/opp/core.c | 93 +++++++++--------------------------------- include/linux/pm_opp.h | 17 -------- 2 files changed, 19 insertions(+), 91 deletions(-)
drivers/opp/core.c +19 -74
@@ -991,8 +991,8 @@ static int _set_opp_custom(const struct opp_table *opp_table,int size;/* -* We support this only if dev_pm_opp_set_regulators() was called -* earlier. +* We support this only if dev_pm_opp_set_config() was called +* earlier to set regulators. */ if (opp_table->sod_supplies) { size =sizeof (*old_opp->supplies) * opp_table->regulator_count;
@@ -2097,7 +2097,7 @@ void dev_pm_opp_put_prop_name(struct opp_table *opp_table)EXPORT_SYMBOL_GPL (dev_pm_opp_put_prop_name);/** -* dev_pm_opp_set_regulators() - Set regulator names for the device +* _opp_set_regulators() - Set regulator names for the device * @dev: Device for which regulator name is being set. * @names: Array of pointers to the names of the regulator. * @count: Number of regulators.
@@ -2108,36 +2108,22 @@ EXPORT_SYMBOL_GPL(dev_pm_opp_put_prop_name);* * This must be called before any OPPs are initialized for the device. */ -struct opp_table *dev_pm_opp_set_regulators (struct device *dev, -const char *const names[], -unsigned int count) +static int _opp_set_regulators (struct opp_table *opp_table,struct device *dev, +const char *const names[],unsigned int count) {struct dev_pm_opp_supply *supplies; -struct opp_table *opp_table;struct regulator *reg;int ret, i; - opp_table =_add_opp_table (dev, false); -if (IS_ERR (opp_table)) -return opp_table; - -/* This should be called before OPPs are initialized */ -if (WARN_ON (!list_empty (&opp_table->opp_list))) { - ret = -EBUSY ; - goto err; - } -/* Another CPU that shares the OPP table has set the regulators ? */ if (opp_table->regulators) -return opp_table; +return 0 ; opp_table->regulators =kmalloc_array (count,sizeof (*opp_table->regulators),GFP_KERNEL ); -if (!opp_table->regulators) { - ret = -ENOMEM ; - goto err; - } +if (!opp_table->regulators) +return -ENOMEM ;for (i =0 ; i < count; i++) { reg =regulator_get_optional (dev, names[i]);
@@ -2167,7 +2153,7 @@ struct opp_table *dev_pm_opp_set_regulators(struct device *dev, }mutex_unlock (&opp_table->lock); -return opp_table; +return 0 ; free_regulators:while (i !=0 )
@@ -2176,26 +2162,20 @@ struct opp_table *dev_pm_opp_set_regulators(struct device *dev,kfree (opp_table->regulators); opp_table->regulators =NULL ; opp_table->regulator_count =-1 ; -err: -dev_pm_opp_put_opp_table (opp_table); -return ERR_PTR (ret); +return ret; } -EXPORT_SYMBOL_GPL (dev_pm_opp_set_regulators);/** -* dev_pm_opp_put_regulators() - Releases resources blocked for regulator -* @opp_table: OPP table returned from dev_pm_opp_set_regulators(). +* _opp_put_regulators() - Releases resources blocked for regulator +* @opp_table: OPP table returned from _opp_set_regulators(). */ -void dev_pm_opp_put_regulators (struct opp_table *opp_table) +static void _opp_put_regulators (struct opp_table *opp_table) {int i; -if (unlikely (!opp_table)) -return ; -if (!opp_table->regulators) - goto put_opp_table; +return ;if (opp_table->enabled) {for (i = opp_table->regulator_count -1 ; i >=0 ; i--)
@@ -2218,41 +2198,7 @@ void dev_pm_opp_put_regulators(struct opp_table *opp_table)kfree (opp_table->regulators); opp_table->regulators =NULL ; opp_table->regulator_count =-1 ; - -put_opp_table: -dev_pm_opp_put_opp_table (opp_table); -} -EXPORT_SYMBOL_GPL (dev_pm_opp_put_regulators); - -static void devm_pm_opp_regulators_release (void *data) -{ -dev_pm_opp_put_regulators (data); -} - -/** -* devm_pm_opp_set_regulators() - Set regulator names for the device -* @dev: Device for which regulator name is being set. -* @names: Array of pointers to the names of the regulator. -* @count: Number of regulators. -* -* This is a resource-managed variant of dev_pm_opp_set_regulators(). -* -* Return: 0 on success and errorno otherwise. -*/ -int devm_pm_opp_set_regulators (struct device *dev, -const char *const names[], -unsigned int count) -{ -struct opp_table *opp_table; - - opp_table =dev_pm_opp_set_regulators (dev, names, count); -if (IS_ERR (opp_table)) -return PTR_ERR (opp_table); - -return devm_add_action_or_reset (dev, devm_pm_opp_regulators_release, - opp_table); } -EXPORT_SYMBOL_GPL (devm_pm_opp_set_regulators);/** * dev_pm_opp_set_clkname() - Set clk name for the device
@@ -2627,7 +2573,7 @@ static void _opp_clear_config(struct opp_config_data *data)if (data->flags &OPP_CONFIG_GENPD )dev_pm_opp_detach_genpd (data->opp_table);if (data->flags &OPP_CONFIG_REGULATOR ) -dev_pm_opp_put_regulators (data->opp_table); +_opp_put_regulators (data->opp_table);if (data->flags &OPP_CONFIG_SUPPORTED_HW )dev_pm_opp_put_supported_hw (data->opp_table);if (data->flags &OPP_CONFIG_REGULATOR_HELPER )
@@ -2737,12 +2683,11 @@ int dev_pm_opp_set_config(struct device *dev, struct dev_pm_opp_config *config)/* Configure supplies */ if (config->regulator_names) { - err =dev_pm_opp_set_regulators (dev, config->regulator_names, - config->regulator_count); -if (IS_ERR (err)) { - ret =PTR_ERR (err); + ret =_opp_set_regulators (opp_table, dev, + config->regulator_names, + config->regulator_count); +if (ret) goto err; - } data->flags |=OPP_CONFIG_REGULATOR ; }
include/linux/pm_opp.h +0 -17
@@ -192,9 +192,6 @@ void dev_pm_opp_put_supported_hw(struct opp_table *opp_table);int devm_pm_opp_set_supported_hw (struct device *dev,const u32 *versions,unsigned int count);struct opp_table *dev_pm_opp_set_prop_name (struct device *dev,const char *name);void dev_pm_opp_put_prop_name (struct opp_table *opp_table); -struct opp_table *dev_pm_opp_set_regulators (struct device *dev,const char *const names[],unsigned int count); -void dev_pm_opp_put_regulators (struct opp_table *opp_table); -int devm_pm_opp_set_regulators (struct device *dev,const char *const names[],unsigned int count);struct opp_table *dev_pm_opp_set_clkname (struct device *dev,const char *name);void dev_pm_opp_put_clkname (struct opp_table *opp_table);int devm_pm_opp_set_clkname (struct device *dev,const char *name);
@@ -412,20 +409,6 @@ static inline struct opp_table *dev_pm_opp_set_prop_name(struct device *dev, constatic inline void dev_pm_opp_put_prop_name (struct opp_table *opp_table) {} -static inline struct opp_table *dev_pm_opp_set_regulators (struct device *dev,const char *const names[],unsigned int count) -{ -return ERR_PTR (-EOPNOTSUPP ); -} - -static inline void dev_pm_opp_put_regulators (struct opp_table *opp_table) {} - -static inline int devm_pm_opp_set_regulators (struct device *dev, -const char *const names[], -unsigned int count) -{ -return -EOPNOTSUPP ; -} -static inline struct opp_table *dev_pm_opp_set_clkname (struct device *dev,const char *name) {return ERR_PTR (-EOPNOTSUPP );
Signature · 1 line
2.31.1.272.g89b43f80a514
Viresh Kumar
maintainerPATCH v2 26/30 OPP: Remove dev_pm_opp_set_supported_hw() and friends
In reply to Viresh KumarNow that everyone has migrated to dev_pm_opp_set_config(), remove the public interface for dev_pm_opp_set_supported_hw() and friends.
--- drivers/opp/core.c | 87 ++++++++++-------------------------------- include/linux/pm_opp.h | 19 --------- 2 files changed, 20 insertions(+), 86 deletions(-)
drivers/opp/core.c +20 -67
@@ -1952,7 +1952,7 @@ int _opp_add_v1(struct opp_table *opp_table, struct device *dev, }/** -* dev_pm_opp_set_supported_hw() - Set supported platforms +* _opp_set_supported_hw() - Set supported platforms * @dev: Device for which supported-hw has to be set. * @versions: Array of hierarchy of versions to match. * @count: Number of elements in the array.
@@ -1962,84 +1962,39 @@ int _opp_add_v1(struct opp_table *opp_table, struct device *dev,* OPPs, which are available for those versions, based on its 'opp-supported-hw' * property. */ -struct opp_table *dev_pm_opp_set_supported_hw (struct device *dev, -const u32 *versions,unsigned int count) +static int _opp_set_supported_hw (struct opp_table *opp_table, +const u32 *versions,unsigned int count) { -struct opp_table *opp_table; - - opp_table =_add_opp_table (dev, false); -if (IS_ERR (opp_table)) -return opp_table; - -/* Make sure there are no concurrent readers while updating opp_table */ -WARN_ON (!list_empty (&opp_table->opp_list)); -/* Another CPU that shares the OPP table has set the property ? */ if (opp_table->supported_hw) -return opp_table; +return 0 ; opp_table->supported_hw =kmemdup (versions, count *sizeof (*versions),GFP_KERNEL ); -if (!opp_table->supported_hw) { -dev_pm_opp_put_opp_table (opp_table); -return ERR_PTR (-ENOMEM ); - } +if (!opp_table->supported_hw) +return -ENOMEM ; opp_table->supported_hw_count = count; -return opp_table; +return 0 ; } -EXPORT_SYMBOL_GPL (dev_pm_opp_set_supported_hw);/** -* dev_pm_opp_put_supported_hw() - Releases resources blocked for supported hw -* @opp_table: OPP table returned by dev_pm_opp_set_supported_hw(). +* _opp_put_supported_hw() - Releases resources blocked for supported hw +* @opp_table: OPP table returned by _opp_set_supported_hw(). * * This is required only for the V2 bindings, and is called for a matching -* dev_pm_opp_set_supported_hw(). Until this is called, the opp_table structure +* _opp_set_supported_hw(). Until this is called, the opp_table structure * will not be freed. */ -void dev_pm_opp_put_supported_hw (struct opp_table *opp_table) +static void _opp_put_supported_hw (struct opp_table *opp_table) { -if (unlikely (!opp_table)) -return ; - -kfree (opp_table->supported_hw); - opp_table->supported_hw =NULL ; - opp_table->supported_hw_count =0 ; - -dev_pm_opp_put_opp_table (opp_table); -} -EXPORT_SYMBOL_GPL (dev_pm_opp_put_supported_hw); - -static void devm_pm_opp_supported_hw_release (void *data) -{ -dev_pm_opp_put_supported_hw (data); -} - -/** -* devm_pm_opp_set_supported_hw() - Set supported platforms -* @dev: Device for which supported-hw has to be set. -* @versions: Array of hierarchy of versions to match. -* @count: Number of elements in the array. -* -* This is a resource-managed variant of dev_pm_opp_set_supported_hw(). -* -* Return: 0 on success and errorno otherwise. -*/ -int devm_pm_opp_set_supported_hw (struct device *dev,const u32 *versions, -unsigned int count) -{ -struct opp_table *opp_table; - - opp_table =dev_pm_opp_set_supported_hw (dev, versions, count); -if (IS_ERR (opp_table)) -return PTR_ERR (opp_table); - -return devm_add_action_or_reset (dev, devm_pm_opp_supported_hw_release, - opp_table); +if (opp_table->supported_hw) { +kfree (opp_table->supported_hw); + opp_table->supported_hw =NULL ; + opp_table->supported_hw_count =0 ; + } } -EXPORT_SYMBOL_GPL (devm_pm_opp_set_supported_hw);/** * dev_pm_opp_set_prop_name() - Set prop-extn name
@@ -2575,7 +2530,7 @@ static void _opp_clear_config(struct opp_config_data *data)if (data->flags &OPP_CONFIG_REGULATOR )_opp_put_regulators (data->opp_table);if (data->flags &OPP_CONFIG_SUPPORTED_HW ) -dev_pm_opp_put_supported_hw (data->opp_table); +_opp_put_supported_hw (data->opp_table);if (data->flags &OPP_CONFIG_REGULATOR_HELPER )dev_pm_opp_unregister_set_opp_helper (data->opp_table);if (data->flags &OPP_CONFIG_PROP_NAME )
@@ -2671,12 +2626,10 @@ int dev_pm_opp_set_config(struct device *dev, struct dev_pm_opp_config *config)/* Configure supported hardware */ if (config->supported_hw) { - err =dev_pm_opp_set_supported_hw (dev, config->supported_hw, - config->supported_hw_count); -if (IS_ERR (err)) { - ret =PTR_ERR (err); + ret =_opp_set_supported_hw (opp_table, config->supported_hw, + config->supported_hw_count); +if (ret) goto err; - } data->flags |=OPP_CONFIG_SUPPORTED_HW ; }
include/linux/pm_opp.h +0 -19
@@ -187,9 +187,6 @@ int dev_pm_opp_set_config(struct device *dev, struct dev_pm_opp_config *config);int devm_pm_opp_set_config (struct device *dev,struct dev_pm_opp_config *config);void dev_pm_opp_clear_config (int token); -struct opp_table *dev_pm_opp_set_supported_hw (struct device *dev,const u32 *versions,unsigned int count); -void dev_pm_opp_put_supported_hw (struct opp_table *opp_table); -int devm_pm_opp_set_supported_hw (struct device *dev,const u32 *versions,unsigned int count);struct opp_table *dev_pm_opp_set_prop_name (struct device *dev,const char *name);void dev_pm_opp_put_prop_name (struct opp_table *opp_table);struct opp_table *dev_pm_opp_set_clkname (struct device *dev,const char *name);
@@ -372,22 +369,6 @@ static inline int dev_pm_opp_unregister_notifier(struct device *dev, struct notireturn -EOPNOTSUPP ; } -static inline struct opp_table *dev_pm_opp_set_supported_hw (struct device *dev, -const u32 *versions, -unsigned int count) -{ -return ERR_PTR (-EOPNOTSUPP ); -} - -static inline void dev_pm_opp_put_supported_hw (struct opp_table *opp_table) {} - -static inline int devm_pm_opp_set_supported_hw (struct device *dev, -const u32 *versions, -unsigned int count) -{ -return -EOPNOTSUPP ; -} -static inline struct opp_table *dev_pm_opp_register_set_opp_helper (struct device *dev,int (*set_opp)(struct dev_pm_set_opp_data *data)) {
Signature · 1 line
2.31.1.272.g89b43f80a514
Viresh Kumar
maintainerPATCH v2 27/30 OPP: Remove dev_pm_opp_set_clkname() and friends
In reply to Viresh KumarNow that everyone has migrated to dev_pm_opp_set_config(), remove the public interface for dev_pm_opp_set_clkname() and friends.
--- drivers/opp/core.c | 118 +++++++++++------------------------------ include/linux/pm_opp.h | 15 ------ 2 files changed, 32 insertions(+), 101 deletions(-)
drivers/opp/core.c +32 -86
@@ -2156,104 +2156,57 @@ static void _opp_put_regulators(struct opp_table *opp_table) }/** -* dev_pm_opp_set_clkname() - Set clk name for the device -* @dev: Device for which clk name is being set. -* @name: Clk name. -* -* In order to support OPP switching, OPP layer needs to get pointer to the -* clock for the device. Simple cases work fine without using this routine (i.e. -* by passing connection-id as NULL), but for a device with multiple clocks -* available, the OPP core needs to know the exact name of the clk to use. +* _opp_set_clknames() - Set clk names for the device +* @dev: Device for which clk names is being set. +* @names: Clk names. +* +* In order to support OPP switching, OPP layer needs to get pointers to the +* clocks for the device. Simple cases work fine without using this routine +* (i.e. by passing connection-id as NULL), but for a device with multiple +* clocks available, the OPP core needs to know the exact names of the clks to +* use. * * This must be called before any OPPs are initialized for the device. */ -struct opp_table *dev_pm_opp_set_clkname (struct device *dev,const char *name) +static int _opp_set_clknames (struct opp_table *opp_table,struct device *dev, +const char *const names[],unsigned int count) { -struct opp_table *opp_table; -int ret; - - opp_table =_add_opp_table (dev, false); -if (IS_ERR (opp_table)) -return opp_table; - -/* This should be called before OPPs are initialized */ -if (WARN_ON (!list_empty (&opp_table->opp_list))) { - ret = -EBUSY ; - goto err; - } +/* We support only one clock name for now */ +if (count !=1 ) +return -EINVAL ;/* Another CPU that shares the OPP table has set the clkname ? */ if (opp_table->clk_configured) -return opp_table; +return 0 ;/* clk shouldn't be initialized at this point */ -if (WARN_ON (opp_table->clk)) { - ret = -EBUSY ; - goto err; - } +if (WARN_ON (opp_table->clk)) +return -EBUSY ;/* Find clk for the device */ - opp_table->clk =clk_get (dev, name); + opp_table->clk =clk_get (dev, names[0 ]);if (IS_ERR (opp_table->clk)) { - ret =dev_err_probe (dev,PTR_ERR (opp_table->clk), +return dev_err_probe (dev,PTR_ERR (opp_table->clk),"%s: Couldn't find clock\n" , __func__); - goto err; } opp_table->clk_configured = true; -return opp_table; - -err: -dev_pm_opp_put_opp_table (opp_table); - -return ERR_PTR (ret); -} -EXPORT_SYMBOL_GPL (dev_pm_opp_set_clkname); - -/** -* dev_pm_opp_put_clkname() - Releases resources blocked for clk. -* @opp_table: OPP table returned from dev_pm_opp_set_clkname(). -*/ -void dev_pm_opp_put_clkname (struct opp_table *opp_table) -{ -if (unlikely (!opp_table)) -return ; - -clk_put (opp_table->clk); - opp_table->clk =ERR_PTR (-EINVAL ); - opp_table->clk_configured = false; - -dev_pm_opp_put_opp_table (opp_table); -} -EXPORT_SYMBOL_GPL (dev_pm_opp_put_clkname); - -static void devm_pm_opp_clkname_release (void *data) -{ -dev_pm_opp_put_clkname (data); +return 0 ; }/** -* devm_pm_opp_set_clkname() - Set clk name for the device -* @dev: Device for which clk name is being set. -* @name: Clk name. -* -* This is a resource-managed variant of dev_pm_opp_set_clkname(). -* -* Return: 0 on success and errorno otherwise. +* _opp_put_clknames() - Releases resources blocked for clks. +* @opp_table: OPP table returned from _opp_set_clknames(). */ -int devm_pm_opp_set_clkname (struct device *dev,const char *name) +static void _opp_put_clknames (struct opp_table *opp_table) { -struct opp_table *opp_table; - - opp_table =dev_pm_opp_set_clkname (dev, name); -if (IS_ERR (opp_table)) -return PTR_ERR (opp_table); - -return devm_add_action_or_reset (dev, devm_pm_opp_clkname_release, - opp_table); +if (opp_table->clk_configured) { +clk_put (opp_table->clk); + opp_table->clk =ERR_PTR (-EINVAL ); + opp_table->clk_configured = false; + } } -EXPORT_SYMBOL_GPL (devm_pm_opp_set_clkname);/** * dev_pm_opp_register_set_opp_helper() - Register custom set OPP helper
@@ -2536,7 +2489,7 @@ static void _opp_clear_config(struct opp_config_data *data)if (data->flags &OPP_CONFIG_PROP_NAME )dev_pm_opp_put_prop_name (data->opp_table);if (data->flags &OPP_CONFIG_CLK ) -dev_pm_opp_put_clkname (data->opp_table); +_opp_put_clknames (data->opp_table);dev_pm_opp_put_opp_table (data->opp_table);kfree (data);
@@ -2587,17 +2540,10 @@ int dev_pm_opp_set_config(struct device *dev, struct dev_pm_opp_config *config)/* Configure clocks */ if (config->clk_names) { -/* We support only one clock name for now */ -if (config->clk_count !=1 ) { - ret = -EINVAL ; - goto err; - } - - err =dev_pm_opp_set_clkname (dev, config->clk_names[0 ]); -if (IS_ERR (err)) { - ret =PTR_ERR (err); + ret =_opp_set_clknames (opp_table, dev, config->clk_names, + config->clk_count); +if (ret) goto err; - } data->flags |=OPP_CONFIG_CLK ; }
include/linux/pm_opp.h +0 -15
@@ -189,9 +189,6 @@ void dev_pm_opp_clear_config(int token);struct opp_table *dev_pm_opp_set_prop_name (struct device *dev,const char *name);void dev_pm_opp_put_prop_name (struct opp_table *opp_table); -struct opp_table *dev_pm_opp_set_clkname (struct device *dev,const char *name); -void dev_pm_opp_put_clkname (struct opp_table *opp_table); -int devm_pm_opp_set_clkname (struct device *dev,const char *name);struct opp_table *dev_pm_opp_register_set_opp_helper (struct device *dev,int (*set_opp)(struct dev_pm_set_opp_data *data));void dev_pm_opp_unregister_set_opp_helper (struct opp_table *opp_table);int devm_pm_opp_register_set_opp_helper (struct device *dev,int (*set_opp)(struct dev_pm_set_opp_data *data));
@@ -390,18 +387,6 @@ static inline struct opp_table *dev_pm_opp_set_prop_name(struct device *dev, constatic inline void dev_pm_opp_put_prop_name (struct opp_table *opp_table) {} -static inline struct opp_table *dev_pm_opp_set_clkname (struct device *dev,const char *name) -{ -return ERR_PTR (-EOPNOTSUPP ); -} - -static inline void dev_pm_opp_put_clkname (struct opp_table *opp_table) {} - -static inline int devm_pm_opp_set_clkname (struct device *dev,const char *name) -{ -return -EOPNOTSUPP ; -} -static inline struct opp_table *dev_pm_opp_attach_genpd (struct device *dev,const char *const *names,struct device ***virt_devs) {return ERR_PTR (-EOPNOTSUPP );
Signature · 1 line
2.31.1.272.g89b43f80a514
Viresh Kumar
maintainerPATCH v2 28/30 OPP: Remove dev_pm_opp_register_set_opp_helper() and friends
In reply to Viresh KumarNow that everyone has migrated to dev_pm_opp_set_config(), remove the public interface for dev_pm_opp_register_set_opp_helper() and friends.
--- drivers/opp/core.c | 89 ++++++++++-------------------------------- include/linux/pm_opp.h | 17 -------- 2 files changed, 20 insertions(+), 86 deletions(-)
drivers/opp/core.c +20 -69
@@ -2209,7 +2209,7 @@ static void _opp_put_clknames(struct opp_table *opp_table) }/** -* dev_pm_opp_register_set_opp_helper() - Register custom set OPP helper +* _opp_register_set_opp_helper() - Register custom set OPP helper * @dev: Device for which the helper is getting registered. * @set_opp: Custom set OPP helper. *
@@ -2218,32 +2218,18 @@ static void _opp_put_clknames(struct opp_table *opp_table)* * This must be called before any OPPs are initialized for the device. */ -struct opp_table *dev_pm_opp_register_set_opp_helper (struct device *dev, -int (*set_opp)(struct dev_pm_set_opp_data *data)) +static int _opp_register_set_opp_helper (struct opp_table *opp_table, +struct device *dev,int (*set_opp)(struct dev_pm_set_opp_data *data)) {struct dev_pm_set_opp_data *data; -struct opp_table *opp_table; - -if (!set_opp) -return ERR_PTR (-EINVAL ); - - opp_table =_add_opp_table (dev, false); -if (IS_ERR (opp_table)) -return opp_table; - -/* This should be called before OPPs are initialized */ -if (WARN_ON (!list_empty (&opp_table->opp_list))) { -dev_pm_opp_put_opp_table (opp_table); -return ERR_PTR (-EBUSY ); - }/* Another CPU that shares the OPP table has set the helper ? */ if (opp_table->set_opp) -return opp_table; +return 0 ; data =kzalloc (sizeof (*data),GFP_KERNEL );if (!data) -return ERR_PTR (-ENOMEM ); +return -ENOMEM ;mutex_lock (&opp_table->lock); opp_table->set_opp_data = data;
@@ -2256,60 +2242,26 @@ struct opp_table *dev_pm_opp_register_set_opp_helper(struct device *dev, opp_table->set_opp = set_opp; -return opp_table; +return 0 ; } -EXPORT_SYMBOL_GPL (dev_pm_opp_register_set_opp_helper);/** -* dev_pm_opp_unregister_set_opp_helper() - Releases resources blocked for -* set_opp helper -* @opp_table: OPP table returned from dev_pm_opp_register_set_opp_helper(). +* _opp_unregister_set_opp_helper() - Releases resources blocked for set_opp helper +* @opp_table: OPP table returned from _opp_register_set_opp_helper(). * * Release resources blocked for platform specific set_opp helper. */ -void dev_pm_opp_unregister_set_opp_helper (struct opp_table *opp_table) +static void _opp_unregister_set_opp_helper (struct opp_table *opp_table) { -if (unlikely (!opp_table)) -return ; - - opp_table->set_opp =NULL ; - -mutex_lock (&opp_table->lock); -kfree (opp_table->set_opp_data); - opp_table->set_opp_data =NULL ; -mutex_unlock (&opp_table->lock); - -dev_pm_opp_put_opp_table (opp_table); -} -EXPORT_SYMBOL_GPL (dev_pm_opp_unregister_set_opp_helper); - -static void devm_pm_opp_unregister_set_opp_helper (void *data) -{ -dev_pm_opp_unregister_set_opp_helper (data); -} - -/** -* devm_pm_opp_register_set_opp_helper() - Register custom set OPP helper -* @dev: Device for which the helper is getting registered. -* @set_opp: Custom set OPP helper. -* -* This is a resource-managed version of dev_pm_opp_register_set_opp_helper(). -* -* Return: 0 on success and errorno otherwise. -*/ -int devm_pm_opp_register_set_opp_helper (struct device *dev, -int (*set_opp)(struct dev_pm_set_opp_data *data)) -{ -struct opp_table *opp_table; - - opp_table =dev_pm_opp_register_set_opp_helper (dev, set_opp); -if (IS_ERR (opp_table)) -return PTR_ERR (opp_table); +if (opp_table->set_opp) { + opp_table->set_opp =NULL ; -return devm_add_action_or_reset (dev, devm_pm_opp_unregister_set_opp_helper, - opp_table); +mutex_lock (&opp_table->lock); +kfree (opp_table->set_opp_data); + opp_table->set_opp_data =NULL ; +mutex_unlock (&opp_table->lock); + } } -EXPORT_SYMBOL_GPL (devm_pm_opp_register_set_opp_helper);static void _opp_detach_genpd (struct opp_table *opp_table) {
@@ -2485,7 +2437,7 @@ static void _opp_clear_config(struct opp_config_data *data)if (data->flags &OPP_CONFIG_SUPPORTED_HW )_opp_put_supported_hw (data->opp_table);if (data->flags &OPP_CONFIG_REGULATOR_HELPER ) -dev_pm_opp_unregister_set_opp_helper (data->opp_table); +_opp_unregister_set_opp_helper (data->opp_table);if (data->flags &OPP_CONFIG_PROP_NAME )dev_pm_opp_put_prop_name (data->opp_table);if (data->flags &OPP_CONFIG_CLK )
@@ -2561,11 +2513,10 @@ int dev_pm_opp_set_config(struct device *dev, struct dev_pm_opp_config *config)/* Configure opp helper */ if (config->set_opp) { - err =dev_pm_opp_register_set_opp_helper (dev, config->set_opp); -if (IS_ERR (err)) { - ret =PTR_ERR (err); + ret =_opp_register_set_opp_helper (opp_table, dev, + config->set_opp); +if (ret) goto err; - } data->flags |=OPP_CONFIG_REGULATOR_HELPER ; }
include/linux/pm_opp.h +0 -17
@@ -189,9 +189,6 @@ void dev_pm_opp_clear_config(int token);struct opp_table *dev_pm_opp_set_prop_name (struct device *dev,const char *name);void dev_pm_opp_put_prop_name (struct opp_table *opp_table); -struct opp_table *dev_pm_opp_register_set_opp_helper (struct device *dev,int (*set_opp)(struct dev_pm_set_opp_data *data)); -void dev_pm_opp_unregister_set_opp_helper (struct opp_table *opp_table); -int devm_pm_opp_register_set_opp_helper (struct device *dev,int (*set_opp)(struct dev_pm_set_opp_data *data));struct opp_table *dev_pm_opp_attach_genpd (struct device *dev,const char *const *names,struct device ***virt_devs);void dev_pm_opp_detach_genpd (struct opp_table *opp_table);int devm_pm_opp_attach_genpd (struct device *dev,const char *const *names,struct device ***virt_devs);
@@ -366,20 +363,6 @@ static inline int dev_pm_opp_unregister_notifier(struct device *dev, struct notireturn -EOPNOTSUPP ; } -static inline struct opp_table *dev_pm_opp_register_set_opp_helper (struct device *dev, -int (*set_opp)(struct dev_pm_set_opp_data *data)) -{ -return ERR_PTR (-EOPNOTSUPP ); -} - -static inline void dev_pm_opp_unregister_set_opp_helper (struct opp_table *opp_table) {} - -static inline int devm_pm_opp_register_set_opp_helper (struct device *dev, -int (*set_opp)(struct dev_pm_set_opp_data *data)) -{ -return -EOPNOTSUPP ; -} -static inline struct opp_table *dev_pm_opp_set_prop_name (struct device *dev,const char *name) {return ERR_PTR (-EOPNOTSUPP );
Signature · 1 line
2.31.1.272.g89b43f80a514
Viresh Kumar
maintainerPATCH v2 29/30 OPP: Remove dev_pm_opp_attach_genpd() and friends
In reply to Viresh KumarNow that everyone has migrated to dev_pm_opp_set_config(), remove the public interface for dev_pm_opp_attach_genpd() and friends.
--- drivers/opp/core.c | 85 +++++++++--------------------------------- include/linux/pm_opp.h | 17 --------- 2 files changed, 18 insertions(+), 84 deletions(-)
drivers/opp/core.c +18 -67
@@ -2263,7 +2263,7 @@ static void _opp_unregister_set_opp_helper(struct opp_table *opp_table) } } -static void _opp_detach_genpd (struct opp_table *opp_table) +static void _detach_genpd (struct opp_table *opp_table) {int index;
@@ -2283,7 +2283,7 @@ static void _opp_detach_genpd(struct opp_table *opp_table) }/** -* dev_pm_opp_attach_genpd - Attach genpd(s) for the device and save virtual device pointer +* _opp_attach_genpd - Attach genpd(s) for the device and save virtual device pointer * @dev: Consumer device for which the genpd is getting attached. * @names: Null terminated array of pointers containing names of genpd to attach. * @virt_devs: Pointer to return the array of virtual devices.
@@ -2304,30 +2304,23 @@ static void _opp_detach_genpd(struct opp_table *opp_table)* The order of entries in the names array must match the order in which * "required-opps" are added in DT. */ -struct opp_table *dev_pm_opp_attach_genpd (struct device *dev, -const char *const *names,struct device ***virt_devs) +static int _opp_attach_genpd (struct opp_table *opp_table,struct device *dev, +const char *const *names,struct device ***virt_devs) { -struct opp_table *opp_table;struct device *virt_dev;int index =0 , ret = -EINVAL ;const char *const *name = names; - opp_table =_add_opp_table (dev, false); -if (IS_ERR (opp_table)) -return opp_table; -if (opp_table->genpd_virt_devs) -return opp_table; +return 0 ;/* * If the genpd's OPP table isn't already initialized, parsing of the * required-opps fail for dev. We should retry this after genpd's OPP * table is added. */ -if (!opp_table->required_opp_count) { - ret = -EPROBE_DEFER ; - goto put_table; - } +if (!opp_table->required_opp_count) +return -EPROBE_DEFER ;mutex_lock (&opp_table->genpd_virt_dev_lock);
@@ -2360,78 +2353,38 @@ struct opp_table *dev_pm_opp_attach_genpd(struct device *dev, *virt_devs = opp_table->genpd_virt_devs;mutex_unlock (&opp_table->genpd_virt_dev_lock); -return opp_table; +return 0 ; err: -_opp_detach_genpd (opp_table); +_detach_genpd (opp_table); unlock:mutex_unlock (&opp_table->genpd_virt_dev_lock); +return ret; -put_table: -dev_pm_opp_put_opp_table (opp_table); - -return ERR_PTR (ret); } -EXPORT_SYMBOL_GPL (dev_pm_opp_attach_genpd);/** -* dev_pm_opp_detach_genpd() - Detach genpd(s) from the device. -* @opp_table: OPP table returned by dev_pm_opp_attach_genpd(). +* _opp_detach_genpd() - Detach genpd(s) from the device. +* @opp_table: OPP table returned by _opp_attach_genpd(). * * This detaches the genpd(s), resets the virtual device pointers, and puts the * OPP table. */ -void dev_pm_opp_detach_genpd (struct opp_table *opp_table) +static void _opp_detach_genpd (struct opp_table *opp_table) { -if (unlikely (!opp_table)) -return ; -/* * Acquire genpd_virt_dev_lock to make sure virt_dev isn't getting * used in parallel. */ mutex_lock (&opp_table->genpd_virt_dev_lock); -_opp_detach_genpd (opp_table); +_detach_genpd (opp_table);mutex_unlock (&opp_table->genpd_virt_dev_lock); - -dev_pm_opp_put_opp_table (opp_table); } -EXPORT_SYMBOL_GPL (dev_pm_opp_detach_genpd); - -static void devm_pm_opp_detach_genpd (void *data) -{ -dev_pm_opp_detach_genpd (data); -} - -/** -* devm_pm_opp_attach_genpd - Attach genpd(s) for the device and save virtual -* device pointer -* @dev: Consumer device for which the genpd is getting attached. -* @names: Null terminated array of pointers containing names of genpd to attach. -* @virt_devs: Pointer to return the array of virtual devices. -* -* This is a resource-managed version of dev_pm_opp_attach_genpd(). -* -* Return: 0 on success and errorno otherwise. -*/ -int devm_pm_opp_attach_genpd (struct device *dev,const char *const *names, -struct device ***virt_devs) -{ -struct opp_table *opp_table; - - opp_table =dev_pm_opp_attach_genpd (dev, names, virt_devs); -if (IS_ERR (opp_table)) -return PTR_ERR (opp_table); - -return devm_add_action_or_reset (dev, devm_pm_opp_detach_genpd, - opp_table); -} -EXPORT_SYMBOL_GPL (devm_pm_opp_attach_genpd);static void _opp_clear_config (struct opp_config_data *data) {if (data->flags &OPP_CONFIG_GENPD ) -dev_pm_opp_detach_genpd (data->opp_table); +_opp_detach_genpd (data->opp_table);if (data->flags &OPP_CONFIG_REGULATOR )_opp_put_regulators (data->opp_table);if (data->flags &OPP_CONFIG_SUPPORTED_HW )
@@ -2544,12 +2497,10 @@ int dev_pm_opp_set_config(struct device *dev, struct dev_pm_opp_config *config)/* Attach genpds */ if (config->genpd_names) { - err =dev_pm_opp_attach_genpd (dev, config->genpd_names, - config->virt_devs); -if (IS_ERR (err)) { - ret =PTR_ERR (err); + ret =_opp_attach_genpd (opp_table, dev, config->genpd_names, + config->virt_devs); +if (ret) goto err; - } data->flags |=OPP_CONFIG_GENPD ; }
include/linux/pm_opp.h +0 -17
@@ -189,9 +189,6 @@ void dev_pm_opp_clear_config(int token);struct opp_table *dev_pm_opp_set_prop_name (struct device *dev,const char *name);void dev_pm_opp_put_prop_name (struct opp_table *opp_table); -struct opp_table *dev_pm_opp_attach_genpd (struct device *dev,const char *const *names,struct device ***virt_devs); -void dev_pm_opp_detach_genpd (struct opp_table *opp_table); -int devm_pm_opp_attach_genpd (struct device *dev,const char *const *names,struct device ***virt_devs);struct dev_pm_opp *dev_pm_opp_xlate_required_opp (struct opp_table *src_table,struct opp_table *dst_table,struct dev_pm_opp *src_opp);int dev_pm_opp_xlate_performance_state (struct opp_table *src_table,struct opp_table *dst_table,unsigned int pstate);int dev_pm_opp_set_rate (struct device *dev,unsigned long target_freq);
@@ -370,20 +367,6 @@ static inline struct opp_table *dev_pm_opp_set_prop_name(struct device *dev, constatic inline void dev_pm_opp_put_prop_name (struct opp_table *opp_table) {} -static inline struct opp_table *dev_pm_opp_attach_genpd (struct device *dev,const char *const *names,struct device ***virt_devs) -{ -return ERR_PTR (-EOPNOTSUPP ); -} - -static inline void dev_pm_opp_detach_genpd (struct opp_table *opp_table) {} - -static inline int devm_pm_opp_attach_genpd (struct device *dev, -const char *const *names, -struct device ***virt_devs) -{ -return -EOPNOTSUPP ; -} -static inline int dev_pm_opp_set_config (struct device *dev,struct dev_pm_opp_config *config) {return -EOPNOTSUPP ;
Signature · 1 line
2.31.1.272.g89b43f80a514
Viresh Kumar
maintainerPATCH v2 30/30 OPP: Remove dev_pm_opp_set_prop_name() and friends
In reply to Viresh KumarNow that everyone has migrated to dev_pm_opp_set_config(), remove the public interface for dev_pm_opp_set_prop_name() and friends.
--- drivers/opp/core.c | 55 ++++++++++++++---------------------------- include/linux/pm_opp.h | 9 ------- 2 files changed, 18 insertions(+), 46 deletions(-)
drivers/opp/core.c +18 -37
@@ -1997,7 +1997,7 @@ static void _opp_put_supported_hw(struct opp_table *opp_table) }/** -* dev_pm_opp_set_prop_name() - Set prop-extn name +* _opp_set_prop_name() - Set prop-extn name * @dev: Device for which the prop-name has to be set. * @name: name to postfix to properties. *
@@ -2006,50 +2006,33 @@ static void _opp_put_supported_hw(struct opp_table *opp_table)* which the extension will apply are opp-microvolt and opp-microamp. OPP core * should postfix the property name with -<name> while looking for them. */ -struct opp_table *dev_pm_opp_set_prop_name (struct device *dev,const char *name) +static int _opp_set_prop_name (struct opp_table *opp_table,const char *name) { -struct opp_table *opp_table; - - opp_table =_add_opp_table (dev, false); -if (IS_ERR (opp_table)) -return opp_table; - -/* Make sure there are no concurrent readers while updating opp_table */ -WARN_ON (!list_empty (&opp_table->opp_list)); -/* Another CPU that shares the OPP table has set the property ? */ -if (opp_table->prop_name) -return opp_table; - - opp_table->prop_name =kstrdup (name,GFP_KERNEL );if (!opp_table->prop_name) { -dev_pm_opp_put_opp_table (opp_table); -return ERR_PTR (-ENOMEM ); + opp_table->prop_name =kstrdup (name,GFP_KERNEL ); +if (!opp_table->prop_name) +return -ENOMEM ; } -return opp_table; +return 0 ; } -EXPORT_SYMBOL_GPL (dev_pm_opp_set_prop_name);/** -* dev_pm_opp_put_prop_name() - Releases resources blocked for prop-name -* @opp_table: OPP table returned by dev_pm_opp_set_prop_name(). +* _opp_put_prop_name() - Releases resources blocked for prop-name +* @opp_table: OPP table returned by _opp_set_prop_name(). * * This is required only for the V2 bindings, and is called for a matching -* dev_pm_opp_set_prop_name(). Until this is called, the opp_table structure +* _opp_set_prop_name(). Until this is called, the opp_table structure * will not be freed. */ -void dev_pm_opp_put_prop_name (struct opp_table *opp_table) +static void _opp_put_prop_name (struct opp_table *opp_table) { -if (unlikely (!opp_table)) -return ; - -kfree (opp_table->prop_name); - opp_table->prop_name =NULL ; - -dev_pm_opp_put_opp_table (opp_table); +if (opp_table->prop_name) { +kfree (opp_table->prop_name); + opp_table->prop_name =NULL ; + } } -EXPORT_SYMBOL_GPL (dev_pm_opp_put_prop_name);/** * _opp_set_regulators() - Set regulator names for the device
@@ -2392,7 +2375,7 @@ static void _opp_clear_config(struct opp_config_data *data)if (data->flags &OPP_CONFIG_REGULATOR_HELPER )_opp_unregister_set_opp_helper (data->opp_table);if (data->flags &OPP_CONFIG_PROP_NAME ) -dev_pm_opp_put_prop_name (data->opp_table); +_opp_put_prop_name (data->opp_table);if (data->flags &OPP_CONFIG_CLK )_opp_put_clknames (data->opp_table);
@@ -2419,7 +2402,7 @@ static void _opp_clear_config(struct opp_config_data *data)*/ int dev_pm_opp_set_config (struct device *dev,struct dev_pm_opp_config *config) { -struct opp_table *opp_table, *err; +struct opp_table *opp_table;struct opp_config_data *data;unsigned int id;int ret;
@@ -2455,11 +2438,9 @@ int dev_pm_opp_set_config(struct device *dev, struct dev_pm_opp_config *config)/* Configure property names */ if (config->prop_name) { - err =dev_pm_opp_set_prop_name (dev, config->prop_name); -if (IS_ERR (err)) { - ret =PTR_ERR (err); + ret =_opp_set_prop_name (opp_table, config->prop_name); +if (ret) goto err; - } data->flags |=OPP_CONFIG_PROP_NAME ; }
include/linux/pm_opp.h +0 -9
@@ -187,8 +187,6 @@ int dev_pm_opp_set_config(struct device *dev, struct dev_pm_opp_config *config);int devm_pm_opp_set_config (struct device *dev,struct dev_pm_opp_config *config);void dev_pm_opp_clear_config (int token); -struct opp_table *dev_pm_opp_set_prop_name (struct device *dev,const char *name); -void dev_pm_opp_put_prop_name (struct opp_table *opp_table);struct dev_pm_opp *dev_pm_opp_xlate_required_opp (struct opp_table *src_table,struct opp_table *dst_table,struct dev_pm_opp *src_opp);int dev_pm_opp_xlate_performance_state (struct opp_table *src_table,struct opp_table *dst_table,unsigned int pstate);int dev_pm_opp_set_rate (struct device *dev,unsigned long target_freq);
@@ -360,13 +358,6 @@ static inline int dev_pm_opp_unregister_notifier(struct device *dev, struct notireturn -EOPNOTSUPP ; } -static inline struct opp_table *dev_pm_opp_set_prop_name (struct device *dev,const char *name) -{ -return ERR_PTR (-EOPNOTSUPP ); -} - -static inline void dev_pm_opp_put_prop_name (struct opp_table *opp_table) {} -static inline int dev_pm_opp_set_config (struct device *dev,struct dev_pm_opp_config *config) {return -EOPNOTSUPP ;
Signature · 1 line
2.31.1.272.g89b43f80a514