static irqreturn_t bfin_rotary_isr(int irq, void *dev_id) { struct platform_device *pdev = dev_id; struct bfin_rot *rotary = platform_get_drvdata(pdev); int delta; switch (bfin_read_CNT_STATUS()) { case ICII: break; case UCII: case DCII: delta = bfin_read_CNT_COUNTER(); if (delta) report_rotary_event(rotary, delta); break; case CZMII: report_key_event(rotary->input, rotary->button_key); break; default: break; } bfin_write_CNT_COMMAND(W1LCNT_ZERO); /* Clear COUNTER */ bfin_write_CNT_STATUS(-1); /* Clear STATUS */ return IRQ_HANDLED; }
static irqreturn_t bfin_rotary_isr(int irq, void *dev_id) { struct bfin_rot *rotary = dev_id; int delta; switch (readw(rotary->base + CNT_STATUS_OFF)) { case ICII: break; case UCII: case DCII: delta = readl(rotary->base + CNT_COUNTER_OFF); if (delta) report_rotary_event(rotary, delta); break; case CZMII: report_key_event(rotary->input, rotary->button_key); break; default: break; } writew(W1LCNT_ZERO, rotary->base + CNT_COMMAND_OFF); /* Clear COUNTER */ writew(-1, rotary->base + CNT_STATUS_OFF); /* Clear STATUS */ return IRQ_HANDLED; }
static void gpio_event_check_func(struct work_struct *work) { struct microp_input_state *ds = container_of(work, struct microp_input_state, work); uint8_t data[3]; memset(data, 0x00, sizeof(uint8_t)*3); microp_i2c_read(MICROP_I2C_RCMD_AP_KEY_CODE, data, 2); report_key_event(ds, data[1]); wake_unlock(&gpio_microp_wake_lock); }
static void report_rotary_event(struct bfin_rot *rotary, int delta) { struct input_dev *input = rotary->input; if (rotary->up_key) { report_key_event(input, delta > 0 ? rotary->up_key : rotary->down_key); } else { input_report_rel(input, rotary->rel_code, delta); input_sync(input); } }