if (scancode < 0 || scancode >= dev->keycodemax)
return -EINVAL;
- oldkey = INPUT_KEYCODE(dev, scancode);
- SET_INPUT_KEYCODE(dev, scancode, oldkey);
+ oldkey = SET_INPUT_KEYCODE(dev, scancode, keycode);
clear_bit(oldkey, dev->keybit);
set_bit(keycode, dev->keybit);
struct evdev *evdev = list->evdev;
struct input_dev *dev = evdev->handle.dev;
struct input_absinfo abs;
- int i, t, u, v;
+ int t, u, v;
if (!evdev->exist) return -ENODEV;
if (get_user(t, ((int *) arg) + 0)) return -EFAULT;
if (t < 0 || t > dev->keycodemax || !dev->keycodesize) return -EINVAL;
if (get_user(v, ((int *) arg) + 1)) return -EFAULT;
- u = INPUT_KEYCODE(dev, t);
- SET_INPUT_KEYCODE(dev, t, v);
- for (i = 0; i < dev->keycodemax; i++) if (v == u) break;
- if (i == dev->keycodemax) clear_bit(u, dev->keybit);
+ u = SET_INPUT_KEYCODE(dev, t, v);
+ clear_bit(u, dev->keybit);
set_bit(v, dev->keybit);
return 0;
#define init_input_dev(dev) do { INIT_LIST_HEAD(&((dev)->h_list)); INIT_LIST_HEAD(&((dev)->node)); } while (0)
#define SET_INPUT_KEYCODE(dev, scancode, val) \
- do { \
+ ({ unsigned __old; \
switch (dev->keycodesize) { \
case 1: { \
u8 *k = (u8 *)dev->keycode; \
+ __old = k[scancode]; \
k[scancode] = val; \
break; \
} \
case 2: { \
u16 *k = (u16 *)dev->keycode; \
+ __old = k[scancode]; \
k[scancode] = val; \
break; \
} \
- case 4: { \
+ default: { \
u32 *k = (u32 *)dev->keycode; \
+ __old = k[scancode]; \
k[scancode] = val; \
break; \
} \
} \
- } while (0)
+ __old; })
struct input_dev {