aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/clocksource/cadence_ttc_timer.c
diff options
context:
space:
mode:
authorViresh Kumar <viresh.kumar@linaro.org>2015-06-18 06:54:16 -0400
committerDaniel Lezcano <daniel.lezcano@linaro.org>2015-08-10 05:40:26 -0400
commit5c0a4bbefc0571ba3addb39da0eb53368c018b64 (patch)
tree8a53f73e3b194ebd1c0ea34272d5e24d4380eb8e /drivers/clocksource/cadence_ttc_timer.c
parent3465f60917f2dbbc227e2a2e7913ad75bb604c12 (diff)
clockevents/drivers/cadence_ttc: Migrate to new 'set-state' interface
Migrate cadence_ttc driver to the new 'set-state' interface provided by 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: Michal Simek <michal.simek@xilinx.com> Cc: Sören Brinkmann <soren.brinkmann@xilinx.com> Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org> Tested-by: Sören Brinkmann <soren.brinkmann@xilinx.com>
Diffstat (limited to 'drivers/clocksource/cadence_ttc_timer.c')
-rw-r--r--drivers/clocksource/cadence_ttc_timer.c59
1 files changed, 32 insertions, 27 deletions
diff --git a/drivers/clocksource/cadence_ttc_timer.c b/drivers/clocksource/cadence_ttc_timer.c
index 510c8a1d37b3..e47e0e0887eb 100644
--- a/drivers/clocksource/cadence_ttc_timer.c
+++ b/drivers/clocksource/cadence_ttc_timer.c
@@ -191,40 +191,42 @@ static int ttc_set_next_event(unsigned long cycles,
191} 191}
192 192
193/** 193/**
194 * ttc_set_mode - Sets the mode of timer 194 * ttc_set_{shutdown|oneshot|periodic} - Sets the state of timer
195 * 195 *
196 * @mode: Mode to be set
197 * @evt: Address of clock event instance 196 * @evt: Address of clock event instance
198 **/ 197 **/
199static void ttc_set_mode(enum clock_event_mode mode, 198static int ttc_shutdown(struct clock_event_device *evt)
200 struct clock_event_device *evt)
201{ 199{
202 struct ttc_timer_clockevent *ttce = to_ttc_timer_clkevent(evt); 200 struct ttc_timer_clockevent *ttce = to_ttc_timer_clkevent(evt);
203 struct ttc_timer *timer = &ttce->ttc; 201 struct ttc_timer *timer = &ttce->ttc;
204 u32 ctrl_reg; 202 u32 ctrl_reg;
205 203
206 switch (mode) { 204 ctrl_reg = readl_relaxed(timer->base_addr + TTC_CNT_CNTRL_OFFSET);
207 case CLOCK_EVT_MODE_PERIODIC: 205 ctrl_reg |= TTC_CNT_CNTRL_DISABLE_MASK;
208 ttc_set_interval(timer, DIV_ROUND_CLOSEST(ttce->ttc.freq, 206 writel_relaxed(ctrl_reg, timer->base_addr + TTC_CNT_CNTRL_OFFSET);
209 PRESCALE * HZ)); 207 return 0;
210 break; 208}
211 case CLOCK_EVT_MODE_ONESHOT: 209
212 case CLOCK_EVT_MODE_UNUSED: 210static int ttc_set_periodic(struct clock_event_device *evt)
213 case CLOCK_EVT_MODE_SHUTDOWN: 211{
214 ctrl_reg = readl_relaxed(timer->base_addr + 212 struct ttc_timer_clockevent *ttce = to_ttc_timer_clkevent(evt);
215 TTC_CNT_CNTRL_OFFSET); 213 struct ttc_timer *timer = &ttce->ttc;
216 ctrl_reg |= TTC_CNT_CNTRL_DISABLE_MASK; 214
217 writel_relaxed(ctrl_reg, 215 ttc_set_interval(timer,
218 timer->base_addr + TTC_CNT_CNTRL_OFFSET); 216 DIV_ROUND_CLOSEST(ttce->ttc.freq, PRESCALE * HZ));
219 break; 217 return 0;
220 case CLOCK_EVT_MODE_RESUME: 218}
221 ctrl_reg = readl_relaxed(timer->base_addr + 219
222 TTC_CNT_CNTRL_OFFSET); 220static int ttc_resume(struct clock_event_device *evt)
223 ctrl_reg &= ~TTC_CNT_CNTRL_DISABLE_MASK; 221{
224 writel_relaxed(ctrl_reg, 222 struct ttc_timer_clockevent *ttce = to_ttc_timer_clkevent(evt);
225 timer->base_addr + TTC_CNT_CNTRL_OFFSET); 223 struct ttc_timer *timer = &ttce->ttc;
226 break; 224 u32 ctrl_reg;
227 } 225
226 ctrl_reg = readl_relaxed(timer->base_addr + TTC_CNT_CNTRL_OFFSET);
227 ctrl_reg &= ~TTC_CNT_CNTRL_DISABLE_MASK;
228 writel_relaxed(ctrl_reg, timer->base_addr + TTC_CNT_CNTRL_OFFSET);
229 return 0;
228} 230}
229 231
230static int ttc_rate_change_clocksource_cb(struct notifier_block *nb, 232static int ttc_rate_change_clocksource_cb(struct notifier_block *nb,
@@ -430,7 +432,10 @@ static void __init ttc_setup_clockevent(struct clk *clk,
430 ttcce->ce.name = "ttc_clockevent"; 432 ttcce->ce.name = "ttc_clockevent";
431 ttcce->ce.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT; 433 ttcce->ce.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT;
432 ttcce->ce.set_next_event = ttc_set_next_event; 434 ttcce->ce.set_next_event = ttc_set_next_event;
433 ttcce->ce.set_mode = ttc_set_mode; 435 ttcce->ce.set_state_shutdown = ttc_shutdown;
436 ttcce->ce.set_state_periodic = ttc_set_periodic;
437 ttcce->ce.set_state_oneshot = ttc_shutdown;
438 ttcce->ce.tick_resume = ttc_resume;
434 ttcce->ce.rating = 200; 439 ttcce->ce.rating = 200;
435 ttcce->ce.irq = irq; 440 ttcce->ce.irq = irq;
436 ttcce->ce.cpumask = cpu_possible_mask; 441 ttcce->ce.cpumask = cpu_possible_mask;