Commit 1a9c069c authored by Stephen Boyd's avatar Stephen Boyd Committed by Michael Turquette

clk: Add clk_hw_*() APIs for use by clk providers

clk providers shouldn't need to use the consumer APIs (clk.h).
Add provider APIs to replace the __clk_*() APIs that take a
struct clk_hw as their first argument instead of a struct clk.
Signed-off-by: default avatarStephen Boyd <sboyd@codeaurora.org>
parent bea047e0
...@@ -278,6 +278,12 @@ const char *__clk_get_name(struct clk *clk) ...@@ -278,6 +278,12 @@ const char *__clk_get_name(struct clk *clk)
} }
EXPORT_SYMBOL_GPL(__clk_get_name); EXPORT_SYMBOL_GPL(__clk_get_name);
const char *clk_hw_get_name(struct clk_hw *hw)
{
return hw->core->name;
}
EXPORT_SYMBOL_GPL(clk_hw_get_name);
struct clk_hw *__clk_get_hw(struct clk *clk) struct clk_hw *__clk_get_hw(struct clk *clk)
{ {
return !clk ? NULL : clk->core->hw; return !clk ? NULL : clk->core->hw;
...@@ -290,6 +296,12 @@ u8 __clk_get_num_parents(struct clk *clk) ...@@ -290,6 +296,12 @@ u8 __clk_get_num_parents(struct clk *clk)
} }
EXPORT_SYMBOL_GPL(__clk_get_num_parents); EXPORT_SYMBOL_GPL(__clk_get_num_parents);
unsigned int clk_hw_get_num_parents(struct clk_hw *hw)
{
return hw->core->num_parents;
}
EXPORT_SYMBOL_GPL(clk_hw_get_num_parents);
struct clk *__clk_get_parent(struct clk *clk) struct clk *__clk_get_parent(struct clk *clk)
{ {
if (!clk) if (!clk)
...@@ -300,6 +312,12 @@ struct clk *__clk_get_parent(struct clk *clk) ...@@ -300,6 +312,12 @@ struct clk *__clk_get_parent(struct clk *clk)
} }
EXPORT_SYMBOL_GPL(__clk_get_parent); EXPORT_SYMBOL_GPL(__clk_get_parent);
struct clk_hw *clk_hw_get_parent(struct clk_hw *hw)
{
return hw->core->parent ? hw->core->parent->hw : NULL;
}
EXPORT_SYMBOL_GPL(clk_hw_get_parent);
static struct clk_core *__clk_lookup_subtree(const char *name, static struct clk_core *__clk_lookup_subtree(const char *name,
struct clk_core *core) struct clk_core *core)
{ {
...@@ -370,6 +388,16 @@ struct clk *clk_get_parent_by_index(struct clk *clk, u8 index) ...@@ -370,6 +388,16 @@ struct clk *clk_get_parent_by_index(struct clk *clk, u8 index)
} }
EXPORT_SYMBOL_GPL(clk_get_parent_by_index); EXPORT_SYMBOL_GPL(clk_get_parent_by_index);
struct clk_hw *clk_hw_get_parent_by_index(struct clk_hw *hw, unsigned int index)
{
struct clk_core *parent;
parent = clk_core_get_parent_by_index(hw->core, index);
return !parent ? NULL : parent->hw;
}
EXPORT_SYMBOL_GPL(clk_hw_get_parent_by_index);
unsigned int __clk_get_enable_count(struct clk *clk) unsigned int __clk_get_enable_count(struct clk *clk)
{ {
return !clk ? 0 : clk->core->enable_count; return !clk ? 0 : clk->core->enable_count;
...@@ -405,6 +433,12 @@ unsigned long __clk_get_rate(struct clk *clk) ...@@ -405,6 +433,12 @@ unsigned long __clk_get_rate(struct clk *clk)
} }
EXPORT_SYMBOL_GPL(__clk_get_rate); EXPORT_SYMBOL_GPL(__clk_get_rate);
unsigned long clk_hw_get_rate(struct clk_hw *hw)
{
return clk_core_get_rate_nolock(hw->core);
}
EXPORT_SYMBOL_GPL(clk_hw_get_rate);
static unsigned long __clk_get_accuracy(struct clk_core *core) static unsigned long __clk_get_accuracy(struct clk_core *core)
{ {
if (!core) if (!core)
...@@ -419,6 +453,12 @@ unsigned long __clk_get_flags(struct clk *clk) ...@@ -419,6 +453,12 @@ unsigned long __clk_get_flags(struct clk *clk)
} }
EXPORT_SYMBOL_GPL(__clk_get_flags); EXPORT_SYMBOL_GPL(__clk_get_flags);
unsigned long clk_hw_get_flags(struct clk_hw *hw)
{
return hw->core->flags;
}
EXPORT_SYMBOL_GPL(clk_hw_get_flags);
bool __clk_is_prepared(struct clk *clk) bool __clk_is_prepared(struct clk *clk)
{ {
if (!clk) if (!clk)
...@@ -427,6 +467,11 @@ bool __clk_is_prepared(struct clk *clk) ...@@ -427,6 +467,11 @@ bool __clk_is_prepared(struct clk *clk)
return clk_core_is_prepared(clk->core); return clk_core_is_prepared(clk->core);
} }
bool clk_hw_is_prepared(struct clk_hw *hw)
{
return clk_core_is_prepared(hw->core);
}
bool __clk_is_enabled(struct clk *clk) bool __clk_is_enabled(struct clk *clk)
{ {
if (!clk) if (!clk)
...@@ -861,6 +906,22 @@ unsigned long __clk_round_rate(struct clk *clk, unsigned long rate) ...@@ -861,6 +906,22 @@ unsigned long __clk_round_rate(struct clk *clk, unsigned long rate)
} }
EXPORT_SYMBOL_GPL(__clk_round_rate); EXPORT_SYMBOL_GPL(__clk_round_rate);
unsigned long clk_hw_round_rate(struct clk_hw *hw, unsigned long rate)
{
int ret;
struct clk_rate_request req;
clk_core_get_boundaries(hw->core, &req.min_rate, &req.max_rate);
req.rate = rate;
ret = clk_core_round_rate_nolock(hw->core, &req);
if (ret)
return 0;
return req.rate;
}
EXPORT_SYMBOL_GPL(clk_hw_round_rate);
/** /**
* clk_round_rate - round the given rate for a clk * clk_round_rate - round the given rate for a clk
* @clk: the clk for which we are rounding a rate * @clk: the clk for which we are rounding a rate
......
...@@ -607,14 +607,22 @@ void devm_clk_unregister(struct device *dev, struct clk *clk); ...@@ -607,14 +607,22 @@ void devm_clk_unregister(struct device *dev, struct clk *clk);
/* helper functions */ /* helper functions */
const char *__clk_get_name(struct clk *clk); const char *__clk_get_name(struct clk *clk);
const char *clk_hw_get_name(struct clk_hw *hw);
struct clk_hw *__clk_get_hw(struct clk *clk); struct clk_hw *__clk_get_hw(struct clk *clk);
u8 __clk_get_num_parents(struct clk *clk); u8 __clk_get_num_parents(struct clk *clk);
unsigned int clk_hw_get_num_parents(struct clk_hw *hw);
struct clk *__clk_get_parent(struct clk *clk); struct clk *__clk_get_parent(struct clk *clk);
struct clk_hw *clk_hw_get_parent(struct clk_hw *hw);
struct clk *clk_get_parent_by_index(struct clk *clk, u8 index); struct clk *clk_get_parent_by_index(struct clk *clk, u8 index);
struct clk_hw *clk_hw_get_parent_by_index(struct clk_hw *hw,
unsigned int index);
unsigned int __clk_get_enable_count(struct clk *clk); unsigned int __clk_get_enable_count(struct clk *clk);
unsigned long __clk_get_rate(struct clk *clk); unsigned long __clk_get_rate(struct clk *clk);
unsigned long clk_hw_get_rate(struct clk_hw *hw);
unsigned long __clk_get_flags(struct clk *clk); unsigned long __clk_get_flags(struct clk *clk);
unsigned long clk_hw_get_flags(struct clk_hw *hw);
bool __clk_is_prepared(struct clk *clk); bool __clk_is_prepared(struct clk *clk);
bool clk_hw_is_prepared(struct clk_hw *hw);
bool __clk_is_enabled(struct clk *clk); bool __clk_is_enabled(struct clk *clk);
struct clk *__clk_lookup(const char *name); struct clk *__clk_lookup(const char *name);
int __clk_mux_determine_rate(struct clk_hw *hw, int __clk_mux_determine_rate(struct clk_hw *hw,
...@@ -636,6 +644,7 @@ static inline void __clk_hw_set_clk(struct clk_hw *dst, struct clk_hw *src) ...@@ -636,6 +644,7 @@ static inline void __clk_hw_set_clk(struct clk_hw *dst, struct clk_hw *src)
* FIXME clock api without lock protection * FIXME clock api without lock protection
*/ */
unsigned long __clk_round_rate(struct clk *clk, unsigned long rate); unsigned long __clk_round_rate(struct clk *clk, unsigned long rate);
unsigned long clk_hw_round_rate(struct clk_hw *hw, unsigned long rate);
struct of_device_id; struct of_device_id;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment