mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-17 16:14:25 +08:00
ARM: OMAP4: clock: add support for determine_rate for omap4 regm4xen DPLL
Similarly to OMAP3 noncore DPLL, the implementation of this DPLL clock type is wrong. This patch adds basic functionality for determine_rate for this clock type which will be taken into use in the patches following later. Signed-off-by: Tero Kristo <t-kristo@ti.com> Signed-off-by: Paul Walmsley <paul@pwsan.com>
This commit is contained in:
parent
d539efa37f
commit
83501ff0a5
@ -207,3 +207,44 @@ out:
|
|||||||
|
|
||||||
return dd->last_rounded_rate;
|
return dd->last_rounded_rate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* omap4_dpll_regm4xen_determine_rate - determine rate for a DPLL
|
||||||
|
* @hw: pointer to the clock to determine rate for
|
||||||
|
* @rate: target rate for the DPLL
|
||||||
|
* @best_parent_rate: pointer for returning best parent rate
|
||||||
|
* @best_parent_clk: pointer for returning best parent clock
|
||||||
|
*
|
||||||
|
* Determines which DPLL mode to use for reaching a desired rate.
|
||||||
|
* Checks whether the DPLL shall be in bypass or locked mode, and if
|
||||||
|
* locked, calculates the M,N values for the DPLL via round-rate.
|
||||||
|
* Returns a positive clock rate with success, negative error value
|
||||||
|
* in failure.
|
||||||
|
*/
|
||||||
|
long omap4_dpll_regm4xen_determine_rate(struct clk_hw *hw, unsigned long rate,
|
||||||
|
unsigned long *best_parent_rate,
|
||||||
|
struct clk **best_parent_clk)
|
||||||
|
{
|
||||||
|
struct clk_hw_omap *clk = to_clk_hw_omap(hw);
|
||||||
|
struct dpll_data *dd;
|
||||||
|
|
||||||
|
if (!hw || !rate)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
dd = clk->dpll_data;
|
||||||
|
if (!dd)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (__clk_get_rate(dd->clk_bypass) == rate &&
|
||||||
|
(dd->modes & (1 << DPLL_LOW_POWER_BYPASS))) {
|
||||||
|
*best_parent_clk = dd->clk_bypass;
|
||||||
|
} else {
|
||||||
|
rate = omap4_dpll_regm4xen_round_rate(hw, rate,
|
||||||
|
best_parent_rate);
|
||||||
|
*best_parent_clk = dd->clk_ref;
|
||||||
|
}
|
||||||
|
|
||||||
|
*best_parent_rate = rate;
|
||||||
|
|
||||||
|
return rate;
|
||||||
|
}
|
||||||
|
@ -270,6 +270,10 @@ unsigned long omap4_dpll_regm4xen_recalc(struct clk_hw *hw,
|
|||||||
long omap4_dpll_regm4xen_round_rate(struct clk_hw *hw,
|
long omap4_dpll_regm4xen_round_rate(struct clk_hw *hw,
|
||||||
unsigned long target_rate,
|
unsigned long target_rate,
|
||||||
unsigned long *parent_rate);
|
unsigned long *parent_rate);
|
||||||
|
long omap4_dpll_regm4xen_determine_rate(struct clk_hw *hw,
|
||||||
|
unsigned long rate,
|
||||||
|
unsigned long *best_parent_rate,
|
||||||
|
struct clk **best_parent_clk);
|
||||||
u8 omap2_init_dpll_parent(struct clk_hw *hw);
|
u8 omap2_init_dpll_parent(struct clk_hw *hw);
|
||||||
unsigned long omap3_dpll_recalc(struct clk_hw *hw, unsigned long parent_rate);
|
unsigned long omap3_dpll_recalc(struct clk_hw *hw, unsigned long parent_rate);
|
||||||
long omap2_dpll_round_rate(struct clk_hw *hw, unsigned long target_rate,
|
long omap2_dpll_round_rate(struct clk_hw *hw, unsigned long target_rate,
|
||||||
|
Loading…
Reference in New Issue
Block a user