diff mbox

[2/3] rotary_encoder: added initial_value, min_value and max_value

Message ID 4BEAA89F.10509@youcom.nl (mailing list archive)
State New, archived
Headers show

Commit Message

Jelle Martijn Kok May 12, 2010, 1:09 p.m. UTC
None
diff mbox

Patch

diff --git a/drivers/input/misc/rotary_encoder.c 
b/drivers/input/misc/rotary_encoder.c
index 24621b8..1c9728f 100644
--- a/drivers/input/misc/rotary_encoder.c
+++ b/drivers/input/misc/rotary_encoder.c
@@ -70,17 +70,18 @@  static irqreturn_t rotary_encoder_irq(int irq, void 
*dev_id)

                  if (dir == -1) {
                      /* turning counter-clockwise */
-                    if (pdata->rollover)
-                        pos += pdata->steps;
-                    if (pos)
+                    if (pos > pdata->min_value)
                          pos--;
-                } else {
+                    else if (pdata->rollover)
+                        pos = pdata->max_value;
+                }
+                else {
                      /* turning clockwise */
-                    if (pdata->rollover || pos < pdata->steps)
+                    if (pos < pdata->max_value)
                          pos++;
+                    else if (pdata->rollover)
+                        pos = pdata->min_value;
                  }
-                if (pdata->rollover)
-                    pos %= pdata->steps;
                  encoder->pos = pos;
                  input_report_abs(encoder->input, pdata->axis,
                           encoder->pos);
@@ -119,6 +120,10 @@  static int __devinit rotary_encoder_probe(struct 
platform_device *pdev)
      encoder->pdata = pdata;
      encoder->irq_a = gpio_to_irq(pdata->gpio_a);
      encoder->irq_b = gpio_to_irq(pdata->gpio_b);
+    encoder->pos = pdata->initial_value;
+    /* ensure backwards compatibility with the steps parameter */
+    if (!pdata->max_value)
+        pdata->max_value = pdata->steps-1;

      /* create and register the input driver */
      input->name = pdev->name;
@@ -131,7 +136,7 @@  static int __devinit rotary_encoder_probe(struct 
platform_device *pdev)
      } else {
          input->evbit[0] = BIT_MASK(EV_ABS);
          input_set_abs_params(encoder->input,
-                     pdata->axis, 0, pdata->steps, 0, 1);
+                     pdata->axis, pdata->min_value, pdata->max_value, 
0, 1);
      }

      err = input_register_device(input);
diff --git a/include/linux/rotary_encoder.h b/include/linux/rotary_encoder.h
index 215278b..a0d15d9 100644
--- a/include/linux/rotary_encoder.h
+++ b/include/linux/rotary_encoder.h
@@ -2,7 +2,10 @@ 
  #define __ROTARY_ENCODER_H__

  struct rotary_encoder_platform_data {
-    unsigned int steps;
+    unsigned int steps;    /* deprecated, use max_value instead */
+    unsigned int initial_value;
+    unsigned int min_value;
+    unsigned int max_value;
      unsigned int axis;
      unsigned int gpio_a;
      unsigned int gpio_b;