diff options
Diffstat (limited to 'arch/sh/kernel/cpu/sh2/clock-sh7619.c')
| -rw-r--r-- | arch/sh/kernel/cpu/sh2/clock-sh7619.c | 34 | 
1 files changed, 18 insertions, 16 deletions
diff --git a/arch/sh/kernel/cpu/sh2/clock-sh7619.c b/arch/sh/kernel/cpu/sh2/clock-sh7619.c index 0c9f24d7a02..e80252ae5bc 100644 --- a/arch/sh/kernel/cpu/sh2/clock-sh7619.c +++ b/arch/sh/kernel/cpu/sh2/clock-sh7619.c @@ -14,27 +14,21 @@   */  #include <linux/init.h>  #include <linux/kernel.h> +#include <linux/io.h>  #include <asm/clock.h>  #include <asm/freq.h> -#include <asm/io.h> +#include <asm/processor.h>  static const int pll1rate[] = {1,2};  static const int pfc_divisors[] = {1,2,0,4}; - -#if (CONFIG_SH_CLK_MD == 1) || (CONFIG_SH_CLK_MD == 2) -#define PLL2 (4) -#elif (CONFIG_SH_CLK_MD == 5) || (CONFIG_SH_CLK_MD == 6) -#define PLL2 (2) -#else -#error "Illigal Clock Mode!" -#endif +static unsigned int pll2_mult;  static void master_clk_init(struct clk *clk)  { -	clk->rate *= PLL2 * pll1rate[(__raw_readw(FREQCR) >> 8) & 7]; +	clk->rate *= pll2_mult * pll1rate[(__raw_readw(FREQCR) >> 8) & 7];  } -static struct clk_ops sh7619_master_clk_ops = { +static struct sh_clk_ops sh7619_master_clk_ops = {  	.init		= master_clk_init,  }; @@ -44,7 +38,7 @@ static unsigned long module_clk_recalc(struct clk *clk)  	return clk->parent->rate / pfc_divisors[idx];  } -static struct clk_ops sh7619_module_clk_ops = { +static struct sh_clk_ops sh7619_module_clk_ops = {  	.recalc		= module_clk_recalc,  }; @@ -53,23 +47,31 @@ static unsigned long bus_clk_recalc(struct clk *clk)  	return clk->parent->rate / pll1rate[(__raw_readw(FREQCR) >> 8) & 7];  } -static struct clk_ops sh7619_bus_clk_ops = { +static struct sh_clk_ops sh7619_bus_clk_ops = {  	.recalc		= bus_clk_recalc,  }; -static struct clk_ops sh7619_cpu_clk_ops = { +static struct sh_clk_ops sh7619_cpu_clk_ops = {  	.recalc		= followparent_recalc,  }; -static struct clk_ops *sh7619_clk_ops[] = { +static struct sh_clk_ops *sh7619_clk_ops[] = {  	&sh7619_master_clk_ops,  	&sh7619_module_clk_ops,  	&sh7619_bus_clk_ops,  	&sh7619_cpu_clk_ops,  }; -void __init arch_init_clk_ops(struct clk_ops **ops, int idx) +void __init arch_init_clk_ops(struct sh_clk_ops **ops, int idx)  { +	if (test_mode_pin(MODE_PIN2 | MODE_PIN0) || +	    test_mode_pin(MODE_PIN2 | MODE_PIN1)) +		pll2_mult = 2; +	else if (test_mode_pin(MODE_PIN0) || test_mode_pin(MODE_PIN1)) +		pll2_mult = 4; + +	BUG_ON(!pll2_mult); +  	if (idx < ARRAY_SIZE(sh7619_clk_ops))  		*ops = sh7619_clk_ops[idx];  }  | 
