diff options
author | Linus Walleij <linus.walleij@linaro.org> | 2012-11-20 16:39:49 -0500 |
---|---|---|
committer | Mike Turquette <mturquette@linaro.org> | 2012-11-21 14:02:44 -0500 |
commit | 70ee65771424829fd092a1df9afcc7e24c94004b (patch) | |
tree | 0e25e304610039efe35410db2b6a930c9412690e /arch/arm | |
parent | 7a9ad671ac0a0ec2fc86887a9416f837c0cfb801 (diff) |
clk: move IM-PD1 clocks to drivers/clk
The ARM IM-PD1 add-on module has a few clock of its own, let's
move also these down to the drivers/clk/versatile driver dir
and get rid of any remaining oldschool Integrator clocks.
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Mike Turquette <mturquette@linaro.org>
Diffstat (limited to 'arch/arm')
-rw-r--r-- | arch/arm/mach-integrator/impd1.c | 69 |
1 files changed, 3 insertions, 66 deletions
diff --git a/arch/arm/mach-integrator/impd1.c b/arch/arm/mach-integrator/impd1.c index e428f3ab15c7..b3d86d7081a0 100644 --- a/arch/arm/mach-integrator/impd1.c +++ b/arch/arm/mach-integrator/impd1.c | |||
@@ -21,10 +21,9 @@ | |||
21 | #include <linux/amba/bus.h> | 21 | #include <linux/amba/bus.h> |
22 | #include <linux/amba/clcd.h> | 22 | #include <linux/amba/clcd.h> |
23 | #include <linux/io.h> | 23 | #include <linux/io.h> |
24 | #include <linux/platform_data/clk-integrator.h> | ||
24 | #include <linux/slab.h> | 25 | #include <linux/slab.h> |
25 | #include <linux/clkdev.h> | ||
26 | 26 | ||
27 | #include <asm/hardware/icst.h> | ||
28 | #include <mach/lm.h> | 27 | #include <mach/lm.h> |
29 | #include <mach/impd1.h> | 28 | #include <mach/impd1.h> |
30 | #include <asm/sizes.h> | 29 | #include <asm/sizes.h> |
@@ -36,45 +35,6 @@ MODULE_PARM_DESC(lmid, "logic module stack position"); | |||
36 | 35 | ||
37 | struct impd1_module { | 36 | struct impd1_module { |
38 | void __iomem *base; | 37 | void __iomem *base; |
39 | struct clk vcos[2]; | ||
40 | struct clk_lookup *clks[3]; | ||
41 | }; | ||
42 | |||
43 | static const struct icst_params impd1_vco_params = { | ||
44 | .ref = 24000000, /* 24 MHz */ | ||
45 | .vco_max = ICST525_VCO_MAX_3V, | ||
46 | .vco_min = ICST525_VCO_MIN, | ||
47 | .vd_min = 12, | ||
48 | .vd_max = 519, | ||
49 | .rd_min = 3, | ||
50 | .rd_max = 120, | ||
51 | .s2div = icst525_s2div, | ||
52 | .idx2s = icst525_idx2s, | ||
53 | }; | ||
54 | |||
55 | static void impd1_setvco(struct clk *clk, struct icst_vco vco) | ||
56 | { | ||
57 | struct impd1_module *impd1 = clk->data; | ||
58 | u32 val = vco.v | (vco.r << 9) | (vco.s << 16); | ||
59 | |||
60 | writel(0xa05f, impd1->base + IMPD1_LOCK); | ||
61 | writel(val, clk->vcoreg); | ||
62 | writel(0, impd1->base + IMPD1_LOCK); | ||
63 | |||
64 | #ifdef DEBUG | ||
65 | vco.v = val & 0x1ff; | ||
66 | vco.r = (val >> 9) & 0x7f; | ||
67 | vco.s = (val >> 16) & 7; | ||
68 | |||
69 | pr_debug("IM-PD1: VCO%d clock is %ld Hz\n", | ||
70 | vconr, icst525_hz(&impd1_vco_params, vco)); | ||
71 | #endif | ||
72 | } | ||
73 | |||
74 | static const struct clk_ops impd1_clk_ops = { | ||
75 | .round = icst_clk_round, | ||
76 | .set = icst_clk_set, | ||
77 | .setvco = impd1_setvco, | ||
78 | }; | 38 | }; |
79 | 39 | ||
80 | void impd1_tweak_control(struct device *dev, u32 mask, u32 val) | 40 | void impd1_tweak_control(struct device *dev, u32 mask, u32 val) |
@@ -344,10 +304,6 @@ static struct impd1_device impd1_devs[] = { | |||
344 | } | 304 | } |
345 | }; | 305 | }; |
346 | 306 | ||
347 | static struct clk fixed_14745600 = { | ||
348 | .rate = 14745600, | ||
349 | }; | ||
350 | |||
351 | static int impd1_probe(struct lm_device *dev) | 307 | static int impd1_probe(struct lm_device *dev) |
352 | { | 308 | { |
353 | struct impd1_module *impd1; | 309 | struct impd1_module *impd1; |
@@ -376,23 +332,7 @@ static int impd1_probe(struct lm_device *dev) | |||
376 | printk("IM-PD1 found at 0x%08lx\n", | 332 | printk("IM-PD1 found at 0x%08lx\n", |
377 | (unsigned long)dev->resource.start); | 333 | (unsigned long)dev->resource.start); |
378 | 334 | ||
379 | for (i = 0; i < ARRAY_SIZE(impd1->vcos); i++) { | 335 | integrator_impd1_clk_init(impd1->base, dev->id); |
380 | impd1->vcos[i].ops = &impd1_clk_ops, | ||
381 | impd1->vcos[i].owner = THIS_MODULE, | ||
382 | impd1->vcos[i].params = &impd1_vco_params, | ||
383 | impd1->vcos[i].data = impd1; | ||
384 | } | ||
385 | impd1->vcos[0].vcoreg = impd1->base + IMPD1_OSC1; | ||
386 | impd1->vcos[1].vcoreg = impd1->base + IMPD1_OSC2; | ||
387 | |||
388 | impd1->clks[0] = clkdev_alloc(&impd1->vcos[0], NULL, "lm%x:01000", | ||
389 | dev->id); | ||
390 | impd1->clks[1] = clkdev_alloc(&fixed_14745600, NULL, "lm%x:00100", | ||
391 | dev->id); | ||
392 | impd1->clks[2] = clkdev_alloc(&fixed_14745600, NULL, "lm%x:00200", | ||
393 | dev->id); | ||
394 | for (i = 0; i < ARRAY_SIZE(impd1->clks); i++) | ||
395 | clkdev_add(impd1->clks[i]); | ||
396 | 336 | ||
397 | for (i = 0; i < ARRAY_SIZE(impd1_devs); i++) { | 337 | for (i = 0; i < ARRAY_SIZE(impd1_devs); i++) { |
398 | struct impd1_device *idev = impd1_devs + i; | 338 | struct impd1_device *idev = impd1_devs + i; |
@@ -431,12 +371,9 @@ static int impd1_remove_one(struct device *dev, void *data) | |||
431 | static void impd1_remove(struct lm_device *dev) | 371 | static void impd1_remove(struct lm_device *dev) |
432 | { | 372 | { |
433 | struct impd1_module *impd1 = lm_get_drvdata(dev); | 373 | struct impd1_module *impd1 = lm_get_drvdata(dev); |
434 | int i; | ||
435 | 374 | ||
436 | device_for_each_child(&dev->dev, NULL, impd1_remove_one); | 375 | device_for_each_child(&dev->dev, NULL, impd1_remove_one); |
437 | 376 | integrator_impd1_clk_exit(dev->id); | |
438 | for (i = 0; i < ARRAY_SIZE(impd1->clks); i++) | ||
439 | clkdev_drop(impd1->clks[i]); | ||
440 | 377 | ||
441 | lm_set_drvdata(dev, NULL); | 378 | lm_set_drvdata(dev, NULL); |
442 | 379 | ||