Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Linus Walleij and committed by
Mike Turquette
70ee6577 7a9ad671

+103 -66
+3 -66
arch/arm/mach-integrator/impd1.c
··· 21 21 #include <linux/amba/bus.h> 22 22 #include <linux/amba/clcd.h> 23 23 #include <linux/io.h> 24 + #include <linux/platform_data/clk-integrator.h> 24 25 #include <linux/slab.h> 25 - #include <linux/clkdev.h> 26 26 27 - #include <asm/hardware/icst.h> 28 27 #include <mach/lm.h> 29 28 #include <mach/impd1.h> 30 29 #include <asm/sizes.h> ··· 35 36 36 37 struct impd1_module { 37 38 void __iomem *base; 38 - struct clk vcos[2]; 39 - struct clk_lookup *clks[3]; 40 - }; 41 - 42 - static const struct icst_params impd1_vco_params = { 43 - .ref = 24000000, /* 24 MHz */ 44 - .vco_max = ICST525_VCO_MAX_3V, 45 - .vco_min = ICST525_VCO_MIN, 46 - .vd_min = 12, 47 - .vd_max = 519, 48 - .rd_min = 3, 49 - .rd_max = 120, 50 - .s2div = icst525_s2div, 51 - .idx2s = icst525_idx2s, 52 - }; 53 - 54 - static void impd1_setvco(struct clk *clk, struct icst_vco vco) 55 - { 56 - struct impd1_module *impd1 = clk->data; 57 - u32 val = vco.v | (vco.r << 9) | (vco.s << 16); 58 - 59 - writel(0xa05f, impd1->base + IMPD1_LOCK); 60 - writel(val, clk->vcoreg); 61 - writel(0, impd1->base + IMPD1_LOCK); 62 - 63 - #ifdef DEBUG 64 - vco.v = val & 0x1ff; 65 - vco.r = (val >> 9) & 0x7f; 66 - vco.s = (val >> 16) & 7; 67 - 68 - pr_debug("IM-PD1: VCO%d clock is %ld Hz\n", 69 - vconr, icst525_hz(&impd1_vco_params, vco)); 70 - #endif 71 - } 72 - 73 - static const struct clk_ops impd1_clk_ops = { 74 - .round = icst_clk_round, 75 - .set = icst_clk_set, 76 - .setvco = impd1_setvco, 77 39 }; 78 40 79 41 void impd1_tweak_control(struct device *dev, u32 mask, u32 val) ··· 304 344 } 305 345 }; 306 346 307 - static struct clk fixed_14745600 = { 308 - .rate = 14745600, 309 - }; 310 - 311 347 static int impd1_probe(struct lm_device *dev) 312 348 { 313 349 struct impd1_module *impd1; ··· 332 376 printk("IM-PD1 found at 0x%08lx\n", 333 377 (unsigned long)dev->resource.start); 334 378 335 - for (i = 0; i < ARRAY_SIZE(impd1->vcos); i++) { 336 - impd1->vcos[i].ops = &impd1_clk_ops, 337 - impd1->vcos[i].owner = THIS_MODULE, 338 - impd1->vcos[i].params = &impd1_vco_params, 339 - impd1->vcos[i].data = impd1; 340 - } 341 - impd1->vcos[0].vcoreg = impd1->base + IMPD1_OSC1; 342 - impd1->vcos[1].vcoreg = impd1->base + IMPD1_OSC2; 343 - 344 - impd1->clks[0] = clkdev_alloc(&impd1->vcos[0], NULL, "lm%x:01000", 345 - dev->id); 346 - impd1->clks[1] = clkdev_alloc(&fixed_14745600, NULL, "lm%x:00100", 347 - dev->id); 348 - impd1->clks[2] = clkdev_alloc(&fixed_14745600, NULL, "lm%x:00200", 349 - dev->id); 350 - for (i = 0; i < ARRAY_SIZE(impd1->clks); i++) 351 - clkdev_add(impd1->clks[i]); 379 + integrator_impd1_clk_init(impd1->base, dev->id); 352 380 353 381 for (i = 0; i < ARRAY_SIZE(impd1_devs); i++) { 354 382 struct impd1_device *idev = impd1_devs + i; ··· 371 431 static void impd1_remove(struct lm_device *dev) 372 432 { 373 433 struct impd1_module *impd1 = lm_get_drvdata(dev); 374 - int i; 375 434 376 435 device_for_each_child(&dev->dev, NULL, impd1_remove_one); 377 - 378 - for (i = 0; i < ARRAY_SIZE(impd1->clks); i++) 379 - clkdev_drop(impd1->clks[i]); 436 + integrator_impd1_clk_exit(dev->id); 380 437 381 438 lm_set_drvdata(dev, NULL); 382 439
+1
drivers/clk/versatile/Makefile
··· 1 1 # Makefile for Versatile-specific clocks 2 2 obj-$(CONFIG_ICST) += clk-icst.o 3 3 obj-$(CONFIG_ARCH_INTEGRATOR) += clk-integrator.o 4 + obj-$(CONFIG_INTEGRATOR_IMPD1) += clk-impd1.o 4 5 obj-$(CONFIG_ARCH_REALVIEW) += clk-realview.o 5 6 obj-$(CONFIG_ARCH_VEXPRESS) += clk-vexpress.o 6 7 obj-$(CONFIG_VEXPRESS_CONFIG) += clk-vexpress-osc.o
+97
drivers/clk/versatile/clk-impd1.c
··· 1 + /* 2 + * Clock driver for the ARM Integrator/IM-PD1 board 3 + * Copyright (C) 2012 Linus Walleij 4 + * 5 + * This program is free software; you can redistribute it and/or modify 6 + * it under the terms of the GNU General Public License version 2 as 7 + * published by the Free Software Foundation. 8 + */ 9 + #include <linux/clk-provider.h> 10 + #include <linux/clk.h> 11 + #include <linux/clkdev.h> 12 + #include <linux/err.h> 13 + #include <linux/io.h> 14 + #include <linux/platform_data/clk-integrator.h> 15 + 16 + #include <mach/impd1.h> 17 + 18 + #include "clk-icst.h" 19 + 20 + struct impd1_clk { 21 + struct clk *vcoclk; 22 + struct clk *uartclk; 23 + struct clk_lookup *clks[3]; 24 + }; 25 + 26 + static struct impd1_clk impd1_clks[4]; 27 + 28 + /* 29 + * There are two VCO's on the IM-PD1 but only one is used by the 30 + * kernel, that is why we are only implementing the control of 31 + * IMPD1_OSC1 here. 32 + */ 33 + 34 + static const struct icst_params impd1_vco_params = { 35 + .ref = 24000000, /* 24 MHz */ 36 + .vco_max = ICST525_VCO_MAX_3V, 37 + .vco_min = ICST525_VCO_MIN, 38 + .vd_min = 12, 39 + .vd_max = 519, 40 + .rd_min = 3, 41 + .rd_max = 120, 42 + .s2div = icst525_s2div, 43 + .idx2s = icst525_idx2s, 44 + }; 45 + 46 + static const struct clk_icst_desc impd1_icst1_desc = { 47 + .params = &impd1_vco_params, 48 + .vco_offset = IMPD1_OSC1, 49 + .lock_offset = IMPD1_LOCK, 50 + }; 51 + 52 + /** 53 + * integrator_impd1_clk_init() - set up the integrator clock tree 54 + * @base: base address of the logic module (LM) 55 + * @id: the ID of this LM 56 + */ 57 + void integrator_impd1_clk_init(void __iomem *base, unsigned int id) 58 + { 59 + struct impd1_clk *imc; 60 + struct clk *clk; 61 + int i; 62 + 63 + if (id > 3) { 64 + pr_crit("no more than 4 LMs can be attached\n"); 65 + return; 66 + } 67 + imc = &impd1_clks[id]; 68 + 69 + clk = icst_clk_register(NULL, &impd1_icst1_desc, base); 70 + imc->vcoclk = clk; 71 + imc->clks[0] = clkdev_alloc(clk, NULL, "lm%x:01000", id); 72 + 73 + /* UART reference clock */ 74 + clk = clk_register_fixed_rate(NULL, "uartclk", NULL, CLK_IS_ROOT, 75 + 14745600); 76 + imc->uartclk = clk; 77 + imc->clks[1] = clkdev_alloc(clk, NULL, "lm%x:00100", id); 78 + imc->clks[2] = clkdev_alloc(clk, NULL, "lm%x:00200", id); 79 + 80 + for (i = 0; i < ARRAY_SIZE(imc->clks); i++) 81 + clkdev_add(imc->clks[i]); 82 + } 83 + 84 + void integrator_impd1_clk_exit(unsigned int id) 85 + { 86 + int i; 87 + struct impd1_clk *imc; 88 + 89 + if (id > 3) 90 + return; 91 + imc = &impd1_clks[id]; 92 + 93 + for (i = 0; i < ARRAY_SIZE(imc->clks); i++) 94 + clkdev_drop(imc->clks[i]); 95 + clk_unregister(imc->uartclk); 96 + clk_unregister(imc->vcoclk); 97 + }
+2
include/linux/platform_data/clk-integrator.h
··· 1 1 void integrator_clk_init(bool is_cp); 2 + void integrator_impd1_clk_init(void __iomem *base, unsigned int id); 3 + void integrator_impd1_clk_exit(unsigned int id);