Skip to content

Commit 5e359bf

Browse files
committed
Merge branch 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull timer updates from Thomas Gleixner: "Rather large, but nothing exiting: - new range check for settimeofday() to prevent that boot time becomes negative. - fix for file time rounding - a few simplifications of the hrtimer code - fix for the proc/timerlist code so the output of clock realtime timers is accurate - more y2038 work - tree wide conversion of clockevent drivers to the new callbacks" * 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (88 commits) hrtimer: Handle failure of tick_init_highres() gracefully hrtimer: Unconfuse switch_hrtimer_base() a bit hrtimer: Simplify get_target_base() by returning current base hrtimer: Drop return code of hrtimer_switch_to_hres() time: Introduce timespec64_to_jiffies()/jiffies_to_timespec64() time: Introduce current_kernel_time64() time: Introduce struct itimerspec64 time: Add the common weak version of update_persistent_clock() time: Always make sure wall_to_monotonic isn't positive time: Fix nanosecond file time rounding in timespec_trunc() timer_list: Add the base offset so remaining nsecs are accurate for non monotonic timers cris/time: Migrate to new 'set-state' interface kernel: broadcast-hrtimer: Migrate to new 'set-state' interface xtensa/time: Migrate to new 'set-state' interface unicore/time: Migrate to new 'set-state' interface um/time: Migrate to new 'set-state' interface sparc/time: Migrate to new 'set-state' interface sh/localtimer: Migrate to new 'set-state' interface score/time: Migrate to new 'set-state' interface s390/time: Migrate to new 'set-state' interface ...
2 parents 8d01b66 + 85e1cd6 commit 5e359bf

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

80 files changed

+1575
-1681
lines changed

arch/alpha/kernel/time.c

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ rtc_timer_interrupt(int irq, void *dev)
9393
struct clock_event_device *ce = &per_cpu(cpu_ce, cpu);
9494

9595
/* Don't run the hook for UNUSED or SHUTDOWN. */
96-
if (likely(ce->mode == CLOCK_EVT_MODE_PERIODIC))
96+
if (likely(clockevent_state_periodic(ce)))
9797
ce->event_handler(ce);
9898

9999
if (test_irq_work_pending()) {
@@ -104,13 +104,6 @@ rtc_timer_interrupt(int irq, void *dev)
104104
return IRQ_HANDLED;
105105
}
106106

107-
static void
108-
rtc_ce_set_mode(enum clock_event_mode mode, struct clock_event_device *ce)
109-
{
110-
/* The mode member of CE is updated in generic code.
111-
Since we only support periodic events, nothing to do. */
112-
}
113-
114107
static int
115108
rtc_ce_set_next_event(unsigned long evt, struct clock_event_device *ce)
116109
{
@@ -129,7 +122,6 @@ init_rtc_clockevent(void)
129122
.features = CLOCK_EVT_FEAT_PERIODIC,
130123
.rating = 100,
131124
.cpumask = cpumask_of(cpu),
132-
.set_mode = rtc_ce_set_mode,
133125
.set_next_event = rtc_ce_set_next_event,
134126
};
135127

@@ -161,12 +153,12 @@ static struct clocksource qemu_cs = {
161153
* The QEMU alarm as a clock_event_device primitive.
162154
*/
163155

164-
static void
165-
qemu_ce_set_mode(enum clock_event_mode mode, struct clock_event_device *ce)
156+
static int qemu_ce_shutdown(struct clock_event_device *ce)
166157
{
167158
/* The mode member of CE is updated for us in generic code.
168159
Just make sure that the event is disabled. */
169160
qemu_set_alarm_abs(0);
161+
return 0;
170162
}
171163

172164
static int
@@ -197,7 +189,9 @@ init_qemu_clockevent(void)
197189
.features = CLOCK_EVT_FEAT_ONESHOT,
198190
.rating = 400,
199191
.cpumask = cpumask_of(cpu),
200-
.set_mode = qemu_ce_set_mode,
192+
.set_state_shutdown = qemu_ce_shutdown,
193+
.set_state_oneshot = qemu_ce_shutdown,
194+
.tick_resume = qemu_ce_shutdown,
201195
.set_next_event = qemu_ce_set_next_event,
202196
};
203197

arch/blackfin/kernel/time-ts.c

Lines changed: 70 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -136,44 +136,44 @@ static int bfin_gptmr0_set_next_event(unsigned long cycles,
136136
return 0;
137137
}
138138

