|
@@ -1387,28 +1387,6 @@ static int sony_register_touchpad(struct hid_input *hi, int touch_count,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int sony_input_configured(struct hid_device *hdev,
|
|
|
- struct hid_input *hidinput)
|
|
|
-{
|
|
|
- struct sony_sc *sc = hid_get_drvdata(hdev);
|
|
|
- int ret;
|
|
|
-
|
|
|
- /*
|
|
|
- * The Dualshock 4 touchpad supports 2 touches and has a
|
|
|
- * resolution of 1920x942 (44.86 dots/mm).
|
|
|
- */
|
|
|
- if (sc->quirks & DUALSHOCK4_CONTROLLER) {
|
|
|
- ret = sony_register_touchpad(hidinput, 2, 1920, 942);
|
|
|
- if (ret) {
|
|
|
- hid_err(sc->hdev,
|
|
|
- "Unable to initialize multi-touch slots: %d\n",
|
|
|
- ret);
|
|
|
- return ret;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
|
|
|
/*
|
|
|
* Sending HID_REQ_GET_REPORT changes the operation mode of the ps3 controller
|
|
@@ -2329,45 +2307,12 @@ static inline void sony_cancel_work_sync(struct sony_sc *sc)
|
|
|
cancel_work_sync(&sc->state_worker);
|
|
|
}
|
|
|
|
|
|
-static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
|
|
+static int sony_input_configured(struct hid_device *hdev,
|
|
|
+ struct hid_input *hidinput)
|
|
|
{
|
|
|
- int ret;
|
|
|
+ struct sony_sc *sc = hid_get_drvdata(hdev);
|
|
|
int append_dev_id;
|
|
|
- unsigned long quirks = id->driver_data;
|
|
|
- struct sony_sc *sc;
|
|
|
- unsigned int connect_mask = HID_CONNECT_DEFAULT;
|
|
|
-
|
|
|
- if (!strcmp(hdev->name, "FutureMax Dance Mat"))
|
|
|
- quirks |= FUTUREMAX_DANCE_MAT;
|
|
|
-
|
|
|
- sc = devm_kzalloc(&hdev->dev, sizeof(*sc), GFP_KERNEL);
|
|
|
- if (sc == NULL) {
|
|
|
- hid_err(hdev, "can't alloc sony descriptor\n");
|
|
|
- return -ENOMEM;
|
|
|
- }
|
|
|
-
|
|
|
- spin_lock_init(&sc->lock);
|
|
|
-
|
|
|
- sc->quirks = quirks;
|
|
|
- hid_set_drvdata(hdev, sc);
|
|
|
- sc->hdev = hdev;
|
|
|
-
|
|
|
- ret = hid_parse(hdev);
|
|
|
- if (ret) {
|
|
|
- hid_err(hdev, "parse failed\n");
|
|
|
- return ret;
|
|
|
- }
|
|
|
-
|
|
|
- if (sc->quirks & VAIO_RDESC_CONSTANT)
|
|
|
- connect_mask |= HID_CONNECT_HIDDEV_FORCE;
|
|
|
- else if (sc->quirks & SIXAXIS_CONTROLLER)
|
|
|
- connect_mask |= HID_CONNECT_HIDDEV_FORCE;
|
|
|
-
|
|
|
- ret = hid_hw_start(hdev, connect_mask);
|
|
|
- if (ret) {
|
|
|
- hid_err(hdev, "hw start failed\n");
|
|
|
- return ret;
|
|
|
- }
|
|
|
+ int ret;
|
|
|
|
|
|
ret = sony_set_device_id(sc);
|
|
|
if (ret < 0) {
|
|
@@ -2427,6 +2372,18 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * The Dualshock 4 touchpad supports 2 touches and has a
|
|
|
+ * resolution of 1920x942 (44.86 dots/mm).
|
|
|
+ */
|
|
|
+ ret = sony_register_touchpad(hidinput, 2, 1920, 942);
|
|
|
+ if (ret) {
|
|
|
+ hid_err(sc->hdev,
|
|
|
+ "Unable to initialize multi-touch slots: %d\n",
|
|
|
+ ret);
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
sony_init_output_report(sc, dualshock4_send_output_report);
|
|
|
} else if (sc->quirks & MOTION_CONTROLLER) {
|
|
|
sony_init_output_report(sc, motion_send_output_report);
|
|
@@ -2482,6 +2439,48 @@ err_stop:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+ unsigned long quirks = id->driver_data;
|
|
|
+ struct sony_sc *sc;
|
|
|
+ unsigned int connect_mask = HID_CONNECT_DEFAULT;
|
|
|
+
|
|
|
+ if (!strcmp(hdev->name, "FutureMax Dance Mat"))
|
|
|
+ quirks |= FUTUREMAX_DANCE_MAT;
|
|
|
+
|
|
|
+ sc = devm_kzalloc(&hdev->dev, sizeof(*sc), GFP_KERNEL);
|
|
|
+ if (sc == NULL) {
|
|
|
+ hid_err(hdev, "can't alloc sony descriptor\n");
|
|
|
+ return -ENOMEM;
|
|
|
+ }
|
|
|
+
|
|
|
+ spin_lock_init(&sc->lock);
|
|
|
+
|
|
|
+ sc->quirks = quirks;
|
|
|
+ hid_set_drvdata(hdev, sc);
|
|
|
+ sc->hdev = hdev;
|
|
|
+
|
|
|
+ ret = hid_parse(hdev);
|
|
|
+ if (ret) {
|
|
|
+ hid_err(hdev, "parse failed\n");
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (sc->quirks & VAIO_RDESC_CONSTANT)
|
|
|
+ connect_mask |= HID_CONNECT_HIDDEV_FORCE;
|
|
|
+ else if (sc->quirks & SIXAXIS_CONTROLLER)
|
|
|
+ connect_mask |= HID_CONNECT_HIDDEV_FORCE;
|
|
|
+
|
|
|
+ ret = hid_hw_start(hdev, connect_mask);
|
|
|
+ if (ret) {
|
|
|
+ hid_err(hdev, "hw start failed\n");
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
static void sony_remove(struct hid_device *hdev)
|
|
|
{
|
|
|
struct sony_sc *sc = hid_get_drvdata(hdev);
|