diff options
author | Ulf Hansson <ulf.hansson@linaro.org> | 2013-04-02 19:06:26 -0400 |
---|---|---|
committer | Mike Turquette <mturquette@linaro.org> | 2013-04-10 15:19:56 -0400 |
commit | 312f0f0b9a4e3e2cc8ad1bbc4577a6dff025cdf6 (patch) | |
tree | 152f28fc73b9190c68adcc14c60386e3012532cc | |
parent | 5b82d03b74cadb681377e1c2494c477185bf6619 (diff) |
clk: ux500: abx500: Define clock tree for ab850x
The patch setups the first version of the clock tree for ab850x, which
is used by u8500 platforms. Mainly sysctrl clocks are used.
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Tested-by: Fabio Baltieri <fabio.baltieri@linaro.org>
Signed-off-by: Mike Turquette <mturquette@linaro.org>
-rw-r--r-- | drivers/clk/ux500/abx500-clk.c | 71 |
1 files changed, 68 insertions, 3 deletions
diff --git a/drivers/clk/ux500/abx500-clk.c b/drivers/clk/ux500/abx500-clk.c index 9f7400d74fa7..a0fca004abc1 100644 --- a/drivers/clk/ux500/abx500-clk.c +++ b/drivers/clk/ux500/abx500-clk.c | |||
@@ -12,13 +12,78 @@ | |||
12 | #include <linux/device.h> | 12 | #include <linux/device.h> |
13 | #include <linux/platform_device.h> | 13 | #include <linux/platform_device.h> |
14 | #include <linux/mfd/abx500/ab8500.h> | 14 | #include <linux/mfd/abx500/ab8500.h> |
15 | 15 | #include <linux/mfd/abx500/ab8500-sysctrl.h> | |
16 | /* TODO: Add clock implementations here */ | 16 | #include <linux/clk.h> |
17 | 17 | #include <linux/clkdev.h> | |
18 | #include <linux/clk-provider.h> | ||
19 | #include <linux/mfd/dbx500-prcmu.h> | ||
20 | #include "clk.h" | ||
18 | 21 | ||
19 | /* Clock definitions for ab8500 */ | 22 | /* Clock definitions for ab8500 */ |
20 | static int ab8500_reg_clks(struct device *dev) | 23 | static int ab8500_reg_clks(struct device *dev) |
21 | { | 24 | { |
25 | int ret; | ||
26 | struct clk *clk; | ||
27 | |||
28 | const char *intclk_parents[] = {"ab8500_sysclk", "ulpclk"}; | ||
29 | u16 intclk_reg_sel[] = {0 , AB8500_SYSULPCLKCTRL1}; | ||
30 | u8 intclk_reg_mask[] = {0 , AB8500_SYSULPCLKCTRL1_SYSULPCLKINTSEL_MASK}; | ||
31 | u8 intclk_reg_bits[] = { | ||
32 | 0 , | ||
33 | (1 << AB8500_SYSULPCLKCTRL1_SYSULPCLKINTSEL_SHIFT) | ||
34 | }; | ||
35 | |||
36 | dev_info(dev, "register clocks for ab850x\n"); | ||
37 | |||
38 | /* Enable SWAT */ | ||
39 | ret = ab8500_sysctrl_set(AB8500_SWATCTRL, AB8500_SWATCTRL_SWATENABLE); | ||
40 | if (ret) | ||
41 | return ret; | ||
42 | |||
43 | /* ab8500_sysclk */ | ||
44 | clk = clk_reg_prcmu_gate("ab8500_sysclk", NULL, PRCMU_SYSCLK, | ||
45 | CLK_IS_ROOT); | ||
46 | clk_register_clkdev(clk, "sysclk", "ab8500-usb.0"); | ||
47 | clk_register_clkdev(clk, "sysclk", "ab-iddet.0"); | ||
48 | clk_register_clkdev(clk, "sysclk", "ab85xx-codec.0"); | ||
49 | clk_register_clkdev(clk, "sysclk", "shrm_bus"); | ||
50 | |||
51 | /* ab8500_sysclk2 */ | ||
52 | clk = clk_reg_sysctrl_gate(dev , "ab8500_sysclk2", "ab8500_sysclk", | ||
53 | AB8500_SYSULPCLKCTRL1, AB8500_SYSULPCLKCTRL1_SYSCLKBUF2REQ, | ||
54 | AB8500_SYSULPCLKCTRL1_SYSCLKBUF2REQ, 0, 0); | ||
55 | clk_register_clkdev(clk, "sysclk", "0-0070"); | ||
56 | |||
57 | /* ab8500_sysclk3 */ | ||
58 | clk = clk_reg_sysctrl_gate(dev , "ab8500_sysclk3", "ab8500_sysclk", | ||
59 | AB8500_SYSULPCLKCTRL1, AB8500_SYSULPCLKCTRL1_SYSCLKBUF3REQ, | ||
60 | AB8500_SYSULPCLKCTRL1_SYSCLKBUF3REQ, 0, 0); | ||
61 | clk_register_clkdev(clk, "sysclk", "cg1960_core.0"); | ||
62 | |||
63 | /* ab8500_sysclk4 */ | ||
64 | clk = clk_reg_sysctrl_gate(dev , "ab8500_sysclk4", "ab8500_sysclk", | ||
65 | AB8500_SYSULPCLKCTRL1, AB8500_SYSULPCLKCTRL1_SYSCLKBUF4REQ, | ||
66 | AB8500_SYSULPCLKCTRL1_SYSCLKBUF4REQ, 0, 0); | ||
67 | |||
68 | /* ab_ulpclk */ | ||
69 | clk = clk_reg_sysctrl_gate_fixed_rate(dev, "ulpclk", NULL, | ||
70 | AB8500_SYSULPCLKCTRL1, AB8500_SYSULPCLKCTRL1_ULPCLKREQ, | ||
71 | AB8500_SYSULPCLKCTRL1_ULPCLKREQ, | ||
72 | 38400000, 9000, CLK_IS_ROOT); | ||
73 | clk_register_clkdev(clk, "ulpclk", "ab85xx-codec.0"); | ||
74 | |||
75 | /* ab8500_intclk */ | ||
76 | clk = clk_reg_sysctrl_set_parent(dev , "intclk", intclk_parents, 2, | ||
77 | intclk_reg_sel, intclk_reg_mask, intclk_reg_bits, 0); | ||
78 | clk_register_clkdev(clk, "intclk", "ab85xx-codec.0"); | ||
79 | clk_register_clkdev(clk, NULL, "ab8500-pwm.1"); | ||
80 | |||
81 | /* ab8500_audioclk */ | ||
82 | clk = clk_reg_sysctrl_gate(dev , "audioclk", "intclk", | ||
83 | AB8500_SYSULPCLKCTRL1, AB8500_SYSULPCLKCTRL1_AUDIOCLKENA, | ||
84 | AB8500_SYSULPCLKCTRL1_AUDIOCLKENA, 0, 0); | ||
85 | clk_register_clkdev(clk, "audioclk", "ab85xx-codec.0"); | ||
86 | |||
22 | return 0; | 87 | return 0; |
23 | } | 88 | } |
24 | 89 | ||