Esempio n. 1
0
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);
}
Esempio n. 3
0
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;
}