diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2019-04-20 13:10:49 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2019-04-20 13:10:49 -0400 |
| commit | e899cc3b3d9813f795c039c0f3c689861d6836da (patch) | |
| tree | 20970763d41cf257cd1c6f0ca92ad516ba928286 | |
| parent | b25c69b9d5e41159b54ad7cb33f7d9ead8523d33 (diff) | |
| parent | 3f2552f7e9c5abef2775c53f7af66532f8bf65bc (diff) | |
Merge branch 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull timer fixes from Ingo Molnar:
"Misc clocksource driver fixes, and a sched-clock wrapping fix"
* 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
timers/sched_clock: Prevent generic sched_clock wrap caused by tick_freeze()
clocksource/drivers/timer-ti-dm: Remove omap_dm_timer_set_load_start
clocksource/drivers/oxnas: Fix OX820 compatible
clocksource/drivers/arm_arch_timer: Remove unneeded pr_fmt macro
clocksource/drivers/npcm: select TIMER_OF
| -rw-r--r-- | drivers/clocksource/Kconfig | 1 | ||||
| -rw-r--r-- | drivers/clocksource/arm_arch_timer.c | 5 | ||||
| -rw-r--r-- | drivers/clocksource/timer-oxnas-rps.c | 2 | ||||
| -rw-r--r-- | drivers/clocksource/timer-ti-dm.c | 28 | ||||
| -rw-r--r-- | kernel/time/sched_clock.c | 4 | ||||
| -rw-r--r-- | kernel/time/tick-common.c | 2 | ||||
| -rw-r--r-- | kernel/time/timekeeping.h | 7 |
7 files changed, 14 insertions, 35 deletions
diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig index 171502a356aa..4b3d143f0f8a 100644 --- a/drivers/clocksource/Kconfig +++ b/drivers/clocksource/Kconfig | |||
| @@ -145,6 +145,7 @@ config VT8500_TIMER | |||
| 145 | config NPCM7XX_TIMER | 145 | config NPCM7XX_TIMER |
| 146 | bool "NPCM7xx timer driver" if COMPILE_TEST | 146 | bool "NPCM7xx timer driver" if COMPILE_TEST |
| 147 | depends on HAS_IOMEM | 147 | depends on HAS_IOMEM |
| 148 | select TIMER_OF | ||
| 148 | select CLKSRC_MMIO | 149 | select CLKSRC_MMIO |
| 149 | help | 150 | help |
| 150 | Enable 24-bit TIMER0 and TIMER1 counters in the NPCM7xx architecture, | 151 | Enable 24-bit TIMER0 and TIMER1 counters in the NPCM7xx architecture, |
diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c index aa4ec53281ce..ea373cfbcecb 100644 --- a/drivers/clocksource/arm_arch_timer.c +++ b/drivers/clocksource/arm_arch_timer.c | |||
| @@ -9,7 +9,7 @@ | |||
| 9 | * published by the Free Software Foundation. | 9 | * published by the Free Software Foundation. |
| 10 | */ | 10 | */ |
| 11 | 11 | ||
| 12 | #define pr_fmt(fmt) "arm_arch_timer: " fmt | 12 | #define pr_fmt(fmt) "arch_timer: " fmt |
| 13 | 13 | ||
| 14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
| 15 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
| @@ -33,9 +33,6 @@ | |||
| 33 | 33 | ||
| 34 | #include <clocksource/arm_arch_timer.h> | 34 | #include <clocksource/arm_arch_timer.h> |
| 35 | 35 | ||
| 36 | #undef pr_fmt | ||
| 37 | #define pr_fmt(fmt) "arch_timer: " fmt | ||
| 38 | |||
| 39 | #define CNTTIDR 0x08 | 36 | #define CNTTIDR 0x08 |
| 40 | #define CNTTIDR_VIRT(n) (BIT(1) << ((n) * 4)) | 37 | #define CNTTIDR_VIRT(n) (BIT(1) << ((n) * 4)) |
| 41 | 38 | ||
diff --git a/drivers/clocksource/timer-oxnas-rps.c b/drivers/clocksource/timer-oxnas-rps.c index eed6feff8b5f..30c6f4ce672b 100644 --- a/drivers/clocksource/timer-oxnas-rps.c +++ b/drivers/clocksource/timer-oxnas-rps.c | |||
| @@ -296,4 +296,4 @@ err_alloc: | |||
| 296 | TIMER_OF_DECLARE(ox810se_rps, | 296 | TIMER_OF_DECLARE(ox810se_rps, |
| 297 | "oxsemi,ox810se-rps-timer", oxnas_rps_timer_init); | 297 | "oxsemi,ox810se-rps-timer", oxnas_rps_timer_init); |
| 298 | TIMER_OF_DECLARE(ox820_rps, | 298 | TIMER_OF_DECLARE(ox820_rps, |
| 299 | "oxsemi,ox820se-rps-timer", oxnas_rps_timer_init); | 299 | "oxsemi,ox820-rps-timer", oxnas_rps_timer_init); |
diff --git a/drivers/clocksource/timer-ti-dm.c b/drivers/clocksource/timer-ti-dm.c index 3352da6ed61f..ee8ec5a8cb16 100644 --- a/drivers/clocksource/timer-ti-dm.c +++ b/drivers/clocksource/timer-ti-dm.c | |||
| @@ -585,34 +585,6 @@ static int omap_dm_timer_set_load(struct omap_dm_timer *timer, int autoreload, | |||
| 585 | return 0; | 585 | return 0; |
| 586 | } | 586 | } |
| 587 | 587 | ||
| 588 | /* Optimized set_load which removes costly spin wait in timer_start */ | ||
| 589 | static int omap_dm_timer_set_load_start(struct omap_dm_timer *timer, | ||
| 590 | int autoreload, unsigned int load) | ||
| 591 | { | ||
| 592 | u32 l; | ||
| 593 | |||
| 594 | if (unlikely(!timer)) | ||
| 595 | return -EINVAL; | ||
| 596 | |||
| 597 | omap_dm_timer_enable(timer); | ||
| 598 | |||
| 599 | l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); | ||
| 600 | if (autoreload) { | ||
| 601 | l |= OMAP_TIMER_CTRL_AR; | ||
| 602 | omap_dm_timer_write_reg(timer, OMAP_TIMER_LOAD_REG, load); | ||
| 603 | } else { | ||
| 604 | l &= ~OMAP_TIMER_CTRL_AR; | ||
| 605 | } | ||
| 606 | l |= OMAP_TIMER_CTRL_ST; | ||
| 607 | |||
| 608 | __omap_dm_timer_load_start(timer, l, load, timer->posted); | ||
| 609 | |||
| 610 | /* Save the context */ | ||
| 611 | timer->context.tclr = l; | ||
| 612 | timer->context.tldr = load; | ||
| 613 | timer->context.tcrr = load; | ||
| 614 | return 0; | ||
| 615 | } | ||
| 616 | static int omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable, | 588 | static int omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable, |
| 617 | unsigned int match) | 589 | unsigned int match) |
| 618 | { | 590 | { |
diff --git a/kernel/time/sched_clock.c b/kernel/time/sched_clock.c index 094b82ca95e5..930113b9799a 100644 --- a/kernel/time/sched_clock.c +++ b/kernel/time/sched_clock.c | |||
| @@ -272,7 +272,7 @@ static u64 notrace suspended_sched_clock_read(void) | |||
| 272 | return cd.read_data[seq & 1].epoch_cyc; | 272 | return cd.read_data[seq & 1].epoch_cyc; |
| 273 | } | 273 | } |
| 274 | 274 | ||
| 275 | static int sched_clock_suspend(void) | 275 | int sched_clock_suspend(void) |
| 276 | { | 276 | { |
| 277 | struct clock_read_data *rd = &cd.read_data[0]; | 277 | struct clock_read_data *rd = &cd.read_data[0]; |
| 278 | 278 | ||
| @@ -283,7 +283,7 @@ static int sched_clock_suspend(void) | |||
| 283 | return 0; | 283 | return 0; |
| 284 | } | 284 | } |
| 285 | 285 | ||
| 286 | static void sched_clock_resume(void) | 286 | void sched_clock_resume(void) |
| 287 | { | 287 | { |
| 288 | struct clock_read_data *rd = &cd.read_data[0]; | 288 | struct clock_read_data *rd = &cd.read_data[0]; |
| 289 | 289 | ||
diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c index 529143b4c8d2..df401463a191 100644 --- a/kernel/time/tick-common.c +++ b/kernel/time/tick-common.c | |||
| @@ -487,6 +487,7 @@ void tick_freeze(void) | |||
| 487 | trace_suspend_resume(TPS("timekeeping_freeze"), | 487 | trace_suspend_resume(TPS("timekeeping_freeze"), |
| 488 | smp_processor_id(), true); | 488 | smp_processor_id(), true); |
| 489 | system_state = SYSTEM_SUSPEND; | 489 | system_state = SYSTEM_SUSPEND; |
| 490 | sched_clock_suspend(); | ||
| 490 | timekeeping_suspend(); | 491 | timekeeping_suspend(); |
| 491 | } else { | 492 | } else { |
| 492 | tick_suspend_local(); | 493 | tick_suspend_local(); |
| @@ -510,6 +511,7 @@ void tick_unfreeze(void) | |||
| 510 | 511 | ||
| 511 | if (tick_freeze_depth == num_online_cpus()) { | 512 | if (tick_freeze_depth == num_online_cpus()) { |
| 512 | timekeeping_resume(); | 513 | timekeeping_resume(); |
| 514 | sched_clock_resume(); | ||
| 513 | system_state = SYSTEM_RUNNING; | 515 | system_state = SYSTEM_RUNNING; |
| 514 | trace_suspend_resume(TPS("timekeeping_freeze"), | 516 | trace_suspend_resume(TPS("timekeeping_freeze"), |
| 515 | smp_processor_id(), false); | 517 | smp_processor_id(), false); |
diff --git a/kernel/time/timekeeping.h b/kernel/time/timekeeping.h index 7a9b4eb7a1d5..141ab3ab0354 100644 --- a/kernel/time/timekeeping.h +++ b/kernel/time/timekeeping.h | |||
| @@ -14,6 +14,13 @@ extern u64 timekeeping_max_deferment(void); | |||
| 14 | extern void timekeeping_warp_clock(void); | 14 | extern void timekeeping_warp_clock(void); |
| 15 | extern int timekeeping_suspend(void); | 15 | extern int timekeeping_suspend(void); |
| 16 | extern void timekeeping_resume(void); | 16 | extern void timekeeping_resume(void); |
| 17 | #ifdef CONFIG_GENERIC_SCHED_CLOCK | ||
| 18 | extern int sched_clock_suspend(void); | ||
| 19 | extern void sched_clock_resume(void); | ||
| 20 | #else | ||
| 21 | static inline int sched_clock_suspend(void) { return 0; } | ||
| 22 | static inline void sched_clock_resume(void) { } | ||
| 23 | #endif | ||
| 17 | 24 | ||
| 18 | extern void do_timer(unsigned long ticks); | 25 | extern void do_timer(unsigned long ticks); |
| 19 | extern void update_wall_time(void); | 26 | extern void update_wall_time(void); |
