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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Added initial_value, min_value and max_value. This would replace "steps".
The steps parameter is still allowed as it will be copied in the max_value for backwards compatibility. The max_value parameter is one higher than the steps parameter, and will better match the "input_set_abs_params" function.

Signed-off-by: Jelle Martijn Kok <jmkok@xxxxxxxxx>
---
 drivers/input/misc/rotary_encoder.c |   21 +++++++++++++--------
 include/linux/rotary_encoder.h      |    5 ++++-
 2 files changed, 17 insertions(+), 9 deletions(-)

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;
--
1.7.0.4

--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux