diff options
Diffstat (limited to 'drivers/clocksource/cadence_ttc_timer.c')
-rw-r--r-- | drivers/clocksource/cadence_ttc_timer.c | 59 |
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 | **/ |
199 | static void ttc_set_mode(enum clock_event_mode mode, | 198 | static 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: | 210 | static 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); | 220 | static 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 | ||
230 | static int ttc_rate_change_clocksource_cb(struct notifier_block *nb, | 232 | static 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; |