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

ARM: Indirect round/set_rate operations through clk structure

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>

+77 -24
+8 -2
arch/arm/mach-integrator/impd1.c
··· 71 71 #endif 72 72 } 73 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 + }; 79 + 74 80 void impd1_tweak_control(struct device *dev, u32 mask, u32 val) 75 81 { 76 82 struct impd1_module *impd1 = dev_get_drvdata(dev); ··· 372 366 (unsigned long)dev->resource.start); 373 367 374 368 for (i = 0; i < ARRAY_SIZE(impd1->vcos); i++) { 369 + impd1->vcos[i].ops = &impd1_clk_ops, 375 370 impd1->vcos[i].owner = THIS_MODULE, 376 371 impd1->vcos[i].params = &impd1_vco_params, 377 - impd1->vcos[i].data = impd1, 378 - impd1->vcos[i].setvco = impd1_setvco; 372 + impd1->vcos[i].data = impd1; 379 373 } 380 374 impd1->vcos[0].vcoreg = impd1->base + IMPD1_OSC1; 381 375 impd1->vcos[1].vcoreg = impd1->base + IMPD1_OSC2;
+2 -2
arch/arm/mach-integrator/include/mach/clkdev.h
··· 2 2 #define __ASM_MACH_CLKDEV_H 3 3 4 4 #include <linux/module.h> 5 - #include <asm/hardware/icst.h> 5 + #include <plat/clock.h> 6 6 7 7 struct clk { 8 8 unsigned long rate; 9 + const struct clk_ops *ops; 9 10 struct module *owner; 10 11 const struct icst_params *params; 11 12 void __iomem *vcoreg; 12 - void (*setvco)(struct clk *, struct icst_vco vco); 13 13 void *data; 14 14 }; 15 15
+7 -1
arch/arm/mach-integrator/integrator_cp.c
··· 293 293 writel(0, CM_LOCK); 294 294 } 295 295 296 + static const struct clk_ops cp_auxclk_ops = { 297 + .round = icst_clk_round, 298 + .set = icst_clk_set, 299 + .setvco = cp_auxvco_set, 300 + }; 301 + 296 302 static struct clk cp_auxclk = { 303 + .ops = &cp_auxclk_ops, 297 304 .params = &cp_auxvco_params, 298 305 .vcoreg = CM_AUXOSC, 299 - .setvco = cp_auxvco_set, 300 306 }; 301 307 302 308 static struct clk_lookup cp_lookups[] = {
+7 -1
arch/arm/mach-realview/core.c
··· 281 281 writel(0, sys_lock); 282 282 } 283 283 284 + static const struct clk_ops oscvco_clk_ops = { 285 + .round = icst_clk_round, 286 + .set = icst_clk_set, 287 + .setvco = realview_oscvco_set, 288 + }; 289 + 284 290 static struct clk oscvco_clk = { 291 + .ops = &oscvco_clk_ops, 285 292 .params = &realview_oscvco_params, 286 - .setvco = realview_oscvco_set, 287 293 }; 288 294 289 295 /*
+2 -2
arch/arm/mach-realview/include/mach/clkdev.h
··· 1 1 #ifndef __ASM_MACH_CLKDEV_H 2 2 #define __ASM_MACH_CLKDEV_H 3 3 4 - #include <asm/hardware/icst.h> 4 + #include <plat/clock.h> 5 5 6 6 struct clk { 7 7 unsigned long rate; 8 + const struct clk_ops *ops; 8 9 const struct icst_params *params; 9 10 void __iomem *vcoreg; 10 - void (*setvco)(struct clk *, struct icst_vco vco); 11 11 }; 12 12 13 13 #define __clk_get(clk) ({ 1; })
+8 -2
arch/arm/mach-versatile/core.c
··· 381 381 writel(0, sys_lock); 382 382 } 383 383 384 - static struct clk osc4_clk = { 385 - .params = &versatile_oscvco_params, 384 + static const struct clk_ops osc4_clk_ops = { 385 + .round = icst_clk_round, 386 + .set = icst_clk_set, 386 387 .setvco = versatile_oscvco_set, 388 + }; 389 + 390 + static struct clk osc4_clk = { 391 + .ops = &osc4_clk_ops, 392 + .params = &versatile_oscvco_params, 387 393 }; 388 394 389 395 /*
+2 -2
arch/arm/mach-versatile/include/mach/clkdev.h
··· 1 1 #ifndef __ASM_MACH_CLKDEV_H 2 2 #define __ASM_MACH_CLKDEV_H 3 3 4 - #include <asm/hardware/icst.h> 4 + #include <plat/clock.h> 5 5 6 6 struct clk { 7 7 unsigned long rate; 8 + const struct clk_ops *ops; 8 9 const struct icst_params *params; 9 10 void __iomem *vcoreg; 10 - void (*setvco)(struct clk *, struct icst_vco vco); 11 11 }; 12 12 13 13 #define __clk_get(clk) ({ 1; })
+26 -12
arch/arm/plat-versatile/clock.c
··· 37 37 38 38 long clk_round_rate(struct clk *clk, unsigned long rate) 39 39 { 40 - struct icst_vco vco; 41 - vco = icst_hz_to_vco(clk->params, rate); 42 - return icst_hz(clk->params, vco); 40 + long ret = -EIO; 41 + if (clk->ops && clk->ops->round) 42 + ret = clk->ops->round(clk, rate); 43 + return ret; 43 44 } 44 45 EXPORT_SYMBOL(clk_round_rate); 45 46 46 47 int clk_set_rate(struct clk *clk, unsigned long rate) 47 48 { 48 49 int ret = -EIO; 49 - 50 - if (clk->setvco) { 51 - struct icst_vco vco; 52 - 53 - vco = icst_hz_to_vco(clk->params, rate); 54 - clk->rate = icst_hz(clk->params, vco); 55 - clk->setvco(clk, vco); 56 - ret = 0; 57 - } 50 + if (clk->ops && clk->ops->set) 51 + ret = clk->ops->set(clk, rate); 58 52 return ret; 59 53 } 60 54 EXPORT_SYMBOL(clk_set_rate); 55 + 56 + long icst_clk_round(struct clk *clk, unsigned long rate) 57 + { 58 + struct icst_vco vco; 59 + vco = icst_hz_to_vco(clk->params, rate); 60 + return icst_hz(clk->params, vco); 61 + } 62 + EXPORT_SYMBOL(icst_clk_round); 63 + 64 + int icst_clk_set(struct clk *clk, unsigned long rate) 65 + { 66 + struct icst_vco vco; 67 + 68 + vco = icst_hz_to_vco(clk->params, rate); 69 + clk->rate = icst_hz(clk->params, vco); 70 + clk->ops->setvco(clk, vco); 71 + 72 + return 0; 73 + } 74 + EXPORT_SYMBOL(icst_clk_set);
+15
arch/arm/plat-versatile/include/plat/clock.h
··· 1 + #ifndef PLAT_CLOCK_H 2 + #define PLAT_CLOCK_H 3 + 4 + #include <asm/hardware/icst.h> 5 + 6 + struct clk_ops { 7 + long (*round)(struct clk *, unsigned long); 8 + int (*set)(struct clk *, unsigned long); 9 + void (*setvco)(struct clk *, struct icst_vco); 10 + }; 11 + 12 + int icst_clk_set(struct clk *, unsigned long); 13 + long icst_clk_round(struct clk *, unsigned long); 14 + 15 + #endif