|
@@ -158,3 +158,104 @@ static unsigned long pll_recalc(struct clk *clk)
|
|
|
|
|
|
static struct sh_clk_ops pll_clk_ops = {
|
|
|
.recalc = pll_recalc,
|
|
|
+};
|
|
|
+
|
|
|
+static struct clk pll0_clk = {
|
|
|
+ .ops = &pll_clk_ops,
|
|
|
+ .flags = CLK_ENABLE_ON_INIT,
|
|
|
+ .parent = &main_clk,
|
|
|
+ .enable_reg = (void __iomem *)PLL0CR,
|
|
|
+ .enable_bit = 0,
|
|
|
+};
|
|
|
+
|
|
|
+static struct clk pll1_clk = {
|
|
|
+ .ops = &pll_clk_ops,
|
|
|
+ .flags = CLK_ENABLE_ON_INIT,
|
|
|
+ .parent = &main_clk,
|
|
|
+ .enable_reg = (void __iomem *)PLL1CR,
|
|
|
+ .enable_bit = 1,
|
|
|
+};
|
|
|
+
|
|
|
+static struct clk pll2_clk = {
|
|
|
+ .ops = &pll_clk_ops,
|
|
|
+ .flags = CLK_ENABLE_ON_INIT,
|
|
|
+ .parent = &main_clk,
|
|
|
+ .enable_reg = (void __iomem *)PLL2CR,
|
|
|
+ .enable_bit = 2,
|
|
|
+};
|
|
|
+
|
|
|
+static struct clk pll3_clk = {
|
|
|
+ .ops = &pll_clk_ops,
|
|
|
+ .flags = CLK_ENABLE_ON_INIT,
|
|
|
+ .parent = &main_clk,
|
|
|
+ .enable_reg = (void __iomem *)PLL3CR,
|
|
|
+ .enable_bit = 3,
|
|
|
+};
|
|
|
+
|
|
|
+/* Divide PLL */
|
|
|
+static struct clk pll1_div2_clk = {
|
|
|
+ .ops = &div2_clk_ops,
|
|
|
+ .parent = &pll1_clk,
|
|
|
+};
|
|
|
+
|
|
|
+static struct clk pll1_div7_clk = {
|
|
|
+ .ops = &div7_clk_ops,
|
|
|
+ .parent = &pll1_clk,
|
|
|
+};
|
|
|
+
|
|
|
+static struct clk pll1_div13_clk = {
|
|
|
+ .ops = &div13_clk_ops,
|
|
|
+ .parent = &pll1_clk,
|
|
|
+};
|
|
|
+
|
|
|
+/* External input clock */
|
|
|
+struct clk sh73a0_extcki_clk = {
|
|
|
+};
|
|
|
+
|
|
|
+struct clk sh73a0_extalr_clk = {
|
|
|
+};
|
|
|
+
|
|
|
+static struct clk *main_clks[] = {
|
|
|
+ &r_clk,
|
|
|
+ &sh73a0_extal1_clk,
|
|
|
+ &sh73a0_extal2_clk,
|
|
|
+ &extal1_div2_clk,
|
|
|
+ &extal2_div2_clk,
|
|
|
+ &main_clk,
|
|
|
+ &main_div2_clk,
|
|
|
+ &pll0_clk,
|
|
|
+ &pll1_clk,
|
|
|
+ &pll2_clk,
|
|
|
+ &pll3_clk,
|
|
|
+ &pll1_div2_clk,
|
|
|
+ &pll1_div7_clk,
|
|
|
+ &pll1_div13_clk,
|
|
|
+ &sh73a0_extcki_clk,
|
|
|
+ &sh73a0_extalr_clk,
|
|
|
+};
|
|
|
+
|
|
|
+static void div4_kick(struct clk *clk)
|
|
|
+{
|
|
|
+ unsigned long value;
|
|
|
+
|
|
|
+ /* set KICK bit in FRQCRB to update hardware setting */
|
|
|
+ value = __raw_readl(FRQCRB);
|
|
|
+ value |= (1 << 31);
|
|
|
+ __raw_writel(value, FRQCRB);
|
|
|
+}
|
|
|
+
|
|
|
+static int divisors[] = { 2, 3, 4, 6, 8, 12, 16, 18,
|
|
|
+ 24, 0, 36, 48, 7 };
|
|
|
+
|
|
|
+static struct clk_div_mult_table div4_div_mult_table = {
|
|
|
+ .divisors = divisors,
|
|
|
+ .nr_divisors = ARRAY_SIZE(divisors),
|
|
|
+};
|
|
|
+
|
|
|
+static struct clk_div4_table div4_table = {
|
|
|
+ .div_mult_table = &div4_div_mult_table,
|
|
|
+ .kick = div4_kick,
|
|
|
+};
|
|
|
+
|
|
|
+enum { DIV4_I, DIV4_ZG, DIV4_M3, DIV4_B, DIV4_M1, DIV4_M2,
|
|
|
+ DIV4_Z, DIV4_ZTR, DIV4_ZT, DIV4_ZX, DIV4_HP, DIV4_NR };
|