139-
static void bfin_gptmr0_set_mode(enum clock_event_mode mode,
140-
struct clock_event_device *evt)
139+
static int bfin_gptmr0_set_periodic(struct clock_event_device *evt)
141140
{
142-
switch (mode) {
143-
case CLOCK_EVT_MODE_PERIODIC: {
144141
#ifndef CONFIG_BF60x
145-
set_gptimer_config(TIMER0_id, \
146-
TIMER_OUT_DIS | TIMER_IRQ_ENA | \
147-
TIMER_PERIOD_CNT | TIMER_MODE_PWM);
142+
set_gptimer_config(TIMER0_id,
143+
TIMER_OUT_DIS | TIMER_IRQ_ENA |
144+
TIMER_PERIOD_CNT | TIMER_MODE_PWM);
148145
#else
149-
set_gptimer_config(TIMER0_id, TIMER_OUT_DIS
150-
| TIMER_MODE_PWM_CONT | TIMER_PULSE_HI | TIMER_IRQ_PER);
146+
set_gptimer_config(TIMER0_id,
147+
TIMER_OUT_DIS | TIMER_MODE_PWM_CONT |
148+
TIMER_PULSE_HI | TIMER_IRQ_PER);
151149
#endif
152150

153-
set_gptimer_period(TIMER0_id, get_sclk() / HZ);
154-
set_gptimer_pwidth(TIMER0_id, get_sclk() / HZ - 1);
155-
enable_gptimers(TIMER0bit);
156-
break;
157-
}
158-
case CLOCK_EVT_MODE_ONESHOT:
159-
disable_gptimers(TIMER0bit);
151+
set_gptimer_period(TIMER0_id, get_sclk() / HZ);
152+
set_gptimer_pwidth(TIMER0_id, get_sclk() / HZ - 1);
153+
enable_gptimers(TIMER0bit);
154+
return 0;
155+
}
156+
157+
static int bfin_gptmr0_set_oneshot(struct clock_event_device *evt)
158+
{
159+
disable_gptimers(TIMER0bit);
160160
#ifndef CONFIG_BF60x
161-
set_gptimer_config(TIMER0_id, \
162-
TIMER_OUT_DIS | TIMER_IRQ_ENA | TIMER_MODE_PWM);
161+
set_gptimer_config(TIMER0_id,
162+
TIMER_OUT_DIS | TIMER_IRQ_ENA | TIMER_MODE_PWM);
163163
#else
164-
set_gptimer_config(TIMER0_id, TIMER_OUT_DIS | TIMER_MODE_PWM
165-
| TIMER_PULSE_HI | TIMER_IRQ_WID_DLY);
164+
set_gptimer_config(TIMER0_id,
165+
TIMER_OUT_DIS | TIMER_MODE_PWM | TIMER_PULSE_HI |
166+
TIMER_IRQ_WID_DLY);
166167
#endif
167168

168-
set_gptimer_period(TIMER0_id, 0);
169-
break;
170-
case CLOCK_EVT_MODE_UNUSED:
171-
case CLOCK_EVT_MODE_SHUTDOWN:
172-
disable_gptimers(TIMER0bit);
173-
break;
174-
case CLOCK_EVT_MODE_RESUME:
175-
break;
176-
}
169+
set_gptimer_period(TIMER0_id, 0);
170+
return 0;
171+
}
172+
173+
static int bfin_gptmr0_shutdown(struct clock_event_device *evt)
174+
{
175+
disable_gptimers(TIMER0bit);
176+
return 0;
177177
}
178178

179179
static void bfin_gptmr0_ack(void)
@@ -211,13 +211,16 @@ static struct irqaction gptmr0_irq = {
211211
};
212212

213213
static struct clock_event_device clockevent_gptmr0 = {
214-
.name = "bfin_gptimer0",
215-
.rating = 300,
216-
.irq = IRQ_TIMER0,
217-
.shift = 32,
218-
.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
219-
.set_next_event = bfin_gptmr0_set_next_event,
220-
.set_mode = bfin_gptmr0_set_mode,
214+
.name = "bfin_gptimer0",
215+
.rating = 300,
216+
.irq = IRQ_TIMER0,
217+
.shift = 32,
218+
.features = CLOCK_EVT_FEAT_PERIODIC |
219+
CLOCK_EVT_FEAT_ONESHOT,
220+
.set_next_event = bfin_gptmr0_set_next_event,
221+
.set_state_shutdown = bfin_gptmr0_shutdown,
222+
.set_state_periodic = bfin_gptmr0_set_periodic,
223+
.set_state_oneshot = bfin_gptmr0_set_oneshot,
221224
};
222225

223226
static void __init bfin_gptmr0_clockevent_init(struct clock_event_device *evt)
@@ -250,36 +253,35 @@ static int bfin_coretmr_set_next_event(unsigned long cycles,
250253
return 0;
251254
}
252255

