diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2014-04-16 10:36:45 -0400 |
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2014-04-17 17:36:28 -0400 |
| commit | 30ccf03b4a6a2102a2219058bdc6d779dc637dd7 (patch) | |
| tree | c07b1ec55a8eedb55109db136b0aa352d4b291d1 | |
| parent | ffde1de64012c406dfdda8690918248b472f24e4 (diff) | |
clocksource: Exynos_mct: Use irq_force_affinity() in cpu bringup
The starting cpu is not yet in the online mask so irq_set_affinity()
fails which results in per cpu timers for this cpu ending up on some
other online cpu, ususally cpu 0.
Use irq_force_affinity() which disables the online mask check and
makes things work.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Tested-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
Cc: Kyungmin Park <kyungmin.park@samsung.com>
Cc: Marek Szyprowski <m.szyprowski@samsung.com>
Cc: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
Cc: Tomasz Figa <t.figa@samsung.com>,
Cc: Daniel Lezcano <daniel.lezcano@linaro.org>,
Cc: Kukjin Kim <kgene.kim@samsung.com>
Cc: linux-arm-kernel@lists.infradead.org,
Cc: stable@vger.kernel.org
Link: http://lkml.kernel.org/r/20140416143316.106665251@linutronix.de
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
| -rw-r--r-- | drivers/clocksource/exynos_mct.c | 8 |
1 files changed, 1 insertions, 7 deletions
diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c index a6ee6d7cd63f..b2d416368711 100644 --- a/drivers/clocksource/exynos_mct.c +++ b/drivers/clocksource/exynos_mct.c | |||
| @@ -430,6 +430,7 @@ static int exynos4_local_timer_setup(struct clock_event_device *evt) | |||
| 430 | evt->irq); | 430 | evt->irq); |
| 431 | return -EIO; | 431 | return -EIO; |
| 432 | } | 432 | } |
| 433 | irq_force_affinity(mct_irqs[MCT_L0_IRQ + cpu], cpumask_of(cpu)); | ||
| 433 | } else { | 434 | } else { |
| 434 | enable_percpu_irq(mct_irqs[MCT_L0_IRQ], 0); | 435 | enable_percpu_irq(mct_irqs[MCT_L0_IRQ], 0); |
| 435 | } | 436 | } |
| @@ -450,7 +451,6 @@ static int exynos4_mct_cpu_notify(struct notifier_block *self, | |||
| 450 | unsigned long action, void *hcpu) | 451 | unsigned long action, void *hcpu) |
| 451 | { | 452 | { |
| 452 | struct mct_clock_event_device *mevt; | 453 | struct mct_clock_event_device *mevt; |
| 453 | unsigned int cpu; | ||
| 454 | 454 | ||
| 455 | /* | 455 | /* |
| 456 | * Grab cpu pointer in each case to avoid spurious | 456 | * Grab cpu pointer in each case to avoid spurious |
| @@ -461,12 +461,6 @@ static int exynos4_mct_cpu_notify(struct notifier_block *self, | |||
| 461 | mevt = this_cpu_ptr(&percpu_mct_tick); | 461 | mevt = this_cpu_ptr(&percpu_mct_tick); |
| 462 | exynos4_local_timer_setup(&mevt->evt); | 462 | exynos4_local_timer_setup(&mevt->evt); |
| 463 | break; | 463 | break; |
| 464 | case CPU_ONLINE: | ||
| 465 | cpu = (unsigned long)hcpu; | ||
| 466 | if (mct_int_type == MCT_INT_SPI) | ||
| 467 | irq_set_affinity(mct_irqs[MCT_L0_IRQ + cpu], | ||
| 468 | cpumask_of(cpu)); | ||
| 469 | break; | ||
| 470 | case CPU_DYING: | 464 | case CPU_DYING: |
| 471 | mevt = this_cpu_ptr(&percpu_mct_tick); | 465 | mevt = this_cpu_ptr(&percpu_mct_tick); |
| 472 | exynos4_local_timer_stop(&mevt->evt); | 466 | exynos4_local_timer_stop(&mevt->evt); |
