static void __gptimer_set_mode(enum clock_event_mode mode,
			       struct clock_event_device *c)
{
	unsigned int saved;
	switch (mode) {
	case CLOCK_EVT_MODE_PERIODIC:
		__gptimer_ctl(EVENT_TIMER, TIMER_DISABLE, PERIOD_MODE);
		__raw_writel(LATCH, TIMER_LOAD(EVENT_TIMER));
		__gptimer_ctl(EVENT_TIMER, TIMER_ENABLE, PERIOD_MODE);
		__raw_writel(TIMER_INT_EN, TIMER_INT(EVENT_TIMER));
		break;
	case CLOCK_EVT_MODE_ONESHOT:
		__gptimer_ctl(EVENT_TIMER, TIMER_ENABLE, ONETIME_MODE);
		__raw_writel(TIMER_INT_EN, TIMER_INT(EVENT_TIMER));
		break;
	case CLOCK_EVT_MODE_SHUTDOWN:
	case CLOCK_EVT_MODE_UNUSED:
		saved = __raw_readl(TIMER_CTL(EVENT_TIMER)) & PERIOD_MODE;
		__gptimer_ctl(EVENT_TIMER, TIMER_DISABLE, saved);
		break;
	case CLOCK_EVT_MODE_RESUME:
		saved = __raw_readl(TIMER_CTL(EVENT_TIMER)) & PERIOD_MODE;
		__gptimer_ctl(EVENT_TIMER, TIMER_ENABLE, saved);
		break;
	}
}
示例#2
0
void sec_debug_print_gptimer_reg(void)
{

	printk("%s: gptimer-clockevent\n",__func__);
	printk("load reg: 0x%x\n",__raw_readl(TIMER_LOAD(0,0)));
	printk("value reg: 0x%x\n",__raw_readl(TIMER_VALUE(0,0)));
	printk("control reg: 0x%x\n",__raw_readl(TIMER_CTL(0,0)));
	printk("interrupt reg: 0x%x\n",__raw_readl(TIMER_INT(0,0)));
	printk("%s: gptimer-clocksource\n",__func__);
	printk("load reg: 0x%x\n",__raw_readl(TIMER_LOAD(0,2)));
	printk("value reg: 0x%x\n",__raw_readl(TIMER_VALUE(0,2)));
	printk("control reg: 0x%x\n",__raw_readl(TIMER_CTL(0,2)));
	printk("interrupt reg: 0x%x\n",__raw_readl(TIMER_INT(0,2)));
}
static void sprd_gptimer_clockevent_init(unsigned int irq, const char *name,
					 unsigned long hz)
{
	struct clock_event_device *evt = &gptimer_event;
	__raw_writel(TIMER_DISABLE, TIMER_CTL(EVENT_TIMER));
	__raw_writel(TIMER_INT_CLR, TIMER_INT(EVENT_TIMER));

	evt->name = name;
	evt->irq = irq;
	evt->mult = div_sc(hz, NSEC_PER_SEC, evt->shift);
	evt->max_delta_ns = clockevent_delta2ns(ULONG_MAX, evt);
	evt->min_delta_ns = clockevent_delta2ns(2, evt);
	evt->cpumask = cpu_all_mask;

	setup_irq(irq, &gptimer_irq);
	clockevents_register_device(evt);
}
static inline void __gptimer_ctl(int timer_id, int enable, int mode)
{
	__raw_writel(enable | mode, TIMER_CTL(timer_id));
}