253-
static void bfin_coretmr_set_mode(enum clock_event_mode mode,
254-
struct clock_event_device *evt)
256+
static int bfin_coretmr_set_periodic(struct clock_event_device *evt)
255257
{
256-
switch (mode) {
257-
case CLOCK_EVT_MODE_PERIODIC: {
258-
unsigned long tcount = ((get_cclk() / (HZ * TIME_SCALE)) - 1);
259-
bfin_write_TCNTL(TMPWR);
260-
CSYNC();
261-
bfin_write_TSCALE(TIME_SCALE - 1);
262-
bfin_write_TPERIOD(tcount);
263-
bfin_write_TCOUNT(tcount);
264-
CSYNC();
265-
bfin_write_TCNTL(TMPWR | TMREN | TAUTORLD);
266-
break;
267-
}
268-
case CLOCK_EVT_MODE_ONESHOT:
269-
bfin_write_TCNTL(TMPWR);
270-
CSYNC();
271-
bfin_write_TSCALE(TIME_SCALE - 1);
272-
bfin_write_TPERIOD(0);
273-
bfin_write_TCOUNT(0);
274-
break;
275-
case CLOCK_EVT_MODE_UNUSED:
276-
case CLOCK_EVT_MODE_SHUTDOWN:
277-
bfin_write_TCNTL(0);
278-
CSYNC();
279-
break;
280-
case CLOCK_EVT_MODE_RESUME:
281-
break;
282-
}
258+
unsigned long tcount = ((get_cclk() / (HZ * TIME_SCALE)) - 1);
259+
260+
bfin_write_TCNTL(TMPWR);
261+
CSYNC();
262+
bfin_write_TSCALE(TIME_SCALE - 1);
263+
bfin_write_TPERIOD(tcount);
264+
bfin_write_TCOUNT(tcount);
265+
CSYNC();
266+
bfin_write_TCNTL(TMPWR | TMREN | TAUTORLD);
267+
return 0;
268+
}
269+
270+
static int bfin_coretmr_set_oneshot(struct clock_event_device *evt)
271+
{
272+
bfin_write_TCNTL(TMPWR);
273+
CSYNC();
274+
bfin_write_TSCALE(TIME_SCALE - 1);
275+
bfin_write_TPERIOD(0);
276+
bfin_write_TCOUNT(0);
277+
return 0;
278+
}
279+
280+
static int bfin_coretmr_shutdown(struct clock_event_device *evt)
281+
{
282+
bfin_write_TCNTL(0);
283+
CSYNC();
284+
return 0;
283285
}
284286

285287
void bfin_coretmr_init(void)
@@ -335,7 +337,9 @@ void bfin_coretmr_clockevent_init(void)
335337
evt->shift = 32;
336338
evt->features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT;
337339
evt->set_next_event = bfin_coretmr_set_next_event;
338-
evt->set_mode = bfin_coretmr_set_mode;
340+
evt->set_state_shutdown = bfin_coretmr_shutdown;
341+
evt->set_state_periodic = bfin_coretmr_set_periodic;
342+
evt->set_state_oneshot = bfin_coretmr_set_oneshot;
339343

340344
clock_tick = get_cclk() / TIME_SCALE;
341345
evt->mult = div_sc(clock_tick, NSEC_PER_SEC, evt->shift);

arch/c6x/platforms/timer64.c

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -126,35 +126,37 @@ static int next_event(unsigned long delta,
126126
return 0;
127127
}
128128

129-
static void set_clock_mode(enum clock_event_mode mode,
130-
struct clock_event_device *evt)
129+
static int set_periodic(struct clock_event_device *evt)
131130
{
132-
switch (mode) {
133-
case CLOCK_EVT_MODE_PERIODIC:
134-
timer64_enable();
135-
timer64_mode = TIMER64_MODE_PERIODIC;
136-
timer64_config(TIMER64_RATE / HZ);
137-
break;
138-
case CLOCK_EVT_MODE_ONESHOT:
139-
timer64_enable();
140-
timer64_mode = TIMER64_MODE_ONE_SHOT;
141-
break;
142-
case CLOCK_EVT_MODE_UNUSED:
143-
case CLOCK_EVT_MODE_SHUTDOWN:
144-
timer64_mode = TIMER64_MODE_DISABLED;
145-
timer64_disable();
146-
break;
147-
case CLOCK_EVT_MODE_RESUME:
148-
break;
149-
}
131+
timer64_enable();
132+
timer64_mode = TIMER64_MODE_PERIODIC;
133+
timer64_config(TIMER64_RATE / HZ);
134+
return 0;
135+
}
136+
137+
static int set_oneshot(struct clock_event_device *evt)
138+
{
139+
timer64_enable();
140+
timer64_mode = TIMER64_MODE_ONE_SHOT;
141+
return 0;
142+
}
143+
144+
static int shutdown(struct clock_event_device *evt)
145+
{
146+
timer64_mode = TIMER64_MODE_DISABLED;
147+
timer64_disable();
148+
return 0;
150149
}
151150

