Input: improve autorepeat initialization
authorPetri Gynther <pgynther@google.com>
Wed, 14 Oct 2015 06:13:55 +0000 (23:13 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Wed, 14 Oct 2015 06:30:31 +0000 (23:30 -0700)
Add new function input_enable_softrepeat() that allows drivers to
initialize their own values for input_dev->rep[REP_DELAY] and
input_dev->rep[REP_PERIOD], but also use the software autorepeat
functionality from input.c.

For example, a HID driver could do:

static void xyz_input_configured(struct hid_device *hid,
                                 struct hid_input *hidinput)
{
        input_enable_softrepeat(hidinput->input, 400, 100);
}

static struct hid_driver xyz_driver = {
        .input_configured = xyz_input_configured,
}

Signed-off-by: Petri Gynther <pgynther@google.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/input.c
include/linux/input.h

index 5391abd28b2799c6776cf1bc8a398f70ed8382d7..880605959aa6f74a87da70b24f813d2ce428af9f 100644 (file)
@@ -2044,6 +2044,23 @@ static void devm_input_device_unregister(struct device *dev, void *res)
        __input_unregister_device(input);
 }
 
+/**
+ * input_enable_softrepeat - enable software autorepeat
+ * @dev: input device
+ * @delay: repeat delay
+ * @period: repeat period
+ *
+ * Enable software autorepeat on the input device.
+ */
+void input_enable_softrepeat(struct input_dev *dev, int delay, int period)
+{
+       dev->timer.data = (unsigned long) dev;
+       dev->timer.function = input_repeat_key;
+       dev->rep[REP_DELAY] = delay;
+       dev->rep[REP_PERIOD] = period;
+}
+EXPORT_SYMBOL(input_enable_softrepeat);
+
 /**
  * input_register_device - register device with input core
  * @dev: device to be registered
@@ -2108,12 +2125,8 @@ int input_register_device(struct input_dev *dev)
         * If delay and period are pre-set by the driver, then autorepeating
         * is handled by the driver itself and we don't do it in input.c.
         */
-       if (!dev->rep[REP_DELAY] && !dev->rep[REP_PERIOD]) {
-               dev->timer.data = (long) dev;
-               dev->timer.function = input_repeat_key;
-               dev->rep[REP_DELAY] = 250;
-               dev->rep[REP_PERIOD] = 33;
-       }
+       if (!dev->rep[REP_DELAY] && !dev->rep[REP_PERIOD])
+               input_enable_softrepeat(dev, 250, 33);
 
        if (!dev->getkeycode)
                dev->getkeycode = input_default_getkeycode;
index 82ce323b998692b9c3d0b95b762605e51147cafd..1e967694e9a525deb811a03608ebecc91cabaab3 100644 (file)
@@ -469,6 +469,8 @@ int input_get_keycode(struct input_dev *dev, struct input_keymap_entry *ke);
 int input_set_keycode(struct input_dev *dev,
                      const struct input_keymap_entry *ke);
 
+void input_enable_softrepeat(struct input_dev *dev, int delay, int period);
+
 extern struct class input_class;
 
 /**