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:
parent
5c757456c1
commit
9783c0d985
2 changed files with 16 additions and 2 deletions
|
@ -58,6 +58,8 @@ struct clk_core {
|
|||
unsigned long flags;
|
||||
unsigned int enable_count;
|
||||
unsigned int prepare_count;
|
||||
unsigned long min_rate;
|
||||
unsigned long max_rate;
|
||||
unsigned long accuracy;
|
||||
int phase;
|
||||
struct hlist_head children;
|
||||
|
@ -512,8 +514,8 @@ static void clk_core_get_boundaries(struct clk_core *core,
|
|||
{
|
||||
struct clk *clk_user;
|
||||
|
||||
*min_rate = 0;
|
||||
*max_rate = ULONG_MAX;
|
||||
*min_rate = core->min_rate;
|
||||
*max_rate = core->max_rate;
|
||||
|
||||
hlist_for_each_entry(clk_user, &core->clks, clks_node)
|
||||
*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);
|
||||
}
|
||||
|
||||
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
|
||||
* 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->flags = hw->init->flags;
|
||||
core->num_parents = hw->init->num_parents;
|
||||
core->min_rate = 0;
|
||||
core->max_rate = ULONG_MAX;
|
||||
hw->core = core;
|
||||
|
||||
/* allocate local copy in case parent_names is __initdata */
|
||||
|
|
|
@ -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,
|
||||
struct clk_rate_request *req);
|
||||
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)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue