diff options
Diffstat (limited to 'drivers/opp/of.c')
| -rw-r--r-- | drivers/opp/of.c | 36 | 
1 files changed, 36 insertions, 0 deletions
| diff --git a/drivers/opp/of.c b/drivers/opp/of.c index f480c10e6314..c582a9ca397b 100644 --- a/drivers/opp/of.c +++ b/drivers/opp/of.c @@ -1104,6 +1104,42 @@ static int _of_add_table_indexed(struct device *dev, int index, bool getclk)  	return ret;  } +static void devm_pm_opp_of_table_release(void *data) +{ +	dev_pm_opp_of_remove_table(data); +} + +/** + * devm_pm_opp_of_add_table() - Initialize opp table from device tree + * @dev:	device pointer used to lookup OPP table. + * + * Register the initial OPP table with the OPP library for given device. + * + * The opp_table structure will be freed after the device is destroyed. + * + * Return: + * 0		On success OR + *		Duplicate OPPs (both freq and volt are same) and opp->available + * -EEXIST	Freq are same and volt are different OR + *		Duplicate OPPs (both freq and volt are same) and !opp->available + * -ENOMEM	Memory allocation failure + * -ENODEV	when 'operating-points' property is not found or is invalid data + *		in device node. + * -ENODATA	when empty 'operating-points' property is found + * -EINVAL	when invalid entries are found in opp-v2 table + */ +int devm_pm_opp_of_add_table(struct device *dev) +{ +	int ret; + +	ret = dev_pm_opp_of_add_table(dev); +	if (ret) +		return ret; + +	return devm_add_action_or_reset(dev, devm_pm_opp_of_table_release, dev); +} +EXPORT_SYMBOL_GPL(devm_pm_opp_of_add_table); +  /**   * dev_pm_opp_of_add_table() - Initialize opp table from device tree   * @dev:	device pointer used to lookup OPP table. | 
