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

Merge tag 'remove-local-timers' of git://git.kernel.org/pub/scm/linux/kernel/git/davidb/linux-msm into next/cleanup

From Stephen Boyd:

Now that we have a generic arch hook for broadcast we can remove the
local timer API entirely. Doing so will reduce code in ARM core, reduce
the architecture dependencies of our timer drivers, and simplify the code
because we no longer go through an architecture layer that is essentially
a hotplug notifier.

* tag 'remove-local-timers' of git://git.kernel.org/pub/scm/linux/kernel/git/davidb/linux-msm:
ARM: smp: Remove local timer API
clocksource: time-armada-370-xp: Divorce from local timer API
clocksource: time-armada-370-xp: Fix sparse warning
ARM: msm: Divorce msm_timer from local timer API
ARM: PRIMA2: Divorce timer-marco from local timer API
ARM: EXYNOS4: Divorce mct from local timer API
ARM: OMAP2+: Divorce from local timer API
ARM: smp_twd: Divorce smp_twd from local timer API
ARM: smp: Remove duplicate dummy timer implementation

Resolved a large number of conflicts due to __cpuinit cleanups, etc.

Signed-off-by: Olof Johansson <olof@lixom.net>

+265 -341
+1 -11
arch/arm/Kconfig
··· 645 645 select CLKDEV_LOOKUP 646 646 select GENERIC_CLOCKEVENTS 647 647 select HAVE_ARM_SCU if SMP 648 - select HAVE_ARM_TWD if LOCAL_TIMERS 648 + select HAVE_ARM_TWD if SMP 649 649 select HAVE_CLK 650 650 select HAVE_MACH_CLKDEV 651 651 select HAVE_SMP ··· 1583 1583 management operations described in ARM document number ARM DEN 1584 1584 0022A ("Power State Coordination Interface System Software on 1585 1585 ARM processors"). 1586 - 1587 - config LOCAL_TIMERS 1588 - bool "Use local timer interrupts" 1589 - depends on SMP 1590 - default y 1591 - help 1592 - Enable support for local timers on SMP platforms, rather then the 1593 - legacy IPI broadcast method. Local timers allows the system 1594 - accounting to be spread across the timer interval, preventing a 1595 - "thundering herd" at every timer tick. 1596 1586 1597 1587 # The GPIO number here must be sorted by descending number. In case of 1598 1588 # a multiplatform kernel, we just want the highest value required by the
-34
arch/arm/include/asm/localtimer.h
··· 1 - /* 2 - * arch/arm/include/asm/localtimer.h 3 - * 4 - * Copyright (C) 2004-2005 ARM Ltd. 5 - * 6 - * This program is free software; you can redistribute it and/or modify 7 - * it under the terms of the GNU General Public License version 2 as 8 - * published by the Free Software Foundation. 9 - */ 10 - #ifndef __ASM_ARM_LOCALTIMER_H 11 - #define __ASM_ARM_LOCALTIMER_H 12 - 13 - #include <linux/errno.h> 14 - 15 - struct clock_event_device; 16 - 17 - struct local_timer_ops { 18 - int (*setup)(struct clock_event_device *); 19 - void (*stop)(struct clock_event_device *); 20 - }; 21 - 22 - #ifdef CONFIG_LOCAL_TIMERS 23 - /* 24 - * Register a local timer driver 25 - */ 26 - int local_timer_register(struct local_timer_ops *); 27 - #else 28 - static inline int local_timer_register(struct local_timer_ops *ops) 29 - { 30 - return -ENXIO; 31 - } 32 - #endif 33 - 34 - #endif
-87
arch/arm/kernel/smp.c
··· 41 41 #include <asm/sections.h> 42 42 #include <asm/tlbflush.h> 43 43 #include <asm/ptrace.h> 44 - #include <asm/localtimer.h> 45 44 #include <asm/smp_plat.h> 46 45 #include <asm/virt.h> 47 46 #include <asm/mach/arch.h> ··· 145 146 } 146 147 147 148 #ifdef CONFIG_HOTPLUG_CPU 148 - static void percpu_timer_stop(void); 149 - 150 149 static int platform_cpu_kill(unsigned int cpu) 151 150 { 152 151 if (smp_ops.cpu_kill) ··· 186 189 * OK - migrate IRQs away from this CPU 187 190 */ 188 191 migrate_irqs(); 189 - 190 - /* 191 - * Stop the local timer for this CPU. 192 - */ 193 - percpu_timer_stop(); 194 192 195 193 /* 196 194 * Flush user cache and TLB mappings, and then remove this CPU ··· 308 316 store_cpu_topology(cpuid); 309 317 } 310 318 311 - static void percpu_timer_setup(void); 312 - 313 319 /* 314 320 * This is the secondary CPU boot entry. We're using this CPUs 315 321 * idle thread stack, but a set of temporary page tables. ··· 362 372 set_cpu_online(cpu, true); 363 373 complete(&cpu_running); 364 374 365 - /* 366 - * Setup the percpu timer for this CPU. 367 - */ 368 - percpu_timer_setup(); 369 - 370 375 local_irq_enable(); 371 376 local_fiq_enable(); 372 377 ··· 407 422 if (max_cpus > ncores) 408 423 max_cpus = ncores; 409 424 if (ncores > 1 && max_cpus) { 410 - /* 411 - * Enable the local timer or broadcast device for the 412 - * boot CPU, but only if we have more than one CPU. 413 - */ 414 - percpu_timer_setup(); 415 - 416 425 /* 417 426 * Initialise the present map, which describes the set of CPUs 418 427 * actually populated at the present time. A platform should ··· 483 504 return sum; 484 505 } 485 506 486 - /* 487 - * Timer (local or broadcast) support 488 - */ 489 - static DEFINE_PER_CPU(struct clock_event_device, percpu_clockevent); 490 - 491 507 #ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST 492 508 void tick_broadcast(const struct cpumask *mask) 493 509 { 494 510 smp_cross_call(mask, IPI_TIMER); 495 - } 496 - #endif 497 - 498 - static void broadcast_timer_set_mode(enum clock_event_mode mode, 499 - struct clock_event_device *evt) 500 - { 501 - } 502 - 503 - static void broadcast_timer_setup(struct clock_event_device *evt) 504 - { 505 - evt->name = "dummy_timer"; 506 - evt->features = CLOCK_EVT_FEAT_ONESHOT | 507 - CLOCK_EVT_FEAT_PERIODIC | 508 - CLOCK_EVT_FEAT_DUMMY; 509 - evt->rating = 100; 510 - evt->mult = 1; 511 - evt->set_mode = broadcast_timer_set_mode; 512 - 513 - clockevents_register_device(evt); 514 - } 515 - 516 - static struct local_timer_ops *lt_ops; 517 - 518 - #ifdef CONFIG_LOCAL_TIMERS 519 - int local_timer_register(struct local_timer_ops *ops) 520 - { 521 - if (!is_smp() || !setup_max_cpus) 522 - return -ENXIO; 523 - 524 - if (lt_ops) 525 - return -EBUSY; 526 - 527 - lt_ops = ops; 528 - return 0; 529 - } 530 - #endif 531 - 532 - static void percpu_timer_setup(void) 533 - { 534 - unsigned int cpu = smp_processor_id(); 535 - struct clock_event_device *evt = &per_cpu(percpu_clockevent, cpu); 536 - 537 - evt->cpumask = cpumask_of(cpu); 538 - 539 - if (!lt_ops || lt_ops->setup(evt)) 540 - broadcast_timer_setup(evt); 541 - } 542 - 543 - #ifdef CONFIG_HOTPLUG_CPU 544 - /* 545 - * The generic clock events code purposely does not stop the local timer 546 - * on CPU_DEAD/CPU_DEAD_FROZEN hotplug events, so we have to do it 547 - * manually here. 548 - */ 549 - static void percpu_timer_stop(void) 550 - { 551 - unsigned int cpu = smp_processor_id(); 552 - struct clock_event_device *evt = &per_cpu(percpu_clockevent, cpu); 553 - 554 - if (lt_ops) 555 - lt_ops->stop(evt); 556 511 } 557 512 #endif 558 513
+44 -22
arch/arm/kernel/smp_twd.c
··· 11 11 #include <linux/init.h> 12 12 #include <linux/kernel.h> 13 13 #include <linux/clk.h> 14 + #include <linux/cpu.h> 14 15 #include <linux/delay.h> 15 16 #include <linux/device.h> 16 17 #include <linux/err.h> ··· 25 24 26 25 #include <asm/smp_plat.h> 27 26 #include <asm/smp_twd.h> 28 - #include <asm/localtimer.h> 29 27 30 28 /* set up by the platform code */ 31 29 static void __iomem *twd_base; ··· 33 33 static unsigned long twd_timer_rate; 34 34 static DEFINE_PER_CPU(bool, percpu_setup_called); 35 35 36 - static struct clock_event_device __percpu **twd_evt; 36 + static struct clock_event_device __percpu *twd_evt; 37 37 static int twd_ppi; 38 38 39 39 static void twd_set_mode(enum clock_event_mode mode, ··· 90 90 return 0; 91 91 } 92 92 93 - static void twd_timer_stop(struct clock_event_device *clk) 93 + static void twd_timer_stop(void) 94 94 { 95 + struct clock_event_device *clk = __this_cpu_ptr(twd_evt); 96 + 95 97 twd_set_mode(CLOCK_EVT_MODE_UNUSED, clk); 96 98 disable_percpu_irq(clk->irq); 97 99 } ··· 108 106 { 109 107 twd_timer_rate = *((unsigned long *) new_rate); 110 108 111 - clockevents_update_freq(*__this_cpu_ptr(twd_evt), twd_timer_rate); 109 + clockevents_update_freq(__this_cpu_ptr(twd_evt), twd_timer_rate); 112 110 } 113 111 114 112 static int twd_rate_change(struct notifier_block *nb, ··· 134 132 135 133 static int twd_clk_init(void) 136 134 { 137 - if (twd_evt && *__this_cpu_ptr(twd_evt) && !IS_ERR(twd_clk)) 135 + if (twd_evt && __this_cpu_ptr(twd_evt) && !IS_ERR(twd_clk)) 138 136 return clk_notifier_register(twd_clk, &twd_clk_nb); 139 137 140 138 return 0; ··· 153 151 { 154 152 twd_timer_rate = clk_get_rate(twd_clk); 155 153 156 - clockevents_update_freq(*__this_cpu_ptr(twd_evt), twd_timer_rate); 154 + clockevents_update_freq(__this_cpu_ptr(twd_evt), twd_timer_rate); 157 155 } 158 156 159 157 static int twd_cpufreq_transition(struct notifier_block *nb, ··· 179 177 180 178 static int twd_cpufreq_init(void) 181 179 { 182 - if (twd_evt && *__this_cpu_ptr(twd_evt) && !IS_ERR(twd_clk)) 180 + if (twd_evt && __this_cpu_ptr(twd_evt) && !IS_ERR(twd_clk)) 183 181 return cpufreq_register_notifier(&twd_cpufreq_nb, 184 182 CPUFREQ_TRANSITION_NOTIFIER); 185 183 ··· 230 228 231 229 static irqreturn_t twd_handler(int irq, void *dev_id) 232 230 { 233 - struct clock_event_device *evt = *(struct clock_event_device **)dev_id; 231 + struct clock_event_device *evt = dev_id; 234 232 235 233 if (twd_timer_ack()) { 236 234 evt->event_handler(evt); ··· 267 265 /* 268 266 * Setup the local clock events for a CPU. 269 267 */ 270 - static int twd_timer_setup(struct clock_event_device *clk) 268 + static void twd_timer_setup(void) 271 269 { 272 - struct clock_event_device **this_cpu_clk; 270 + struct clock_event_device *clk = __this_cpu_ptr(twd_evt); 273 271 int cpu = smp_processor_id(); 274 272 275 273 /* ··· 278 276 */ 279 277 if (per_cpu(percpu_setup_called, cpu)) { 280 278 __raw_writel(0, twd_base + TWD_TIMER_CONTROL); 281 - clockevents_register_device(*__this_cpu_ptr(twd_evt)); 279 + clockevents_register_device(clk); 282 280 enable_percpu_irq(clk->irq, 0); 283 - return 0; 281 + return; 284 282 } 285 283 per_cpu(percpu_setup_called, cpu) = true; 286 284 ··· 299 297 clk->set_mode = twd_set_mode; 300 298 clk->set_next_event = twd_set_next_event; 301 299 clk->irq = twd_ppi; 302 - 303 - this_cpu_clk = __this_cpu_ptr(twd_evt); 304 - *this_cpu_clk = clk; 300 + clk->cpumask = cpumask_of(cpu); 305 301 306 302 clockevents_config_and_register(clk, twd_timer_rate, 307 303 0xf, 0xffffffff); 308 304 enable_percpu_irq(clk->irq, 0); 309 - 310 - return 0; 311 305 } 312 306 313 - static struct local_timer_ops twd_lt_ops = { 314 - .setup = twd_timer_setup, 315 - .stop = twd_timer_stop, 307 + static int twd_timer_cpu_notify(struct notifier_block *self, 308 + unsigned long action, void *hcpu) 309 + { 310 + switch (action & ~CPU_TASKS_FROZEN) { 311 + case CPU_STARTING: 312 + twd_timer_setup(); 313 + break; 314 + case CPU_DYING: 315 + twd_timer_stop(); 316 + break; 317 + } 318 + 319 + return NOTIFY_OK; 320 + } 321 + 322 + static struct notifier_block twd_timer_cpu_nb = { 323 + .notifier_call = twd_timer_cpu_notify, 316 324 }; 317 325 318 326 static int __init twd_local_timer_common_register(struct device_node *np) 319 327 { 320 328 int err; 321 329 322 - twd_evt = alloc_percpu(struct clock_event_device *); 330 + twd_evt = alloc_percpu(struct clock_event_device); 323 331 if (!twd_evt) { 324 332 err = -ENOMEM; 325 333 goto out_free; ··· 341 329 goto out_free; 342 330 } 343 331 344 - err = local_timer_register(&twd_lt_ops); 332 + err = register_cpu_notifier(&twd_timer_cpu_nb); 345 333 if (err) 346 334 goto out_irq; 347 335 348 336 twd_get_clock(np); 337 + 338 + /* 339 + * Immediately configure the timer on the boot CPU, unless we need 340 + * jiffies to be incrementing to calibrate the rate in which case 341 + * setup the timer in late_time_init. 342 + */ 343 + if (twd_timer_rate) 344 + twd_timer_setup(); 345 + else 346 + late_time_init = twd_timer_setup; 349 347 350 348 return 0; 351 349
+1 -1
arch/arm/mach-highbank/Kconfig
··· 12 12 select CPU_V7 13 13 select GENERIC_CLOCKEVENTS 14 14 select HAVE_ARM_SCU 15 - select HAVE_ARM_TWD if LOCAL_TIMERS 15 + select HAVE_ARM_TWD if SMP 16 16 select HAVE_SMP 17 17 select MAILBOX 18 18 select PL320_MBOX
+2 -1
arch/arm/mach-imx/Kconfig
··· 793 793 select COMMON_CLK 794 794 select CPU_V7 795 795 select HAVE_ARM_SCU if SMP 796 - select HAVE_ARM_TWD if LOCAL_TIMERS 796 + select HAVE_ARM_TWD if SMP 797 + select HAVE_CAN_FLEXCAN if CAN 797 798 select HAVE_IMX_ANATOP 798 799 select HAVE_IMX_GPC 799 800 select HAVE_IMX_MMDC
+70 -56
arch/arm/mach-msm/timer.c
··· 16 16 17 17 #include <linux/clocksource.h> 18 18 #include <linux/clockchips.h> 19 + #include <linux/cpu.h> 19 20 #include <linux/init.h> 20 21 #include <linux/interrupt.h> 21 22 #include <linux/irq.h> ··· 27 26 #include <linux/sched_clock.h> 28 27 29 28 #include <asm/mach/time.h> 30 - #include <asm/localtimer.h> 31 29 32 30 #include "common.h" 33 31 ··· 49 49 50 50 static irqreturn_t msm_timer_interrupt(int irq, void *dev_id) 51 51 { 52 - struct clock_event_device *evt = *(struct clock_event_device **)dev_id; 52 + struct clock_event_device *evt = dev_id; 53 53 /* Stop the timer tick */ 54 54 if (evt->mode == CLOCK_EVT_MODE_ONESHOT) { 55 55 u32 ctrl = readl_relaxed(event_base + TIMER_ENABLE); ··· 101 101 writel_relaxed(ctrl, event_base + TIMER_ENABLE); 102 102 } 103 103 104 - static struct clock_event_device msm_clockevent = { 105 - .name = "gp_timer", 106 - .features = CLOCK_EVT_FEAT_ONESHOT, 107 - .rating = 200, 108 - .set_next_event = msm_timer_set_next_event, 109 - .set_mode = msm_timer_set_mode, 110 - }; 111 - 112 - static union { 113 - struct clock_event_device *evt; 114 - struct clock_event_device * __percpu *percpu_evt; 115 - } msm_evt; 104 + static struct clock_event_device __percpu *msm_evt; 116 105 117 106 static void __iomem *source_base; 118 107 ··· 127 138 .flags = CLOCK_SOURCE_IS_CONTINUOUS, 128 139 }; 129 140 130 - #ifdef CONFIG_LOCAL_TIMERS 141 + static int msm_timer_irq; 142 + static int msm_timer_has_ppi; 143 + 131 144 static int msm_local_timer_setup(struct clock_event_device *evt) 132 145 { 133 - /* Use existing clock_event for cpu 0 */ 134 - if (!smp_processor_id()) 135 - return 0; 146 + int cpu = smp_processor_id(); 147 + int err; 136 148 137 - evt->irq = msm_clockevent.irq; 138 - evt->name = "local_timer"; 139 - evt->features = msm_clockevent.features; 140 - evt->rating = msm_clockevent.rating; 149 + evt->irq = msm_timer_irq; 150 + evt->name = "msm_timer"; 151 + evt->features = CLOCK_EVT_FEAT_ONESHOT; 152 + evt->rating = 200; 141 153 evt->set_mode = msm_timer_set_mode; 142 154 evt->set_next_event = msm_timer_set_next_event; 155 + evt->cpumask = cpumask_of(cpu); 143 156 144 - *__this_cpu_ptr(msm_evt.percpu_evt) = evt; 145 - clockevents_config_and_register(evt, GPT_HZ, 4, 0xf0000000); 146 - enable_percpu_irq(evt->irq, IRQ_TYPE_EDGE_RISING); 157 + clockevents_config_and_register(evt, GPT_HZ, 4, 0xffffffff); 158 + 159 + if (msm_timer_has_ppi) { 160 + enable_percpu_irq(evt->irq, IRQ_TYPE_EDGE_RISING); 161 + } else { 162 + err = request_irq(evt->irq, msm_timer_interrupt, 163 + IRQF_TIMER | IRQF_NOBALANCING | 164 + IRQF_TRIGGER_RISING, "gp_timer", evt); 165 + if (err) 166 + pr_err("request_irq failed\n"); 167 + } 168 + 147 169 return 0; 148 170 } 149 171 ··· 164 164 disable_percpu_irq(evt->irq); 165 165 } 166 166 167 - static struct local_timer_ops msm_local_timer_ops = { 168 - .setup = msm_local_timer_setup, 169 - .stop = msm_local_timer_stop, 167 + static int msm_timer_cpu_notify(struct notifier_block *self, 168 + unsigned long action, void *hcpu) 169 + { 170 + /* 171 + * Grab cpu pointer in each case to avoid spurious 172 + * preemptible warnings 173 + */ 174 + switch (action & ~CPU_TASKS_FROZEN) { 175 + case CPU_STARTING: 176 + msm_local_timer_setup(this_cpu_ptr(msm_evt)); 177 + break; 178 + case CPU_DYING: 179 + msm_local_timer_stop(this_cpu_ptr(msm_evt)); 180 + break; 181 + } 182 + 183 + return NOTIFY_OK; 184 + } 185 + 186 + static struct notifier_block msm_timer_cpu_nb = { 187 + .notifier_call = msm_timer_cpu_notify, 170 188 }; 171 - #endif /* CONFIG_LOCAL_TIMERS */ 172 189 173 190 static notrace u32 msm_sched_clock_read(void) 174 191 { ··· 195 178 static void __init msm_timer_init(u32 dgt_hz, int sched_bits, int irq, 196 179 bool percpu) 197 180 { 198 - struct clock_event_device *ce = &msm_clockevent; 199 181 struct clocksource *cs = &msm_clocksource; 200 - int res; 182 + int res = 0; 201 183 202 - ce->cpumask = cpumask_of(0); 203 - ce->irq = irq; 184 + msm_timer_irq = irq; 185 + msm_timer_has_ppi = percpu; 204 186 205 - clockevents_config_and_register(ce, GPT_HZ, 4, 0xffffffff); 206 - if (percpu) { 207 - msm_evt.percpu_evt = alloc_percpu(struct clock_event_device *); 208 - if (!msm_evt.percpu_evt) { 209 - pr_err("memory allocation failed for %s\n", ce->name); 210 - goto err; 211 - } 212 - *__this_cpu_ptr(msm_evt.percpu_evt) = ce; 213 - res = request_percpu_irq(ce->irq, msm_timer_interrupt, 214 - ce->name, msm_evt.percpu_evt); 215 - if (!res) { 216 - enable_percpu_irq(ce->irq, IRQ_TYPE_EDGE_RISING); 217 - #ifdef CONFIG_LOCAL_TIMERS 218 - local_timer_register(&msm_local_timer_ops); 219 - #endif 220 - } 221 - } else { 222 - msm_evt.evt = ce; 223 - res = request_irq(ce->irq, msm_timer_interrupt, 224 - IRQF_TIMER | IRQF_NOBALANCING | 225 - IRQF_TRIGGER_RISING, ce->name, &msm_evt.evt); 187 + msm_evt = alloc_percpu(struct clock_event_device); 188 + if (!msm_evt) { 189 + pr_err("memory allocation failed for clockevents\n"); 190 + goto err; 226 191 } 227 192 228 - if (res) 229 - pr_err("request_irq failed for %s\n", ce->name); 193 + if (percpu) 194 + res = request_percpu_irq(irq, msm_timer_interrupt, 195 + "gp_timer", msm_evt); 196 + 197 + if (res) { 198 + pr_err("request_percpu_irq failed\n"); 199 + } else { 200 + res = register_cpu_notifier(&msm_timer_cpu_nb); 201 + if (res) { 202 + free_percpu_irq(irq, msm_evt); 203 + goto err; 204 + } 205 + 206 + /* Immediately configure the timer on the boot CPU */ 207 + msm_local_timer_setup(__this_cpu_ptr(msm_evt)); 208 + } 209 + 230 210 err: 231 211 writel_relaxed(TIMER_ENABLE_EN, source_base + TIMER_ENABLE); 232 212 res = clocksource_register_hz(cs, dgt_hz);
+1 -2
arch/arm/mach-omap2/Kconfig
··· 37 37 select CACHE_L2X0 38 38 select CPU_V7 39 39 select HAVE_ARM_SCU if SMP 40 - select HAVE_ARM_TWD if LOCAL_TIMERS 40 + select HAVE_ARM_TWD if SMP 41 41 select HAVE_SMP 42 - select LOCAL_TIMERS if SMP 43 42 select OMAP_INTERCONNECT 44 43 select PL310_ERRATA_588369 45 44 select PL310_ERRATA_727915
-7
arch/arm/mach-omap2/timer.c
··· 600 600 #endif 601 601 602 602 #ifdef CONFIG_ARCH_OMAP4 603 - #ifdef CONFIG_LOCAL_TIMERS 604 603 static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, OMAP44XX_LOCAL_TWD_BASE, 29); 605 604 void __init omap4_local_timer_init(void) 606 605 { ··· 618 619 pr_err("twd_local_timer_register failed %d\n", err); 619 620 } 620 621 } 621 - #else /* CONFIG_LOCAL_TIMERS */ 622 - void __init omap4_local_timer_init(void) 623 - { 624 - omap4_sync32k_timer_init(); 625 - } 626 - #endif /* CONFIG_LOCAL_TIMERS */ 627 622 #endif /* CONFIG_ARCH_OMAP4 */ 628 623 629 624 #ifdef CONFIG_SOC_OMAP5
+4 -4
arch/arm/mach-realview/Kconfig
··· 13 13 depends on MACH_REALVIEW_EB 14 14 select CPU_V7 15 15 select HAVE_ARM_SCU if SMP 16 - select HAVE_ARM_TWD if LOCAL_TIMERS 16 + select HAVE_ARM_TWD if SMP 17 17 select HAVE_SMP 18 18 select MIGHT_HAVE_CACHE_L2X0 19 19 help ··· 26 26 select ARCH_HAS_BARRIERS if SMP 27 27 select CPU_V6K 28 28 select HAVE_ARM_SCU if SMP 29 - select HAVE_ARM_TWD if LOCAL_TIMERS 29 + select HAVE_ARM_TWD if SMP 30 30 select HAVE_SMP 31 31 select MIGHT_HAVE_CACHE_L2X0 32 32 help ··· 48 48 select ARM_GIC 49 49 select CPU_V6K 50 50 select HAVE_ARM_SCU if SMP 51 - select HAVE_ARM_TWD if LOCAL_TIMERS 51 + select HAVE_ARM_TWD if SMP 52 52 select HAVE_PATA_PLATFORM 53 53 select HAVE_SMP 54 54 select MIGHT_HAVE_CACHE_L2X0 ··· 92 92 select ARCH_SPARSEMEM_ENABLE if CPU_V7 && !REALVIEW_HIGH_PHYS_OFFSET 93 93 select ARM_GIC 94 94 select HAVE_ARM_SCU if SMP 95 - select HAVE_ARM_TWD if LOCAL_TIMERS 95 + select HAVE_ARM_TWD if SMP 96 96 select HAVE_PATA_PLATFORM 97 97 select HAVE_SMP 98 98 select MIGHT_HAVE_CACHE_L2X0
+1 -1
arch/arm/mach-spear/Kconfig
··· 23 23 select CPU_V7 24 24 select GPIO_SPEAR_SPICS 25 25 select HAVE_ARM_SCU if SMP 26 - select HAVE_ARM_TWD if LOCAL_TIMERS 26 + select HAVE_ARM_TWD if SMP 27 27 select HAVE_SMP 28 28 select MIGHT_HAVE_CACHE_L2X0 29 29 select PINCTRL
+1 -1
arch/arm/mach-tegra/Kconfig
··· 8 8 select COMMON_CLK 9 9 select GENERIC_CLOCKEVENTS 10 10 select HAVE_ARM_SCU if SMP 11 - select HAVE_ARM_TWD if LOCAL_TIMERS 11 + select HAVE_ARM_TWD if SMP 12 12 select HAVE_CLK 13 13 select HAVE_SMP 14 14 select MIGHT_HAVE_CACHE_L2X0
+1 -1
arch/arm/mach-ux500/Kconfig
··· 8 8 select CPU_V7 9 9 select GENERIC_CLOCKEVENTS 10 10 select HAVE_ARM_SCU if SMP 11 - select HAVE_ARM_TWD if LOCAL_TIMERS 11 + select HAVE_ARM_TWD if SMP 12 12 select HAVE_SMP 13 13 select MIGHT_HAVE_CACHE_L2X0 14 14 help
+1 -1
arch/arm/mach-vexpress/Kconfig
··· 10 10 select CPU_V7 11 11 select GENERIC_CLOCKEVENTS 12 12 select HAVE_ARM_SCU if SMP 13 - select HAVE_ARM_TWD if LOCAL_TIMERS 13 + select HAVE_ARM_TWD if SMP 14 14 select HAVE_CLK 15 15 select HAVE_PATA_PLATFORM 16 16 select HAVE_SMP
+1 -1
arch/arm/mach-zynq/Kconfig
··· 6 6 select CPU_V7 7 7 select GENERIC_CLOCKEVENTS 8 8 select HAVE_ARM_SCU if SMP 9 - select HAVE_ARM_TWD if LOCAL_TIMERS 9 + select HAVE_ARM_TWD if SMP 10 10 select ICST 11 11 select MIGHT_HAVE_CACHE_L2X0 12 12 select USE_OF
+42 -16
drivers/clocksource/exynos_mct.c
··· 16 16 #include <linux/err.h> 17 17 #include <linux/clk.h> 18 18 #include <linux/clockchips.h> 19 + #include <linux/cpu.h> 19 20 #include <linux/platform_device.h> 20 21 #include <linux/delay.h> 21 22 #include <linux/percpu.h> ··· 25 24 #include <linux/of_address.h> 26 25 #include <linux/clocksource.h> 27 26 28 - #include <asm/localtimer.h> 29 27 #include <asm/mach/time.h> 30 28 31 29 #define EXYNOS4_MCTREG(x) (x) ··· 80 80 static int mct_irqs[MCT_NR_IRQS]; 81 81 82 82 struct mct_clock_event_device { 83 - struct clock_event_device *evt; 83 + struct clock_event_device evt; 84 84 unsigned long base; 85 85 char name[10]; 86 86 }; ··· 295 295 setup_irq(mct_irqs[MCT_G0_IRQ], &mct_comp_event_irq); 296 296 } 297 297 298 - #ifdef CONFIG_LOCAL_TIMERS 299 - 300 298 static DEFINE_PER_CPU(struct mct_clock_event_device, percpu_mct_tick); 301 299 302 300 /* Clock event handling */ ··· 367 369 368 370 static int exynos4_mct_tick_clear(struct mct_clock_event_device *mevt) 369 371 { 370 - struct clock_event_device *evt = mevt->evt; 372 + struct clock_event_device *evt = &mevt->evt; 371 373 372 374 /* 373 375 * This is for supporting oneshot mode. ··· 389 391 static irqreturn_t exynos4_mct_tick_isr(int irq, void *dev_id) 390 392 { 391 393 struct mct_clock_event_device *mevt = dev_id; 392 - struct clock_event_device *evt = mevt->evt; 394 + struct clock_event_device *evt = &mevt->evt; 393 395 394 396 exynos4_mct_tick_clear(mevt); 395 397 ··· 403 405 struct mct_clock_event_device *mevt; 404 406 unsigned int cpu = smp_processor_id(); 405 407 406 - mevt = this_cpu_ptr(&percpu_mct_tick); 407 - mevt->evt = evt; 408 + mevt = container_of(evt, struct mct_clock_event_device, evt); 408 409 409 410 mevt->base = EXYNOS4_MCT_L_BASE(cpu); 410 411 sprintf(mevt->name, "mct_tick%d", cpu); ··· 445 448 disable_percpu_irq(mct_irqs[MCT_L0_IRQ]); 446 449 } 447 450 448 - static struct local_timer_ops exynos4_mct_tick_ops = { 449 - .setup = exynos4_local_timer_setup, 450 - .stop = exynos4_local_timer_stop, 451 + static int exynos4_mct_cpu_notify(struct notifier_block *self, 452 + unsigned long action, void *hcpu) 453 + { 454 + struct mct_clock_event_device *mevt; 455 + 456 + /* 457 + * Grab cpu pointer in each case to avoid spurious 458 + * preemptible warnings 459 + */ 460 + switch (action & ~CPU_TASKS_FROZEN) { 461 + case CPU_STARTING: 462 + mevt = this_cpu_ptr(&percpu_mct_tick); 463 + exynos4_local_timer_setup(&mevt->evt); 464 + break; 465 + case CPU_DYING: 466 + mevt = this_cpu_ptr(&percpu_mct_tick); 467 + exynos4_local_timer_stop(&mevt->evt); 468 + break; 469 + } 470 + 471 + return NOTIFY_OK; 472 + } 473 + 474 + static struct notifier_block exynos4_mct_cpu_nb = { 475 + .notifier_call = exynos4_mct_cpu_notify, 451 476 }; 452 - #endif /* CONFIG_LOCAL_TIMERS */ 453 477 454 478 static void __init exynos4_timer_resources(struct device_node *np, void __iomem *base) 455 479 { 480 + int err; 481 + struct mct_clock_event_device *mevt = this_cpu_ptr(&percpu_mct_tick); 456 482 struct clk *mct_clk, *tick_clk; 457 483 458 484 tick_clk = np ? of_clk_get_by_name(np, "fin_pll") : ··· 493 473 if (!reg_base) 494 474 panic("%s: unable to ioremap mct address space\n", __func__); 495 475 496 - #ifdef CONFIG_LOCAL_TIMERS 497 476 if (mct_int_type == MCT_INT_PPI) { 498 - int err; 499 477 500 478 err = request_percpu_irq(mct_irqs[MCT_L0_IRQ], 501 479 exynos4_mct_tick_isr, "MCT", ··· 502 484 mct_irqs[MCT_L0_IRQ], err); 503 485 } 504 486 505 - local_timer_register(&exynos4_mct_tick_ops); 506 - #endif /* CONFIG_LOCAL_TIMERS */ 487 + err = register_cpu_notifier(&exynos4_mct_cpu_nb); 488 + if (err) 489 + goto out_irq; 490 + 491 + /* Immediately configure the timer on the boot CPU */ 492 + exynos4_local_timer_setup(&mevt->evt); 493 + return; 494 + 495 + out_irq: 496 + free_percpu_irq(mct_irqs[MCT_L0_IRQ], &percpu_mct_tick); 507 497 } 508 498 509 499 void __init mct_init(void __iomem *base, int irq_g0, int irq_l0, int irq_l1)
+43 -49
drivers/clocksource/time-armada-370-xp.c
··· 19 19 #include <linux/platform_device.h> 20 20 #include <linux/kernel.h> 21 21 #include <linux/clk.h> 22 + #include <linux/cpu.h> 22 23 #include <linux/timer.h> 23 24 #include <linux/clockchips.h> 24 25 #include <linux/interrupt.h> ··· 29 28 #include <linux/irq.h> 30 29 #include <linux/module.h> 31 30 #include <linux/sched_clock.h> 32 - 33 - #include <asm/localtimer.h> 34 31 #include <linux/percpu.h> 32 + #include <linux/time-armada-370-xp.h> 33 + 35 34 /* 36 35 * Timer block registers. 37 36 */ ··· 70 69 */ 71 70 static u32 ticks_per_jiffy; 72 71 73 - static struct clock_event_device __percpu **percpu_armada_370_xp_evt; 72 + static struct clock_event_device __percpu *armada_370_xp_evt; 74 73 75 74 static u32 notrace armada_370_xp_read_sched_clock(void) 76 75 { ··· 143 142 } 144 143 } 145 144 146 - static struct clock_event_device armada_370_xp_clkevt = { 147 - .name = "armada_370_xp_per_cpu_tick", 148 - .features = CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_PERIODIC, 149 - .shift = 32, 150 - .rating = 300, 151 - .set_next_event = armada_370_xp_clkevt_next_event, 152 - .set_mode = armada_370_xp_clkevt_mode, 153 - }; 145 + static int armada_370_xp_clkevt_irq; 154 146 155 147 static irqreturn_t armada_370_xp_timer_interrupt(int irq, void *dev_id) 156 148 { 157 149 /* 158 150 * ACK timer interrupt and call event handler. 159 151 */ 160 - struct clock_event_device *evt = *(struct clock_event_device **)dev_id; 152 + struct clock_event_device *evt = dev_id; 161 153 162 154 writel(TIMER0_CLR_MASK, local_base + LCL_TIMER_EVENTS_STATUS); 163 155 evt->event_handler(evt); ··· 166 172 u32 u; 167 173 int cpu = smp_processor_id(); 168 174 169 - /* Use existing clock_event for cpu 0 */ 170 - if (!smp_processor_id()) 171 - return 0; 172 - 173 175 u = readl(local_base + TIMER_CTRL_OFF); 174 176 if (timer25Mhz) 175 177 writel(u | TIMER0_25MHZ, local_base + TIMER_CTRL_OFF); 176 178 else 177 179 writel(u & ~TIMER0_25MHZ, local_base + TIMER_CTRL_OFF); 178 180 179 - evt->name = armada_370_xp_clkevt.name; 180 - evt->irq = armada_370_xp_clkevt.irq; 181 - evt->features = armada_370_xp_clkevt.features; 182 - evt->shift = armada_370_xp_clkevt.shift; 183 - evt->rating = armada_370_xp_clkevt.rating, 181 + evt->name = "armada_370_xp_per_cpu_tick", 182 + evt->features = CLOCK_EVT_FEAT_ONESHOT | 183 + CLOCK_EVT_FEAT_PERIODIC; 184 + evt->shift = 32, 185 + evt->rating = 300, 184 186 evt->set_next_event = armada_370_xp_clkevt_next_event, 185 187 evt->set_mode = armada_370_xp_clkevt_mode, 188 + evt->irq = armada_370_xp_clkevt_irq; 186 189 evt->cpumask = cpumask_of(cpu); 187 - 188 - *__this_cpu_ptr(percpu_armada_370_xp_evt) = evt; 189 190 190 191 clockevents_config_and_register(evt, timer_clk, 1, 0xfffffffe); 191 192 enable_percpu_irq(evt->irq, 0); ··· 188 199 return 0; 189 200 } 190 201 191 - static void armada_370_xp_timer_stop(struct clock_event_device *evt) 202 + static void armada_370_xp_timer_stop(struct clock_event_device *evt) 192 203 { 193 204 evt->set_mode(CLOCK_EVT_MODE_UNUSED, evt); 194 205 disable_percpu_irq(evt->irq); 195 206 } 196 207 197 - static struct local_timer_ops armada_370_xp_local_timer_ops = { 198 - .setup = armada_370_xp_timer_setup, 199 - .stop = armada_370_xp_timer_stop, 208 + static int armada_370_xp_timer_cpu_notify(struct notifier_block *self, 209 + unsigned long action, void *hcpu) 210 + { 211 + /* 212 + * Grab cpu pointer in each case to avoid spurious 213 + * preemptible warnings 214 + */ 215 + switch (action & ~CPU_TASKS_FROZEN) { 216 + case CPU_STARTING: 217 + armada_370_xp_timer_setup(this_cpu_ptr(armada_370_xp_evt)); 218 + break; 219 + case CPU_DYING: 220 + armada_370_xp_timer_stop(this_cpu_ptr(armada_370_xp_evt)); 221 + break; 222 + } 223 + 224 + return NOTIFY_OK; 225 + } 226 + 227 + static struct notifier_block armada_370_xp_timer_cpu_nb = { 228 + .notifier_call = armada_370_xp_timer_cpu_notify, 200 229 }; 201 230 202 231 void __init armada_370_xp_timer_init(void) ··· 230 223 231 224 if (of_find_property(np, "marvell,timer-25Mhz", NULL)) { 232 225 /* The fixed 25MHz timer is available so let's use it */ 233 - u = readl(local_base + TIMER_CTRL_OFF); 234 - writel(u | TIMER0_25MHZ, 235 - local_base + TIMER_CTRL_OFF); 236 226 u = readl(timer_base + TIMER_CTRL_OFF); 237 227 writel(u | TIMER0_25MHZ, 238 228 timer_base + TIMER_CTRL_OFF); ··· 239 235 struct clk *clk = of_clk_get(np, 0); 240 236 WARN_ON(IS_ERR(clk)); 241 237 rate = clk_get_rate(clk); 242 - u = readl(local_base + TIMER_CTRL_OFF); 243 - writel(u & ~(TIMER0_25MHZ), 244 - local_base + TIMER_CTRL_OFF); 245 238 246 239 u = readl(timer_base + TIMER_CTRL_OFF); 247 240 writel(u & ~(TIMER0_25MHZ), ··· 252 251 * We use timer 0 as clocksource, and private(local) timer 0 253 252 * for clockevents 254 253 */ 255 - armada_370_xp_clkevt.irq = irq_of_parse_and_map(np, 4); 254 + armada_370_xp_clkevt_irq = irq_of_parse_and_map(np, 4); 256 255 257 256 ticks_per_jiffy = (timer_clk + HZ / 2) / HZ; 258 257 ··· 277 276 "armada_370_xp_clocksource", 278 277 timer_clk, 300, 32, clocksource_mmio_readl_down); 279 278 280 - /* Register the clockevent on the private timer of CPU 0 */ 281 - armada_370_xp_clkevt.cpumask = cpumask_of(0); 282 - clockevents_config_and_register(&armada_370_xp_clkevt, 283 - timer_clk, 1, 0xfffffffe); 279 + register_cpu_notifier(&armada_370_xp_timer_cpu_nb); 284 280 285 - percpu_armada_370_xp_evt = alloc_percpu(struct clock_event_device *); 281 + armada_370_xp_evt = alloc_percpu(struct clock_event_device); 286 282 287 283 288 284 /* 289 285 * Setup clockevent timer (interrupt-driven). 290 286 */ 291 - *__this_cpu_ptr(percpu_armada_370_xp_evt) = &armada_370_xp_clkevt; 292 - res = request_percpu_irq(armada_370_xp_clkevt.irq, 287 + res = request_percpu_irq(armada_370_xp_clkevt_irq, 293 288 armada_370_xp_timer_interrupt, 294 - armada_370_xp_clkevt.name, 295 - percpu_armada_370_xp_evt); 296 - if (!res) { 297 - enable_percpu_irq(armada_370_xp_clkevt.irq, 0); 298 - #ifdef CONFIG_LOCAL_TIMERS 299 - local_timer_register(&armada_370_xp_local_timer_ops); 300 - #endif 301 - } 289 + "armada_370_xp_per_cpu_tick", 290 + armada_370_xp_evt); 291 + /* Immediately configure the timer on the boot CPU */ 292 + if (!res) 293 + armada_370_xp_timer_setup(this_cpu_ptr(armada_370_xp_evt)); 302 294 }
+51 -43
drivers/clocksource/timer-marco.c
··· 10 10 #include <linux/interrupt.h> 11 11 #include <linux/clockchips.h> 12 12 #include <linux/clocksource.h> 13 + #include <linux/cpu.h> 13 14 #include <linux/bitops.h> 14 15 #include <linux/irq.h> 15 16 #include <linux/clk.h> ··· 19 18 #include <linux/of_irq.h> 20 19 #include <linux/of_address.h> 21 20 #include <linux/sched_clock.h> 22 - #include <asm/localtimer.h> 23 21 #include <asm/mach/time.h> 24 22 25 23 #define SIRFSOC_TIMER_32COUNTER_0_CTRL 0x0000 ··· 151 151 BIT(1) | BIT(0), sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_CTRL); 152 152 } 153 153 154 - static struct clock_event_device sirfsoc_clockevent = { 155 - .name = "sirfsoc_clockevent", 156 - .rating = 200, 157 - .features = CLOCK_EVT_FEAT_ONESHOT, 158 - .set_mode = sirfsoc_timer_set_mode, 159 - .set_next_event = sirfsoc_timer_set_next_event, 160 - }; 154 + static struct clock_event_device __percpu *sirfsoc_clockevent; 161 155 162 156 static struct clocksource sirfsoc_clocksource = { 163 157 .name = "sirfsoc_clocksource", ··· 167 173 .name = "sirfsoc_timer0", 168 174 .flags = IRQF_TIMER | IRQF_NOBALANCING, 169 175 .handler = sirfsoc_timer_interrupt, 170 - .dev_id = &sirfsoc_clockevent, 171 176 }; 172 - 173 - #ifdef CONFIG_LOCAL_TIMERS 174 177 175 178 static struct irqaction sirfsoc_timer1_irq = { 176 179 .name = "sirfsoc_timer1", ··· 177 186 178 187 static int sirfsoc_local_timer_setup(struct clock_event_device *ce) 179 188 { 180 - /* Use existing clock_event for cpu 0 */ 181 - if (!smp_processor_id()) 182 - return 0; 189 + int cpu = smp_processor_id(); 190 + struct irqaction *action; 183 191 184 - ce->irq = sirfsoc_timer1_irq.irq; 192 + if (cpu == 0) 193 + action = &sirfsoc_timer_irq; 194 + else 195 + action = &sirfsoc_timer1_irq; 196 + 197 + ce->irq = action->irq; 185 198 ce->name = "local_timer"; 186 - ce->features = sirfsoc_clockevent.features; 187 - ce->rating = sirfsoc_clockevent.rating; 199 + ce->features = CLOCK_EVT_FEAT_ONESHOT; 200 + ce->rating = 200; 188 201 ce->set_mode = sirfsoc_timer_set_mode; 189 202 ce->set_next_event = sirfsoc_timer_set_next_event; 190 - ce->shift = sirfsoc_clockevent.shift; 191 - ce->mult = sirfsoc_clockevent.mult; 192 - ce->max_delta_ns = sirfsoc_clockevent.max_delta_ns; 193 - ce->min_delta_ns = sirfsoc_clockevent.min_delta_ns; 203 + clockevents_calc_mult_shift(ce, CLOCK_TICK_RATE, 60); 204 + ce->max_delta_ns = clockevent_delta2ns(-2, ce); 205 + ce->min_delta_ns = clockevent_delta2ns(2, ce); 206 + ce->cpumask = cpumask_of(cpu); 194 207 195 - sirfsoc_timer1_irq.dev_id = ce; 196 - BUG_ON(setup_irq(ce->irq, &sirfsoc_timer1_irq)); 197 - irq_set_affinity(sirfsoc_timer1_irq.irq, cpumask_of(1)); 208 + action->dev_id = ce; 209 + BUG_ON(setup_irq(ce->irq, action)); 210 + irq_set_affinity(action->irq, cpumask_of(cpu)); 198 211 199 212 clockevents_register_device(ce); 200 213 return 0; ··· 206 211 207 212 static void sirfsoc_local_timer_stop(struct clock_event_device *ce) 208 213 { 214 + int cpu = smp_processor_id(); 215 + 209 216 sirfsoc_timer_count_disable(1); 210 217 211 - remove_irq(sirfsoc_timer1_irq.irq, &sirfsoc_timer1_irq); 218 + if (cpu == 0) 219 + remove_irq(sirfsoc_timer_irq.irq, &sirfsoc_timer_irq); 220 + else 221 + remove_irq(sirfsoc_timer1_irq.irq, &sirfsoc_timer1_irq); 212 222 } 213 223 214 - static struct local_timer_ops sirfsoc_local_timer_ops = { 215 - .setup = sirfsoc_local_timer_setup, 216 - .stop = sirfsoc_local_timer_stop, 224 + static int sirfsoc_cpu_notify(struct notifier_block *self, 225 + unsigned long action, void *hcpu) 226 + { 227 + /* 228 + * Grab cpu pointer in each case to avoid spurious 229 + * preemptible warnings 230 + */ 231 + switch (action & ~CPU_TASKS_FROZEN) { 232 + case CPU_STARTING: 233 + sirfsoc_local_timer_setup(this_cpu_ptr(sirfsoc_clockevent)); 234 + break; 235 + case CPU_DYING: 236 + sirfsoc_local_timer_stop(this_cpu_ptr(sirfsoc_clockevent)); 237 + break; 238 + } 239 + 240 + return NOTIFY_OK; 241 + } 242 + 243 + static struct notifier_block sirfsoc_cpu_nb = { 244 + .notifier_call = sirfsoc_cpu_notify, 217 245 }; 218 - #endif /* CONFIG_LOCAL_TIMERS */ 219 246 220 247 static void __init sirfsoc_clockevent_init(void) 221 248 { 222 - clockevents_calc_mult_shift(&sirfsoc_clockevent, CLOCK_TICK_RATE, 60); 249 + sirfsoc_clockevent = alloc_percpu(struct clock_event_device); 250 + BUG_ON(!sirfsoc_clockevent); 223 251 224 - sirfsoc_clockevent.max_delta_ns = 225 - clockevent_delta2ns(-2, &sirfsoc_clockevent); 226 - sirfsoc_clockevent.min_delta_ns = 227 - clockevent_delta2ns(2, &sirfsoc_clockevent); 252 + BUG_ON(register_cpu_notifier(&sirfsoc_cpu_nb)); 228 253 229 - sirfsoc_clockevent.cpumask = cpumask_of(0); 230 - clockevents_register_device(&sirfsoc_clockevent); 231 - #ifdef CONFIG_LOCAL_TIMERS 232 - local_timer_register(&sirfsoc_local_timer_ops); 233 - #endif 254 + /* Immediately configure the timer on the boot CPU */ 255 + sirfsoc_local_timer_setup(this_cpu_ptr(sirfsoc_clockevent)); 234 256 } 235 257 236 258 /* initialize the kernel jiffy timer source */ ··· 285 273 286 274 BUG_ON(clocksource_register_hz(&sirfsoc_clocksource, CLOCK_TICK_RATE)); 287 275 288 - BUG_ON(setup_irq(sirfsoc_timer_irq.irq, &sirfsoc_timer_irq)); 289 - 290 276 sirfsoc_clockevent_init(); 291 277 } 292 278 ··· 298 288 if (!sirfsoc_timer_irq.irq) 299 289 panic("No irq passed for timer0 via DT\n"); 300 290 301 - #ifdef CONFIG_LOCAL_TIMERS 302 291 sirfsoc_timer1_irq.irq = irq_of_parse_and_map(np, 1); 303 292 if (!sirfsoc_timer1_irq.irq) 304 293 panic("No irq passed for timer1 via DT\n"); 305 - #endif 306 294 307 295 sirfsoc_marco_timer_init(); 308 296 }
+1 -3
include/linux/time-armada-370-xp.h
··· 11 11 #ifndef __TIME_ARMADA_370_XPPRCMU_H 12 12 #define __TIME_ARMADA_370_XPPRCMU_H 13 13 14 - #include <linux/init.h> 15 - 16 - void __init armada_370_xp_timer_init(void); 14 + void armada_370_xp_timer_init(void); 17 15 18 16 #endif