mirror of
https://github.com/torvalds/linux.git
synced 2024-11-02 10:11:36 +00:00
sh: clkfwk: Provide a generic clk_set_rate_ex() path for root clocks.
In the case of root clocks (such as clkin oscillators, extal, etc.), the rate information is entirely platform dependent and needs to be lazily set and propagated from the platform code. This provides a method for establishing the rate update on these types of clocks that define no set_rate() op of their own. Signed-off-by: Paul Mundt <lethal@linux-sh.org>
This commit is contained in:
parent
d672fef027
commit
100890c55e
@ -265,20 +265,27 @@ EXPORT_SYMBOL_GPL(clk_set_rate);
|
||||
int clk_set_rate_ex(struct clk *clk, unsigned long rate, int algo_id)
|
||||
{
|
||||
int ret = -EOPNOTSUPP;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&clock_lock, flags);
|
||||
|
||||
if (likely(clk->ops && clk->ops->set_rate)) {
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&clock_lock, flags);
|
||||
ret = clk->ops->set_rate(clk, rate, algo_id);
|
||||
if (ret == 0) {
|
||||
if (clk->ops->recalc)
|
||||
clk->rate = clk->ops->recalc(clk);
|
||||
propagate_rate(clk);
|
||||
}
|
||||
spin_unlock_irqrestore(&clock_lock, flags);
|
||||
if (ret != 0)
|
||||
goto out_unlock;
|
||||
} else {
|
||||
clk->rate = rate;
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
if (clk->ops && clk->ops->recalc)
|
||||
clk->rate = clk->ops->recalc(clk);
|
||||
|
||||
propagate_rate(clk);
|
||||
|
||||
out_unlock:
|
||||
spin_unlock_irqrestore(&clock_lock, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(clk_set_rate_ex);
|
||||
|
Loading…
Reference in New Issue
Block a user