aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/plat-samsung
diff options
context:
space:
mode:
authorBen Dooks <ben-linux@fluff.org>2010-01-19 04:36:12 -0500
committerBen Dooks <ben-linux@fluff.org>2010-01-19 04:36:12 -0500
commitea2de1dc8b5872de21a03757dca9d1560b5c9a81 (patch)
tree5501528ce36e2cbfff47ea5ffb1398f5d98ff330 /arch/arm/plat-samsung
parent668dfc7527eb755e1bf194bf19c0c281e9df6deb (diff)
parentf9e011b6b305d38445bbd4a1e7a8814e056de37b (diff)
ARM: Merge next-samsung-clock2
Merge branch 'next-samsung-clock2' into next-samsung-try7
Diffstat (limited to 'arch/arm/plat-samsung')
-rw-r--r--arch/arm/plat-samsung/clock-clksrc.c25
1 files changed, 17 insertions, 8 deletions
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) {