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
This commit is contained in:
Linus Torvalds 2019-04-20 10:10:49 -07:00
commit e899cc3b3d
7 changed files with 14 additions and 35 deletions

View File

@ -145,6 +145,7 @@ config VT8500_TIMER
config NPCM7XX_TIMER config NPCM7XX_TIMER
bool "NPCM7xx timer driver" if COMPILE_TEST bool "NPCM7xx timer driver" if COMPILE_TEST
depends on HAS_IOMEM depends on HAS_IOMEM
select TIMER_OF
select CLKSRC_MMIO select CLKSRC_MMIO
help help
Enable 24-bit TIMER0 and TIMER1 counters in the NPCM7xx architecture, Enable 24-bit TIMER0 and TIMER1 counters in the NPCM7xx architecture,

View File

@ -9,7 +9,7 @@
* published by the Free Software Foundation. * published by the Free Software Foundation.
*/ */
#define pr_fmt(fmt) "arm_arch_timer: " fmt #define pr_fmt(fmt) "arch_timer: " fmt
#include <linux/init.h> #include <linux/init.h>
#include <linux/kernel.h> #include <linux/kernel.h>
@ -33,9 +33,6 @@
#include <clocksource/arm_arch_timer.h> #include <clocksource/arm_arch_timer.h>
#undef pr_fmt
#define pr_fmt(fmt) "arch_timer: " fmt
#define CNTTIDR 0x08 #define CNTTIDR 0x08
#define CNTTIDR_VIRT(n) (BIT(1) << ((n) * 4)) #define CNTTIDR_VIRT(n) (BIT(1) << ((n) * 4))

View File

@ -296,4 +296,4 @@ err_alloc:
TIMER_OF_DECLARE(ox810se_rps, TIMER_OF_DECLARE(ox810se_rps,
"oxsemi,ox810se-rps-timer", oxnas_rps_timer_init); "oxsemi,ox810se-rps-timer", oxnas_rps_timer_init);
TIMER_OF_DECLARE(ox820_rps, TIMER_OF_DECLARE(ox820_rps,
"oxsemi,ox820se-rps-timer", oxnas_rps_timer_init); "oxsemi,ox820-rps-timer", oxnas_rps_timer_init);

View File

@ -585,34 +585,6 @@ static int omap_dm_timer_set_load(struct omap_dm_timer *timer, int autoreload,
return 0; return 0;
} }
/* Optimized set_load which removes costly spin wait in timer_start */
static int omap_dm_timer_set_load_start(struct omap_dm_timer *timer,
int autoreload, unsigned int load)
{
u32 l;
if (unlikely(!timer))
return -EINVAL;
omap_dm_timer_enable(timer);
l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG);
if (autoreload) {
l |= OMAP_TIMER_CTRL_AR;
omap_dm_timer_write_reg(timer, OMAP_TIMER_LOAD_REG, load);
} else {
l &= ~OMAP_TIMER_CTRL_AR;
}
l |= OMAP_TIMER_CTRL_ST;
__omap_dm_timer_load_start(timer, l, load, timer->posted);
/* Save the context */
timer->context.tclr = l;
timer->context.tldr = load;
timer->context.tcrr = load;
return 0;
}
static int omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable, static int omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable,
unsigned int match) unsigned int match)
{ {

View File

@ -272,7 +272,7 @@ static u64 notrace suspended_sched_clock_read(void)
return cd.read_data[seq & 1].epoch_cyc; return cd.read_data[seq & 1].epoch_cyc;
} }
static int sched_clock_suspend(void) int sched_clock_suspend(void)
{ {
struct clock_read_data *rd = &cd.read_data[0]; struct clock_read_data *rd = &cd.read_data[0];
@ -283,7 +283,7 @@ static int sched_clock_suspend(void)
return 0; return 0;
} }
static void sched_clock_resume(void) void sched_clock_resume(void)
{ {
struct clock_read_data *rd = &cd.read_data[0]; struct clock_read_data *rd = &cd.read_data[0];

View File

@ -487,6 +487,7 @@ void tick_freeze(void)
trace_suspend_resume(TPS("timekeeping_freeze"), trace_suspend_resume(TPS("timekeeping_freeze"),
smp_processor_id(), true); smp_processor_id(), true);
system_state = SYSTEM_SUSPEND; system_state = SYSTEM_SUSPEND;
sched_clock_suspend();
timekeeping_suspend(); timekeeping_suspend();
} else { } else {
tick_suspend_local(); tick_suspend_local();
@ -510,6 +511,7 @@ void tick_unfreeze(void)
if (tick_freeze_depth == num_online_cpus()) { if (tick_freeze_depth == num_online_cpus()) {
timekeeping_resume(); timekeeping_resume();
sched_clock_resume();
system_state = SYSTEM_RUNNING; system_state = SYSTEM_RUNNING;
trace_suspend_resume(TPS("timekeeping_freeze"), trace_suspend_resume(TPS("timekeeping_freeze"),
smp_processor_id(), false); smp_processor_id(), false);

View File

@ -14,6 +14,13 @@ extern u64 timekeeping_max_deferment(void);
extern void timekeeping_warp_clock(void); extern void timekeeping_warp_clock(void);
extern int timekeeping_suspend(void); extern int timekeeping_suspend(void);
extern void timekeeping_resume(void); extern void timekeeping_resume(void);
#ifdef CONFIG_GENERIC_SCHED_CLOCK
extern int sched_clock_suspend(void);
extern void sched_clock_resume(void);
#else
static inline int sched_clock_suspend(void) { return 0; }
static inline void sched_clock_resume(void) { }
#endif
extern void do_timer(unsigned long ticks); extern void do_timer(unsigned long ticks);
extern void update_wall_time(void); extern void update_wall_time(void);