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>
This commit is contained in:
Johan Hovold 2011-05-11 16:33:50 -07:00 committed by Dmitry Torokhov
parent baafb43537
commit 521a8f5cb7
1 changed files with 46 additions and 35 deletions

View File

@ -40,50 +40,62 @@ struct rotary_encoder {
unsigned char dir; /* 0 - clockwise, 1 - CCW */ unsigned char dir; /* 0 - clockwise, 1 - CCW */
}; };
static irqreturn_t rotary_encoder_irq(int irq, void *dev_id) static int rotary_encoder_get_state(struct rotary_encoder_platform_data *pdata)
{ {
struct rotary_encoder *encoder = dev_id;
struct rotary_encoder_platform_data *pdata = encoder->pdata;
int a = !!gpio_get_value(pdata->gpio_a); int a = !!gpio_get_value(pdata->gpio_a);
int b = !!gpio_get_value(pdata->gpio_b); int b = !!gpio_get_value(pdata->gpio_b);
int state;
a ^= pdata->inverted_a; a ^= pdata->inverted_a;
b ^= pdata->inverted_b; b ^= pdata->inverted_b;
state = (a << 1) | b;
return ((a << 1) | b);
}
static void rotary_encoder_report_event(struct rotary_encoder *encoder)
{
struct rotary_encoder_platform_data *pdata = encoder->pdata;
if (pdata->relative_axis) {
input_report_rel(encoder->input,
pdata->axis, encoder->dir ? -1 : 1);
} else {
unsigned int pos = encoder->pos;
if (encoder->dir) {
/* turning counter-clockwise */
if (pdata->rollover)
pos += pdata->steps;
if (pos)
pos--;
} else {
/* turning clockwise */
if (pdata->rollover || pos < pdata->steps)
pos++;
}
if (pdata->rollover)
pos %= pdata->steps;
encoder->pos = pos;
input_report_abs(encoder->input, pdata->axis, encoder->pos);
}
input_sync(encoder->input);
}
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) { switch (state) {
case 0x0: case 0x0:
if (!encoder->armed) if (encoder->armed) {
break; rotary_encoder_report_event(encoder);
encoder->armed = false;
if (pdata->relative_axis) {
input_report_rel(encoder->input, pdata->axis,
encoder->dir ? -1 : 1);
} else {
unsigned int pos = encoder->pos;
if (encoder->dir) {
/* turning counter-clockwise */
if (pdata->rollover)
pos += pdata->steps;
if (pos)
pos--;
} else {
/* turning clockwise */
if (pdata->rollover || pos < pdata->steps)
pos++;
}
if (pdata->rollover)
pos %= pdata->steps;
encoder->pos = pos;
input_report_abs(encoder->input, pdata->axis,
encoder->pos);
} }
input_sync(encoder->input);
encoder->armed = false;
break; break;
case 0x1: case 0x1:
@ -254,4 +266,3 @@ MODULE_ALIAS("platform:" DRV_NAME);
MODULE_DESCRIPTION("GPIO rotary encoder driver"); MODULE_DESCRIPTION("GPIO rotary encoder driver");
MODULE_AUTHOR("Daniel Mack <daniel@caiaq.de>"); MODULE_AUTHOR("Daniel Mack <daniel@caiaq.de>");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");