aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sh/kernel/cpu/sh4a/clock-sh7785.c
diff options
context:
space:
mode:
authorPaul Mundt <lethal@linux-sh.org>2009-05-14 04:38:46 -0400
committerPaul Mundt <lethal@linux-sh.org>2009-05-14 04:38:46 -0400
commit549b5e358d17a8c04953ed80896ce07d37722451 (patch)
treec9cf2badccaf4868f3ba014b67a73983e7f7d1a9 /arch/sh/kernel/cpu/sh4a/clock-sh7785.c
parentcedcf3366f2191885aff92d33d6078ef08203e52 (diff)
sh: clkfwk: Add MSTP bits to SH7785 clock framework.
This plugs in all of the MSTP functions in to the clock framework, and hands them off to the platform devices that want them. Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch/sh/kernel/cpu/sh4a/clock-sh7785.c')
-rw-r--r--arch/sh/kernel/cpu/sh4a/clock-sh7785.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/arch/sh/kernel/cpu/sh4a/clock-sh7785.c b/arch/sh/kernel/cpu/sh4a/clock-sh7785.c
index b7a32dd1b2db..cf042b53b3ae 100644
--- a/arch/sh/kernel/cpu/sh4a/clock-sh7785.c
+++ b/arch/sh/kernel/cpu/sh4a/clock-sh7785.c
@@ -228,12 +228,75 @@ static struct clk *clks[] = {
228 &umem_clk, 228 &umem_clk,
229}; 229};
230 230
231static int mstpcr_clk_enable(struct clk *clk)
232{
233 __raw_writel(__raw_readl(clk->enable_reg) & ~(1 << clk->enable_bit),
234 clk->enable_reg);
235 return 0;
236}
237
238static void mstpcr_clk_disable(struct clk *clk)
239{
240 __raw_writel(__raw_readl(clk->enable_reg) | (1 << clk->enable_bit),
241 clk->enable_reg);
242}
243
244static struct clk_ops mstpcr_clk_ops = {
245 .enable = mstpcr_clk_enable,
246 .disable = mstpcr_clk_disable,
247 .recalc = followparent_recalc,
248};
249
250#define MSTPCR0 0xffc80030
251#define MSTPCR1 0xffc80034
252
253#define CLK(_name, _id, _parent, _enable_reg, \
254 _enable_bit, _flags) \
255{ \
256 .name = _name, \
257 .id = _id, \
258 .parent = _parent, \
259 .enable_reg = (void __iomem *)_enable_reg, \
260 .enable_bit = _enable_bit, \
261 .flags = _flags, \
262 .ops = &mstpcr_clk_ops, \
263}
264
265static struct clk mstpcr_clks[] = {
266 /* MSTPCR0 */
267 CLK("scif_fck", 5, &peripheral_clk, MSTPCR0, 29, 0),
268 CLK("scif_fck", 4, &peripheral_clk, MSTPCR0, 28, 0),
269 CLK("scif_fck", 3, &peripheral_clk, MSTPCR0, 27, 0),
270 CLK("scif_fck", 2, &peripheral_clk, MSTPCR0, 26, 0),
271 CLK("scif_fck", 1, &peripheral_clk, MSTPCR0, 25, 0),
272 CLK("scif_fck", 0, &peripheral_clk, MSTPCR0, 24, 0),
273 CLK("ssi_fck", 1, &peripheral_clk, MSTPCR0, 21, 0),
274 CLK("ssi_fck", 0, &peripheral_clk, MSTPCR0, 20, 0),
275 CLK("hac_fck", 1, &peripheral_clk, MSTPCR0, 17, 0),
276 CLK("hac_fck", 0, &peripheral_clk, MSTPCR0, 16, 0),
277 CLK("mmcif_fck", -1, &peripheral_clk, MSTPCR0, 13, 0),
278 CLK("flctl_fck", -1, &peripheral_clk, MSTPCR0, 12, 0),
279 CLK("tmu345_fck", -1, &peripheral_clk, MSTPCR0, 9, 0),
280 CLK("tmu012_fck", -1, &peripheral_clk, MSTPCR0, 8, 0),
281 CLK("siof_fck", -1, &peripheral_clk, MSTPCR0, 3, 0),
282 CLK("hspi_fck", -1, &peripheral_clk, MSTPCR0, 2, 0),
283
284 /* MSTPCR1 */
285 CLK("hudi_fck", -1, NULL, MSTPCR1, 19, 0),
286 CLK("ubc_fck", -1, NULL, MSTPCR1, 17, 0),
287 CLK("dmac_11_6_fck", -1, NULL, MSTPCR1, 5, 0),
288 CLK("dmac_5_0_fck", -1, NULL, MSTPCR1, 4, 0),
289 CLK("gdta_fck", -1, NULL, MSTPCR1, 0, 0),
290};
291
231int __init arch_clk_init(void) 292int __init arch_clk_init(void)
232{ 293{
233 int i, ret = 0; 294 int i, ret = 0;
234 295
235 for (i = 0; i < ARRAY_SIZE(clks); i++) 296 for (i = 0; i < ARRAY_SIZE(clks); i++)
236 ret |= clk_register(clks[i]); 297 ret |= clk_register(clks[i]);
298 for (i = 0; i < ARRAY_SIZE(mstpcr_clks); i++)
299 ret |= clk_register(&mstpcr_clks[i]);
237 300
238 return ret; 301 return ret;
239} 302}