HID: sony: Set touchpad bits in the input_configured callback
authorFrank Praznik <frank.praznik@oh.rr.com>
Fri, 19 Sep 2014 01:15:01 +0000 (21:15 -0400)
committerJiri Kosina <jkosina@suse.cz>
Mon, 22 Sep 2014 14:04:21 +0000 (16:04 +0200)
Set the DualShock4 touchpad bits in the input_configured callback
so that they are registered properly for any input devices created
during hid_hw_start.

Signed-off-by: Frank Praznik <frank.praznik@oh.rr.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/hid-sony.c

index 96a8ec5ed296be8f1d918e85af671dfb4e2a8f6f..5baa311e22fca24c3ae9741fcc7c1758231acbdf 100644 (file)
@@ -1084,6 +1084,38 @@ static int sony_mapping(struct hid_device *hdev, struct hid_input *hi,
        return 0;
 }
 
+static int sony_register_touchpad(struct hid_input *hi, int touch_count,
+                                       int w, int h)
+{
+       struct input_dev *input_dev = hi->input;
+       int ret;
+
+       ret = input_mt_init_slots(input_dev, touch_count, 0);
+       if (ret < 0)
+               return ret;
+
+       input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, w, 0, 0);
+       input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, h, 0, 0);
+
+       return 0;
+}
+
+static void sony_input_configured(struct hid_device *hdev,
+                                       struct hid_input *hidinput)
+{
+       struct sony_sc *sc = hid_get_drvdata(hdev);
+
+       /*
+        * The Dualshock 4 touchpad supports 2 touches and has a
+        * resolution of 1920x940.
+        */
+       if (sc->quirks & DUALSHOCK4_CONTROLLER) {
+               if (sony_register_touchpad(hidinput, 2, 1920, 940) != 0)
+                       hid_err(sc->hdev,
+                               "Unable to initialize multi-touch slots\n");
+       }
+}
+
 /*
  * Sending HID_REQ_GET_REPORT changes the operation mode of the ps3 controller
  * to "operational".  Without this, the ps3 controller will not report any
@@ -1656,26 +1688,6 @@ static void sony_battery_remove(struct sony_sc *sc)
        sc->battery.name = NULL;
 }
 
-static int sony_register_touchpad(struct sony_sc *sc, int touch_count,
-                                       int w, int h)
-{
-       struct hid_input *hidinput = list_entry(sc->hdev->inputs.next,
-                                               struct hid_input, list);
-       struct input_dev *input_dev = hidinput->input;
-       int ret;
-
-       ret = input_mt_init_slots(input_dev, touch_count, 0);
-       if (ret < 0) {
-               hid_err(sc->hdev, "Unable to initialize multi-touch slots\n");
-               return ret;
-       }
-
-       input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, w, 0, 0);
-       input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, h, 0, 0);
-
-       return 0;
-}
-
 /*
  * If a controller is plugged in via USB while already connected via Bluetooth
  * it will show up as two devices. A global list of connected controllers and
@@ -1925,13 +1937,6 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
                                goto err_stop;
                        }
                }
-               /*
-                * The Dualshock 4 touchpad supports 2 touches and has a
-                * resolution of 1920x940.
-                */
-               ret = sony_register_touchpad(sc, 2, 1920, 940);
-               if (ret < 0)
-                       goto err_stop;
 
                sony_init_work(sc, dualshock4_state_worker);
        } else {
@@ -2039,13 +2044,14 @@ static const struct hid_device_id sony_devices[] = {
 MODULE_DEVICE_TABLE(hid, sony_devices);
 
 static struct hid_driver sony_driver = {
-       .name          = "sony",
-       .id_table      = sony_devices,
-       .input_mapping = sony_mapping,
-       .probe         = sony_probe,
-       .remove        = sony_remove,
-       .report_fixup  = sony_report_fixup,
-       .raw_event     = sony_raw_event
+       .name             = "sony",
+       .id_table         = sony_devices,
+       .input_mapping    = sony_mapping,
+       .input_configured = sony_input_configured,
+       .probe            = sony_probe,
+       .remove           = sony_remove,
+       .report_fixup     = sony_report_fixup,
+       .raw_event        = sony_raw_event
 };
 
 static int __init sony_init(void)