Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 250506
b: refs/heads/master
c: 521a8f5
h: refs/heads/master
v: v3
  • Loading branch information
Johan Hovold authored and Dmitry Torokhov committed May 11, 2011
1 parent 254266c commit 461cde3
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 34 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: baafb435372dd48e3854028aec669effae957c9e
refs/heads/master: 521a8f5cb79d1017d00d26143227159674e3b79d
77 changes: 44 additions & 33 deletions trunk/drivers/input/misc/rotary_encoder.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,50 +40,62 @@ struct rotary_encoder {
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 b = !!gpio_get_value(pdata->gpio_b);
int state;

a ^= pdata->inverted_a;
b ^= pdata->inverted_b;
state = (a << 1) | b;

switch (state) {
return ((a << 1) | b);
}

case 0x0:
if (!encoder->armed)
break;
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->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;
encoder->pos = pos;
input_report_abs(encoder->input, pdata->axis,
encoder->pos);
pos += pdata->steps;
if (pos)
pos--;
} else {
/* turning clockwise */
if (pdata->rollover || pos < pdata->steps)
pos++;
}
input_sync(encoder->input);

encoder->armed = false;
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) {
case 0x0:
if (encoder->armed) {
rotary_encoder_report_event(encoder);
encoder->armed = false;
}
break;

case 0x1:
Expand Down Expand Up @@ -254,4 +266,3 @@ MODULE_ALIAS("platform:" DRV_NAME);
MODULE_DESCRIPTION("GPIO rotary encoder driver");
MODULE_AUTHOR("Daniel Mack <daniel@caiaq.de>");
MODULE_LICENSE("GPL v2");

0 comments on commit 461cde3

Please sign in to comment.