152151
static struct clock_event_device t64_clockevent_device = {
153-
.name = "TIMER64_EVT32_TIMER",
154-
.features = CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_PERIODIC,
155-
.rating = 200,
156-
.set_mode = set_clock_mode,
157-
.set_next_event = next_event,
152+
.name = "TIMER64_EVT32_TIMER",
153+
.features = CLOCK_EVT_FEAT_ONESHOT |
154+
CLOCK_EVT_FEAT_PERIODIC,
155+
.rating = 200,
156+
.set_state_shutdown = shutdown,
157+
.set_state_periodic = set_periodic,
158+
.set_state_oneshot = set_oneshot,
159+
.set_next_event = next_event,
158160
};
159161

160162
static irqreturn_t timer_interrupt(int irq, void *dev_id)

arch/cris/arch-v32/kernel/time.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -172,15 +172,15 @@ void handle_watchdog_bite(struct pt_regs *regs)
172172
extern void cris_profile_sample(struct pt_regs *regs);
173173
static void __iomem *timer_base;
174174

175-
static void crisv32_clkevt_mode(enum clock_event_mode mode,
176-
struct clock_event_device *dev)
175+
static int crisv32_clkevt_switch_state(struct clock_event_device *dev)
177176
{
178177
reg_timer_rw_tmr0_ctrl ctrl = {
179178
.op = regk_timer_hold,
180179
.freq = regk_timer_f100,
181180
};
182181

183182
REG_WR(timer, timer_base, rw_tmr0_ctrl, ctrl);
183+
return 0;
184184
}
185185

186186
static int crisv32_clkevt_next_event(unsigned long evt,
@@ -231,7 +231,9 @@ static struct clock_event_device crisv32_clockevent = {
231231
.name = "crisv32-timer",
232232
.rating = 300,
233233
.features = CLOCK_EVT_FEAT_ONESHOT,
234-
.set_mode = crisv32_clkevt_mode,
234+
.set_state_oneshot = crisv32_clkevt_switch_state,
235+
.set_state_shutdown = crisv32_clkevt_switch_state,
236+
.tick_resume = crisv32_clkevt_switch_state,
235237
.set_next_event = crisv32_clkevt_next_event,
236238
};
237239

arch/microblaze/kernel/timer.c

Lines changed: 19 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -122,37 +122,29 @@ static int xilinx_timer_set_next_event(unsigned long delta,
122122
return 0;
123123
}
124124

125-
static void xilinx_timer_set_mode(enum clock_event_mode mode,
126-
struct clock_event_device *evt)
125+
static int xilinx_timer_shutdown(struct clock_event_device *evt)
127126
{
128-
switch (mode) {
129-
case CLOCK_EVT_MODE_PERIODIC:
130-
pr_info("%s: periodic\n", __func__);
131-
xilinx_timer0_start_periodic(freq_div_hz);
132-
break;
133-
case CLOCK_EVT_MODE_ONESHOT:
134-
pr_info("%s: oneshot\n", __func__);
135-
break;
136-
case CLOCK_EVT_MODE_UNUSED:
137-
pr_info("%s: unused\n", __func__);
138-
break;
139-
case CLOCK_EVT_MODE_SHUTDOWN:
140-
pr_info("%s: shutdown\n", __func__);
141-
xilinx_timer0_stop();
142-
break;
143-
case CLOCK_EVT_MODE_RESUME:
144-
pr_info("%s: resume\n", __func__);
145-
break;
146-
}
127+
pr_info("%s\n", __func__);
128+
xilinx_timer0_stop();
129+
return 0;
130+
}
131+
132+
static int xilinx_timer_set_periodic(struct clock_event_device *evt)
133+
{
134+
pr_info("%s\n", __func__);
135+
xilinx_timer0_start_periodic(freq_div_hz);
136+
return 0;
147137
}
148138

149139
static struct clock_event_device clockevent_xilinx_timer = {
150-
.name = "xilinx_clockevent",
151-
.features = CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_PERIODIC,
152-
.shift = 8,
153-
.rating = 300,
154-
.set_next_event = xilinx_timer_set_next_event,
155-
.set_mode = xilinx_timer_set_mode,
140+
.name = "xilinx_clockevent",
141+
.features = CLOCK_EVT_FEAT_ONESHOT |
142+
CLOCK_EVT_FEAT_PERIODIC,
143+
.shift = 8,
144+
.rating = 300,
145+
.set_next_event = xilinx_timer_set_next_event,
146+
.set_state_shutdown = xilinx_timer_shutdown,
147+
.set_state_periodic = xilinx_timer_set_periodic,
156148
};
157149

158150
static inline void timer_ack(void)

0 commit comments

Comments
 (0)