clocksource/drivers/fttmr010: Parametrise shutdown
In preparation for supporting the ast2600 which uses a different method to clear bits in the control register, use a callback for performing the shutdown sequence. Reviewed-by: Cédric Le Goater <clg@kaod.org> Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Joel Stanley <joel@jms.id.au> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org> Link: https://lore.kernel.org/r/20191107094218.13210-2-joel@jms.id.au
This commit is contained in:
Родитель
5fb1c2a5bb
Коммит
84fb64c28a
|
@ -97,6 +97,7 @@ struct fttmr010 {
|
|||
bool is_aspeed;
|
||||
u32 t1_enable_val;
|
||||
struct clock_event_device clkevt;
|
||||
int (*timer_shutdown)(struct clock_event_device *evt);
|
||||
#ifdef CONFIG_ARM
|
||||
struct delay_timer delay_timer;
|
||||
#endif
|
||||
|
@ -140,9 +141,7 @@ static int fttmr010_timer_set_next_event(unsigned long cycles,
|
|||
u32 cr;
|
||||
|
||||
/* Stop */
|
||||
cr = readl(fttmr010->base + TIMER_CR);
|
||||
cr &= ~fttmr010->t1_enable_val;
|
||||
writel(cr, fttmr010->base + TIMER_CR);
|
||||
fttmr010->timer_shutdown(evt);
|
||||
|
||||
if (fttmr010->is_aspeed) {
|
||||
/*
|
||||
|
@ -183,9 +182,7 @@ static int fttmr010_timer_set_oneshot(struct clock_event_device *evt)
|
|||
u32 cr;
|
||||
|
||||
/* Stop */
|
||||
cr = readl(fttmr010->base + TIMER_CR);
|
||||
cr &= ~fttmr010->t1_enable_val;
|
||||
writel(cr, fttmr010->base + TIMER_CR);
|
||||
fttmr010->timer_shutdown(evt);
|
||||
|
||||
/* Setup counter start from 0 or ~0 */
|
||||
writel(0, fttmr010->base + TIMER1_COUNT);
|
||||
|
@ -211,9 +208,7 @@ static int fttmr010_timer_set_periodic(struct clock_event_device *evt)
|
|||
u32 cr;
|
||||
|
||||
/* Stop */
|
||||
cr = readl(fttmr010->base + TIMER_CR);
|
||||
cr &= ~fttmr010->t1_enable_val;
|
||||
writel(cr, fttmr010->base + TIMER_CR);
|
||||
fttmr010->timer_shutdown(evt);
|
||||
|
||||
/* Setup timer to fire at 1/HZ intervals. */
|
||||
if (fttmr010->is_aspeed) {
|
||||
|
@ -350,6 +345,8 @@ static int __init fttmr010_common_init(struct device_node *np, bool is_aspeed)
|
|||
fttmr010->tick_rate);
|
||||
}
|
||||
|
||||
fttmr010->timer_shutdown = fttmr010_timer_shutdown;
|
||||
|
||||
/*
|
||||
* Setup clockevent timer (interrupt-driven) on timer 1.
|
||||
*/
|
||||
|
@ -370,10 +367,10 @@ static int __init fttmr010_common_init(struct device_node *np, bool is_aspeed)
|
|||
fttmr010->clkevt.features = CLOCK_EVT_FEAT_PERIODIC |
|
||||
CLOCK_EVT_FEAT_ONESHOT;
|
||||
fttmr010->clkevt.set_next_event = fttmr010_timer_set_next_event;
|
||||
fttmr010->clkevt.set_state_shutdown = fttmr010_timer_shutdown;
|
||||
fttmr010->clkevt.set_state_shutdown = fttmr010->timer_shutdown;
|
||||
fttmr010->clkevt.set_state_periodic = fttmr010_timer_set_periodic;
|
||||
fttmr010->clkevt.set_state_oneshot = fttmr010_timer_set_oneshot;
|
||||
fttmr010->clkevt.tick_resume = fttmr010_timer_shutdown;
|
||||
fttmr010->clkevt.tick_resume = fttmr010->timer_shutdown;
|
||||
fttmr010->clkevt.cpumask = cpumask_of(0);
|
||||
fttmr010->clkevt.irq = irq;
|
||||
clockevents_config_and_register(&fttmr010->clkevt,
|
||||
|
|
Загрузка…
Ссылка в новой задаче