static int epit_set_oneshot(struct clock_event_device *evt) { unsigned long flags; /* * The timer interrupt generation is disabled at least * for enough time to call epit_set_next_event() */ local_irq_save(flags); /* Disable interrupt in GPT module */ epit_irq_disable(); /* Clear pending interrupt, only while switching mode */ if (!clockevent_state_oneshot(evt)) epit_irq_acknowledge(); /* * Do not put overhead of interrupt enable/disable into * epit_set_next_event(), the core has about 4 minutes * to call epit_set_next_event() or shutdown clock after * mode switching */ epit_irq_enable(); local_irq_restore(flags); return 0; }
/* * IRQ handler for the timer */ static irqreturn_t epit_timer_interrupt(int irq, void *dev_id) { struct clock_event_device *evt = &clockevent_epit; epit_irq_acknowledge(); evt->event_handler(evt); return IRQ_HANDLED; }
/* * IRQ handler for the timer */ static vmm_irq_return_t epit_timer_interrupt(int irq, void *dev) { struct epit_clockchip *ecc = dev; epit_irq_acknowledge(ecc); ecc->clkchip.event_handler(&ecc->clkchip); return VMM_IRQ_HANDLED; }
static void epit_set_mode(enum clock_event_mode mode, struct clock_event_device *evt) { unsigned long flags; /* * The timer interrupt generation is disabled at least * for enough time to call epit_set_next_event() */ local_irq_save(flags); /* Disable interrupt in GPT module */ epit_irq_disable(); if (mode != clockevent_mode) { /* Set event time into far-far future */ /* Clear pending interrupt */ epit_irq_acknowledge(); } /* Remember timer mode */ clockevent_mode = mode; local_irq_restore(flags); switch (mode) { case CLOCK_EVT_MODE_PERIODIC: printk(KERN_ERR "epit_set_mode: Periodic mode is not " "supported for i.MX EPIT\n"); break; case CLOCK_EVT_MODE_ONESHOT: /* * Do not put overhead of interrupt enable/disable into * epit_set_next_event(), the core has about 4 minutes * to call epit_set_next_event() or shutdown clock after * mode switching */ local_irq_save(flags); epit_irq_enable(); local_irq_restore(flags); break; case CLOCK_EVT_MODE_SHUTDOWN: case CLOCK_EVT_MODE_UNUSED: case CLOCK_EVT_MODE_RESUME: /* Left event sources disabled, no more interrupts appear */ break; } }
/* Left event sources disabled, no more interrupts appear */ static int epit_shutdown(struct clock_event_device *evt) { unsigned long flags; /* * The timer interrupt generation is disabled at least * for enough time to call epit_set_next_event() */ local_irq_save(flags); /* Disable interrupt in GPT module */ epit_irq_disable(); /* Clear pending interrupt */ epit_irq_acknowledge(); local_irq_restore(flags); return 0; }
static void epit_set_mode(enum clock_event_mode mode, struct clock_event_device *evt) { unsigned long flags; local_irq_save(flags); epit_irq_disable(); if (mode != clockevent_mode) { epit_irq_acknowledge(); } clockevent_mode = mode; local_irq_restore(flags); switch (mode) { case CLOCK_EVT_MODE_PERIODIC: printk(KERN_ERR "epit_set_mode: Periodic mode is not " "supported for i.MX EPIT\n"); break; case CLOCK_EVT_MODE_ONESHOT: local_irq_save(flags); epit_irq_enable(); local_irq_restore(flags); break; case CLOCK_EVT_MODE_SHUTDOWN: case CLOCK_EVT_MODE_UNUSED: case CLOCK_EVT_MODE_RESUME: break; } }
static void epit_set_mode(enum vmm_clockchip_mode mode, struct vmm_clockchip *evt) { struct epit_clockchip *ecc = evt->priv; unsigned long flags; /* * The timer interrupt generation is disabled at least * for enough time to call epit_set_next_event() */ arch_cpu_irq_save(flags); /* Disable interrupt */ epit_irq_disable(ecc); if (mode != ecc->clockevent_mode) { /* * Set event time into far-far future. * The further we can go is to let the timer wrap arround * once. */ /* read the actual counter */ unsigned long tcmp = vmm_readl((void *)(ecc->base + EPITCNR)); /* * add 1 (as the counter is decrementing) and write the * value. */ vmm_writel(tcmp + 1, (void *)(ecc->base + EPITCMPR)); /* Clear pending interrupt */ epit_irq_acknowledge(ecc); } /* Remember timer mode */ ecc->clockevent_mode = mode; arch_cpu_irq_restore(flags); switch (mode) { case VMM_CLOCKCHIP_MODE_PERIODIC: vmm_printf("epit_set_mode: Periodic mode is not " "supported for i.MX EPIT\n"); break; case VMM_CLOCKCHIP_MODE_ONESHOT: /* * Do not put overhead of interrupt enable/disable into * epit_set_next_event(), the core has about 4 minutes * to call epit_set_next_event() or shutdown clock after * mode switching */ arch_cpu_irq_save(flags); epit_irq_enable(ecc); arch_cpu_irq_restore(flags); break; case VMM_CLOCKCHIP_MODE_SHUTDOWN: case VMM_CLOCKCHIP_MODE_UNUSED: case VMM_CLOCKCHIP_MODE_RESUME: /* Left event sources disabled, no more interrupts appear */ break; } }