···617617 if (get_user(t, ip))618618 return -EFAULT;619619620620- error = dev->getkeycode(dev, t, &v);620620+ error = input_get_keycode(dev, t, &v);621621 if (error)622622 return error;623623···630630 if (get_user(t, ip) || get_user(v, ip + 1))631631 return -EFAULT;632632633633- return dev->setkeycode(dev, t, v);633633+ return input_set_keycode(dev, t, v);634634635635 case EVIOCSFF:636636 if (copy_from_user(&effect, p, sizeof(effect)))···683683 case EV_FF: bits = dev->ffbit; len = FF_MAX; break;684684 case EV_SW: bits = dev->swbit; len = SW_MAX; break;685685 default: return -EINVAL;686686- }686686+ }687687 return bits_to_user(bits, len, _IOC_SIZE(cmd), p, compat_mode);688688 }689689
+72-6
drivers/input/input.c
···493493 if (is_event_supported(EV_KEY, dev->evbit, EV_MAX)) {494494 for (code = 0; code <= KEY_MAX; code++) {495495 if (is_event_supported(code, dev->keybit, KEY_MAX) &&496496- test_bit(code, dev->key)) {496496+ __test_and_clear_bit(code, dev->key)) {497497 input_pass_event(dev, EV_KEY, code, 0);498498 }499499 }···526526 if (!dev->keycodesize)527527 return -EINVAL;528528529529- if (scancode < 0 || scancode >= dev->keycodemax)529529+ if (scancode >= dev->keycodemax)530530 return -EINVAL;531531532532 *keycode = input_fetch_keycode(dev, scancode);···540540 int old_keycode;541541 int i;542542543543- if (scancode < 0 || scancode >= dev->keycodemax)544544- return -EINVAL;545545-546546- if (keycode < 0 || keycode > KEY_MAX)543543+ if (scancode >= dev->keycodemax)547544 return -EINVAL;548545549546 if (!dev->keycodesize)···583586 return 0;584587}585588589589+/**590590+ * input_get_keycode - retrieve keycode currently mapped to a given scancode591591+ * @dev: input device which keymap is being queried592592+ * @scancode: scancode (or its equivalent for device in question) for which593593+ * keycode is needed594594+ * @keycode: result595595+ *596596+ * This function should be called by anyone interested in retrieving current597597+ * keymap. Presently keyboard and evdev handlers use it.598598+ */599599+int input_get_keycode(struct input_dev *dev, int scancode, int *keycode)600600+{601601+ if (scancode < 0)602602+ return -EINVAL;603603+604604+ return dev->getkeycode(dev, scancode, keycode);605605+}606606+EXPORT_SYMBOL(input_get_keycode);607607+608608+/**609609+ * input_get_keycode - assign new keycode to a given scancode610610+ * @dev: input device which keymap is being updated611611+ * @scancode: scancode (or its equivalent for device in question)612612+ * @keycode: new keycode to be assigned to the scancode613613+ *614614+ * This function should be called by anyone needing to update current615615+ * keymap. Presently keyboard and evdev handlers use it.616616+ */617617+int input_set_keycode(struct input_dev *dev, int scancode, int keycode)618618+{619619+ unsigned long flags;620620+ int old_keycode;621621+ int retval;622622+623623+ if (scancode < 0)624624+ return -EINVAL;625625+626626+ if (keycode < 0 || keycode > KEY_MAX)627627+ return -EINVAL;628628+629629+ spin_lock_irqsave(&dev->event_lock, flags);630630+631631+ retval = dev->getkeycode(dev, scancode, &old_keycode);632632+ if (retval)633633+ goto out;634634+635635+ retval = dev->setkeycode(dev, scancode, keycode);636636+ if (retval)637637+ goto out;638638+639639+ /*640640+ * Simulate keyup event if keycode is not present641641+ * in the keymap anymore642642+ */643643+ if (test_bit(EV_KEY, dev->evbit) &&644644+ !is_event_supported(old_keycode, dev->keybit, KEY_MAX) &&645645+ __test_and_clear_bit(old_keycode, dev->key)) {646646+647647+ input_pass_event(dev, EV_KEY, old_keycode, 0);648648+ if (dev->sync)649649+ input_pass_event(dev, EV_SYN, SYN_REPORT, 1);650650+ }651651+652652+ out:653653+ spin_unlock_irqrestore(&dev->event_lock, flags);654654+655655+ return retval;656656+}657657+EXPORT_SYMBOL(input_set_keycode);586658587659#define MATCH_BIT(bit, max) \588660 for (i = 0; i < BITS_TO_LONGS(max); i++) \
+3
include/linux/input.h
···13091309 dev->absbit[BIT_WORD(axis)] |= BIT_MASK(axis);13101310}1311131113121312+int input_get_keycode(struct input_dev *dev, int scancode, int *keycode);13131313+int input_set_keycode(struct input_dev *dev, int scancode, int keycode);13141314+13121315extern struct class input_class;1313131613141317/**