1 /* arch/arm/mach-lh7a40x/clocks.c
3 * Copyright (C) 2004 Marc Singer
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * version 2 as published by the Free Software Foundation.
11 #include <linux/cpufreq.h>
12 #include <mach/hardware.h>
13 #include <mach/clocks.h>
14 #include <linux/err.h>
19 struct list_head node;
27 #define MAINDIV1(c) (((c) >> 7) & 0x0f)
28 #define MAINDIV2(c) (((c) >> 11) & 0x1f)
29 #define PS(c) (((c) >> 18) & 0x03)
30 #define PREDIV(c) (((c) >> 2) & 0x1f)
31 #define HCLKDIV(c) (((c) >> 0) & 0x02)
32 #define PCLKDIV(c) (((c) >> 16) & 0x03)
34 unsigned int cpufreq_get (unsigned int cpu) /* in kHz */
36 return fclkfreq_get ()/1000;
38 EXPORT_SYMBOL(cpufreq_get);
40 unsigned int fclkfreq_get (void)
42 unsigned int clkset = CSC_CLKSET;
46 * (MAINDIV1(clkset) + 2)
47 / (PREDIV(clkset) + 2)
48 * (MAINDIV2(clkset) + 2)
53 unsigned int hclkfreq_get (void)
55 unsigned int clkset = CSC_CLKSET;
56 unsigned int hclk = fclkfreq_get () / (HCLKDIV(clkset) + 1);
61 unsigned int pclkfreq_get (void)
63 unsigned int clkset = CSC_CLKSET;
64 int pclkdiv = PCLKDIV(clkset);
68 pclk = hclkfreq_get () / (1 << pclkdiv);
75 static LIST_HEAD(clocks);
76 static DECLARE_MUTEX(clocks_sem);
78 struct clk *clk_get (struct device *dev, const char *id)
81 struct clk *clk = ERR_PTR(-ENOENT);
84 list_for_each_entry (p, &clocks, node) {
85 if (strcmp (id, p->name) == 0
86 && try_module_get(p->owner)) {
95 EXPORT_SYMBOL(clk_get);
97 void clk_put (struct clk *clk)
99 module_put(clk->owner);
101 EXPORT_SYMBOL(clk_put);
103 int clk_enable (struct clk *clk)
107 EXPORT_SYMBOL(clk_enable);
109 void clk_disable (struct clk *clk)
112 EXPORT_SYMBOL(clk_disable);
114 int clk_use (struct clk *clk)
118 EXPORT_SYMBOL(clk_use);
120 void clk_unuse (struct clk *clk)
123 EXPORT_SYMBOL(clk_unuse);
125 unsigned long clk_get_rate (struct clk *clk)
129 EXPORT_SYMBOL(clk_get_rate);
131 long clk_round_rate (struct clk *clk, unsigned long rate)
135 EXPORT_SYMBOL(clk_round_rate);
137 int clk_set_rate (struct clk *clk, unsigned long rate)
142 EXPORT_SYMBOL(clk_set_rate);
144 static struct clk clcd_clk = {
149 int clk_register (struct clk *clk)
152 list_add (&clk->node, &clocks);
156 EXPORT_SYMBOL(clk_register);
158 void clk_unregister (struct clk *clk)
161 list_del (&clk->node);
164 EXPORT_SYMBOL(clk_unregister);
166 static int __init clk_init (void)
168 clk_register(&clcd_clk);
171 arch_initcall(clk_init);