Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Input: rotary-encoder - refactor and clean up

Refactor state retrieval and event reporting in interrupt handler.
Remove a few empty lines.

Signed-off-by: Johan Hovold <jhovold@gmail.com>
Reviewed-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Acked-by: Daniel Mack <zonque@gmail.com>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>

authored by

Johan Hovold and committed by
Dmitry Torokhov
521a8f5c baafb435

+46 -35
+46 -35
drivers/input/misc/rotary_encoder.c
··· 40 40 unsigned char dir; /* 0 - clockwise, 1 - CCW */ 41 41 }; 42 42 43 - static irqreturn_t rotary_encoder_irq(int irq, void *dev_id) 43 + static int rotary_encoder_get_state(struct rotary_encoder_platform_data *pdata) 44 44 { 45 - struct rotary_encoder *encoder = dev_id; 46 - struct rotary_encoder_platform_data *pdata = encoder->pdata; 47 45 int a = !!gpio_get_value(pdata->gpio_a); 48 46 int b = !!gpio_get_value(pdata->gpio_b); 49 - int state; 50 47 51 48 a ^= pdata->inverted_a; 52 49 b ^= pdata->inverted_b; 53 - state = (a << 1) | b; 50 + 51 + return ((a << 1) | b); 52 + } 53 + 54 + static void rotary_encoder_report_event(struct rotary_encoder *encoder) 55 + { 56 + struct rotary_encoder_platform_data *pdata = encoder->pdata; 57 + 58 + if (pdata->relative_axis) { 59 + input_report_rel(encoder->input, 60 + pdata->axis, encoder->dir ? -1 : 1); 61 + } else { 62 + unsigned int pos = encoder->pos; 63 + 64 + if (encoder->dir) { 65 + /* turning counter-clockwise */ 66 + if (pdata->rollover) 67 + pos += pdata->steps; 68 + if (pos) 69 + pos--; 70 + } else { 71 + /* turning clockwise */ 72 + if (pdata->rollover || pos < pdata->steps) 73 + pos++; 74 + } 75 + 76 + if (pdata->rollover) 77 + pos %= pdata->steps; 78 + 79 + encoder->pos = pos; 80 + input_report_abs(encoder->input, pdata->axis, encoder->pos); 81 + } 82 + 83 + input_sync(encoder->input); 84 + } 85 + 86 + static irqreturn_t rotary_encoder_irq(int irq, void *dev_id) 87 + { 88 + struct rotary_encoder *encoder = dev_id; 89 + int state; 90 + 91 + state = rotary_encoder_get_state(encoder->pdata); 54 92 55 93 switch (state) { 56 - 57 94 case 0x0: 58 - if (!encoder->armed) 59 - break; 60 - 61 - if (pdata->relative_axis) { 62 - input_report_rel(encoder->input, pdata->axis, 63 - encoder->dir ? -1 : 1); 64 - } else { 65 - unsigned int pos = encoder->pos; 66 - 67 - if (encoder->dir) { 68 - /* turning counter-clockwise */ 69 - if (pdata->rollover) 70 - pos += pdata->steps; 71 - if (pos) 72 - pos--; 73 - } else { 74 - /* turning clockwise */ 75 - if (pdata->rollover || pos < pdata->steps) 76 - pos++; 77 - } 78 - if (pdata->rollover) 79 - pos %= pdata->steps; 80 - encoder->pos = pos; 81 - input_report_abs(encoder->input, pdata->axis, 82 - encoder->pos); 95 + if (encoder->armed) { 96 + rotary_encoder_report_event(encoder); 97 + encoder->armed = false; 83 98 } 84 - input_sync(encoder->input); 85 - 86 - encoder->armed = false; 87 99 break; 88 100 89 101 case 0x1: ··· 266 254 MODULE_DESCRIPTION("GPIO rotary encoder driver"); 267 255 MODULE_AUTHOR("Daniel Mack <daniel@caiaq.de>"); 268 256 MODULE_LICENSE("GPL v2"); 269 -