提交 16b25920 编写于 作者: P Paul Mundt

sh: migrate SH_CLK_MD to mode pin API.

This kills off the hardcoded SH_CLK_MD introduced by the SH-2 boards and
converts over to the mode pin API.
Signed-off-by: NPaul Mundt <lethal@linux-sh.org>
上级 a7bcf21e
...@@ -567,15 +567,6 @@ config SH_CLK_CPG_LEGACY ...@@ -567,15 +567,6 @@ config SH_CLK_CPG_LEGACY
def_bool y if !CPU_SUBTYPE_SH7785 && !ARCH_SHMOBILE && \ def_bool y if !CPU_SUBTYPE_SH7785 && !ARCH_SHMOBILE && \
!CPU_SHX3 && !CPU_SUBTYPE_SH7757 !CPU_SHX3 && !CPU_SUBTYPE_SH7757
config SH_CLK_MD
int "CPU Mode Pin Setting"
depends on CPU_SH2
default 6 if CPU_SUBTYPE_SH7206
default 5 if CPU_SUBTYPE_SH7619
default 0
help
MD2 - MD0 pin setting.
source "kernel/time/Kconfig" source "kernel/time/Kconfig"
endmenu endmenu
......
...@@ -79,6 +79,11 @@ static int __init se7206_devices_setup(void) ...@@ -79,6 +79,11 @@ static int __init se7206_devices_setup(void)
} }
__initcall(se7206_devices_setup); __initcall(se7206_devices_setup);
static int se7206_mode_pins(void)
{
return MODE_PIN1 | MODE_PIN2;
}
/* /*
* The Machine Vector * The Machine Vector
*/ */
...@@ -87,4 +92,5 @@ static struct sh_machine_vector mv_se __initmv = { ...@@ -87,4 +92,5 @@ static struct sh_machine_vector mv_se __initmv = {
.mv_name = "SolutionEngine", .mv_name = "SolutionEngine",
.mv_nr_irqs = 256, .mv_nr_irqs = 256,
.mv_init_irq = init_se7206_IRQ, .mv_init_irq = init_se7206_IRQ,
.mv_mode_pins = se7206_mode_pins,
}; };
...@@ -11,6 +11,11 @@ ...@@ -11,6 +11,11 @@
#include <asm/io.h> #include <asm/io.h>
#include <asm/machvec.h> #include <asm/machvec.h>
static int se7619_mode_pins(void)
{
return MODE_PIN2 | MODE_PIN0;
}
/* /*
* The Machine Vector * The Machine Vector
*/ */
...@@ -18,4 +23,5 @@ ...@@ -18,4 +23,5 @@
static struct sh_machine_vector mv_se __initmv = { static struct sh_machine_vector mv_se __initmv = {
.mv_name = "SolutionEngine", .mv_name = "SolutionEngine",
.mv_nr_irqs = 108, .mv_nr_irqs = 108,
.mv_mode_pins = se7619_mode_pins,
}; };
...@@ -14,24 +14,18 @@ ...@@ -14,24 +14,18 @@
*/ */
#include <linux/init.h> #include <linux/init.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/io.h>
#include <asm/clock.h> #include <asm/clock.h>
#include <asm/freq.h> #include <asm/freq.h>
#include <asm/io.h> #include <asm/processor.h>
static const int pll1rate[] = {1,2}; static const int pll1rate[] = {1,2};
static const int pfc_divisors[] = {1,2,0,4}; static const int pfc_divisors[] = {1,2,0,4};
static unsigned int pll2_mult;
#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 void master_clk_init(struct clk *clk) 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 clk_ops sh7619_master_clk_ops = {
...@@ -70,6 +64,14 @@ static struct clk_ops *sh7619_clk_ops[] = { ...@@ -70,6 +64,14 @@ static struct clk_ops *sh7619_clk_ops[] = {
void __init arch_init_clk_ops(struct clk_ops **ops, int idx) void __init arch_init_clk_ops(struct 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)) if (idx < ARRAY_SIZE(sh7619_clk_ops))
*ops = sh7619_clk_ops[idx]; *ops = sh7619_clk_ops[idx];
} }
...@@ -22,19 +22,12 @@ static const int pll1rate[]={1,2,3,4,6,8}; ...@@ -22,19 +22,12 @@ static const int pll1rate[]={1,2,3,4,6,8};
static const int pfc_divisors[]={1,2,3,4,6,8,12}; static const int pfc_divisors[]={1,2,3,4,6,8,12};
#define ifc_divisors pfc_divisors #define ifc_divisors pfc_divisors
#if (CONFIG_SH_CLK_MD == 0) static unsigned int pll2_mult;
#define PLL2 (4)
#elif (CONFIG_SH_CLK_MD == 2)
#define PLL2 (2)
#elif (CONFIG_SH_CLK_MD == 3)
#define PLL2 (1)
#else
#error "Illegal Clock Mode!"
#endif
static void master_clk_init(struct clk *clk) static void master_clk_init(struct clk *clk)
{ {
return 10000000 * PLL2 * pll1rate[(__raw_readw(FREQCR) >> 8) & 0x0007]; clk->rate = 10000000 * pll2_mult *
pll1rate[(__raw_readw(FREQCR) >> 8) & 0x0007];
} }
static struct clk_ops sh7201_master_clk_ops = { static struct clk_ops sh7201_master_clk_ops = {
...@@ -80,6 +73,13 @@ static struct clk_ops *sh7201_clk_ops[] = { ...@@ -80,6 +73,13 @@ static struct clk_ops *sh7201_clk_ops[] = {
void __init arch_init_clk_ops(struct clk_ops **ops, int idx) void __init arch_init_clk_ops(struct clk_ops **ops, int idx)
{ {
if (test_mode_pin(MODE_PIN1 | MODE_PIN0))
pll2_mult = 1;
else if (test_mode_pin(MODE_PIN1))
pll2_mult = 2;
else
pll2_mult = 4;
if (idx < ARRAY_SIZE(sh7201_clk_ops)) if (idx < ARRAY_SIZE(sh7201_clk_ops))
*ops = sh7201_clk_ops[idx]; *ops = sh7201_clk_ops[idx];
} }
...@@ -25,21 +25,11 @@ static const int pll1rate[]={8,12,16,0}; ...@@ -25,21 +25,11 @@ static const int pll1rate[]={8,12,16,0};
static const int pfc_divisors[]={1,2,3,4,6,8,12}; static const int pfc_divisors[]={1,2,3,4,6,8,12};
#define ifc_divisors pfc_divisors #define ifc_divisors pfc_divisors
#if (CONFIG_SH_CLK_MD == 0) static unsigned int pll2_mult;
#define PLL2 (1)
#elif (CONFIG_SH_CLK_MD == 1)
#define PLL2 (2)
#elif (CONFIG_SH_CLK_MD == 2)
#define PLL2 (4)
#elif (CONFIG_SH_CLK_MD == 3)
#define PLL2 (4)
#else
#error "Illegal Clock Mode!"
#endif
static void master_clk_init(struct clk *clk) static void master_clk_init(struct clk *clk)
{ {
clk->rate *= pll1rate[(__raw_readw(FREQCR) >> 8) & 0x0003] * PLL2 ; clk->rate *= pll1rate[(__raw_readw(FREQCR) >> 8) & 0x0003] * pll2_mult;
} }
static struct clk_ops sh7203_master_clk_ops = { static struct clk_ops sh7203_master_clk_ops = {
...@@ -79,6 +69,13 @@ static struct clk_ops *sh7203_clk_ops[] = { ...@@ -79,6 +69,13 @@ static struct clk_ops *sh7203_clk_ops[] = {
void __init arch_init_clk_ops(struct clk_ops **ops, int idx) void __init arch_init_clk_ops(struct clk_ops **ops, int idx)
{ {
if (test_mode_pin(MODE_PIN1))
pll2_mult = 4;
else if (test_mode_pin(MODE_PIN0))
pll2_mult = 2;
else
pll2_mult = 1;
if (idx < ARRAY_SIZE(sh7203_clk_ops)) if (idx < ARRAY_SIZE(sh7203_clk_ops))
*ops = sh7203_clk_ops[idx]; *ops = sh7203_clk_ops[idx];
} }
...@@ -22,19 +22,11 @@ static const int pll1rate[]={1,2,3,4,6,8}; ...@@ -22,19 +22,11 @@ static const int pll1rate[]={1,2,3,4,6,8};
static const int pfc_divisors[]={1,2,3,4,6,8,12}; static const int pfc_divisors[]={1,2,3,4,6,8,12};
#define ifc_divisors pfc_divisors #define ifc_divisors pfc_divisors
#if (CONFIG_SH_CLK_MD == 2) static unsigned int pll2_mult;
#define PLL2 (4)
#elif (CONFIG_SH_CLK_MD == 6)
#define PLL2 (2)
#elif (CONFIG_SH_CLK_MD == 7)
#define PLL2 (1)
#else
#error "Illigal Clock Mode!"
#endif
static void master_clk_init(struct clk *clk) static void master_clk_init(struct clk *clk)
{ {
clk->rate *= PLL2 * pll1rate[(__raw_readw(FREQCR) >> 8) & 0x0007]; clk->rate *= pll2_mult * pll1rate[(__raw_readw(FREQCR) >> 8) & 0x0007];
} }
static struct clk_ops sh7206_master_clk_ops = { static struct clk_ops sh7206_master_clk_ops = {
...@@ -79,7 +71,13 @@ static struct clk_ops *sh7206_clk_ops[] = { ...@@ -79,7 +71,13 @@ static struct clk_ops *sh7206_clk_ops[] = {
void __init arch_init_clk_ops(struct clk_ops **ops, int idx) void __init arch_init_clk_ops(struct clk_ops **ops, int idx)
{ {
if (test_mode_pin(MODE_PIN2 | MODE_PIN1 | MODE_PIN0))
pll2_mult = 1;
else if (test_mode_pin(MODE_PIN2 | MODE_PIN1))
pll2_mult = 2;
else if (test_mode_pin(MODE_PIN1))
pll2_mult = 4;
if (idx < ARRAY_SIZE(sh7206_clk_ops)) if (idx < ARRAY_SIZE(sh7206_clk_ops))
*ops = sh7206_clk_ops[idx]; *ops = sh7206_clk_ops[idx];
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册