mirror of https://gitee.com/openkylin/linux.git
clk: composite: add devm_clk_hw_register_composite_pdata()
This will simplify drivers which would only unregister the clk in their remove() op. Signed-off-by: Michael Walle <michael@walle.cc> Link: https://lore.kernel.org/r/20201105192746.19564-3-michael@walle.cc Signed-off-by: Stephen Boyd <sboyd@kernel.org>
This commit is contained in:
parent
e81bed419f
commit
0eba770790
|
@ -4,6 +4,7 @@
|
|||
*/
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
|
@ -405,3 +406,52 @@ void clk_hw_unregister_composite(struct clk_hw *hw)
|
|||
kfree(composite);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(clk_hw_unregister_composite);
|
||||
|
||||
static void devm_clk_hw_release_composite(struct device *dev, void *res)
|
||||
{
|
||||
clk_hw_unregister_composite(*(struct clk_hw **)res);
|
||||
}
|
||||
|
||||
static struct clk_hw *__devm_clk_hw_register_composite(struct device *dev,
|
||||
const char *name, const char * const *parent_names,
|
||||
const struct clk_parent_data *pdata, int num_parents,
|
||||
struct clk_hw *mux_hw, const struct clk_ops *mux_ops,
|
||||
struct clk_hw *rate_hw, const struct clk_ops *rate_ops,
|
||||
struct clk_hw *gate_hw, const struct clk_ops *gate_ops,
|
||||
unsigned long flags)
|
||||
{
|
||||
struct clk_hw **ptr, *hw;
|
||||
|
||||
ptr = devres_alloc(devm_clk_hw_release_composite, sizeof(*ptr),
|
||||
GFP_KERNEL);
|
||||
if (!ptr)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
hw = __clk_hw_register_composite(dev, name, parent_names, pdata,
|
||||
num_parents, mux_hw, mux_ops, rate_hw,
|
||||
rate_ops, gate_hw, gate_ops, flags);
|
||||
|
||||
if (!IS_ERR(hw)) {
|
||||
*ptr = hw;
|
||||
devres_add(dev, ptr);
|
||||
} else {
|
||||
devres_free(ptr);
|
||||
}
|
||||
|
||||
return hw;
|
||||
}
|
||||
|
||||
struct clk_hw *devm_clk_hw_register_composite_pdata(struct device *dev,
|
||||
const char *name,
|
||||
const struct clk_parent_data *parent_data,
|
||||
int num_parents,
|
||||
struct clk_hw *mux_hw, const struct clk_ops *mux_ops,
|
||||
struct clk_hw *rate_hw, const struct clk_ops *rate_ops,
|
||||
struct clk_hw *gate_hw, const struct clk_ops *gate_ops,
|
||||
unsigned long flags)
|
||||
{
|
||||
return __devm_clk_hw_register_composite(dev, name, NULL, parent_data,
|
||||
num_parents, mux_hw, mux_ops,
|
||||
rate_hw, rate_ops, gate_hw,
|
||||
gate_ops, flags);
|
||||
}
|
||||
|
|
|
@ -1062,6 +1062,13 @@ struct clk_hw *clk_hw_register_composite_pdata(struct device *dev,
|
|||
struct clk_hw *rate_hw, const struct clk_ops *rate_ops,
|
||||
struct clk_hw *gate_hw, const struct clk_ops *gate_ops,
|
||||
unsigned long flags);
|
||||
struct clk_hw *devm_clk_hw_register_composite_pdata(struct device *dev,
|
||||
const char *name, const struct clk_parent_data *parent_data,
|
||||
int num_parents,
|
||||
struct clk_hw *mux_hw, const struct clk_ops *mux_ops,
|
||||
struct clk_hw *rate_hw, const struct clk_ops *rate_ops,
|
||||
struct clk_hw *gate_hw, const struct clk_ops *gate_ops,
|
||||
unsigned long flags);
|
||||
void clk_hw_unregister_composite(struct clk_hw *hw);
|
||||
|
||||
struct clk *clk_register(struct device *dev, struct clk_hw *hw);
|
||||
|
|
Loading…
Reference in New Issue