mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-15 08:14:15 +08:00
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
@ -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 */
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user