Input: ati_remote2 - switch to using new keycode interface
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Thu, 16 Sep 2010 02:36:34 +0000 (19:36 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Thu, 16 Sep 2010 06:10:53 +0000 (23:10 -0700)
Switch the code to use new style of getkeycode and setkeycode
methods to allow retrieving and setting keycodes not only by
their scancodes but also by index.

Acked-by: Ville Syrjälä <syrjala@sci.fi>
Tested-by: Jarod Wilson <jarod@wilsonet.com>
Tested-by: Ville Syrjälä <syrjala@sci.fi>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
drivers/input/misc/ati_remote2.c

index 2325765..0b0e9be 100644 (file)
@@ -483,51 +483,88 @@ static void ati_remote2_complete_key(struct urb *urb)
 }
 
 static int ati_remote2_getkeycode(struct input_dev *idev,
-                                 unsigned int scancode, unsigned int *keycode)
+                                 struct input_keymap_entry *ke)
 {
        struct ati_remote2 *ar2 = input_get_drvdata(idev);
        unsigned int mode;
-       int index;
+       int offset;
+       unsigned int index;
+       unsigned int scancode;
+
+       if (ke->flags & INPUT_KEYMAP_BY_INDEX) {
+               index = ke->index;
+               if (index >= ATI_REMOTE2_MODES *
+                               ARRAY_SIZE(ati_remote2_key_table))
+                       return -EINVAL;
+
+               mode = ke->index / ARRAY_SIZE(ati_remote2_key_table);
+               offset = ke->index % ARRAY_SIZE(ati_remote2_key_table);
+               scancode = (mode << 8) + ati_remote2_key_table[offset].hw_code;
+       } else {
+               if (input_scancode_to_scalar(ke, &scancode))
+                       return -EINVAL;
+
+               mode = scancode >> 8;
+               if (mode > ATI_REMOTE2_PC)
+                       return -EINVAL;
+
+               offset = ati_remote2_lookup(scancode & 0xff);
+               if (offset < 0)
+                       return -EINVAL;
+
+               index = mode * ARRAY_SIZE(ati_remote2_key_table) + offset;
+       }
 
-       mode = scancode >> 8;
-       if (mode > ATI_REMOTE2_PC || !((1 << mode) & ar2->mode_mask))
-               return -EINVAL;
+       ke->keycode = ar2->keycode[mode][offset];
+       ke->len = sizeof(scancode);
+       memcpy(&ke->scancode, &scancode, sizeof(scancode));
+       ke->index = index;
 
-       index = ati_remote2_lookup(scancode & 0xFF);
-       if (index < 0)
-               return -EINVAL;
-
-       *keycode = ar2->keycode[mode][index];
        return 0;
 }
 
 static int ati_remote2_setkeycode(struct input_dev *idev,
-                                 unsigned int scancode, unsigned int keycode)
+                                 const struct input_keymap_entry *ke,
+                                 unsigned int *old_keycode)
 {
        struct ati_remote2 *ar2 = input_get_drvdata(idev);
-       unsigned int mode, old_keycode;
-       int index;
-
-       mode = scancode >> 8;
-       if (mode > ATI_REMOTE2_PC || !((1 << mode) & ar2->mode_mask))
-               return -EINVAL;
-
-       index = ati_remote2_lookup(scancode & 0xFF);
-       if (index < 0)
-               return -EINVAL;
+       unsigned int mode;
+       int offset;
+       unsigned int index;
+       unsigned int scancode;
+
+       if (ke->flags & INPUT_KEYMAP_BY_INDEX) {
+               if (ke->index >= ATI_REMOTE2_MODES *
+                               ARRAY_SIZE(ati_remote2_key_table))
+                       return -EINVAL;
+
+               mode = ke->index / ARRAY_SIZE(ati_remote2_key_table);
+               offset = ke->index % ARRAY_SIZE(ati_remote2_key_table);
+       } else {
+               if (input_scancode_to_scalar(ke, &scancode))
+                       return -EINVAL;
+
+               mode = scancode >> 8;
+               if (mode > ATI_REMOTE2_PC)
+                       return -EINVAL;
+
+               offset = ati_remote2_lookup(scancode & 0xff);
+               if (offset < 0)
+                       return -EINVAL;
+       }
 
-       old_keycode = ar2->keycode[mode][index];
-       ar2->keycode[mode][index] = keycode;
-       __set_bit(keycode, idev->keybit);
+       *old_keycode = ar2->keycode[mode][offset];
+       ar2->keycode[mode][offset] = ke->keycode;
+       __set_bit(ke->keycode, idev->keybit);
 
        for (mode = 0; mode < ATI_REMOTE2_MODES; mode++) {
                for (index = 0; index < ARRAY_SIZE(ati_remote2_key_table); index++) {
-                       if (ar2->keycode[mode][index] == old_keycode)
+                       if (ar2->keycode[mode][index] == *old_keycode)
                                return 0;
                }
        }
 
-       __clear_bit(old_keycode, idev->keybit);
+       __clear_bit(*old_keycode, idev->keybit);
 
        return 0;
 }
@@ -575,8 +612,8 @@ static int ati_remote2_input_init(struct ati_remote2 *ar2)
        idev->open = ati_remote2_open;
        idev->close = ati_remote2_close;
 
-       idev->getkeycode = ati_remote2_getkeycode;
-       idev->setkeycode = ati_remote2_setkeycode;
+       idev->getkeycode_new = ati_remote2_getkeycode;
+       idev->setkeycode_new = ati_remote2_setkeycode;
 
        idev->name = ar2->name;
        idev->phys = ar2->phys;