Wrap icc_clk_register to create devm_icc_clk_register to be able to release the resources properly. Signed-off-by: Varadarajan Narayanan <quic_varada@xxxxxxxxxxx> --- v5: Introduced devm_icc_clk_register --- drivers/interconnect/icc-clk.c | 29 +++++++++++++++++++++++++++++ include/linux/interconnect-clk.h | 4 ++++ 2 files changed, 33 insertions(+) diff --git a/drivers/interconnect/icc-clk.c b/drivers/interconnect/icc-clk.c index d787f2ea36d9..89f11fed8820 100644 --- a/drivers/interconnect/icc-clk.c +++ b/drivers/interconnect/icc-clk.c @@ -148,6 +148,35 @@ struct icc_provider *icc_clk_register(struct device *dev, } EXPORT_SYMBOL_GPL(icc_clk_register); +static void devm_icc_release(struct device *dev, void *res) +{ + icc_clk_unregister(res); +} + +struct icc_provider *devm_icc_clk_register(struct device *dev, + unsigned int first_id, + unsigned int num_clocks, + const struct icc_clk_data *data) +{ + struct icc_provider *prov, **provp; + + provp = devres_alloc(devm_icc_release, sizeof(*provp), GFP_KERNEL); + if (!provp) + return ERR_PTR(-ENOMEM); + + prov = icc_clk_register(dev, first_id, num_clocks, data); + + if (!IS_ERR(prov)) { + *provp = prov; + devres_add(dev, provp); + } else { + devres_free(provp); + } + + return prov; +} +EXPORT_SYMBOL_GPL(devm_icc_clk_register); + /** * icc_clk_unregister() - unregister a previously registered clk interconnect provider * @provider: provider returned by icc_clk_register() diff --git a/include/linux/interconnect-clk.h b/include/linux/interconnect-clk.h index 0cd80112bea5..cb7b648eb1c0 100644 --- a/include/linux/interconnect-clk.h +++ b/include/linux/interconnect-clk.h @@ -17,6 +17,10 @@ struct icc_provider *icc_clk_register(struct device *dev, unsigned int first_id, unsigned int num_clocks, const struct icc_clk_data *data); +struct icc_provider *devm_icc_clk_register(struct device *dev, + unsigned int first_id, + unsigned int num_clocks, + const struct icc_clk_data *data); void icc_clk_unregister(struct icc_provider *provider); #endif -- 2.34.1