clk: sunxi-ng: Wait for lock when using fractional mode
Currently ccu_frac_helper_set_rate() doesn't wait for a lock bit to be
set before returning. Because of that, unstable clock may be used.
Add a wait for lock in the helper function.
Fixes: 89a3dfb787
("clk: sunxi-ng: Add fractional lib")
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
Signed-off-by: Chen-Yu Tsai <wens@csie.org>
This commit is contained in:
Родитель
b655f36e20
Коммит
1d42460a49
|
@ -85,7 +85,7 @@ unsigned long ccu_frac_helper_read_rate(struct ccu_common *common,
|
||||||
|
|
||||||
int ccu_frac_helper_set_rate(struct ccu_common *common,
|
int ccu_frac_helper_set_rate(struct ccu_common *common,
|
||||||
struct ccu_frac_internal *cf,
|
struct ccu_frac_internal *cf,
|
||||||
unsigned long rate)
|
unsigned long rate, u32 lock)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
u32 reg, sel;
|
u32 reg, sel;
|
||||||
|
@ -106,5 +106,7 @@ int ccu_frac_helper_set_rate(struct ccu_common *common,
|
||||||
writel(reg | sel, common->base + common->reg);
|
writel(reg | sel, common->base + common->reg);
|
||||||
spin_unlock_irqrestore(common->lock, flags);
|
spin_unlock_irqrestore(common->lock, flags);
|
||||||
|
|
||||||
|
ccu_helper_wait_for_lock(common, lock);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,6 +48,6 @@ unsigned long ccu_frac_helper_read_rate(struct ccu_common *common,
|
||||||
|
|
||||||
int ccu_frac_helper_set_rate(struct ccu_common *common,
|
int ccu_frac_helper_set_rate(struct ccu_common *common,
|
||||||
struct ccu_frac_internal *cf,
|
struct ccu_frac_internal *cf,
|
||||||
unsigned long rate);
|
unsigned long rate, u32 lock);
|
||||||
|
|
||||||
#endif /* _CCU_FRAC_H_ */
|
#endif /* _CCU_FRAC_H_ */
|
||||||
|
|
|
@ -114,7 +114,8 @@ static int ccu_mult_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||||
if (ccu_frac_helper_has_rate(&cm->common, &cm->frac, rate)) {
|
if (ccu_frac_helper_has_rate(&cm->common, &cm->frac, rate)) {
|
||||||
ccu_frac_helper_enable(&cm->common, &cm->frac);
|
ccu_frac_helper_enable(&cm->common, &cm->frac);
|
||||||
|
|
||||||
return ccu_frac_helper_set_rate(&cm->common, &cm->frac, rate);
|
return ccu_frac_helper_set_rate(&cm->common, &cm->frac,
|
||||||
|
rate, cm->lock);
|
||||||
} else {
|
} else {
|
||||||
ccu_frac_helper_disable(&cm->common, &cm->frac);
|
ccu_frac_helper_disable(&cm->common, &cm->frac);
|
||||||
}
|
}
|
||||||
|
|
|
@ -129,7 +129,8 @@ static int ccu_nm_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||||
|
|
||||||
ccu_frac_helper_enable(&nm->common, &nm->frac);
|
ccu_frac_helper_enable(&nm->common, &nm->frac);
|
||||||
|
|
||||||
return ccu_frac_helper_set_rate(&nm->common, &nm->frac, rate);
|
return ccu_frac_helper_set_rate(&nm->common, &nm->frac,
|
||||||
|
rate, nm->lock);
|
||||||
} else {
|
} else {
|
||||||
ccu_frac_helper_disable(&nm->common, &nm->frac);
|
ccu_frac_helper_disable(&nm->common, &nm->frac);
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче