[patch] input: PowerMate driver update [11/14]

From: Vojtech Pavlik (vojtech@suse.cz)
Date: Wed Feb 12 2003 - 06:06:05 EST


You can pull this changeset from:
        bk://kernel.bkbits.net/vojtech/input

===================================================================

ChangeSet@1.1014, 2003-02-12 11:06:34+01:00, will@sowerbutts.com
  input: PowerMate driver update
          - work around an undocumented firmware bug
          - fix handling of LED brightness

 powermate.c | 24 ++++++++++++++----------
 1 files changed, 14 insertions(+), 10 deletions(-)

===================================================================

diff -Nru a/drivers/usb/input/powermate.c b/drivers/usb/input/powermate.c
--- a/drivers/usb/input/powermate.c Wed Feb 12 11:56:37 2003
+++ b/drivers/usb/input/powermate.c Wed Feb 12 11:56:37 2003
@@ -1,9 +1,9 @@
 /*
  * A driver for the Griffin Technology, Inc. "PowerMate" USB controller dial.
  *
- * v1.0, (c)2002 William R Sowerbutts <will@sowerbutts.com>
+ * v1.1, (c)2002 William R Sowerbutts <will@sowerbutts.com>
  *
- * This device is a stainless steel knob which connects over USB. It can measure
+ * This device is a anodised aluminium knob which connects over USB. It can measure
  * clockwise and anticlockwise rotation. The dial also acts as a pushbutton with
  * a spring for automatic release. The base contains a pair of LEDs which illuminate
  * the translucent base. It rotates without limit and reports its relative rotation
@@ -15,13 +15,17 @@
  * speeds of up to 7 clicks either clockwise or anticlockwise between pollings from
  * the host. If it counts more than 7 clicks before it is polled, it will wrap back
  * to zero and start counting again. This was at quite high speed, however, almost
- * certainly faster than the human hand could turn it.
+ * certainly faster than the human hand could turn it. Griffin say that it loses a
+ * pulse or two on a direction change; the granularity is so fine that I never
+ * noticed this in practice.
  *
  * The device's microcontroller can be programmed to set the LED to either a constant
  * intensity, or to a rhythmic pulsing. Several patterns and speeds are available.
  *
  * Griffin were very happy to provide documentation and free hardware for development.
  *
+ * Some userspace tools are available on the web: http://sowerbutts.com/powermate/
+ *
  */
 
 #include <linux/kernel.h>
@@ -116,11 +120,7 @@
         if (pm->config->status == -EINPROGRESS)
                 return; /* an update is already in progress; it'll issue this update when it completes */
 
- if (pm->requires_update & UPDATE_STATIC_BRIGHTNESS){
- pm->configcr->wValue = cpu_to_le16( SET_STATIC_BRIGHTNESS );
- pm->configcr->wIndex = cpu_to_le16( pm->static_brightness );
- pm->requires_update &= ~UPDATE_STATIC_BRIGHTNESS;
- }else if (pm->requires_update & UPDATE_PULSE_ASLEEP){
+ if (pm->requires_update & UPDATE_PULSE_ASLEEP){
                 pm->configcr->wValue = cpu_to_le16( SET_PULSE_ASLEEP );
                 pm->configcr->wIndex = cpu_to_le16( pm->pulse_asleep ? 1 : 0 );
                 pm->requires_update &= ~UPDATE_PULSE_ASLEEP;
@@ -160,6 +160,10 @@
                 pm->configcr->wValue = cpu_to_le16( (pm->pulse_table << 8) | SET_PULSE_MODE );
                 pm->configcr->wIndex = cpu_to_le16( (arg << 8) | op );
                 pm->requires_update &= ~UPDATE_PULSE_MODE;
+ }else if (pm->requires_update & UPDATE_STATIC_BRIGHTNESS){
+ pm->configcr->wValue = cpu_to_le16( SET_STATIC_BRIGHTNESS );
+ pm->configcr->wIndex = cpu_to_le16( pm->static_brightness );
+ pm->requires_update &= ~UPDATE_STATIC_BRIGHTNESS;
         }else{
                 printk(KERN_ERR "powermate: unknown update required");
                 pm->requires_update = 0; /* fudge the bug */
@@ -220,11 +224,11 @@
         }
         if (pulse_asleep != pm->pulse_asleep){
                 pm->pulse_asleep = pulse_asleep;
- pm->requires_update |= UPDATE_PULSE_ASLEEP;
+ pm->requires_update |= (UPDATE_PULSE_ASLEEP | UPDATE_STATIC_BRIGHTNESS);
         }
         if (pulse_awake != pm->pulse_awake){
                 pm->pulse_awake = pulse_awake;
- pm->requires_update |= UPDATE_PULSE_AWAKE;
+ pm->requires_update |= (UPDATE_PULSE_AWAKE | UPDATE_STATIC_BRIGHTNESS);
         }
         if (pulse_speed != pm->pulse_speed || pulse_table != pm->pulse_table){
                 pm->pulse_speed = pulse_speed;
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sat Feb 15 2003 - 22:00:39 EST