static void timer_set_mode(enum clock_event_mode mode, struct clock_event_device *clk) { const l4timer_time_t increment = 1000000 / HZ; int r; switch (mode) { case CLOCK_EVT_MODE_SHUTDOWN: case CLOCK_EVT_MODE_ONESHOT: r = L4XV_FN_i(l4_error(l4timer_stop(timer_srv))); if (r) printk(KERN_WARNING "l4timer: stop failed (%d)\n", r); while (L4XV_FN_i(l4_ipc_error(l4_irq_receive(timer_irq_cap, L4_IPC_BOTH_TIMEOUT_0), l4_utcb())) != L4_IPC_RETIMEOUT) ; break; case CLOCK_EVT_MODE_PERIODIC: case CLOCK_EVT_MODE_RESUME: r = L4XV_FN_i(l4_error(l4timer_start(timer_srv, 0, l4lx_kinfo->clock, increment))); if (r) printk(KERN_WARNING "l4timer: start failed (%d)\n", r); break; case CLOCK_EVT_MODE_UNUSED: break; default: printk("l4timer_set_mode: Unknown mode %d\n", mode); break; } }
static int kp_irq_func(void) { l4_cap_idx_t irq_cap = l4re_util_cap_alloc(); l4_cap_idx_t thread_cap = pthread_getl4cap(_pthread); l4_msgtag_t tag; l4_debugger_set_object_name(thread_cap, "kp-omap3.irq"); if (l4io_request_irq(7, irq_cap) < 0) return -2; // was L4_IRQ_F_LEVEL_LOW tag = l4_irq_attach(irq_cap, 0, thread_cap); if (l4_ipc_error(tag, l4_utcb())) return -3; while (1) { tag = l4_irq_receive(irq_cap, L4_IPC_NEVER); if (l4_ipc_error(tag, l4_utcb())) { printf("[KEYP] Error: Receive irq failed\n"); continue; } kp_write(REG_KEYP_IMR1, 0xf); if (kp_handler) scan_key(); l4_uint8_t value = 0; kp_read(REG_KEYP_ISR1, &value); kp_write(REG_KEYP_IMR1, 0x0); } }