clk: Allow providers to configure min/max rates

clk providers are using the consumer APIs to set min/max rates on
the clock they're providing. To encourage clk providers to move
away from the consumer APIs, add a provider API to set the
min/max rate of a clock. The assumption is that this is done
before the clock can be requested via clk_get() and that the
clock rate is already within the boundaries of the min/max that's
configured.

Tested-by: Sudeep Holla <sudeep.holla@arm.com>
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
This commit is contained in:
Stephen Boyd 2015-07-16 12:50:27 -07:00
parent 5c757456c1
commit 9783c0d985
2 changed files with 16 additions and 2 deletions

View File

@ -58,6 +58,8 @@ struct clk_core {
unsigned long flags; unsigned long flags;
unsigned int enable_count; unsigned int enable_count;
unsigned int prepare_count; unsigned int prepare_count;
unsigned long min_rate;
unsigned long max_rate;
unsigned long accuracy; unsigned long accuracy;
int phase; int phase;
struct hlist_head children; struct hlist_head children;
@ -512,8 +514,8 @@ static void clk_core_get_boundaries(struct clk_core *core,
{ {
struct clk *clk_user; struct clk *clk_user;
*min_rate = 0; *min_rate = core->min_rate;
*max_rate = ULONG_MAX; *max_rate = core->max_rate;
hlist_for_each_entry(clk_user, &core->clks, clks_node) hlist_for_each_entry(clk_user, &core->clks, clks_node)
*min_rate = max(*min_rate, clk_user->min_rate); *min_rate = max(*min_rate, clk_user->min_rate);
@ -522,6 +524,14 @@ static void clk_core_get_boundaries(struct clk_core *core,
*max_rate = min(*max_rate, clk_user->max_rate); *max_rate = min(*max_rate, clk_user->max_rate);
} }
void clk_hw_set_rate_range(struct clk_hw *hw, unsigned long min_rate,
unsigned long max_rate)
{
hw->core->min_rate = min_rate;
hw->core->max_rate = max_rate;
}
EXPORT_SYMBOL_GPL(clk_hw_set_rate_range);
/* /*
* Helper for finding best parent to provide a given frequency. This can be used * Helper for finding best parent to provide a given frequency. This can be used
* directly as a determine_rate callback (e.g. for a mux), or from a more * directly as a determine_rate callback (e.g. for a mux), or from a more
@ -2498,6 +2508,8 @@ struct clk *clk_register(struct device *dev, struct clk_hw *hw)
core->hw = hw; core->hw = hw;
core->flags = hw->init->flags; core->flags = hw->init->flags;
core->num_parents = hw->init->num_parents; core->num_parents = hw->init->num_parents;
core->min_rate = 0;
core->max_rate = ULONG_MAX;
hw->core = core; hw->core = core;
/* allocate local copy in case parent_names is __initdata */ /* allocate local copy in case parent_names is __initdata */

View File

@ -619,6 +619,8 @@ int __clk_determine_rate(struct clk_hw *core, struct clk_rate_request *req);
int __clk_mux_determine_rate_closest(struct clk_hw *hw, int __clk_mux_determine_rate_closest(struct clk_hw *hw,
struct clk_rate_request *req); struct clk_rate_request *req);
void clk_hw_reparent(struct clk_hw *hw, struct clk_hw *new_parent); void clk_hw_reparent(struct clk_hw *hw, struct clk_hw *new_parent);
void clk_hw_set_rate_range(struct clk_hw *hw, unsigned long min_rate,
unsigned long max_rate);
static inline void __clk_hw_set_clk(struct clk_hw *dst, struct clk_hw *src) static inline void __clk_hw_set_clk(struct clk_hw *dst, struct clk_hw *src)
{ {