|
@@ -283,10 +283,17 @@ extern const struct clk_ops clk_fixed_rate_ops;
|
|
|
struct clk *clk_register_fixed_rate(struct device *dev, const char *name,
|
|
|
const char *parent_name, unsigned long flags,
|
|
|
unsigned long fixed_rate);
|
|
|
+struct clk_hw *clk_hw_register_fixed_rate(struct device *dev, const char *name,
|
|
|
+ const char *parent_name, unsigned long flags,
|
|
|
+ unsigned long fixed_rate);
|
|
|
struct clk *clk_register_fixed_rate_with_accuracy(struct device *dev,
|
|
|
const char *name, const char *parent_name, unsigned long flags,
|
|
|
unsigned long fixed_rate, unsigned long fixed_accuracy);
|
|
|
void clk_unregister_fixed_rate(struct clk *clk);
|
|
|
+struct clk_hw *clk_hw_register_fixed_rate_with_accuracy(struct device *dev,
|
|
|
+ const char *name, const char *parent_name, unsigned long flags,
|
|
|
+ unsigned long fixed_rate, unsigned long fixed_accuracy);
|
|
|
+
|
|
|
void of_fixed_clk_setup(struct device_node *np);
|
|
|
|
|
|
/**
|
|
@@ -327,7 +334,12 @@ struct clk *clk_register_gate(struct device *dev, const char *name,
|
|
|
const char *parent_name, unsigned long flags,
|
|
|
void __iomem *reg, u8 bit_idx,
|
|
|
u8 clk_gate_flags, spinlock_t *lock);
|
|
|
+struct clk_hw *clk_hw_register_gate(struct device *dev, const char *name,
|
|
|
+ const char *parent_name, unsigned long flags,
|
|
|
+ void __iomem *reg, u8 bit_idx,
|
|
|
+ u8 clk_gate_flags, spinlock_t *lock);
|
|
|
void clk_unregister_gate(struct clk *clk);
|
|
|
+void clk_hw_unregister_gate(struct clk_hw *hw);
|
|
|
|
|
|
struct clk_div_table {
|
|
|
unsigned int val;
|
|
@@ -408,12 +420,22 @@ struct clk *clk_register_divider(struct device *dev, const char *name,
|
|
|
const char *parent_name, unsigned long flags,
|
|
|
void __iomem *reg, u8 shift, u8 width,
|
|
|
u8 clk_divider_flags, spinlock_t *lock);
|
|
|
+struct clk_hw *clk_hw_register_divider(struct device *dev, const char *name,
|
|
|
+ const char *parent_name, unsigned long flags,
|
|
|
+ void __iomem *reg, u8 shift, u8 width,
|
|
|
+ u8 clk_divider_flags, spinlock_t *lock);
|
|
|
struct clk *clk_register_divider_table(struct device *dev, const char *name,
|
|
|
const char *parent_name, unsigned long flags,
|
|
|
void __iomem *reg, u8 shift, u8 width,
|
|
|
u8 clk_divider_flags, const struct clk_div_table *table,
|
|
|
spinlock_t *lock);
|
|
|
+struct clk_hw *clk_hw_register_divider_table(struct device *dev,
|
|
|
+ const char *name, const char *parent_name, unsigned long flags,
|
|
|
+ void __iomem *reg, u8 shift, u8 width,
|
|
|
+ u8 clk_divider_flags, const struct clk_div_table *table,
|
|
|
+ spinlock_t *lock);
|
|
|
void clk_unregister_divider(struct clk *clk);
|
|
|
+void clk_hw_unregister_divider(struct clk_hw *hw);
|
|
|
|
|
|
/**
|
|
|
* struct clk_mux - multiplexer clock
|
|
@@ -464,14 +486,25 @@ struct clk *clk_register_mux(struct device *dev, const char *name,
|
|
|
unsigned long flags,
|
|
|
void __iomem *reg, u8 shift, u8 width,
|
|
|
u8 clk_mux_flags, spinlock_t *lock);
|
|
|
+struct clk_hw *clk_hw_register_mux(struct device *dev, const char *name,
|
|
|
+ const char * const *parent_names, u8 num_parents,
|
|
|
+ unsigned long flags,
|
|
|
+ void __iomem *reg, u8 shift, u8 width,
|
|
|
+ u8 clk_mux_flags, 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,
|
|
|
u8 clk_mux_flags, u32 *table, spinlock_t *lock);
|
|
|
+struct clk_hw *clk_hw_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,
|
|
|
+ u8 clk_mux_flags, u32 *table, spinlock_t *lock);
|
|
|
|
|
|
void clk_unregister_mux(struct clk *clk);
|
|
|
+void clk_hw_unregister_mux(struct clk_hw *hw);
|
|
|
|
|
|
void of_fixed_factor_clk_setup(struct device_node *node);
|
|
|
|
|
@@ -500,6 +533,10 @@ struct clk *clk_register_fixed_factor(struct device *dev, const char *name,
|
|
|
const char *parent_name, unsigned long flags,
|
|
|
unsigned int mult, unsigned int div);
|
|
|
void clk_unregister_fixed_factor(struct clk *clk);
|
|
|
+struct clk_hw *clk_hw_register_fixed_factor(struct device *dev,
|
|
|
+ const char *name, const char *parent_name, unsigned long flags,
|
|
|
+ unsigned int mult, unsigned int div);
|
|
|
+void clk_hw_unregister_fixed_factor(struct clk_hw *hw);
|
|
|
|
|
|
/**
|
|
|
* struct clk_fractional_divider - adjustable fractional divider clock
|
|
@@ -534,6 +571,11 @@ struct clk *clk_register_fractional_divider(struct device *dev,
|
|
|
const char *name, const char *parent_name, unsigned long flags,
|
|
|
void __iomem *reg, u8 mshift, u8 mwidth, u8 nshift, u8 nwidth,
|
|
|
u8 clk_divider_flags, spinlock_t *lock);
|
|
|
+struct clk_hw *clk_hw_register_fractional_divider(struct device *dev,
|
|
|
+ const char *name, const char *parent_name, unsigned long flags,
|
|
|
+ void __iomem *reg, u8 mshift, u8 mwidth, u8 nshift, u8 nwidth,
|
|
|
+ u8 clk_divider_flags, spinlock_t *lock);
|
|
|
+void clk_hw_unregister_fractional_divider(struct clk_hw *hw);
|
|
|
|
|
|
/**
|
|
|
* struct clk_multiplier - adjustable multiplier clock
|
|
@@ -605,6 +647,13 @@ struct clk *clk_register_composite(struct device *dev, const char *name,
|
|
|
struct clk_hw *gate_hw, const struct clk_ops *gate_ops,
|
|
|
unsigned long flags);
|
|
|
void clk_unregister_composite(struct clk *clk);
|
|
|
+struct clk_hw *clk_hw_register_composite(struct device *dev, const char *name,
|
|
|
+ const char * const *parent_names, 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_gpio_gate - gpio gated clock
|
|
@@ -627,6 +676,10 @@ extern const struct clk_ops clk_gpio_gate_ops;
|
|
|
struct clk *clk_register_gpio_gate(struct device *dev, const char *name,
|
|
|
const char *parent_name, unsigned gpio, bool active_low,
|
|
|
unsigned long flags);
|
|
|
+struct clk_hw *clk_hw_register_gpio_gate(struct device *dev, const char *name,
|
|
|
+ const char *parent_name, unsigned gpio, bool active_low,
|
|
|
+ unsigned long flags);
|
|
|
+void clk_hw_unregister_gpio_gate(struct clk_hw *hw);
|
|
|
|
|
|
/**
|
|
|
* struct clk_gpio_mux - gpio controlled clock multiplexer
|
|
@@ -642,6 +695,10 @@ extern const struct clk_ops clk_gpio_mux_ops;
|
|
|
struct clk *clk_register_gpio_mux(struct device *dev, const char *name,
|
|
|
const char * const *parent_names, u8 num_parents, unsigned gpio,
|
|
|
bool active_low, unsigned long flags);
|
|
|
+struct clk_hw *clk_hw_register_gpio_mux(struct device *dev, const char *name,
|
|
|
+ const char * const *parent_names, u8 num_parents, unsigned gpio,
|
|
|
+ bool active_low, unsigned long flags);
|
|
|
+void clk_hw_unregister_gpio_mux(struct clk_hw *hw);
|
|
|
|
|
|
/**
|
|
|
* clk_register - allocate a new clock, register it and return an opaque cookie
|
|
@@ -657,9 +714,15 @@ struct clk *clk_register_gpio_mux(struct device *dev, const char *name,
|
|
|
struct clk *clk_register(struct device *dev, struct clk_hw *hw);
|
|
|
struct clk *devm_clk_register(struct device *dev, struct clk_hw *hw);
|
|
|
|
|
|
+int __must_check clk_hw_register(struct device *dev, struct clk_hw *hw);
|
|
|
+int __must_check devm_clk_hw_register(struct device *dev, struct clk_hw *hw);
|
|
|
+
|
|
|
void clk_unregister(struct clk *clk);
|
|
|
void devm_clk_unregister(struct device *dev, struct clk *clk);
|
|
|
|
|
|
+void clk_hw_unregister(struct clk_hw *hw);
|
|
|
+void devm_clk_hw_unregister(struct device *dev, struct clk_hw *hw);
|
|
|
+
|
|
|
/* helper functions */
|
|
|
const char *__clk_get_name(const struct clk *clk);
|
|
|
const char *clk_hw_get_name(const struct clk_hw *hw);
|
|
@@ -705,6 +768,11 @@ struct clk_onecell_data {
|
|
|
unsigned int clk_num;
|
|
|
};
|
|
|
|
|
|
+struct clk_hw_onecell_data {
|
|
|
+ size_t num;
|
|
|
+ struct clk_hw *hws[];
|
|
|
+};
|
|
|
+
|
|
|
extern struct of_device_id __clk_of_table;
|
|
|
|
|
|
#define CLK_OF_DECLARE(name, compat, fn) OF_DECLARE_1(clk, name, compat, fn)
|
|
@@ -714,10 +782,18 @@ int of_clk_add_provider(struct device_node *np,
|
|
|
struct clk *(*clk_src_get)(struct of_phandle_args *args,
|
|
|
void *data),
|
|
|
void *data);
|
|
|
+int of_clk_add_hw_provider(struct device_node *np,
|
|
|
+ struct clk_hw *(*get)(struct of_phandle_args *clkspec,
|
|
|
+ void *data),
|
|
|
+ void *data);
|
|
|
void of_clk_del_provider(struct device_node *np);
|
|
|
struct clk *of_clk_src_simple_get(struct of_phandle_args *clkspec,
|
|
|
void *data);
|
|
|
+struct clk_hw *of_clk_hw_simple_get(struct of_phandle_args *clkspec,
|
|
|
+ void *data);
|
|
|
struct clk *of_clk_src_onecell_get(struct of_phandle_args *clkspec, void *data);
|
|
|
+struct clk_hw *of_clk_hw_onecell_get(struct of_phandle_args *clkspec,
|
|
|
+ void *data);
|
|
|
unsigned int of_clk_get_parent_count(struct device_node *np);
|
|
|
int of_clk_parent_fill(struct device_node *np, const char **parents,
|
|
|
unsigned int size);
|
|
@@ -735,17 +811,34 @@ static inline int of_clk_add_provider(struct device_node *np,
|
|
|
{
|
|
|
return 0;
|
|
|
}
|
|
|
+static inline int of_clk_add_hw_provider(struct device_node *np,
|
|
|
+ struct clk_hw *(*get)(struct of_phandle_args *clkspec,
|
|
|
+ void *data),
|
|
|
+ void *data)
|
|
|
+{
|
|
|
+ return 0;
|
|
|
+}
|
|
|
static inline void of_clk_del_provider(struct device_node *np) {}
|
|
|
static inline struct clk *of_clk_src_simple_get(
|
|
|
struct of_phandle_args *clkspec, void *data)
|
|
|
{
|
|
|
return ERR_PTR(-ENOENT);
|
|
|
}
|
|
|
+static inline struct clk_hw *
|
|
|
+of_clk_hw_simple_get(struct of_phandle_args *clkspec, void *data)
|
|
|
+{
|
|
|
+ return ERR_PTR(-ENOENT);
|
|
|
+}
|
|
|
static inline struct clk *of_clk_src_onecell_get(
|
|
|
struct of_phandle_args *clkspec, void *data)
|
|
|
{
|
|
|
return ERR_PTR(-ENOENT);
|
|
|
}
|
|
|
+static inline struct clk_hw *
|
|
|
+of_clk_hw_onecell_get(struct of_phandle_args *clkspec, void *data)
|
|
|
+{
|
|
|
+ return ERR_PTR(-ENOENT);
|
|
|
+}
|
|
|
static inline int of_clk_get_parent_count(struct device_node *np)
|
|
|
{
|
|
|
return 0;
|