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

ARM: imx: move timer resources into a structure

Instead of passing around as individual argument, let's move timer
resources like irq and clocks together with base address into a data
structure, and pass pointer of the structure as argument to simplify
the function call interface.

Signed-off-by: Shawn Guo <shawn.guo@linaro.org>

Shawn Guo 6dd74782 c7770bba

+56 -35
+56 -35
arch/arm/mach-imx/time.c
··· 28 28 #include <linux/delay.h> 29 29 #include <linux/err.h> 30 30 #include <linux/sched_clock.h> 31 + #include <linux/slab.h> 31 32 #include <linux/of.h> 32 33 #include <linux/of_address.h> 33 34 #include <linux/of_irq.h> ··· 85 84 static struct clock_event_device clockevent_mxc; 86 85 static enum clock_event_mode clockevent_mode = CLOCK_EVT_MODE_UNUSED; 87 86 87 + struct imx_timer { 88 + void __iomem *base; 89 + int irq; 90 + struct clk *clk_per; 91 + struct clk *clk_ipg; 92 + }; 93 + 88 94 static void __iomem *timer_base; 89 95 90 96 static inline void gpt_irq_disable(void) ··· 142 134 return readl_relaxed(sched_clock_reg); 143 135 } 144 136 145 - static int __init mxc_clocksource_init(struct clk *timer_clk) 137 + static int __init mxc_clocksource_init(struct imx_timer *imxtm) 146 138 { 147 - unsigned int c = clk_get_rate(timer_clk); 148 - void __iomem *reg = timer_base + (timer_is_v2() ? V2_TCN : MX1_2_TCN); 139 + unsigned int c = clk_get_rate(imxtm->clk_per); 140 + void __iomem *reg = imxtm->base + (timer_is_v2() ? V2_TCN : MX1_2_TCN); 149 141 150 142 imx_delay_timer.read_current_timer = &imx_read_current_timer; 151 143 imx_delay_timer.freq = c; ··· 292 284 .rating = 200, 293 285 }; 294 286 295 - static int __init mxc_clockevent_init(struct clk *timer_clk) 287 + static int __init mxc_clockevent_init(struct imx_timer *imxtm) 296 288 { 297 289 if (timer_is_v2()) 298 290 clockevent_mxc.set_next_event = v2_set_next_event; 299 291 300 292 clockevent_mxc.cpumask = cpumask_of(0); 301 293 clockevents_config_and_register(&clockevent_mxc, 302 - clk_get_rate(timer_clk), 294 + clk_get_rate(imxtm->clk_per), 303 295 0xff, 0xfffffffe); 304 296 305 297 return 0; 306 298 } 307 299 308 - static void __init _mxc_timer_init(int irq, 309 - struct clk *clk_per, struct clk *clk_ipg) 300 + static void __init _mxc_timer_init(struct imx_timer *imxtm) 310 301 { 311 302 uint32_t tctl_val; 312 303 313 - if (IS_ERR(clk_per)) { 304 + /* Temporary */ 305 + timer_base = imxtm->base; 306 + 307 + if (IS_ERR(imxtm->clk_per)) { 314 308 pr_err("i.MX timer: unable to get clk\n"); 315 309 return; 316 310 } 317 311 318 - if (!IS_ERR(clk_ipg)) 319 - clk_prepare_enable(clk_ipg); 312 + if (!IS_ERR(imxtm->clk_ipg)) 313 + clk_prepare_enable(imxtm->clk_ipg); 320 314 321 - clk_prepare_enable(clk_per); 315 + clk_prepare_enable(imxtm->clk_per); 322 316 323 317 /* 324 318 * Initialise to a known state (all timers off, and timing reset) 325 319 */ 326 320 327 - writel_relaxed(0, timer_base + MXC_TCTL); 328 - writel_relaxed(0, timer_base + MXC_TPRER); /* see datasheet note */ 321 + writel_relaxed(0, imxtm->base + MXC_TCTL); 322 + writel_relaxed(0, imxtm->base + MXC_TPRER); /* see datasheet note */ 329 323 330 324 if (timer_is_v2()) { 331 325 tctl_val = V2_TCTL_FRR | V2_TCTL_WAITEN | MXC_TCTL_TEN; 332 - if (clk_get_rate(clk_per) == V2_TIMER_RATE_OSC_DIV8) { 326 + if (clk_get_rate(imxtm->clk_per) == V2_TIMER_RATE_OSC_DIV8) { 333 327 tctl_val |= V2_TCTL_CLK_OSC_DIV8; 334 328 if (cpu_is_imx6dl() || cpu_is_imx6sx()) { 335 329 /* 24 / 8 = 3 MHz */ 336 330 writel_relaxed(7 << V2_TPRER_PRE24M, 337 - timer_base + MXC_TPRER); 331 + imxtm->base + MXC_TPRER); 338 332 tctl_val |= V2_TCTL_24MEN; 339 333 } 340 334 } else { ··· 346 336 tctl_val = MX1_2_TCTL_FRR | MX1_2_TCTL_CLK_PCLK1 | MXC_TCTL_TEN; 347 337 } 348 338 349 - writel_relaxed(tctl_val, timer_base + MXC_TCTL); 339 + writel_relaxed(tctl_val, imxtm->base + MXC_TCTL); 350 340 351 341 /* init and register the timer to the framework */ 352 - mxc_clocksource_init(clk_per); 353 - mxc_clockevent_init(clk_per); 342 + mxc_clocksource_init(imxtm); 343 + mxc_clockevent_init(imxtm); 354 344 355 345 /* Make irqs happen */ 356 - setup_irq(irq, &mxc_timer_irq); 346 + setup_irq(imxtm->irq, &mxc_timer_irq); 357 347 } 358 348 359 349 void __init mxc_timer_init(unsigned long pbase, int irq) 360 350 { 361 - struct clk *clk_per = clk_get_sys("imx-gpt.0", "per"); 362 - struct clk *clk_ipg = clk_get_sys("imx-gpt.0", "ipg"); 351 + struct imx_timer *imxtm; 363 352 364 - timer_base = ioremap(pbase, SZ_4K); 365 - BUG_ON(!timer_base); 353 + imxtm = kzalloc(sizeof(*imxtm), GFP_KERNEL); 354 + BUG_ON(!imxtm); 366 355 367 - _mxc_timer_init(irq, clk_per, clk_ipg); 356 + imxtm->clk_per = clk_get_sys("imx-gpt.0", "per"); 357 + imxtm->clk_ipg = clk_get_sys("imx-gpt.0", "ipg"); 358 + 359 + imxtm->base = ioremap(pbase, SZ_4K); 360 + BUG_ON(!imxtm->base); 361 + 362 + _mxc_timer_init(imxtm); 368 363 } 369 364 370 365 static void __init mxc_timer_init_dt(struct device_node *np) 371 366 { 372 - struct clk *clk_per, *clk_ipg; 373 - int irq; 367 + struct imx_timer *imxtm; 368 + static int initialized; 374 369 375 - if (timer_base) 370 + /* Support one instance only */ 371 + if (initialized) 376 372 return; 377 373 378 - timer_base = of_iomap(np, 0); 379 - WARN_ON(!timer_base); 380 - irq = irq_of_parse_and_map(np, 0); 374 + imxtm = kzalloc(sizeof(*imxtm), GFP_KERNEL); 375 + BUG_ON(!imxtm); 381 376 382 - clk_ipg = of_clk_get_by_name(np, "ipg"); 377 + imxtm->base = of_iomap(np, 0); 378 + WARN_ON(!imxtm->base); 379 + imxtm->irq = irq_of_parse_and_map(np, 0); 380 + 381 + imxtm->clk_ipg = of_clk_get_by_name(np, "ipg"); 383 382 384 383 /* Try osc_per first, and fall back to per otherwise */ 385 - clk_per = of_clk_get_by_name(np, "osc_per"); 386 - if (IS_ERR(clk_per)) 387 - clk_per = of_clk_get_by_name(np, "per"); 384 + imxtm->clk_per = of_clk_get_by_name(np, "osc_per"); 385 + if (IS_ERR(imxtm->clk_per)) 386 + imxtm->clk_per = of_clk_get_by_name(np, "per"); 388 387 389 - _mxc_timer_init(irq, clk_per, clk_ipg); 388 + _mxc_timer_init(imxtm); 389 + 390 + initialized = 1; 390 391 } 391 392 CLOCKSOURCE_OF_DECLARE(mx1_timer, "fsl,imx1-gpt", mxc_timer_init_dt); 392 393 CLOCKSOURCE_OF_DECLARE(mx25_timer, "fsl,imx25-gpt", mxc_timer_init_dt);