static int sirfsoc_local_timer_setup(struct clock_event_device *ce) { int cpu = smp_processor_id(); struct irqaction *action; if (cpu == 0) action = &sirfsoc_timer_irq; else action = &sirfsoc_timer1_irq; ce->irq = action->irq; ce->name = "local_timer"; ce->features = CLOCK_EVT_FEAT_ONESHOT; ce->rating = 200; ce->set_state_shutdown = sirfsoc_timer_shutdown; ce->set_state_oneshot = sirfsoc_timer_shutdown; ce->tick_resume = sirfsoc_timer_shutdown; ce->set_next_event = sirfsoc_timer_set_next_event; clockevents_calc_mult_shift(ce, atlas7_timer_rate, 60); ce->max_delta_ns = clockevent_delta2ns(-2, ce); ce->min_delta_ns = clockevent_delta2ns(2, ce); ce->cpumask = cpumask_of(cpu); action->dev_id = ce; BUG_ON(setup_irq(ce->irq, action)); irq_force_affinity(action->irq, cpumask_of(cpu)); clockevents_register_device(ce); return 0; }
static int tegra_timer_setup(unsigned int cpu) { struct timer_of *to = per_cpu_ptr(&tegra_to, cpu); writel_relaxed(0, timer_of_base(to) + TIMER_PTV); writel_relaxed(TIMER_PCR_INTR_CLR, timer_of_base(to) + TIMER_PCR); irq_force_affinity(to->clkevt.irq, cpumask_of(cpu)); enable_irq(to->clkevt.irq); clockevents_config_and_register(&to->clkevt, timer_of_rate(to), 1, /* min */ 0x1fffffff); /* 29 bits */ return 0; }