* @name: Name of Timer
* @base_addr: Base address of timer
* @timer_irq: irqaction structure for the timer device
- * @mode: only valid for an clock event, periodic or one-shot
**/
struct xttcpss_timer {
char *name;
unsigned long base_addr;
struct irqaction timer_irq;
- enum clock_event_mode mode;
};
xttcpss_write(timer->base_addr + XTTCPSS_INTR_VAL_OFFSET, cycles);
- /* Reset the counter (0x10) so that it starts from 0, one-shot
- mode makes this needed for timing to be right. */
ctrl_reg &= XTTCPSS_CNT_CNTRL_ENABLE_MASK;
- ctrl_reg |= 0x10;
xttcpss_write(timer->base_addr + XTTCPSS_CNT_CNTRL_OFFSET, ctrl_reg);
}
{
struct clock_event_device *evt = &xttcpss_clockevent;
struct xttcpss_timer *timer = dev_id;
- u32 ctrl_reg;
-
+
/* Acknowledge the interrupt and call event handler */
xttcpss_write(timer->base_addr + XTTCPSS_ISR_OFFSET,
xttcpss_read(timer->base_addr + XTTCPSS_ISR_OFFSET));
- if (timer->mode == CLOCK_EVT_MODE_ONESHOT) {
-
- /* Disable the counter as it would keep running. */
- ctrl_reg = xttcpss_read(timer->base_addr + XTTCPSS_CNT_CNTRL_OFFSET);
- ctrl_reg |= ~(XTTCPSS_CNT_CNTRL_ENABLE_MASK);
- xttcpss_write(timer->base_addr + XTTCPSS_CNT_CNTRL_OFFSET, ctrl_reg);
- }
-
evt->event_handler(evt);
return IRQ_HANDLED;
struct xttcpss_timer *timer = &timers[XTTCPSS_CLOCKEVENT];
u32 ctrl_reg;
- timer->mode = mode;
-
switch (mode) {
case CLOCK_EVT_MODE_PERIODIC:
xttcpss_set_interval(timer, CLOCK_TICK_RATE / HZ);
break;
case CLOCK_EVT_MODE_ONESHOT:
+ printk(KERN_ERR "xttcpss_set_mode: one shot mode is not"
+ " supported by Triple Timer Counter in PSS \n");
+ break;
case CLOCK_EVT_MODE_UNUSED:
case CLOCK_EVT_MODE_SHUTDOWN:
ctrl_reg = xttcpss_read(timer->base_addr +
*/
static struct clock_event_device xttcpss_clockevent = {
.name = "xttcpss_timer2",
- .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
+ .features = CLOCK_EVT_FEAT_PERIODIC,
.shift = 0, /* Initialized to zero */
.set_next_event = xttcpss_set_next_event,
.set_mode = xttcpss_set_mode,