mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-12-29 09:16:33 +00:00
OPP: Drop redundant *_opp_attach|detach_genpd()
All users of *_opp_attach|detach_genpd(), have been converted to use dev|devm_pm_domain_attach|detach_list(), hence let's drop it along with its corresponding exported functions. Acked-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> Link: https://lore.kernel.org/r/20241002122232.194245-12-ulf.hansson@linaro.org
This commit is contained in:
parent
9da666ee5e
commit
d6caca30a5
@ -2360,119 +2360,6 @@ static void _opp_put_config_regulators_helper(struct opp_table *opp_table)
|
||||
opp_table->config_regulators = NULL;
|
||||
}
|
||||
|
||||
static void _opp_detach_genpd(struct opp_table *opp_table)
|
||||
{
|
||||
int index;
|
||||
|
||||
for (index = 0; index < opp_table->required_opp_count; index++) {
|
||||
if (!opp_table->required_devs[index])
|
||||
continue;
|
||||
|
||||
dev_pm_domain_detach(opp_table->required_devs[index], false);
|
||||
opp_table->required_devs[index] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Multiple generic power domains for a device are supported with the help of
|
||||
* virtual genpd devices, which are created for each consumer device - genpd
|
||||
* pair. These are the device structures which are attached to the power domain
|
||||
* and are required by the OPP core to set the performance state of the genpd.
|
||||
* The same API also works for the case where single genpd is available and so
|
||||
* we don't need to support that separately.
|
||||
*
|
||||
* This helper will normally be called by the consumer driver of the device
|
||||
* "dev", as only that has details of the genpd names.
|
||||
*
|
||||
* This helper needs to be called once with a list of all genpd to attach.
|
||||
* Otherwise the original device structure will be used instead by the OPP core.
|
||||
*
|
||||
* The order of entries in the names array must match the order in which
|
||||
* "required-opps" are added in DT.
|
||||
*/
|
||||
static int _opp_attach_genpd(struct opp_table *opp_table, struct device *dev,
|
||||
const char * const *names, struct device ***virt_devs)
|
||||
{
|
||||
struct device *virt_dev, *gdev;
|
||||
struct opp_table *genpd_table;
|
||||
int index = 0, ret = -EINVAL;
|
||||
const char * const *name = names;
|
||||
|
||||
if (!opp_table->required_devs) {
|
||||
dev_err(dev, "Required OPPs not available, can't attach genpd\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Genpd core takes care of propagation to parent genpd */
|
||||
if (opp_table->is_genpd) {
|
||||
dev_err(dev, "%s: Operation not supported for genpds\n", __func__);
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
/* Checking only the first one is enough ? */
|
||||
if (opp_table->required_devs[0])
|
||||
return 0;
|
||||
|
||||
while (*name) {
|
||||
if (index >= opp_table->required_opp_count) {
|
||||
dev_err(dev, "Index can't be greater than required-opp-count - 1, %s (%d : %d)\n",
|
||||
*name, opp_table->required_opp_count, index);
|
||||
goto err;
|
||||
}
|
||||
|
||||
virt_dev = dev_pm_domain_attach_by_name(dev, *name);
|
||||
if (IS_ERR_OR_NULL(virt_dev)) {
|
||||
ret = virt_dev ? PTR_ERR(virt_dev) : -ENODEV;
|
||||
dev_err(dev, "Couldn't attach to pm_domain: %d\n", ret);
|
||||
goto err;
|
||||
}
|
||||
|
||||
/*
|
||||
* The required_opp_tables parsing is not perfect, as the OPP
|
||||
* core does the parsing solely based on the DT node pointers.
|
||||
* The core sets the required_opp_tables entry to the first OPP
|
||||
* table in the "opp_tables" list, that matches with the node
|
||||
* pointer.
|
||||
*
|
||||
* If the target DT OPP table is used by multiple devices and
|
||||
* they all create separate instances of 'struct opp_table' from
|
||||
* it, then it is possible that the required_opp_tables entry
|
||||
* may be set to the incorrect sibling device.
|
||||
*
|
||||
* Cross check it again and fix if required.
|
||||
*/
|
||||
gdev = dev_to_genpd_dev(virt_dev);
|
||||
if (IS_ERR(gdev)) {
|
||||
ret = PTR_ERR(gdev);
|
||||
goto err;
|
||||
}
|
||||
|
||||
genpd_table = _find_opp_table(gdev);
|
||||
if (!IS_ERR(genpd_table)) {
|
||||
if (genpd_table != opp_table->required_opp_tables[index]) {
|
||||
dev_pm_opp_put_opp_table(opp_table->required_opp_tables[index]);
|
||||
opp_table->required_opp_tables[index] = genpd_table;
|
||||
} else {
|
||||
dev_pm_opp_put_opp_table(genpd_table);
|
||||
}
|
||||
}
|
||||
|
||||
opp_table->required_devs[index] = virt_dev;
|
||||
index++;
|
||||
name++;
|
||||
}
|
||||
|
||||
if (virt_devs)
|
||||
*virt_devs = opp_table->required_devs;
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
_opp_detach_genpd(opp_table);
|
||||
return ret;
|
||||
|
||||
}
|
||||
|
||||
static int _opp_set_required_dev(struct opp_table *opp_table,
|
||||
struct device *dev,
|
||||
struct device *required_dev,
|
||||
@ -2540,9 +2427,6 @@ static void _opp_clear_config(struct opp_config_data *data)
|
||||
if (data->flags & OPP_CONFIG_REQUIRED_DEV)
|
||||
_opp_put_required_dev(data->opp_table,
|
||||
data->required_dev_index);
|
||||
else if (data->flags & OPP_CONFIG_GENPD)
|
||||
_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)
|
||||
@ -2654,20 +2538,7 @@ int dev_pm_opp_set_config(struct device *dev, struct dev_pm_opp_config *config)
|
||||
data->flags |= OPP_CONFIG_REGULATOR;
|
||||
}
|
||||
|
||||
/* Attach genpds */
|
||||
if (config->genpd_names) {
|
||||
if (config->required_dev) {
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = _opp_attach_genpd(opp_table, dev, config->genpd_names,
|
||||
config->virt_devs);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
data->flags |= OPP_CONFIG_GENPD;
|
||||
} else if (config->required_dev) {
|
||||
ret = _opp_set_required_dev(opp_table, dev,
|
||||
config->required_dev,
|
||||
config->required_dev_index);
|
||||
|
@ -34,8 +34,7 @@ extern struct list_head opp_tables;
|
||||
#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)
|
||||
#define OPP_CONFIG_REQUIRED_DEV BIT(6)
|
||||
#define OPP_CONFIG_REQUIRED_DEV BIT(5)
|
||||
|
||||
/**
|
||||
* struct opp_config_data - data for set config operations
|
||||
|
@ -62,11 +62,7 @@ typedef int (*config_clks_t)(struct device *dev, struct opp_table *opp_table,
|
||||
* @supported_hw: Array of hierarchy of versions to match.
|
||||
* @supported_hw_count: Number of elements in the array.
|
||||
* @regulator_names: Array of pointers to the names of the regulator, NULL terminated.
|
||||
* @genpd_names: Null terminated array of pointers containing names of genpd to
|
||||
* attach. Mutually exclusive with required_dev.
|
||||
* @virt_devs: Pointer to return the array of genpd virtual devices. Mutually
|
||||
* exclusive with required_dev.
|
||||
* @required_dev: Required OPP device. Mutually exclusive with genpd_names/virt_devs.
|
||||
* @required_dev: The required OPP device.
|
||||
* @required_dev_index: The index of the required OPP for the @required_dev.
|
||||
*
|
||||
* This structure contains platform specific OPP configurations for the device.
|
||||
@ -80,8 +76,6 @@ struct dev_pm_opp_config {
|
||||
const unsigned int *supported_hw;
|
||||
unsigned int supported_hw_count;
|
||||
const char * const *regulator_names;
|
||||
const char * const *genpd_names;
|
||||
struct device ***virt_devs;
|
||||
struct device *required_dev;
|
||||
unsigned int required_dev_index;
|
||||
};
|
||||
@ -677,36 +671,6 @@ static inline void dev_pm_opp_put_config_regulators(int token)
|
||||
dev_pm_opp_clear_config(token);
|
||||
}
|
||||
|
||||
/* genpd helpers */
|
||||
static inline int dev_pm_opp_attach_genpd(struct device *dev,
|
||||
const char * const *names,
|
||||
struct device ***virt_devs)
|
||||
{
|
||||
struct dev_pm_opp_config config = {
|
||||
.genpd_names = names,
|
||||
.virt_devs = virt_devs,
|
||||
};
|
||||
|
||||
return dev_pm_opp_set_config(dev, &config);
|
||||
}
|
||||
|
||||
static inline void dev_pm_opp_detach_genpd(int token)
|
||||
{
|
||||
dev_pm_opp_clear_config(token);
|
||||
}
|
||||
|
||||
static inline int devm_pm_opp_attach_genpd(struct device *dev,
|
||||
const char * const *names,
|
||||
struct device ***virt_devs)
|
||||
{
|
||||
struct dev_pm_opp_config config = {
|
||||
.genpd_names = names,
|
||||
.virt_devs = virt_devs,
|
||||
};
|
||||
|
||||
return devm_pm_opp_set_config(dev, &config);
|
||||
}
|
||||
|
||||
/* prop-name helpers */
|
||||
static inline int dev_pm_opp_set_prop_name(struct device *dev, const char *name)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user