Message ID | 20210324151846.2774204-3-dmitry.baryshkov@linaro.org (mailing list archive) |
---|---|
State | Superseded, archived |
Headers | show |
Series | [v2,01/28] clk: fixed: add devm helper for clk_hw_register_fixed_factor() | expand |
On 2021-03-24 08:18, Dmitry Baryshkov wrote: > Add devm_clk_hw_register_mux() - devres-managed version of > clk_hw_register_mux(). > > Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> Reviewed-by: Abhinav Kumar <abhinavk@codeaurora.org> > --- > drivers/clk/clk-mux.c | 35 +++++++++++++++++++++++++++++++++++ > include/linux/clk-provider.h | 13 +++++++++++++ > 2 files changed, 48 insertions(+) > > diff --git a/drivers/clk/clk-mux.c b/drivers/clk/clk-mux.c > index e54e79714818..20582aae7a35 100644 > --- a/drivers/clk/clk-mux.c > +++ b/drivers/clk/clk-mux.c > @@ -8,6 +8,7 @@ > */ > > #include <linux/clk-provider.h> > +#include <linux/device.h> > #include <linux/module.h> > #include <linux/slab.h> > #include <linux/io.h> > @@ -206,6 +207,40 @@ struct clk_hw *__clk_hw_register_mux(struct > device *dev, struct device_node *np, > } > EXPORT_SYMBOL_GPL(__clk_hw_register_mux); > > +static void devm_clk_hw_release_mux(struct device *dev, void *res) > +{ > + clk_hw_unregister_mux(*(struct clk_hw **)res); > +} > + > +struct clk_hw *__devm_clk_hw_register_mux(struct device *dev, struct > device_node *np, > + const char *name, u8 num_parents, > + const char * const *parent_names, > + const struct clk_hw **parent_hws, > + const struct clk_parent_data *parent_data, > + unsigned long flags, void __iomem *reg, u8 shift, u32 mask, > + u8 clk_mux_flags, u32 *table, spinlock_t *lock) > +{ > + struct clk_hw **ptr, *hw; > + > + ptr = devres_alloc(devm_clk_hw_release_mux, sizeof(*ptr), > GFP_KERNEL); > + if (!ptr) > + return ERR_PTR(-ENOMEM); > + > + hw = __clk_hw_register_mux(dev, np, name, num_parents, parent_names, > parent_hws, > + parent_data, flags, reg, shift, mask, > + clk_mux_flags, table, lock); > + > + if (!IS_ERR(hw)) { > + *ptr = hw; > + devres_add(dev, ptr); > + } else { > + devres_free(ptr); > + } > + > + return hw; > +} > +EXPORT_SYMBOL_GPL(__devm_clk_hw_register_mux); > + > struct clk *clk_register_mux_table(struct device *dev, const char > *name, > const char * const *parent_names, u8 num_parents, > unsigned long flags, void __iomem *reg, u8 shift, u32 mask, > diff --git a/include/linux/clk-provider.h > b/include/linux/clk-provider.h > index 58f6fe866ae9..3eb15e0262f5 100644 > --- a/include/linux/clk-provider.h > +++ b/include/linux/clk-provider.h > @@ -868,6 +868,13 @@ struct clk_hw *__clk_hw_register_mux(struct > device *dev, struct device_node *np, > const struct clk_parent_data *parent_data, > unsigned long flags, void __iomem *reg, u8 shift, u32 mask, > u8 clk_mux_flags, u32 *table, spinlock_t *lock); > +struct clk_hw *__devm_clk_hw_register_mux(struct device *dev, struct > device_node *np, > + const char *name, u8 num_parents, > + const char * const *parent_names, > + const struct clk_hw **parent_hws, > + const struct clk_parent_data *parent_data, > + unsigned long flags, void __iomem *reg, u8 shift, u32 mask, > + u8 clk_mux_flags, u32 *table, spinlock_t *lock); > struct clk *clk_register_mux_table(struct device *dev, const char > *name, > const char * const *parent_names, u8 num_parents, > unsigned long flags, void __iomem *reg, u8 shift, u32 mask, > @@ -902,6 +909,12 @@ struct clk *clk_register_mux_table(struct device > *dev, const char *name, > __clk_hw_register_mux((dev), NULL, (name), (num_parents), NULL, NULL, > \ > (parent_data), (flags), (reg), (shift), \ > BIT((width)) - 1, (clk_mux_flags), NULL, (lock)) > +#define devm_clk_hw_register_mux(dev, name, parent_names, > num_parents, flags, reg, \ > + shift, width, clk_mux_flags, lock) \ > + __devm_clk_hw_register_mux((dev), NULL, (name), (num_parents), > \ > + (parent_names), NULL, NULL, (flags), (reg), \ > + (shift), BIT((width)) - 1, (clk_mux_flags), \ > + NULL, (lock)) > > int clk_mux_val_to_index(struct clk_hw *hw, u32 *table, unsigned int > flags, > unsigned int val);
diff --git a/drivers/clk/clk-mux.c b/drivers/clk/clk-mux.c index e54e79714818..20582aae7a35 100644 --- a/drivers/clk/clk-mux.c +++ b/drivers/clk/clk-mux.c @@ -8,6 +8,7 @@ */ #include <linux/clk-provider.h> +#include <linux/device.h> #include <linux/module.h> #include <linux/slab.h> #include <linux/io.h> @@ -206,6 +207,40 @@ struct clk_hw *__clk_hw_register_mux(struct device *dev, struct device_node *np, } EXPORT_SYMBOL_GPL(__clk_hw_register_mux); +static void devm_clk_hw_release_mux(struct device *dev, void *res) +{ + clk_hw_unregister_mux(*(struct clk_hw **)res); +} + +struct clk_hw *__devm_clk_hw_register_mux(struct device *dev, struct device_node *np, + const char *name, u8 num_parents, + const char * const *parent_names, + const struct clk_hw **parent_hws, + const struct clk_parent_data *parent_data, + unsigned long flags, void __iomem *reg, u8 shift, u32 mask, + u8 clk_mux_flags, u32 *table, spinlock_t *lock) +{ + struct clk_hw **ptr, *hw; + + ptr = devres_alloc(devm_clk_hw_release_mux, sizeof(*ptr), GFP_KERNEL); + if (!ptr) + return ERR_PTR(-ENOMEM); + + hw = __clk_hw_register_mux(dev, np, name, num_parents, parent_names, parent_hws, + parent_data, flags, reg, shift, mask, + clk_mux_flags, table, lock); + + if (!IS_ERR(hw)) { + *ptr = hw; + devres_add(dev, ptr); + } else { + devres_free(ptr); + } + + return hw; +} +EXPORT_SYMBOL_GPL(__devm_clk_hw_register_mux); + struct clk *clk_register_mux_table(struct device *dev, const char *name, const char * const *parent_names, u8 num_parents, unsigned long flags, void __iomem *reg, u8 shift, u32 mask, diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h index 58f6fe866ae9..3eb15e0262f5 100644 --- a/include/linux/clk-provider.h +++ b/include/linux/clk-provider.h @@ -868,6 +868,13 @@ struct clk_hw *__clk_hw_register_mux(struct device *dev, struct device_node *np, const struct clk_parent_data *parent_data, unsigned long flags, void __iomem *reg, u8 shift, u32 mask, u8 clk_mux_flags, u32 *table, spinlock_t *lock); +struct clk_hw *__devm_clk_hw_register_mux(struct device *dev, struct device_node *np, + const char *name, u8 num_parents, + const char * const *parent_names, + const struct clk_hw **parent_hws, + const struct clk_parent_data *parent_data, + unsigned long flags, void __iomem *reg, u8 shift, u32 mask, + u8 clk_mux_flags, u32 *table, spinlock_t *lock); struct clk *clk_register_mux_table(struct device *dev, const char *name, const char * const *parent_names, u8 num_parents, unsigned long flags, void __iomem *reg, u8 shift, u32 mask, @@ -902,6 +909,12 @@ struct clk *clk_register_mux_table(struct device *dev, const char *name, __clk_hw_register_mux((dev), NULL, (name), (num_parents), NULL, NULL, \ (parent_data), (flags), (reg), (shift), \ BIT((width)) - 1, (clk_mux_flags), NULL, (lock)) +#define devm_clk_hw_register_mux(dev, name, parent_names, num_parents, flags, reg, \ + shift, width, clk_mux_flags, lock) \ + __devm_clk_hw_register_mux((dev), NULL, (name), (num_parents), \ + (parent_names), NULL, NULL, (flags), (reg), \ + (shift), BIT((width)) - 1, (clk_mux_flags), \ + NULL, (lock)) int clk_mux_val_to_index(struct clk_hw *hw, u32 *table, unsigned int flags, unsigned int val);
Add devm_clk_hw_register_mux() - devres-managed version of clk_hw_register_mux(). Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> --- drivers/clk/clk-mux.c | 35 +++++++++++++++++++++++++++++++++++ include/linux/clk-provider.h | 13 +++++++++++++ 2 files changed, 48 insertions(+)