aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Dooks <ben-linux@fluff.org>2010-01-19 03:49:59 -0500
committerBen Dooks <ben-linux@fluff.org>2010-01-19 03:49:59 -0500
commitbb9b1c772727849051e485a877aa9a4b2d3ac1a1 (patch)
tree5501528ce36e2cbfff47ea5ffb1398f5d98ff330
parentc3e71c6d21a760c27b511e3dd9dbe46517c6f0f7 (diff)
parentf9e011b6b305d38445bbd4a1e7a8814e056de37b (diff)
ARM: Merge next-samsung-clock2
Merge branch 'next-samsung-clock2' into next-samsung-try5
-rw-r--r--arch/arm/plat-s5pc1xx/clock.c9
-rw-r--r--arch/arm/plat-samsung/clock-clksrc.c25
2 files changed, 19 insertions, 15 deletions
diff --git a/arch/arm/plat-s5pc1xx/clock.c b/arch/arm/plat-s5pc1xx/clock.c
index aec0305174aa..387f23190c3c 100644
--- a/arch/arm/plat-s5pc1xx/clock.c
+++ b/arch/arm/plat-s5pc1xx/clock.c
@@ -64,18 +64,12 @@ struct clk clk_54m = {
64 .rate = 54000000, 64 .rate = 54000000,
65}; 65};
66 66
67static int clk_dummy_enable(struct clk *clk, int enable)
68{
69 return 0;
70}
71
72struct clk clk_hd0 = { 67struct clk clk_hd0 = {
73 .name = "hclkd0", 68 .name = "hclkd0",
74 .id = -1, 69 .id = -1,
75 .rate = 0, 70 .rate = 0,
76 .parent = NULL, 71 .parent = NULL,
77 .ctrlbit = 0, 72 .ctrlbit = 0,
78 .enable = clk_dummy_enable,
79 .ops = &clk_ops_def_setrate, 73 .ops = &clk_ops_def_setrate,
80}; 74};
81 75
@@ -86,7 +80,6 @@ struct clk clk_pd0 = {
86 .parent = NULL, 80 .parent = NULL,
87 .ctrlbit = 0, 81 .ctrlbit = 0,
88 .ops = &clk_ops_def_setrate, 82 .ops = &clk_ops_def_setrate,
89 .enable = clk_dummy_enable,
90}; 83};
91 84
92static int s5pc1xx_clk_gate(void __iomem *reg, struct clk *clk, int enable) 85static int s5pc1xx_clk_gate(void __iomem *reg, struct clk *clk, int enable)
@@ -680,6 +673,8 @@ static struct clk s5pc100_init_clocks[] = {
680static struct clk *clks[] __initdata = { 673static struct clk *clks[] __initdata = {
681 &clk_ext, 674 &clk_ext,
682 &clk_epll, 675 &clk_epll,
676 &clk_pd0,
677 &clk_hd0,
683 &clk_27m, 678 &clk_27m,
684 &clk_48m, 679 &clk_48m,
685 &clk_54m, 680 &clk_54m,
diff --git a/arch/arm/plat-samsung/clock-clksrc.c b/arch/arm/plat-samsung/clock-clksrc.c
index 33c633a8be8d..ae8b8507663f 100644
--- a/arch/arm/plat-samsung/clock-clksrc.c
+++ b/arch/arm/plat-samsung/clock-clksrc.c
@@ -60,7 +60,7 @@ static int s3c_setrate_clksrc(struct clk *clk, unsigned long rate)
60 60
61 rate = clk_round_rate(clk, rate); 61 rate = clk_round_rate(clk, rate);
62 div = clk_get_rate(clk->parent) / rate; 62 div = clk_get_rate(clk->parent) / rate;
63 if (div > 16) 63 if (div > (1 << sclk->reg_div.size))
64 return -EINVAL; 64 return -EINVAL;
65 65
66 val = __raw_readl(reg); 66 val = __raw_readl(reg);
@@ -102,7 +102,9 @@ static int s3c_setparent_clksrc(struct clk *clk, struct clk *parent)
102static unsigned long s3c_roundrate_clksrc(struct clk *clk, 102static unsigned long s3c_roundrate_clksrc(struct clk *clk,
103 unsigned long rate) 103 unsigned long rate)
104{ 104{
105 struct clksrc_clk *sclk = to_clksrc(clk);
105 unsigned long parent_rate = clk_get_rate(clk->parent); 106 unsigned long parent_rate = clk_get_rate(clk->parent);
107 int max_div = 1 << sclk->reg_div.size;
106 int div; 108 int div;
107 109
108 if (rate >= parent_rate) 110 if (rate >= parent_rate)
@@ -114,8 +116,8 @@ static unsigned long s3c_roundrate_clksrc(struct clk *clk,
114 116
115 if (div == 0) 117 if (div == 0)
116 div = 1; 118 div = 1;
117 if (div > 16) 119 if (div > max_div)
118 div = 16; 120 div = max_div;
119 121
120 rate = parent_rate / div; 122 rate = parent_rate / div;
121 } 123 }
@@ -129,11 +131,16 @@ void __init_or_cpufreq s3c_set_clksrc(struct clksrc_clk *clk, bool announce)
129{ 131{
130 struct clksrc_sources *srcs = clk->sources; 132 struct clksrc_sources *srcs = clk->sources;
131 u32 mask = bit_mask(clk->reg_src.shift, clk->reg_src.size); 133 u32 mask = bit_mask(clk->reg_src.shift, clk->reg_src.size);
132 u32 clksrc = 0; 134 u32 clksrc;
133 135
134 if (clk->reg_src.reg) 136 if (!clk->reg_src.reg) {
135 clksrc = __raw_readl(clk->reg_src.reg); 137 if (!clk->clk.parent)
138 printk(KERN_ERR "%s: no parent clock specified\n",
139 clk->clk.name);
140 return;
141 }
136 142
143 clksrc = __raw_readl(clk->reg_src.reg);
137 clksrc &= mask; 144 clksrc &= mask;
138 clksrc >>= clk->reg_src.shift; 145 clksrc >>= clk->reg_src.shift;
139 146
@@ -172,9 +179,11 @@ void __init s3c_register_clksrc(struct clksrc_clk *clksrc, int size)
172{ 179{
173 int ret; 180 int ret;
174 181
175 WARN_ON(!clksrc->reg_div.reg && !clksrc->reg_src.reg);
176
177 for (; size > 0; size--, clksrc++) { 182 for (; size > 0; size--, clksrc++) {
183 if (!clksrc->reg_div.reg && !clksrc->reg_src.reg)
184 printk(KERN_ERR "%s: clock %s has no registers set\n",
185 __func__, clksrc->clk.name);
186
178 /* fill in the default functions */ 187 /* fill in the default functions */
179 188
180 if (!clksrc->clk.ops) { 189 if (!clksrc->clk.ops) {