|
@@ -102,3 +102,59 @@ static struct sh_clk_ops div7_clk_ops = {
|
|
|
};
|
|
|
|
|
|
static unsigned long div13_recalc(struct clk *clk)
|
|
|
+{
|
|
|
+ return clk->parent->rate / 13;
|
|
|
+}
|
|
|
+
|
|
|
+static struct sh_clk_ops div13_clk_ops = {
|
|
|
+ .recalc = div13_recalc,
|
|
|
+};
|
|
|
+
|
|
|
+/* Divide extal1 by two */
|
|
|
+static struct clk extal1_div2_clk = {
|
|
|
+ .ops = &div2_clk_ops,
|
|
|
+ .parent = &sh73a0_extal1_clk,
|
|
|
+};
|
|
|
+
|
|
|
+/* Divide extal2 by two */
|
|
|
+static struct clk extal2_div2_clk = {
|
|
|
+ .ops = &div2_clk_ops,
|
|
|
+ .parent = &sh73a0_extal2_clk,
|
|
|
+};
|
|
|
+
|
|
|
+static struct sh_clk_ops main_clk_ops = {
|
|
|
+ .recalc = followparent_recalc,
|
|
|
+};
|
|
|
+
|
|
|
+/* Main clock */
|
|
|
+static struct clk main_clk = {
|
|
|
+ .ops = &main_clk_ops,
|
|
|
+};
|
|
|
+
|
|
|
+/* Divide Main clock by two */
|
|
|
+static struct clk main_div2_clk = {
|
|
|
+ .ops = &div2_clk_ops,
|
|
|
+ .parent = &main_clk,
|
|
|
+};
|
|
|
+
|
|
|
+/* PLL0, PLL1, PLL2, PLL3 */
|
|
|
+static unsigned long pll_recalc(struct clk *clk)
|
|
|
+{
|
|
|
+ unsigned long mult = 1;
|
|
|
+
|
|
|
+ if (__raw_readl(PLLECR) & (1 << clk->enable_bit)) {
|
|
|
+ mult = (((__raw_readl(clk->enable_reg) >> 24) & 0x3f) + 1);
|
|
|
+ /* handle CFG bit for PLL1 and PLL2 */
|
|
|
+ switch (clk->enable_bit) {
|
|
|
+ case 1:
|
|
|
+ case 2:
|
|
|
+ if (__raw_readl(clk->enable_reg) & (1 << 20))
|
|
|
+ mult *= 2;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return clk->parent->rate * mult;
|
|
|
+}
|
|
|
+
|
|
|
+static struct sh_clk_ops pll_clk_ops = {
|
|
|
+ .recalc = pll_recalc,
|