• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6.36/arch/arm/mach-nuc93x/
1/*
2 * linux/arch/arm/mach-nuc93x/clock.c
3 *
4 * Copyright (c) 2008 Nuvoton technology corporation
5 *
6 * Wan ZongShun <mcuos.com@gmail.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License.
11 */
12
13#include <linux/module.h>
14#include <linux/kernel.h>
15#include <linux/list.h>
16#include <linux/errno.h>
17#include <linux/err.h>
18#include <linux/string.h>
19#include <linux/clk.h>
20#include <linux/spinlock.h>
21#include <linux/platform_device.h>
22#include <linux/io.h>
23
24#include <mach/hardware.h>
25
26#include "clock.h"
27
28static DEFINE_SPINLOCK(clocks_lock);
29
30int clk_enable(struct clk *clk)
31{
32	unsigned long flags;
33
34	spin_lock_irqsave(&clocks_lock, flags);
35	if (clk->enabled++ == 0)
36		(clk->enable)(clk, 1);
37	spin_unlock_irqrestore(&clocks_lock, flags);
38
39	return 0;
40}
41EXPORT_SYMBOL(clk_enable);
42
43void clk_disable(struct clk *clk)
44{
45	unsigned long flags;
46
47	WARN_ON(clk->enabled == 0);
48
49	spin_lock_irqsave(&clocks_lock, flags);
50	if (--clk->enabled == 0)
51		(clk->enable)(clk, 0);
52	spin_unlock_irqrestore(&clocks_lock, flags);
53}
54EXPORT_SYMBOL(clk_disable);
55
56unsigned long clk_get_rate(struct clk *clk)
57{
58	return 27000000;
59}
60EXPORT_SYMBOL(clk_get_rate);
61
62void nuc93x_clk_enable(struct clk *clk, int enable)
63{
64	unsigned int clocks = clk->cken;
65	unsigned long clken;
66
67	clken = __raw_readl(NUC93X_VA_CLKPWR);
68
69	if (enable)
70		clken |= clocks;
71	else
72		clken &= ~clocks;
73
74	__raw_writel(clken, NUC93X_VA_CLKPWR);
75}
76
77void clks_register(struct clk_lookup *clks, size_t num)
78{
79	int i;
80
81	for (i = 0; i < num; i++)
82		clkdev_add(&clks[i]);
83}
84