static irqreturn_t rotary_encoder_irq(int irq, void *dev_id) { struct rotary_encoder *encoder = dev_id; int state; state = rotary_encoder_get_state(encoder->pdata); switch (state) { case 0x0: if (encoder->armed) { rotary_encoder_report_event(encoder); encoder->armed = false; } break; case 0x1: case 0x2: if (encoder->armed) encoder->dir = state - 1; break; case 0x3: encoder->armed = true; break; } return IRQ_HANDLED; }
static irqreturn_t rotary_encoder_irq(int irq, void *dev_id) { struct rotary_encoder *encoder = dev_id; unsigned int state; mutex_lock(&encoder->access_mutex); state = rotary_encoder_get_state(encoder); switch (state) { case 0x0: if (encoder->armed) { rotary_encoder_report_event(encoder); encoder->armed = false; } break; case 0x1: case 0x3: if (encoder->armed) encoder->dir = 2 - state; break; case 0x2: encoder->armed = true; break; } mutex_unlock(&encoder->access_mutex); return IRQ_HANDLED; }
static irqreturn_t rotary_encoder_half_period_irq(int irq, void *dev_id) { struct rotary_encoder *encoder = dev_id; unsigned int state; mutex_lock(&encoder->access_mutex); state = rotary_encoder_get_state(encoder); if (state & 1) { encoder->dir = ((encoder->last_stable - state + 1) % 4) - 1; } else { if (state != encoder->last_stable) { rotary_encoder_report_event(encoder); encoder->last_stable = state; } } mutex_unlock(&encoder->access_mutex); return IRQ_HANDLED; }
static irqreturn_t rotary_encoder_half_period_irq(int irq, void *dev_id) { struct rotary_encoder *encoder = dev_id; int state; state = rotary_encoder_get_state(encoder->pdata); switch (state) { case 0x00: case 0x03: if (state != encoder->last_stable) { rotary_encoder_report_event(encoder); encoder->last_stable = state; } break; case 0x01: case 0x02: encoder->dir = (encoder->last_stable + state) & 0x01; break; } return IRQ_HANDLED; }
static irqreturn_t rotary_encoder_quarter_period_irq(int irq, void *dev_id) { struct rotary_encoder *encoder = dev_id; unsigned int state; mutex_lock(&encoder->access_mutex); state = rotary_encoder_get_state(encoder); if ((encoder->last_stable + 1) % 4 == state) encoder->dir = 1; else if (encoder->last_stable == (state + 1) % 4) encoder->dir = -1; else goto out; rotary_encoder_report_event(encoder); out: encoder->last_stable = state; mutex_unlock(&encoder->access_mutex); return IRQ_HANDLED; }