diff options
author | Viresh Kumar <viresh.kumar@linaro.org> | 2015-06-12 04:00:12 -0400 |
---|---|---|
committer | Daniel Lezcano <daniel.lezcano@linaro.org> | 2015-08-06 06:16:41 -0400 |
commit | 46c5bfdda3de91ba4324d73403af7dfb60f5ee38 (patch) | |
tree | 54e07ca5a9c778566510655270d78f09779ccf8f /drivers/clocksource/arm_arch_timer.c | |
parent | d74892c5b291c0010295d26d6b1e11cd70451722 (diff) |
clockevents/drivers/arm_arch_timer: Migrate to new 'set-state' interface
Migrate arm_arch_timer driver to the new 'set-state' interface provided
by the clockevents core, the earlier 'set-mode' interface is marked
obsolete now.
This also enables us to implement callbacks for new states of clockevent
devices, for example: ONESHOT_STOPPED.
Cc: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Diffstat (limited to 'drivers/clocksource/arm_arch_timer.c')
-rw-r--r-- | drivers/clocksource/arm_arch_timer.c | 52 |
1 files changed, 22 insertions, 30 deletions
diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c index 0aa135ddbf80..d6e3e49399dd 100644 --- a/drivers/clocksource/arm_arch_timer.c +++ b/drivers/clocksource/arm_arch_timer.c | |||
@@ -181,44 +181,36 @@ static irqreturn_t arch_timer_handler_virt_mem(int irq, void *dev_id) | |||
181 | return timer_handler(ARCH_TIMER_MEM_VIRT_ACCESS, evt); | 181 | return timer_handler(ARCH_TIMER_MEM_VIRT_ACCESS, evt); |
182 | } | 182 | } |
183 | 183 | ||
184 | static __always_inline void timer_set_mode(const int access, int mode, | 184 | static __always_inline int timer_shutdown(const int access, |
185 | struct clock_event_device *clk) | 185 | struct clock_event_device *clk) |
186 | { | 186 | { |
187 | unsigned long ctrl; | 187 | unsigned long ctrl; |
188 | switch (mode) { | 188 | |
189 | case CLOCK_EVT_MODE_UNUSED: | 189 | ctrl = arch_timer_reg_read(access, ARCH_TIMER_REG_CTRL, clk); |
190 | case CLOCK_EVT_MODE_SHUTDOWN: | 190 | ctrl &= ~ARCH_TIMER_CTRL_ENABLE; |
191 | ctrl = arch_timer_reg_read(access, ARCH_TIMER_REG_CTRL, clk); | 191 | arch_timer_reg_write(access, ARCH_TIMER_REG_CTRL, ctrl, clk); |
192 | ctrl &= ~ARCH_TIMER_CTRL_ENABLE; | 192 | |
193 | arch_timer_reg_write(access, ARCH_TIMER_REG_CTRL, ctrl, clk); | 193 | return 0; |
194 | break; | ||
195 | default: | ||
196 | break; | ||
197 | } | ||
198 | } | 194 | } |
199 | 195 | ||
200 | static void arch_timer_set_mode_virt(enum clock_event_mode mode, | 196 | static int arch_timer_shutdown_virt(struct clock_event_device *clk) |
201 | struct clock_event_device *clk) | ||
202 | { | 197 | { |
203 | timer_set_mode(ARCH_TIMER_VIRT_ACCESS, mode, clk); | 198 | return timer_shutdown(ARCH_TIMER_VIRT_ACCESS, clk); |
204 | } | 199 | } |
205 | 200 | ||
206 | static void arch_timer_set_mode_phys(enum clock_event_mode mode, | 201 | static int arch_timer_shutdown_phys(struct clock_event_device *clk) |
207 | struct clock_event_device *clk) | ||
208 | { | 202 | { |
209 | timer_set_mode(ARCH_TIMER_PHYS_ACCESS, mode, clk); | 203 | return timer_shutdown(ARCH_TIMER_PHYS_ACCESS, clk); |
210 | } | 204 | } |
211 | 205 | ||
212 | static void arch_timer_set_mode_virt_mem(enum clock_event_mode mode, | 206 | static int arch_timer_shutdown_virt_mem(struct clock_event_device *clk) |
213 | struct clock_event_device *clk) | ||
214 | { | 207 | { |
215 | timer_set_mode(ARCH_TIMER_MEM_VIRT_ACCESS, mode, clk); | 208 | return timer_shutdown(ARCH_TIMER_MEM_VIRT_ACCESS, clk); |
216 | } | 209 | } |
217 | 210 | ||
218 | static void arch_timer_set_mode_phys_mem(enum clock_event_mode mode, | 211 | static int arch_timer_shutdown_phys_mem(struct clock_event_device *clk) |
219 | struct clock_event_device *clk) | ||
220 | { | 212 | { |
221 | timer_set_mode(ARCH_TIMER_MEM_PHYS_ACCESS, mode, clk); | 213 | return timer_shutdown(ARCH_TIMER_MEM_PHYS_ACCESS, clk); |
222 | } | 214 | } |
223 | 215 | ||
224 | static __always_inline void set_next_event(const int access, unsigned long evt, | 216 | static __always_inline void set_next_event(const int access, unsigned long evt, |
@@ -273,11 +265,11 @@ static void __arch_timer_setup(unsigned type, | |||
273 | clk->cpumask = cpumask_of(smp_processor_id()); | 265 | clk->cpumask = cpumask_of(smp_processor_id()); |
274 | if (arch_timer_use_virtual) { | 266 | if (arch_timer_use_virtual) { |
275 | clk->irq = arch_timer_ppi[VIRT_PPI]; | 267 | clk->irq = arch_timer_ppi[VIRT_PPI]; |
276 | clk->set_mode = arch_timer_set_mode_virt; | 268 | clk->set_state_shutdown = arch_timer_shutdown_virt; |
277 | clk->set_next_event = arch_timer_set_next_event_virt; | 269 | clk->set_next_event = arch_timer_set_next_event_virt; |
278 | } else { | 270 | } else { |
279 | clk->irq = arch_timer_ppi[PHYS_SECURE_PPI]; | 271 | clk->irq = arch_timer_ppi[PHYS_SECURE_PPI]; |
280 | clk->set_mode = arch_timer_set_mode_phys; | 272 | clk->set_state_shutdown = arch_timer_shutdown_phys; |
281 | clk->set_next_event = arch_timer_set_next_event_phys; | 273 | clk->set_next_event = arch_timer_set_next_event_phys; |
282 | } | 274 | } |
283 | } else { | 275 | } else { |
@@ -286,17 +278,17 @@ static void __arch_timer_setup(unsigned type, | |||
286 | clk->rating = 400; | 278 | clk->rating = 400; |
287 | clk->cpumask = cpu_all_mask; | 279 | clk->cpumask = cpu_all_mask; |
288 | if (arch_timer_mem_use_virtual) { | 280 | if (arch_timer_mem_use_virtual) { |
289 | clk->set_mode = arch_timer_set_mode_virt_mem; | 281 | clk->set_state_shutdown = arch_timer_shutdown_virt_mem; |
290 | clk->set_next_event = | 282 | clk->set_next_event = |
291 | arch_timer_set_next_event_virt_mem; | 283 | arch_timer_set_next_event_virt_mem; |
292 | } else { | 284 | } else { |
293 | clk->set_mode = arch_timer_set_mode_phys_mem; | 285 | clk->set_state_shutdown = arch_timer_shutdown_phys_mem; |
294 | clk->set_next_event = | 286 | clk->set_next_event = |
295 | arch_timer_set_next_event_phys_mem; | 287 | arch_timer_set_next_event_phys_mem; |
296 | } | 288 | } |
297 | } | 289 | } |
298 | 290 | ||
299 | clk->set_mode(CLOCK_EVT_MODE_SHUTDOWN, clk); | 291 | clk->set_state_shutdown(clk); |
300 | 292 | ||
301 | clockevents_config_and_register(clk, arch_timer_rate, 0xf, 0x7fffffff); | 293 | clockevents_config_and_register(clk, arch_timer_rate, 0xf, 0x7fffffff); |
302 | } | 294 | } |
@@ -506,7 +498,7 @@ static void arch_timer_stop(struct clock_event_device *clk) | |||
506 | disable_percpu_irq(arch_timer_ppi[PHYS_NONSECURE_PPI]); | 498 | disable_percpu_irq(arch_timer_ppi[PHYS_NONSECURE_PPI]); |
507 | } | 499 | } |
508 | 500 | ||
509 | clk->set_mode(CLOCK_EVT_MODE_UNUSED, clk); | 501 | clk->set_state_shutdown(clk); |
510 | } | 502 | } |
511 | 503 | ||
512 | static int arch_timer_cpu_notify(struct notifier_block *self, | 504 | static int arch_timer_cpu_notify(struct notifier_block *self, |