aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/clocksource/arm_arch_timer.c
diff options
context:
space:
mode:
authorViresh Kumar <viresh.kumar@linaro.org>2015-06-12 04:00:12 -0400
committerDaniel Lezcano <daniel.lezcano@linaro.org>2015-08-06 06:16:41 -0400
commit46c5bfdda3de91ba4324d73403af7dfb60f5ee38 (patch)
tree54e07ca5a9c778566510655270d78f09779ccf8f /drivers/clocksource/arm_arch_timer.c
parentd74892c5b291c0010295d26d6b1e11cd70451722 (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.c52
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
184static __always_inline void timer_set_mode(const int access, int mode, 184static __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
200static void arch_timer_set_mode_virt(enum clock_event_mode mode, 196static 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
206static void arch_timer_set_mode_phys(enum clock_event_mode mode, 201static 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
212static void arch_timer_set_mode_virt_mem(enum clock_event_mode mode, 206static 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
218static void arch_timer_set_mode_phys_mem(enum clock_event_mode mode, 211static 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
224static __always_inline void set_next_event(const int access, unsigned long evt, 216static __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
512static int arch_timer_cpu_notify(struct notifier_block *self, 504static int arch_timer_cpu_notify(struct notifier_block *self,