static void s5p_tick_set_mode(enum clock_event_mode mode, struct clock_event_device *evt) { switch (mode) { case CLOCK_EVT_MODE_PERIODIC: tick_timer_mode = 1; break; case CLOCK_EVT_MODE_ONESHOT: s5p_tick_timer_stop(); tick_timer_mode = 0; break; case CLOCK_EVT_MODE_UNUSED: case CLOCK_EVT_MODE_SHUTDOWN: /* Sched timer stopped */ sched_timer_running = 0; /* Reset sched_clock variables after sleep/wakeup */ last_ticks = 0; s5p_sched_timer_overflows = 0; old_overflows = 0; pending_irq = 0; break; case CLOCK_EVT_MODE_RESUME: s5p_tick_timer_setup(); s5p_sched_timer_start(~0, 1); break; } }
static void s5p_init_dynamic_tick_timer(unsigned long rate) { tick_timer_mode = 1; s5p_tick_timer_stop(); s5p_tick_timer_start((rate / HZ) - 1, 1); clockevent_tick_timer.mult = div_sc(rate, NSEC_PER_SEC, clockevent_tick_timer.shift); clockevent_tick_timer.max_delta_ns = clockevent_delta2ns(-1, &clockevent_tick_timer); clockevent_tick_timer.min_delta_ns = clockevent_delta2ns(1, &clockevent_tick_timer); clockevent_tick_timer.cpumask = cpumask_of(0); clockevents_register_device(&clockevent_tick_timer); printk(KERN_INFO "mult[%lu]\n", (long unsigned int)clockevent_tick_timer.mult); printk(KERN_INFO "max_delta_ns[%lu]\n", (long unsigned int)clockevent_tick_timer.max_delta_ns); printk(KERN_INFO "min_delta_ns[%lu]\n", (long unsigned int)clockevent_tick_timer.min_delta_ns); printk(KERN_INFO "rate[%lu]\n", (long unsigned int)rate); printk(KERN_INFO "HZ[%d]\n", HZ); }
irqreturn_t s5p_tick_timer_interrupt(int irq, void *dev_id) { struct clock_event_device *evt = &clockevent_tick_timer; __raw_writel(S3C_INTP_TIC, rtc_base + S3C_INTP); /* In case of oneshot mode */ if (tick_timer_mode == 0) s5p_tick_timer_stop(); evt->event_handler(evt); return IRQ_HANDLED; }