diff options
Diffstat (limited to 'arch/sh/kernel/cpu/sh4a/clock-sh7763.c')
| -rw-r--r-- | arch/sh/kernel/cpu/sh4a/clock-sh7763.c | 46 | 
1 files changed, 16 insertions, 30 deletions
diff --git a/arch/sh/kernel/cpu/sh4a/clock-sh7763.c b/arch/sh/kernel/cpu/sh4a/clock-sh7763.c index 3177d0d1e06..370cd47642e 100644 --- a/arch/sh/kernel/cpu/sh4a/clock-sh7763.c +++ b/arch/sh/kernel/cpu/sh4a/clock-sh7763.c @@ -29,33 +29,28 @@ static struct clk_ops sh7763_master_clk_ops = {  	.init		= master_clk_init,  }; -static void module_clk_recalc(struct clk *clk) +static unsigned long module_clk_recalc(struct clk *clk)  {  	int idx = ((ctrl_inl(FRQCR) >> 4) & 0x07); -	clk->rate = clk->parent->rate / p0fc_divisors[idx]; +	return clk->parent->rate / p0fc_divisors[idx];  }  static struct clk_ops sh7763_module_clk_ops = {  	.recalc		= module_clk_recalc,  }; -static void bus_clk_recalc(struct clk *clk) +static unsigned long bus_clk_recalc(struct clk *clk)  {  	int idx = ((ctrl_inl(FRQCR) >> 16) & 0x07); -	clk->rate = clk->parent->rate / bfc_divisors[idx]; +	return clk->parent->rate / bfc_divisors[idx];  }  static struct clk_ops sh7763_bus_clk_ops = {  	.recalc		= bus_clk_recalc,  }; -static void cpu_clk_recalc(struct clk *clk) -{ -	clk->rate = clk->parent->rate; -} -  static struct clk_ops sh7763_cpu_clk_ops = { -	.recalc		= cpu_clk_recalc, +	.recalc		= followparent_recalc,  };  static struct clk_ops *sh7763_clk_ops[] = { @@ -71,10 +66,10 @@ void __init arch_init_clk_ops(struct clk_ops **ops, int idx)  		*ops = sh7763_clk_ops[idx];  } -static void shyway_clk_recalc(struct clk *clk) +static unsigned long shyway_clk_recalc(struct clk *clk)  {  	int idx = ((ctrl_inl(FRQCR) >> 20) & 0x07); -	clk->rate = clk->parent->rate / cfc_divisors[idx]; +	return clk->parent->rate / cfc_divisors[idx];  }  static struct clk_ops sh7763_shyway_clk_ops = { @@ -83,7 +78,7 @@ static struct clk_ops sh7763_shyway_clk_ops = {  static struct clk sh7763_shyway_clk = {  	.name		= "shyway_clk", -	.flags		= CLK_ALWAYS_ENABLED, +	.flags		= CLK_ENABLE_ON_INIT,  	.ops		= &sh7763_shyway_clk_ops,  }; @@ -95,31 +90,22 @@ static struct clk *sh7763_onchip_clocks[] = {  	&sh7763_shyway_clk,  }; -static int __init sh7763_clk_init(void) +int __init arch_clk_init(void)  { -	struct clk *clk = clk_get(NULL, "master_clk"); -	int i; +	struct clk *clk; +	int i, ret = 0; + +	cpg_clk_init(); +	clk = clk_get(NULL, "master_clk");  	for (i = 0; i < ARRAY_SIZE(sh7763_onchip_clocks); i++) {  		struct clk *clkp = sh7763_onchip_clocks[i];  		clkp->parent = clk; -		clk_register(clkp); -		clk_enable(clkp); +		ret |= clk_register(clkp);  	} -	/* -	 * Now that we have the rest of the clocks registered, we need to -	 * force the parent clock to propagate so that these clocks will -	 * automatically figure out their rate. We cheat by handing the -	 * parent clock its current rate and forcing child propagation. -	 */ -	clk_set_rate(clk, clk_get_rate(clk)); -  	clk_put(clk); -	return 0; +	return ret;  } - -arch_initcall(sh7763_clk_init); -  |