|
@@ -30,13 +30,12 @@
|
|
|
#define OSC_CTRL_OSC_FREQ_SHIFT 28
|
|
|
#define OSC_CTRL_PLL_REF_DIV_SHIFT 26
|
|
|
|
|
|
-int __init tegra_osc_clk_init(void __iomem *clk_base,
|
|
|
- struct tegra_clk *tegra_clks,
|
|
|
- unsigned long *input_freqs, int num,
|
|
|
- unsigned long *osc_freq,
|
|
|
- unsigned long *pll_ref_freq)
|
|
|
+int __init tegra_osc_clk_init(void __iomem *clk_base, struct tegra_clk *clks,
|
|
|
+ unsigned long *input_freqs, unsigned int num,
|
|
|
+ unsigned int clk_m_div, unsigned long *osc_freq,
|
|
|
+ unsigned long *pll_ref_freq)
|
|
|
{
|
|
|
- struct clk *clk;
|
|
|
+ struct clk *clk, *osc;
|
|
|
struct clk **dt_clk;
|
|
|
u32 val, pll_ref_div;
|
|
|
unsigned osc_idx;
|
|
@@ -54,22 +53,25 @@ int __init tegra_osc_clk_init(void __iomem *clk_base,
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
- dt_clk = tegra_lookup_dt_id(tegra_clk_clk_m, tegra_clks);
|
|
|
+ osc = clk_register_fixed_rate(NULL, "osc", NULL, CLK_IS_ROOT,
|
|
|
+ *osc_freq);
|
|
|
+
|
|
|
+ dt_clk = tegra_lookup_dt_id(tegra_clk_clk_m, clks);
|
|
|
if (!dt_clk)
|
|
|
return 0;
|
|
|
|
|
|
- clk = clk_register_fixed_rate(NULL, "clk_m", NULL, CLK_IS_ROOT,
|
|
|
- *osc_freq);
|
|
|
+ clk = clk_register_fixed_factor(NULL, "clk_m", "osc",
|
|
|
+ 0, 1, clk_m_div);
|
|
|
*dt_clk = clk;
|
|
|
|
|
|
/* pll_ref */
|
|
|
val = (val >> OSC_CTRL_PLL_REF_DIV_SHIFT) & 3;
|
|
|
pll_ref_div = 1 << val;
|
|
|
- dt_clk = tegra_lookup_dt_id(tegra_clk_pll_ref, tegra_clks);
|
|
|
+ dt_clk = tegra_lookup_dt_id(tegra_clk_pll_ref, clks);
|
|
|
if (!dt_clk)
|
|
|
return 0;
|
|
|
|
|
|
- clk = clk_register_fixed_factor(NULL, "pll_ref", "clk_m",
|
|
|
+ clk = clk_register_fixed_factor(NULL, "pll_ref", "osc",
|
|
|
0, 1, pll_ref_div);
|
|
|
*dt_clk = clk;
|
|
|
|