123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- From 815f0e738a8d5663a02350e2580706829144a722 Mon Sep 17 00:00:00 2001
- From: Horatiu Vultur <[email protected]>
- Date: Wed, 3 Nov 2021 09:50:59 +0100
- Subject: [PATCH] clk: gate: Add devm_clk_hw_register_gate()
- Add devm_clk_hw_register_gate() - devres-managed version of
- clk_hw_register_gate()
- Suggested-by: Stephen Boyd <[email protected]>
- Signed-off-by: Horatiu Vultur <[email protected]>
- Acked-by: Nicolas Ferre <[email protected]>
- Signed-off-by: Nicolas Ferre <[email protected]>
- Link: https://lore.kernel.org/r/[email protected]
- ---
- drivers/clk/clk-gate.c | 35 +++++++++++++++++++++++++++++++++++
- include/linux/clk-provider.h | 23 +++++++++++++++++++++++
- 2 files changed, 58 insertions(+)
- --- a/drivers/clk/clk-gate.c
- +++ b/drivers/clk/clk-gate.c
- @@ -7,6 +7,7 @@
- */
-
- #include <linux/clk-provider.h>
- +#include <linux/device.h>
- #include <linux/module.h>
- #include <linux/slab.h>
- #include <linux/io.h>
- @@ -222,3 +223,37 @@ void clk_hw_unregister_gate(struct clk_h
- kfree(gate);
- }
- EXPORT_SYMBOL_GPL(clk_hw_unregister_gate);
- +
- +static void devm_clk_hw_release_gate(struct device *dev, void *res)
- +{
- + clk_hw_unregister_gate(*(struct clk_hw **)res);
- +}
- +
- +struct clk_hw *__devm_clk_hw_register_gate(struct device *dev,
- + struct device_node *np, const char *name,
- + const char *parent_name, const struct clk_hw *parent_hw,
- + const struct clk_parent_data *parent_data,
- + unsigned long flags,
- + void __iomem *reg, u8 bit_idx,
- + u8 clk_gate_flags, spinlock_t *lock)
- +{
- + struct clk_hw **ptr, *hw;
- +
- + ptr = devres_alloc(devm_clk_hw_release_gate, sizeof(*ptr), GFP_KERNEL);
- + if (!ptr)
- + return ERR_PTR(-ENOMEM);
- +
- + hw = __clk_hw_register_gate(dev, np, name, parent_name, parent_hw,
- + parent_data, flags, reg, bit_idx,
- + clk_gate_flags, lock);
- +
- + if (!IS_ERR(hw)) {
- + *ptr = hw;
- + devres_add(dev, ptr);
- + } else {
- + devres_free(ptr);
- + }
- +
- + return hw;
- +}
- +EXPORT_SYMBOL_GPL(__devm_clk_hw_register_gate);
- --- a/include/linux/clk-provider.h
- +++ b/include/linux/clk-provider.h
- @@ -517,6 +517,13 @@ struct clk_hw *__clk_hw_register_gate(st
- unsigned long flags,
- void __iomem *reg, u8 bit_idx,
- u8 clk_gate_flags, spinlock_t *lock);
- +struct clk_hw *__devm_clk_hw_register_gate(struct device *dev,
- + struct device_node *np, const char *name,
- + const char *parent_name, const struct clk_hw *parent_hw,
- + const struct clk_parent_data *parent_data,
- + unsigned long flags,
- + void __iomem *reg, u8 bit_idx,
- + u8 clk_gate_flags, spinlock_t *lock);
- struct clk *clk_register_gate(struct device *dev, const char *name,
- const char *parent_name, unsigned long flags,
- void __iomem *reg, u8 bit_idx,
- @@ -571,6 +578,22 @@ struct clk *clk_register_gate(struct dev
- __clk_hw_register_gate((dev), NULL, (name), NULL, NULL, (parent_data), \
- (flags), (reg), (bit_idx), \
- (clk_gate_flags), (lock))
- +/**
- + * devm_clk_hw_register_gate - register a gate clock with the clock framework
- + * @dev: device that is registering this clock
- + * @name: name of this clock
- + * @parent_name: name of this clock's parent
- + * @flags: framework-specific flags for this clock
- + * @reg: register address to control gating of this clock
- + * @bit_idx: which bit in the register controls gating of this clock
- + * @clk_gate_flags: gate-specific flags for this clock
- + * @lock: shared register lock for this clock
- + */
- +#define devm_clk_hw_register_gate(dev, name, parent_name, flags, reg, bit_idx,\
- + clk_gate_flags, lock) \
- + __devm_clk_hw_register_gate((dev), NULL, (name), (parent_name), NULL, \
- + NULL, (flags), (reg), (bit_idx), \
- + (clk_gate_flags), (lock))
- void clk_unregister_gate(struct clk *clk);
- void clk_hw_unregister_gate(struct clk_hw *hw);
- int clk_gate_is_enabled(struct clk_hw *hw);
|