diff options
Diffstat (limited to 'drivers/opp/core.c')
| -rw-r--r-- | drivers/opp/core.c | 122 | 
1 files changed, 98 insertions, 24 deletions
| diff --git a/drivers/opp/core.c b/drivers/opp/core.c index 1556998425d5..e366218d6736 100644 --- a/drivers/opp/core.c +++ b/drivers/opp/core.c @@ -1857,6 +1857,35 @@ void dev_pm_opp_put_supported_hw(struct 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); +} +EXPORT_SYMBOL_GPL(devm_pm_opp_set_supported_hw); +  /**   * dev_pm_opp_set_prop_name() - Set prop-extn name   * @dev: Device for which the prop-name has to be set. @@ -2047,6 +2076,36 @@ put_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   * @dev: Device for which clk name is being set. @@ -2119,6 +2178,33 @@ void dev_pm_opp_put_clkname(struct 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); +} + +/** + * 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. + */ +int devm_pm_opp_set_clkname(struct device *dev, const char *name) +{ +	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); +} +EXPORT_SYMBOL_GPL(devm_pm_opp_set_clkname); +  /**   * dev_pm_opp_register_set_opp_helper() - Register custom set OPP helper   * @dev: Device for which the helper is getting registered. @@ -2209,25 +2295,19 @@ static void devm_pm_opp_unregister_set_opp_helper(void *data)   *   * This is a resource-managed version of dev_pm_opp_register_set_opp_helper().   * - * Return: pointer to 'struct opp_table' on success and errorno otherwise. + * Return: 0 on success and errorno otherwise.   */ -struct opp_table * -devm_pm_opp_register_set_opp_helper(struct device *dev, -				    int (*set_opp)(struct dev_pm_set_opp_data *data)) +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; -	int err;  	opp_table = dev_pm_opp_register_set_opp_helper(dev, set_opp);  	if (IS_ERR(opp_table)) -		return opp_table; - -	err = devm_add_action_or_reset(dev, devm_pm_opp_unregister_set_opp_helper, -				       opp_table); -	if (err) -		return ERR_PTR(err); +		return PTR_ERR(opp_table); -	return opp_table; +	return devm_add_action_or_reset(dev, devm_pm_opp_unregister_set_opp_helper, +					opp_table);  }  EXPORT_SYMBOL_GPL(devm_pm_opp_register_set_opp_helper); @@ -2380,25 +2460,19 @@ static void devm_pm_opp_detach_genpd(void *data)   *   * This is a resource-managed version of dev_pm_opp_attach_genpd().   * - * Return: pointer to 'struct opp_table' on success and errorno otherwise. + * Return: 0 on success and errorno otherwise.   */ -struct opp_table * -devm_pm_opp_attach_genpd(struct device *dev, const char **names, -			 struct device ***virt_devs) +int devm_pm_opp_attach_genpd(struct device *dev, const char **names, +			     struct device ***virt_devs)  {  	struct opp_table *opp_table; -	int err;  	opp_table = dev_pm_opp_attach_genpd(dev, names, virt_devs);  	if (IS_ERR(opp_table)) -		return opp_table; - -	err = devm_add_action_or_reset(dev, devm_pm_opp_detach_genpd, -				       opp_table); -	if (err) -		return ERR_PTR(err); +		return PTR_ERR(opp_table); -	return opp_table; +	return devm_add_action_or_reset(dev, devm_pm_opp_detach_genpd, +					opp_table);  }  EXPORT_SYMBOL_GPL(devm_pm_opp_attach_genpd); | 
