aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2019-04-20 13:10:49 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2019-04-20 13:10:49 -0400
commite899cc3b3d9813f795c039c0f3c689861d6836da (patch)
tree20970763d41cf257cd1c6f0ca92ad516ba928286
parentb25c69b9d5e41159b54ad7cb33f7d9ead8523d33 (diff)
parent3f2552f7e9c5abef2775c53f7af66532f8bf65bc (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/Kconfig1
-rw-r--r--drivers/clocksource/arm_arch_timer.c5
-rw-r--r--drivers/clocksource/timer-oxnas-rps.c2
-rw-r--r--drivers/clocksource/timer-ti-dm.c28
-rw-r--r--kernel/time/sched_clock.c4
-rw-r--r--kernel/time/tick-common.c2
-rw-r--r--kernel/time/timekeeping.h7
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
145config NPCM7XX_TIMER 145config 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:
296TIMER_OF_DECLARE(ox810se_rps, 296TIMER_OF_DECLARE(ox810se_rps,
297 "oxsemi,ox810se-rps-timer", oxnas_rps_timer_init); 297 "oxsemi,ox810se-rps-timer", oxnas_rps_timer_init);
298TIMER_OF_DECLARE(ox820_rps, 298TIMER_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 */
589static 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}
616static int omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable, 588static 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
275static int sched_clock_suspend(void) 275int 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
286static void sched_clock_resume(void) 286void 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);
14extern void timekeeping_warp_clock(void); 14extern void timekeeping_warp_clock(void);
15extern int timekeeping_suspend(void); 15extern int timekeeping_suspend(void);
16extern void timekeeping_resume(void); 16extern void timekeeping_resume(void);
17#ifdef CONFIG_GENERIC_SCHED_CLOCK
18extern int sched_clock_suspend(void);
19extern void sched_clock_resume(void);
20#else
21static inline int sched_clock_suspend(void) { return 0; }
22static inline void sched_clock_resume(void) { }
23#endif
17 24
18extern void do_timer(unsigned long ticks); 25extern void do_timer(unsigned long ticks);
19extern void update_wall_time(void); 26extern void update_wall_time(void);